chore: subcontracting validations (backport #33621) (#33626)

* fix: `ZeroDivisionError: float division by zero` in SCR

(cherry picked from commit 434aa594d5)

* chore: add row-index in error msgs

(cherry picked from commit 6878f40d1d)

* chore: update error msgs for Subcontracted PO

(cherry picked from commit a0e2a93f3f)

* fix: validate accepted and rejected qty in SCR Item

(cherry picked from commit f028bd6e69)

* chore: linter

(cherry picked from commit b26e96cdf4)

Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
This commit is contained in:
mergify[bot]
2023-01-12 20:31:24 +05:30
committed by GitHub
parent c9edf10693
commit 120dca44ad
3 changed files with 24 additions and 19 deletions

View File

@@ -219,20 +219,16 @@ class PurchaseOrder(BuyingController):
else: else:
if not frappe.get_value("Item", item.fg_item, "is_sub_contracted_item"): if not frappe.get_value("Item", item.fg_item, "is_sub_contracted_item"):
frappe.throw( frappe.throw(
_( _("Row #{0}: Finished Good Item {1} must be a sub-contracted item").format(
"Row #{0}: Finished Good Item {1} must be a sub-contracted item for service item {2}" item.idx, item.fg_item
).format(item.idx, item.fg_item, item.item_code) )
) )
elif not frappe.get_value("Item", item.fg_item, "default_bom"): elif not frappe.get_value("Item", item.fg_item, "default_bom"):
frappe.throw( frappe.throw(
_("Row #{0}: Default BOM not found for FG Item {1}").format(item.idx, item.fg_item) _("Row #{0}: Default BOM not found for FG Item {1}").format(item.idx, item.fg_item)
) )
if not item.fg_item_qty: if not item.fg_item_qty:
frappe.throw( frappe.throw(_("Row #{0}: Finished Good Item Qty can not be zero").format(item.idx))
_("Row #{0}: Finished Good Item Qty is not specified for service item {0}").format(
item.idx, item.item_code
)
)
else: else:
for item in self.items: for item in self.items:
item.set("fg_item", None) item.set("fg_item", None)

View File

@@ -74,24 +74,25 @@ class SubcontractingController(StockController):
) )
if not is_stock_item: if not is_stock_item:
msg = f"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))
frappe.throw(_(msg))
if not is_sub_contracted_item: if not is_sub_contracted_item:
msg = f"Item {item.item_name} must be a subcontracted item." frappe.throw(
frappe.throw(_(msg)) _("Row {0}: Item {1} must be a subcontracted item.").format(item.idx, item.item_name)
)
if item.bom: if item.bom:
bom = frappe.get_doc("BOM", item.bom) bom = frappe.get_doc("BOM", item.bom)
if not bom.is_active: if not bom.is_active:
msg = f"Please select an active BOM for Item {item.item_name}." frappe.throw(
frappe.throw(_(msg)) _("Row {0}: Please select an active BOM for Item {1}.").format(item.idx, item.item_name)
)
if bom.item != item.item_code: if bom.item != item.item_code:
msg = f"Please select an valid BOM for Item {item.item_name}." frappe.throw(
frappe.throw(_(msg)) _("Row {0}: Please select an valid BOM for Item {1}.").format(item.idx, item.item_name)
)
else: else:
msg = f"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))
frappe.throw(_(msg))
def __get_data_before_save(self): def __get_data_before_save(self):
item_dict = {} item_dict = {}

View File

@@ -57,6 +57,7 @@ class SubcontractingReceipt(SubcontractingController):
def before_validate(self): def before_validate(self):
super(SubcontractingReceipt, self).before_validate() super(SubcontractingReceipt, self).before_validate()
self.validate_items_qty()
self.set_items_bom() self.set_items_bom()
self.set_items_cost_center() self.set_items_cost_center()
self.set_items_expense_account() self.set_items_expense_account()
@@ -157,7 +158,7 @@ class SubcontractingReceipt(SubcontractingController):
total_qty = total_amount = 0 total_qty = total_amount = 0
for item in self.items: 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_supp_cost = rm_supp_cost[item.name]
item.rm_cost_per_qty = item.rm_supp_cost / item.qty item.rm_cost_per_qty = item.rm_supp_cost / item.qty
rm_supp_cost.pop(item.name) rm_supp_cost.pop(item.name)
@@ -194,6 +195,13 @@ class SubcontractingReceipt(SubcontractingController):
).format(item.idx) ).format(item.idx)
) )
def validate_items_qty(self):
for item in self.items:
if not (item.qty or item.rejected_qty):
frappe.throw(
_("Row {0}: Accepted Qty and Rejected Qty can't be zero at the same time.").format(item.idx)
)
def set_items_bom(self): def set_items_bom(self):
if self.is_return: if self.is_return:
for item in self.items: for item in self.items: