From 8c3764a6efbe347b7d3511bd6e8010b01eaa128f Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 5 Oct 2016 20:41:29 +0530 Subject: [PATCH] test case for scrap item --- erpnext/manufacturing/doctype/bom/bom.js | 6 +-- erpnext/manufacturing/doctype/bom/bom.json | 6 ++- .../doctype/bom/test_records.json | 15 +++++- .../production_order/test_production_order.py | 40 ++++++++++++++++ .../stock/doctype/stock_entry/stock_entry.py | 48 +++++++++++-------- .../stock/doctype/warehouse/test_records.json | 7 +++ 6 files changed, 96 insertions(+), 26 deletions(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js index 488235482e..ce4c4cbce8 100644 --- a/erpnext/manufacturing/doctype/bom/bom.js +++ b/erpnext/manufacturing/doctype/bom/bom.js @@ -86,7 +86,7 @@ var get_bom_material_detail= function(doc, cdt, cdn) { refresh_field("scrap_items"); doc = locals[doc.doctype][doc.name]; erpnext.bom.calculate_rm_cost(doc); - erpnext.bom.calculate_sm_cost(doc); + erpnext.bom.calculate_scrap_materials_cost(doc); erpnext.bom.calculate_total(doc); }, freeze: true @@ -137,7 +137,7 @@ erpnext.bom.calculate_rm_cost = function(doc) { } //sm : scrap material -erpnext.bom.calculate_sm_cost = function(doc) { +erpnext.bom.calculate_scrap_materials_cost = function(doc) { var sm = doc.scrap_items || []; total_sm_cost = 0; for(var i=0;i 0: d.basic_rate = basic_rate + d.basic_amount = flt(flt(d.transfer_qty) * flt(d.basic_rate), d.precision("basic_amount")) + + if getattr(self, "pro_doc", frappe._dict()).scrap_warehouse == d.t_warehouse: + + scrap_material_cost += flt(d.basic_amount) number_of_fg_items = len([t.t_warehouse for t in self.get("items") if t.t_warehouse]) if (fg_basic_rate == 0.0 and number_of_fg_items == 1) or update_finished_item_rate: - self.set_basic_rate_for_finished_goods(raw_material_cost) + self.set_basic_rate_for_finished_goods(raw_material_cost, scrap_material_cost) - def set_basic_rate_for_finished_goods(self, raw_material_cost): + def set_basic_rate_for_finished_goods(self, raw_material_cost, scrap_material_cost): if self.purpose in ["Manufacture", "Repack"]: for d in self.get("items"): if (d.bom_no or d.t_warehouse) and (getattr(self, "pro_doc", frappe._dict()).scrap_warehouse != d.t_warehouse): - d.basic_rate = flt(raw_material_cost / flt(d.transfer_qty), d.precision("basic_rate")) - d.basic_amount = flt(raw_material_cost, d.precision("basic_amount")) + d.basic_rate = flt((raw_material_cost - scrap_material_cost) / flt(d.transfer_qty), d.precision("basic_rate")) + d.basic_amount = flt((raw_material_cost - scrap_material_cost), d.precision("basic_amount")) def distribute_additional_costs(self): if self.purpose == "Material Issue": @@ -355,14 +362,14 @@ class StockEntry(StockController): def validate_bom(self): for d in self.get('items'): - if d.bom_no and (d.t_warehouse != self.pro_doc.scrap_warehouse): + if d.bom_no and (d.t_warehouse != getattr(self, "pro_doc", frappe._dict()).scrap_warehouse): validate_bom_no(d.item_code, d.bom_no) def validate_finished_goods(self): """validation: finished good quantity should be same as manufacturing quantity""" items_with_target_warehouse = [] for d in self.get('items'): - if d.bom_no and flt(d.transfer_qty) != flt(self.fg_completed_qty) and (d.t_warehouse != self.pro_doc.scrap_warehouse): + if d.bom_no and flt(d.transfer_qty) != flt(self.fg_completed_qty) and (d.t_warehouse != getattr(self, "pro_doc", frappe._dict()).scrap_warehouse): frappe.throw(_("Quantity in row {0} ({1}) must be same as manufactured quantity {2}"). \ format(d.idx, d.transfer_qty, self.fg_completed_qty)) @@ -526,19 +533,7 @@ class StockEntry(StockController): if not self.posting_date or not self.posting_time: frappe.throw(_("Posting date and posting time is mandatory")) - if not getattr(self, "pro_doc", None): - self.pro_doc = None - - if self.production_order: - # common validations - if not self.pro_doc: - self.pro_doc = frappe.get_doc('Production Order', self.production_order) - - if self.pro_doc: - self.bom_no = self.pro_doc.bom_no - else: - # invalid production order - self.production_order = None + self.set_production_order_details() if self.bom_no: if self.purpose in ["Material Issue", "Material Transfer", "Manufacture", "Repack", @@ -584,6 +579,21 @@ class StockEntry(StockController): self.set_actual_qty() self.calculate_rate_and_amount() + def set_production_order_details(self): + if not getattr(self, "pro_doc", None): + self.pro_doc = None + + if self.production_order: + # common validations + if not self.pro_doc: + self.pro_doc = frappe.get_doc('Production Order', self.production_order) + + if self.pro_doc: + self.bom_no = self.pro_doc.bom_no + else: + # invalid production order + self.production_order = None + def load_items_from_bom(self): if self.production_order: item_code = self.pro_doc.production_item diff --git a/erpnext/stock/doctype/warehouse/test_records.json b/erpnext/stock/doctype/warehouse/test_records.json index 4dd9f6b46a..af3bd231fc 100644 --- a/erpnext/stock/doctype/warehouse/test_records.json +++ b/erpnext/stock/doctype/warehouse/test_records.json @@ -6,6 +6,13 @@ "warehouse_name": "_Test Warehouse", "is_group": 0 }, + { + "company": "_Test Company", + "create_account_under": "Stock Assets - _TC", + "doctype": "Warehouse", + "warehouse_name": "_Test Scrap Warehouse", + "is_group": 0 + }, { "company": "_Test Company", "create_account_under": "Stock Assets - _TC",