Skip to content

Commit 1d3d09f

Browse files
committed
refactor: use postprocess in mapped_doc to update items in subcontracting controller
1 parent 8947710 commit 1d3d09f

1 file changed

Lines changed: 80 additions & 80 deletions

File tree

erpnext/controllers/subcontracting_controller.py

Lines changed: 80 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -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
15061510
def 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

Comments
 (0)