From d27fe6f57a380b697dbd9558d4f5ffa335380398 Mon Sep 17 00:00:00 2001 From: Lakshit Jain Date: Tue, 20 Jan 2026 07:50:27 +0530 Subject: [PATCH] Merge pull request #51561 from ljain112/fic-adv-ple-po fix: delete advance ledger entries while reconciling payment entry (cherry picked from commit aea70c5ec1210fcf2d626feca7354e973d170e21) --- erpnext/accounts/utils.py | 1 + .../purchase_order/test_purchase_order.py | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 06685845b58..5a7c6ca9055 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -511,6 +511,7 @@ def reconcile_against_document( doc.make_advance_gl_entries(entry=row) else: _delete_pl_entries(voucher_type, voucher_no) + _delete_adv_pl_entries(voucher_type, voucher_no) gl_map = doc.build_gl_map() # Make sure there is no overallocation from erpnext.accounts.general_ledger import process_debit_credit_difference diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 895df37253f..26ace63872f 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -1297,6 +1297,55 @@ class TestPurchaseOrder(FrappeTestCase): pi = make_pi_from_po(po.name) self.assertEqual(pi.items[0].qty, 50) + def test_multiple_advances_against_purchase_order_are_allocated_across_partial_purchase_invoices(self): + # step - 1: create PO + po = create_purchase_order(qty=10, rate=10) + + # step - 2: create first partial advance payment + pe1 = get_payment_entry("Purchase Order", po.name, bank_account="_Test Bank - _TC") + pe1.reference_no = "1" + pe1.reference_date = nowdate() + pe1.paid_amount = 50 + pe1.references[0].allocated_amount = 50 + pe1.save(ignore_permissions=True).submit() + + # check first advance paid against PO + po.reload() + self.assertEqual(po.advance_paid, 50) + + # step - 3: create first PI for partial qty and allocate first advance + pi_1 = make_pi_from_po(po.name) + pi_1.update_stock = 1 + pi_1.allocate_advances_automatically = 1 + pi_1.items[0].qty = 5 + pi_1.save(ignore_permissions=True).submit() + + # step - 4: create second advance payment for remaining + pe2 = get_payment_entry("Purchase Order", po.name, bank_account="_Test Bank - _TC") + pe2.reference_no = "2" + pe2.reference_date = nowdate() + pe2.paid_amount = 50 + pe2.references[0].allocated_amount = 50 + pe2.save(ignore_permissions=True).submit() + + # check second advance paid against PO + po.reload() + self.assertEqual(po.advance_paid, 100) + + # step - 5: create second PI for remaining qty and allocate second advance + pi_2 = make_pi_from_po(po.name) + pi_2.update_stock = 1 + pi_2.allocate_advances_automatically = 1 + pi_2.save(ignore_permissions=True).submit() + + # check PO and PI status + po.reload() + pi_1.reload() + pi_2.reload() + self.assertEqual(pi_1.status, "Paid") + self.assertEqual(pi_2.status, "Paid") + self.assertEqual(po.status, "Completed") + def create_po_for_sc_testing(): from erpnext.controllers.tests.test_subcontracting_controller import (