From 54072ec9cd0bfddea084d02e3d99c6d80ce527a7 Mon Sep 17 00:00:00 2001 From: Sagar Sharma Date: Sat, 5 Nov 2022 13:51:38 +0530 Subject: [PATCH 1/5] fix: map `BOM` while mapping the return SCR --- erpnext/controllers/sales_and_purchase_return.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index 04a0dfa3d40e..0054edbbd59f 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -503,7 +503,7 @@ def update_terms(source_doc, target_doc, source_parent): doctype + " Item": { "doctype": doctype + " Item", - "field_map": {"serial_no": "serial_no", "batch_no": "batch_no"}, + "field_map": {"serial_no": "serial_no", "batch_no": "batch_no", "bom": "bom"}, "postprocess": update_item, }, "Payment Schedule": {"doctype": "Payment Schedule", "postprocess": update_terms}, From 611d827e0b451c5db2e7478eb7a2ba1a05f3eb10 Mon Sep 17 00:00:00 2001 From: Sagar Sharma Date: Sat, 5 Nov 2022 13:59:56 +0530 Subject: [PATCH 2/5] fix: rename test method --- .../subcontracting_receipt/test_subcontracting_receipt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py index 090f1457d95a..d074d75771eb 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py @@ -327,7 +327,7 @@ def test_subcontracted_scr_for_multi_transfer_batches(self): for row in scr.supplied_items: self.assertEqual(transferred_batch.get(row.batch_no), row.consumed_qty) - def test_subcontracting_order_partial_return(self): + def test_subcontracting_receipt_partial_return(self): sco = get_subcontracting_order() rm_items = get_rm_items(sco.supplied_items) itemwise_details = make_stock_in_entry(rm_items=rm_items) @@ -351,7 +351,7 @@ def test_subcontracting_order_partial_return(self): self.assertEqual(scr1.status, "Return Issued") self.assertEqual(scr1.items[0].returned_qty, 10) - def test_subcontracting_order_over_return(self): + def test_subcontracting_receipt_over_return(self): sco = get_subcontracting_order() rm_items = get_rm_items(sco.supplied_items) itemwise_details = make_stock_in_entry(rm_items=rm_items) From 761e9df1bf430faac8b5662b3eb834cddcf65235 Mon Sep 17 00:00:00 2001 From: Sagar Sharma Date: Sat, 5 Nov 2022 14:05:56 +0530 Subject: [PATCH 3/5] test: add test case --- .../subcontracting_receipt/test_subcontracting_receipt.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py index d074d75771eb..7dcdeebe4dc2 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py @@ -343,11 +343,13 @@ def test_subcontracting_receipt_partial_return(self): scr1_return = make_return_subcontracting_receipt(scr_name=scr1.name, qty=-3) scr1.load_from_db() self.assertEqual(scr1_return.status, "Return") + self.assertIsNotNone(scr1_return.items[0].bom) self.assertEqual(scr1.items[0].returned_qty, 3) scr2_return = make_return_subcontracting_receipt(scr_name=scr1.name, qty=-7) scr1.load_from_db() self.assertEqual(scr2_return.status, "Return") + self.assertIsNotNone(scr2_return.items[0].bom) self.assertEqual(scr1.status, "Return Issued") self.assertEqual(scr1.items[0].returned_qty, 10) From 760c26e9c0ab0c35f3fe6296809ceb1ca3082c0e Mon Sep 17 00:00:00 2001 From: Sagar Sharma Date: Sat, 5 Nov 2022 15:50:39 +0530 Subject: [PATCH 4/5] fix: make `BOM` required in SCR Item --- .../controllers/subcontracting_controller.py | 3 +++ .../subcontracting_receipt.py | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/erpnext/controllers/subcontracting_controller.py b/erpnext/controllers/subcontracting_controller.py index aa4468c04e40..8d67e300a307 100644 --- a/erpnext/controllers/subcontracting_controller.py +++ b/erpnext/controllers/subcontracting_controller.py @@ -89,6 +89,9 @@ def validate_items(self): if bom.item != item.item_code: msg = f"Please select an valid BOM for Item {item.item_name}." frappe.throw(_(msg)) + else: + msg = f"Please select a BOM for Item {item.item_name}." + frappe.throw(_(msg)) def __get_data_before_save(self): item_dict = {} diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py index cd05b745e6d7..bce53608beb9 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py @@ -57,6 +57,7 @@ def update_status_updater_args(self): def before_validate(self): super(SubcontractingReceipt, self).before_validate() + self.set_items_bom() self.set_items_cost_center() self.set_items_expense_account() @@ -193,6 +194,24 @@ def validate_available_qty_for_consumption(self): ).format(item.idx) ) + def set_items_bom(self): + if self.is_return: + for item in self.items: + if not item.bom: + item.bom = frappe.db.get_value( + "Subcontracting Receipt Item", + {"name": item.subcontracting_receipt_item, "parent": self.return_against}, + "bom", + ) + else: + for item in self.items: + if not item.bom: + item.bom = frappe.db.get_value( + "Subcontracting Order Item", + {"name": item.subcontracting_order_item, "parent": item.subcontracting_order}, + "bom", + ) + def set_items_cost_center(self): if self.company: cost_center = frappe.get_cached_value("Company", self.company, "cost_center") From 324bfa9fdec773b468726c3b4622dd4aff9c6dbe Mon Sep 17 00:00:00 2001 From: Sagar Sharma Date: Sat, 5 Nov 2022 16:18:31 +0530 Subject: [PATCH 5/5] test: fix test case --- erpnext/controllers/tests/test_subcontracting_controller.py | 1 + .../subcontracting_receipt/test_subcontracting_receipt.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/tests/test_subcontracting_controller.py b/erpnext/controllers/tests/test_subcontracting_controller.py index 8490d145286f..0e6fe95d45f6 100644 --- a/erpnext/controllers/tests/test_subcontracting_controller.py +++ b/erpnext/controllers/tests/test_subcontracting_controller.py @@ -815,6 +815,7 @@ def add_second_row_in_scr(scr): "item_name", "qty", "uom", + "bom", "warehouse", "stock_uom", "subcontracting_order", diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py index 7dcdeebe4dc2..34e78420d71c 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py @@ -404,8 +404,8 @@ def test_subcontracting_receipt_no_gl_entry(self): "stock_value_difference", ) - # Service Cost(100 * 10) + Raw Materials Cost(50 * 10) + Additional Costs(100) = 1600 - self.assertEqual(stock_value_difference, 1600) + # Service Cost(100 * 10) + Raw Materials Cost(100 * 10) + Additional Costs(10 * 10) = 2100 + self.assertEqual(stock_value_difference, 2100) self.assertFalse(get_gl_entries("Subcontracting Receipt", scr.name)) def test_subcontracting_receipt_gl_entry(self):