diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 6ef1f7cf709..5aadf2179d3 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -552,12 +552,15 @@ class WorkOrder(Document): so = so_query.run(as_dict=1) if not so: - so = ( + packed_so_query = ( frappe.qb.from_(SalesOrder) .inner_join(SalesOrderItem) .on(SalesOrderItem.parent == SalesOrder.name) .inner_join(PackedItem) - .on(PackedItem.parent == SalesOrder.name) + .on( + (PackedItem.parent == SalesOrder.name) + & (PackedItem.parent_detail_docname == SalesOrderItem.name) + ) .select(SalesOrder.name, SalesOrder.project, SalesOrderItem.delivery_date) .where( (SalesOrder.name == self.sales_order) @@ -567,9 +570,16 @@ class WorkOrder(Document): & (SalesOrder.docstatus == 1) & (PackedItem.item_code == production_item) ) - .run(as_dict=1) ) + if self.sales_order_item: + packed_so_query = packed_so_query.where( + (PackedItem.name == self.sales_order_item) + | (SalesOrderItem.name == self.sales_order_item) + ) + + so = packed_so_query.run(as_dict=1) + if len(so): if not self.expected_delivery_date: self.expected_delivery_date = so[0].delivery_date diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 9b0d8044a01..2cb2b4317c2 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -1941,6 +1941,61 @@ class TestSalesOrder(ERPNextTestSuite): ).run() self.assertEqual(wo_qty[0][0], so_item_name.get(item)) + @ERPNextTestSuite.change_settings("Selling Settings", {"allow_multiple_items": 1}) + def test_make_work_order_for_duplicate_product_bundle_rows(self): + from erpnext.selling.doctype.sales_order.sales_order import get_work_order_items + + bundle_item = make_item("_Test Work Order Product Bundle", {"is_stock_item": 0}).name + make_product_bundle(bundle_item, ["_Test FG Item"]) + + first_delivery_date = add_days(today(), 5) + second_delivery_date = add_days(today(), 10) + so = make_sales_order( + item_list=[ + { + "item_code": bundle_item, + "qty": 1, + "rate": 100, + "warehouse": "_Test Warehouse - _TC", + "delivery_date": first_delivery_date, + }, + { + "item_code": bundle_item, + "qty": 1, + "rate": 100, + "warehouse": "_Test Warehouse - _TC", + "delivery_date": second_delivery_date, + }, + ] + ) + + items = [ + { + "warehouse": item.get("warehouse"), + "item_code": item.get("item_code"), + "pending_qty": item.get("pending_qty"), + "sales_order_item": item.get("sales_order_item"), + "bom": item.get("bom"), + "description": item.get("description"), + } + for item in get_work_order_items(so.name) + ] + work_orders = make_work_orders(json.dumps({"items": items}), so.name, so.company) + + expected_delivery_dates = { + packed_item.name: next( + item.delivery_date for item in so.items if item.name == packed_item.parent_detail_docname + ) + for packed_item in so.packed_items + } + self.assertEqual(len(work_orders), 2) + for work_order_name in work_orders: + work_order = frappe.get_doc("Work Order", work_order_name) + self.assertEqual( + getdate(work_order.expected_delivery_date), + getdate(expected_delivery_dates[work_order.sales_order_item]), + ) + def test_advance_payment_entry_unlink_against_sales_order(self): from erpnext.accounts.doctype.payment_entry.test_payment_entry import get_payment_entry