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 <nabinhait@gmail.com>
This commit is contained in:
rohitwaghchaure 2020-04-06 10:17:57 +05:30 committed by GitHub
parent 75ef458b34
commit 05ac7213b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 54 additions and 5 deletions

View File

@ -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),

View File

@ -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}',
[
`<a class="variants-intro">variants</a>`,
`<a href="#Form/Item/${frm.doc.item}">${frm.doc.item}</a>`,
]), 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
},

View File

@ -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('_', '-')