From a9064f98066d005908e20bbc5734b5a67d9ca4ec Mon Sep 17 00:00:00 2001 From: Devin Slauenwhite Date: Thu, 8 Dec 2022 10:45:51 -0500 Subject: [PATCH 1/5] fix: set_amounts after deductions and losses are set --- erpnext/accounts/utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 41702d65b497..0227598bf697 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -611,11 +611,6 @@ def update_reference_in_payment_entry(d, payment_entry, do_not_save=False): new_row.docstatus = 1 new_row.update(reference_details) - payment_entry.flags.ignore_validate_update_after_submit = True - payment_entry.setup_party_account_field() - payment_entry.set_missing_values() - payment_entry.set_amounts() - if d.difference_amount and d.difference_account: account_details = { "account": d.difference_account, @@ -627,6 +622,11 @@ def update_reference_in_payment_entry(d, payment_entry, do_not_save=False): payment_entry.set_gain_or_loss(account_details=account_details) + payment_entry.flags.ignore_validate_update_after_submit = True + payment_entry.setup_party_account_field() + payment_entry.set_missing_values() + payment_entry.set_amounts() + if not do_not_save: payment_entry.save(ignore_permissions=True) From 32d8388bd2808eaafe3e1535024a2af2b43ce721 Mon Sep 17 00:00:00 2001 From: Devin Slauenwhite Date: Thu, 8 Dec 2022 14:20:21 -0500 Subject: [PATCH 2/5] test: difference_amount changes after update_references_in_payment_entry --- erpnext/accounts/test/test_utils.py | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/erpnext/accounts/test/test_utils.py b/erpnext/accounts/test/test_utils.py index 882cd694a326..7e6a837178df 100644 --- a/erpnext/accounts/test/test_utils.py +++ b/erpnext/accounts/test/test_utils.py @@ -1,3 +1,4 @@ +import copy import unittest import frappe @@ -12,6 +13,9 @@ from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry +from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice +from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry +from erpnext.accounts.utils import update_reference_in_payment_entry class TestUtils(unittest.TestCase): @@ -73,6 +77,40 @@ def test_stock_voucher_sorting(self): sorted_vouchers = sort_stock_vouchers_by_posting_date(list(reversed(vouchers))) self.assertEqual(sorted_vouchers, vouchers) + def test_update_reference_in_payment_entry(self): + item = make_item().name + + purchase_invoice = make_purchase_invoice(**{ + "item": item, + "supplier": "_Test Supplier USD", + "currency": "USD", + "conversion_rate": 82.32 + }) + purchase_invoice.submit() + + payment_entry = get_payment_entry(purchase_invoice.doctype, purchase_invoice.name) + payment_entry.target_exchange_rate = 62.9 + payment_entry.paid_amount = 15725 + payment_entry.deductions = [] + payment_entry.insert() + + self.assertEqual(payment_entry.difference_amount, -4855.00) + payment_entry.references = [] + + update_reference_in_payment_entry(frappe._dict({ + "against_voucher_type": purchase_invoice.doctype, + "against_voucher": purchase_invoice.name, + "grand_total": purchase_invoice.grand_total, + "outstanding": purchase_invoice.outstanding_amount, + "allocated_amount": purchase_invoice.outstanding_amount, + "exchange_rate": purchase_invoice.conversion_rate, + "difference_amount": -4855.00, + "difference_account": "Exchange Gain/Loss - _TC" + }), payment_entry, do_not_save=True) + + self.assertEqual(len(payment_entry.references), 1) + self.assertEqual(payment_entry.difference_amount, 0) + ADDRESS_RECORDS = [ { From 6eaaebb638d5b93dc2d851e33df865f201868944 Mon Sep 17 00:00:00 2001 From: Devin Slauenwhite Date: Thu, 8 Dec 2022 14:24:22 -0500 Subject: [PATCH 3/5] chore: linter --- erpnext/accounts/test/test_utils.py | 41 ++++++++++++++++------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/erpnext/accounts/test/test_utils.py b/erpnext/accounts/test/test_utils.py index 7e6a837178df..56b1086f05ef 100644 --- a/erpnext/accounts/test/test_utils.py +++ b/erpnext/accounts/test/test_utils.py @@ -4,18 +4,18 @@ import frappe from frappe.test_runner import make_test_objects +from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry +from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.party import get_party_shipping_address from erpnext.accounts.utils import ( get_future_stock_vouchers, get_voucherwise_gl_entries, sort_stock_vouchers_by_posting_date, + update_reference_in_payment_entry, ) from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry -from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice -from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry -from erpnext.accounts.utils import update_reference_in_payment_entry class TestUtils(unittest.TestCase): @@ -80,12 +80,9 @@ def test_stock_voucher_sorting(self): def test_update_reference_in_payment_entry(self): item = make_item().name - purchase_invoice = make_purchase_invoice(**{ - "item": item, - "supplier": "_Test Supplier USD", - "currency": "USD", - "conversion_rate": 82.32 - }) + purchase_invoice = make_purchase_invoice( + **{"item": item, "supplier": "_Test Supplier USD", "currency": "USD", "conversion_rate": 82.32} + ) purchase_invoice.submit() payment_entry = get_payment_entry(purchase_invoice.doctype, purchase_invoice.name) @@ -97,16 +94,22 @@ def test_update_reference_in_payment_entry(self): self.assertEqual(payment_entry.difference_amount, -4855.00) payment_entry.references = [] - update_reference_in_payment_entry(frappe._dict({ - "against_voucher_type": purchase_invoice.doctype, - "against_voucher": purchase_invoice.name, - "grand_total": purchase_invoice.grand_total, - "outstanding": purchase_invoice.outstanding_amount, - "allocated_amount": purchase_invoice.outstanding_amount, - "exchange_rate": purchase_invoice.conversion_rate, - "difference_amount": -4855.00, - "difference_account": "Exchange Gain/Loss - _TC" - }), payment_entry, do_not_save=True) + update_reference_in_payment_entry( + frappe._dict( + { + "against_voucher_type": purchase_invoice.doctype, + "against_voucher": purchase_invoice.name, + "grand_total": purchase_invoice.grand_total, + "outstanding": purchase_invoice.outstanding_amount, + "allocated_amount": purchase_invoice.outstanding_amount, + "exchange_rate": purchase_invoice.conversion_rate, + "difference_amount": -4855.00, + "difference_account": "Exchange Gain/Loss - _TC", + } + ), + payment_entry, + do_not_save=True, + ) self.assertEqual(len(payment_entry.references), 1) self.assertEqual(payment_entry.difference_amount, 0) From 5e35329c297897a5dbb1cf42150b271efa378108 Mon Sep 17 00:00:00 2001 From: Devin Slauenwhite Date: Fri, 16 Dec 2022 08:38:09 -0500 Subject: [PATCH 4/5] fix: use kwargs instad of destructing a dict [skip ci] --- erpnext/accounts/test/test_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/test/test_utils.py b/erpnext/accounts/test/test_utils.py index 56b1086f05ef..c74c1c2021e1 100644 --- a/erpnext/accounts/test/test_utils.py +++ b/erpnext/accounts/test/test_utils.py @@ -81,7 +81,7 @@ def test_update_reference_in_payment_entry(self): item = make_item().name purchase_invoice = make_purchase_invoice( - **{"item": item, "supplier": "_Test Supplier USD", "currency": "USD", "conversion_rate": 82.32} + item=item, supplier="_Test Supplier USD", currency="USD", conversion_rate=82.32 ) purchase_invoice.submit() From a57f3e41e39f27454be73e15a9815c526729f3c5 Mon Sep 17 00:00:00 2001 From: Devin Slauenwhite Date: Wed, 28 Dec 2022 13:31:54 -0500 Subject: [PATCH 5/5] fix(test): test payment entry difference_amount after payment reconciliation. --- erpnext/accounts/test/test_utils.py | 41 +++++++++++++++++------------ 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/erpnext/accounts/test/test_utils.py b/erpnext/accounts/test/test_utils.py index 318a5f53f627..3aca60eae5bd 100644 --- a/erpnext/accounts/test/test_utils.py +++ b/erpnext/accounts/test/test_utils.py @@ -3,11 +3,14 @@ import frappe from frappe.test_runner import make_test_objects +from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry +from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.party import get_party_shipping_address from erpnext.accounts.utils import ( get_future_stock_vouchers, get_voucherwise_gl_entries, sort_stock_vouchers_by_posting_date, + update_reference_in_payment_entry, ) from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt @@ -89,24 +92,28 @@ def test_update_reference_in_payment_entry(self): self.assertEqual(payment_entry.difference_amount, -4855.00) payment_entry.references = [] - - update_reference_in_payment_entry( - frappe._dict( - { - "against_voucher_type": purchase_invoice.doctype, - "against_voucher": purchase_invoice.name, - "grand_total": purchase_invoice.grand_total, - "outstanding": purchase_invoice.outstanding_amount, - "allocated_amount": purchase_invoice.outstanding_amount, - "exchange_rate": purchase_invoice.conversion_rate, - "difference_amount": -4855.00, - "difference_account": "Exchange Gain/Loss - _TC", - } - ), - payment_entry, - do_not_save=True, + payment_entry.submit() + + payment_reconciliation = frappe.new_doc("Payment Reconciliation") + payment_reconciliation.company = payment_entry.company + payment_reconciliation.party_type = "Supplier" + payment_reconciliation.party = purchase_invoice.supplier + payment_reconciliation.receivable_payable_account = payment_entry.paid_to + payment_reconciliation.get_unreconciled_entries() + payment_reconciliation.allocate_entries( + { + "payments": [d.__dict__ for d in payment_reconciliation.payments], + "invoices": [d.__dict__ for d in payment_reconciliation.invoices], + } ) - + for d in payment_reconciliation.invoices: + # Reset invoice outstanding_amount because allocate_entries will zero this value out. + d.outstanding_amount = d.amount + for d in payment_reconciliation.allocation: + d.difference_account = "Exchange Gain/Loss - _TC" + payment_reconciliation.reconcile() + + payment_entry.load_from_db() self.assertEqual(len(payment_entry.references), 1) self.assertEqual(payment_entry.difference_amount, 0)