From 4a26810871db4b2427249fe44dc550d885d2a5ca Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 9 Oct 2025 20:47:00 +0530 Subject: [PATCH] fix: fix: incorrect PR status when using set landed cost based on PI rate --- .../purchase_invoice/test_purchase_invoice.py | 32 +++++++++++++++++++ .../purchase_receipt/purchase_receipt.py | 6 +++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 280d338d56d..cd63a3f757d 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -2629,6 +2629,38 @@ class TestPurchaseInvoice(IntegrationTestCase, StockTestMixin): frappe.db.set_single_value("Buying Settings", "maintain_same_rate", 1) + @IntegrationTestCase.change_settings( + "Buying Settings", {"maintain_same_rate": 0, "set_landed_cost_based_on_purchase_invoice_rate": 1} + ) + def test_pr_status_rate_adjusted_from_pi(self): + pr = make_purchase_receipt(qty=5, rate=100) + pi = create_purchase_invoice_from_receipt(pr.name) + pi.submit() + pr.reload() + + # Inital check + self.assertEqual(pr.status, "Completed") + + pi.reload() + pi.cancel() + pi = create_purchase_invoice_from_receipt(pr.name) + pi.items[0].rate = 80 + pi.submit() + pr.reload() + + # Test 1 : Adjustment amount is negative + self.assertEqual(pr.status, "Completed") + + pi.reload() + pi.cancel() + pi = create_purchase_invoice_from_receipt(pr.name) + pi.items[0].rate = 120 + pi.submit() + pr.reload() + + # Test 2 : Adjustment amount is positive + self.assertEqual(pr.status, "Completed") + def test_opening_invoice_rounding_adjustment_validation(self): pi = make_purchase_invoice(do_not_save=1) pi.items[0].rate = 99.98 diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 3e9ad4c5836..c512ca97eac 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -1215,7 +1215,7 @@ def update_billing_percentage(pr_doc, update_modified=True, adjust_incoming_rate buying_settings = frappe.get_single("Buying Settings") over_billing_allowance = frappe.get_single_value("Accounts Settings", "over_billing_allowance") - total_amount, total_billed_amount = 0, 0 + total_amount, total_billed_amount, pi_landed_cost_amount = 0, 0, 0 item_wise_returned_qty = get_item_wise_returned_qty(pr_doc) if adjust_incoming_rate: @@ -1255,6 +1255,7 @@ def update_billing_percentage(pr_doc, update_modified=True, adjust_incoming_rate ) * item.qty adjusted_amt = flt(adjusted_amt * flt(pr_doc.conversion_rate), item.precision("amount")) + pi_landed_cost_amount += adjusted_amt item.db_set("amount_difference_with_purchase_invoice", adjusted_amt, update_modified=False) elif amount and item.billed_amt > amount: per_over_billed = (flt(item.billed_amt / amount, 2) * 100) - 100 @@ -1265,6 +1266,9 @@ def update_billing_percentage(pr_doc, update_modified=True, adjust_incoming_rate ) ) + if pi_landed_cost_amount < 0: + total_billed_amount += abs(pi_landed_cost_amount) + percent_billed = round(100 * (total_billed_amount / (total_amount or 1)), 6) pr_doc.db_set("per_billed", percent_billed)