diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 5c2dc7491c2..e661d8afbf4 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -518,6 +518,8 @@ class SellingController(StockController): if self.doctype not in ("Delivery Note", "Sales Invoice"): return + from erpnext.stock.serial_batch_bundle import get_batch_nos + allow_at_arms_length_price = frappe.get_cached_value( "Stock Settings", None, "allow_internal_transfer_at_arms_length_price" ) @@ -525,6 +527,7 @@ class SellingController(StockController): "Selling Settings", "set_zero_rate_for_expired_batch" ) + old_doc = self.get_doc_before_save() items = self.get("items") + (self.get("packed_items") or []) for d in items: if not frappe.get_cached_value("Item", d.item_code, "is_stock_item"): @@ -554,6 +557,29 @@ class SellingController(StockController): # Get incoming rate based on original item cost based on valuation method qty = flt(d.get("stock_qty") or d.get("actual_qty") or d.get("qty")) + if old_doc: + old_item = next( + ( + item + for item in (old_doc.get("items") + (old_doc.get("packed_items") or [])) + if item.name == d.name + ), + None, + ) + if old_item: + old_qty = flt( + old_item.get("stock_qty") or old_item.get("actual_qty") or old_item.get("qty") + ) + if ( + old_item.item_code != d.item_code + or old_item.warehouse != d.warehouse + or old_qty != qty + or old_item.batch_no != d.batch_no + or get_batch_nos(old_item.serial_and_batch_bundle) + != get_batch_nos(d.serial_and_batch_bundle) + ): + d.incoming_rate = 0 + if ( not d.incoming_rate or self.is_internal_transfer()