fix: disallow material transfer if source and target warehouse are same (#48697)

* fix: disallow material transfer if source and target warehouse are same

* fix: check on child row level instead of parent level

(cherry picked from commit 7b8bb4f959)

# Conflicts:
#	erpnext/stock/doctype/stock_entry/stock_entry.py
This commit is contained in:
Mihir Kandoi
2025-11-04 13:50:52 +05:30
committed by Mergify
parent eed1abd272
commit ff1692654d

View File

@@ -241,6 +241,16 @@ class StockEntry(StockController):
self.reset_default_field_value("from_warehouse", "items", "s_warehouse") self.reset_default_field_value("from_warehouse", "items", "s_warehouse")
self.reset_default_field_value("to_warehouse", "items", "t_warehouse") self.reset_default_field_value("to_warehouse", "items", "t_warehouse")
<<<<<<< HEAD
=======
self.validate_same_source_target_warehouse_during_material_transfer()
self.validate_closed_subcontracting_order()
self.validate_subcontract_order()
super().validate_subcontracting_inward()
>>>>>>> 7b8bb4f959 (fix: disallow material transfer if source and target warehouse are same (#48697))
def on_submit(self): def on_submit(self):
self.validate_closed_subcontracting_order() self.validate_closed_subcontracting_order()
self.make_bundle_using_old_serial_batch_fields() self.make_bundle_using_old_serial_batch_fields()
@@ -796,6 +806,41 @@ class StockEntry(StockController):
title=_("Missing Item"), title=_("Missing Item"),
) )
def validate_same_source_target_warehouse_during_material_transfer(self):
from erpnext.stock.doctype.inventory_dimension.inventory_dimension import get_inventory_dimensions
inventory_dimensions = get_inventory_dimensions()
if self.purpose == "Material Transfer":
for item in self.items:
if item.s_warehouse == item.t_warehouse:
if not inventory_dimensions:
frappe.throw(
_("Source and Target Warehouse cannot be the same for Material Transfer"),
title=_("Invalid Source and Target Warehouse"),
)
else:
difference_found = False
for dimension in inventory_dimensions:
fieldname = (
dimension.source_fieldname
if dimension.source_fieldname.startswith("to_")
else f"to_{dimension.source_fieldname}"
)
if (
item.get(dimension.source_fieldname)
and item.get(fieldname)
and item.get(dimension.source_fieldname) != item.get(fieldname)
):
difference_found = True
break
if not difference_found:
frappe.throw(
_(
"Row #{0}: Source, Target Warehouse and Inventory Dimensions cannot be the exact same for Material Transfer"
).format(item.idx),
title=_("Invalid Source and Target Warehouse"),
)
def get_matched_items(self, item_code): def get_matched_items(self, item_code):
for row in self.items: for row in self.items:
if row.item_code == item_code or row.original_item == item_code: if row.item_code == item_code or row.original_item == item_code: