From b5882aaa6cff5f1f6ac96238937347de2fbaf293 Mon Sep 17 00:00:00 2001 From: Bhavishya Sharma Date: Fri, 5 Jul 2019 22:40:49 +0530 Subject: [PATCH] fix: BOM Item with Operation --- erpnext/manufacturing/doctype/bom/bom.py | 32 +++++++++++++++++------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index 97eb0e752af..e8b37d5c300 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -516,10 +516,16 @@ class BOM(WebsiteGenerator): return erpnext.get_company_currency(self.company) def add_to_cur_exploded_items(self, args): - if self.cur_exploded_items.get(args.item_code): - self.cur_exploded_items[args.item_code]["stock_qty"] += args.stock_qty + if self.cur_exploded_items.get(args.item_code) and self.cur_exploded_items[args.item_code]["operation"] == args.operation: + if args.operation is None: + self.cur_exploded_items[args.item_code]["stock_qty"] += args.stock_qty + else: + self.cur_exploded_items[args.item_code+":"+args.operation]["stock_qty"] += args.stock_qty else: - self.cur_exploded_items[args.item_code] = args + if args.operation is None: + self.cur_exploded_items[args.item_code] = args + else: + self.cur_exploded_items[args.item_code+":"+args.operation] = args def get_child_exploded_items(self, bom_no, stock_qty): """ Add all items from Flat BOM of child BOM""" @@ -609,7 +615,7 @@ def get_bom_items_as_dict(bom, company, qty=1, fetch_exploded=1, fetch_scrap_ite and bom.name = %(bom)s and item.is_stock_item in (1, {is_stock_item}) {where_conditions} - group by item_code, stock_uom + group by item_code, stock_uom {groupby_columns} order by idx""" is_stock_item = 0 if include_non_stock_items else 1 @@ -619,7 +625,8 @@ def get_bom_items_as_dict(bom, company, qty=1, fetch_exploded=1, fetch_scrap_ite is_stock_item=is_stock_item, qty_field="stock_qty", select_columns = """, bom_item.source_warehouse, bom_item.operation, bom_item.include_item_in_manufacturing, - (Select idx from `tabBOM Item` where item_code = bom_item.item_code and parent = %(parent)s limit 1) as idx""") + (Select idx from `tabBOM Item` where item_code = bom_item.item_code and parent = %(parent)s limit 1) as idx""", + groupby_colums = """, bom_item.operation""") items = frappe.db.sql(query, { "parent": bom, "qty": qty, "bom": bom, "company": company }, as_dict=True) elif fetch_scrap_items: @@ -628,14 +635,21 @@ def get_bom_items_as_dict(bom, company, qty=1, fetch_exploded=1, fetch_scrap_ite else: query = query.format(table="BOM Item", where_conditions="", is_stock_item=is_stock_item, qty_field="stock_qty" if fetch_qty_in_stock_uom else "qty", - select_columns = ", bom_item.uom, bom_item.conversion_factor, bom_item.source_warehouse, bom_item.idx, bom_item.operation, bom_item.include_item_in_manufacturing") + select_columns = ", bom_item.uom, bom_item.conversion_factor, bom_item.source_warehouse, bom_item.idx, bom_item.operation, bom_item.include_item_in_manufacturing", + groupby_colums = """, bom_item.operation""") items = frappe.db.sql(query, { "qty": qty, "bom": bom, "company": company }, as_dict=True) for item in items: - if item.item_code in item_dict: - item_dict[item.item_code]["qty"] += flt(item.qty) + if item.item_code in item_dict and ( fetch_scrap_items or item_dict[item.item_code]["operation"] == item.operation): + if item.operation is None: + item_dict[item.item_code]["qty"] += flt(item.qty) + else: + item_dict[item.item_code+":"+item.operation]["qty"] += flt(item.qty) else: - item_dict[item.item_code] = item + if item.operation is None: + item_dict[item.item_code] = item + else: + item_dict[item.item_code+":"+item.operation] = item for item, item_details in item_dict.items(): for d in [["Account", "expense_account", "default_expense_account"],