diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 5ec744c07355e1307afae24fbb2c2b6653cb15d4..dec0d322f971e0bd9e1f2cd953112b8eef452575 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -980,7 +980,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex make_purchase_order(){ let pending_items = this.frm.doc.items.some((item) =>{ let pending_qty = flt(item.stock_qty) - flt(item.ordered_qty); - return pending_qty > 0; + return item.item_code && pending_qty > 0; // @dokos }) if(!pending_items){ frappe.throw({message: __("Purchase Order already created for all Sales Order items"), title: __("Note")}); @@ -1078,7 +1078,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex dialog.fields_dict["against_default_supplier"].df.onchange = () => set_po_items_data(dialog); - function set_po_items_data (dialog) { + function set_po_items_data(dialog) { var against_default_supplier = dialog.get_value("against_default_supplier"); var items_for_po = dialog.get_value("items_for_po"); @@ -1090,6 +1090,9 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } else { let po_items = []; me.frm.doc.items.forEach(d => { + if (!d.item_code) { // @dokos + return + } let ordered_qty = me.get_ordered_qty(d, me.frm.doc); let pending_qty = (flt(d.stock_qty) - ordered_qty) / flt(d.conversion_factor); if (pending_qty > 0) { diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 9737f92b58a09aabe99b80fcecfbdd4a8b7d6806..c08aa5a7b903e6392e4614ddcc9edc8b7eba755b 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -800,9 +800,8 @@ def make_material_request(source_name, target_doc=None): "Sales Order Item": { "doctype": "Material Request Item", "field_map": {"name": "sales_order_item", "parent": "sales_order"}, - "condition": lambda item: not frappe.db.exists( - "Product Bundle", {"name": item.item_code, "disabled": 0} - ) + "condition": lambda item: item.item_code + and not frappe.db.exists("Product Bundle", {"name": item.item_code, "disabled": 0}) # @dokos and get_remaining_qty(item) > 0, "postprocess": update_item, }, @@ -892,6 +891,9 @@ def make_delivery_note(source_name, target_doc=None, kwargs=None): make_packing_list(target) def condition(doc): + if not doc.item_code: # @dokos + return + if doc.name in sre_details: del sre_details[doc.name] return False @@ -1626,7 +1628,7 @@ def create_pick_list(source_name, target_doc=None): def update_packed_item_qty(source, target, source_parent) -> None: qty = flt(source.qty) for item in source_parent.items: - if source.parent_detail_docname == item.name: + if item.item_code and source.parent_detail_docname == item.name: # @dokos picked_qty = flt(item.picked_qty) / (flt(item.conversion_factor) or 1) pending_percent = (item.qty - max(picked_qty, item.delivered_qty)) / item.qty target.qty = target.stock_qty = qty * pending_percent @@ -1634,7 +1636,8 @@ def create_pick_list(source_name, target_doc=None): def should_pick_order_item(item) -> bool: return ( - abs(item.delivered_qty) < abs(item.qty) + item.item_code # @dokos + and abs(item.delivered_qty) < abs(item.qty) and item.delivered_by_supplier != 1 and not is_product_bundle(item.item_code) ) @@ -1715,6 +1718,9 @@ def get_work_order_items(sales_order, for_raw_material_request=0): for table in [so.items, so.packed_items]: for i in table: + if not i.item_code: # @dokos + continue + bom = get_default_bom(i.item_code) stock_qty = i.qty if i.doctype == "Packed Item" else i.stock_qty