From f462639aa0080429370507e0a53d939643362ea5 Mon Sep 17 00:00:00 2001 From: kavin-114 Date: Thu, 29 Jan 2026 00:20:23 +0530 Subject: [PATCH 1/2] fix(stock): set incoming_rate with lcv rate for internal purchase (cherry picked from commit f0dccc3cd7c797a62bbbba4894857dbbe9a60981) --- erpnext/stock/stock_ledger.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 7a9a2ad273a..347b8bf9acc 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -2328,6 +2328,7 @@ def get_incoming_rate_for_inter_company_transfer(sle) -> float: For inter company transfer, incoming rate is the average of the outgoing rate """ rate = 0.0 + lcv_rate = 0.0 field = "delivery_note_item" if sle.voucher_type == "Purchase Receipt" else "sales_invoice_item" @@ -2342,7 +2343,15 @@ def get_incoming_rate_for_inter_company_transfer(sle) -> float: "incoming_rate", ) - return rate + # add lcv amount in incoming_rate + lcv_amount = frappe.db.get_value( + f"{sle.voucher_type} Item", sle.voucher_detail_no, "landed_cost_voucher_amount" + ) + + if lcv_amount: + lcv_rate = flt(lcv_amount / abs(sle.actual_qty)) + + return rate + lcv_rate def is_internal_transfer(sle): From 7042f2b8fba6fb74285e07018c7cae8f29680c95 Mon Sep 17 00:00:00 2001 From: kavin-114 Date: Thu, 29 Jan 2026 00:21:02 +0530 Subject: [PATCH 2/2] test: add unit test to check internal purchase with lcv (cherry picked from commit dd4fd89ef84126332552a202a69abe4fa5aad1e3) --- .../purchase_receipt/test_purchase_receipt.py | 78 +++++++++++++++++++ erpnext/stock/stock_ledger.py | 1 - 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index b426b333c02..cf2702d985b 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -5036,6 +5036,84 @@ class TestPurchaseReceipt(IntegrationTestCase): return_pr = make_return_doc("Purchase Receipt", pr.name) self.assertRaises(frappe.ValidationError, return_pr.submit) + def test_internal_purchase_receipt_incoming_rate_with_lcv(self): + """ + To test inter branch transaction incoming rate calculation with lcv after item reposting + """ + from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt + from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note + + prepare_data_for_internal_transfer() + customer = "_Test Internal Customer 2" + company = "_Test Company with perpetual inventory" + item_doc = create_item("_Test Internal PR LCV Item") + lcv_expense_account = "Expenses Included In Valuation - TCP1" + + from_warehouse = create_warehouse("_Test Internal From Warehouse LCV", company=company) + to_warehouse = create_warehouse("_Test Internal To Warehouse LCV", company=company) + + # inward qty for internal transactions + make_purchase_receipt( + item_code=item_doc.item_code, + qty=5, + rate=100, + company="_Test Company with perpetual inventory", + warehouse=from_warehouse, + ) + + idn = create_delivery_note( + item_code=item_doc.name, + company=company, + customer=customer, + cost_center="Main - TCP1", + expense_account="Cost of Goods Sold - TCP1", + qty=5, + rate=100, + warehouse=from_warehouse, + target_warehouse=to_warehouse, + ) + self.assertEqual(idn.items[0].rate, 100) + + ipr = make_inter_company_purchase_receipt(idn.name) + ipr.items[0].warehouse = from_warehouse + self.assertEqual(ipr.items[0].rate, 100) + ipr.submit() + + self.create_lcv(ipr.doctype, ipr.name, company, lcv_expense_account, charges=100) + ipr.reload() + + self.assertEqual(ipr.items[0].landed_cost_voucher_amount, 100) + self.assertEqual(ipr.items[0].valuation_rate, 120) + + # repost the receipt and check the stock ledger values + repost_doc = frappe.new_doc("Repost Item Valuation") + repost_doc.update( + { + "based_on": "Transaction", + "voucher_type": ipr.doctype, + "voucher_no": ipr.name, + "posting_date": ipr.posting_date, + "posting_time": ipr.posting_time, + "company": ipr.company, + "allow_negative_stock": 1, + "via_landed_cost_voucher": 0, + "allow_zero_rate": 0, + } + ) + repost_doc.save() + repost_doc.submit() + + stk_ledger = frappe.db.get_value( + "Stock Ledger Entry", + {"voucher_type": "Purchase Receipt", "voucher_no": ipr.name, "warehouse": from_warehouse}, + ["incoming_rate", "stock_value_difference"], + as_dict=True, + ) + + # check the incoming rate and stock value change + self.assertEqual(stk_ledger.incoming_rate, 120) + self.assertEqual(stk_ledger.stock_value_difference, 600) + def prepare_data_for_internal_transfer(): from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 347b8bf9acc..39cfbf5c516 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -827,7 +827,6 @@ class update_entries_after: if not self.validate_negative_stock(sle): self.wh_data.qty_after_transaction += flt(sle.actual_qty) return - # Get dynamic incoming/outgoing rate if not self.args.get("sle_id"): self.get_dynamic_incoming_outgoing_rate(sle)