Total valuation for manufactured or repacked item(s) can not be less than total valuation of raw materials #1688
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 1d04a7d..c613e4e 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -41,6 +41,7 @@
self.validate_return_reference_doc()
self.validate_with_material_request()
self.validate_fiscal_year()
+ self.validate_valuation_rate()
self.set_total_amount()
def on_submit(self):
@@ -170,6 +171,19 @@
frappe.throw(_("Stock Entries already created for Production Order ")
+ self.production_order + ":" + ", ".join(other_ste), DuplicateEntryForProductionOrderError)
+ def validate_valuation_rate(self):
+ if self.purpose == "Manufacture/Repack":
+ valuation_at_source, valuation_at_target = 0, 0
+ for d in self.get("mtn_details"):
+ if d.s_warehouse and not d.t_warehouse:
+ valuation_at_source += flt(d.amount)
+ if d.t_warehouse and not d.s_warehouse:
+ valuation_at_target += flt(d.amount)
+
+ if valuation_at_target < valuation_at_source:
+ frappe.throw(_("Total valuation for manufactured or repacked item(s) can not be less than \
+ total valuation of raw materials"))
+
def set_total_amount(self):
self.total_amount = sum([flt(item.amount) for item in self.get("mtn_details")])
@@ -202,9 +216,10 @@
if self.production_order and self.purpose == "Manufacture/Repack":
for d in self.get("mtn_details"):
if d.bom_no:
- bom = frappe.db.get_value("BOM", d.bom_no, ["operating_cost", "quantity"], as_dict=1)
- operation_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity)
- d.incoming_rate = operation_cost_per_unit + (raw_material_cost / flt(d.transfer_qty))
+ if not flt(d.incoming_rate):
+ bom = frappe.db.get_value("BOM", d.bom_no, ["operating_cost", "quantity"], as_dict=1)
+ operation_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity)
+ d.incoming_rate = operation_cost_per_unit + (raw_material_cost / flt(d.transfer_qty))
d.amount = flt(d.transfer_qty) * flt(d.incoming_rate)
def get_incoming_rate(self, args):