From efa5173964e01ecf72284489cfca1f0518295668 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 7dfe9041506..4e0079abf02 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -547,6 +547,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 aa4668923b8..f533af61b9e 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -1330,6 +1330,55 @@ class TestPurchaseOrder(IntegrationTestCase): 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 (