Merge pull request #52195 from frappe/mergify/bp/version-15/pr-52191

Add Landed Cost Voucher Amount in Internal Purchase Receipt (backport #52158) (backport #52191)
This commit is contained in:
rohitwaghchaure
2026-01-29 18:17:32 +05:30
committed by GitHub
2 changed files with 88 additions and 2 deletions

View File

@@ -4716,6 +4716,84 @@ class TestPurchaseReceipt(FrappeTestCase):
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

View File

@@ -821,7 +821,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)
@@ -2377,6 +2376,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"
@@ -2391,7 +2391,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):