From 1d459c43276ff78bc5a7cdc1f8b18f5df5e0e666 Mon Sep 17 00:00:00 2001 From: tundebabzy Date: Fri, 15 Dec 2017 06:59:27 +0100 Subject: [PATCH] Make Journal entry from Invoice based on Payment Terms (due date) #11989 (#12019) * don"t summarise due_dates query * reference_due_date to fetch outstanding based on due date * use if else so that no need to do useless checks * clear debit and credit fields before fetching outstanding * grid keeps forgetting drop down so add to options * clear debit and credit fields before fetching outstanding properly --- .../doctype/journal_entry/journal_entry.js | 35 ++++++++++++++++--- .../doctype/journal_entry/journal_entry.py | 18 +++++++--- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js index 41000f33b1..e25abfb076 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.js +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js @@ -221,6 +221,7 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ input.empty(); input.add_options(options); frappe.model.set_value(cdt, cdn, "reference_due_date", options[0]); + me.frm.cur_grid.get_field("reference_due_date").df.options = options.join('\n'); me.due_date_options_cache[d.reference_name] = options; } }); @@ -230,20 +231,42 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ if(d.reference_name) { if (d.reference_type==="Purchase Invoice" && !flt(d.debit)) { this.get_outstanding('Purchase Invoice', d.reference_name, doc.company, d); - } - if (d.reference_type==="Sales Invoice" && !flt(d.credit)) { + } else if (d.reference_type==="Sales Invoice" && !flt(d.credit)) { this.get_outstanding('Sales Invoice', d.reference_name, doc.company, d); - } - if (d.reference_type==="Journal Entry" && !flt(d.credit) && !flt(d.debit)) { + } else if (d.reference_type==="Journal Entry" && !flt(d.credit) && !flt(d.debit)) { this.get_outstanding('Journal Entry', d.reference_name, doc.company, d); } + if( in_list(["Sales Invoice", "Purchase Invoice"]), d.reference_type) { get_invoice_due_dates(d.reference_name); } } }, - get_outstanding: function(doctype, docname, company, child) { + reference_due_date: function(doc, cdt, cdn) { + const d = frappe.get_doc(cdt, cdn); + + if (d.reference_type && d.reference_name && d.reference_due_date) { + if (in_list(["Sales Invoice", "Purchase Invoice"], d.reference_type)) { + console.log('cdt:', cdt, cdn); + frappe.model.set_value(cdt, cdn, 'debit_in_account_currency', ''); + frappe.model.set_value(cdt, cdn, 'credit_in_account_currency', ''); + } + if (d.reference_type==="Purchase Invoice") { + this.get_outstanding( + 'Purchase Invoice', d.reference_name, doc.company, d, d.reference_due_date + ); + } else if (d.reference_type==="Sales Invoice") { + this.get_outstanding( + 'Sales Invoice', d.reference_name, doc.company, d, d.reference_due_date + ); + } + + frappe.model.set_value(cdt, cdn, 'reference_due_date', d.reference_due_date); + } + }, + + get_outstanding: function(doctype, docname, company, child, due_date) { var me = this; var args = { "doctype": doctype, @@ -254,6 +277,8 @@ erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({ "company": company } + if (due_date) args.due_date = due_date; + return frappe.call({ method: "erpnext.accounts.doctype.journal_entry.journal_entry.get_outstanding", args: { args: args}, diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 0977037a31..a298ae3ba9 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe, erpnext, json -from frappe.utils import cstr, flt, fmt_money, formatdate +from frappe.utils import cstr, flt, fmt_money, formatdate, getdate from frappe import msgprint, _, scrub from erpnext.controllers.accounts_controller import AccountsController from erpnext.accounts.utils import get_balance_on, get_account_currency @@ -782,8 +782,7 @@ def get_outstanding(args): } elif args.get("doctype") in ("Sales Invoice", "Purchase Invoice"): party_type = "Customer" if args.get("doctype") == "Sales Invoice" else "Supplier" - invoice = frappe.db.get_value(args["doctype"], args["docname"], - ["outstanding_amount", "conversion_rate", scrub(party_type)], as_dict=1) + invoice = frappe.get_doc(args['doctype'], args['docname']).as_dict() exchange_rate = invoice.conversion_rate if (args.get("account_currency") != company_currency) else 1 @@ -794,8 +793,17 @@ def get_outstanding(args): amount_field = "debit_in_account_currency" \ if flt(invoice.outstanding_amount) > 0 else "credit_in_account_currency" + if args.get('due_date'): + outstanding = '' + for d in invoice.payment_schedule: + if d.due_date == getdate(args['due_date']): + outstanding = abs(flt(d.payment_amount)) + break + else: + outstanding = abs(flt(invoice.outstanding_amount)) + return { - amount_field: abs(flt(invoice.outstanding_amount)), + amount_field: outstanding, "exchange_rate": exchange_rate, "party_type": party_type, "party": invoice.get(scrub(party_type)) @@ -902,7 +910,7 @@ def get_average_exchange_rate(account): @frappe.whitelist() def get_invoice_due_dates(name): result = frappe.get_list( - doctype='GL Entry', group_by='name, due_date', + doctype='GL Entry', filters={'voucher_no': name, "ifnull(due_date, '')": ('!=', '')}, fields=['due_date'], distinct=True )