@@ -225,7 +225,12 @@ def validate_dates(self):
225225 frappe .throw (_ ("Actual End Date cannot be before Actual Start Date" ))
226226
227227 def validate_fg_warehouse_for_reservation (self ):
228- if self .reserve_stock and self .sales_order and not self .subcontracting_inward_order :
228+ if (
229+ self .reserve_stock
230+ and self .sales_order
231+ and not self .subcontracting_inward_order
232+ and not self .production_plan_sub_assembly_item
233+ ):
229234 warehouses = frappe .get_all (
230235 "Sales Order Item" ,
231236 filters = {"parent" : self .sales_order , "item_code" : self .production_item },
@@ -413,39 +418,52 @@ def validate_workstation_type(self):
413418 )
414419
415420 def validate_sales_order (self ):
421+ if self .production_plan_sub_assembly_item :
422+ return
423+
416424 if self .sales_order :
417425 self .check_sales_order_on_hold_or_close ()
418- so = frappe .db .sql (
419- """
420- select so.name, so_item.delivery_date, so.project
421- from `tabSales Order` so
422- inner join `tabSales Order Item` so_item on so_item.parent = so.name
423- left join `tabProduct Bundle Item` pk_item on so_item.item_code = pk_item.parent
424- where so.name=%s and so.docstatus = 1
425- and so.skip_delivery_note = 0 and (
426- so_item.item_code=%s or
427- pk_item.item_code=%s )
428- """ ,
429- (self .sales_order , self .production_item , self .production_item ),
430- as_dict = 1 ,
426+
427+ SalesOrder = frappe .qb .DocType ("Sales Order" )
428+ SalesOrderItem = frappe .qb .DocType ("Sales Order Item" )
429+ PackedItem = frappe .qb .DocType ("Packed Item" )
430+ ProductBundleItem = frappe .qb .DocType ("Product Bundle Item" )
431+
432+ so = (
433+ frappe .qb .from_ (SalesOrder )
434+ .inner_join (SalesOrderItem )
435+ .on (SalesOrderItem .parent == SalesOrder .name )
436+ .left_join (ProductBundleItem )
437+ .on (ProductBundleItem .parent == SalesOrderItem .item_code )
438+ .select (SalesOrder .name , SalesOrder .project , SalesOrderItem .delivery_date )
439+ .where (
440+ (SalesOrder .skip_delivery_note == 0 )
441+ & (SalesOrder .docstatus == 1 )
442+ & (SalesOrder .name == self .sales_order )
443+ & (
444+ (SalesOrderItem .item_code == self .production_item )
445+ | (ProductBundleItem .item_code == self .production_item )
446+ )
447+ )
448+ .run (as_dict = 1 )
431449 )
432450
433451 if not so :
434- so = frappe . db . sql (
435- """
436- select
437- so.name, so_item.delivery_date, so.project
438- from
439- `tabSales Order` so, `tabSales Order Item` so_item, `tabPacked Item` packed_item
440- where so. name=%s
441- and so.name=so_item.parent
442- and so .name=packed_item.parent
443- and so .skip_delivery_note = 0
444- and so_item .item_code = packed_item .parent_item
445- and so .docstatus = 1 and packed_item.item_code=%s
446- """ ,
447- ( self . sales_order , self . production_item ),
448- as_dict = 1 ,
452+ so = (
453+ frappe . qb . from_ ( SalesOrder )
454+ . inner_join ( SalesOrderItem )
455+ . on ( SalesOrderItem . parent == SalesOrder . name )
456+ . inner_join ( PackedItem )
457+ . on ( PackedItem . parent == SalesOrder . name )
458+ . select ( SalesOrder . name , SalesOrder . project , SalesOrderItem . delivery_date )
459+ . where (
460+ ( SalesOrder .name == self . sales_order )
461+ & ( SalesOrder .skip_delivery_note == 0 )
462+ & ( SalesOrderItem .item_code == PackedItem .parent_item )
463+ & ( SalesOrder .docstatus == 1 )
464+ & ( PackedItem . item_code == self . production_item )
465+ )
466+ . run ( as_dict = 1 )
449467 )
450468
451469 if len (so ):
@@ -651,7 +669,7 @@ def update_work_order_qty(self):
651669
652670 from erpnext .selling .doctype .sales_order .sales_order import update_produced_qty_in_so_item
653671
654- if self .sales_order and self .sales_order_item :
672+ if self .sales_order and self .sales_order_item and not self . production_plan_sub_assembly_item :
655673 update_produced_qty_in_so_item (self .sales_order , self .sales_order_item )
656674
657675 if self .production_plan :
@@ -1159,7 +1177,7 @@ def update_ordered_qty(self):
11591177 doc .db_set ("status" , doc .status )
11601178
11611179 def update_work_order_qty_in_so (self ):
1162- if not self .sales_order and not self .sales_order_item :
1180+ if ( not self .sales_order and not self .sales_order_item ) or self . production_plan_sub_assembly_item :
11631181 return
11641182
11651183 total_bundle_qty = 1
0 commit comments