From f7accce30b9a72fb6c2bf1a782deb611b3a8b93d 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 96ed0cd7cd0..272bf9b0210 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -890,6 +890,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 @@ -1624,7 +1627,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 @@ -1632,7 +1635,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 249f484ddde531bd3d9a912c8a7351a0c50dee89 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 9376556eafd..1fc3b70153e 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; }) 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) { + 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 e23af58caa491b6539f3e3c76ca369fe0b9cc138 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 1fc3b70153e..b24b11cb08a 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 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")}); @@ -1097,7 +1097,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 272bf9b0210..c29b3b0a05a 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, }, @@ -1627,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 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 @@ -1635,7 +1634,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) @@ -1717,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 -- GitLab From 9697d70908bd3f140830b36973f1f58014a8f04f 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 c29b3b0a05a..6e14e179a01 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -892,7 +892,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 5d22812d2fd02823e82d90af9bb0bea6c2cadb09 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 6e14e179a01..5151df16846 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -889,10 +889,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