Skip to content

Commit dd99ab3

Browse files
committed
test: added test cases
1 parent f8dc16f commit dd99ab3

File tree

5 files changed

+76
-9
lines changed

5 files changed

+76
-9
lines changed

erpnext/controllers/subcontracting_controller.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -589,9 +589,8 @@ def __get_materials_from_bom(self, item_code, bom_no, exploded_item=0):
589589
to_remove = []
590590
for item in data:
591591
if item.is_phantom_item:
592-
data = (
593-
self.__get_materials_from_bom(item.rm_item_code, item.bom_no, exploded_item=exploded_item)
594-
+ data
592+
data += self.__get_materials_from_bom(
593+
item.rm_item_code, item.bom_no, exploded_item=exploded_item
595594
)
596595
to_remove.append(item)
597596

erpnext/controllers/tests/test_subcontracting_controller.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,6 +1141,28 @@ def test_return_non_consumed_materials_with_serial_batch_fields(self):
11411141
itemwise_details.get(doc.items[0].item_code)["serial_no"][5:6],
11421142
)
11431143

1144+
def test_phantom_bom_explosion(self):
1145+
from erpnext.manufacturing.doctype.bom.test_bom import create_tree_for_phantom_bom_tests
1146+
1147+
expected = create_tree_for_phantom_bom_tests()
1148+
service_items = [
1149+
{
1150+
"warehouse": "_Test Warehouse - _TC",
1151+
"item_code": "Subcontracted Service Item 11",
1152+
"qty": 5,
1153+
"rate": 100,
1154+
"fg_item": "Top Level Parent",
1155+
"fg_item_qty": 5,
1156+
},
1157+
]
1158+
sco = get_subcontracting_order(service_items=service_items, do_not_submit=True)
1159+
sco.items[0].include_exploded_items = 0
1160+
sco.save()
1161+
sco.submit()
1162+
sco.reload()
1163+
1164+
self.assertEqual([item.rm_item_code for item in sco.supplied_items], expected)
1165+
11441166

11451167
def add_second_row_in_scr(scr):
11461168
item_dict = {}
@@ -1309,6 +1331,7 @@ def make_subcontracted_items():
13091331
"Subcontracted Item SA8": {},
13101332
"Subcontracted Item SA9": {"stock_uom": "Litre"},
13111333
"Subcontracted Item SA10": {},
1334+
"Top Level Parent": {},
13121335
}
13131336

13141337
for item, properties in sub_contracted_items.items():
@@ -1360,6 +1383,7 @@ def make_service_items():
13601383
"Subcontracted Service Item 8": {},
13611384
"Subcontracted Service Item 9": {},
13621385
"Subcontracted Service Item 10": {},
1386+
"Subcontracted Service Item 11": {},
13631387
}
13641388

13651389
for item, properties in service_items.items():
@@ -1385,6 +1409,7 @@ def make_bom_for_subcontracted_items():
13851409
"Subcontracted Item SA7": ["Subcontracted SRM Item 1"],
13861410
"Subcontracted Item SA8": ["Subcontracted SRM Item 8"],
13871411
"Subcontracted Item SA10": ["Subcontracted SRM Item 10"],
1412+
"Subcontracted Service Item 11": ["Top Level Parent"],
13881413
}
13891414

13901415
for item_code, raw_materials in boms.items():

erpnext/manufacturing/doctype/bom/test_bom.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ def level_order_traversal(node):
794794
return traversal
795795

796796

797-
def create_nested_bom(tree, prefix="_Test bom ", submit=True):
797+
def create_nested_bom(tree, prefix="_Test bom ", phantom_items=None, submit=True):
798798
"""Helper function to create a simple nested bom from tree describing item names. (along with required items)"""
799799

800800
def create_items(bom_tree):
@@ -806,6 +806,9 @@ def create_items(bom_tree):
806806
).insert()
807807
create_items(subtree)
808808

809+
if not phantom_items:
810+
phantom_items = []
811+
809812
create_items(tree)
810813

