From 0b031cdd6c5c57a94a0ee20fb95b10e4dfb11194 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 16 Sep 2015 12:46:54 +0530 Subject: [PATCH 1/2] [fix] ignore journal entry based invoice in payment tool and payment reconciliation tool --- .../payment_reconciliation/payment_reconciliation.py | 1 + .../accounts/doctype/payment_tool/payment_tool.py | 12 ++++++------ erpnext/accounts/utils.py | 9 ++++++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py index b283c8fcb6..09bd7d2cc8 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py @@ -79,6 +79,7 @@ class PaymentReconciliation(Document): `tabGL Entry` where party_type = %(party_type)s and party = %(party)s + and voucher_type != "Journal Entry" and account = %(account)s and {dr_or_cr} > 0 {cond} group by voucher_type, voucher_no """.format(**{ diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.py b/erpnext/accounts/doctype/payment_tool/payment_tool.py index 924fd1e1c6..eedf69fe5d 100644 --- a/erpnext/accounts/doctype/payment_tool/payment_tool.py +++ b/erpnext/accounts/doctype/payment_tool/payment_tool.py @@ -58,7 +58,7 @@ def get_outstanding_vouchers(args): frappe.throw(_("No permission to use Payment Tool"), frappe.PermissionError) args = json.loads(args) - + party_account_currency = frappe.db.get_value("Account", args.get("party_account"), "account_currency") company_currency = frappe.db.get_value("Company", args.get("company"), "default_currency") @@ -71,18 +71,18 @@ def get_outstanding_vouchers(args): # Get all outstanding sales /purchase invoices outstanding_invoices = get_outstanding_invoices(amount_query, args.get("party_account"), - args.get("party_type"), args.get("party")) + args.get("party_type"), args.get("party"), with_journal_entry=False) # 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"), + orders_to_be_billed = get_orders_to_be_billed(args.get("party_type"), args.get("party"), party_account_currency, company_currency) return outstanding_invoices + orders_to_be_billed def get_orders_to_be_billed(party_type, party, party_account_currency, company_currency): voucher_type = 'Sales Order' if party_type == "Customer" else 'Purchase Order' - + ref_field = "base_grand_total" if party_account_currency == company_currency else "grand_total" - + orders = frappe.db.sql(""" select name as voucher_no, @@ -115,7 +115,7 @@ def get_against_voucher_amount(against_voucher_type, against_voucher_no, party_a party_account_currency = frappe.db.get_value("Account", party_account, "account_currency") company_currency = frappe.db.get_value("Company", company, "default_currency") ref_field = "base_grand_total" if party_account_currency == company_currency else "grand_total" - + if against_voucher_type in ["Sales Order", "Purchase Order"]: select_cond = "{0} as total_amount, ifnull({0}, 0) - ifnull(advance_paid, 0) as outstanding_amount"\ .format(ref_field) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 89ff6cff15..e1bb9ead33 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -100,7 +100,7 @@ def get_balance_on(account=None, date=None, party_type=None, party=None, in_acco if party_type and party: cond.append("""gle.party_type = "%s" and gle.party = "%s" """ % (party_type.replace('"', '\\"'), party.replace('"', '\\"'))) - + if account or (party_type and party): if in_account_currency: select_field = "sum(ifnull(debit_in_account_currency, 0)) - sum(ifnull(credit_in_account_currency, 0))" @@ -202,7 +202,7 @@ def update_against_doc(d, jv_obj): select cost_center, balance, against_account, is_advance, account_type, exchange_rate from `tabJournal Entry Account` where name = %s """, d['voucher_detail_no'], as_dict=True) - + # new entry with balance amount ch = jv_obj.append("accounts") ch.account = d['account'] @@ -392,7 +392,7 @@ def get_stock_rbnb_difference(posting_date, company): # Amount should be credited return flt(stock_rbnb) + flt(sys_bal) -def get_outstanding_invoices(amount_query, account, party_type, party): +def get_outstanding_invoices(amount_query, account, party_type, party, with_journal_entry=True): all_outstanding_vouchers = [] outstanding_voucher_list = frappe.db.sql(""" select @@ -420,6 +420,9 @@ def get_outstanding_invoices(amount_query, account, party_type, party): payment_amount = -1*payment_amount[0][0] if payment_amount else 0 precision = frappe.get_precision("Sales Invoice", "outstanding_amount") + if not with_journal_entry and d.voucher_type=="Journal Entry": + continue + if d.invoice_amount > payment_amount: all_outstanding_vouchers.append({ From 12106725fb55bbc36c334e9cdedaf0a63df28bd3 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 17 Sep 2015 12:59:44 +0530 Subject: [PATCH 2/2] [fix] set Payment Amount in Payment Tool --- .../doctype/payment_tool/payment_tool.js | 45 ++++++++++++++----- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/doctype/payment_tool/payment_tool.js b/erpnext/accounts/doctype/payment_tool/payment_tool.js index dcf657a819..0b4fb2dade 100644 --- a/erpnext/accounts/doctype/payment_tool/payment_tool.js +++ b/erpnext/accounts/doctype/payment_tool/payment_tool.js @@ -25,8 +25,14 @@ frappe.ui.form.on("Payment Tool", "onload", function(frm) { }); frm.set_query("against_voucher_type", "vouchers", function() { + if (frm.doc.party_type=="Customer") { + var doctypes = ["Sales Order", "Sales Invoice", "Journal Entry"]; + } else { + var doctypes = ["Purchase Order", "Purchase Invoice", "Journal Entry"]; + } + return { - filters: {"name": ["in", ["Sales Invoice", "Purchase Invoice", "Journal Entry", "Sales Order", "Purchase Order"]]} + filters: { "name": ["in", doctypes] } }; }); }); @@ -135,6 +141,7 @@ frappe.ui.form.on("Payment Tool", "get_outstanding_vouchers", function(frm) { c.against_voucher_no = d.voucher_no; c.total_amount = d.invoice_amount; c.outstanding_amount = d.outstanding_amount; + c.payment_amount = d.outstanding_amount; }); } refresh_field("vouchers"); @@ -145,25 +152,39 @@ frappe.ui.form.on("Payment Tool", "get_outstanding_vouchers", function(frm) { }); // validate against_voucher_type -frappe.ui.form.on("Payment Tool Detail", "against_voucher_type", function(frm) { - erpnext.payment_tool.validate_against_voucher(frm); +frappe.ui.form.on("Payment Tool Detail", "against_voucher_type", function(frm, cdt, cdn) { + var row = frappe.model.get_doc(cdt, cdn); + erpnext.payment_tool.validate_against_voucher(frm, row); }); -erpnext.payment_tool.validate_against_voucher = function(frm) { - $.each(frm.doc.vouchers || [], function(i, row) { +erpnext.payment_tool.validate_against_voucher = function(frm, row) { + var _validate = function(i, row) { + if (!row.against_voucher_type) { + return; + } + if(frm.doc.party_type=="Customer" && !in_list(["Sales Order", "Sales Invoice", "Journal Entry"], 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 Entry")) + frappe.msgprint(__("Against Voucher Type must be one of Sales Order, Sales Invoice or Journal Entry")); + return false; } if(frm.doc.party_type=="Supplier" && !in_list(["Purchase Order", "Purchase Invoice", "Journal Entry"], 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 Entry")) + frappe.msgprint(__("Against Voucher Type must be one of Purchase Order, Purchase Invoice or Journal Entry")); + return false; } - }); + } + + if (row) { + _validate(0, row); + } else { + $.each(frm.doc.vouchers || [], _validate); + } + } // validate against_voucher_type @@ -178,14 +199,16 @@ frappe.ui.form.on("Payment Tool Detail", "against_voucher_no", function(frm, cdt args: { "against_voucher_type": row.against_voucher_type, "against_voucher_no": row.against_voucher_no, - "party_account": self.party_account, - "company": self.company + "party_account": frm.doc.party_account, + "company": frm.doc.company }, callback: function(r) { if(!r.exc) { $.each(r.message, function(k, v) { frappe.model.set_value(cdt, cdn, k, v); }); + + frappe.model.set_value(cdt, cdn, "payment_amount", r.message.outstanding_amount); } } }); @@ -208,7 +231,7 @@ erpnext.payment_tool.set_total_payment_amount = function(frm) { } 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) + 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);