@@ -533,13 +533,16 @@ def set_incoming_rate(self):
533533 if self .doctype not in ("Delivery Note" , "Sales Invoice" ):
534534 return
535535
536+ from erpnext .stock .serial_batch_bundle import get_batch_nos
537+
536538 allow_at_arms_length_price = frappe .get_cached_value (
537539 "Stock Settings" , None , "allow_internal_transfer_at_arms_length_price"
538540 )
539541 set_zero_rate_for_expired_batch = frappe .db .get_single_value (
540542 "Selling Settings" , "set_zero_rate_for_expired_batch"
541543 )
542544
545+ old_doc = self .get_doc_before_save ()
543546 items = self .get ("items" ) + (self .get ("packed_items" ) or [])
544547 for d in items :
545548 if not frappe .get_cached_value ("Item" , d .item_code , "is_stock_item" ):
@@ -569,6 +572,29 @@ def set_incoming_rate(self):
569572 # Get incoming rate based on original item cost based on valuation method
570573 qty = flt (d .get ("stock_qty" ) or d .get ("actual_qty" ) or d .get ("qty" ))
571574
575+ if old_doc :
576+ old_item = next (
577+ (
578+ item
579+ for item in (old_doc .get ("items" ) + (old_doc .get ("packed_items" ) or []))
580+ if item .name == d .name
581+ ),
582+ None ,
583+ )
584+ if old_item :
585+ old_qty = flt (
586+ old_item .get ("stock_qty" ) or old_item .get ("actual_qty" ) or old_item .get ("qty" )
587+ )
588+ if (
589+ old_item .item_code != d .item_code
590+ or old_item .warehouse != d .warehouse
591+ or old_qty != qty
592+ or old_item .batch_no != d .batch_no
593+ or get_batch_nos (old_item .serial_and_batch_bundle )
594+ != get_batch_nos (d .serial_and_batch_bundle )
595+ ):
596+ d .incoming_rate = 0
597+
572598 if (
573599 not d .incoming_rate
574600 or self .is_internal_transfer ()
0 commit comments