Pull items from BOM for production issue
diff --git a/erpnext/production/doctype/bill_of_materials/bill_of_materials.py b/erpnext/production/doctype/bill_of_materials/bill_of_materials.py
index 627fc54..a62e4f2 100644
--- a/erpnext/production/doctype/bill_of_materials/bill_of_materials.py
+++ b/erpnext/production/doctype/bill_of_materials/bill_of_materials.py
@@ -500,20 +500,11 @@
def get_child_flat_bom_items(self, item, d):
child_flat_bom_items=[]
-# if item and (item[0]['is_sub_contracted_item'] == 'Yes' or item[0]['is_pro_applicable'] == 'Yes'):
child_flat_bom_items = sql("select fbom.item_code, fbom.description, fbom.qty_consumed_per_unit, fbom.stock_uom, fbom.moving_avg_rate, fbom.last_purchase_rate, fbom.standard_rate, '%s' as parent_bom, fbom.bom_mat_no, 'No' as is_pro_applicable from `tabFlat BOM Detail` fbom,`tabBill Of Materials` bom where fbom.parent=bom.name and fbom.parent = '%s' and fbom.is_pro_applicable = 'No' and bom.docstatus = 1" % ( d.bom_no, cstr(d.bom_no)))
self.cur_flat_bom_items.append([d.item_code, d.description, flt(d.qty), d.stock_uom, flt(d.moving_avg_rate), flt(d.amount_as_per_mar), flt(d.last_purchase_rate), flt(d.amount_as_per_lpr), flt(d.standard_rate), flt(d.amount_as_per_sr), flt(d.qty_consumed_per_unit), (item[0]['is_sub_contracted_item'] == 'Yes') and d.parent or d.bom_no, d.name, (item[0]['is_sub_contracted_item'] == 'Yes') and 'No' or 'Yes'])
return child_flat_bom_items
-# else:
-# child_flat_bom_items = sql("select item_code, description, qty_consumed_per_unit, stock_uom, moving_avg_rate, last_purchase_rate, standard_rate, if(parent_bom = '%s', '%s', parent_bom) as parent_bom, bom_mat_no, is_pro_applicable from `tabFlat BOM Detail` where parent = '%s' and docstatus = 1" % ( d.bom_no, d.parent, cstr(d.bom_no)))
-
-# if not child_flat_bom_items:
-# msgprint("Please Submit Child BOM := %s first." % cstr(d.bom_no))
-# raise Exception
-# else:"""
-
# Get Current Flat BOM Items
# -----------------------------
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index ab1538a..208dd28 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -121,16 +121,46 @@
self.item_dict[i[0]] = [flt(i[1]), cstr(i[2]), cstr(i[3])]
def get_raw_materials(self,pro_obj):
- # get all items from flat bom except, child items of sub-contracted and sub assembly items and sub assembly items itself.
+ """
+ get all items from flat bom except
+ child items of sub-contracted and sub assembly items
+ and sub assembly items itself.
+ """
if pro_obj.doc.consider_sa_items == 'Yes':
- # get all Sub Assembly items only from flat bom
- fl_bom_sa_items = sql("select item_code, ifnull(sum(qty_consumed_per_unit), 0) * '%s', description, stock_uom from `tabFlat BOM Detail` where parent = '%s' and parent_bom = '%s' and is_pro_applicable = 'Yes' and docstatus < 2 group by item_code" % ((self.doc.process == 'Backflush') and flt(self.doc.fg_completed_qty) or flt(pro_obj.doc.qty), cstr(pro_obj.doc.bom_no), cstr(pro_obj.doc.bom_no)))
+ # Get all raw materials considering SA items as raw materials,
+ # so no childs of SA items
+
+ fl_bom_sa_items = sql("""
+ select item_code, ifnull(sum(qty_consumed_per_unit), 0) * '%s', description, stock_uom
+ from `tabBOM Material`
+ where parent = '%s' and docstatus < 2
+ group by item_code
+ """ % ((self.doc.process == 'Backflush') and flt(self.doc.fg_completed_qty) \
+ or flt(pro_obj.doc.qty), cstr(pro_obj.doc.bom_no)))
+
self.make_items_dict(fl_bom_sa_items)
if pro_obj.doc.consider_sa_items == 'No':
- # get all sub assembly childs only from flat bom
- fl_bom_sa_child_item = sql("select item_code,ifnull(sum(qty_consumed_per_unit),0)*'%s' as qty,description,stock_uom from ( select distinct fb.name,fb.description,fb.item_code,fb.qty_consumed_per_unit,fb.stock_uom from `tabFlat BOM Detail` fb,`tabBOM Material` bm where bm.parent=fb.parent_bom and bm.docstatus<2 and fb.is_pro_applicable='Yes' and fb.docstatus<2 and fb.parent='%s' and bm.bom_no is null)a group by item_code,stock_uom" % ((self.doc.process == 'Backflush') and flt(self.doc.fg_completed_qty) or flt(pro_obj.doc.qty), cstr(pro_obj.doc.bom_no)))
+ # get all raw materials with sub assembly childs
+
+ fl_bom_sa_child_item = sql("""
+ select
+ item_code,ifnull(sum(qty_consumed_per_unit),0)*%s as qty,description,stock_uom
+ from
+ (
+ select distinct fb.name, fb.description, fb.item_code, fb.qty_consumed_per_unit, fb.stock_uom
+ from `tabFlat BOM Detail` fb,`tabItem` it
+ where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No'
+ and ifnull(it.is_sub_contracted_item, 'No') = 'No'
+ and fb.docstatus<2 and fb.parent=%s
+ ) a
+ group by item_code,stock_uom
+ """ , ((self.doc.process == 'Backflush') and flt(self.doc.fg_completed_qty) \
+ or flt(pro_obj.doc.qty), cstr(pro_obj.doc.bom_no)))
+
+
+
self.make_items_dict(fl_bom_sa_child_item)
def add_to_stock_entry_detail(self, pro_obj, item_dict, fg_item = 0):