diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 80dc4f23ec..901e236bd2 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -179,7 +179,7 @@ erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend( doc: this.frm.doc, method: 'get_production_order_items', callback: function(r) { - if(!r.message.every(function(d) { return !!d.bom })) { + if(!r.message) { frappe.msgprint({ title: __('Production Order not created'), message: __('No Items with Bill of Materials to Manufacture'), diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index c6dbd7043b..b16169bfd7 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -330,18 +330,19 @@ class SalesOrder(SellingController): def get_production_order_items(self): '''Returns items with BOM that already do not have a linked production order''' items = [] - for i in self.packed_items or self.items: - bom = frappe.get_all('BOM', dict(item=i.item_code, is_active=True), - order_by='is_default desc') - bom = bom[0].name if bom else None - stock_qty = i.qty if self.packed_items else i.stock_qty - items.append(dict( - item_code= i.item_code, - bom = bom, - warehouse = i.warehouse, - pending_qty= stock_qty - flt(frappe.db.sql('''select sum(qty) from `tabProduction Order` - where production_item=%s and sales_order=%s''', (i.item_code, self.name))[0][0]) - )) + + for table in [self.items, self.packed_items]: + for i in table: + bom = get_default_bom_item(i.item_code) + if bom: + stock_qty = i.qty if i.doctype == 'Packed Item' else i.stock_qty + items.append(dict( + item_code= i.item_code, + bom = bom, + warehouse = i.warehouse, + pending_qty= stock_qty - flt(frappe.db.sql('''select sum(qty) from `tabProduction Order` + where production_item=%s and sales_order=%s''', (i.item_code, self.name))[0][0]) + )) return items @@ -774,3 +775,10 @@ def make_production_orders(items, sales_order, company, project=None): def update_status(status, name): so = frappe.get_doc("Sales Order", name) so.update_status(status) + +def get_default_bom_item(item_code): + bom = frappe.get_all('BOM', dict(item=item_code, is_active=True), + order_by='is_default desc') + bom = bom[0].name if bom else None + + return bom