From 05ac7213b3c26a1c4d25273e0d83b6f93bdf9b1b Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Mon, 6 Apr 2020 10:17:57 +0530 Subject: [PATCH] fix: allow to make BOM against template item (#21146) * fix: allow to make BOM against template item * Update queries.py Co-authored-by: Nabin Hait --- erpnext/controllers/queries.py | 9 ++++- erpnext/manufacturing/doctype/bom/bom.js | 46 +++++++++++++++++++++--- erpnext/manufacturing/doctype/bom/bom.py | 4 +++ 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 163ef72ee10..c14bb669a4d 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -179,6 +179,12 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals # scan description only if items are less than 50000 description_cond = 'or tabItem.description LIKE %(txt)s' + extra_cond = " and tabItem.has_variants=0" + if (filters and isinstance(filters, dict) + and filters.get("doctype") == "BOM"): + extra_cond = "" + del filters["doctype"] + return frappe.db.sql("""select tabItem.name, if(length(tabItem.item_name) > 40, concat(substr(tabItem.item_name, 1, 40), "..."), item_name) as item_name, @@ -188,11 +194,11 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals {columns} from tabItem where tabItem.docstatus < 2 - and tabItem.has_variants=0 and tabItem.disabled=0 and (tabItem.end_of_life > %(today)s or ifnull(tabItem.end_of_life, '0000-00-00')='0000-00-00') and ({scond} or tabItem.item_code IN (select parent from `tabItem Barcode` where barcode LIKE %(txt)s) {description_cond}) + {extra_cond} {fcond} {mcond} order by if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999), @@ -203,6 +209,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters, as_dict=Fals key=searchfield, columns=columns, scond=searchfields, + extra_cond=extra_cond, fcond=get_filters_cond(doctype, filters, conditions).replace('%', '%%'), mcond=get_match_cond(doctype).replace('%', '%%'), description_cond = description_cond), diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js index 0051ad9dffd..ebfb7626407 100644 --- a/erpnext/manufacturing/doctype/bom/bom.js +++ b/erpnext/manufacturing/doctype/bom/bom.js @@ -29,7 +29,10 @@ frappe.ui.form.on("BOM", { frm.set_query("item", function() { return { - query: "erpnext.controllers.queries.item_query" + query: "erpnext.controllers.queries.item_query", + filters: { + "doctype": "BOM" + } }; }); @@ -119,23 +122,58 @@ frappe.ui.form.on("BOM", { }); } } + + + if (frm.doc.__onload && frm.doc.__onload["has_variants"]) { + frm.set_intro(__('This is a Template BOM and will be used to make the work order for {0} of the item {1}', + [ + `variants`, + `${frm.doc.item}`, + ]), true); + + frm.$wrapper.find(".variants-intro").on("click", () => { + frappe.set_route("List", "Item", {"variant_of": frm.doc.item}); + }); + } }, make_work_order: function(frm) { - const fields = [{ + const fields = []; + + if (frm.doc.__onload && frm.doc.__onload["has_variants"]) { + fields.push({ + fieldtype: 'Link', + label: __('Variant Item'), + fieldname: 'item', + options: "Item", + reqd: 1, + get_query: function() { + return { + query: "erpnext.controllers.queries.item_query", + filters: { + "variant_of": frm.doc.item + } + }; + } + }); + } + + fields.push({ fieldtype: 'Float', label: __('Qty To Manufacture'), fieldname: 'qty', reqd: 1, default: 1 - }]; + }); frappe.prompt(fields, data => { + let item = data.item || frm.doc.item; + frappe.call({ method: "erpnext.manufacturing.doctype.work_order.work_order.make_work_order", args: { bom_no: frm.doc.name, - item: frm.doc.item, + item: item, qty: data.qty || 0.0, project: frm.doc.project }, diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index b3e602bdfab..6ccd12aed3a 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -59,6 +59,10 @@ class BOM(WebsiteGenerator): self.name = name + def onload(self): + super(BOM, self).onload() + if self.get("item") and cint(frappe.db.get_value("Item", self.item, "has_variants")): + self.set_onload("has_variants", True) def validate(self): self.route = frappe.scrub(self.name).replace('_', '-')