From 434aa594d57b986d078fb98025eda65f75b65e26 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Sun, 8 Jan 2023 11:49:40 +0530 Subject: [PATCH 1/5] fix: `ZeroDivisionError: float division by zero` in SCR --- .../doctype/subcontracting_receipt/subcontracting_receipt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py index bce53608beb..4436c1f1e1e 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py @@ -157,7 +157,7 @@ class SubcontractingReceipt(SubcontractingController): total_qty = total_amount = 0 for item in self.items: - if item.name in rm_supp_cost: + if item.qty and item.name in rm_supp_cost: item.rm_supp_cost = rm_supp_cost[item.name] item.rm_cost_per_qty = item.rm_supp_cost / item.qty rm_supp_cost.pop(item.name) From 6878f40d1df268fd179d7c5558e858387b27ae0a Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Sun, 8 Jan 2023 12:01:58 +0530 Subject: [PATCH 2/5] chore: add row-index in error msgs --- erpnext/controllers/subcontracting_controller.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/erpnext/controllers/subcontracting_controller.py b/erpnext/controllers/subcontracting_controller.py index 335d92f43f3..a588847ad5c 100644 --- a/erpnext/controllers/subcontracting_controller.py +++ b/erpnext/controllers/subcontracting_controller.py @@ -74,24 +74,19 @@ class SubcontractingController(StockController): ) if not is_stock_item: - msg = f"Item {item.item_name} must be a stock item." - frappe.throw(_(msg)) + frappe.throw(_(f"Row {item.idx}: Item {item.item_name} must be a stock item.")) if not is_sub_contracted_item: - msg = f"Item {item.item_name} must be a subcontracted item." - frappe.throw(_(msg)) + frappe.throw(_(f"Row {item.idx}: Item {item.item_name} must be a subcontracted item.")) if item.bom: bom = frappe.get_doc("BOM", item.bom) if not bom.is_active: - msg = f"Please select an active BOM for Item {item.item_name}." - frappe.throw(_(msg)) + frappe.throw(_(f"Row {item.idx}: Please select an active BOM for Item {item.item_name}.")) if bom.item != item.item_code: - msg = f"Please select an valid BOM for Item {item.item_name}." - frappe.throw(_(msg)) + frappe.throw(_(f"Row {item.idx}: Please select an valid BOM for Item {item.item_name}.")) else: - msg = f"Please select a BOM for Item {item.item_name}." - frappe.throw(_(msg)) + frappe.throw(_(f"Row {item.idx}: Please select a BOM for Item {item.item_name}.")) def __get_data_before_save(self): item_dict = {} From a0e2a93f3f502c29cb161736ef091a4e98c3dd53 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Thu, 12 Jan 2023 12:09:28 +0530 Subject: [PATCH 3/5] chore: update error msgs for Subcontracted PO --- .../buying/doctype/purchase_order/purchase_order.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 5a4168a573e..2415aec8cb9 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -219,20 +219,16 @@ class PurchaseOrder(BuyingController): else: if not frappe.get_value("Item", item.fg_item, "is_sub_contracted_item"): frappe.throw( - _( - "Row #{0}: Finished Good Item {1} must be a sub-contracted item for service item {2}" - ).format(item.idx, item.fg_item, item.item_code) + _("Row #{0}: Finished Good Item {1} must be a sub-contracted item").format( + item.idx, item.fg_item + ) ) elif not frappe.get_value("Item", item.fg_item, "default_bom"): frappe.throw( _("Row #{0}: Default BOM not found for FG Item {1}").format(item.idx, item.fg_item) ) if not item.fg_item_qty: - frappe.throw( - _("Row #{0}: Finished Good Item Qty is not specified for service item {0}").format( - item.idx, item.item_code - ) - ) + frappe.throw(_("Row #{0}: Finished Good Item Qty can not be zero").format(item.idx)) else: for item in self.items: item.set("fg_item", None) From f028bd6e69a571d0053f124334a0021904a7f365 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Thu, 12 Jan 2023 12:23:40 +0530 Subject: [PATCH 4/5] fix: validate accepted and rejected qty in SCR Item --- .../subcontracting_receipt/subcontracting_receipt.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py index 4436c1f1e1e..dd4ae04c165 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py @@ -57,6 +57,7 @@ class SubcontractingReceipt(SubcontractingController): def before_validate(self): super(SubcontractingReceipt, self).before_validate() + self.validate_items_qty() self.set_items_bom() self.set_items_cost_center() self.set_items_expense_account() @@ -194,6 +195,13 @@ class SubcontractingReceipt(SubcontractingController): ).format(item.idx) ) + def validate_items_qty(self): + for item in self.items: + if not (item.qty or item.rejected_qty): + frappe.throw( + _(f"Row {item.idx}: Accepted Qty and Rejected Qty can't be zero at the same time.") + ) + def set_items_bom(self): if self.is_return: for item in self.items: From b26e96cdf40d4306faa158ad74644c5c2abce8c7 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Thu, 12 Jan 2023 13:41:53 +0530 Subject: [PATCH 5/5] chore: linter --- erpnext/controllers/subcontracting_controller.py | 16 +++++++++++----- .../subcontracting_receipt.py | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/erpnext/controllers/subcontracting_controller.py b/erpnext/controllers/subcontracting_controller.py index a588847ad5c..a9561fe2dac 100644 --- a/erpnext/controllers/subcontracting_controller.py +++ b/erpnext/controllers/subcontracting_controller.py @@ -74,19 +74,25 @@ class SubcontractingController(StockController): ) if not is_stock_item: - frappe.throw(_(f"Row {item.idx}: Item {item.item_name} must be a stock item.")) + frappe.throw(_("Row {0}: Item {1} must be a stock item.").format(item.idx, item.item_name)) if not is_sub_contracted_item: - frappe.throw(_(f"Row {item.idx}: Item {item.item_name} must be a subcontracted item.")) + frappe.throw( + _("Row {0}: Item {1} must be a subcontracted item.").format(item.idx, item.item_name) + ) if item.bom: bom = frappe.get_doc("BOM", item.bom) if not bom.is_active: - frappe.throw(_(f"Row {item.idx}: Please select an active BOM for Item {item.item_name}.")) + frappe.throw( + _("Row {0}: Please select an active BOM for Item {1}.").format(item.idx, item.item_name) + ) if bom.item != item.item_code: - frappe.throw(_(f"Row {item.idx}: Please select an valid BOM for Item {item.item_name}.")) + frappe.throw( + _("Row {0}: Please select an valid BOM for Item {1}.").format(item.idx, item.item_name) + ) else: - frappe.throw(_(f"Row {item.idx}: Please select a BOM for Item {item.item_name}.")) + frappe.throw(_("Row {0}: Please select a BOM for Item {1}.").format(item.idx, item.item_name)) 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 dd4ae04c165..7e1915bb71a 100644 --- a/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py +++ b/erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py @@ -199,7 +199,7 @@ class SubcontractingReceipt(SubcontractingController): for item in self.items: if not (item.qty or item.rejected_qty): frappe.throw( - _(f"Row {item.idx}: Accepted Qty and Rejected Qty can't be zero at the same time.") + _("Row {0}: Accepted Qty and Rejected Qty can't be zero at the same time.").format(item.idx) ) def set_items_bom(self):