diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 9376556eafd23951f74fce94d432279194428733..b24b11cb08aba4409b73bb432ed5846b399a10ed 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -987,7 +987,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")}); @@ -1085,7 +1085,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"); @@ -1097,6 +1097,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 96ed0cd7cd0e8dd5da32601d9e4a808d7d6121cf..5151df1684687558285137c636f6076ed4d34d86 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -798,9 +798,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, }, @@ -890,6 +889,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 @@ -1624,7 +1626,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 @@ -1632,7 +1634,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) ) @@ -1713,6 +1716,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