@@ -1394,6 +1394,68 @@ def make_rm_stock_entry(
13941394 if target_doc and target_doc .get ("items" ):
13951395 target_doc .items = []
13961396
1397+ def post_process (source_doc , target_doc ):
1398+ target_doc .purpose = "Send to Subcontractor"
1399+
1400+ if order_doctype == "Purchase Order" :
1401+ target_doc .purchase_order = source_doc .name
1402+ else :
1403+ target_doc .subcontracting_order = source_doc .name
1404+
1405+ target_doc .set_stock_entry_type ()
1406+
1407+ over_transfer_allowance = frappe .get_single_value (
1408+ "Buying Settings" , "over_transfer_allowance"
1409+ )
1410+ for fg_item_code in fg_item_code_list :
1411+ for rm_item in rm_items :
1412+ if (
1413+ rm_item .get ("main_item_code" ) == fg_item_code
1414+ or rm_item .get ("item_code" ) == fg_item_code
1415+ ):
1416+ rm_item_code = rm_item .get ("rm_item_code" )
1417+ qty = rm_item .get ("qty" ) or max (
1418+ rm_item .get ("required_qty" ) - rm_item .get ("total_supplied_qty" ), 0
1419+ )
1420+ if qty <= 0 and rm_item .get ("total_supplied_qty" ):
1421+ per_transferred = (
1422+ flt (
1423+ rm_item .get ("total_supplied_qty" ) / rm_item .get ("required_qty" ),
1424+ frappe .db .get_default ("float_precision" ),
1425+ )
1426+ * 100
1427+ )
1428+ if per_transferred >= 100 + over_transfer_allowance :
1429+ continue
1430+
1431+ items_dict = {
1432+ rm_item_code : {
1433+ rm_detail_field : rm_item .get ("name" ),
1434+ "item_name" : rm_item .get ("item_name" )
1435+ or item_wh .get (rm_item_code , {}).get ("item_name" , "" ),
1436+ "description" : item_wh .get (rm_item_code , {}).get ("description" , "" ),
1437+ "qty" : qty ,
1438+ "from_warehouse" : rm_item .get ("warehouse" )
1439+ or rm_item .get ("reserve_warehouse" ),
1440+ "to_warehouse" : source_doc .supplier_warehouse ,
1441+ "stock_uom" : rm_item .get ("stock_uom" ),
1442+ "serial_and_batch_bundle" : rm_item .get ("serial_and_batch_bundle" ),
1443+ "main_item_code" : fg_item_code ,
1444+ "allow_alternative_item" : item_wh .get (rm_item_code , {}).get (
1445+ "allow_alternative_item"
1446+ ),
1447+ "use_serial_batch_fields" : rm_item .get ("use_serial_batch_fields" ),
1448+ "serial_no" : rm_item .get ("serial_no" )
1449+ if rm_item .get ("use_serial_batch_fields" )
1450+ else None ,
1451+ "batch_no" : rm_item .get ("batch_no" )
1452+ if rm_item .get ("use_serial_batch_fields" )
1453+ else None ,
1454+ }
1455+ }
1456+
1457+ target_doc .add_to_stock_entry_detail (items_dict )
1458+
13971459 stock_entry = get_mapped_doc (
13981460 order_doctype ,
13991461 subcontract_order .name ,
@@ -1414,67 +1476,9 @@ def make_rm_stock_entry(
14141476 },
14151477 target_doc ,
14161478 ignore_child_tables = True ,
1479+ postprocess = post_process ,
14171480 )
14181481
1419- stock_entry .purpose = "Send to Subcontractor"
1420-
1421- if order_doctype == "Purchase Order" :
1422- stock_entry .purchase_order = subcontract_order .name
1423- else :
1424- stock_entry .subcontracting_order = subcontract_order .name
1425-
1426- stock_entry .set_stock_entry_type ()
1427-
1428- over_transfer_allowance = frappe .get_single_value ("Buying Settings" , "over_transfer_allowance" )
1429- for fg_item_code in fg_item_code_list :
1430- for rm_item in rm_items :
1431- if (
1432- rm_item .get ("main_item_code" ) == fg_item_code
1433- or rm_item .get ("item_code" ) == fg_item_code
1434- ):
1435- rm_item_code = rm_item .get ("rm_item_code" )
1436- qty = rm_item .get ("qty" ) or max (
1437- rm_item .get ("required_qty" ) - rm_item .get ("total_supplied_qty" ), 0
1438- )
1439- if qty <= 0 and rm_item .get ("total_supplied_qty" ):
1440- per_transferred = (
1441- flt (
1442- rm_item .get ("total_supplied_qty" ) / rm_item .get ("required_qty" ),
1443- frappe .db .get_default ("float_precision" ),
1444- )
1445- * 100
1446- )
1447- if per_transferred >= 100 + over_transfer_allowance :
1448- continue
1449-
1450- items_dict = {
1451- rm_item_code : {
1452- rm_detail_field : rm_item .get ("name" ),
1453- "item_name" : rm_item .get ("item_name" )
1454- or item_wh .get (rm_item_code , {}).get ("item_name" , "" ),
1455- "description" : item_wh .get (rm_item_code , {}).get ("description" , "" ),
1456- "qty" : qty ,
1457- "from_warehouse" : rm_item .get ("warehouse" )
1458- or rm_item .get ("reserve_warehouse" ),
1459- "to_warehouse" : subcontract_order .supplier_warehouse ,
1460- "stock_uom" : rm_item .get ("stock_uom" ),
1461- "serial_and_batch_bundle" : rm_item .get ("serial_and_batch_bundle" ),
1462- "main_item_code" : fg_item_code ,
1463- "allow_alternative_item" : item_wh .get (rm_item_code , {}).get (
1464- "allow_alternative_item"
1465- ),
1466- "use_serial_batch_fields" : rm_item .get ("use_serial_batch_fields" ),
1467- "serial_no" : rm_item .get ("serial_no" )
1468- if rm_item .get ("use_serial_batch_fields" )
1469- else None ,
1470- "batch_no" : rm_item .get ("batch_no" )
1471- if rm_item .get ("use_serial_batch_fields" )
1472- else None ,
1473- }
1474- }
1475-
1476- stock_entry .add_to_stock_entry_detail (items_dict )
1477-
14781482 if target_doc :
14791483 return stock_entry
14801484 else :
@@ -1506,6 +1510,8 @@ def add_items_in_ste(ste_doc, row, qty, rm_details, rm_detail_field="sco_rm_deta
15061510def make_return_stock_entry_for_subcontract (
15071511 available_materials , order_doc , rm_details , order_doctype = "Subcontracting Order"
15081512):
1513+ rm_detail_field = "po_detail" if order_doctype == "Purchase Order" else "sco_rm_detail"
1514+
15091515 def post_process (source_doc , target_doc ):
15101516 target_doc .purpose = "Material Transfer"
15111517
@@ -1516,6 +1522,21 @@ def post_process(source_doc, target_doc):
15161522
15171523 target_doc .company = source_doc .company
15181524 target_doc .is_return = 1
1525+ for _key , value in available_materials .items ():
1526+ if not value .qty :
1527+ continue
1528+
1529+ if item_details := value .get ("item_details" ):
1530+ item_details ["serial_and_batch_bundle" ] = None
1531+
1532+ if value .batch_no :
1533+ for batch_no , qty in value .batch_no .items ():
1534+ if qty > 0 :
1535+ add_items_in_ste (target_doc , value , qty , rm_details , rm_detail_field , batch_no )
1536+ else :
1537+ add_items_in_ste (target_doc , value , value .qty , rm_details , rm_detail_field )
1538+
1539+ target_doc .set_stock_entry_type ()
15191540
15201541 ste_doc = get_mapped_doc (
15211542 order_doctype ,
@@ -1530,27 +1551,6 @@ def post_process(source_doc, target_doc):
15301551 postprocess = post_process ,
15311552 )
15321553
1533- if order_doctype == "Purchase Order" :
1534- rm_detail_field = "po_detail"
1535- else :
1536- rm_detail_field = "sco_rm_detail"
1537-
1538- for _key , value in available_materials .items ():
1539- if not value .qty :
1540- continue
1541-
1542- if item_details := value .get ("item_details" ):
1543- item_details ["serial_and_batch_bundle" ] = None
1544-
1545- if value .batch_no :
1546- for batch_no , qty in value .batch_no .items ():
1547- if qty > 0 :
1548- add_items_in_ste (ste_doc , value , qty , rm_details , rm_detail_field , batch_no )
1549- else :
1550- add_items_in_ste (ste_doc , value , value .qty , rm_details , rm_detail_field )
1551-
1552- ste_doc .set_stock_entry_type ()
1553-
15541554 return ste_doc
15551555
15561556
0 commit comments