1616from erpnext .controllers .subcontracting_controller import SubcontractingController
1717from erpnext .setup .doctype .brand .brand import get_brand_defaults
1818from erpnext .setup .doctype .item_group .item_group import get_item_group_defaults
19+ from erpnext .stock .doctype .inventory_dimension .inventory_dimension import get_inventory_dimensions
1920from erpnext .stock .doctype .item .item import get_item_defaults
2021from erpnext .stock .get_item_details import get_default_cost_center , get_default_expense_account
2122from erpnext .stock .stock_ledger import get_valuation_rate
@@ -120,6 +121,7 @@ def onload(self):
120121 )
121122
122123 def before_validate (self ):
124+ self .save_inventory_dimensions ()
123125 super ().before_validate ()
124126 self .validate_items_qty ()
125127 self .set_items_bom ()
@@ -160,6 +162,7 @@ def validate(self):
160162
161163 self .set_supplied_items_expense_account ()
162164 self .set_supplied_items_cost_center ()
165+ self .set_supplied_items_inventory_dimensions ()
163166
164167 def on_submit (self ):
165168 self .validate_closed_subcontracting_order ()
@@ -313,6 +316,22 @@ def set_supplied_items_cost_center(self):
313316 self .company ,
314317 )
315318
319+ def set_supplied_items_inventory_dimensions (self ):
320+ if hasattr (self , "inventory_dimensions" ) and (inventory_dimensions := get_inventory_dimensions ()):
321+ for item in self .supplied_items :
322+ key = (
323+ item .reference_name ,
324+ item .rm_item_code ,
325+ item .main_item_code ,
326+ item .batch_no ,
327+ item .serial_no ,
328+ )
329+
330+ for dimension in inventory_dimensions :
331+ dimension_values = self .inventory_dimensions .get (dimension .source_fieldname , {})
332+ if key in dimension_values :
333+ item .set (dimension .source_fieldname , dimension_values [key ])
334+
316335 def set_supplied_items_expense_account (self ):
317336 for item in self .supplied_items :
318337 if not item .expense_account :
@@ -329,6 +348,19 @@ def set_supplied_items_expense_account(self):
329348 get_brand_defaults (item .rm_item_code , self .company ),
330349 )
331350
351+ def save_inventory_dimensions (self ):
352+ if inventory_dimensions := get_inventory_dimensions ():
353+ if not getattr (self , "inventory_dimensions" , None ):
354+ self .inventory_dimensions = {}
355+
356+ for dimension in inventory_dimensions :
357+ self .inventory_dimensions [dimension .source_fieldname ] = {
358+ (d .reference_name , d .rm_item_code , d .main_item_code , d .batch_no , d .serial_no ): d .get (
359+ dimension .source_fieldname
360+ )
361+ for d in self .supplied_items
362+ }
363+
332364 def reset_supplied_items (self ):
333365 if (
334366 frappe .db .get_single_value ("Buying Settings" , "backflush_raw_materials_of_subcontract_based_on" )
0 commit comments