From cf656b3673a3ba67087ece2b85cfadc28cb07ced Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Thu, 14 Mar 2024 17:09:21 +0100 Subject: [PATCH 1/5] fix: limit pick list and delivery notes to lines with item codes --- erpnext/selling/doctype/sales_order/sales_order.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 9737f92b58a..b5ca34ec6ef 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -892,6 +892,9 @@ def make_delivery_note(source_name, target_doc=None, kwargs=None): make_packing_list(target) def condition(doc): + if not doc.item_code: + return + if doc.name in sre_details: del sre_details[doc.name] return False @@ -1626,7 +1629,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: 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 +1637,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 + and abs(item.delivered_qty) < abs(item.qty) and item.delivered_by_supplier != 1 and not is_product_bundle(item.item_code) ) -- GitLab From 1385a232b4ae69c35b7145fe8ecb24c9ed851ff0 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Thu, 14 Mar 2024 17:14:47 +0100 Subject: [PATCH 2/5] fix: limit purchase orders to lines with item codes --- erpnext/selling/doctype/sales_order/sales_order.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 5ec744c0735..bf1acedadbc 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; }) 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) { + 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) { -- GitLab From afeea9268e7f29a2b88d3dc35ed094ae2986497e Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Thu, 14 Mar 2024 17:19:16 +0100 Subject: [PATCH 3/5] fix: Correctly filter lines with item_codes --- erpnext/selling/doctype/sales_order/sales_order.js | 4 ++-- erpnext/selling/doctype/sales_order/sales_order.py | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index bf1acedadbc..dec0d322f97 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 item.item_code && 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")}); @@ -1090,7 +1090,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex } else { let po_items = []; me.frm.doc.items.forEach(d => { - if (!d.item_code) { + if (!d.item_code) { // @dokos return } let ordered_qty = me.get_ordered_qty(d, me.frm.doc); diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index b5ca34ec6ef..425c4e0c021 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, }, @@ -1629,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 item.item_code and 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 @@ -1637,7 +1636,7 @@ def create_pick_list(source_name, target_doc=None): def should_pick_order_item(item) -> bool: return ( - item.item_code + 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) @@ -1719,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 -- GitLab From 6670a5ecdec0c5d1c8db5f5f04bc590068109ca3 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Thu, 14 Mar 2024 17:20:15 +0100 Subject: [PATCH 4/5] fix: Missing @dokos tag --- erpnext/selling/doctype/sales_order/sales_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 425c4e0c021..ee551c5f1d0 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -894,7 +894,7 @@ def make_delivery_note(source_name, target_doc=None, kwargs=None): if not doc.item_code: return - if doc.name in sre_details: + if doc.name in sre_details: # @dokos del sre_details[doc.name] return False -- GitLab From f9132da5757e0d09412ca448e7c65bb64c0f4772 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Thu, 14 Mar 2024 17:21:20 +0100 Subject: [PATCH 5/5] fix: tag location --- erpnext/selling/doctype/sales_order/sales_order.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index ee551c5f1d0..c08aa5a7b90 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -891,10 +891,10 @@ def make_delivery_note(source_name, target_doc=None, kwargs=None): make_packing_list(target) def condition(doc): - if not doc.item_code: + if not doc.item_code: # @dokos return - if doc.name in sre_details: # @dokos + if doc.name in sre_details: del sre_details[doc.name] return False -- GitLab