811814
def dfs(tree, node):
@@ -824,7 +827,7 @@ def dfs(tree, node):
824827
child_items = dfs(tree, item)
825828
if child_items:
826829
bom_item_code = prefix + item
827-
bom = frappe.get_doc(doctype="BOM", item=bom_item_code)
830+
bom = frappe.get_doc(doctype="BOM", item=bom_item_code, is_phantom_bom=item in phantom_items)
828831
for child_item in child_items.keys():
829832
bom.append("items", {"item_code": prefix + child_item})
830833
bom.company = "_Test Company"
@@ -906,3 +909,15 @@ def create_process_loss_bom_item(item_tuple):
906909
return make_item(item_code, {"stock_uom": stock_uom, "valuation_rate": 100})
907910
else:
908911
return frappe.get_doc("Item", item_code)
912+
913+
914+
def create_tree_for_phantom_bom_tests(): # returns expected explosion result
915+
bom_tree_1 = {
916+
"Top Level Parent": {
917+
"Sub Assembly Level 1-1": {"Phantom Item Level 1-2": {"Item Level 1-3": {}}},
918+
"Phantom Item Level 2-1": {"Phantom Item Level 2-2": {"Item Level 2-3": {}}},
919+
}
920+
}
921+
phantom_list = ["Phantom Item Level 1-2", "Phantom Item Level 2-1", "Phantom Item Level 2-2"]
922+
create_nested_bom(bom_tree_1, prefix="", phantom_items=phantom_list)
923+
return ["Sub Assembly Level 1-1", "Item Level 2-3"]

erpnext/manufacturing/doctype/production_plan/test_production_plan.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2362,11 +2362,7 @@ def test_stock_reservation_of_batch_nos_against_production_plan(self):
23622362
frappe.db.set_single_value("Stock Settings", "enable_stock_reservation", 0)
23632363

23642364
def test_production_plan_for_partial_sub_assembly_items(self):
2365-
from erpnext.controllers.status_updater import OverAllowanceError
23662365
from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom
2367-
from erpnext.subcontracting.doctype.subcontracting_bom.test_subcontracting_bom import (
2368-
create_subcontracting_bom,
2369-
)
23702366

23712367
frappe.flags.test_print = False
23722368

@@ -2418,6 +2414,30 @@ def test_production_plan_for_partial_sub_assembly_items(self):
24182414
for row in plan.sub_assembly_items:
24192415
self.assertEqual(row.ordered_qty, 10.0)
24202416

2417+
def test_phantom_bom_explosion(self):
2418+
from erpnext.manufacturing.doctype.bom.test_bom import create_tree_for_phantom_bom_tests
2419+
2420+
create_tree_for_phantom_bom_tests()
2421+
2422+
plan = create_production_plan(
2423+
item_code="Top Level Parent",
2424+
planned_qty=10,
2425+
use_multi_level_bom=1,
2426+
do_not_submit=True,
2427+
company="_Test Company",
2428+
skip_getting_mr_items=True,
2429+
)
2430+
plan.get_sub_assembly_items()
2431+
plan.submit()
2432+
2433+
plan.set("mr_items", [])
2434+
mr_items = get_items_for_material_requests(plan.as_dict())
2435+
for d in mr_items:
2436+
plan.append("mr_items", d)
2437+
2438+
self.assertEqual(plan.sub_assembly_items[0].production_item, "Sub Assembly Level 1-1")
2439+
self.assertEqual([item.item_code for item in plan.mr_items], ["Item Level 2-3", "Item Level 1-3"])
2440+
24212441

24222442
def create_production_plan(**args):
24232443
"""

erpnext/manufacturing/doctype/work_order/test_work_order.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3270,6 +3270,14 @@ def test_reserved_serial_batch(self):
32703270
)
32713271
frappe.db.set_single_value("Stock Settings", "auto_reserve_serial_and_batch", original_auto_reserve)
32723272

3273+
def test_phantom_bom_explosion(self):
3274+
from erpnext.manufacturing.doctype.bom.test_bom import create_tree_for_phantom_bom_tests
3275+
3276+
expected = create_tree_for_phantom_bom_tests()
3277+
3278+
wo = make_wo_order_test_record(item="Top Level Parent")
3279+
self.assertEqual([item.item_code for item in wo.required_items], expected)
3280+
32733281

32743282
def get_reserved_entries(voucher_no, warehouse=None):
32753283
doctype = frappe.qb.DocType("Stock Reservation Entry")

0 commit comments

Comments
 (0)