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):