From 50f6afd588e08b75a22989fe85d31ba72fe0052f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 9 Apr 2024 15:25:36 +0530 Subject: [PATCH] fix: Fetch outstanding and total amount for reference journal entry (cherry picked from commit f331f9b15cd219ecafddb71ffd8e3367d731ae3b) # Conflicts: # erpnext/accounts/doctype/payment_entry/payment_entry.js # erpnext/accounts/doctype/payment_entry/payment_entry.py --- .../doctype/payment_entry/payment_entry.js | 9 +++ .../doctype/payment_entry/payment_entry.py | 63 ++++++++++++------- .../payment_entry/test_payment_entry.py | 4 +- .../payment_request/payment_request.py | 6 +- 4 files changed, 58 insertions(+), 24 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index c0716ff19ae..6909ca2b04b 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -1395,8 +1395,17 @@ frappe.ui.form.on('Payment Entry Reference', { args: { reference_doctype: row.reference_doctype, reference_name: row.reference_name, +<<<<<<< HEAD party_account_currency: frm.doc.payment_type=="Receive" ? frm.doc.paid_from_account_currency : frm.doc.paid_to_account_currency +======= + party_account_currency: + frm.doc.payment_type == "Receive" + ? frm.doc.paid_from_account_currency + : frm.doc.paid_to_account_currency, + party_type: frm.doc.party_type, + party: frm.doc.party, +>>>>>>> f331f9b15c (fix: Fetch outstanding and total amount for reference journal entry) }, callback: function(r, rt) { if(r.message) { diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 370e1deaa40..0182e80c59d 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -348,7 +348,11 @@ class PaymentEntry(AccountsController): continue ref_details = get_reference_details( - d.reference_doctype, d.reference_name, self.party_account_currency + d.reference_doctype, + d.reference_name, + self.party_account_currency, + self.party_type, + self.party, ) # Only update exchange rate when the reference is Journal Entry @@ -1883,34 +1887,48 @@ def get_company_defaults(company): return frappe.get_cached_value("Company", company, fields, as_dict=1) -def get_outstanding_on_journal_entry(name): - gl = frappe.qb.DocType("GL Entry") - res = ( - frappe.qb.from_(gl) - .select( - Case() - .when( - gl.party_type == "Customer", - Coalesce(Sum(gl.debit_in_account_currency - gl.credit_in_account_currency), 0), - ) - .else_(Coalesce(Sum(gl.credit_in_account_currency - gl.debit_in_account_currency), 0)) - .as_("outstanding_amount") - ) +def get_outstanding_on_journal_entry(voucher_no, party_type, party): + ple = frappe.qb.DocType("Payment Ledger Entry") + + outstanding = ( + frappe.qb.from_(ple) + .select(Sum(ple.amount_in_account_currency)) .where( - (Coalesce(gl.party_type, "") != "") - & (gl.is_cancelled == 0) - & ((gl.voucher_no == name) | (gl.against_voucher == name)) + (ple.against_voucher_no == voucher_no) + & (ple.party_type == party_type) + & (ple.party == party) + & (ple.delinked == 0) ) - ).run(as_dict=True) + ).run() - outstanding_amount = res[0].get("outstanding_amount", 0) if res else 0 + outstanding_amount = outstanding[0][0] if outstanding else 0 - return outstanding_amount + total = ( + frappe.qb.from_(ple) + .select(Sum(ple.amount_in_account_currency)) + .where( + (ple.voucher_no == voucher_no) + & (ple.party_type == party_type) + & (ple.party == party) + & (ple.delinked == 0) + ) + ).run() + + total_amount = total[0][0] if total else 0 + + return outstanding_amount, total_amount @frappe.whitelist() +<<<<<<< HEAD def get_reference_details(reference_doctype, reference_name, party_account_currency): total_amount = outstanding_amount = exchange_rate = None +======= +def get_reference_details( + reference_doctype, reference_name, party_account_currency, party_type=None, party=None +): + total_amount = outstanding_amount = exchange_rate = account = None +>>>>>>> f331f9b15c (fix: Fetch outstanding and total amount for reference journal entry) ref_doc = frappe.get_doc(reference_doctype, reference_name) company_currency = ref_doc.get("company_currency") or erpnext.get_company_currency(ref_doc.company) @@ -1920,12 +1938,13 @@ def get_reference_details(reference_doctype, reference_name, party_account_curre exchange_rate = 1 elif reference_doctype == "Journal Entry" and ref_doc.docstatus == 1: - total_amount = ref_doc.get("total_amount") if ref_doc.multi_currency: exchange_rate = get_exchange_rate(party_account_currency, company_currency, ref_doc.posting_date) else: exchange_rate = 1 - outstanding_amount = get_outstanding_on_journal_entry(reference_name) + outstanding_amount, total_amount = get_outstanding_on_journal_entry( + reference_name, party_type, party + ) elif reference_doctype != "Journal Entry": if not total_amount: diff --git a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py index c600198999e..28dfae29966 100644 --- a/erpnext/accounts/doctype/payment_entry/test_payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/test_payment_entry.py @@ -1087,7 +1087,9 @@ class TestPaymentEntry(FrappeTestCase): pe.source_exchange_rate = 50 pe.save() - ref_details = get_reference_details(so.doctype, so.name, pe.paid_from_account_currency) + ref_details = get_reference_details( + so.doctype, so.name, pe.paid_from_account_currency, "Customer", so.customer + ) expected_response = { "total_amount": 5000.0, "outstanding_amount": 5000.0, diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 583735b1cc6..0fa2e7835eb 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -596,7 +596,11 @@ def update_payment_req_status(doc, method): if payment_request_name: ref_details = get_reference_details( - ref.reference_doctype, ref.reference_name, doc.party_account_currency + ref.reference_doctype, + ref.reference_name, + doc.party_account_currency, + doc.party_type, + doc.party, ) pay_req_doc = frappe.get_doc("Payment Request", payment_request_name) status = pay_req_doc.status