fix: BOM for variant items (#44580) (cherry picked from commit93e9517f5d) Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com> (cherry picked from commit0b268279cf)
This commit is contained in:
@@ -182,25 +182,30 @@ frappe.ui.form.on("BOM", {
|
|||||||
},
|
},
|
||||||
|
|
||||||
make_work_order(frm) {
|
make_work_order(frm) {
|
||||||
frm.events.setup_variant_prompt(frm, "Work Order", (frm, item, data, variant_items) => {
|
frm.events.setup_variant_prompt(
|
||||||
frappe.call({
|
frm,
|
||||||
method: "erpnext.manufacturing.doctype.work_order.work_order.make_work_order",
|
"Work Order",
|
||||||
args: {
|
(frm, item, data, variant_items, use_multi_level_bom) => {
|
||||||
bom_no: frm.doc.name,
|
frappe.call({
|
||||||
item: item,
|
method: "erpnext.manufacturing.doctype.work_order.work_order.make_work_order",
|
||||||
qty: data.qty || 0.0,
|
args: {
|
||||||
project: frm.doc.project,
|
bom_no: frm.doc.name,
|
||||||
variant_items: variant_items,
|
item: item,
|
||||||
},
|
qty: data.qty || 0.0,
|
||||||
freeze: true,
|
project: frm.doc.project,
|
||||||
callback(r) {
|
variant_items: variant_items,
|
||||||
if (r.message) {
|
use_multi_level_bom: use_multi_level_bom,
|
||||||
let doc = frappe.model.sync(r.message)[0];
|
},
|
||||||
frappe.set_route("Form", doc.doctype, doc.name);
|
freeze: true,
|
||||||
}
|
callback(r) {
|
||||||
},
|
if (r.message) {
|
||||||
});
|
let doc = frappe.model.sync(r.message)[0];
|
||||||
});
|
frappe.set_route("Form", doc.doctype, doc.name);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
make_variant_bom(frm) {
|
make_variant_bom(frm) {
|
||||||
@@ -248,6 +253,13 @@ frappe.ui.form.on("BOM", {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
fields.push({
|
||||||
|
fieldtype: "Check",
|
||||||
|
label: __("Use Multi-Level BOM"),
|
||||||
|
fieldname: "use_multi_level_bom",
|
||||||
|
default: 1,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!skip_qty_field) {
|
if (!skip_qty_field) {
|
||||||
@@ -285,6 +297,7 @@ frappe.ui.form.on("BOM", {
|
|||||||
fieldname: "items",
|
fieldname: "items",
|
||||||
fieldtype: "Table",
|
fieldtype: "Table",
|
||||||
label: __("Raw Materials"),
|
label: __("Raw Materials"),
|
||||||
|
depends_on: "eval:!doc.use_multi_level_bom",
|
||||||
fields: [
|
fields: [
|
||||||
{
|
{
|
||||||
fieldname: "item_code",
|
fieldname: "item_code",
|
||||||
@@ -347,14 +360,15 @@ frappe.ui.form.on("BOM", {
|
|||||||
(data) => {
|
(data) => {
|
||||||
let item = data.item || frm.doc.item;
|
let item = data.item || frm.doc.item;
|
||||||
let variant_items = data.items || [];
|
let variant_items = data.items || [];
|
||||||
|
let use_multi_level_bom = data.use_multi_level_bom || 0;
|
||||||
|
|
||||||
variant_items.forEach((d) => {
|
variant_items.forEach((d) => {
|
||||||
if (!d.variant_item_code) {
|
if (!d.variant_item_code && !use_multi_level_bom) {
|
||||||
frappe.throw(__("Select variant item code for the template item {0}", [d.item_code]));
|
frappe.throw(__("Select variant item code for the template item {0}", [d.item_code]));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
callback(frm, item, data, variant_items);
|
callback(frm, item, data, variant_items, use_multi_level_bom);
|
||||||
},
|
},
|
||||||
__(title),
|
__(title),
|
||||||
__("Create")
|
__("Create")
|
||||||
|
|||||||
@@ -1299,7 +1299,7 @@ def get_item_details(item, project=None, skip_bom_info=False, throw=True):
|
|||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_work_order(bom_no, item, qty=0, project=None, variant_items=None):
|
def make_work_order(bom_no, item, qty=0, project=None, variant_items=None, use_multi_level_bom=None):
|
||||||
if not frappe.has_permission("Work Order", "write"):
|
if not frappe.has_permission("Work Order", "write"):
|
||||||
frappe.throw(_("Not permitted"), frappe.PermissionError)
|
frappe.throw(_("Not permitted"), frappe.PermissionError)
|
||||||
|
|
||||||
@@ -1309,12 +1309,13 @@ def make_work_order(bom_no, item, qty=0, project=None, variant_items=None):
|
|||||||
wo_doc.production_item = item
|
wo_doc.production_item = item
|
||||||
wo_doc.update(item_details)
|
wo_doc.update(item_details)
|
||||||
wo_doc.bom_no = bom_no
|
wo_doc.bom_no = bom_no
|
||||||
|
wo_doc.use_multi_level_bom = cint(use_multi_level_bom)
|
||||||
|
|
||||||
if flt(qty) > 0:
|
if flt(qty) > 0:
|
||||||
wo_doc.qty = flt(qty)
|
wo_doc.qty = flt(qty)
|
||||||
wo_doc.get_items_and_operations_from_bom()
|
wo_doc.get_items_and_operations_from_bom()
|
||||||
|
|
||||||
if variant_items:
|
if variant_items and not wo_doc.use_multi_level_bom:
|
||||||
add_variant_item(variant_items, wo_doc, bom_no, "required_items")
|
add_variant_item(variant_items, wo_doc, bom_no, "required_items")
|
||||||
|
|
||||||
return wo_doc
|
return wo_doc
|
||||||
@@ -1358,7 +1359,18 @@ def add_variant_item(variant_items, wo_doc, bom_no, table_name="items"):
|
|||||||
|
|
||||||
args["amount"] = flt(args.get("required_qty")) * flt(args.get("rate"))
|
args["amount"] = flt(args.get("required_qty")) * flt(args.get("rate"))
|
||||||
args["uom"] = item_data.stock_uom
|
args["uom"] = item_data.stock_uom
|
||||||
wo_doc.append(table_name, args)
|
|
||||||
|
existing_row = get_template_rm_item(wo_doc, item.get("item_code"))
|
||||||
|
if existing_row:
|
||||||
|
existing_row.update(args)
|
||||||
|
else:
|
||||||
|
wo_doc.append(table_name, args)
|
||||||
|
|
||||||
|
|
||||||
|
def get_template_rm_item(wo_doc, item_code):
|
||||||
|
for row in wo_doc.required_items:
|
||||||
|
if row.item_code == item_code:
|
||||||
|
return row
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
|
|||||||
Reference in New Issue
Block a user