From 7f32cbeb0690c2a8d8d8fa78d54e9ef3f9ccacdc Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 29 May 2014 20:09:04 +0530 Subject: [PATCH] Total valuation for manufactured or repacked item(s) can not be less than total valuation of raw materials #1688 --- .../stock/doctype/stock_entry/stock_entry.py | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 1d04a7dbc3..c613e4ea11 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -41,6 +41,7 @@ class StockEntry(StockController): 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 @@ class StockEntry(StockController): 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 @@ class StockEntry(StockController): 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):