diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index 8cafb9105dc..5e1e52a5045 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -47,7 +47,6 @@ class BOM(WebsiteGenerator): self.validate_currency() self.set_conversion_rate() self.validate_uom_is_interger() - self.update_stock_qty() self.set_bom_material_details() self.validate_materials() self.validate_operations() @@ -247,14 +246,12 @@ class BOM(WebsiteGenerator): set_default(self, "item") item = frappe.get_doc("Item", self.item) if item.default_bom != self.name: - item.default_bom = self.name - item.save(ignore_permissions = True) + frappe.db.set_value('Item', self.item, 'default_bom', self.name) else: frappe.db.set(self, "is_default", 0) item = frappe.get_doc("Item", self.item) if item.default_bom == self.name: - item.default_bom = None - item.save(ignore_permissions = True) + frappe.db.set_value('Item', self.item, 'default_bom', None) def clear_operations(self): if not self.with_operations: @@ -291,6 +288,8 @@ class BOM(WebsiteGenerator): m.uom = m.stock_uom m.qty = m.stock_qty + m.db_update() + def validate_uom_is_interger(self): from erpnext.utilities.transaction_base import validate_uom_is_integer validate_uom_is_integer(self, "uom", "qty", "BOM Item") @@ -333,19 +332,23 @@ class BOM(WebsiteGenerator): def check_recursion(self): """ Check whether recursion occurs in any bom""" + bom_list = self.traverse_tree() + bom_nos = frappe.get_all('BOM Item', fields=["bom_no"], + filters={'parent': ('in', bom_list), 'parenttype': 'BOM'}) - check_list = [['parent', 'bom_no', 'parent'], ['bom_no', 'parent', 'child']] - for d in check_list: - bom_list, count = [self.name], 0 - while (len(bom_list) > count ): - boms = frappe.db.sql(" select %s from `tabBOM Item` where %s = %s and parenttype='BOM'" % - (d[0], d[1], '%s'), cstr(bom_list[count])) - count = count + 1 - for b in boms: - if b[0] == self.name: - frappe.throw(_("BOM recursion: {0} cannot be parent or child of {2}").format(b[0], self.name)) - if b[0]: - bom_list.append(b[0]) + raise_exception = False + if bom_nos and self.name in [d.bom_no for d in bom_nos]: + raise_exception = True + + if not raise_exception: + bom_nos = frappe.get_all('BOM Item', fields=["parent"], + filters={'bom_no': self.name, 'parenttype': 'BOM'}) + + if self.name in [d.parent for d in bom_nos]: + raise_exception = True + + if raise_exception: + frappe.throw(_("BOM recursion: {0} cannot be parent or child of {2}").format(self.name, self.name)) def update_cost_and_exploded_items(self, bom_list=[]): bom_list = self.traverse_tree(bom_list)