From ec07549d5ec8168d8374fa66b092c507b7a609b5 Mon Sep 17 00:00:00 2001 From: l0gesh29 Date: Sat, 5 Jul 2025 12:48:50 +0530 Subject: [PATCH 1/2] fix: resolve bundle item into line item if againt default supplier checked --- .../doctype/sales_order/sales_order.py | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index e27dc691093..65b352337df 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -1391,10 +1391,17 @@ def make_purchase_order_for_default_supplier(source_name, selected_items=None, t target.stock_qty = flt(source.stock_qty) - flt(source.ordered_qty) target.project = source_parent.project + def update_item_for_packed_item(source, target, source_parent): + target.qty = flt(source.qty) - flt(source.ordered_qty) + suppliers = [item.get("supplier") for item in selected_items if item.get("supplier")] suppliers = list(dict.fromkeys(suppliers)) # remove duplicates while preserving order - items_to_map = [item.get("item_code") for item in selected_items if item.get("item_code")] + items_to_map = [ + item.get("item_code") + for item in selected_items + if item.get("item_code") and item.get("delivered_by_supplier") + ] items_to_map = list(set(items_to_map)) if not suppliers: @@ -1444,13 +1451,35 @@ def make_purchase_order_for_default_supplier(source_name, selected_items=None, t "condition": lambda doc: doc.ordered_qty < doc.stock_qty and doc.supplier == supplier and doc.item_code in items_to_map - and doc.delivered_by_supplier == 1, + and not is_product_bundle(doc.item_code), + }, + "Packed Item": { + "doctype": "Purchase Order Item", + "field_map": [ + ["name", "sales_order_packed_item"], + ["parent", "sales_order"], + ["uom", "uom"], + ["conversion_factor", "conversion_factor"], + ["parent_item", "product_bundle"], + ["rate", "rate"], + ], + "field_no_map": [ + "price_list_rate", + "item_tax_template", + "discount_percentage", + "discount_amount", + "supplier", + "pricing_rules", + ], + "postprocess": update_item_for_packed_item, + "condition": lambda doc: doc.parent_item in items_to_map, }, }, target_doc, set_missing_values, ) + set_delivery_date(doc.items, source_name) doc.insert() frappe.db.commit() purchase_orders.append(doc) @@ -1466,9 +1495,7 @@ def make_purchase_order(source_name, selected_items=None, target_doc=None): if isinstance(selected_items, str): selected_items = json.loads(selected_items) - items_to_map = [ - item.get("item_code") for item in selected_items if item.get("item_code") and item.get("item_code") - ] + items_to_map = [item.get("item_code") for item in selected_items if item.get("item_code")] items_to_map = list(set(items_to_map)) def is_drop_ship_order(target): From f3460ec840a6ee7a7e0b383cd91dcce96d8063b2 Mon Sep 17 00:00:00 2001 From: l0gesh29 Date: Wed, 9 Jul 2025 19:26:41 +0530 Subject: [PATCH 2/2] fix: carry forward the delivered_by_supplier check to PO --- erpnext/selling/doctype/sales_order/sales_order.py | 6 +----- erpnext/stock/doctype/packed_item/packed_item.json | 13 +++++++++++-- erpnext/stock/doctype/packed_item/packed_item.py | 2 ++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 65b352337df..61c2917bfff 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -1397,11 +1397,7 @@ def make_purchase_order_for_default_supplier(source_name, selected_items=None, t suppliers = [item.get("supplier") for item in selected_items if item.get("supplier")] suppliers = list(dict.fromkeys(suppliers)) # remove duplicates while preserving order - items_to_map = [ - item.get("item_code") - for item in selected_items - if item.get("item_code") and item.get("delivered_by_supplier") - ] + items_to_map = [item.get("item_code") for item in selected_items if item.get("item_code")] items_to_map = list(set(items_to_map)) if not suppliers: diff --git a/erpnext/stock/doctype/packed_item/packed_item.json b/erpnext/stock/doctype/packed_item/packed_item.json index c4a40c5de18..8938d503356 100644 --- a/erpnext/stock/doctype/packed_item/packed_item.json +++ b/erpnext/stock/doctype/packed_item/packed_item.json @@ -23,6 +23,7 @@ "use_serial_batch_fields", "column_break_11", "serial_and_batch_bundle", + "delivered_by_supplier", "section_break_bgys", "serial_no", "column_break_qlha", @@ -290,20 +291,28 @@ { "fieldname": "column_break_qlha", "fieldtype": "Column Break" + }, + { + "default": "0", + "fieldname": "delivered_by_supplier", + "fieldtype": "Check", + "label": "Supplier delivers to Customer", + "read_only": 1 } ], "idx": 1, "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2025-02-18 13:06:02.789654", + "modified": "2025-07-09 19:12:45.850219", "modified_by": "Administrator", "module": "Stock", "name": "Packed Item", "owner": "Administrator", "permissions": [], + "row_format": "Dynamic", "sort_field": "creation", "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/erpnext/stock/doctype/packed_item/packed_item.py b/erpnext/stock/doctype/packed_item/packed_item.py index 3e7517918f2..e38b74ebe6a 100644 --- a/erpnext/stock/doctype/packed_item/packed_item.py +++ b/erpnext/stock/doctype/packed_item/packed_item.py @@ -27,6 +27,7 @@ class PackedItem(Document): actual_qty: DF.Float batch_no: DF.Link | None conversion_factor: DF.Float + delivered_by_supplier: DF.Check description: DF.TextEditor | None incoming_rate: DF.Currency item_code: DF.Link | None @@ -218,6 +219,7 @@ def update_packed_item_basic_data(main_item_row, pi_row, packing_item, item_data pi_row.uom = item_data.stock_uom pi_row.qty = flt(packing_item.qty) * flt(main_item_row.stock_qty) pi_row.conversion_factor = main_item_row.conversion_factor + pi_row.delivered_by_supplier = main_item_row.get("delivered_by_supplier") if not pi_row.description: pi_row.description = packing_item.get("description")