Merge pull request #2173 from ankitjavalkarwork/fix2043
Add message on cancel in SI if C-Form exists, fix minor error, Add validation in C-Form
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index 7cd2797..dab2d82 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -25,7 +25,8 @@
validate_balance_type(self.account, adv_adj)
# Update outstanding amt on against voucher
- if self.against_voucher and update_outstanding == 'Yes':
+ if self.against_voucher_type in ['Journal Voucher', 'Sales Invoice', 'Purchase Invoice'] \
+ and self.against_voucher and update_outstanding == 'Yes':
update_outstanding_amt(self.account, self.against_voucher_type,
self.against_voucher)
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
index 03bedc7..7bf6fcc 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
@@ -5,7 +5,7 @@
import frappe
from frappe.utils import cint, cstr, flt, fmt_money, formatdate, getdate
-from frappe import msgprint, _
+from frappe import msgprint, _, scrub
from erpnext.setup.utils import get_company_currency
from erpnext.controllers.accounts_controller import AccountsController
@@ -35,18 +35,35 @@
self.create_remarks()
self.set_aging_date()
self.set_print_format_fields()
+ self.validate_against_sales_order()
+ self.validate_against_purchase_order()
def on_submit(self):
if self.voucher_type in ['Bank Voucher', 'Contra Voucher', 'Journal Entry']:
self.check_credit_days()
self.make_gl_entries()
self.check_credit_limit()
+ self.update_advance_paid()
+
+ def update_advance_paid(self):
+ advance_paid = frappe._dict()
+ for d in self.get("entries"):
+ if d.is_advance:
+ if d.against_sales_order:
+ advance_paid.setdefault("Sales Order", []).append(d.against_sales_order)
+ elif d.against_purchase_order:
+ advance_paid.setdefault("Purchase Order", []).append(d.against_purchase_order)
+
+ for voucher_type, order_list in advance_paid.items():
+ for voucher_no in list(set(order_list)):
+ frappe.get_doc(voucher_type, voucher_no).set_total_advance_paid()
def on_cancel(self):
from erpnext.accounts.utils import remove_against_link_from_jv
remove_against_link_from_jv(self.doctype, self.name, "against_jv")
self.make_gl_entries(1)
+ self.update_advance_paid()
def validate_cheque_info(self):
if self.voucher_type in ['Bank Voucher']:
@@ -64,7 +81,8 @@
master_type = frappe.db.get_value("Account", d.account, "master_type")
if (master_type == 'Customer' and flt(d.credit) > 0) or \
(master_type == 'Supplier' and flt(d.debit) > 0):
- msgprint(_("Please check 'Is Advance' against Account {0} if this is an advance entry.").format(d.account))
+ msgprint(_("Row {0}: Please check 'Is Advance' against Account {1} if this \
+ is an advance entry.").format(d.idx, d.account))
def validate_against_jv(self):
for d in self.get('entries'):
@@ -90,24 +108,86 @@
.format(d.against_jv, dr_or_cr))
def validate_against_sales_invoice(self):
- for d in self.get("entries"):
- if d.against_invoice:
- if d.debit > 0:
- frappe.throw(_("Row {0}: Debit entry can not be linked with a Sales Invoice")
- .format(d.idx))
- if frappe.db.get_value("Sales Invoice", d.against_invoice, "debit_to") != d.account:
- frappe.throw(_("Row {0}: Account does not match with \
- Sales Invoice Debit To account").format(d.idx, d.account))
+ payment_against_voucher = self.validate_account_in_against_voucher("against_invoice", "Sales Invoice")
+ self.validate_against_invoice_fields("Sales Invoice", payment_against_voucher)
def validate_against_purchase_invoice(self):
+ payment_against_voucher = self.validate_account_in_against_voucher("against_voucher", "Purchase Invoice")
+ self.validate_against_invoice_fields("Purchase Invoice", payment_against_voucher)
+
+ def validate_against_sales_order(self):
+ payment_against_voucher = self.validate_account_in_against_voucher("against_sales_order", "Sales Order")
+ self.validate_against_order_fields("Sales Order", payment_against_voucher)
+
+ def validate_against_purchase_order(self):
+ payment_against_voucher = self.validate_account_in_against_voucher("against_purchase_order", "Purchase Order")
+ self.validate_against_order_fields("Purchase Order", payment_against_voucher)
+
+ def validate_account_in_against_voucher(self, against_field, doctype):
+ payment_against_voucher = frappe._dict()
+ field_dict = {'Sales Invoice': "Debit To",
+ 'Purchase Invoice': "Credit To",
+ 'Sales Order': "Customer",
+ 'Purchase Order': "Supplier"
+ }
+
for d in self.get("entries"):
- if d.against_voucher:
- if flt(d.credit) > 0:
- frappe.throw(_("Row {0}: Credit entry can not be linked with a Purchase Invoice")
- .format(d.idx))
- if frappe.db.get_value("Purchase Invoice", d.against_voucher, "credit_to") != d.account:
- frappe.throw(_("Row {0}: Account does not match with \
- Purchase Invoice Credit To account").format(d.idx, d.account))
+ if d.get(against_field):
+ dr_or_cr = "credit" if against_field in ["against_invoice", "against_sales_order"] \
+ else "debit"
+ if against_field in ["against_invoice", "against_sales_order"] \
+ and flt(d.debit) > 0:
+ frappe.throw(_("Row {0}: Debit entry can not be linked with a {1}").format(d.idx, doctype))
+
+ if against_field in ["against_voucher", "against_purchase_order"] \
+ and flt(d.credit) > 0:
+ frappe.throw(_("Row {0}: Credit entry can not be linked with a {1}").format(d.idx, doctype))
+
+ voucher_account = frappe.db.get_value(doctype, d.get(against_field), \
+ scrub(field_dict.get(doctype)))
+
+ account_master_name = frappe.db.get_value("Account", d.account, "master_name")
+
+ if against_field in ["against_invoice", "against_voucher"] \
+ and voucher_account != d.account:
+ frappe.throw(_("Row {0}: Account {1} does not match with {2} {3} account") \
+ .format(d.idx, d.account, doctype, field_dict.get(doctype)))
+
+ if against_field in ["against_sales_order", "against_purchase_order"]:
+ if voucher_account != account_master_name:
+ frappe.throw(_("Row {0}: Account {1} does not match with {2} {3} Name") \
+ .format(d.idx, d.account, doctype, field_dict.get(doctype)))
+ elif d.is_advance == "Yes":
+ payment_against_voucher.setdefault(d.get(against_field), []).append(flt(d.get(dr_or_cr)))
+
+ return payment_against_voucher
+
+ def validate_against_invoice_fields(self, doctype, payment_against_voucher):
+ for voucher_no, payment_list in payment_against_voucher.items():
+ voucher_properties = frappe.db.get_value(doctype, voucher_no,
+ ["docstatus", "outstanding_amount"])
+
+ if voucher_properties[0] != 1:
+ frappe.throw(_("{0} {1} is not submitted").format(doctype, voucher_no))
+
+ if flt(voucher_properties[1]) < flt(sum(payment_list)):
+ frappe.throw(_("Payment against {0} {1} cannot be greater \
+ than Outstanding Amount {2}").format(doctype, voucher_no, voucher_properties[1]))
+
+ def validate_against_order_fields(self, doctype, payment_against_voucher):
+ for voucher_no, payment_list in payment_against_voucher.items():
+ voucher_properties = frappe.db.get_value(doctype, voucher_no,
+ ["docstatus", "per_billed", "advance_paid", "grand_total"])
+
+ if voucher_properties[0] != 1:
+ frappe.throw(_("{0} {1} is not submitted").format(doctype, voucher_no))
+
+ if flt(voucher_properties[1]) >= 100:
+ frappe.throw(_("{0} {1} is fully billed").format(doctype, voucher_no))
+
+ if flt(voucher_properties[3]) < flt(voucher_properties[2]) + flt(sum(payment_list)):
+ frappe.throw(_("Advance paid against {0} {1} cannot be greater \
+ than Grand Total {2}").format(doctype, voucher_no, voucher_properties[3]))
def set_against_account(self):
accounts_debited, accounts_credited = [], []
@@ -147,7 +227,13 @@
for d in self.get('entries'):
if d.against_invoice and d.credit:
currency = frappe.db.get_value("Sales Invoice", d.against_invoice, "currency")
- r.append(_("{0} {1} against Invoice {2}").format(currency, fmt_money(flt(d.credit)), d.against_invoice))
+ r.append(_("{0} against Sales Invoice {1}").format(fmt_money(flt(d.credit), currency = currency), \
+ d.against_invoice))
+
+ if d.against_sales_order and d.credit:
+ currency = frappe.db.get_value("Sales Order", d.against_sales_order, "currency")
+ r.append(_("{0} against Sales Order {1}").format(fmt_money(flt(d.credit), currency = currency), \
+ d.against_sales_order))
if d.against_voucher and d.debit:
bill_no = frappe.db.sql("""select bill_no, bill_date, currency
@@ -158,13 +244,17 @@
fmt_money(flt(d.debit)), bill_no[0][0],
bill_no[0][1] and formatdate(bill_no[0][1].strftime('%Y-%m-%d'))))
+ if d.against_purchase_order and d.debit:
+ currency = frappe.db.get_value("Purchase Order", d.against_purchase_order, "currency")
+ r.append(_("{0} against Purchase Order {1}").format(fmt_money(flt(d.credit), currency = currency), \
+ d.against_purchase_order))
+
if self.user_remark:
r.append(_("Note: {0}").format(self.user_remark))
if r:
- self.remark = ("\n").join(r)
- else:
- frappe.msgprint(_("User Remarks is mandatory"), raise_exception=frappe.MandatoryError)
+ self.remark = ("\n").join(r) #User Remarks is not mandatory
+
def set_aging_date(self):
if self.is_opening != 'Yes':
@@ -264,14 +354,18 @@
"against": d.against_account,
"debit": flt(d.debit, self.precision("debit", "entries")),
"credit": flt(d.credit, self.precision("credit", "entries")),
- "against_voucher_type": ((d.against_voucher and "Purchase Invoice")
- or (d.against_invoice and "Sales Invoice")
- or (d.against_jv and "Journal Voucher")),
- "against_voucher": d.against_voucher or d.against_invoice or d.against_jv,
+ "against_voucher_type": (("Purchase Invoice" if d.against_voucher else None)
+ or ("Sales Invoice" if d.against_invoice else None)
+ or ("Journal Voucher" if d.against_jv else None)
+ or ("Sales Order" if d.against_sales_order else None)
+ or ("Purchase Order" if d.against_purchase_order else None)),
+ "against_voucher": d.against_voucher or d.against_invoice or d.against_jv
+ or d.against_sales_order or d.against_purchase_order,
"remarks": self.remark,
"cost_center": d.cost_center
})
)
+
if gl_map:
make_gl_entries(gl_map, cancel=cancel, adv_adj=adv_adj)
diff --git a/erpnext/accounts/doctype/journal_voucher/test_journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/test_journal_voucher.py
index 425baf1..2aac2b6 100644
--- a/erpnext/accounts/doctype/journal_voucher/test_journal_voucher.py
+++ b/erpnext/accounts/doctype/journal_voucher/test_journal_voucher.py
@@ -1,41 +1,88 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
-
from __future__ import unicode_literals
-import unittest
-import frappe
+import unittest, frappe
+from frappe.utils import flt
class TestJournalVoucher(unittest.TestCase):
def test_journal_voucher_with_against_jv(self):
- self.clear_account_balance()
+
jv_invoice = frappe.copy_doc(test_records[2])
- jv_invoice.insert()
- jv_invoice.submit()
+ base_jv = frappe.copy_doc(test_records[0])
+ self.jv_against_voucher_testcase(base_jv, jv_invoice)
- self.assertTrue(frappe.db.sql("""select name from `tabJournal Voucher Detail`
- where account = %s and docstatus = 1 and parent = %s""",
- ("_Test Customer - _TC", jv_invoice.name)))
+ def test_jv_against_sales_order(self):
+ from erpnext.selling.doctype.sales_order.test_sales_order \
+ import test_records as so_test_records
+
+ sales_order = frappe.copy_doc(so_test_records[0])
+ base_jv = frappe.copy_doc(test_records[0])
+ self.jv_against_voucher_testcase(base_jv, sales_order)
+
+ def test_jv_against_purchase_order(self):
+ from erpnext.buying.doctype.purchase_order.test_purchase_order \
+ import test_records as po_test_records
+
+ purchase_order = frappe.copy_doc(po_test_records[0])
+ base_jv = frappe.copy_doc(test_records[1])
+ self.jv_against_voucher_testcase(base_jv, purchase_order)
+
+ def jv_against_voucher_testcase(self, base_jv, test_voucher):
+ dr_or_cr = "credit" if test_voucher.doctype in ["Sales Order", "Journal Voucher"] else "debit"
+ field_dict = {'Journal Voucher': "against_jv",
+ 'Sales Order': "against_sales_order",
+ 'Purchase Order': "against_purchase_order"
+ }
+
+ self.clear_account_balance()
+ test_voucher.insert()
+ test_voucher.submit()
+
+ if test_voucher.doctype == "Journal Voucher":
+ self.assertTrue(frappe.db.sql("""select name from `tabJournal Voucher Detail`
+ where account = %s and docstatus = 1 and parent = %s""",
+ ("_Test Customer - _TC", test_voucher.name)))
self.assertTrue(not frappe.db.sql("""select name from `tabJournal Voucher Detail`
- where against_jv=%s""", jv_invoice.name))
+ where %s=%s""" % (field_dict.get(test_voucher.doctype), '%s'), (test_voucher.name)))
- jv_payment = frappe.copy_doc(test_records[0])
- jv_payment.get("entries")[0].against_jv = jv_invoice.name
- jv_payment.insert()
- jv_payment.submit()
+ base_jv.get("entries")[0].is_advance = "Yes" if (test_voucher.doctype in ["Sales Order", "Purchase Order"]) else "No"
+ base_jv.get("entries")[0].set(field_dict.get(test_voucher.doctype), test_voucher.name)
+ base_jv.insert()
+ base_jv.submit()
+
+ submitted_voucher = frappe.get_doc(test_voucher.doctype, test_voucher.name)
self.assertTrue(frappe.db.sql("""select name from `tabJournal Voucher Detail`
- where against_jv=%s""", jv_invoice.name))
+ where %s=%s""" % (field_dict.get(test_voucher.doctype), '%s'), (submitted_voucher.name)))
self.assertTrue(frappe.db.sql("""select name from `tabJournal Voucher Detail`
- where against_jv=%s and credit=400""", jv_invoice.name))
+ where %s=%s and %s=400""" % (field_dict.get(submitted_voucher.doctype), '%s', dr_or_cr), (submitted_voucher.name)))
- # cancel jv_invoice
- jv_invoice.cancel()
+ if base_jv.get("entries")[0].is_advance == "Yes":
+ self.advance_paid_testcase(base_jv, submitted_voucher, dr_or_cr)
+ self.cancel_against_voucher_testcase(submitted_voucher)
- self.assertTrue(not frappe.db.sql("""select name from `tabJournal Voucher Detail`
- where against_jv=%s""", jv_invoice.name))
+ def advance_paid_testcase(self, base_jv, test_voucher, dr_or_cr):
+ #Test advance paid field
+ advance_paid = frappe.db.sql("""select advance_paid from `tab%s`
+ where name=%s""" % (test_voucher.doctype, '%s'), (test_voucher.name))
+ payment_against_order = base_jv.get("entries")[0].get(dr_or_cr)
+
+ self.assertTrue(flt(advance_paid[0][0]) == flt(payment_against_order))
+
+ def cancel_against_voucher_testcase(self, test_voucher):
+ if test_voucher.doctype == "Journal Voucher":
+ # if test_voucher is a Journal Voucher, test cancellation of test_voucher
+ test_voucher.cancel()
+ self.assertTrue(not frappe.db.sql("""select name from `tabJournal Voucher Detail`
+ where against_jv=%s""", test_voucher.name))
+
+ elif test_voucher.doctype in ["Sales Order", "Purchase Order"]:
+ # if test_voucher is a Sales Order/Purchase Order, test error on cancellation of test_voucher
+ submitted_voucher = frappe.get_doc(test_voucher.doctype, test_voucher.name)
+ self.assertRaises(frappe.LinkExistsError, submitted_voucher.cancel)
def test_jv_against_stock_account(self):
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
diff --git a/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json b/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json
index a751ed9..2f15b0b 100644
--- a/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json
+++ b/erpnext/accounts/doctype/journal_voucher_detail/journal_voucher_detail.json
@@ -118,11 +118,6 @@
"search_index": 1
},
{
- "fieldname": "col_break3",
- "fieldtype": "Column Break",
- "permlevel": 0
- },
- {
"fieldname": "against_jv",
"fieldtype": "Link",
"in_filter": 1,
@@ -136,6 +131,25 @@
"search_index": 1
},
{
+ "fieldname": "col_break3",
+ "fieldtype": "Column Break",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "against_sales_order",
+ "fieldtype": "Link",
+ "label": "Against Sales Order",
+ "options": "Sales Order",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "against_purchase_order",
+ "fieldtype": "Link",
+ "label": "Against Purchase Order",
+ "options": "Purchase Order",
+ "permlevel": 0
+ },
+ {
"fieldname": "is_advance",
"fieldtype": "Select",
"label": "Is Advance",
@@ -160,7 +174,7 @@
],
"idx": 1,
"istable": 1,
- "modified": "2014-07-25 03:16:51.149899",
+ "modified": "2014-08-20 12:19:55.049973",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Journal Voucher Detail",
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
index c495a35..97484da 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
@@ -36,8 +36,8 @@
}
});
- var help_content = '<i class="icon-hand-right"></i> Note:<br>'+
- '<ul>If you are unable to match the exact amount, then amend your Journal Voucher and split rows such that payment amount match the invoice amount.</ul>';
+ var help_content = '<i class="icon-hand-right"></i> ' + __("Note") + ':<br>'+
+ '<ul>' + __("If you are unable to match the exact amount, then amend your Journal Voucher and split rows such that payment amount match the invoice amount.") + '</ul>';
this.frm.set_value("reconcile_help", help_content);
},
diff --git a/erpnext/accounts/doctype/payment_tool/__init__.py b/erpnext/accounts/doctype/payment_tool/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_tool/__init__.py
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.js b/erpnext/accounts/doctype/payment_tool/payment_tool.js
new file mode 100644
index 0000000..3e0d2ee
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.js
@@ -0,0 +1,217 @@
+// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+// For license information, please see license.txt
+
+frappe.provide("erpnext.payment_tool");
+
+// Help content
+frappe.ui.form.on("Payment Tool", "onload", function(frm) {
+ frm.set_value("make_jv_help", '<i class="icon-hand-right"></i> '
+ + __("Note: If payment is not made against any reference, make Journal Voucher manually."));
+
+ frm.set_query("payment_account", function() {
+ return {
+ filters: [
+ ['Account', 'account_type', 'in', 'Bank, Cash'],
+ ['Account', 'group_or_ledger', '=', 'Ledger'],
+ ['Account', 'company', '=', frm.doc.company]
+ ]
+ }
+ });
+
+ frm.set_query("against_voucher_type", "payment_tool_details", function() {
+ return {
+ filters: {"name": ["in", ["Sales Invoice", "Purchase Invoice", "Journal Voucher", "Sales Order", "Purchase Order"]]}
+ };
+ });
+});
+
+frappe.ui.form.on("Payment Tool", "refresh", function(frm) {
+ frappe.ui.form.trigger("Payment Tool", "party_type");
+});
+
+frappe.ui.form.on("Payment Tool", "party_type", function(frm) {
+ frm.toggle_reqd("customer", frm.doc.party_type == "Customer");
+ frm.toggle_reqd("supplier", frm.doc.party_type == "Supplier");
+});
+
+frappe.ui.form.on("Payment Tool", "company", function(frm) {
+ erpnext.payment_tool.check_mandatory_to_set_button(frm);
+});
+
+frappe.ui.form.on("Payment Tool", "received_or_paid", function(frm) {
+ erpnext.payment_tool.check_mandatory_to_set_button(frm);
+});
+
+// Fetch bank/cash account based on payment mode
+cur_frm.add_fetch("payment_mode", "default_account", "payment_account");
+
+// Set party account name
+frappe.ui.form.on("Payment Tool", "customer", function(frm) {
+ erpnext.payment_tool.set_party_account(frm);
+ erpnext.payment_tool.check_mandatory_to_set_button(frm);
+});
+
+frappe.ui.form.on("Payment Tool", "supplier", function(frm) {
+ erpnext.payment_tool.set_party_account(frm);
+ erpnext.payment_tool.check_mandatory_to_set_button(frm);
+});
+
+erpnext.payment_tool.check_mandatory_to_set_button = function(frm) {
+ if (frm.doc.company && frm.doc.party_type && frm.doc.received_or_paid && (frm.doc.customer || frm.doc.supplier)) {
+ frm.fields_dict.get_outstanding_vouchers.$input.addClass("btn-primary");
+ }
+}
+
+//Set Button color
+erpnext.payment_tool.set_party_account = function(frm) {
+ if(frm.doc.party_type == "Customer") {
+ var party_name = frm.doc.customer;
+ } else {
+ var party_name = frm.doc.supplier;
+ }
+ return frappe.call({
+ method: 'erpnext.accounts.doctype.payment_tool.payment_tool.get_party_account',
+ args: {
+ party_type: frm.doc.party_type,
+ party_name: party_name
+ },
+ callback: function(r, rt) {
+ if(!r.exc) {
+ frm.set_value("party_account", r.message);
+ }
+ }
+ });
+}
+
+// Get outstanding vouchers
+frappe.ui.form.on("Payment Tool", "get_outstanding_vouchers", function(frm) {
+ erpnext.payment_tool.check_mandatory_to_fetch(frm.doc);
+
+ frm.set_value("payment_tool_details", []);
+
+ return frappe.call({
+ method: 'erpnext.accounts.doctype.payment_tool.payment_tool.get_outstanding_vouchers',
+ args: {
+ args: {
+ "company": frm.doc.company,
+ "party_type": frm.doc.party_type,
+ "received_or_paid": frm.doc.received_or_paid,
+ "party_name": frm.doc.party_type == "Customer" ? frm.doc.customer : frm.doc.supplier,
+ "party_account": frm.doc.party_account
+ }
+ },
+ callback: function(r, rt) {
+ if(r.message) {
+ frm.fields_dict.get_outstanding_vouchers.$input.removeClass("btn-primary");
+ frm.fields_dict.make_journal_voucher.$input.addClass("btn-primary");
+
+ frappe.model.clear_table(frm.doc, "payment_tool_details");
+ $.each(r.message, function(i, d) {
+ var invoice_detail = frappe.model.add_child(frm.doc, "Payment Tool Detail", "payment_tool_details");
+ invoice_detail.against_voucher_type = d.voucher_type;
+ invoice_detail.against_voucher_no = d.voucher_no;
+ invoice_detail.total_amount = d.invoice_amount;
+ invoice_detail.outstanding_amount = d.outstanding_amount;
+ });
+ }
+ refresh_field("payment_tool_details");
+ erpnext.payment_tool.set_total_payment_amount(frm);
+ }
+ });
+});
+
+// validate against_voucher_type
+frappe.ui.form.on("Payment Tool Detail", "against_voucher_type", function(frm) {
+ erpnext.payment_tool.validate_against_voucher(frm);
+});
+
+erpnext.payment_tool.validate_against_voucher = function(frm) {
+ $.each(frm.doc.payment_tool_details || [], function(i, row) {
+ if(frm.doc.party_type=="Customer"
+ && !in_list(["Sales Order", "Sales Invoice", "Journal Voucher"], row.against_voucher_type)) {
+ frappe.model.set_value(row.doctype, row.name, "against_voucher_type", "");
+ frappe.throw(__("Against Voucher Type must be one of Sales Order, Sales Invoice or Journal Voucher"))
+ }
+
+ if(frm.doc.party_type=="Supplier"
+ && !in_list(["Purchase Order", "Purchase Invoice", "Journal Voucher"], row.against_voucher_type)) {
+ frappe.model.set_value(row.doctype, row.name, "against_voucher_type", "");
+ frappe.throw(__("Against Voucher Type must be one of Purchase Order, Purchase Invoice or Journal Voucher"))
+ }
+
+ });
+}
+
+// validate against_voucher_type
+frappe.ui.form.on("Payment Tool Detail", "against_voucher_no", function(frm, cdt, cdn) {
+ var row = locals[cdt][cdn];
+ frappe.call({
+ method: 'erpnext.accounts.doctype.payment_tool.payment_tool.get_against_voucher_amount',
+ args: {
+ "against_voucher_type": row.against_voucher_type,
+ "against_voucher_no": row.against_voucher_no
+ },
+ callback: function(r) {
+ if(!r.exc) {
+ $.each(r.message, function(k, v) {
+ frappe.model.set_value(cdt, cdn, k, v);
+ });
+ }
+ }
+ });
+});
+
+// Set total payment amount
+frappe.ui.form.on("Payment Tool Detail", "payment_amount", function(frm) {
+ erpnext.payment_tool.set_total_payment_amount(frm);
+});
+
+frappe.ui.form.on("Payment Tool Detail", "payment_tool_details_remove", function(frm) {
+ erpnext.payment_tool.set_total_payment_amount(frm);
+});
+
+erpnext.payment_tool.set_total_payment_amount = function(frm) {
+ var total_amount = 0.00;
+ $.each(frm.doc.payment_tool_details || [], function(i, row) {
+ if (row.payment_amount && (row.payment_amount <= row.outstanding_amount)) {
+ total_amount = total_amount + row.payment_amount;
+ } else {
+ if(row.payment_amount < 0)
+ msgprint(__("Row {0}: Payment amount can not be negative", [row.idx]));
+ else if(row.payment_amount >= row.outstanding_amount)
+ msgprint(__("Row {0}: Payment Amount cannot be greater than Outstanding Amount", [__(row.idx)]));
+
+ frappe.model.set_value(row.doctype, row.name, "payment_amount", 0.0);
+ }
+ });
+ frm.set_value("total_payment_amount", total_amount);
+}
+
+
+// Make Journal voucher
+frappe.ui.form.on("Payment Tool", "make_journal_voucher", function(frm) {
+ erpnext.payment_tool.check_mandatory_to_fetch(frm.doc);
+
+ return frappe.call({
+ method: 'make_journal_voucher',
+ doc: frm.doc,
+ callback: function(r) {
+ frm.fields_dict.make_journal_voucher.$input.addClass("btn-primary");
+ var doclist = frappe.model.sync(r.message);
+ frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
+ }
+ });
+});
+
+erpnext.payment_tool.check_mandatory_to_fetch = function(doc) {
+ var check_fields = [
+ ['Company', doc.company],
+ ['Party Type', doc.party_type],
+ ['Received Or Paid', doc.received_or_paid],
+ ['Customer / Supplier', doc.party_type == "Customer" ? doc.customer : doc.supplier]
+ ];
+
+ $.each(check_fields, function(i, v) {
+ if(!v[1]) frappe.throw(__("Please select {0} first", [v[0]]));
+ });
+}
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.json b/erpnext/accounts/doctype/payment_tool/payment_tool.json
new file mode 100644
index 0000000..b2949a9
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.json
@@ -0,0 +1,381 @@
+{
+ "allow_copy": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "creation": "2014-07-23 15:12:27.746665",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "",
+ "fields": [
+ {
+ "fieldname": "sec_break1",
+ "fieldtype": "Section Break",
+ "label": "Party Details",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "label": "Company",
+ "options": "Company",
+ "permlevel": 0,
+ "reqd": 1
+ },
+ {
+ "allow_on_submit": 0,
+ "default": "Customer",
+ "fieldname": "party_type",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Party Type",
+ "no_copy": 0,
+ "options": "Customer\nSupplier",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "depends_on": "eval:(doc.party_type == 'Customer')",
+ "fieldname": "customer",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Customer",
+ "no_copy": 0,
+ "options": "Customer",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "depends_on": "eval:(doc.party_type == 'Supplier')",
+ "fieldname": "supplier",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Supplier",
+ "no_copy": 0,
+ "options": "Supplier",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "fieldname": "party_account",
+ "fieldtype": "Link",
+ "hidden": 1,
+ "label": "Party Account",
+ "no_copy": 1,
+ "options": "Account",
+ "permlevel": 0,
+ "read_only": 1
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "received_or_paid",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Received Or Paid",
+ "no_copy": 0,
+ "options": "Received\nPaid",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "get_outstanding_vouchers",
+ "fieldtype": "Button",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Get Outstanding Vouchers",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "col_break1",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Column Break 1",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "payment_mode",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Payment Mode",
+ "no_copy": 0,
+ "options": "Mode of Payment",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "payment_account",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Payment Account",
+ "no_copy": 0,
+ "options": "Account",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "reference_no",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Reference No",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "reference_date",
+ "fieldtype": "Date",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Reference Date",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "depends_on": "eval:(doc.company && doc.party_type && doc.received_or_paid && (doc.customer || doc.supplier))",
+ "fieldname": "sec_break3",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Against Voucher",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "payment_tool_details",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Payment Tool Details",
+ "no_copy": 0,
+ "options": "Payment Tool Detail",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "depends_on": "eval:(doc.company && doc.party_type && doc.received_or_paid && (doc.customer || doc.supplier))",
+ "fieldname": "section_break_19",
+ "fieldtype": "Section Break",
+ "permlevel": 0,
+ "precision": ""
+ },
+ {
+ "fieldname": "total_payment_amount",
+ "fieldtype": "Currency",
+ "label": "Total Payment Amount",
+ "permlevel": 0,
+ "read_only": 1
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "make_journal_voucher",
+ "fieldtype": "Button",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Make Journal Voucher",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "fieldname": "data_22",
+ "fieldtype": "Column Break",
+ "permlevel": 0,
+ "precision": ""
+ },
+ {
+ "depends_on": "eval:(doc.company && doc.party_type && doc.received_or_paid && (doc.customer || doc.supplier))",
+ "fieldname": "section_break_21",
+ "fieldtype": "Section Break",
+ "permlevel": 0,
+ "precision": ""
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "make_jv_help",
+ "fieldtype": "Small Text",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ }
+ ],
+ "hide_heading": 0,
+ "hide_toolbar": 1,
+ "icon": "icon-magic",
+ "in_create": 0,
+ "in_dialog": 0,
+ "is_submittable": 0,
+ "issingle": 1,
+ "istable": 0,
+ "modified": "2014-09-12 04:43:05.963218",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Payment Tool",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "amend": 0,
+ "apply_user_permissions": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 0,
+ "export": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 0,
+ "read": 1,
+ "report": 0,
+ "role": "Accounts Manager",
+ "set_user_permissions": 0,
+ "submit": 0,
+ "write": 1
+ },
+ {
+ "amend": 0,
+ "apply_user_permissions": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 0,
+ "email": 0,
+ "export": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 0,
+ "read": 1,
+ "report": 0,
+ "role": "Accounts User",
+ "set_user_permissions": 0,
+ "submit": 0,
+ "write": 1
+ }
+ ],
+ "read_only": 0,
+ "read_only_onload": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.py b/erpnext/accounts/doctype/payment_tool/payment_tool.py
new file mode 100644
index 0000000..d8d6df3
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_tool/payment_tool.py
@@ -0,0 +1,118 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe import _, scrub
+from frappe.utils import flt
+from frappe.model.document import Document
+import json
+
+class PaymentTool(Document):
+ def make_journal_voucher(self):
+ from erpnext.accounts.utils import get_balance_on
+ total_payment_amount = 0.00
+ invoice_voucher_type = {
+ 'Sales Invoice': 'against_invoice',
+ 'Purchase Invoice': 'against_voucher',
+ 'Journal Voucher': 'against_jv',
+ 'Sales Order': 'against_sales_order',
+ 'Purchase Order': 'against_purchase_order',
+ }
+
+ jv = frappe.new_doc('Journal Voucher')
+ jv.voucher_type = 'Journal Entry'
+ jv.company = self.company
+ jv.cheque_no = self.reference_no
+ jv.cheque_date = self.reference_date
+
+ if not self.total_payment_amount:
+ frappe.throw(_("Please enter Payment Amount in atleast one row"))
+
+ for v in self.get("payment_tool_details"):
+ if not frappe.db.get_value(v.against_voucher_type, {"name": v.against_voucher_no}):
+ frappe.throw(_("Row {0}: {1} is not a valid {2}").format(v.idx, v.against_voucher_no,
+ v.against_voucher_type))
+
+ if v.payment_amount:
+ d1 = jv.append("entries")
+ d1.account = self.party_account
+ d1.balance = get_balance_on(self.party_account)
+ d1.set("debit" if self.received_or_paid=="Paid" else "credit", flt(v.payment_amount))
+ d1.set(invoice_voucher_type.get(v.against_voucher_type), v.against_voucher_no)
+ d1.set('is_advance', 'Yes' if v.against_voucher_type in ['Sales Order', 'Purchase Order'] else 'No')
+ total_payment_amount = flt(total_payment_amount) + flt(d1.debit) - flt(d1.credit)
+
+ d2 = jv.append("entries")
+ d2.account = self.payment_account
+ d2.set('debit' if total_payment_amount < 0 else 'credit', abs(total_payment_amount))
+ if self.payment_account:
+ d2.balance = get_balance_on(self.payment_account)
+
+ return jv.as_dict()
+
+@frappe.whitelist()
+def get_party_account(party_type, party_name):
+ return frappe.db.get_value("Account", {"master_type": party_type, "master_name": party_name})
+
+@frappe.whitelist()
+def get_outstanding_vouchers(args):
+ from erpnext.accounts.utils import get_outstanding_invoices
+
+ if not frappe.has_permission("Payment Tool"):
+ frappe.throw(_("No permission to use Payment Tool"), frappe.PermissionError)
+
+ args = json.loads(args)
+
+ if args.get("party_type") == "Customer" and args.get("received_or_paid") == "Received":
+ amount_query = "ifnull(debit, 0) - ifnull(credit, 0)"
+ elif args.get("party_type") == "Supplier" and args.get("received_or_paid") == "Paid":
+ amount_query = "ifnull(credit, 0) - ifnull(debit, 0)"
+ else:
+ frappe.throw(_("Please enter the Against Vouchers manually"))
+
+ # Get all outstanding sales /purchase invoices
+ outstanding_invoices = get_outstanding_invoices(amount_query, args.get("party_account"))
+
+ # Get all SO / PO which are not fully billed or aginst which full advance not paid
+ orders_to_be_billed = get_orders_to_be_billed(args.get("party_type"), args.get("party_name"))
+ return outstanding_invoices + orders_to_be_billed
+
+def get_orders_to_be_billed(party_type, party_name):
+ voucher_type = 'Sales Order' if party_type == "Customer" else 'Purchase Order'
+ orders = frappe.db.sql("""
+ select
+ name as voucher_no,
+ ifnull(grand_total, 0) as invoice_amount,
+ (ifnull(grand_total, 0) - ifnull(advance_paid, 0)) as outstanding_amount,
+ transaction_date as posting_date
+ from
+ `tab%s`
+ where
+ %s = %s
+ and docstatus = 1
+ and ifnull(grand_total, 0) > ifnull(advance_paid, 0)
+ and ifnull(per_billed, 0) < 100.0
+ """ % (voucher_type, 'customer' if party_type == "Customer" else 'supplier', '%s'),
+ party_name, as_dict = True)
+
+ order_list = []
+ for d in orders:
+ d["voucher_type"] = voucher_type
+ order_list.append(d)
+
+ return order_list
+
+@frappe.whitelist()
+def get_against_voucher_amount(against_voucher_type, against_voucher_no):
+ if against_voucher_type in ["Sales Order", "Purchase Order"]:
+ select_cond = "grand_total as total_amount, ifnull(grand_total, 0) - ifnull(advance_paid, 0) as outstanding_amount"
+ elif against_voucher_type in ["Sales Invoice", "Purchase Invoice"]:
+ select_cond = "grand_total as total_amount, outstanding_amount"
+ elif against_voucher_type == "Journal Voucher":
+ select_cond = "total_debit as total_amount"
+
+ details = frappe.db.sql("""select {0} from `tab{1}` where name = %s"""
+ .format(select_cond, against_voucher_type), against_voucher_no, as_dict=1)
+
+ return details[0] if details else {}
diff --git a/erpnext/accounts/doctype/payment_tool/test_payment_tool.py b/erpnext/accounts/doctype/payment_tool/test_payment_tool.py
new file mode 100644
index 0000000..c91a5de
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_tool/test_payment_tool.py
@@ -0,0 +1,193 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import unittest, frappe, json
+from frappe.utils import flt
+
+test_dependencies = ["Item"]
+
+class TestPaymentTool(unittest.TestCase):
+ def test_make_journal_voucher(self):
+ from erpnext.accounts.doctype.journal_voucher.test_journal_voucher \
+ import test_records as jv_test_records
+ from erpnext.selling.doctype.sales_order.test_sales_order \
+ import test_records as so_test_records
+ from erpnext.buying.doctype.purchase_order.test_purchase_order \
+ import test_records as po_test_records
+ from erpnext.accounts.doctype.sales_invoice.test_sales_invoice \
+ import test_records as si_test_records
+ from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice \
+ import test_records as pi_test_records
+
+ self.clear_table_entries()
+
+ base_customer_jv = self.create_against_jv(jv_test_records[2], { "account": "_Test Customer 3 - _TC"})
+ base_supplier_jv = self.create_against_jv(jv_test_records[1], { "account": "_Test Supplier 1 - _TC"})
+
+
+ #Create SO with partial outstanding
+ so1 = self.create_voucher(so_test_records[0], {
+ "customer": "_Test Customer 3"
+ })
+
+ jv_against_so1 = self.create_against_jv(jv_test_records[0], {
+ "account": "_Test Customer 3 - _TC",
+ "against_sales_order": so1.name
+ })
+
+
+ #Create SO with no outstanding
+ so2 = self.create_voucher(so_test_records[0], {
+ "customer": "_Test Customer 3"
+ })
+
+ jv_against_so2 = self.create_against_jv(jv_test_records[0], {
+ "account": "_Test Customer 3 - _TC",
+ "against_sales_order": so2.name,
+ "credit": 1000
+ })
+ po = self.create_voucher(po_test_records[1], {
+ "supplier": "_Test Supplier 1"
+ })
+
+ #Create SI with partial outstanding
+ si1 = self.create_voucher(si_test_records[0], {
+ "customer": "_Test Customer 3",
+ "debit_to": "_Test Customer 3 - _TC"
+ })
+
+ jv_against_si1 = self.create_against_jv(jv_test_records[0], {
+ "account": "_Test Customer 3 - _TC",
+ "against_invoice": si1.name
+ })
+ #Create SI with no outstanding
+ si2 = self.create_voucher(si_test_records[0], {
+ "customer": "_Test Customer 3",
+ "debit_to": "_Test Customer 3 - _TC"
+ })
+
+ jv_against_si2 = self.create_against_jv(jv_test_records[0], {
+ "account": "_Test Customer 3 - _TC",
+ "against_invoice": si2.name,
+ "credit": 561.80
+ })
+
+ pi = self.create_voucher(pi_test_records[0], {
+ "supplier": "_Test Supplier 1",
+ "credit_to": "_Test Supplier 1 - _TC"
+ })
+
+ #Create a dict containing properties and expected values
+ expected_outstanding = {
+ "Journal Voucher" : [base_customer_jv.name, 400.00],
+ "Sales Invoice" : [si1.name, 161.80],
+ "Purchase Invoice" : [pi.name, 1512.30],
+ "Sales Order" : [so1.name, 600.00],
+ "Purchase Order" : [po.name, 5000.00]
+ }
+
+ args = {
+ "company": "_Test Company",
+ "party_type": "Customer",
+ "received_or_paid": "Received",
+ "customer": "_Test Customer",
+ "party_account": "_Test Customer 3 - _TC",
+ "payment_mode": "Cheque",
+ "payment_account": "_Test Account Bank Account - _TC",
+ "reference_no": "123456",
+ "reference_date": "2013-02-14"
+ }
+
+ self.make_voucher_for_party(args, expected_outstanding)
+
+ args.update({
+ "party_type": "Supplier",
+ "received_or_paid": "Paid",
+ "supplier": "_Test Supplier 1",
+ "party_account": "_Test Supplier 1 - _TC"
+ })
+ expected_outstanding["Journal Voucher"] = [base_supplier_jv.name, 400.00]
+ self.make_voucher_for_party(args, expected_outstanding)
+
+ def create_voucher(self, test_record, args):
+ doc = frappe.copy_doc(test_record)
+ doc.update(args)
+ doc.insert()
+ doc.submit()
+ return doc
+
+ def create_against_jv(self, test_record, args):
+ jv = frappe.copy_doc(test_record)
+ jv.get("entries")[0].update(args)
+ if args.get("debit"):
+ jv.get("entries")[1].credit = args["debit"]
+ elif args.get("credit"):
+ jv.get("entries")[1].debit = args["credit"]
+
+ jv.insert()
+ jv.submit()
+ return jv
+
+ def make_voucher_for_party(self, args, expected_outstanding):
+ #Make Journal Voucher for Party
+ payment_tool_doc = frappe.new_doc("Payment Tool")
+
+ for k, v in args.items():
+ payment_tool_doc.set(k, v)
+
+ self.check_outstanding_vouchers(payment_tool_doc, args, expected_outstanding)
+
+
+ def check_outstanding_vouchers(self, doc, args, expected_outstanding):
+ from erpnext.accounts.doctype.payment_tool.payment_tool import get_outstanding_vouchers
+
+ outstanding_entries = get_outstanding_vouchers(json.dumps(args))
+
+ for d in outstanding_entries:
+ self.assertEquals(flt(d.get("outstanding_amount"), 2), expected_outstanding.get(d.get("voucher_type"))[1])
+
+ self.check_jv_entries(doc, outstanding_entries, expected_outstanding)
+
+ def check_jv_entries(self, paytool, outstanding_entries, expected_outstanding):
+ for e in outstanding_entries:
+ d1 = paytool.append("payment_tool_details")
+ d1.against_voucher_type = e.get("voucher_type")
+ d1.against_voucher_no = e.get("voucher_no")
+ d1.total_amount = e.get("invoice_amount")
+ d1.outstanding_amount = e.get("outstanding_amount")
+ d1.payment_amount = 100.00
+ paytool.total_payment_amount = 300
+
+ new_jv = paytool.make_journal_voucher()
+
+ #Create a list of expected values as [party account, payment against, against_jv, against_invoice,
+ #against_voucher, against_sales_order, against_purchase_order]
+ expected_values = [
+ [paytool.party_account, 100.00, expected_outstanding.get("Journal Voucher")[0], None, None, None, None],
+ [paytool.party_account, 100.00, None, expected_outstanding.get("Sales Invoice")[0], None, None, None],
+ [paytool.party_account, 100.00, None, None, expected_outstanding.get("Purchase Invoice")[0], None, None],
+ [paytool.party_account, 100.00, None, None, None, expected_outstanding.get("Sales Order")[0], None],
+ [paytool.party_account, 100.00, None, None, None, None, expected_outstanding.get("Purchase Order")[0]]
+ ]
+
+ for jv_entry in new_jv.get("entries"):
+ if paytool.party_account == jv_entry.get("account"):
+ row = [
+ jv_entry.get("account"),
+ jv_entry.get("debit" if paytool.party_type=="Supplier" else "credit"),
+ jv_entry.get("against_jv"),
+ jv_entry.get("against_invoice"),
+ jv_entry.get("against_voucher"),
+ jv_entry.get("against_sales_order"),
+ jv_entry.get("against_purchase_order"),
+ ]
+ self.assertTrue(row in expected_values)
+
+ self.assertEquals(new_jv.get("cheque_no"), paytool.reference_no)
+ self.assertEquals(new_jv.get("cheque_date"), paytool.reference_date)
+
+ def clear_table_entries(self):
+ frappe.db.sql("""delete from `tabGL Entry` where (account = "_Test Customer 3 - _TC" or account = "_Test Supplier 1 - _TC")""")
+ frappe.db.sql("""delete from `tabSales Order` where customer_name = "_Test Customer 3" """)
+ frappe.db.sql("""delete from `tabPurchase Order` where supplier_name = "_Test Supplier 1" """)
diff --git a/erpnext/accounts/doctype/payment_tool_detail/__init__.py b/erpnext/accounts/doctype/payment_tool_detail/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_tool_detail/__init__.py
diff --git a/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json b/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json
new file mode 100644
index 0000000..5f0e7ec
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.json
@@ -0,0 +1,130 @@
+{
+ "allow_copy": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "creation": "2014-08-11 14:27:54.463897",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "",
+ "fields": [
+ {
+ "allow_on_submit": 0,
+ "fieldname": "against_voucher_type",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Against Voucher Type",
+ "no_copy": 0,
+ "options": "DocType",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_width": "",
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "width": ""
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "against_voucher_no",
+ "fieldtype": "Dynamic Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Against Voucher No",
+ "no_copy": 0,
+ "options": "against_voucher_type",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "fieldname": "column_break_3",
+ "fieldtype": "Column Break",
+ "permlevel": 0,
+ "precision": ""
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "total_amount",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Total Amount",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "outstanding_amount",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Outstanding Amount",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 1,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "payment_amount",
+ "fieldtype": "Currency",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Payment Amount",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0
+ }
+ ],
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "in_create": 0,
+ "in_dialog": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 1,
+ "modified": "2014-09-11 08:55:34.384017",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Payment Tool Detail",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [],
+ "read_only": 0,
+ "read_only_onload": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.py b/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.py
new file mode 100644
index 0000000..80c5532
--- /dev/null
+++ b/erpnext/accounts/doctype/payment_tool_detail/payment_tool_detail.py
@@ -0,0 +1,9 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class PaymentToolDetail(Document):
+ pass
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js
index ba8d747..8802093 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.js
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js
@@ -45,7 +45,7 @@
'icon-plus');
}
- wrapper.appframe.set_title_right('Refresh', function() {
+ wrapper.appframe.set_title_right(__('Refresh'), function() {
wrapper.$company_select.change();
});
diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js
index 0d06de1..e394410 100644
--- a/erpnext/accounts/page/pos/pos.js
+++ b/erpnext/accounts/page/pos/pos.js
@@ -1,7 +1,7 @@
frappe.pages['pos'].onload = function(wrapper) {
frappe.ui.make_app_page({
parent: wrapper,
- title: 'Start POS',
+ title: __('Start POS'),
single_column: true
});
diff --git a/erpnext/accounts/report/accounts_payable/accounts_payable.py b/erpnext/accounts/report/accounts_payable/accounts_payable.py
index b65c1e8..3ae741e 100644
--- a/erpnext/accounts/report/accounts_payable/accounts_payable.py
+++ b/erpnext/accounts/report/accounts_payable/accounts_payable.py
@@ -67,12 +67,12 @@
def get_columns(supplier_naming_by):
columns = [
- "Posting Date:Date:80", "Account:Link/Account:150", "Voucher Type::110",
- "Voucher No::120", "::30", "Due Date:Date:80", "Bill No::80", "Bill Date:Date:80",
- "Invoiced Amount:Currency:100", "Paid Amount:Currency:100",
- "Outstanding Amount:Currency:100", "Age:Int:50", "0-30:Currency:100",
- "30-60:Currency:100", "60-90:Currency:100", "90-Above:Currency:100",
- "Supplier:Link/Supplier:150"
+ _("Posting Date") + ":Date:80", _("Account") + ":Link/Account:150", _("Voucher Type") + "::110",
+ _("Voucher No") + "::120", "::30", _("Due Date") + ":Date:80", _("Bill No") + "::80", _("Bill Date") + ":Date:80",
+ _("Invoiced Amount") + ":Currency:100", _("Paid Amount") + ":Currency:100",
+ _("Outstanding Amount") + ":Currency:100", _("Age") + ":Int:50", "0-30:Currency:100",
+ "30-60:Currency:100", "60-90:Currency:100", _("90-Above") + ":Currency:100",
+ _("Supplier") + ":Link/Supplier:150"
]
if supplier_naming_by == "Naming Series":
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 427669f..2891b05 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -20,13 +20,13 @@
def get_columns(self, customer_naming_by):
columns = [
- "Posting Date:Date:80", "Account:Link/Account:150",
- "Voucher Type::110", "Voucher No::120", "::30",
- "Due Date:Date:80",
- "Invoiced Amount:Currency:100", "Payment Received:Currency:100",
- "Outstanding Amount:Currency:100", "Age:Int:50", "0-30:Currency:100",
- "30-60:Currency:100", "60-90:Currency:100", "90-Above:Currency:100",
- "Customer:Link/Customer:200"
+ _("Posting Date") + ":Date:80", _("Account") + ":Link/Account:150",
+ _("Voucher Type") + "::110", _("Voucher No") + "::120", "::30",
+ _("Due Date") + ":Date:80",
+ _("Invoiced Amount") + ":Currency:100", _("Payment Received") + ":Currency:100",
+ _("Outstanding Amount") + ":Currency:100", _("Age") + ":Int:50", "0-30:Currency:100",
+ "30-60:Currency:100", "60-90:Currency:100", _("90-Above") + ":Currency:100",
+ _("Customer") + ":Link/Customer:200"
]
if customer_naming_by == "Naming Series":
diff --git a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
index f86c932..dbf86e3 100644
--- a/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
+++ b/erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py
@@ -14,9 +14,9 @@
return columns, data
def get_columns():
- return ["Journal Voucher:Link/Journal Voucher:140", "Account:Link/Account:140",
- "Posting Date:Date:100", "Clearance Date:Date:110", "Against Account:Link/Account:200",
- "Debit:Currency:120", "Credit:Currency:120"
+ return [_("Journal Voucher") + ":Link/Journal Voucher:140", _("Account") + ":Link/Account:140",
+ _("Posting Date") + ":Date:100", _("Clearance Date") + ":Date:110", _("Against Account") + ":Link/Account:200",
+ _("Debit") + ":Currency:120", _("Credit") + ":Currency:120"
]
def get_conditions(filters):
diff --git a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html
index d05bffa..9d67ba3 100644
--- a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html
+++ b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.html
@@ -16,31 +16,31 @@
</thead>
<tbody>
{% for(var i=0, l=data.length; i<l; i++) { %}
- {% if (data[i].posting_date) { %}
+ {% if (data[i][__("Posting Date")]) { %}
<tr>
- <td>{%= dateutil.str_to_user(data[i].posting_date) %}</td>
- <td>{%= data[i].journal_voucher %}</td>
- <td>{%= __("Against") %}: {%= data[i].against_account %}
- {% if (data[i].reference) { %}
- <br>{%= __("Reference") %}: {%= data[i].reference %}
- {% if (data[i].ref_date) { %}
- <br>{%= __("Reference Date") %}: {%= dateutil.str_to_user(data[i].ref_date) %}
+ <td>{%= dateutil.str_to_user(data[i][__("Posting Date")]) %}</td>
+ <td>{%= data[i][__("Journal Voucher")] %}</td>
+ <td>{%= __("Against") %}: {%= data[i][__("Against Account")] %}
+ {% if (data[i][__("Reference")]) { %}
+ <br>{%= __("Reference") %}: {%= data[i][__("Reference")] %}
+ {% if (data[i][__("Ref Date")]) { %}
+ <br>{%= __("Reference Date") %}: {%= dateutil.str_to_user(data[i][__("Ref Date")]) %}
{% } %}
{% } %}
- {% if (data[i].clearance_date) { %}
- <br>{%= __("Clearance Date") %}: {%= dateutil.str_to_user(data[i].clearance_date) %}
+ {% if (data[i][__("Clearance Date")]) { %}
+ <br>{%= __("Clearance Date") %}: {%= dateutil.str_to_user(data[i][__("Clearance Date")]) %}
{% } %}
</td>
- <td style="text-align: right">{%= format_currency(data[i].debit) %}</td>
- <td style="text-align: right">{%= format_currency(data[i].credit) %}</td>
+ <td style="text-align: right">{%= format_currency(data[i][__("Debit")]) %}</td>
+ <td style="text-align: right">{%= format_currency(data[i][__("Credit")]) %}</td>
</tr>
{% } else { %}
<tr>
<td></td>
<td></td>
- <td>{%= data[i].journal_voucher %}</td>
- <td style="text-align: right">{%= format_currency(data[i].debit) %}</td>
- <td style="text-align: right">{%= format_currency(data[i].credit) %}</td>
+ <td>{%= data[i][__("Journal Voucher")] %}</td>
+ <td style="text-align: right">{%= format_currency(data[i][__("Debit")]) %}</td>
+ <td style="text-align: right">{%= format_currency(data[i][__("Credit")]) %}</td>
</tr>
{% } %}
{% } %}
diff --git a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
index 4fda030..cbe5988 100644
--- a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
+++ b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py
@@ -26,7 +26,7 @@
amounts_not_reflected_in_system = frappe.db.sql("""select sum(ifnull(jvd.debit, 0) - ifnull(jvd.credit, 0))
from `tabJournal Voucher Detail` jvd, `tabJournal Voucher` jv
where jvd.parent = jv.name and jv.docstatus=1 and jvd.account=%s
- and jv.posting_date > %s and jv.clearance_date <= %s
+ and jv.posting_date > %s and jv.clearance_date <= %s and ifnull(jv.is_opening, 'No') = 'No'
""", (filters["account"], filters["report_date"], filters["report_date"]))
amounts_not_reflected_in_system = flt(amounts_not_reflected_in_system[0][0]) \
@@ -47,9 +47,9 @@
return columns, data
def get_columns():
- return ["Posting Date:Date:100", "Journal Voucher:Link/Journal Voucher:220",
- "Debit:Currency:120", "Credit:Currency:120",
- "Against Account:Link/Account:200", "Reference::100", "Ref Date:Date:110", "Clearance Date:Date:110"
+ return [_("Posting Date") + ":Date:100", _("Journal Voucher") + ":Link/Journal Voucher:220",
+ _("Debit") + ":Currency:120", _("Credit") + ":Currency:120",
+ _("Against Account") + ":Link/Account:200", _("Reference") + "::100", _("Ref Date") + ":Date:110", _("Clearance Date") + ":Date:110"
]
def get_entries(filters):
@@ -61,6 +61,7 @@
where jvd.parent = jv.name and jv.docstatus=1
and jvd.account = %(account)s and jv.posting_date <= %(report_date)s
and ifnull(jv.clearance_date, '4000-01-01') > %(report_date)s
+ and ifnull(jv.is_opening, 'No') = 'No'
order by jv.name DESC""", filters, as_list=1)
return entries
diff --git a/erpnext/accounts/report/budget_variance_report/budget_variance_report.py b/erpnext/accounts/report/budget_variance_report/budget_variance_report.py
index c98d205..d64c374 100644
--- a/erpnext/accounts/report/budget_variance_report/budget_variance_report.py
+++ b/erpnext/accounts/report/budget_variance_report/budget_variance_report.py
@@ -5,6 +5,7 @@
import frappe
from frappe import _, msgprint
from frappe.utils import flt
+from frappe.utils import formatdate
import time
from erpnext.accounts.utils import get_fiscal_year
from erpnext.controllers.trends import get_period_date_ranges, get_period_month_ranges
@@ -44,21 +45,21 @@
msgprint(_("Please specify") + ": " + label,
raise_exception=True)
- columns = ["Cost Center:Link/Cost Center:120", "Account:Link/Account:120"]
+ columns = [_("Cost Center") + ":Link/Cost Center:120", _("Account") + ":Link/Account:120"]
group_months = False if filters["period"] == "Monthly" else True
for from_date, to_date in get_period_date_ranges(filters["period"], filters["fiscal_year"]):
- for label in ["Target (%s)", "Actual (%s)", "Variance (%s)"]:
+ for label in [_("Target") + " (%s)", _("Actual") + " (%s)", _("Variance") + " (%s)"]:
if group_months:
- label = label % (from_date.strftime("%b") + " - " + to_date.strftime("%b"))
+ label = label % (formatdate(from_date, format_string="MMM") + " - " + formatdate(from_date, format_string="MMM"))
else:
- label = label % from_date.strftime("%b")
+ label = label % formatdate(from_date, format_string="MMM")
columns.append(label+":Float:120")
- return columns + ["Total Target:Float:120", "Total Actual:Float:120",
- "Total Variance:Float:120"]
+ return columns + [_("Total Target") + ":Float:120", _("Total Actual") + ":Float:120",
+ _("Total Variance") + ":Float:120"]
#Get cost center & target details
def get_costcenter_target_details(filters):
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html
index eb596d2..5c6b0f1 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.html
+++ b/erpnext/accounts/report/general_ledger/general_ledger.html
@@ -22,23 +22,23 @@
<tbody>
{% for(var i=0, l=data.length; i<l; i++) { %}
<tr>
- {% if(data[i].posting_date) { %}
- <td>{%= dateutil.str_to_user(data[i].posting_date) %}</td>
- <td>{%= data[i].voucher_type%}
- <br>{%= data[i].voucher_no %}</td>
- <td>{%= data[i].account %}
- <br>{%= __("Against") %}: {%= data[i].against_account %}
- <br>{%= __("Remarks") %}: {%= data[i].remarks %}</td>
- <td style="text-align: right">{%= format_currency(data[i].debit) %}</td>
- <td style="text-align: right">{%= format_currency(data[i].credit) %}</td>
+ {% if(data[i][__("Posting Date")]) { %}
+ <td>{%= dateutil.str_to_user(data[i][__("Posting Date")]) %}</td>
+ <td>{%= data[i][__("Voucher Type")] %}
+ <br>{%= data[i][__("Voucher No")] %}</td>
+ <td>{%= data[i][__("Account")] %}
+ <br>{%= __("Against") %}: {%= data[i][__("Against Account")] %}
+ <br>{%= __("Remarks") %}: {%= data[i][__("Remarks")] %}</td>
+ <td style="text-align: right">{%= format_currency(data[i][__("Debit")]) %}</td>
+ <td style="text-align: right">{%= format_currency(data[i][__("Credit")]) %}</td>
{% } else { %}
<td></td>
<td></td>
- <td><b>{%= data[i].account || " " %}</b></td>
+ <td><b>{%= data[i][__("Account")] || " " %}</b></td>
<td style="text-align: right">
- {%= data[i].account && format_currency(data[i].debit) %}</td>
+ {%= data[i][__("Account")] && format_currency(data[i][__("Debit")]) %}</td>
<td style="text-align: right">
- {%= data[i].account && format_currency(data[i].credit) %}</td>
+ {%= data[i][__("Account")] && format_currency(data[i][__("Credit")]) %}</td>
{% } %}
</tr>
{% } %}
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index d1ea442..362f42e 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -34,9 +34,9 @@
frappe.throw(_("From Date must be before To Date"))
def get_columns():
- return ["Posting Date:Date:100", "Account:Link/Account:200", "Debit:Float:100",
- "Credit:Float:100", "Voucher Type::120", "Voucher No::160", "Link::20",
- "Against Account::120", "Cost Center:Link/Cost Center:100", "Remarks::400"]
+ return [_("Posting Date") + ":Date:100", _("Account") + ":Link/Account:200", _("Debit") + ":Float:100",
+ _("Credit") + ":Float:100", _("Voucher Type") + "::120", _("Voucher No") + "::160", _("Link") + "::20",
+ _("Against Account") + "::120", _("Cost Center") + ":Link/Cost Center:100", _("Remarks") + "::400"]
def get_result(filters, account_details):
gl_entries = get_gl_entries(filters)
diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py
index 1bbf2d1..76e7b4a 100644
--- a/erpnext/accounts/report/gross_profit/gross_profit.py
+++ b/erpnext/accounts/report/gross_profit/gross_profit.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
from frappe.utils import flt
from erpnext.stock.utils import get_buying_amount, get_sales_bom_buying_amount
@@ -13,11 +14,11 @@
source = get_source_data(filters)
item_sales_bom = get_item_sales_bom()
- columns = ["Delivery Note/Sales Invoice::120", "Link::30", "Posting Date:Date", "Posting Time",
- "Item Code:Link/Item", "Item Name", "Description", "Warehouse:Link/Warehouse",
- "Qty:Float", "Selling Rate:Currency", "Avg. Buying Rate:Currency",
- "Selling Amount:Currency", "Buying Amount:Currency",
- "Gross Profit:Currency", "Gross Profit %:Percent", "Project:Link/Project"]
+ columns = [__("Delivery Note/Sales Invoice") + "::120", _("Link") + "::30", _("Posting Date") + ":Date", _("Posting Time"),
+ _("Item Code") + ":Link/Item", _("Item Name"), _("Description"), _("Warehouse") + ":Link/Warehouse",
+ _("Qty") + ":Float", _("Selling Rate") + ":Currency", _("Avg. Buying Rate") + ":Currency",
+ _("Selling Amount") + ":Currency", _("Buying Amount") + ":Currency",
+ _("Gross Profit") + ":Currency", _("Gross Profit %") + ":Percent", _("Project") + ":Link/Project"]
data = []
for row in source:
selling_amount = flt(row.base_amount)
diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
index 8e74873..127e9cb 100644
--- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
+++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import msgprint, _
from frappe.utils import flt
def execute(filters=None):
@@ -33,12 +34,12 @@
def get_columns():
- return ["Item Code:Link/Item:120", "Item Name::120", "Item Group:Link/Item Group:100",
- "Invoice:Link/Purchase Invoice:120", "Posting Date:Date:80", "Supplier:Link/Customer:120",
- "Supplier Account:Link/Account:120", "Project:Link/Project:80", "Company:Link/Company:100",
- "Purchase Order:Link/Purchase Order:100", "Purchase Receipt:Link/Purchase Receipt:100",
- "Expense Account:Link/Account:140", "Qty:Float:120", "Rate:Currency:120",
- "Amount:Currency:120"]
+ return [_("Item Code") + ":Link/Item:120", _("Item Name") + "::120", _("Item Group") + ":Link/Item Group:100",
+ _("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80", _("Supplier") + ":Link/Customer:120",
+ _("Supplier Account") + ":Link/Account:120", _("Project") + ":Link/Project:80", _("Company") + ":Link/Company:100",
+ _("Purchase Order") + ":Link/Purchase Order:100", _("Purchase Receipt") + ":Link/Purchase Receipt:100",
+ _("Expense Account") + ":Link/Account:140", _("Qty") + ":Float:120", _("Rate") + ":Currency:120",
+ _("Amount") + ":Currency:120"]
def get_conditions(filters):
conditions = ""
diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
index 6a0d051..2840291 100644
--- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
+++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import msgprint, _
from frappe.utils import flt
def execute(filters=None):
@@ -32,12 +33,12 @@
def get_columns():
return [
- "Item Code:Link/Item:120", "Item Name::120", "Item Group:Link/Item Group:100",
- "Invoice:Link/Sales Invoice:120", "Posting Date:Date:80", "Customer:Link/Customer:120",
- "Customer Account:Link/Account:120", "Territory:Link/Territory:80",
- "Project:Link/Project:80", "Company:Link/Company:100", "Sales Order:Link/Sales Order:100",
- "Delivery Note:Link/Delivery Note:100", "Income Account:Link/Account:140",
- "Qty:Float:120", "Rate:Currency:120", "Amount:Currency:120"
+ _("Item Code") + ":Link/Item:120", _("Item Name") + "::120", _("Item Group") + ":Link/Item Group:100",
+ _("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80", _("Customer") + ":Link/Customer:120",
+ _("Customer Account") + ":Link/Account:120", _("Territory") + ":Link/Territory:80",
+ _("Project") + ":Link/Project:80", _("Company") + ":Link/Company:100", _("Sales Order") + ":Link/Sales Order:100",
+ _("Delivery Note") + ":Link/Delivery Note:100", _("Income Account") + ":Link/Account:140",
+ _("Qty") + ":Float:120", _("Rate") + ":Currency:120", _("Amount") + ":Currency:120"
]
def get_conditions(filters):
diff --git a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py
index b70c1dd..b1d7437 100644
--- a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py
+++ b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py
@@ -37,11 +37,11 @@
return columns, data
def get_columns():
- return ["Journal Voucher:Link/Journal Voucher:140", "Account:Link/Account:140",
- "Posting Date:Date:100", "Against Invoice:Link/Purchase Invoice:130",
- "Against Invoice Posting Date:Date:130", "Debit:Currency:120", "Credit:Currency:120",
- "Reference No::100", "Reference Date:Date:100", "Remarks::150", "Age:Int:40",
- "0-30:Currency:100", "30-60:Currency:100", "60-90:Currency:100", "90-Above:Currency:100"
+ return [_("Journal Voucher") + ":Link/Journal Voucher:140", _("Account") + ":Link/Account:140",
+ _("Posting Date") + ":Date:100", _("Against Invoice") + ":Link/Purchase Invoice:130",
+ _("Against Invoice Posting Date") + ":Date:130", _("Debit") + ":Currency:120", _("Credit") + ":Currency:120",
+ _("Reference No") + "::100", _("Reference Date") + ":Date:100", _("Remarks") + "::150", _("Age") +":Int:40",
+ "0-30:Currency:100", "30-60:Currency:100", "60-90:Currency:100", _("90-Above") + ":Currency:100"
]
def get_conditions(filters):
diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py
index a82ec29..4000657 100644
--- a/erpnext/accounts/report/purchase_register/purchase_register.py
+++ b/erpnext/accounts/report/purchase_register/purchase_register.py
@@ -63,11 +63,11 @@
def get_columns(invoice_list):
"""return columns based on filters"""
columns = [
- "Invoice:Link/Purchase Invoice:120", "Posting Date:Date:80", "Supplier Id::120",
- "Supplier Name::120", "Supplier Account:Link/Account:120",
- "Account Group:LInk/Account:120", "Project:Link/Project:80", "Bill No::120",
- "Bill Date:Date:80", "Remarks::150",
- "Purchase Order:Link/Purchase Order:100", "Purchase Receipt:Link/Purchase Receipt:100"
+ _("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80", _("Supplier Id") + "::120",
+ _("Supplier Name") + "::120", _("Supplier Account") + ":Link/Account:120",
+ _("Account Group") + ":Link/Account:120", _("Project") + ":Link/Project:80", _("Bill No") + "::120",
+ _("Bill Date") + ":Date:80", _("Remarks") + "::150",
+ _("Purchase Order") + ":Link/Purchase Order:100", _("Purchase Receipt") + ":Link/Purchase Receipt:100"
]
expense_accounts = tax_accounts = expense_columns = tax_columns = []
diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py
index 4131ee2..1bde110 100644
--- a/erpnext/accounts/report/sales_register/sales_register.py
+++ b/erpnext/accounts/report/sales_register/sales_register.py
@@ -63,10 +63,10 @@
def get_columns(invoice_list):
"""return columns based on filters"""
columns = [
- "Invoice:Link/Sales Invoice:120", "Posting Date:Date:80", "Customer Id::120",
- "Customer Name::120", "Customer Account:Link/Account:120", "Account Group:LInk/Account:120",
- "Territory:Link/Territory:80", "Project:Link/Project:80", "Remarks::150",
- "Sales Order:Link/Sales Order:100", "Delivery Note:Link/Delivery Note:100"
+ _("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80", _("Customer Id") + "::120",
+ _("Customer Name") + "::120", _("Customer Account") + ":Link/Account:120", _("Account Group") + ":Link/Account:120",
+ _("Territory") + ":Link/Territory:80", _("Project") + ":Link/Project:80", _("Remarks") + "::150",
+ _("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100"
]
income_accounts = tax_accounts = income_columns = tax_columns = []
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index d1b6584..c658cdd 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -391,3 +391,42 @@
# Amount should be credited
return flt(stock_rbnb) + flt(sys_bal)
+
+def get_outstanding_invoices(amount_query, account):
+ all_outstanding_vouchers = []
+ outstanding_voucher_list = frappe.db.sql("""
+ select
+ voucher_no, voucher_type, posting_date,
+ ifnull(sum({amount_query}), 0) as invoice_amount
+ from
+ `tabGL Entry`
+ where
+ account = %s and {amount_query} > 0
+ group by voucher_type, voucher_no
+ """.format(amount_query = amount_query), account, as_dict = True)
+
+ for d in outstanding_voucher_list:
+ payment_amount = frappe.db.sql("""
+ select ifnull(sum(ifnull({amount_query}, 0)), 0)
+ from
+ `tabGL Entry`
+ where
+ account = %s and {amount_query} < 0
+ and against_voucher_type = %s and ifnull(against_voucher, '') = %s
+ """.format(**{
+ "amount_query": amount_query
+ }), (account, d.voucher_type, d.voucher_no))
+
+ payment_amount = -1*payment_amount[0][0] if payment_amount else 0
+
+ if d.invoice_amount > payment_amount:
+
+ all_outstanding_vouchers.append({
+ 'voucher_no': d.voucher_no,
+ 'voucher_type': d.voucher_type,
+ 'posting_date': d.posting_date,
+ 'invoice_amount': flt(d.invoice_amount),
+ 'outstanding_amount': d.invoice_amount - payment_amount
+ })
+
+ return all_outstanding_vouchers
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json
index 912022c..2224db7 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.json
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.json
@@ -1,724 +1,732 @@
{
- "allow_import": 1,
- "autoname": "naming_series:",
- "creation": "2013-05-21 16:16:39",
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Transaction",
+ "allow_import": 1,
+ "autoname": "naming_series:",
+ "creation": "2013-05-21 16:16:39",
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "Transaction",
"fields": [
{
- "fieldname": "supplier_section",
- "fieldtype": "Section Break",
- "label": "Supplier",
- "options": "icon-user",
+ "fieldname": "supplier_section",
+ "fieldtype": "Section Break",
+ "label": "Supplier",
+ "options": "icon-user",
"permlevel": 0
- },
+ },
{
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Series",
- "no_copy": 1,
- "oldfieldname": "naming_series",
- "oldfieldtype": "Select",
- "options": "PO-",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "naming_series",
+ "fieldtype": "Select",
+ "label": "Series",
+ "no_copy": 1,
+ "oldfieldname": "naming_series",
+ "oldfieldtype": "Select",
+ "options": "PO-",
+ "permlevel": 0,
+ "print_hide": 1,
"reqd": 1
- },
+ },
{
- "description": "Supplier (vendor) name as entered in supplier master",
- "fieldname": "supplier",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Supplier",
- "oldfieldname": "supplier",
- "oldfieldtype": "Link",
- "options": "Supplier",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
+ "description": "Supplier (vendor) name as entered in supplier master",
+ "fieldname": "supplier",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Supplier",
+ "oldfieldname": "supplier",
+ "oldfieldtype": "Link",
+ "options": "Supplier",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
"search_index": 1
- },
+ },
{
- "fieldname": "supplier_name",
- "fieldtype": "Data",
- "hidden": 0,
- "in_list_view": 1,
- "label": "Name",
- "permlevel": 0,
+ "fieldname": "supplier_name",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "in_list_view": 1,
+ "label": "Name",
+ "permlevel": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "address_display",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Address",
- "permlevel": 0,
+ "fieldname": "address_display",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Address",
+ "permlevel": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "contact_display",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Contact",
- "permlevel": 0,
+ "fieldname": "contact_display",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Contact",
+ "permlevel": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "contact_mobile",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Mobile No",
- "permlevel": 0,
+ "fieldname": "contact_mobile",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Mobile No",
+ "permlevel": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "contact_email",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Contact Email",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "contact_email",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Contact Email",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "column_break1",
- "fieldtype": "Column Break",
- "oldfieldtype": "Column Break",
- "permlevel": 0,
- "print_hide": 0,
- "print_width": "50%",
+ "fieldname": "column_break1",
+ "fieldtype": "Column Break",
+ "oldfieldtype": "Column Break",
+ "permlevel": 0,
+ "print_hide": 0,
+ "print_width": "50%",
"width": "50%"
- },
+ },
{
- "fieldname": "transaction_date",
- "fieldtype": "Date",
- "in_filter": 1,
- "label": "Date",
- "oldfieldname": "transaction_date",
- "oldfieldtype": "Date",
- "permlevel": 0,
- "reqd": 1,
+ "fieldname": "transaction_date",
+ "fieldtype": "Date",
+ "in_filter": 1,
+ "label": "Date",
+ "oldfieldname": "transaction_date",
+ "oldfieldtype": "Date",
+ "permlevel": 0,
+ "reqd": 1,
"search_index": 1
- },
+ },
{
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 1,
- "label": "Amended From",
- "no_copy": 1,
- "oldfieldname": "amended_from",
- "oldfieldtype": "Data",
- "options": "Purchase Order",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "fieldname": "amended_from",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 1,
+ "label": "Amended From",
+ "no_copy": 1,
+ "oldfieldname": "amended_from",
+ "oldfieldtype": "Data",
+ "options": "Purchase Order",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"report_hide": 0
- },
+ },
{
- "description": "Select the relevant company name if you have multiple companies",
- "fieldname": "company",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Company",
- "no_copy": 0,
- "oldfieldname": "company",
- "oldfieldtype": "Link",
- "options": "Company",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
+ "description": "Select the relevant company name if you have multiple companies",
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Company",
+ "no_copy": 0,
+ "oldfieldname": "company",
+ "oldfieldtype": "Link",
+ "options": "Company",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
"search_index": 1
- },
+ },
{
- "fieldname": "price_list_and_currency",
- "fieldtype": "Section Break",
- "label": "Currency and Price List",
- "options": "icon-tag",
+ "fieldname": "price_list_and_currency",
+ "fieldtype": "Section Break",
+ "label": "Currency and Price List",
+ "options": "icon-tag",
"permlevel": 0
- },
+ },
{
- "fieldname": "cb_currency",
- "fieldtype": "Column Break",
+ "fieldname": "cb_currency",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "currency",
- "fieldtype": "Link",
- "label": "Currency",
- "no_copy": 0,
- "oldfieldname": "currency",
- "oldfieldtype": "Select",
- "options": "Currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "currency",
+ "fieldtype": "Link",
+ "label": "Currency",
+ "no_copy": 0,
+ "oldfieldname": "currency",
+ "oldfieldtype": "Select",
+ "options": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
"reqd": 1
- },
+ },
{
- "description": "Rate at which supplier's currency is converted to company's base currency",
- "fieldname": "conversion_rate",
- "fieldtype": "Float",
- "hidden": 0,
- "label": "Exchange Rate",
- "no_copy": 0,
- "oldfieldname": "conversion_rate",
- "oldfieldtype": "Currency",
- "permlevel": 0,
- "print_hide": 1,
+ "description": "Rate at which supplier's currency is converted to company's base currency",
+ "fieldname": "conversion_rate",
+ "fieldtype": "Float",
+ "hidden": 0,
+ "label": "Exchange Rate",
+ "no_copy": 0,
+ "oldfieldname": "conversion_rate",
+ "oldfieldtype": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
"reqd": 1
- },
+ },
{
- "fieldname": "cb_price_list",
- "fieldtype": "Column Break",
+ "fieldname": "cb_price_list",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "buying_price_list",
- "fieldtype": "Link",
- "label": "Price List",
- "options": "Price List",
- "permlevel": 0,
+ "fieldname": "buying_price_list",
+ "fieldtype": "Link",
+ "label": "Price List",
+ "options": "Price List",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "price_list_currency",
- "fieldtype": "Link",
- "label": "Price List Currency",
- "options": "Currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "price_list_currency",
+ "fieldtype": "Link",
+ "label": "Price List Currency",
+ "options": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "plc_conversion_rate",
- "fieldtype": "Float",
- "label": "Price List Exchange Rate",
- "permlevel": 0,
+ "fieldname": "plc_conversion_rate",
+ "fieldtype": "Float",
+ "label": "Price List Exchange Rate",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "ignore_pricing_rule",
- "fieldtype": "Check",
- "label": "Ignore Pricing Rule",
- "no_copy": 1,
- "permlevel": 1,
+ "fieldname": "ignore_pricing_rule",
+ "fieldtype": "Check",
+ "label": "Ignore Pricing Rule",
+ "no_copy": 1,
+ "permlevel": 1,
"print_hide": 1
- },
+ },
{
- "fieldname": "items",
- "fieldtype": "Section Break",
- "label": "Items",
- "oldfieldtype": "Section Break",
- "options": "icon-shopping-cart",
+ "fieldname": "items",
+ "fieldtype": "Section Break",
+ "label": "Items",
+ "oldfieldtype": "Section Break",
+ "options": "icon-shopping-cart",
"permlevel": 0
- },
+ },
{
- "allow_on_submit": 1,
- "fieldname": "po_details",
- "fieldtype": "Table",
- "label": "Purchase Order Items",
- "no_copy": 0,
- "oldfieldname": "po_details",
- "oldfieldtype": "Table",
- "options": "Purchase Order Item",
+ "allow_on_submit": 1,
+ "fieldname": "po_details",
+ "fieldtype": "Table",
+ "label": "Purchase Order Items",
+ "no_copy": 0,
+ "oldfieldname": "po_details",
+ "oldfieldtype": "Table",
+ "options": "Purchase Order Item",
"permlevel": 0
- },
+ },
{
- "fieldname": "sb_last_purchase",
- "fieldtype": "Section Break",
+ "fieldname": "sb_last_purchase",
+ "fieldtype": "Section Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "net_total",
- "fieldtype": "Currency",
- "label": "Net Total (Company Currency)",
- "no_copy": 1,
- "oldfieldname": "net_total",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "fieldname": "net_total",
+ "fieldtype": "Currency",
+ "label": "Net Total (Company Currency)",
+ "no_copy": 1,
+ "oldfieldname": "net_total",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"reqd": 0
- },
+ },
{
- "fieldname": "column_break_26",
- "fieldtype": "Column Break",
+ "fieldname": "column_break_26",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "net_total_import",
- "fieldtype": "Currency",
- "label": "Net Total",
- "no_copy": 0,
- "oldfieldname": "net_total_import",
- "oldfieldtype": "Currency",
- "options": "currency",
- "permlevel": 0,
- "print_hide": 0,
+ "fieldname": "net_total_import",
+ "fieldtype": "Currency",
+ "label": "Net Total",
+ "no_copy": 0,
+ "oldfieldname": "net_total_import",
+ "oldfieldtype": "Currency",
+ "options": "currency",
+ "permlevel": 0,
+ "print_hide": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "get_last_purchase_rate",
- "fieldtype": "Button",
- "label": "Get Last Purchase Rate",
- "oldfieldtype": "Button",
- "permlevel": 0,
+ "fieldname": "get_last_purchase_rate",
+ "fieldtype": "Button",
+ "label": "Get Last Purchase Rate",
+ "oldfieldtype": "Button",
+ "permlevel": 0,
"print_hide": 0
- },
+ },
{
- "fieldname": "taxes",
- "fieldtype": "Section Break",
- "label": "Taxes and Charges",
- "oldfieldtype": "Section Break",
- "options": "icon-money",
- "permlevel": 0,
+ "fieldname": "taxes",
+ "fieldtype": "Section Break",
+ "label": "Taxes and Charges",
+ "oldfieldtype": "Section Break",
+ "options": "icon-money",
+ "permlevel": 0,
"print_hide": 0
- },
+ },
{
- "description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
- "fieldname": "taxes_and_charges",
- "fieldtype": "Link",
- "label": "Taxes and Charges",
- "no_copy": 0,
- "oldfieldname": "purchase_other_charges",
- "oldfieldtype": "Link",
- "options": "Purchase Taxes and Charges Master",
- "permlevel": 0,
+ "description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
+ "fieldname": "taxes_and_charges",
+ "fieldtype": "Link",
+ "label": "Taxes and Charges",
+ "no_copy": 0,
+ "oldfieldname": "purchase_other_charges",
+ "oldfieldtype": "Link",
+ "options": "Purchase Taxes and Charges Master",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "other_charges",
- "fieldtype": "Table",
- "label": "Purchase Taxes and Charges",
- "no_copy": 0,
- "oldfieldname": "purchase_tax_details",
- "oldfieldtype": "Table",
- "options": "Purchase Taxes and Charges",
+ "fieldname": "other_charges",
+ "fieldtype": "Table",
+ "label": "Purchase Taxes and Charges",
+ "no_copy": 0,
+ "oldfieldname": "purchase_tax_details",
+ "oldfieldtype": "Table",
+ "options": "Purchase Taxes and Charges",
"permlevel": 0
- },
+ },
{
- "fieldname": "other_charges_calculation",
- "fieldtype": "HTML",
- "label": "Taxes and Charges Calculation",
- "no_copy": 1,
- "oldfieldtype": "HTML",
- "permlevel": 0,
+ "fieldname": "other_charges_calculation",
+ "fieldtype": "HTML",
+ "label": "Taxes and Charges Calculation",
+ "no_copy": 1,
+ "oldfieldtype": "HTML",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "totals",
- "fieldtype": "Section Break",
- "label": "Totals",
- "oldfieldtype": "Section Break",
- "options": "icon-money",
+ "fieldname": "totals",
+ "fieldtype": "Section Break",
+ "label": "Totals",
+ "oldfieldtype": "Section Break",
+ "options": "icon-money",
"permlevel": 0
- },
+ },
{
- "fieldname": "other_charges_added",
- "fieldtype": "Currency",
- "label": "Taxes and Charges Added (Company Currency)",
- "no_copy": 0,
- "oldfieldname": "other_charges_added",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "other_charges_added",
+ "fieldtype": "Currency",
+ "label": "Taxes and Charges Added (Company Currency)",
+ "no_copy": 0,
+ "oldfieldname": "other_charges_added",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "other_charges_deducted",
- "fieldtype": "Currency",
- "label": "Taxes and Charges Deducted (Company Currency)",
- "no_copy": 0,
- "oldfieldname": "other_charges_deducted",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "other_charges_deducted",
+ "fieldtype": "Currency",
+ "label": "Taxes and Charges Deducted (Company Currency)",
+ "no_copy": 0,
+ "oldfieldname": "other_charges_deducted",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "total_tax",
- "fieldtype": "Currency",
- "label": "Total Tax (Company Currency)",
- "no_copy": 1,
- "oldfieldname": "total_tax",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "total_tax",
+ "fieldtype": "Currency",
+ "label": "Total Tax (Company Currency)",
+ "no_copy": 1,
+ "oldfieldname": "total_tax",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "grand_total",
- "fieldtype": "Currency",
- "label": "Grand Total (Company Currency)",
- "no_copy": 1,
- "oldfieldname": "grand_total",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "grand_total",
+ "fieldtype": "Currency",
+ "label": "Grand Total (Company Currency)",
+ "no_copy": 1,
+ "oldfieldname": "grand_total",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "description": "In Words will be visible once you save the Purchase Order.",
- "fieldname": "in_words",
- "fieldtype": "Data",
- "label": "In Words (Company Currency)",
- "oldfieldname": "in_words",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 1,
+ "description": "In Words will be visible once you save the Purchase Order.",
+ "fieldname": "in_words",
+ "fieldtype": "Data",
+ "label": "In Words (Company Currency)",
+ "oldfieldname": "in_words",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "rounded_total",
- "fieldtype": "Currency",
- "label": "Rounded Total (Company Currency)",
- "oldfieldname": "rounded_total",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "rounded_total",
+ "fieldtype": "Currency",
+ "label": "Rounded Total (Company Currency)",
+ "oldfieldname": "rounded_total",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "column_break4",
- "fieldtype": "Column Break",
- "oldfieldtype": "Column Break",
- "permlevel": 0,
+ "fieldname": "advance_paid",
+ "fieldtype": "Currency",
+ "label": "Advance Paid",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1
+ },
+ {
+ "fieldname": "column_break4",
+ "fieldtype": "Column Break",
+ "oldfieldtype": "Column Break",
+ "permlevel": 0,
"print_hide": 0
- },
+ },
{
- "fieldname": "other_charges_added_import",
- "fieldtype": "Currency",
- "label": "Taxes and Charges Added",
- "no_copy": 0,
- "oldfieldname": "other_charges_added_import",
- "oldfieldtype": "Currency",
- "options": "currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "fieldname": "other_charges_added_import",
+ "fieldtype": "Currency",
+ "label": "Taxes and Charges Added",
+ "no_copy": 0,
+ "oldfieldname": "other_charges_added_import",
+ "oldfieldtype": "Currency",
+ "options": "currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"report_hide": 0
- },
+ },
{
- "fieldname": "other_charges_deducted_import",
- "fieldtype": "Currency",
- "label": "Taxes and Charges Deducted",
- "no_copy": 0,
- "oldfieldname": "other_charges_deducted_import",
- "oldfieldtype": "Currency",
- "options": "currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "fieldname": "other_charges_deducted_import",
+ "fieldtype": "Currency",
+ "label": "Taxes and Charges Deducted",
+ "no_copy": 0,
+ "oldfieldname": "other_charges_deducted_import",
+ "oldfieldtype": "Currency",
+ "options": "currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"report_hide": 0
- },
+ },
{
- "fieldname": "grand_total_import",
- "fieldtype": "Currency",
- "in_list_view": 1,
- "label": "Grand Total",
- "no_copy": 0,
- "oldfieldname": "grand_total_import",
- "oldfieldtype": "Currency",
- "options": "currency",
- "permlevel": 0,
- "print_hide": 0,
- "read_only": 1,
+ "fieldname": "grand_total_import",
+ "fieldtype": "Currency",
+ "in_list_view": 1,
+ "label": "Grand Total",
+ "no_copy": 0,
+ "oldfieldname": "grand_total_import",
+ "oldfieldtype": "Currency",
+ "options": "currency",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 1,
"report_hide": 0
- },
+ },
{
- "fieldname": "in_words_import",
- "fieldtype": "Data",
- "label": "In Words",
- "oldfieldname": "in_words_import",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 0,
+ "fieldname": "in_words_import",
+ "fieldtype": "Data",
+ "label": "In Words",
+ "oldfieldname": "in_words_import",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "fold",
- "fieldtype": "Fold",
+ "fieldname": "fold",
+ "fieldtype": "Fold",
"permlevel": 0
- },
+ },
{
- "fieldname": "terms_section_break",
- "fieldtype": "Section Break",
- "label": "Terms and Conditions",
- "oldfieldtype": "Section Break",
- "options": "icon-legal",
+ "fieldname": "terms_section_break",
+ "fieldtype": "Section Break",
+ "label": "Terms and Conditions",
+ "oldfieldtype": "Section Break",
+ "options": "icon-legal",
"permlevel": 0
- },
+ },
{
- "fieldname": "tc_name",
- "fieldtype": "Link",
- "label": "Terms",
- "oldfieldname": "tc_name",
- "oldfieldtype": "Link",
- "options": "Terms and Conditions",
- "permlevel": 0,
+ "fieldname": "tc_name",
+ "fieldtype": "Link",
+ "label": "Terms",
+ "oldfieldname": "tc_name",
+ "oldfieldtype": "Link",
+ "options": "Terms and Conditions",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "terms",
- "fieldtype": "Text Editor",
- "label": "Terms and Conditions",
- "oldfieldname": "terms",
- "oldfieldtype": "Text Editor",
+ "fieldname": "terms",
+ "fieldtype": "Text Editor",
+ "label": "Terms and Conditions",
+ "oldfieldname": "terms",
+ "oldfieldtype": "Text Editor",
"permlevel": 0
- },
+ },
{
- "depends_on": "supplier",
- "fieldname": "contact_section",
- "fieldtype": "Section Break",
- "label": "Contact Info",
- "options": "icon-bullhorn",
+ "depends_on": "supplier",
+ "fieldname": "contact_section",
+ "fieldtype": "Section Break",
+ "label": "Contact Info",
+ "options": "icon-bullhorn",
"permlevel": 0
- },
+ },
{
- "fieldname": "supplier_address",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Supplier Address",
- "options": "Address",
- "permlevel": 0,
+ "fieldname": "supplier_address",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Supplier Address",
+ "options": "Address",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "cb_contact",
- "fieldtype": "Column Break",
+ "fieldname": "cb_contact",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "contact_person",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Contact Person",
- "options": "Contact",
- "permlevel": 0,
+ "fieldname": "contact_person",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Contact Person",
+ "options": "Contact",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "more_info",
- "fieldtype": "Section Break",
- "label": "More Info",
- "oldfieldtype": "Section Break",
+ "fieldname": "more_info",
+ "fieldtype": "Section Break",
+ "label": "More Info",
+ "oldfieldtype": "Section Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "status",
- "fieldtype": "Select",
- "in_filter": 1,
- "label": "Status",
- "no_copy": 1,
- "oldfieldname": "status",
- "oldfieldtype": "Select",
- "options": "\nDraft\nSubmitted\nStopped\nCancelled",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
- "reqd": 1,
+ "fieldname": "status",
+ "fieldtype": "Select",
+ "in_filter": 1,
+ "label": "Status",
+ "no_copy": 1,
+ "oldfieldname": "status",
+ "oldfieldtype": "Select",
+ "options": "\nDraft\nSubmitted\nStopped\nCancelled",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
+ "reqd": 1,
"search_index": 1
- },
+ },
{
- "default": "No",
- "fieldname": "is_subcontracted",
- "fieldtype": "Select",
- "label": "Is Subcontracted",
- "options": "\nYes\nNo",
- "permlevel": 0,
+ "default": "No",
+ "fieldname": "is_subcontracted",
+ "fieldtype": "Select",
+ "label": "Is Subcontracted",
+ "options": "\nYes\nNo",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "ref_sq",
- "fieldtype": "Data",
- "hidden": 1,
- "label": "Ref SQ",
- "no_copy": 1,
- "oldfieldname": "ref_sq",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "ref_sq",
+ "fieldtype": "Data",
+ "hidden": 1,
+ "label": "Ref SQ",
+ "no_copy": 1,
+ "oldfieldname": "ref_sq",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "allow_on_submit": 1,
- "fieldname": "letter_head",
- "fieldtype": "Link",
- "label": "Letter Head",
- "oldfieldname": "letter_head",
- "oldfieldtype": "Select",
- "options": "Letter Head",
- "permlevel": 0,
+ "allow_on_submit": 1,
+ "fieldname": "letter_head",
+ "fieldtype": "Link",
+ "label": "Letter Head",
+ "oldfieldname": "letter_head",
+ "oldfieldtype": "Select",
+ "options": "Letter Head",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "fiscal_year",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Fiscal Year",
- "no_copy": 0,
- "oldfieldname": "fiscal_year",
- "oldfieldtype": "Select",
- "options": "Fiscal Year",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
+ "fieldname": "fiscal_year",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Fiscal Year",
+ "no_copy": 0,
+ "oldfieldname": "fiscal_year",
+ "oldfieldtype": "Select",
+ "options": "Fiscal Year",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
"search_index": 1
- },
+ },
{
- "allow_on_submit": 1,
- "fieldname": "select_print_heading",
- "fieldtype": "Link",
- "label": "Print Heading",
- "no_copy": 1,
- "oldfieldname": "select_print_heading",
- "oldfieldtype": "Link",
- "options": "Print Heading",
- "permlevel": 0,
- "print_hide": 1,
+ "allow_on_submit": 1,
+ "fieldname": "select_print_heading",
+ "fieldtype": "Link",
+ "label": "Print Heading",
+ "no_copy": 1,
+ "oldfieldname": "select_print_heading",
+ "oldfieldtype": "Link",
+ "options": "Print Heading",
+ "permlevel": 0,
+ "print_hide": 1,
"report_hide": 1
- },
+ },
{
- "fieldname": "column_break5",
- "fieldtype": "Column Break",
- "oldfieldtype": "Column Break",
- "permlevel": 0,
- "print_hide": 1,
- "print_width": "50%",
+ "fieldname": "column_break5",
+ "fieldtype": "Column Break",
+ "oldfieldtype": "Column Break",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_width": "50%",
"width": "50%"
- },
+ },
{
- "depends_on": "eval:!doc.__islocal",
- "description": "% of materials received against this Purchase Order",
- "fieldname": "per_received",
- "fieldtype": "Percent",
- "in_list_view": 1,
- "label": "% Received",
- "no_copy": 1,
- "oldfieldname": "per_received",
- "oldfieldtype": "Currency",
- "permlevel": 0,
- "print_hide": 1,
+ "depends_on": "eval:!doc.__islocal",
+ "description": "% of materials received against this Purchase Order",
+ "fieldname": "per_received",
+ "fieldtype": "Percent",
+ "in_list_view": 1,
+ "label": "% Received",
+ "no_copy": 1,
+ "oldfieldname": "per_received",
+ "oldfieldtype": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "depends_on": "eval:!doc.__islocal",
- "description": "% of materials billed against this Purchase Order.",
- "fieldname": "per_billed",
- "fieldtype": "Percent",
- "in_list_view": 1,
- "label": "% Billed",
- "no_copy": 1,
- "oldfieldname": "per_billed",
- "oldfieldtype": "Currency",
- "permlevel": 0,
- "print_hide": 1,
+ "depends_on": "eval:!doc.__islocal",
+ "description": "% of materials billed against this Purchase Order.",
+ "fieldname": "per_billed",
+ "fieldtype": "Percent",
+ "in_list_view": 1,
+ "label": "% Billed",
+ "no_copy": 1,
+ "oldfieldname": "per_billed",
+ "oldfieldtype": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "description": "Required raw materials issued to the supplier for producing a sub - contracted item.",
- "fieldname": "raw_material_details",
- "fieldtype": "Section Break",
- "label": "Raw Materials Supplied",
- "oldfieldtype": "Section Break",
- "options": "icon-truck",
- "permlevel": 0,
+ "description": "Required raw materials issued to the supplier for producing a sub - contracted item.",
+ "fieldname": "raw_material_details",
+ "fieldtype": "Section Break",
+ "label": "Raw Materials Supplied",
+ "oldfieldtype": "Section Break",
+ "options": "icon-truck",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "allow_on_submit": 1,
- "fieldname": "po_raw_material_details",
- "fieldtype": "Table",
- "label": "Purchase Order Items Supplied",
- "no_copy": 0,
- "oldfieldname": "po_raw_material_details",
- "oldfieldtype": "Table",
- "options": "Purchase Order Item Supplied",
- "permlevel": 0,
- "print_hide": 1,
+ "allow_on_submit": 1,
+ "fieldname": "po_raw_material_details",
+ "fieldtype": "Table",
+ "label": "Purchase Order Items Supplied",
+ "no_copy": 0,
+ "oldfieldname": "po_raw_material_details",
+ "oldfieldtype": "Table",
+ "options": "Purchase Order Item Supplied",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
}
- ],
- "icon": "icon-file-text",
- "idx": 1,
- "is_submittable": 1,
- "modified": "2014-09-09 05:35:32.583024",
- "modified_by": "Administrator",
- "module": "Buying",
- "name": "Purchase Order",
- "owner": "Administrator",
+ ],
+ "icon": "icon-file-text",
+ "idx": 1,
+ "is_submittable": 1,
+ "modified": "2014-09-10 05:35:32.583024",
+ "modified_by": "Administrator",
+ "module": "Buying",
+ "name": "Purchase Order",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 0,
- "apply_user_permissions": 1,
- "cancel": 0,
- "create": 0,
- "delete": 0,
- "email": 0,
- "permlevel": 0,
- "print": 0,
- "read": 1,
- "report": 1,
- "role": "Material User",
- "submit": 0,
+ "amend": 0,
+ "apply_user_permissions": 1,
+ "cancel": 0,
+ "create": 0,
+ "delete": 0,
+ "email": 0,
+ "permlevel": 0,
+ "print": 0,
+ "read": 1,
+ "report": 1,
+ "role": "Material User",
+ "submit": 0,
"write": 0
- },
+ },
{
- "amend": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Purchase Manager",
- "submit": 1,
+ "amend": 1,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Purchase Manager",
+ "submit": 1,
"write": 1
- },
+ },
{
- "amend": 1,
- "apply_user_permissions": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Purchase User",
- "submit": 1,
+ "amend": 1,
+ "apply_user_permissions": 1,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Purchase User",
+ "submit": 1,
"write": 1
- },
+ },
{
- "apply_user_permissions": 1,
- "cancel": 0,
- "delete": 0,
- "email": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
+ "apply_user_permissions": 1,
+ "cancel": 0,
+ "delete": 0,
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
"role": "Supplier"
- },
+ },
{
- "permlevel": 1,
- "read": 1,
- "role": "Purchase Manager",
+ "permlevel": 1,
+ "read": 1,
+ "role": "Purchase Manager",
"write": 1
}
- ],
- "read_only_onload": 1,
- "search_fields": "status, transaction_date, supplier,grand_total",
- "sort_field": "modified",
+ ],
+ "read_only_onload": 1,
+ "search_fields": "status, transaction_date, supplier,grand_total",
+ "sort_field": "modified",
"sort_order": "DESC"
-}
\ No newline at end of file
+}
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index 6c7c0c6..4def1db 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -238,6 +238,11 @@
@frappe.whitelist()
def make_purchase_invoice(source_name, target_doc=None):
+ def postprocess(source, target):
+ set_missing_values(source, target)
+ #Get the advance paid Journal Vouchers in Purchase Invoice Advance
+ target.get_advances()
+
def update_item(obj, target, source_parent):
target.amount = flt(obj.amount) - flt(obj.billed_amt)
target.base_amount = target.amount * flt(source_parent.conversion_rate)
@@ -263,6 +268,6 @@
"doctype": "Purchase Taxes and Charges",
"add_if_empty": True
}
- }, target_doc, set_missing_values)
+ }, target_doc, postprocess)
return doc
diff --git a/erpnext/buying/doctype/purchase_order/test_records.json b/erpnext/buying/doctype/purchase_order/test_records.json
index 3aaf542..6b89bdc 100644
--- a/erpnext/buying/doctype/purchase_order/test_records.json
+++ b/erpnext/buying/doctype/purchase_order/test_records.json
@@ -1,5 +1,6 @@
[
{
+ "advance_paid": 0.0,
"buying_price_list": "_Test Price List",
"company": "_Test Company",
"conversion_rate": 1.0,
@@ -31,5 +32,39 @@
"supplier": "_Test Supplier",
"supplier_name": "_Test Supplier",
"transaction_date": "2013-02-12"
+ },
+ {
+ "advance_paid": 0.0,
+ "buying_price_list": "_Test Price List",
+ "company": "_Test Company",
+ "conversion_rate": 1.0,
+ "currency": "INR",
+ "doctype": "Purchase Order",
+ "fiscal_year": "_Test Fiscal Year 2013",
+ "grand_total": 5000.0,
+ "grand_total_import": 5000.0,
+ "is_subcontracted": "No",
+ "naming_series": "_T-Purchase Order-",
+ "net_total": 5000.0,
+ "po_details": [
+ {
+ "base_amount": 5000.0,
+ "conversion_factor": 1.0,
+ "description": "_Test Item",
+ "doctype": "Purchase Order Item",
+ "item_code": "_Test Item",
+ "item_name": "_Test Item",
+ "parentfield": "po_details",
+ "qty": 10.0,
+ "rate": 500.0,
+ "schedule_date": "2013-03-01",
+ "stock_uom": "_Test UOM",
+ "uom": "_Test UOM",
+ "warehouse": "_Test Warehouse - _TC"
+ }
+ ],
+ "supplier": "_Test Supplier",
+ "supplier_name": "_Test Supplier",
+ "transaction_date": "2013-02-12"
}
-]
\ No newline at end of file
+]
diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json
index ceaeebc..1d21778 100644
--- a/erpnext/buying/doctype/supplier/supplier.json
+++ b/erpnext/buying/doctype/supplier/supplier.json
@@ -186,13 +186,21 @@
],
"icon": "icon-user",
"idx": 1,
- "modified": "2014-08-26 04:55:32.004458",
+ "modified": "2014-09-10 17:53:09.286715",
"modified_by": "Administrator",
"module": "Buying",
"name": "Supplier",
"owner": "Administrator",
"permissions": [
{
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Purchase User"
+ },
+ {
"amend": 0,
"create": 0,
"delete": 0,
@@ -201,7 +209,7 @@
"print": 1,
"read": 1,
"report": 1,
- "role": "Purchase User",
+ "role": "Purchase Manager",
"submit": 0,
"write": 0
},
@@ -225,10 +233,26 @@
"role": "Material User"
},
{
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Material Manager"
+ },
+ {
"apply_user_permissions": 1,
"permlevel": 0,
"read": 1,
"role": "Accounts User"
+ },
+ {
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts Manager"
}
],
"search_fields": "supplier_name,supplier_type",
diff --git a/erpnext/buying/doctype/supplier/test_records.json b/erpnext/buying/doctype/supplier/test_records.json
index a1d1054..dfa5d46 100644
--- a/erpnext/buying/doctype/supplier/test_records.json
+++ b/erpnext/buying/doctype/supplier/test_records.json
@@ -4,5 +4,11 @@
"doctype": "Supplier",
"supplier_name": "_Test Supplier",
"supplier_type": "_Test Supplier Type"
+ },
+ {
+ "company": "_Test Company",
+ "doctype": "Supplier",
+ "supplier_name": "_Test Supplier 1",
+ "supplier_type": "_Test Supplier Type"
}
-]
\ No newline at end of file
+]
diff --git a/erpnext/buying/report/supplier_addresses_and_contacts/supplier_addresses_and_contacts.json b/erpnext/buying/report/supplier_addresses_and_contacts/supplier_addresses_and_contacts.json
index c9fd725..9ae1adc 100644
--- a/erpnext/buying/report/supplier_addresses_and_contacts/supplier_addresses_and_contacts.json
+++ b/erpnext/buying/report/supplier_addresses_and_contacts/supplier_addresses_and_contacts.json
@@ -5,12 +5,12 @@
"doctype": "Report",
"idx": 1,
"is_standard": "Yes",
- "modified": "2014-06-03 07:18:17.358554",
- "modified_by": "Administrator",
+ "modified": "2014-09-11 08:53:17.358554",
+ "modified_by": "Administrator",
"module": "Buying",
"name": "Supplier Addresses and Contacts",
"owner": "Administrator",
- "query": "SELECT\n `tabSupplier`.name as \"Supplier:Link/Supplier:120\",\n\t`tabSupplier`.supplier_name as \"Supplier Name::120\",\n\t`tabSupplier`.supplier_type as \"Supplier Type:Link/Supplier Type:120\",\n\tconcat_ws(', ', \n\t\ttrim(',' from `tabAddress`.address_line1), \n\t\ttrim(',' from tabAddress.address_line2), \n\t\ttabAddress.state, tabAddress.pincode, tabAddress.country\n\t) as 'Address::180',\n concat_ws(', ', `tabContact`.first_name, `tabContact`.last_name) as 'Contact Name::180',\n\t`tabContact`.phone as \"Phone\",\n\t`tabContact`.mobile_no as \"Mobile No\",\n\t`tabContact`.email_id as \"Email Id::120\",\n\t`tabContact`.is_primary_contact as \"Is Primary Contact::120\"\nFROM\n\t`tabSupplier`\n\tleft join `tabAddress` on (\n\t\t`tabAddress`.supplier=`tabSupplier`.name\n\t)\n\tleft join `tabContact` on (\n\t\t`tabContact`.supplier=`tabSupplier`.name\n\t)\nWHERE\n\t`tabSupplier`.docstatus<2\nORDER BY\n\t`tabSupplier`.name asc",
+ "query": "SELECT\n `tabSupplier`.name as \"Supplier:Link/Supplier:120\",\n\t`tabSupplier`.supplier_name as \"Supplier Name::120\",\n\t`tabSupplier`.supplier_type as \"Supplier Type:Link/Supplier Type:120\",\n\tconcat_ws(', ', \n\t\ttrim(',' from `tabAddress`.address_line1), \n\t\ttrim(',' from tabAddress.address_line2), \n\t\ttabAddress.state, tabAddress.pincode, tabAddress.country\n\t) as 'Address::180',\n concat_ws(', ', `tabContact`.first_name, `tabContact`.last_name) as \"Contact Name::180\",\n\t`tabContact`.phone as \"Phone\",\n\t`tabContact`.mobile_no as \"Mobile No\",\n\t`tabContact`.email_id as \"Email Id::120\",\n\t`tabContact`.is_primary_contact as \"Is Primary Contact::120\"\nFROM\n\t`tabSupplier`\n\tleft join `tabAddress` on (\n\t\t`tabAddress`.supplier=`tabSupplier`.name\n\t)\n\tleft join `tabContact` on (\n\t\t`tabContact`.supplier=`tabSupplier`.name\n\t)\nWHERE\n\t`tabSupplier`.docstatus<2\nORDER BY\n\t`tabSupplier`.name asc",
"ref_doctype": "Supplier",
"report_name": "Supplier Addresses and Contacts",
"report_type": "Query Report"
diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py
index 646d596..27a0725 100644
--- a/erpnext/config/accounts.py
+++ b/erpnext/config/accounts.py
@@ -61,6 +61,11 @@
"name": "Period Closing Voucher",
"description": _("Close Balance Sheet and book Profit or Loss.")
},
+ {
+ "type": "doctype",
+ "name": "Payment Tool",
+ "description": _("Create Payment Entries against Orders or Invoices.")
+ },
]
},
{
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 4af9f5e..7fa81c9 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -363,9 +363,10 @@
and ifnull(allocated_amount, 0) = 0""" % (childtype, '%s', '%s'), (parentfield, self.name))
def get_advances(self, account_head, child_doctype, parentfield, dr_or_cr):
+ against_order_list = []
res = frappe.db.sql("""
select
- t1.name as jv_no, t1.remark, t2.%s as amount, t2.name as jv_detail_no
+ t1.name as jv_no, t1.remark, t2.%s as amount, t2.name as jv_detail_no, t2.%s as order_no
from
`tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
where
@@ -374,18 +375,25 @@
and ifnull(t2.against_invoice, '') = ''
and ifnull(t2.against_jv, '') = ''
order by t1.posting_date""" %
- (dr_or_cr, '%s'), account_head, as_dict=1)
+ (dr_or_cr, "against_sales_order" if dr_or_cr == "credit" \
+ else "against_purchase_order", '%s'),
+ account_head, as_dict= True)
+
+ if self.get("entries"):
+ for i in self.get("entries"):
+ against_order_list.append(i.sales_order if dr_or_cr == "credit" else i.purchase_order)
self.set(parentfield, [])
for d in res:
- self.append(parentfield, {
- "doctype": child_doctype,
- "journal_voucher": d.jv_no,
- "jv_detail_no": d.jv_detail_no,
- "remarks": d.remark,
- "advance_amount": flt(d.amount),
- "allocate_amount": 0
- })
+ if not against_order_list or d.order_no in against_order_list:
+ self.append(parentfield, {
+ "doctype": child_doctype,
+ "journal_voucher": d.jv_no,
+ "jv_detail_no": d.jv_detail_no,
+ "remarks": d.remark,
+ "advance_amount": flt(d.amount),
+ "allocate_amount": 0
+ })
def validate_multiple_billing(self, ref_dt, item_ref_dn, based_on, parentfield):
from erpnext.controllers.status_updater import get_tolerance_for
@@ -430,6 +438,32 @@
return stock_items
+ def set_total_advance_paid(self):
+ if self.doctype == "Sales Order":
+ dr_or_cr = "credit"
+ against_field = "against_sales_order"
+ else:
+ dr_or_cr = "debit"
+ against_field = "against_purchase_order"
+
+ advance_paid = frappe.db.sql("""
+ select
+ sum(ifnull({dr_or_cr}, 0))
+ from
+ `tabJournal Voucher Detail`
+ where
+ {against_field} = %s and docstatus = 1 and is_advance = "Yes" """.format(dr_or_cr=dr_or_cr, \
+ against_field=against_field), self.name)
+
+ if advance_paid:
+ advance_paid = flt(advance_paid[0][0], self.precision("advance_paid"))
+ if flt(self.grand_total) >= advance_paid:
+ frappe.db.set_value(self.doctype, self.name, "advance_paid", advance_paid)
+ else:
+ frappe.throw(_("Total advance ({0}) against Order {1} cannot be greater \
+ than the Grand Total ({2})")
+ .format(advance_paid, self.name, self.grand_total))
+
@property
def company_abbr(self):
if not hasattr(self, "_abbr"):
diff --git a/erpnext/controllers/trends.py b/erpnext/controllers/trends.py
index e62b661..c2d5e00 100644
--- a/erpnext/controllers/trends.py
+++ b/erpnext/controllers/trends.py
@@ -16,10 +16,10 @@
# get conditions for grouping filter cond
group_by_cols = group_wise_column(filters.get("group_by"))
- columns = based_on_details["based_on_cols"] + period_cols + ["Total(Qty):Float:120", "Total(Amt):Currency:120"]
+ columns = based_on_details["based_on_cols"] + period_cols + [_("Total(Qty)") + ":Float:120", _("Total(Amt)") + ":Currency:120"]
if group_by_cols:
columns = based_on_details["based_on_cols"] + group_by_cols + period_cols + \
- ["Total(Qty):Float:120", "Total(Amt):Currency:120"]
+ [_("Total(Qty)") + ":Float:120", _("Total(Amt)") + ":Currency:120"]
conditions = {"based_on_select": based_on_details["based_on_select"], "period_wise_select": period_select,
"columns": columns, "group_by": based_on_details["based_on_group_by"], "grbc": group_by_cols, "trans": trans,
@@ -130,8 +130,8 @@
get_period_wise_columns(dt, filters.get("period"), pwc)
query_details = get_period_wise_query(dt, trans_date, query_details)
else:
- pwc = [filters.get("fiscal_year") + " (Qty):Float:120",
- filters.get("fiscal_year") + " (Amt):Currency:120"]
+ pwc = [_(filters.get("fiscal_year")) + " ("+_("Qty") + "):Float:120",
+ _(filters.get("fiscal_year")) + " ("+ _("Amt") + "):Currency:120"]
query_details = " SUM(t2.qty), SUM(t2.base_amount),"
query_details += 'SUM(t2.qty), SUM(t2.base_amount)'
@@ -139,11 +139,11 @@
def get_period_wise_columns(bet_dates, period, pwc):
if period == 'Monthly':
- pwc += [get_mon(bet_dates[0]) + " (Qty):Float:120",
- get_mon(bet_dates[0]) + " (Amt):Currency:120"]
+ pwc += [_(get_mon(bet_dates[0])) + " (" + _("Qty") + "):Float:120",
+ _(get_mon(bet_dates[0])) + " (" + _("Amt") + "):Currency:120"]
else:
- pwc += [get_mon(bet_dates[0]) + "-" + get_mon(bet_dates[1]) + " (Qty):Float:120",
- get_mon(bet_dates[0]) + "-" + get_mon(bet_dates[1]) + " (Amt):Currency:120"]
+ pwc += [_(get_mon(bet_dates[0])) + "-" + _(get_mon(bet_dates[1])) + " (" + _("Qty") + "):Float:120",
+ _(get_mon(bet_dates[0])) + "-" + _(get_mon(bet_dates[1])) + " (" + _("Amt") + "):Currency:120"]
def get_period_wise_query(bet_dates, trans_date, query_details):
query_details += """SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.qty, NULL)),
diff --git a/erpnext/home/page/activity/activity.js b/erpnext/home/page/activity/activity.js
index ac44b4d..f50f6c8 100644
--- a/erpnext/home/page/activity/activity.js
+++ b/erpnext/home/page/activity/activity.js
@@ -20,7 +20,7 @@
});
list.run();
- wrapper.appframe.set_title_right("Refresh", function() { list.run(); });
+ wrapper.appframe.set_title_right(__("Refresh"), function() { list.run(); });
// Build Report Button
if(frappe.boot.user.can_get_report.indexOf("Feed")!=-1) {
diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py
index 5d4beaf..fa2594b 100644
--- a/erpnext/hr/doctype/employee/employee.py
+++ b/erpnext/hr/doctype/employee/employee.py
@@ -200,7 +200,7 @@
# called via User hook
if "Employee" in [d.role for d in doc.get("user_roles")]:
if not frappe.db.get_value("Employee", {"user_id": doc.name}):
- frappe.msgprint("Please set User ID field in an Employee record to set Employee Role")
+ frappe.msgprint(_("Please set User ID field in an Employee record to set Employee Role"))
doc.get("user_roles").remove(doc.get("user_roles", {"role": "Employee"})[0])
def update_user_permissions(doc, method):
diff --git a/erpnext/hr/report/employee_birthday/employee_birthday.py b/erpnext/hr/report/employee_birthday/employee_birthday.py
index dfa6499..4ca97ce 100644
--- a/erpnext/hr/report/employee_birthday/employee_birthday.py
+++ b/erpnext/hr/report/employee_birthday/employee_birthday.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
from frappe.utils import flt
def execute(filters=None):
@@ -15,9 +16,9 @@
def get_columns():
return [
- "Employee:Link/Employee:120", "Name:Data:200", "Date of Birth:Date:100",
- "Branch:Link/Branch:120", "Department:Link/Department:120",
- "Designation:Link/Designation:120", "Gender::60", "Company:Link/Company:120"
+ _("Employee") + ":Link/Employee:120", _("Name") + ":Data:200", _("Date of Birth")+ ":Date:100",
+ _("Branch") + ":Link/Branch:120", _("Department") + ":Link/Department:120",
+ _("Designation") + ":Link/Designation:120", _("Gender") + "::60", _("Company") + ":Link/Company:120"
]
def get_employees(filters):
diff --git a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
index 62d819a..4b92848 100644
--- a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
+++ b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
@@ -39,13 +39,13 @@
','.join(['%s']*len(employee_names)), employee_names, as_dict=True)
columns = [
- "Fiscal Year", "Employee:Link/Employee:150", "Employee Name::200", "Department::150"
+ _("Fiscal Year"), _("Employee") + ":Link/Employee:150", _("Employee Name") + "::200", _("Department") +"::150"
]
for leave_type in leave_types:
- columns.append(leave_type + " Allocated:Float")
- columns.append(leave_type + " Taken:Float")
- columns.append(leave_type + " Balance:Float")
+ columns.append(_(leave_type) + " " + _("Allocated") + ":Float")
+ columns.append(_(leave_type) + " " + _("Taken") + ":Float")
+ columns.append(_(leave_type) + " " + _("Balance") + ":Float")
data = {}
for d in allocations:
diff --git a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
index bf15f88..ee113bf 100644
--- a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
+++ b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
@@ -45,15 +45,15 @@
def get_columns(filters):
columns = [
- "Employee:Link/Employee:120", "Employee Name::140", "Branch:Link/Branch:120",
- "Department:Link/Department:120", "Designation:Link/Designation:120",
- "Company:Link/Company:120"
+ _("Employee") + ":Link/Employee:120", _("Employee Name") + "::140", _("Branch")+ ":Link/Branch:120",
+ _("Department") + ":Link/Department:120", _("Designation") + ":Link/Designation:120",
+ _("Company") + ":Link/Company:120"
]
for day in range(filters["total_days_in_month"]):
columns.append(cstr(day+1) +"::20")
- columns += ["Total Present:Float:80", "Total Absent:Float:80"]
+ columns += [_("Total Present") + ":Float:80", _("Total Absent") + ":Float:80"]
return columns
def get_attendance_list(conditions, filters):
diff --git a/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py b/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py
index 4fc28e5..537c498 100644
--- a/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py
+++ b/erpnext/hr/report/monthly_salary_register/monthly_salary_register.py
@@ -36,10 +36,10 @@
def get_columns(salary_slips):
columns = [
- "Employee:Link/Employee:120", "Employee Name::140", "Branch:Link/Branch:120",
- "Department:Link/Department:120", "Designation:Link/Designation:120",
- "Company:Link/Company:120", "Month::80", "Leave Without pay:Float:130",
- "Payment Days:Float:120"
+ _("Employee") + ":Link/Employee:120", _("Employee Name") + "::140", _("Branch") + ":Link/Branch:120",
+ _("Department") + ":Link/Department:120", _("Designation") + ":Link/Designation:120",
+ _("Company") + ":Link/Company:120", _("Month") + "::80", _("Leave Without Pay") + ":Float:130",
+ _("Payment Days") + ":Float:120"
]
earning_types = frappe.db.sql_list("""select distinct e_type from `tabSalary Slip Earning`
diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js
index 7787ea4..cb96478 100644
--- a/erpnext/manufacturing/doctype/bom/bom.js
+++ b/erpnext/manufacturing/doctype/bom/bom.js
@@ -66,7 +66,10 @@
frappe.model.with_doc("Workstation", d.workstation, function(name, r) {
d.hour_rate = r.docs[0].hour_rate;
refresh_field("hour_rate", dn, "bom_operations");
+ d.fixed_cycle_cost = r.docs[0].fixed_cycle_cost;
+ refresh_field("fixed_cycle_cost", dn, "bom_operations");
erpnext.bom.calculate_op_cost(doc);
+ erpnext.bom.calculate_fixed_cost(doc);
erpnext.bom.calculate_total(doc);
});
}
@@ -74,6 +77,7 @@
cur_frm.cscript.hour_rate = function(doc, dt, dn) {
erpnext.bom.calculate_op_cost(doc);
+ erpnext.bom.calculate_fixed_cost(doc);
erpnext.bom.calculate_total(doc);
}
@@ -116,7 +120,6 @@
}
}
-
cur_frm.cscript.qty = function(doc, cdt, cdn) {
erpnext.bom.calculate_rm_cost(doc);
erpnext.bom.calculate_total(doc);
@@ -145,6 +148,15 @@
refresh_field('operating_cost');
}
+erpnext.bom.calculate_fixed_cost = function(doc) {
+ var op = doc.bom_operations || [];
+ var total_fixed_cost = 0;
+ for(var i=0;i<op.length;i++) {
+ total_fixed_cost += flt(op[i].fixed_cycle_cost);
+ }
+ cur_frm.set_value("total_fixed_cost", total_fixed_cost);
+}
+
erpnext.bom.calculate_rm_cost = function(doc) {
var rm = doc.bom_materials || [];
total_rm_cost = 0;
@@ -155,14 +167,15 @@
{'qty_consumed_per_unit': flt(rm[i].qty)/flt(doc.quantity)}, 'bom_materials');
total_rm_cost += amt;
}
- doc.raw_material_cost = total_rm_cost;
- refresh_field('raw_material_cost');
+ cur_frm.set_value("raw_material_cost", total_rm_cost);
}
// Calculate Total Cost
erpnext.bom.calculate_total = function(doc) {
- doc.total_cost = flt(doc.raw_material_cost) + flt(doc.operating_cost);
+ doc.total_variable_cost = flt(doc.raw_material_cost) + flt(doc.operating_cost) ;
+ refresh_field('total_variable_cost');
+ doc.total_cost = flt(doc.total_fixed_cost) + flt(doc.total_variable_cost);
refresh_field('total_cost');
}
@@ -204,5 +217,7 @@
cur_frm.cscript.validate = function(doc, dt, dn) {
erpnext.bom.calculate_op_cost(doc);
erpnext.bom.calculate_rm_cost(doc);
+ erpnext.bom.calculate_fixed_cost(doc);
erpnext.bom.calculate_total(doc);
}
+
diff --git a/erpnext/manufacturing/doctype/bom/bom.json b/erpnext/manufacturing/doctype/bom/bom.json
index 7015c3f..89f77f2 100644
--- a/erpnext/manufacturing/doctype/bom/bom.json
+++ b/erpnext/manufacturing/doctype/bom/bom.json
@@ -1,5 +1,6 @@
{
- "allow_copy": 0,
+ "allow_attach": 0,
+ "allow_copy": 0,
"allow_import": 1,
"allow_rename": 0,
"creation": "2013-01-22 15:11:38",
@@ -86,6 +87,7 @@
{
"fieldname": "bom_operations",
"fieldtype": "Table",
+ "in_list_view": 0,
"label": "BOM Operations",
"oldfieldname": "bom_operations",
"oldfieldtype": "Table",
@@ -116,19 +118,6 @@
"permlevel": 0
},
{
- "fieldname": "total_cost",
- "fieldtype": "Float",
- "in_list_view": 1,
- "label": "Total Cost",
- "permlevel": 0,
- "read_only": 1
- },
- {
- "fieldname": "cb1",
- "fieldtype": "Column Break",
- "permlevel": 0
- },
- {
"fieldname": "raw_material_cost",
"fieldtype": "Float",
"label": "Total Raw Material Cost",
@@ -143,6 +132,33 @@
"read_only": 1
},
{
+ "fieldname": "cb1",
+ "fieldtype": "Column Break",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "total_variable_cost",
+ "fieldtype": "Float",
+ "in_list_view": 1,
+ "label": "Total Variable Cost",
+ "permlevel": 0,
+ "read_only": 1
+ },
+ {
+ "fieldname": "total_fixed_cost",
+ "fieldtype": "Float",
+ "label": "Total Fixed Cost",
+ "permlevel": 0,
+ "read_only": 1
+ },
+ {
+ "fieldname": "total_cost",
+ "fieldtype": "Float",
+ "label": "Total Cost",
+ "permlevel": 0,
+ "read_only": 1
+ },
+ {
"fieldname": "more_info_section",
"fieldtype": "Section Break",
"label": "More Info",
@@ -232,7 +248,7 @@
"is_submittable": 1,
"issingle": 0,
"istable": 0,
- "modified": "2014-05-27 03:49:08.024523",
+ "modified": "2014-09-08 16:30:46.265762",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM",
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 5fa2cc7..75c4ffb 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -127,7 +127,7 @@
self.save()
def get_bom_unitcost(self, bom_no):
- bom = frappe.db.sql("""select name, total_cost/quantity as unit_cost from `tabBOM`
+ bom = frappe.db.sql("""select name, total_variable_cost/quantity as unit_cost from `tabBOM`
where is_active = 1 and name = %s""", bom_no, as_dict=1)
return bom and bom[0]['unit_cost'] or 0
@@ -269,7 +269,8 @@
"""Calculate bom totals"""
self.calculate_op_cost()
self.calculate_rm_cost()
- self.total_cost = self.raw_material_cost + self.operating_cost
+ self.calculate_fixed_cost()
+ self.total_variable_cost = self.raw_material_cost + self.operating_cost
def calculate_op_cost(self):
"""Update workstation rate and calculates totals"""
@@ -282,6 +283,15 @@
total_op_cost += flt(d.operating_cost)
self.operating_cost = total_op_cost
+ def calculate_fixed_cost(self):
+ """Update workstation rate and calculates totals"""
+ fixed_cost = 0
+ for d in self.get('bom_operations'):
+ if d.workstation:
+ fixed_cost += flt(frappe.db.get_value("Workstation", d.workstation, "fixed_cycle_cost"))
+ self.total_fixed_cost = fixed_cost
+
+
def calculate_rm_cost(self):
"""Fetch RM rate as per today's valuation rate and calculate totals"""
total_rm_cost = 0
diff --git a/erpnext/manufacturing/doctype/bom/bom_list.html b/erpnext/manufacturing/doctype/bom/bom_list.html
index 8303f4a..d3632a5 100644
--- a/erpnext/manufacturing/doctype/bom/bom_list.html
+++ b/erpnext/manufacturing/doctype/bom/bom_list.html
@@ -15,6 +15,6 @@
</div>
</div>
<div class="col-xs-2 text-right">
- {%= doc.get_formatted("total_cost") %}
+ {%= doc.get_formatted("total_variable_cost") %}
</div>
</div>
diff --git a/erpnext/manufacturing/doctype/bom/bom_list.js b/erpnext/manufacturing/doctype/bom/bom_list.js
index 71d54a2..085e2dd 100644
--- a/erpnext/manufacturing/doctype/bom/bom_list.js
+++ b/erpnext/manufacturing/doctype/bom/bom_list.js
@@ -1,3 +1,3 @@
frappe.listview_settings['BOM'] = {
- add_fields: ["is_active", "is_default", "total_cost"]
+ add_fields: ["is_active", "is_default", "total_variable_cost"]
};
diff --git a/erpnext/manufacturing/doctype/bom/test_records.json b/erpnext/manufacturing/doctype/bom/test_records.json
index efd26c2..17c28d5 100644
--- a/erpnext/manufacturing/doctype/bom/test_records.json
+++ b/erpnext/manufacturing/doctype/bom/test_records.json
@@ -54,10 +54,20 @@
"is_default": 1,
"item": "_Test FG Item",
"quantity": 1.0
- },
+ },
{
+ "bom_operations": [
+ {
+ "operation_no": "1",
+ "opn_description": "_Test",
+ "workstation": "_Test Workstation 1",
+ "time_in_min": 60,
+ "operating_cost": 100
+ }
+ ],
"bom_materials": [
{
+ "operation_no": 1,
"amount": 5000.0,
"doctype": "BOM Item",
"item_code": "_Test Item",
@@ -67,6 +77,7 @@
"stock_uom": "_Test UOM"
},
{
+ "operation_no": 1,
"amount": 2000.0,
"bom_no": "BOM/_Test Item Home Desktop Manufactured/001",
"doctype": "BOM Item",
@@ -82,6 +93,7 @@
"is_active": 1,
"is_default": 1,
"item": "_Test FG Item 2",
- "quantity": 1.0
+ "quantity": 1.0,
+ "with_operations": 1
}
]
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
index 3bf5862..7720597 100644
--- a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
+++ b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
@@ -1,5 +1,5 @@
{
- "creation": "2013-02-22 01:27:49.000000",
+ "creation": "2013-02-22 01:27:49",
"docstatus": 0,
"doctype": "DocType",
"fields": [
@@ -69,13 +69,21 @@
"oldfieldtype": "Currency",
"permlevel": 0,
"reqd": 0
+ },
+ {
+ "fieldname": "fixed_cycle_cost",
+ "fieldtype": "Float",
+ "in_list_view": 0,
+ "label": "Fixed Cycle Cost",
+ "permlevel": 0
}
],
"idx": 1,
"istable": 1,
- "modified": "2014-02-03 12:53:03.000000",
+ "modified": "2014-09-12 12:03:47.456370",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Operation",
- "owner": "Administrator"
+ "owner": "Administrator",
+ "permissions": []
}
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
index 63030b5..a5b2a53 100644
--- a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
+++ b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
@@ -25,7 +25,7 @@
frappe.throw(_("Current BOM and New BOM can not be same"))
def update_new_bom(self):
- current_bom_unitcost = frappe.db.sql("""select total_cost/quantity
+ current_bom_unitcost = frappe.db.sql("""select total_variable_cost/quantity
from `tabBOM` where name = %s""", self.current_bom)
current_bom_unitcost = current_bom_unitcost and flt(current_bom_unitcost[0][0]) or 0
frappe.db.sql("""update `tabBOM Item` set bom_no=%s,
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.js b/erpnext/manufacturing/doctype/production_order/production_order.js
index a4bf14c..89ef846 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.js
+++ b/erpnext/manufacturing/doctype/production_order/production_order.js
@@ -123,3 +123,5 @@
}
} else msgprint(__("Please enter Production Item first"));
});
+
+cur_frm.add_fetch('bom_no', 'total_fixed_cost', 'total_fixed_cost');
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.json b/erpnext/manufacturing/doctype/production_order/production_order.json
index f5e43b0..8ce29dc 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.json
+++ b/erpnext/manufacturing/doctype/production_order/production_order.json
@@ -102,6 +102,13 @@
"reqd": 1
},
{
+ "depends_on": "production_item",
+ "fieldname": "total_fixed_cost",
+ "fieldtype": "Float",
+ "label": "Total Fixed Cost",
+ "permlevel": 0
+ },
+ {
"depends_on": "eval:doc.docstatus==1",
"description": "Automatically updated via Stock Entry of type Manufacture/Repack",
"fieldname": "produced_qty",
@@ -225,7 +232,7 @@
"idx": 1,
"in_create": 0,
"is_submittable": 1,
- "modified": "2014-06-23 07:55:50.092300",
+ "modified": "2014-09-01 11:45:48.591196",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Production Order",
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index 99a248b..03fdf79 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -24,6 +24,7 @@
self.validate_bom_no()
self.validate_sales_order()
self.validate_warehouse()
+ self.set_fixed_cost()
from erpnext.utilities.transaction_base import validate_uom_is_integer
validate_uom_is_integer(self, "stock_uom", ["qty", "produced_qty"])
@@ -55,6 +56,10 @@
for w in [self.fg_warehouse, self.wip_warehouse]:
validate_warehouse_company(w, self.company)
+ def set_fixed_cost(self):
+ if self.total_fixed_cost==None:
+ self.total_fixed_cost = frappe.db.get_value("BOM", self.bom_no, "total_fixed_cost")
+
def validate_production_order_against_so(self):
# already ordered qty
ordered_qty_against_so = frappe.db.sql("""select sum(qty) from `tabProduction Order`
@@ -156,11 +161,10 @@
return {}
res = res[0]
- bom = frappe.db.sql("""select name from `tabBOM` where item=%s
- and ifnull(is_default, 0)=1""", item)
+ bom = frappe.db.sql("""select name as bom_no,total_fixed_cost from `tabBOM` where item=%s
+ and ifnull(is_default, 0)=1""", item, as_dict=1)
if bom:
- res.bom_no = bom[0][0]
-
+ res.update(bom[0])
return res
@frappe.whitelist()
diff --git a/erpnext/manufacturing/doctype/production_order/test_production_order.py b/erpnext/manufacturing/doctype/production_order/test_production_order.py
index 2736be4..55125cf 100644
--- a/erpnext/manufacturing/doctype/production_order/test_production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/test_production_order.py
@@ -54,5 +54,4 @@
self.assertRaises(StockOverProductionError, s.submit)
-
-test_records = frappe.get_test_records('Production Order')
+test_records = frappe.get_test_records('Production Order')
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index 547ca8b..f0bb937 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -153,7 +153,6 @@
pi.so_pending_qty = flt(p['pending_qty'])
pi.planned_qty = flt(p['pending_qty'])
-
def validate_data(self):
self.validate_company()
for d in self.get('pp_details'):
diff --git a/erpnext/manufacturing/doctype/workstation/test_records.json b/erpnext/manufacturing/doctype/workstation/test_records.json
new file mode 100644
index 0000000..72123eb
--- /dev/null
+++ b/erpnext/manufacturing/doctype/workstation/test_records.json
@@ -0,0 +1,10 @@
+[
+ {
+ "doctype": "Workstation",
+ "name": "_Test Workstation 1",
+ "workstation_name": "_Test Workstation 1",
+ "warehouse": "_Test warehouse - _TC",
+ "fixed_cycle_cost": 1000,
+ "hour_rate":100
+ }
+]
diff --git a/erpnext/manufacturing/doctype/workstation/test_workstation.py b/erpnext/manufacturing/doctype/workstation/test_workstation.py
new file mode 100644
index 0000000..01746eb
--- /dev/null
+++ b/erpnext/manufacturing/doctype/workstation/test_workstation.py
@@ -0,0 +1,12 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and Contributors
+# See license.txt
+
+import frappe
+import unittest
+
+test_dependencies = ["Warehouse"]
+test_records = frappe.get_test_records('Workstation')
+
+
+class TestWorkstation(unittest.TestCase):
+ pass
diff --git a/erpnext/manufacturing/doctype/workstation/workstation.json b/erpnext/manufacturing/doctype/workstation/workstation.json
index 278707e..83ab4a8 100644
--- a/erpnext/manufacturing/doctype/workstation/workstation.json
+++ b/erpnext/manufacturing/doctype/workstation/workstation.json
@@ -62,6 +62,12 @@
"reqd": 0
},
{
+ "fieldname": "fixed_cycle_cost",
+ "fieldtype": "Float",
+ "label": "Fixed Cycle Cost",
+ "permlevel": 0
+ },
+ {
"fieldname": "hour_rate_labour",
"fieldtype": "Float",
"label": "Hour Rate Labour",
@@ -132,7 +138,7 @@
],
"icon": "icon-wrench",
"idx": 1,
- "modified": "2014-05-27 03:49:22.635046",
+ "modified": "2014-08-30 10:59:07.960814",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Workstation",
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 9146336..2f0dd2e 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -80,3 +80,4 @@
erpnext.patches.v4_2.default_website_style
erpnext.patches.v4_2.set_company_country
erpnext.patches.v4_2.update_sales_order_invoice_field_name
+erpnext.patches.v4_2.cost_of_production_cycle
\ No newline at end of file
diff --git a/erpnext/patches/v4_2/cost_of_production_cycle.py b/erpnext/patches/v4_2/cost_of_production_cycle.py
new file mode 100644
index 0000000..26f0fca
--- /dev/null
+++ b/erpnext/patches/v4_2/cost_of_production_cycle.py
@@ -0,0 +1,9 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+ frappe.reload_doc("manufacturing", "doctype", "bom")
+ frappe.db.sql("""update tabBOM set total_variable_cost = total_cost""")
\ No newline at end of file
diff --git a/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.py b/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.py
index 185bcd9..b8f746b 100644
--- a/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.py
+++ b/erpnext/projects/report/daily_time_log_summary/daily_time_log_summary.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
from frappe.utils import flt
def execute(filters=None):
@@ -12,9 +13,9 @@
filters["from_time"] = "00:00:00"
filters["to_time"] = "24:00:00"
- columns = ["Time Log:Link/Time Log:120", "Employee::150", "From Datetime::140",
- "To Datetime::140", "Hours::70", "Activity Type::120", "Task:Link/Task:150",
- "Task Subject::180", "Project:Link/Project:120", "Status::70"]
+ columns = [_("Time Log") + ":Link/Time Log:120", _("Employee") + "::150", _("From Datetime") + "::140",
+ _("To Datetime") + "::140", _("Hours") + "::70", _("Activity Type") + "::120", _("Task") + ":Link/Task:150",
+ _("Task Subject") + "::180", _("Project") + ":Link/Project:120", _("Status") + "::70"]
user_map = get_user_map()
task_map = get_task_map()
diff --git a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
index daed4ab..69c1bbb 100644
--- a/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
+++ b/erpnext/projects/report/project_wise_stock_tracking/project_wise_stock_tracking.py
@@ -1,7 +1,8 @@
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
-import frappe
+import frappe
+from frappe import _
def execute(filters=None):
columns = get_columns()
@@ -21,11 +22,11 @@
return columns, data
def get_columns():
- return ["Project Id:Link/Project:140", "Cost of Purchased Items:Currency:160",
- "Cost of Issued Items:Currency:160", "Cost of Delivered Items:Currency:160",
- "Project Name::120", "Project Status::120", "Company:Link/Company:100",
- "Customer:Link/Customer:140", "Project Value:Currency:120",
- "Project Start Date:Date:120", "Completion Date:Date:120"]
+ return [_("Project Id") + ":Link/Project:140", _("Cost of Purchased Items") + ":Currency:160",
+ _("Cost of Issued Items") + ":Currency:160", _("Cost of Delivered Items") + ":Currency:160",
+ _("Project Name") + "::120", _("Project Status") + "::120", _("Company") + ":Link/Company:100",
+ _("Customer") + ":Link/Customer:140", _("Project Value") + ":Currency:120",
+ _("Project Start Date") + ":Date:120", _("Completion Date") + ":Date:120"]+
def get_project_details():
return frappe.db.sql(""" select name, project_name, status, company, customer, project_value,
diff --git a/erpnext/public/js/purchase_trends_filters.js b/erpnext/public/js/purchase_trends_filters.js
index d60b915..cab8bbf 100644
--- a/erpnext/public/js/purchase_trends_filters.js
+++ b/erpnext/public/js/purchase_trends_filters.js
@@ -7,21 +7,36 @@
"fieldname":"period",
"label": __("Period"),
"fieldtype": "Select",
- "options": ["Monthly", "Quarterly", "Half-Yearly", "Yearly"].join("\n"),
+ "options": [
+ { "value": "Monthly", "label": __("Monthly") },
+ { "value": "Quarterly", "label": __("Quarterly") },
+ { "value": "Half-Yearly", "label": __("Half-Yearly") },
+ { "value": "Yearly", "label": __("Yearly") }
+ ],
"default": "Monthly"
},
{
"fieldname":"based_on",
"label": __("Based On"),
"fieldtype": "Select",
- "options": ["Item", "Item Group", "Supplier", "Supplier Type", "Project"].join("\n"),
+ "options": [
+ { "value": "Item", "label": __("Item") },
+ { "value": "Item Group", "label": __("Item Group") },
+ { "value": "Supplier", "label": __("Supplier") },
+ { "value": "Supplier Type", "label": __("Supplier Type") },
+ { "value": "Supplier Type", "label": __("Project") }
+ ],
"default": "Item"
},
{
"fieldname":"group_by",
"label": __("Group By"),
"fieldtype": "Select",
- "options": ["", "Item", "Supplier"].join("\n"),
+ "options": [
+ "",
+ { "value": "Item", "label": __("Item") },
+ { "value": "Supplier", "label": __("Supplier") }
+ ],
"default": ""
},
{
diff --git a/erpnext/public/js/sales_trends_filters.js b/erpnext/public/js/sales_trends_filters.js
index 89c269e..46070b4 100644
--- a/erpnext/public/js/sales_trends_filters.js
+++ b/erpnext/public/js/sales_trends_filters.js
@@ -7,21 +7,37 @@
"fieldname":"period",
"label": __("Period"),
"fieldtype": "Select",
- "options": ["Monthly", "Quarterly", "Half-Yearly", "Yearly"].join("\n"),
+ "options": [
+ { "value": "Monthly", "label": __("Monthly") },
+ { "value": "Quarterly", "label": __("Quarterly") },
+ { "value": "Half-Yearly", "label": __("Half-Yearly") },
+ { "value": "Yearly", "label": __("Yearly") }
+ ],
"default": "Monthly"
},
{
"fieldname":"based_on",
"label": __("Based On"),
"fieldtype": "Select",
- "options": ["Item", "Item Group", "Customer", "Customer Group", "Territory", "Project"].join("\n"),
+ "options": [
+ { "value": "Item", "label": __("Item") },
+ { "value": "Item Group", "label": __("Item Group") },
+ { "value": "Customer", "label": __("Customer") },
+ { "value": "Customer Group", "label": __("Customer Group") },
+ { "value": "Territory", "label": __("Territory") },
+ { "value": "Supplier Type", "label": __("Project") }
+ ],
"default": "Item"
},
{
"fieldname":"group_by",
"label": __("Group By"),
"fieldtype": "Select",
- "options": ["", "Item", "Customer"].join("\n"),
+ "options": [
+ "",
+ { "value": "Item", "label": __("Item") },
+ { "value": "Customer", "label": __("Customer") }
+ ],
"default": ""
},
{
diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json
index ef71d56..47286de 100644
--- a/erpnext/selling/doctype/customer/customer.json
+++ b/erpnext/selling/doctype/customer/customer.json
@@ -282,7 +282,7 @@
],
"icon": "icon-user",
"idx": 1,
- "modified": "2014-08-07 06:57:25.248707",
+ "modified": "2014-09-10 16:41:07.553182",
"modified_by": "Administrator",
"module": "Selling",
"name": "Customer",
@@ -310,6 +310,14 @@
"role": "Sales User"
},
{
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Sales Manager"
+ },
+ {
"amend": 0,
"create": 1,
"delete": 1,
@@ -330,6 +338,38 @@
"read": 1,
"role": "Sales Master Manager",
"write": 1
+ },
+ {
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Material User"
+ },
+ {
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Material Manager"
+ },
+ {
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts User"
+ },
+ {
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Accounts Manager"
}
],
"search_fields": "customer_name,customer_group,territory",
diff --git a/erpnext/selling/doctype/customer/test_records.json b/erpnext/selling/doctype/customer/test_records.json
index 6bac543..e076f7a 100644
--- a/erpnext/selling/doctype/customer/test_records.json
+++ b/erpnext/selling/doctype/customer/test_records.json
@@ -22,5 +22,13 @@
"customer_type": "Individual",
"doctype": "Customer",
"territory": "_Test Territory"
+ },
+ {
+ "company": "_Test Company",
+ "customer_group": "_Test Customer Group",
+ "customer_name": "_Test Customer 3",
+ "customer_type": "Individual",
+ "doctype": "Customer",
+ "territory": "_Test Territory"
}
]
diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json
index 7ddfd3a..844e8cd 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.json
+++ b/erpnext/selling/doctype/sales_order/sales_order.json
@@ -1,1114 +1,1122 @@
{
- "allow_import": 1,
- "autoname": "naming_series:",
- "creation": "2013-06-18 12:39:59",
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Transaction",
+ "allow_import": 1,
+ "autoname": "naming_series:",
+ "creation": "2013-06-18 12:39:59",
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "Transaction",
"fields": [
{
- "fieldname": "customer_section",
- "fieldtype": "Section Break",
- "label": "Customer",
- "options": "icon-user",
+ "fieldname": "customer_section",
+ "fieldtype": "Section Break",
+ "label": "Customer",
+ "options": "icon-user",
"permlevel": 0
- },
+ },
{
- "fieldname": "column_break0",
- "fieldtype": "Column Break",
- "in_filter": 0,
- "oldfieldtype": "Column Break",
- "permlevel": 0,
- "search_index": 0,
+ "fieldname": "column_break0",
+ "fieldtype": "Column Break",
+ "in_filter": 0,
+ "oldfieldtype": "Column Break",
+ "permlevel": 0,
+ "search_index": 0,
"width": "50%"
- },
+ },
{
- "fieldname": "naming_series",
- "fieldtype": "Select",
- "label": "Series",
- "no_copy": 1,
- "oldfieldname": "naming_series",
- "oldfieldtype": "Select",
- "options": "SO-",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "naming_series",
+ "fieldtype": "Select",
+ "label": "Series",
+ "no_copy": 1,
+ "oldfieldname": "naming_series",
+ "oldfieldtype": "Select",
+ "options": "SO-",
+ "permlevel": 0,
+ "print_hide": 1,
"reqd": 1
- },
+ },
{
- "fieldname": "customer",
- "fieldtype": "Link",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "Customer",
- "oldfieldname": "customer",
- "oldfieldtype": "Link",
- "options": "Customer",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
+ "fieldname": "customer",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "Customer",
+ "oldfieldname": "customer",
+ "oldfieldtype": "Link",
+ "options": "Customer",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
"search_index": 1
- },
+ },
{
- "fieldname": "customer_name",
- "fieldtype": "Data",
- "hidden": 0,
- "label": "Name",
- "permlevel": 0,
+ "fieldname": "customer_name",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "label": "Name",
+ "permlevel": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "address_display",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Address",
- "permlevel": 0,
+ "fieldname": "address_display",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Address",
+ "permlevel": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "contact_display",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Contact",
- "permlevel": 0,
+ "fieldname": "contact_display",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Contact",
+ "permlevel": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "contact_mobile",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Mobile No",
- "permlevel": 0,
+ "fieldname": "contact_mobile",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Mobile No",
+ "permlevel": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "contact_email",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Contact Email",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "contact_email",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Contact Email",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "default": "Sales",
- "fieldname": "order_type",
- "fieldtype": "Select",
- "in_list_view": 1,
- "label": "Order Type",
- "oldfieldname": "order_type",
- "oldfieldtype": "Select",
- "options": "\nSales\nMaintenance\nShopping Cart",
- "permlevel": 0,
- "print_hide": 1,
+ "default": "Sales",
+ "fieldname": "order_type",
+ "fieldtype": "Select",
+ "in_list_view": 1,
+ "label": "Order Type",
+ "oldfieldname": "order_type",
+ "oldfieldtype": "Select",
+ "options": "\nSales\nMaintenance\nShopping Cart",
+ "permlevel": 0,
+ "print_hide": 1,
"reqd": 1
- },
+ },
{
- "fieldname": "column_break1",
- "fieldtype": "Column Break",
- "oldfieldtype": "Column Break",
- "permlevel": 0,
+ "fieldname": "column_break1",
+ "fieldtype": "Column Break",
+ "oldfieldtype": "Column Break",
+ "permlevel": 0,
"width": "50%"
- },
+ },
{
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "hidden": 1,
- "ignore_user_permissions": 1,
- "label": "Amended From",
- "no_copy": 1,
- "oldfieldname": "amended_from",
- "oldfieldtype": "Data",
- "options": "Sales Order",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "fieldname": "amended_from",
+ "fieldtype": "Link",
+ "hidden": 1,
+ "ignore_user_permissions": 1,
+ "label": "Amended From",
+ "no_copy": 1,
+ "oldfieldname": "amended_from",
+ "oldfieldtype": "Data",
+ "options": "Sales Order",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"width": "150px"
- },
+ },
{
- "description": "Select the relevant company name if you have multiple companies.",
- "fieldname": "company",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Company",
- "oldfieldname": "company",
- "oldfieldtype": "Link",
- "options": "Company",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
- "search_index": 1,
+ "description": "Select the relevant company name if you have multiple companies.",
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Company",
+ "oldfieldname": "company",
+ "oldfieldtype": "Link",
+ "options": "Company",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
+ "search_index": 1,
"width": "150px"
- },
+ },
{
- "default": "Today",
- "fieldname": "transaction_date",
- "fieldtype": "Date",
- "in_filter": 1,
- "label": "Date",
- "no_copy": 1,
- "oldfieldname": "transaction_date",
- "oldfieldtype": "Date",
- "permlevel": 0,
- "print_hide": 0,
- "reqd": 1,
- "search_index": 1,
+ "default": "Today",
+ "fieldname": "transaction_date",
+ "fieldtype": "Date",
+ "in_filter": 1,
+ "label": "Date",
+ "no_copy": 1,
+ "oldfieldname": "transaction_date",
+ "oldfieldtype": "Date",
+ "permlevel": 0,
+ "print_hide": 0,
+ "reqd": 1,
+ "search_index": 1,
"width": "160px"
- },
+ },
{
- "depends_on": "eval:doc.order_type == 'Sales'",
- "fieldname": "delivery_date",
- "fieldtype": "Date",
- "hidden": 0,
- "in_filter": 1,
- "label": "Delivery Date",
- "oldfieldname": "delivery_date",
- "oldfieldtype": "Date",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 0,
- "search_index": 1,
+ "depends_on": "eval:doc.order_type == 'Sales'",
+ "fieldname": "delivery_date",
+ "fieldtype": "Date",
+ "hidden": 0,
+ "in_filter": 1,
+ "label": "Delivery Date",
+ "oldfieldname": "delivery_date",
+ "oldfieldtype": "Date",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 0,
+ "search_index": 1,
"width": "160px"
- },
+ },
{
- "allow_on_submit": 1,
- "description": "Start date of current order's period",
- "fieldname": "from_date",
- "fieldtype": "Date",
- "label": "From",
- "no_copy": 1,
+ "allow_on_submit": 1,
+ "description": "Start date of current order's period",
+ "fieldname": "from_date",
+ "fieldtype": "Date",
+ "label": "From",
+ "no_copy": 1,
"permlevel": 0
- },
+ },
{
- "allow_on_submit": 1,
- "description": "End date of current order's period",
- "fieldname": "to_date",
- "fieldtype": "Date",
- "label": "To",
- "no_copy": 1,
+ "allow_on_submit": 1,
+ "description": "End date of current order's period",
+ "fieldname": "to_date",
+ "fieldtype": "Date",
+ "label": "To",
+ "no_copy": 1,
"permlevel": 0
- },
+ },
{
- "description": "Customer's Purchase Order Number",
- "fieldname": "po_no",
- "fieldtype": "Data",
- "hidden": 0,
- "label": "PO No",
- "oldfieldname": "po_no",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 0,
- "reqd": 0,
+ "description": "Customer's Purchase Order Number",
+ "fieldname": "po_no",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "label": "PO No",
+ "oldfieldname": "po_no",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 0,
+ "reqd": 0,
"width": "100px"
- },
+ },
{
- "depends_on": "eval:doc.po_no",
- "description": "Customer's Purchase Order Date",
- "fieldname": "po_date",
- "fieldtype": "Date",
- "hidden": 0,
- "label": "PO Date",
- "oldfieldname": "po_date",
- "oldfieldtype": "Date",
- "permlevel": 0,
- "print_hide": 0,
- "reqd": 0,
+ "depends_on": "eval:doc.po_no",
+ "description": "Customer's Purchase Order Date",
+ "fieldname": "po_date",
+ "fieldtype": "Date",
+ "hidden": 0,
+ "label": "PO Date",
+ "oldfieldname": "po_date",
+ "oldfieldtype": "Date",
+ "permlevel": 0,
+ "print_hide": 0,
+ "reqd": 0,
"width": "100px"
- },
+ },
{
- "fieldname": "shipping_address_name",
- "fieldtype": "Link",
- "hidden": 1,
- "in_filter": 1,
- "label": "Shipping Address",
- "options": "Address",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "shipping_address_name",
+ "fieldtype": "Link",
+ "hidden": 1,
+ "in_filter": 1,
+ "label": "Shipping Address",
+ "options": "Address",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 0
- },
+ },
{
- "fieldname": "shipping_address",
- "fieldtype": "Small Text",
- "hidden": 1,
- "in_filter": 0,
- "label": "Shipping Address",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "shipping_address",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "in_filter": 0,
+ "label": "Shipping Address",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "sec_break45",
- "fieldtype": "Section Break",
- "label": "Currency and Price List",
- "options": "icon-tag",
- "permlevel": 0,
+ "fieldname": "sec_break45",
+ "fieldtype": "Section Break",
+ "label": "Currency and Price List",
+ "options": "icon-tag",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "currency",
- "fieldtype": "Link",
- "label": "Currency",
- "oldfieldname": "currency",
- "oldfieldtype": "Select",
- "options": "Currency",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
+ "fieldname": "currency",
+ "fieldtype": "Link",
+ "label": "Currency",
+ "oldfieldname": "currency",
+ "oldfieldtype": "Select",
+ "options": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
"width": "100px"
- },
+ },
{
- "description": "Rate at which customer's currency is converted to company's base currency",
- "fieldname": "conversion_rate",
- "fieldtype": "Float",
- "label": "Exchange Rate",
- "oldfieldname": "conversion_rate",
- "oldfieldtype": "Currency",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
+ "description": "Rate at which customer's currency is converted to company's base currency",
+ "fieldname": "conversion_rate",
+ "fieldtype": "Float",
+ "label": "Exchange Rate",
+ "oldfieldname": "conversion_rate",
+ "oldfieldtype": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
"width": "100px"
- },
+ },
{
- "fieldname": "column_break2",
- "fieldtype": "Column Break",
- "permlevel": 0,
+ "fieldname": "column_break2",
+ "fieldtype": "Column Break",
+ "permlevel": 0,
"width": "50%"
- },
+ },
{
- "fieldname": "selling_price_list",
- "fieldtype": "Link",
- "label": "Price List",
- "oldfieldname": "price_list_name",
- "oldfieldtype": "Select",
- "options": "Price List",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
+ "fieldname": "selling_price_list",
+ "fieldtype": "Link",
+ "label": "Price List",
+ "oldfieldname": "price_list_name",
+ "oldfieldtype": "Select",
+ "options": "Price List",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
"width": "100px"
- },
+ },
{
- "fieldname": "price_list_currency",
- "fieldtype": "Link",
- "label": "Price List Currency",
- "options": "Currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "fieldname": "price_list_currency",
+ "fieldtype": "Link",
+ "label": "Price List Currency",
+ "options": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"reqd": 1
- },
+ },
{
- "description": "Rate at which Price list currency is converted to company's base currency",
- "fieldname": "plc_conversion_rate",
- "fieldtype": "Float",
- "label": "Price List Exchange Rate",
- "permlevel": 0,
- "print_hide": 1,
+ "description": "Rate at which Price list currency is converted to company's base currency",
+ "fieldname": "plc_conversion_rate",
+ "fieldtype": "Float",
+ "label": "Price List Exchange Rate",
+ "permlevel": 0,
+ "print_hide": 1,
"reqd": 1
- },
+ },
{
- "fieldname": "ignore_pricing_rule",
- "fieldtype": "Check",
- "label": "Ignore Pricing Rule",
- "no_copy": 1,
- "permlevel": 1,
+ "fieldname": "ignore_pricing_rule",
+ "fieldtype": "Check",
+ "label": "Ignore Pricing Rule",
+ "no_copy": 1,
+ "permlevel": 1,
"print_hide": 1
- },
+ },
{
- "fieldname": "items",
- "fieldtype": "Section Break",
- "label": "Items",
- "oldfieldtype": "Section Break",
- "options": "icon-shopping-cart",
+ "fieldname": "items",
+ "fieldtype": "Section Break",
+ "label": "Items",
+ "oldfieldtype": "Section Break",
+ "options": "icon-shopping-cart",
"permlevel": 0
- },
+ },
{
- "allow_on_submit": 1,
- "fieldname": "sales_order_details",
- "fieldtype": "Table",
- "label": "Sales Order Items",
- "oldfieldname": "sales_order_details",
- "oldfieldtype": "Table",
- "options": "Sales Order Item",
- "permlevel": 0,
- "print_hide": 0,
+ "allow_on_submit": 1,
+ "fieldname": "sales_order_details",
+ "fieldtype": "Table",
+ "label": "Sales Order Items",
+ "oldfieldname": "sales_order_details",
+ "oldfieldtype": "Table",
+ "options": "Sales Order Item",
+ "permlevel": 0,
+ "print_hide": 0,
"reqd": 1
- },
+ },
{
- "fieldname": "section_break_31",
- "fieldtype": "Section Break",
+ "fieldname": "section_break_31",
+ "fieldtype": "Section Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "column_break_33a",
- "fieldtype": "Column Break",
+ "fieldname": "column_break_33a",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "column_break_33",
- "fieldtype": "Column Break",
+ "fieldname": "column_break_33",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "net_total_export",
- "fieldtype": "Currency",
- "label": "Net Total",
- "options": "currency",
- "permlevel": 0,
+ "fieldname": "net_total_export",
+ "fieldtype": "Currency",
+ "label": "Net Total",
+ "options": "currency",
+ "permlevel": 0,
"read_only": 1
- },
+ },
{
- "fieldname": "net_total",
- "fieldtype": "Currency",
- "label": "Net Total (Company Currency)",
- "oldfieldname": "net_total",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
- "reqd": 0,
+ "fieldname": "net_total",
+ "fieldtype": "Currency",
+ "label": "Net Total (Company Currency)",
+ "oldfieldname": "net_total",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
+ "reqd": 0,
"width": "150px"
- },
+ },
{
- "fieldname": "taxes",
- "fieldtype": "Section Break",
- "label": "Taxes and Charges",
- "oldfieldtype": "Section Break",
- "options": "icon-money",
- "permlevel": 0,
+ "fieldname": "taxes",
+ "fieldtype": "Section Break",
+ "label": "Taxes and Charges",
+ "oldfieldtype": "Section Break",
+ "options": "icon-money",
+ "permlevel": 0,
"print_hide": 0
- },
+ },
{
- "fieldname": "taxes_and_charges",
- "fieldtype": "Link",
- "label": "Taxes and Charges",
- "oldfieldname": "charge",
- "oldfieldtype": "Link",
- "options": "Sales Taxes and Charges Master",
- "permlevel": 0,
+ "fieldname": "taxes_and_charges",
+ "fieldtype": "Link",
+ "label": "Taxes and Charges",
+ "oldfieldname": "charge",
+ "oldfieldtype": "Link",
+ "options": "Sales Taxes and Charges Master",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "column_break_38",
- "fieldtype": "Column Break",
+ "fieldname": "column_break_38",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "shipping_rule",
- "fieldtype": "Link",
- "label": "Shipping Rule",
- "oldfieldtype": "Button",
- "options": "Shipping Rule",
- "permlevel": 0,
+ "fieldname": "shipping_rule",
+ "fieldtype": "Link",
+ "label": "Shipping Rule",
+ "oldfieldtype": "Button",
+ "options": "Shipping Rule",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "section_break_40",
- "fieldtype": "Section Break",
+ "fieldname": "section_break_40",
+ "fieldtype": "Section Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "other_charges",
- "fieldtype": "Table",
- "label": "Sales Taxes and Charges",
- "oldfieldname": "other_charges",
- "oldfieldtype": "Table",
- "options": "Sales Taxes and Charges",
+ "fieldname": "other_charges",
+ "fieldtype": "Table",
+ "label": "Sales Taxes and Charges",
+ "oldfieldname": "other_charges",
+ "oldfieldtype": "Table",
+ "options": "Sales Taxes and Charges",
"permlevel": 0
- },
+ },
{
- "fieldname": "other_charges_calculation",
- "fieldtype": "HTML",
- "label": "Taxes and Charges Calculation",
- "oldfieldtype": "HTML",
- "permlevel": 0,
+ "fieldname": "other_charges_calculation",
+ "fieldtype": "HTML",
+ "label": "Taxes and Charges Calculation",
+ "oldfieldtype": "HTML",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "section_break_43",
- "fieldtype": "Section Break",
+ "fieldname": "section_break_43",
+ "fieldtype": "Section Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "other_charges_total",
- "fieldtype": "Currency",
- "label": "Taxes and Charges Total (Company Currency)",
- "oldfieldname": "other_charges_total",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
- "width": "150px"
- },
- {
- "fieldname": "column_break_46",
- "fieldtype": "Column Break",
- "permlevel": 0
- },
- {
- "fieldname": "other_charges_total_export",
- "fieldtype": "Currency",
- "label": "Taxes and Charges Total",
- "options": "currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "other_charges_total_export",
+ "fieldtype": "Currency",
+ "label": "Taxes and Charges Total",
+ "options": "currency",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "discount_amount",
- "fieldtype": "Currency",
- "label": "Discount Amount",
- "options": "Company:company:default_currency",
+ "fieldname": "column_break_46",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "totals",
- "fieldtype": "Section Break",
- "label": "Totals",
- "oldfieldtype": "Section Break",
- "options": "icon-money",
- "permlevel": 0,
+ "fieldname": "other_charges_total",
+ "fieldtype": "Currency",
+ "label": "Taxes and Charges Total (Company Currency)",
+ "oldfieldname": "other_charges_total",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
+ "width": "150px"
+ },
+ {
+ "fieldname": "discount_amount",
+ "fieldtype": "Currency",
+ "label": "Discount Amount",
+ "options": "Company:company:default_currency",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "totals",
+ "fieldtype": "Section Break",
+ "label": "Totals",
+ "oldfieldtype": "Section Break",
+ "options": "icon-money",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "grand_total",
- "fieldtype": "Currency",
- "label": "Grand Total (Company Currency)",
- "oldfieldname": "grand_total",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
- "reqd": 0,
+ "fieldname": "grand_total",
+ "fieldtype": "Currency",
+ "label": "Grand Total (Company Currency)",
+ "oldfieldname": "grand_total",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
+ "reqd": 0,
"width": "150px"
- },
+ },
{
- "fieldname": "rounded_total",
- "fieldtype": "Currency",
- "label": "Rounded Total (Company Currency)",
- "oldfieldname": "rounded_total",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "fieldname": "rounded_total",
+ "fieldtype": "Currency",
+ "label": "Rounded Total (Company Currency)",
+ "oldfieldname": "rounded_total",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"width": "150px"
- },
+ },
{
- "description": "In Words will be visible once you save the Sales Order.",
- "fieldname": "in_words",
- "fieldtype": "Data",
- "label": "In Words (Company Currency)",
- "oldfieldname": "in_words",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "description": "In Words will be visible once you save the Sales Order.",
+ "fieldname": "in_words",
+ "fieldtype": "Data",
+ "label": "In Words (Company Currency)",
+ "oldfieldname": "in_words",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"width": "200px"
- },
+ },
{
- "fieldname": "column_break3",
- "fieldtype": "Column Break",
- "oldfieldtype": "Column Break",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "advance_paid",
+ "fieldtype": "Currency",
+ "label": "Advance Paid",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1
+ },
+ {
+ "fieldname": "column_break3",
+ "fieldtype": "Column Break",
+ "oldfieldtype": "Column Break",
+ "permlevel": 0,
+ "print_hide": 1,
"width": "50%"
- },
+ },
{
- "fieldname": "grand_total_export",
- "fieldtype": "Currency",
- "label": "Grand Total",
- "oldfieldname": "grand_total_export",
- "oldfieldtype": "Currency",
- "options": "currency",
- "permlevel": 0,
- "print_hide": 0,
- "read_only": 1,
- "reqd": 0,
+ "fieldname": "grand_total_export",
+ "fieldtype": "Currency",
+ "label": "Grand Total",
+ "oldfieldname": "grand_total_export",
+ "oldfieldtype": "Currency",
+ "options": "currency",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 1,
+ "reqd": 0,
"width": "150px"
- },
+ },
{
- "fieldname": "rounded_total_export",
- "fieldtype": "Currency",
- "label": "Rounded Total",
- "oldfieldname": "rounded_total_export",
- "oldfieldtype": "Currency",
- "options": "currency",
- "permlevel": 0,
- "print_hide": 0,
- "read_only": 1,
+ "fieldname": "rounded_total_export",
+ "fieldtype": "Currency",
+ "label": "Rounded Total",
+ "oldfieldname": "rounded_total_export",
+ "oldfieldtype": "Currency",
+ "options": "currency",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 1,
"width": "150px"
- },
+ },
{
- "fieldname": "in_words_export",
- "fieldtype": "Data",
- "label": "In Words",
- "oldfieldname": "in_words_export",
- "oldfieldtype": "Data",
- "permlevel": 0,
- "print_hide": 0,
- "read_only": 1,
+ "fieldname": "in_words_export",
+ "fieldtype": "Data",
+ "label": "In Words",
+ "oldfieldname": "in_words_export",
+ "oldfieldtype": "Data",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 1,
"width": "200px"
- },
+ },
{
- "fieldname": "view_details",
- "fieldtype": "Fold",
- "label": "View Details",
+ "fieldname": "view_details",
+ "fieldtype": "Fold",
+ "label": "View Details",
"permlevel": 0
- },
+ },
{
- "description": "Display all the individual items delivered with the main items",
- "fieldname": "packing_list",
- "fieldtype": "Section Break",
- "hidden": 0,
- "label": "Packing List",
- "oldfieldtype": "Section Break",
- "options": "icon-suitcase",
- "permlevel": 0,
+ "description": "Display all the individual items delivered with the main items",
+ "fieldname": "packing_list",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "label": "Packing List",
+ "oldfieldtype": "Section Break",
+ "options": "icon-suitcase",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "packing_details",
- "fieldtype": "Table",
- "label": "Packing Details",
- "oldfieldname": "packing_details",
- "oldfieldtype": "Table",
- "options": "Packed Item",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "packing_details",
+ "fieldtype": "Table",
+ "label": "Packing Details",
+ "oldfieldname": "packing_details",
+ "oldfieldtype": "Table",
+ "options": "Packed Item",
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "fieldname": "terms_section_break",
- "fieldtype": "Section Break",
- "label": "Terms and Conditions",
- "oldfieldtype": "Section Break",
- "options": "icon-legal",
- "permlevel": 0,
+ "fieldname": "terms_section_break",
+ "fieldtype": "Section Break",
+ "label": "Terms and Conditions",
+ "oldfieldtype": "Section Break",
+ "options": "icon-legal",
+ "permlevel": 0,
"print_hide": 0
- },
+ },
{
- "fieldname": "tc_name",
- "fieldtype": "Link",
- "label": "Terms",
- "oldfieldname": "tc_name",
- "oldfieldtype": "Link",
- "options": "Terms and Conditions",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "tc_name",
+ "fieldtype": "Link",
+ "label": "Terms",
+ "oldfieldname": "tc_name",
+ "oldfieldtype": "Link",
+ "options": "Terms and Conditions",
+ "permlevel": 0,
+ "print_hide": 1,
"search_index": 0
- },
+ },
{
- "fieldname": "terms",
- "fieldtype": "Text Editor",
- "label": "Terms and Conditions Details",
- "oldfieldname": "terms",
- "oldfieldtype": "Text Editor",
- "permlevel": 0,
+ "fieldname": "terms",
+ "fieldtype": "Text Editor",
+ "label": "Terms and Conditions Details",
+ "oldfieldname": "terms",
+ "oldfieldtype": "Text Editor",
+ "permlevel": 0,
"print_hide": 0
- },
+ },
{
- "depends_on": "customer",
- "fieldname": "contact_info",
- "fieldtype": "Section Break",
- "label": "Contact Info",
- "options": "icon-bullhorn",
+ "depends_on": "customer",
+ "fieldname": "contact_info",
+ "fieldtype": "Section Break",
+ "label": "Contact Info",
+ "options": "icon-bullhorn",
"permlevel": 0
- },
+ },
{
- "fieldname": "col_break45",
- "fieldtype": "Column Break",
- "permlevel": 0,
+ "fieldname": "col_break45",
+ "fieldtype": "Column Break",
+ "permlevel": 0,
"width": "50%"
- },
+ },
{
- "description": "<a href=\"#Sales Browser/Territory\">Add / Edit</a>",
- "fieldname": "territory",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Territory",
- "options": "Territory",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
+ "description": "<a href=\"#Sales Browser/Territory\">Add / Edit</a>",
+ "fieldname": "territory",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Territory",
+ "options": "Territory",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
"search_index": 1
- },
+ },
{
- "description": "<a href=\"#Sales Browser/Customer Group\">Add / Edit</a>",
- "fieldname": "customer_group",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Customer Group",
- "options": "Customer Group",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
+ "description": "<a href=\"#Sales Browser/Customer Group\">Add / Edit</a>",
+ "fieldname": "customer_group",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Customer Group",
+ "options": "Customer Group",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
"search_index": 1
- },
+ },
{
- "fieldname": "col_break46",
- "fieldtype": "Column Break",
- "permlevel": 0,
+ "fieldname": "col_break46",
+ "fieldtype": "Column Break",
+ "permlevel": 0,
"width": "50%"
- },
+ },
{
- "fieldname": "customer_address",
- "fieldtype": "Link",
- "hidden": 0,
- "in_filter": 1,
- "label": "Customer Address",
- "options": "Address",
- "permlevel": 0,
+ "fieldname": "customer_address",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "in_filter": 1,
+ "label": "Customer Address",
+ "options": "Address",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "contact_person",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Contact Person",
- "options": "Contact",
- "permlevel": 0,
+ "fieldname": "contact_person",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Contact Person",
+ "options": "Contact",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "more_info",
- "fieldtype": "Section Break",
- "label": "More Info",
- "oldfieldtype": "Section Break",
- "options": "icon-file-text",
- "permlevel": 0,
+ "fieldname": "more_info",
+ "fieldtype": "Section Break",
+ "label": "More Info",
+ "oldfieldtype": "Section Break",
+ "options": "icon-file-text",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "description": "Track this Sales Order against any Project",
- "fieldname": "project_name",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Project Name",
- "oldfieldname": "project_name",
- "oldfieldtype": "Link",
- "options": "Project",
- "permlevel": 0,
+ "description": "Track this Sales Order against any Project",
+ "fieldname": "project_name",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Project Name",
+ "oldfieldname": "project_name",
+ "oldfieldtype": "Link",
+ "options": "Project",
+ "permlevel": 0,
"search_index": 1
- },
+ },
{
- "depends_on": "eval:doc.source == 'Campaign'",
- "fieldname": "campaign",
- "fieldtype": "Link",
- "label": "Campaign",
- "oldfieldname": "campaign",
- "oldfieldtype": "Link",
- "options": "Campaign",
- "permlevel": 0,
+ "depends_on": "eval:doc.source == 'Campaign'",
+ "fieldname": "campaign",
+ "fieldtype": "Link",
+ "label": "Campaign",
+ "oldfieldname": "campaign",
+ "oldfieldtype": "Link",
+ "options": "Campaign",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "source",
- "fieldtype": "Select",
- "label": "Source",
- "oldfieldname": "source",
- "oldfieldtype": "Select",
- "options": "\nExisting Customer\nReference\nAdvertisement\nCold Calling\nExhibition\nSupplier Reference\nMass Mailing\nCustomer's Vendor\nCampaign",
- "permlevel": 0,
+ "fieldname": "source",
+ "fieldtype": "Select",
+ "label": "Source",
+ "oldfieldname": "source",
+ "oldfieldtype": "Select",
+ "options": "\nExisting Customer\nReference\nAdvertisement\nCold Calling\nExhibition\nSupplier Reference\nMass Mailing\nCustomer's Vendor\nCampaign",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "column_break4",
- "fieldtype": "Column Break",
- "oldfieldtype": "Column Break",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "column_break4",
+ "fieldtype": "Column Break",
+ "oldfieldtype": "Column Break",
+ "permlevel": 0,
+ "print_hide": 1,
"width": "50%"
- },
+ },
{
- "allow_on_submit": 1,
- "fieldname": "letter_head",
- "fieldtype": "Link",
- "label": "Letter Head",
- "oldfieldname": "letter_head",
- "oldfieldtype": "Select",
- "options": "Letter Head",
- "permlevel": 0,
+ "allow_on_submit": 1,
+ "fieldname": "letter_head",
+ "fieldtype": "Link",
+ "label": "Letter Head",
+ "oldfieldname": "letter_head",
+ "oldfieldtype": "Select",
+ "options": "Letter Head",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "allow_on_submit": 1,
- "fieldname": "select_print_heading",
- "fieldtype": "Link",
- "label": "Print Heading",
- "no_copy": 1,
- "oldfieldname": "select_print_heading",
- "oldfieldtype": "Link",
- "options": "Print Heading",
- "permlevel": 0,
- "print_hide": 1,
+ "allow_on_submit": 1,
+ "fieldname": "select_print_heading",
+ "fieldtype": "Link",
+ "label": "Print Heading",
+ "no_copy": 1,
+ "oldfieldname": "select_print_heading",
+ "oldfieldtype": "Link",
+ "options": "Print Heading",
+ "permlevel": 0,
+ "print_hide": 1,
"report_hide": 1
- },
+ },
{
- "fieldname": "fiscal_year",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Fiscal Year",
- "oldfieldname": "fiscal_year",
- "oldfieldtype": "Select",
- "options": "Fiscal Year",
- "permlevel": 0,
- "print_hide": 1,
- "reqd": 1,
- "search_index": 1,
+ "fieldname": "fiscal_year",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Fiscal Year",
+ "oldfieldname": "fiscal_year",
+ "oldfieldtype": "Select",
+ "options": "Fiscal Year",
+ "permlevel": 0,
+ "print_hide": 1,
+ "reqd": 1,
+ "search_index": 1,
"width": "150px"
- },
+ },
{
- "fieldname": "section_break_78",
- "fieldtype": "Section Break",
- "oldfieldtype": "Column Break",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "section_break_78",
+ "fieldtype": "Section Break",
+ "oldfieldtype": "Column Break",
+ "permlevel": 0,
+ "print_hide": 1,
"width": "50%"
- },
+ },
{
- "default": "Draft",
- "fieldname": "status",
- "fieldtype": "Select",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "Status",
- "no_copy": 1,
- "oldfieldname": "status",
- "oldfieldtype": "Select",
- "options": "\nDraft\nSubmitted\nStopped\nCancelled",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
- "reqd": 1,
- "search_index": 1,
+ "default": "Draft",
+ "fieldname": "status",
+ "fieldtype": "Select",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "Status",
+ "no_copy": 1,
+ "oldfieldname": "status",
+ "oldfieldtype": "Select",
+ "options": "\nDraft\nSubmitted\nStopped\nCancelled",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
+ "reqd": 1,
+ "search_index": 1,
"width": "100px"
- },
+ },
{
- "fieldname": "delivery_status",
- "fieldtype": "Select",
- "hidden": 1,
- "label": "Delivery Status",
- "no_copy": 1,
- "options": "Not Delivered\nFully Delivered\nPartly Delivered\nClosed\nNot Applicable",
- "permlevel": 0,
+ "fieldname": "delivery_status",
+ "fieldtype": "Select",
+ "hidden": 1,
+ "label": "Delivery Status",
+ "no_copy": 1,
+ "options": "Not Delivered\nFully Delivered\nPartly Delivered\nClosed\nNot Applicable",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "depends_on": "eval:!doc.__islocal",
- "description": "% of materials delivered against this Sales Order",
- "fieldname": "per_delivered",
- "fieldtype": "Percent",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "% Delivered",
- "no_copy": 1,
- "oldfieldname": "per_delivered",
- "oldfieldtype": "Currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "depends_on": "eval:!doc.__islocal",
+ "description": "% of materials delivered against this Sales Order",
+ "fieldname": "per_delivered",
+ "fieldtype": "Percent",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "% Delivered",
+ "no_copy": 1,
+ "oldfieldname": "per_delivered",
+ "oldfieldtype": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"width": "100px"
- },
+ },
{
- "fieldname": "column_break_81",
- "fieldtype": "Column Break",
+ "fieldname": "column_break_81",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "depends_on": "eval:!doc.__islocal",
- "description": "% of materials billed against this Sales Order",
- "fieldname": "per_billed",
- "fieldtype": "Percent",
- "in_filter": 1,
- "in_list_view": 1,
- "label": "% Amount Billed",
- "no_copy": 1,
- "oldfieldname": "per_billed",
- "oldfieldtype": "Currency",
- "permlevel": 0,
- "print_hide": 1,
- "read_only": 1,
+ "depends_on": "eval:!doc.__islocal",
+ "description": "% of materials billed against this Sales Order",
+ "fieldname": "per_billed",
+ "fieldtype": "Percent",
+ "in_filter": 1,
+ "in_list_view": 1,
+ "label": "% Amount Billed",
+ "no_copy": 1,
+ "oldfieldname": "per_billed",
+ "oldfieldtype": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
+ "read_only": 1,
"width": "100px"
- },
+ },
{
- "fieldname": "billing_status",
- "fieldtype": "Select",
- "hidden": 1,
- "label": "Billing Status",
- "no_copy": 1,
- "options": "Not Billed\nFully Billed\nPartly Billed\nClosed",
- "permlevel": 0,
+ "fieldname": "billing_status",
+ "fieldtype": "Select",
+ "hidden": 1,
+ "label": "Billing Status",
+ "no_copy": 1,
+ "options": "Not Billed\nFully Billed\nPartly Billed\nClosed",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "sales_team_section_break",
- "fieldtype": "Section Break",
- "label": "Sales Team",
- "oldfieldtype": "Section Break",
- "options": "icon-group",
- "permlevel": 0,
+ "fieldname": "sales_team_section_break",
+ "fieldtype": "Section Break",
+ "label": "Sales Team",
+ "oldfieldtype": "Section Break",
+ "options": "icon-group",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "sales_partner",
- "fieldtype": "Link",
- "in_filter": 1,
- "label": "Sales Partner",
- "oldfieldname": "sales_partner",
- "oldfieldtype": "Link",
- "options": "Sales Partner",
- "permlevel": 0,
- "print_hide": 1,
- "search_index": 1,
+ "fieldname": "sales_partner",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Sales Partner",
+ "oldfieldname": "sales_partner",
+ "oldfieldtype": "Link",
+ "options": "Sales Partner",
+ "permlevel": 0,
+ "print_hide": 1,
+ "search_index": 1,
"width": "150px"
- },
+ },
{
- "fieldname": "column_break7",
- "fieldtype": "Column Break",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "column_break7",
+ "fieldtype": "Column Break",
+ "permlevel": 0,
+ "print_hide": 1,
"width": "50%"
- },
+ },
{
- "fieldname": "commission_rate",
- "fieldtype": "Float",
- "label": "Commission Rate",
- "oldfieldname": "commission_rate",
- "oldfieldtype": "Currency",
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "commission_rate",
+ "fieldtype": "Float",
+ "label": "Commission Rate",
+ "oldfieldname": "commission_rate",
+ "oldfieldtype": "Currency",
+ "permlevel": 0,
+ "print_hide": 1,
"width": "100px"
- },
+ },
{
- "fieldname": "total_commission",
- "fieldtype": "Currency",
- "label": "Total Commission",
- "oldfieldname": "total_commission",
- "oldfieldtype": "Currency",
- "options": "Company:company:default_currency",
- "permlevel": 0,
+ "fieldname": "total_commission",
+ "fieldtype": "Currency",
+ "label": "Total Commission",
+ "oldfieldname": "total_commission",
+ "oldfieldtype": "Currency",
+ "options": "Company:company:default_currency",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "section_break1",
- "fieldtype": "Section Break",
- "permlevel": 0,
+ "fieldname": "section_break1",
+ "fieldtype": "Section Break",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "sales_team",
- "fieldtype": "Table",
- "label": "Sales Team1",
- "oldfieldname": "sales_team",
- "oldfieldtype": "Table",
- "options": "Sales Team",
- "permlevel": 0,
+ "fieldname": "sales_team",
+ "fieldtype": "Table",
+ "label": "Sales Team1",
+ "oldfieldname": "sales_team",
+ "oldfieldtype": "Table",
+ "options": "Sales Team",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "recurring_order",
- "fieldtype": "Section Break",
- "label": "Recurring Order",
- "options": "icon-time",
+ "fieldname": "recurring_order",
+ "fieldtype": "Section Break",
+ "label": "Recurring Order",
+ "options": "icon-time",
"permlevel": 0
- },
+ },
{
- "fieldname": "column_break82",
- "fieldtype": "Column Break",
- "label": "Column Break",
+ "fieldname": "column_break82",
+ "fieldtype": "Column Break",
+ "label": "Column Break",
"permlevel": 0
- },
+ },
{
- "allow_on_submit": 1,
- "depends_on": "eval:doc.docstatus<2",
- "description": "Check if recurring order, uncheck to stop recurring or put proper End Date",
- "fieldname": "is_recurring",
- "fieldtype": "Check",
- "label": "Is Recurring",
- "no_copy": 1,
- "permlevel": 0,
+ "allow_on_submit": 1,
+ "depends_on": "eval:doc.docstatus<2",
+ "description": "Check if recurring order, uncheck to stop recurring or put proper End Date",
+ "fieldname": "is_recurring",
+ "fieldtype": "Check",
+ "label": "Is Recurring",
+ "no_copy": 1,
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "allow_on_submit": 1,
- "depends_on": "eval:doc.is_recurring==1",
- "description": "Select the period when the invoice will be generated automatically",
- "fieldname": "recurring_type",
- "fieldtype": "Select",
- "label": "Recurring Type",
- "no_copy": 1,
- "options": "\nMonthly\nQuarterly\nHalf-yearly\nYearly",
- "permlevel": 0,
+ "allow_on_submit": 1,
+ "depends_on": "eval:doc.is_recurring==1",
+ "description": "Select the period when the invoice will be generated automatically",
+ "fieldname": "recurring_type",
+ "fieldtype": "Select",
+ "label": "Recurring Type",
+ "no_copy": 1,
+ "options": "\nMonthly\nQuarterly\nHalf-yearly\nYearly",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "allow_on_submit": 1,
- "depends_on": "eval:doc.is_recurring==1",
- "description": "The day of the month on which auto order will be generated e.g. 05, 28 etc ",
- "fieldname": "repeat_on_day_of_month",
- "fieldtype": "Int",
- "label": "Repeat on Day of Month",
- "no_copy": 1,
- "permlevel": 0,
+ "allow_on_submit": 1,
+ "depends_on": "eval:doc.is_recurring==1",
+ "description": "The day of the month on which auto order will be generated e.g. 05, 28 etc ",
+ "fieldname": "repeat_on_day_of_month",
+ "fieldtype": "Int",
+ "label": "Repeat on Day of Month",
+ "no_copy": 1,
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "depends_on": "eval:doc.is_recurring==1",
- "description": "The date on which next invoice will be generated. It is generated on submit.",
- "fieldname": "next_date",
- "fieldtype": "Date",
- "label": "Next Date",
- "no_copy": 1,
- "permlevel": 0,
- "print_hide": 1,
+ "depends_on": "eval:doc.is_recurring==1",
+ "description": "The date on which next invoice will be generated. It is generated on submit.",
+ "fieldname": "next_date",
+ "fieldtype": "Date",
+ "label": "Next Date",
+ "no_copy": 1,
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "allow_on_submit": 1,
- "depends_on": "eval:doc.is_recurring==1",
- "description": "The date on which recurring order will be stop",
- "fieldname": "end_date",
- "fieldtype": "Date",
- "label": "End Date",
- "no_copy": 1,
- "permlevel": 0,
+ "allow_on_submit": 1,
+ "depends_on": "eval:doc.is_recurring==1",
+ "description": "The date on which recurring order will be stop",
+ "fieldname": "end_date",
+ "fieldtype": "Date",
+ "label": "End Date",
+ "no_copy": 1,
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "column_break83",
- "fieldtype": "Column Break",
- "label": "Column Break",
- "permlevel": 0,
+ "fieldname": "column_break83",
+ "fieldtype": "Column Break",
+ "label": "Column Break",
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "depends_on": "eval:doc.is_recurring==1",
- "fieldname": "recurring_id",
- "fieldtype": "Data",
- "label": "Recurring Id",
- "no_copy": 1,
- "permlevel": 0,
- "print_hide": 1,
+ "depends_on": "eval:doc.is_recurring==1",
+ "fieldname": "recurring_id",
+ "fieldtype": "Data",
+ "label": "Recurring Id",
+ "no_copy": 1,
+ "permlevel": 0,
+ "print_hide": 1,
"read_only": 1
- },
+ },
{
- "allow_on_submit": 1,
- "depends_on": "eval:doc.is_recurring==1",
- "description": "Enter email id separated by commas, order will be mailed automatically on particular date",
- "fieldname": "notification_email_address",
- "fieldtype": "Small Text",
- "ignore_user_permissions": 0,
- "label": "Notification Email Address",
- "no_copy": 1,
- "permlevel": 0,
+ "allow_on_submit": 1,
+ "depends_on": "eval:doc.is_recurring==1",
+ "description": "Enter email id separated by commas, order will be mailed automatically on particular date",
+ "fieldname": "notification_email_address",
+ "fieldtype": "Small Text",
+ "ignore_user_permissions": 0,
+ "label": "Notification Email Address",
+ "no_copy": 1,
+ "permlevel": 0,
"print_hide": 1
- },
+ },
{
- "fieldname": "against_income_account",
- "fieldtype": "Small Text",
- "hidden": 1,
- "label": "Against Income Account",
- "no_copy": 1,
- "permlevel": 0,
- "print_hide": 1,
+ "fieldname": "against_income_account",
+ "fieldtype": "Small Text",
+ "hidden": 1,
+ "label": "Against Income Account",
+ "no_copy": 1,
+ "permlevel": 0,
+ "print_hide": 1,
"report_hide": 1
}
- ],
- "icon": "icon-file-text",
- "idx": 1,
- "is_submittable": 1,
- "issingle": 0,
- "modified": "2014-09-09 05:35:34.761247",
- "modified_by": "Administrator",
- "module": "Selling",
- "name": "Sales Order",
- "owner": "Administrator",
+ ],
+ "icon": "icon-file-text",
+ "idx": 1,
+ "is_submittable": 1,
+ "issingle": 0,
+ "modified": "2014-09-10 05:35:34.761247",
+ "modified_by": "Administrator",
+ "module": "Selling",
+ "name": "Sales Order",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 1,
- "apply_user_permissions": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Sales User",
- "submit": 1,
+ "amend": 1,
+ "apply_user_permissions": 1,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Sales User",
+ "submit": 1,
"write": 1
- },
+ },
{
- "amend": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "import": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Sales Manager",
- "set_user_permissions": 1,
- "submit": 1,
+ "amend": 1,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "import": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Sales Manager",
+ "set_user_permissions": 1,
+ "submit": 1,
"write": 1
- },
+ },
{
- "amend": 1,
- "apply_user_permissions": 1,
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Maintenance User",
- "submit": 1,
+ "amend": 1,
+ "apply_user_permissions": 1,
+ "cancel": 1,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Maintenance User",
+ "submit": 1,
"write": 1
- },
+ },
{
- "apply_user_permissions": 1,
- "cancel": 0,
- "delete": 0,
- "email": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
+ "apply_user_permissions": 1,
+ "cancel": 0,
+ "delete": 0,
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
"role": "Accounts User"
- },
+ },
{
- "apply_user_permissions": 1,
- "cancel": 0,
- "delete": 0,
- "email": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
+ "apply_user_permissions": 1,
+ "cancel": 0,
+ "delete": 0,
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
"role": "Customer"
- },
+ },
{
- "apply_user_permissions": 1,
- "permlevel": 0,
- "read": 1,
- "report": 1,
+ "apply_user_permissions": 1,
+ "permlevel": 0,
+ "read": 1,
+ "report": 1,
"role": "Material User"
- },
+ },
{
- "permlevel": 1,
- "read": 1,
- "role": "Sales Manager",
+ "permlevel": 1,
+ "read": 1,
+ "role": "Sales Manager",
"write": 1
}
- ],
- "read_only_onload": 1,
- "search_fields": "status,transaction_date,customer,customer_name, territory,order_type,company",
- "sort_field": "modified",
+ ],
+ "read_only_onload": 1,
+ "search_fields": "status,transaction_date,customer,customer_name, territory,order_type,company",
+ "sort_field": "modified",
"sort_order": "DESC"
-}
\ No newline at end of file
+}
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index ff14f9d..d2996e9 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -326,6 +326,11 @@
@frappe.whitelist()
def make_sales_invoice(source_name, target_doc=None):
+ def postprocess(source, target):
+ set_missing_values(source, target)
+ #Get the advance paid Journal Vouchers in Sales Invoice Advance
+ target.get_advances()
+
def set_missing_values(source, target):
target.is_pos = 0
target.ignore_pricing_rule = 1
@@ -361,7 +366,18 @@
"doctype": "Sales Team",
"add_if_empty": True
}
- }, target_doc, set_missing_values)
+ }, target_doc, postprocess)
+
+ def set_advance_vouchers(source, target):
+ advance_voucher_list = []
+
+ advance_voucher = frappe.db.sql("""
+ select
+ t1.name as voucher_no, t1.posting_date, t1.remark, t2.account,
+ t2.name as voucher_detail_no, {amount_query} as payment_amount, t2.is_advance
+ from
+ `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
+ """)
return doclist
diff --git a/erpnext/selling/doctype/sales_order/test_records.json b/erpnext/selling/doctype/sales_order/test_records.json
index 88af30c..8db9915 100644
--- a/erpnext/selling/doctype/sales_order/test_records.json
+++ b/erpnext/selling/doctype/sales_order/test_records.json
@@ -1,5 +1,6 @@
[
{
+ "advance_paid": 0.0,
"company": "_Test Company",
"conversion_rate": 1.0,
"currency": "INR",
diff --git a/erpnext/selling/page/sales_browser/sales_browser.js b/erpnext/selling/page/sales_browser/sales_browser.js
index a8fd464..d254028 100644
--- a/erpnext/selling/page/sales_browser/sales_browser.js
+++ b/erpnext/selling/page/sales_browser/sales_browser.js
@@ -8,7 +8,7 @@
wrapper.appframe.add_module_icon("Selling")
- wrapper.appframe.set_title_right('Refresh', function() {
+ wrapper.appframe.set_title_right(__('Refresh'), function() {
wrapper.make_tree();
});
@@ -44,7 +44,7 @@
// set route
var ctype = frappe.get_route()[1] || 'Territory';
- wrapper.appframe.set_title(ctype+' Tree')
+ wrapper.appframe.set_title(__('{0} Tree',[__(ctype)]));
if(erpnext.sales_chart && erpnext.sales_chart.ctype != ctype) {
wrapper.make_tree();
@@ -64,7 +64,7 @@
this.tree = new frappe.ui.Tree({
parent: $(parent),
- label: root,
+ label: __(root),
args: {ctype: ctype},
method: 'erpnext.selling.page.sales_browser.sales_browser.get_children',
toolbar: [
@@ -112,20 +112,20 @@
var fields = [
{fieldtype:'Data', fieldname: 'name_field',
- label:'New ' + me.ctype + ' Name', reqd:true},
- {fieldtype:'Select', fieldname:'is_group', label:'Group Node', options:'No\nYes',
+ label:__('New {0} Name',[__(me.ctype)]), reqd:true},
+ {fieldtype:'Select', fieldname:'is_group', label:__('Group Node'), options:'No\nYes',
description: __("Further nodes can be only created under 'Group' type nodes")},
- {fieldtype:'Button', fieldname:'create_new', label:'Create New' }
+ {fieldtype:'Button', fieldname:'create_new', label:__('Create New') }
]
if(me.ctype == "Sales Person") {
- fields.splice(-1, 0, {fieldtype:'Link', fieldname:'employee', label:'Employee',
+ fields.splice(-1, 0, {fieldtype:'Link', fieldname:'employee', label:__('Employee'),
options:'Employee', description: __("Please enter Employee Id of this sales parson")});
}
// the dialog
var d = new frappe.ui.Dialog({
- title: __('New ') + __(me.ctype),
+ title: __('New {0}',[__(me.ctype)]),
fields: fields
})
diff --git a/erpnext/selling/page/sales_funnel/sales_funnel.js b/erpnext/selling/page/sales_funnel/sales_funnel.js
index cc46c04..7670762 100644
--- a/erpnext/selling/page/sales_funnel/sales_funnel.js
+++ b/erpnext/selling/page/sales_funnel/sales_funnel.js
@@ -4,7 +4,7 @@
frappe.pages['sales-funnel'].onload = function(wrapper) {
frappe.ui.make_app_page({
parent: wrapper,
- title: 'Sales Funnel',
+ title: __('Sales Funnel'),
single_column: true
});
@@ -30,13 +30,13 @@
this.elements = {
layout: $(wrapper).find(".layout-main"),
- from_date: wrapper.appframe.add_date("From Date"),
- to_date: wrapper.appframe.add_date("To Date"),
- refresh_btn: wrapper.appframe.set_title_right("Refresh",
+ from_date: wrapper.appframe.add_date(__("From Date")),
+ to_date: wrapper.appframe.add_date(__("To Date")),
+ refresh_btn: wrapper.appframe.set_title_right(__("Refresh"),
function() { me.get_data(); }, "icon-refresh"),
};
- this.elements.no_data = $('<div class="alert alert-warning">No Data</div>')
+ this.elements.no_data = $('<div class="alert alert-warning">' + __("No Data") + '</div>')
.toggle(false)
.appendTo(this.elements.layout);
diff --git a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py
index 43c4e58..1ec9871 100644
--- a/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py
+++ b/erpnext/selling/report/customer_acquisition_and_loyalty/customer_acquisition_and_loyalty.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
from frappe.utils import getdate, cint
import calendar
@@ -52,13 +53,13 @@
new[1], repeat[1], new[1] + repeat[1]])
return [
- "Year", "Month",
- "New Customers:Int",
- "Repeat Customers:Int",
- "Total:Int",
- "New Customer Revenue:Currency:150",
- "Repeat Customer Revenue:Currency:150",
- "Total Revenue:Currency:150"
+ _("Year"), _("Month"),
+ _("New Customers") + ":Int",
+ _("Repeat Customers") + ":Int",
+ _("Total") + ":Int",
+ _("New Customer Revenue") + ":Currency:150",
+ _("Repeat Customer Revenue") + ":Currency:150",
+ _("Total Revenue") + ":Currency:150"
], out
diff --git a/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py b/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py
index 35cdf59..a87c4a1 100644
--- a/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py
+++ b/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py
@@ -50,14 +50,14 @@
def get_columns():
return [
- "Customer:Link/Customer:120",
- "Customer Name:Data:120",
- "Territory::120",
- "Customer Group::120",
- "Number of Order::120",
- "Total Order Value:Currency:120",
- "Total Order Considered:Currency:160",
- "Last Order Amount:Currency:160",
- "Last Sales Order Date:Date:160",
- "Days Since Last Order::160"
+ _("Customer") + ":Link/Customer:120",
+ _("Customer Name") + ":Data:120",
+ _("Territory") + "::120",
+ _("Customer Group") + "::120",
+ _("Number of Order") + "::120",
+ _("Total Order Value") + ":Currency:120",
+ _("Total Order Considered") + ":Currency:160",
+ _("Last Order Amount") + ":Currency:160",
+ _("Last Sales Order Date") + ":Date:160",
+ _("Days Since Last Order") + "::160"
]
diff --git a/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py b/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py
index b272a83..00b4cde 100644
--- a/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py
+++ b/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py
@@ -43,21 +43,21 @@
msgprint(_("Please specify") + ": " + label,
raise_exception=True)
- columns = ["Sales Person:Link/Sales Person:120", "Item Group:Link/Item Group:120"]
+ columns = [_("Sales Person") + ":Link/Sales Person:120", _("Item Group") + ":Link/Item Group:120"]
group_months = False if filters["period"] == "Monthly" else True
for from_date, to_date in get_period_date_ranges(filters["period"], filters["fiscal_year"]):
- for label in ["Target (%s)", "Achieved (%s)", "Variance (%s)"]:
+ for label in [_("Target") + " (%s)", _("Achieved") + " (%s)", _("Variance") + " (%s)"]:
if group_months:
- label = label % (from_date.strftime("%b") + " - " + to_date.strftime("%b"))
+ label = label % (_(from_date.strftime("%b")) + " - " + _(to_date.strftime("%b")))
else:
- label = label % from_date.strftime("%b")
+ label = label % _(from_date.strftime("%b"))
columns.append(label+":Float:120")
- return columns + ["Total Target:Float:120", "Total Achieved:Float:120",
- "Total Variance:Float:120"]
+ return columns + [_("Total Target") + ":Float:120", _("Total Achieved") + ":Float:120",
+ _("Total Variance") + ":Float:120"]
#Get sales person & item group details
def get_salesperson_details(filters):
diff --git a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
index c7ee35f..f0bed76 100644
--- a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
+++ b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
@@ -18,10 +18,10 @@
msgprint(_("Please select the document type first"), raise_exception=1)
return [filters["doc_type"] + ":Link/" + filters["doc_type"] + ":140",
- "Customer:Link/Customer:140", "Territory:Link/Territory:100", "Posting Date:Date:100",
- "Item Code:Link/Item:120", "Qty:Float:100", "Amount:Currency:120",
- "Sales Person:Link/Sales Person:140", "Contribution %:Float:110",
- "Contribution Amount:Currency:140"]
+ _("Customer") + ":Link/Customer:140", _("Territory") + ":Link/Territory:100", _("Posting Date") + ":Date:100",
+ _("Item Code") + ":Link/Item:120", _("Qty") + ":Float:100", _("Amount") + ":Currency:120",
+ _("Sales Person") + ":Link/Sales Person:140", _("Contribution %") + ":Float:110",
+ _("Contribution Amount") + ":Currency:140"]
def get_entries(filters):
date_field = filters["doc_type"] == "Sales Order" and "transaction_date" or "posting_date"
diff --git a/erpnext/selling/report/territory_target_variance_item_group_wise/territory_target_variance_item_group_wise.py b/erpnext/selling/report/territory_target_variance_item_group_wise/territory_target_variance_item_group_wise.py
index 831e6b7..0ceb2d9 100644
--- a/erpnext/selling/report/territory_target_variance_item_group_wise/territory_target_variance_item_group_wise.py
+++ b/erpnext/selling/report/territory_target_variance_item_group_wise/territory_target_variance_item_group_wise.py
@@ -43,20 +43,20 @@
label = (" ".join(fieldname.split("_"))).title()
msgprint(_("Please specify") + ": " + label, raise_exception=True)
- columns = ["Territory:Link/Territory:120", "Item Group:Link/Item Group:120"]
+ columns = [_("Territory") + ":Link/Territory:120", _("Item Group") + ":Link/Item Group:120"]
group_months = False if filters["period"] == "Monthly" else True
for from_date, to_date in get_period_date_ranges(filters["period"], filters["fiscal_year"]):
- for label in ["Target (%s)", "Achieved (%s)", "Variance (%s)"]:
+ for label in [_("Target") +" (%s)", _("Achieved") + " (%s)", _("Variance") + " (%s)"]:
if group_months:
- label = label % (from_date.strftime("%b") + " - " + to_date.strftime("%b"))
+ label = label % (_(from_date.strftime("%b")) + " - " + _(to_date.strftime("%b")))
else:
- label = label % from_date.strftime("%b")
+ label = label % _(from_date.strftime("%b"))
columns.append(label+":Float:120")
- return columns + ["Total Target:Float:120", "Total Achieved:Float:120",
- "Total Variance:Float:120"]
+ return columns + [_("Total Target") + ":Float:120", _("Total Achieved") + ":Float:120",
+ _("Total Variance") + ":Float:120"]
#Get territory & item group details
def get_territory_details(filters):
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index 93c1191..c80d19e 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -47,7 +47,7 @@
}
cur_frm.cscript.edit_prices_button = function() {
- cur_frm.add_custom_button("Add / Edit Prices", function() {
+ cur_frm.add_custom_button(__("Add / Edit Prices"), function() {
frappe.set_route("Report", "Item Price", {"item_code": cur_frm.doc.name});
}, "icon-money");
}
diff --git a/erpnext/stock/doctype/price_list/price_list.js b/erpnext/stock/doctype/price_list/price_list.js
index ea7b6db..125242f 100644
--- a/erpnext/stock/doctype/price_list/price_list.js
+++ b/erpnext/stock/doctype/price_list/price_list.js
@@ -7,7 +7,7 @@
},
refresh: function() {
- cur_frm.add_custom_button("Add / Edit Prices", function() {
+ cur_frm.add_custom_button(__("Add / Edit Prices"), function() {
frappe.route_options = {
"price_list": cur_frm.doc.name
};
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index b07eab7..14c409b 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -223,8 +223,8 @@
sr = frappe.get_doc("Serial No", serial_no)
if sr.item_code!=sle.item_code:
- frappe.throw(_("Serial No {0} does not belong to Item {1}").format(sle.item_code,
- serial_no), SerialNoItemError)
+ frappe.throw(_("Serial No {0} does not belong to Item {1}").format(serial_no,
+ sle.item_code), SerialNoItemError)
if sr.warehouse and sle.actual_qty > 0:
frappe.throw(_("Serial No {0} has already been received").format(sr.name),
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index af6493d..2faa288 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -457,3 +457,4 @@
cur_frm.fields_dict.supplier.get_query = function(doc, cdt, cdn) {
return { query: "erpnext.controllers.queries.supplier_query" }
}
+cur_frm.add_fetch('production_order', 'total_fixed_cost', 'total_fixed_cost');
\ No newline at end of file
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.json b/erpnext/stock/doctype/stock_entry/stock_entry.json
index b6ef6f3..97c4882 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.json
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.json
@@ -298,6 +298,14 @@
"search_index": 0
},
{
+ "depends_on": "eval:doc.purpose==\"Manufacture/Repack\"",
+ "fieldname": "total_fixed_cost",
+ "fieldtype": "Float",
+ "label": "Total Fixed Cost",
+ "permlevel": 0,
+ "read_only": 0
+ },
+ {
"fieldname": "cb1",
"fieldtype": "Column Break",
"permlevel": 0,
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index cda88a9..c3aab6a 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -217,6 +217,8 @@
allow_negative_stock = cint(frappe.db.get_default("allow_negative_stock"))
for d in self.get('mtn_details'):
+ d.transfer_qty = flt(d.transfer_qty)
+
args = frappe._dict({
"item_code": d.item_code,
"warehouse": d.s_warehouse or d.t_warehouse,
@@ -241,7 +243,6 @@
incoming_rate = flt(self.get_incoming_rate(args), self.precision("incoming_rate", d))
if incoming_rate > 0:
d.incoming_rate = incoming_rate
-
d.amount = flt(d.transfer_qty) * flt(d.incoming_rate)
if not d.t_warehouse:
raw_material_cost += flt(d.amount)
@@ -256,7 +257,7 @@
if d.bom_no:
bom = frappe.db.get_value("BOM", d.bom_no, ["operating_cost", "quantity"], as_dict=1)
operation_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity)
- d.incoming_rate = operation_cost_per_unit + (raw_material_cost / flt(d.transfer_qty))
+ d.incoming_rate = operation_cost_per_unit + (raw_material_cost + flt(self.total_fixed_cost)) / flt(d.transfer_qty)
d.amount = flt(d.transfer_qty) * flt(d.incoming_rate)
break
diff --git a/erpnext/stock/doctype/stock_entry/test_records.json b/erpnext/stock/doctype/stock_entry/test_records.json
index a87b635..4a4ca0e 100644
--- a/erpnext/stock/doctype/stock_entry/test_records.json
+++ b/erpnext/stock/doctype/stock_entry/test_records.json
@@ -9,7 +9,7 @@
"cost_center": "_Test Cost Center - _TC",
"doctype": "Stock Entry Detail",
"expense_account": "Stock Adjustment - _TC",
- "incoming_rate": 100,
+ "incoming_rate": 100,
"item_code": "_Test Item",
"parentfield": "mtn_details",
"qty": 50.0,
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index 0f6a33f..b9a6abd 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -10,6 +10,7 @@
from erpnext.stock.doctype.stock_ledger_entry.stock_ledger_entry import StockFreezeError
class TestStockEntry(unittest.TestCase):
+
def tearDown(self):
frappe.set_user("Administrator")
set_perpetual_inventory(0)
@@ -26,7 +27,6 @@
st1 = frappe.copy_doc(test_records[0])
st1.insert()
st1.submit()
-
st2 = frappe.copy_doc(test_records[1])
st2.insert()
st2.submit()
@@ -821,6 +821,39 @@
se = frappe.copy_doc(test_records[0]).insert()
self.assertRaises (StockFreezeError, se.submit)
frappe.db.set_value("Stock Settings", None, "stock_frozen_upto_days", 0)
+
+ def test_production_order(self):
+ bom_no = frappe.db.get_value("BOM", {"item": "_Test FG Item 2",
+ "is_default": 1, "docstatus": 1})
+
+ production_order = frappe.new_doc("Production Order")
+ production_order.update({
+ "company": "_Test Company",
+ "fg_warehouse": "_Test Warehouse 1 - _TC",
+ "production_item": "_Test FG Item 2",
+ "bom_no": bom_no,
+ "qty": 1.0,
+ "stock_uom": "Nos",
+ "wip_warehouse": "_Test Warehouse - _TC"
+ })
+ production_order.insert()
+ production_order.submit()
+
+ self._insert_material_receipt()
+
+ stock_entry = frappe.new_doc("Stock Entry")
+ stock_entry.update({
+ "purpose": "Manufacture/Repack",
+ "production_order": production_order.name,
+ "bom_no": bom_no,
+ "fg_completed_qty": "1",
+ "total_fixed_cost": 1000
+ })
+ stock_entry.get_items()
+ fg_rate = [d.amount for d in stock_entry.get("mtn_details") if d.item_code=="_Test FG Item 2"][0]
+ self.assertEqual(fg_rate, 1200.00)
+ fg_rate = [d.amount for d in stock_entry.get("mtn_details") if d.item_code=="_Test Item"][0]
+ self.assertEqual(fg_rate, 100.00)
def make_serialized_item(item_code=None, serial_no=None, target_warehouse=None):
se = frappe.copy_doc(test_records[0])
diff --git a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
index 1de86be..9b94ee6 100644
--- a/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
+++ b/erpnext/stock/report/batch_wise_balance_history/batch_wise_balance_history.py
@@ -29,9 +29,9 @@
def get_columns(filters):
"""return columns based on filters"""
- columns = ["Item:Link/Item:100"] + ["Item Name::150"] + ["Description::150"] + \
- ["Warehouse:Link/Warehouse:100"] + ["Batch:Link/Batch:100"] + ["Opening Qty::90"] + \
- ["In Qty::80"] + ["Out Qty::80"] + ["Balance Qty::90"]
+ columns = [_("Item") + ":Link/Item:100"] + [_("Item Name") + "::150"] + [_("Description") + "::150"] + \
+ [_("Warehouse") + ":Link/Warehouse:100"] + [_("Batch") + ":Link/Batch:100"] + [_("Opening Qty") + "::90"] + \
+ [_("In Qty") + "::80"] + [_("Out Qty") + "::80"] + [_("Balance Qty") + "::90"]
return columns
diff --git a/erpnext/stock/report/item_prices/item_prices.py b/erpnext/stock/report/item_prices/item_prices.py
index d2da54f..2b413fd 100644
--- a/erpnext/stock/report/item_prices/item_prices.py
+++ b/erpnext/stock/report/item_prices/item_prices.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import msgprint, _
from frappe.utils import flt
def execute(filters=None):
@@ -33,9 +34,9 @@
def get_columns(filters):
"""return columns based on filters"""
- columns = ["Item:Link/Item:100", "Item Name::150", "Description::150", "UOM:Link/UOM:80",
- "Last Purchase Rate:Currency:90", "Valuation Rate:Currency:80", "Sales Price List::80",
- "Purchase Price List::80", "BOM Rate:Currency:90"]
+ columns = [_("Item") + ":Link/Item:100", _("Item Name") + "::150", _("Description") + "::150", _("UOM") + ":Link/UOM:80",
+ _("Last Purchase Rate") + ":Currency:90", _("Valuation Rate") + ":Currency:80", _("Sales Price List") + "::80",
+ _("Purchase Price List") + "::80", _("BOM Rate") + ":Currency:90"]
return columns
@@ -114,7 +115,7 @@
item_bom_map = {}
- for b in frappe.db.sql("""select item, (total_cost/quantity) as bom_rate
+ for b in frappe.db.sql("""select item, (total_variable_cost/quantity) as bom_rate
from `tabBOM` where is_active=1 and is_default=1""", as_dict=1):
item_bom_map.setdefault(b.item, flt(b.bom_rate))
diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
index 9b4bb06..0ffe681 100644
--- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
+++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py
@@ -36,10 +36,10 @@
def get_columns():
return[
- "Item:Link/Item:120", "Item name:Data:120", "Description::160",
- "Minimum Inventory Level:Float:160", "Lead Time Days:Float:120", "Consumed:Float:120",
- "Delivered:Float:120", "Total Outgoing:Float:120", "Avg Daily Outgoing:Float:160",
- "Reorder Level:Float:120"
+ _("Item") + ":Link/Item:120", _("Item Name") + ":Data:120", _("Description") + "::160",
+ _("Minimum Inventory Level") + ":Float:160", _("Lead Time Days") + ":Float:120", _("Consumed") + ":Float:120",
+ _("Delivered") + ":Float:120", _("Total Outgoing") + ":Float:120", _("Avg Daily Outgoing") + ":Float:160",
+ _("Reorder Level") + ":Float:120"
]
def get_item_info():
diff --git a/erpnext/stock/report/stock_ageing/stock_ageing.py b/erpnext/stock/report/stock_ageing/stock_ageing.py
index d8a8dc7..fc47861 100644
--- a/erpnext/stock/report/stock_ageing/stock_ageing.py
+++ b/erpnext/stock/report/stock_ageing/stock_ageing.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
from frappe.utils import date_diff
def execute(filters=None):
@@ -35,9 +36,9 @@
return (age_qty / total_qty) if total_qty else 0.0
def get_columns():
- return ["Item Code:Link/Item:100", "Item Name::100", "Description::200",
- "Item Group:Link/Item Group:100", "Brand:Link/Brand:100", "Average Age:Float:100",
- "Earliest:Int:80", "Latest:Int:80", "UOM:Link/UOM:100"]
+ return [_("Item Code") + ":Link/Item:100", _("Item Name") + "::100", _("Description") + "::200",
+ _("Item Group") + ":Link/Item Group:100", _("Brand") + ":Link/Brand:100", _("Average Age") + ":Float:100",
+ _("Earliest") + ":Int:80", _("Latest") + ":Int:80", _("UOM") + ":Link/UOM:100"]
def get_fifo_queue(filters):
item_details = {}
diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py
index 73a2c2a..4c5458d 100644
--- a/erpnext/stock/report/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/report/stock_ledger/stock_ledger.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
def execute(filters=None):
columns = get_columns()
@@ -26,12 +27,12 @@
return columns, data
def get_columns():
- return ["Date:Datetime:95", "Item:Link/Item:130", "Item Name::100", "Item Group:Link/Item Group:100",
- "Brand:Link/Brand:100", "Description::200", "Warehouse:Link/Warehouse:100",
- "Stock UOM:Link/UOM:100", "Qty:Float:50", "Balance Qty:Float:100",
- "Incoming Rate:Currency:110", "Valuation Rate:Currency:110", "Balance Value:Currency:110",
- "Voucher Type::110", "Voucher #::100", "Link::30", "Batch:Link/Batch:100",
- "Serial #:Link/Serial No:100", "Company:Link/Company:100"]
+ return [_("Date") + ":Datetime:95", _("Item") + ":Link/Item:130", _("Item Name") + "::100", _("Item Group") + ":Link/Item Group:100",
+ _("Brand") + ":Link/Brand:100", _("Description") + "::200", _("Warehouse") + ":Link/Warehouse:100",
+ _("Stock UOM") + ":Link/UOM:100", _("Qty") + ":Float:50", _("Balance Qty") + ":Float:100",
+ _("Incoming Rate") + ":Currency:110", _("Valuation Rate") + ":Currency:110", _("Balance Value") + ":Currency:110",
+ _("Voucher Type") + "::110", _("Voucher #") + "::100", _("Link") + "::30", _("Batch") + ":Link/Batch:100",
+ _("Serial #") + ":Link/Serial No:100", _("Company") + ":Link/Company:100"]
def get_stock_ledger_entries(filters):
return frappe.db.sql("""select concat_ws(" ", posting_date, posting_time) as date,
diff --git a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
index 2a5eb50..ff43155 100644
--- a/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
+++ b/erpnext/stock/report/stock_projected_qty/stock_projected_qty.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
def execute(filters=None):
columns = get_columns()
@@ -26,12 +27,12 @@
return columns, data
def get_columns():
- return ["Item Code:Link/Item:140", "Item Name::100", "Description::200",
- "Item Group:Link/Item Group:100", "Brand:Link/Brand:100", "Warehouse:Link/Warehouse:120",
- "UOM:Link/UOM:100", "Actual Qty:Float:100", "Planned Qty:Float:100",
- "Requested Qty:Float:110", "Ordered Qty:Float:100", "Reserved Qty:Float:100",
- "Projected Qty:Float:100", "Reorder Level:Float:100", "Reorder Qty:Float:100",
- "Shortage Qty:Float:100"]
+ return [_("Item Code") + ":Link/Item:140", _("Item Name") + "::100", _("Description") + "::200",
+ _("Item Group") + ":Link/Item Group:100", _("Brand") + ":Link/Brand:100", _("Warehouse") + ":Link/Warehouse:120",
+ _("UOM") + ":Link/UOM:100", _("Actual Qty") + ":Float:100", _("Planned Qty") + ":Float:100",
+ _("Requested Qty") + ":Float:110", _("Ordered Qty") + ":Float:100", _("Reserved Qty") + ":Float:100",
+ _("Projected Qty") + ":Float:100", _("Reorder Level") + ":Float:100", _("Reorder Qty") + ":Float:100",
+ _("Shortage Qty") + ":Float:100"]
def get_item_conditions(filters):
conditions = []
diff --git a/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py b/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py
index 22b4ec6..04beb6a 100644
--- a/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py
+++ b/erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
from frappe.utils import flt
def execute(filters=None):
@@ -40,12 +41,12 @@
def get_columns(filters):
"""return columns based on filters"""
- columns = ["Item:Link/Item:100"] + ["Item Name::100"] + \
- ["Description::150"] + ["UOM:Link/UOM:90"] + \
- ["Consumed Qty:Float:110"] + ["Consumed Amount:Currency:130"] + \
- ["Delivered Qty:Float:110"] + ["Delivered Amount:Currency:130"] + \
- ["Total Qty:Float:110"] + ["Total Amount:Currency:130"] + \
- ["Supplier(s)::250"]
+ columns = [_("Item") + ":Link/Item:100"] + [_("Item Name") + "::100"] + \
+ [_("Description") + "::150"] + [_("UOM") + ":Link/UOM:90"] + \
+ [_("Consumed Qty") + ":Float:110"] + [_("Consumed Amount") + ":Currency:130"] + \
+ [_("Delivered Qty") + ":Float:110"] + [_("Delivered Amount") + ":Currency:130"] + \
+ [_("Total Qty") + ":Float:110"] + [_("Total Amount") + ":Currency:130"] + \
+ [_("Supplier(s)") + "::250"]
return columns
diff --git a/erpnext/support/page/support_analytics/support_analytics.js b/erpnext/support/page/support_analytics/support_analytics.js
index b9db1f8..6676025 100644
--- a/erpnext/support/page/support_analytics/support_analytics.js
+++ b/erpnext/support/page/support_analytics/support_analytics.js
@@ -28,7 +28,7 @@
filters: [
{fieldtype:"Select", label: __("Fiscal Year"), link:"Fiscal Year",
- default_value: "Select Fiscal Year..."},
+ default_value: __("Select Fiscal Year") + "..."},
{fieldtype:"Date", label: __("From Date")},
{fieldtype:"Label", label: __("To")},
{fieldtype:"Date", label: __("To Date")},