feat: Provision to fetch items from BOM in Stock Entry

Items are populated in child table and amounts are calculated
Warehouse Fields in popup toggle based on Stock Entry Type
This commit is contained in:
marination 2019-11-04 19:41:04 +05:30
parent 213785e6d5
commit 075f6ea0d5
2 changed files with 74 additions and 0 deletions

View File

@ -599,6 +599,7 @@ def get_bom_items_as_dict(bom, company, qty=1, fetch_exploded=1, fetch_scrap_ite
item.image,
bom.project,
item.stock_uom,
item.item_group,
item.allow_alternative_item,
item_default.default_warehouse,
item_default.expense_account as expense_account,

View File

@ -181,6 +181,12 @@ frappe.ui.form.on('Stock Entry', {
}
}
if (frm.doc.docstatus === 0) {
frm.add_custom_button(__('Bill of Materials'), function(){
frm.events.get_items_from_bom(frm);
}, __("Get items from"));
}
if (frm.doc.docstatus===0) {
frm.add_custom_button(__('Purchase Invoice'), function() {
erpnext.utils.map_current_doc({
@ -387,6 +393,73 @@ frappe.ui.form.on('Stock Entry', {
}
},
get_items_from_bom: function(frm) {
let filters = function(){
return {filters: { docstatus:1 }};
}
let fields = [
{"fieldname":"bom", "fieldtype":"Link", "label":__("BOM"),
options:"BOM", reqd: 1, get_query: filters()},
{"fieldname":"source_warehouse", "fieldtype":"Link", "label":__("Source Warehouse"),
options:"Warehouse"},
{"fieldname":"target_warehouse", "fieldtype":"Link", "label":__("Target Warehouse"),
options:"Warehouse"},
{"fieldname":"qty", "fieldtype":"Float", "label":__("Quantity"),
reqd: 1, "default": 1},
{"fieldname":"fetch_exploded", "fieldtype":"Check",
"label":__("Fetch exploded BOM (including sub-assemblies)"), "default":1},
{"fieldname":"fetch", "label":__("Get Items from BOM"), "fieldtype":"Button"}
]
if (frm.doc.stock_entry_type == 'Material Issue'){
fields.splice(2,1);
}
else if(frm.doc.stock_entry_type == 'Material Receipt'){
fields.splice(1,1);
}
let d = new frappe.ui.Dialog({
title: __("Get Items from BOM"),
fields: fields
});
d.get_input("fetch").on("click", function() {
let values = d.get_values();
if(!values) return;
values["company"] = frm.doc.company;
if(!frm.doc.company) frappe.throw(__("Company field is required"));
frappe.call({
method: "erpnext.manufacturing.doctype.bom.bom.get_bom_items",
args: values,
callback: function(r) {
if (!r.message) {
frappe.throw(__("BOM does not contain any stock item"));
} else {
erpnext.utils.remove_empty_first_row(frm, "items");
$.each(r.message, function(i, item) {
let d = frappe.model.add_child(cur_frm.doc, "Stock Entry Detail", "items");
d.item_code = item.item_code;
d.item_name = item.item_name;
d.item_group = item.item_group;
d.s_warehouse = values.source_warehouse;
d.t_warehouse = values.target_warehouse;
d.uom = item.stock_uom;
d.stock_uom = item.stock_uom;
d.conversion_factor = 1;
d.qty = item.qty;
d.expense_account = item.expense_account;
d.project = item.project;
frm.events.set_basic_rate(frm, d.doctype, d.name);
});
}
d.hide();
refresh_field("items");
}
});
});
d.show();
},
calculate_basic_amount: function(frm, item) {
item.basic_amount = flt(flt(item.transfer_qty) * flt(item.basic_rate),
precision("basic_amount", item));