[Fix] Making of production order from so, system not fetched the items from the sales order item if packing list has items and vice versa (#10453)
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 80dc4f2..901e236 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -179,7 +179,7 @@
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 c6dbd70..b16169b 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -330,18 +330,19 @@
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 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