From 45d5f6e00a231be0511ff541df6d778b3c2a347e Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 1 Apr 2024 21:21:46 +0530 Subject: [PATCH 1/2] fix: Multiple partial payment requests against Purchase Invoice --- .../payment_request/payment_request.py | 25 +++++----- .../payment_request/test_payment_request.py | 47 +++++++++++++++++++ 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 196838ac4c9..dfc59c1edb8 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -341,21 +341,12 @@ class PaymentRequest(Document): } ) + payment_entry.received_amount = payment_entry.base_paid_amount + payment_entry.get("references")[0].allocated_amount = payment_entry.base_paid_amount + for dimension in get_accounting_dimensions(): payment_entry.update({dimension: self.get(dimension)}) - if payment_entry.difference_amount: - company_details = get_company_defaults(ref_doc.company) - - payment_entry.append( - "deductions", - { - "account": company_details.exchange_gain_loss_account, - "cost_center": company_details.cost_center, - "amount": payment_entry.difference_amount, - }, - ) - if submit: payment_entry.insert(ignore_permissions=True) payment_entry.submit() @@ -485,6 +476,12 @@ def make_payment_request(**args): pr = frappe.get_doc("Payment Request", draft_payment_request) else: pr = frappe.new_doc("Payment Request") + + if not args.get("payment_request_type"): + args["payment_request_type"] = ( + "Outward" if args.get("dt") in ["Purchase Order", "Purchase Invoice"] else "Inward" + ) + pr.update( { "payment_gateway_account": gateway_account.get("name"), @@ -544,9 +541,9 @@ def get_amount(ref_doc, payment_account=None): elif dt in ["Sales Invoice", "Purchase Invoice"]: if not ref_doc.get("is_pos"): if ref_doc.party_account_currency == ref_doc.currency: - grand_total = flt(ref_doc.outstanding_amount) + grand_total = flt(ref_doc.grand_total) else: - grand_total = flt(ref_doc.outstanding_amount) / ref_doc.conversion_rate + grand_total = flt(ref_doc.base_grand_total) / ref_doc.conversion_rate elif dt == "Sales Invoice": for pay in ref_doc.payments: if pay.type == "Phone" and pay.account == payment_account: diff --git a/erpnext/accounts/doctype/payment_request/test_payment_request.py b/erpnext/accounts/doctype/payment_request/test_payment_request.py index 70de886ba4d..932060895b0 100644 --- a/erpnext/accounts/doctype/payment_request/test_payment_request.py +++ b/erpnext/accounts/doctype/payment_request/test_payment_request.py @@ -86,6 +86,8 @@ class TestPaymentRequest(unittest.TestCase): pr = make_payment_request( dt="Purchase Invoice", dn=si_usd.name, + party_type="Supplier", + party="_Test Supplier USD", recipient_id="user@example.com", mute_email=1, payment_gateway_account="_Test Gateway - USD", @@ -98,6 +100,51 @@ class TestPaymentRequest(unittest.TestCase): self.assertEqual(pr.status, "Paid") + def test_multiple_payment_entry_against_purchase_invoice(self): + purchase_invoice = make_purchase_invoice( + customer="_Test Supplier USD", + debit_to="_Test Payable USD - _TC", + currency="USD", + conversion_rate=50, + ) + + pr = make_payment_request( + dt="Purchase Invoice", + party_type="Supplier", + party="_Test Supplier USD", + dn=purchase_invoice.name, + recipient_id="user@example.com", + mute_email=1, + payment_gateway_account="_Test Gateway - USD", + return_doc=1, + ) + + pr.grand_total = pr.grand_total / 2 + + pr.submit() + pr.create_payment_entry() + + purchase_invoice.load_from_db() + self.assertEqual(purchase_invoice.status, "Partly Paid") + + pr = make_payment_request( + dt="Purchase Invoice", + party_type="Supplier", + party="_Test Supplier USD", + dn=purchase_invoice.name, + recipient_id="user@example.com", + mute_email=1, + payment_gateway_account="_Test Gateway - USD", + return_doc=1, + ) + + pr.save() + pr.submit() + pr.create_payment_entry() + + purchase_invoice.load_from_db() + self.assertEqual(purchase_invoice.status, "Paid") + def test_payment_entry(self): frappe.db.set_value( "Company", "_Test Company", "exchange_gain_loss_account", "_Test Exchange Gain/Loss - _TC" From 071e5ed648b3627ac5594aecb7601f6909540e1f Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Mon, 15 Apr 2024 20:49:40 +0530 Subject: [PATCH 2/2] fix: Test case --- .../doctype/payment_request/payment_request.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index c152ff010d9..41ed66c5c92 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -92,7 +92,7 @@ class PaymentRequest(Document): self.status = "Draft" self.validate_reference_document() self.validate_payment_request_amount() - self.validate_currency() + # self.validate_currency() self.validate_subscription_details() def validate_reference_document(self): @@ -335,8 +335,13 @@ class PaymentRequest(Document): } ) - payment_entry.received_amount = payment_entry.base_paid_amount - payment_entry.get("references")[0].allocated_amount = payment_entry.base_paid_amount + if party_account_currency == ref_doc.company_currency and party_account_currency != self.currency: + amount = payment_entry.base_paid_amount + else: + amount = self.grand_total + + payment_entry.received_amount = amount + payment_entry.get("references")[0].allocated_amount = amount for dimension in get_accounting_dimensions(): payment_entry.update({dimension: self.get(dimension)})