Skip to content

Commit

Permalink
fix: added validation for Final Product
Browse files Browse the repository at this point in the history
  • Loading branch information
rohitwaghchaure committed Aug 11, 2023
1 parent 2ac4d46 commit 2e70255
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 26 deletions.
35 changes: 23 additions & 12 deletions erpnext/manufacturing/doctype/bom_creator/bom_creator.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,30 @@ frappe.ui.form.on("BOM Creator", {
if (!frm.is_new()) {
if ((!frappe.bom_configurator
|| frappe.bom_configurator.bom_configurator !== frm.doc.name)) {
let $parent = $(frm.fields_dict["bom_creator"].wrapper);
$parent.empty();

frappe.require('bom_configurator.bundle.js').then(() => {
frappe.bom_configurator = new frappe.ui.BOMConfigurator({
wrapper: $parent,
page: $parent,
frm: frm,
bom_configurator: frm.doc.name,
});
});
frm.trigger("build_tree");
}
} else {
let $parent = $(frm.fields_dict["bom_creator"].wrapper);
$parent.empty();
frm.trigger("make_new_entry");
}
},

build_tree(frm) {
let $parent = $(frm.fields_dict["bom_creator"].wrapper);
$parent.empty();
frm.toggle_enable("item_code", false);

frappe.require('bom_configurator.bundle.js').then(() => {
frappe.bom_configurator = new frappe.ui.BOMConfigurator({
wrapper: $parent,
page: $parent,
frm: frm,
bom_configurator: frm.doc.name,
});
});
},

make_new_entry(frm) {
let dialog = new frappe.ui.Dialog({
title: __("Multi-level BOM Creator"),
Expand Down Expand Up @@ -122,7 +129,11 @@ frappe.ui.form.on("BOM Creator", {
},

add_custom_buttons(frm) {
//
if (!frm.is_new()) {
frm.add_custom_button(__("Rebuild Tree"), () => {
frm.trigger("build_tree");
});
}
}
});

Expand Down
21 changes: 18 additions & 3 deletions erpnext/manufacturing/doctype/bom_creator/bom_creator.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,19 @@
class BOMCreator(Document):
def before_save(self):
self.set_status()
self.set_is_expandable()
self.set_conversion_factor()
self.set_reference_id()
self.set_is_expandable()
self.set_rate_for_items()

def validate(self):
self.validate_items()

def validate_items(self):
for row in self.items:
if row.is_expandable and row.item_code == self.item_code:
frappe.throw(_("Item {0} cannot be added as a sub-assembly of itself").format(row.item_code))

def set_status(self, save=False):
self.status = {
0: "Draft",
Expand Down Expand Up @@ -135,7 +143,7 @@ def get_raw_material_cost(self, fg_reference_id=None, amount=0):
return amount

def set_is_expandable(self):
fg_items = [row.fg_item for row in self.items]
fg_items = [row.fg_item for row in self.items if row.fg_item != self.item_code]
for row in self.items:
row.is_expandable = 0
if row.item_code in fg_items:
Expand Down Expand Up @@ -231,6 +239,7 @@ def create_bom(self, row, production_item_wise_rm):

for item in production_item_wise_rm[(row.item_code, row.name)]["items"]:
bom_no = ""
item.do_not_explode = 1
if (item.item_code, item.name) in production_item_wise_rm:
bom_no = production_item_wise_rm.get((item.item_code, item.name)).bom_no
item.do_not_explode = 0
Expand Down Expand Up @@ -343,6 +352,7 @@ def add_sub_assembly(**kwargs):
"stock_qty": bom_item.qty,
"fg_reference_id": name,
"do_not_explode": 1,
"is_expandable": 1,
"stock_uom": item_info.stock_uom,
},
)
Expand Down Expand Up @@ -405,5 +415,10 @@ def delete_node(**kwargs):


@frappe.whitelist()
def edit_qty(doctype, docname, qty):
def edit_qty(doctype, docname, qty, parent):
frappe.db.set_value(doctype, docname, "qty", qty)
doc = frappe.get_doc("BOM Creator", parent)
doc.set_rate_for_items()
doc.save()

return doc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"charts": [],
"content": "[{\"id\":\"csBCiDglCE\",\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Your Shortcuts</b></span>\",\"col\":12}},{\"id\":\"ycOi0I1bMV\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Multi-level BOM Creator\",\"col\":3}},{\"id\":\"xit0dg7KvY\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"BOM\",\"col\":3}},{\"id\":\"LRhGV9GAov\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Production Plan\",\"col\":3}},{\"id\":\"69KKosI6Hg\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Work Order\",\"col\":3}},{\"id\":\"PwndxuIpB3\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Job Card\",\"col\":3}},{\"id\":\"OaiDqTT03Y\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Forecasting\",\"col\":3}},{\"id\":\"OtMcArFRa5\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"BOM Stock Report\",\"col\":3}},{\"id\":\"76yYsI5imF\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Production Planning Report\",\"col\":3}},{\"id\":\"PIQJYZOMnD\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Learn Manufacturing\",\"col\":3}},{\"id\":\"bN_6tHS-Ct\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"yVEFZMqVwd\",\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Reports &amp; Masters</b></span>\",\"col\":12}},{\"id\":\"rwrmsTI58-\",\"type\":\"card\",\"data\":{\"card_name\":\"Production\",\"col\":4}},{\"id\":\"6dnsyX-siZ\",\"type\":\"card\",\"data\":{\"card_name\":\"Bill of Materials\",\"col\":4}},{\"id\":\"CIq-v5f5KC\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"8RRiQeYr0G\",\"type\":\"card\",\"data\":{\"card_name\":\"Tools\",\"col\":4}},{\"id\":\"Pu8z7-82rT\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]",
"content": "[{\"id\":\"csBCiDglCE\",\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Your Shortcuts</b></span>\",\"col\":12}},{\"id\":\"YHCQG3wAGv\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"BOM Creator\",\"col\":3}},{\"id\":\"xit0dg7KvY\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"BOM\",\"col\":3}},{\"id\":\"LRhGV9GAov\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Production Plan\",\"col\":3}},{\"id\":\"69KKosI6Hg\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Work Order\",\"col\":3}},{\"id\":\"PwndxuIpB3\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Job Card\",\"col\":3}},{\"id\":\"OaiDqTT03Y\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Forecasting\",\"col\":3}},{\"id\":\"OtMcArFRa5\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"BOM Stock Report\",\"col\":3}},{\"id\":\"76yYsI5imF\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Production Planning Report\",\"col\":3}},{\"id\":\"PIQJYZOMnD\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Learn Manufacturing\",\"col\":3}},{\"id\":\"bN_6tHS-Ct\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"yVEFZMqVwd\",\"type\":\"header\",\"data\":{\"text\":\"<span class=\\\"h4\\\"><b>Reports &amp; Masters</b></span>\",\"col\":12}},{\"id\":\"rwrmsTI58-\",\"type\":\"card\",\"data\":{\"card_name\":\"Production\",\"col\":4}},{\"id\":\"6dnsyX-siZ\",\"type\":\"card\",\"data\":{\"card_name\":\"Bill of Materials\",\"col\":4}},{\"id\":\"CIq-v5f5KC\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"8RRiQeYr0G\",\"type\":\"card\",\"data\":{\"card_name\":\"Tools\",\"col\":4}},{\"id\":\"Pu8z7-82rT\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]",
"creation": "2020-03-02 17:11:37.032604",
"custom_blocks": [],
"docstatus": 0,
Expand Down Expand Up @@ -316,7 +316,7 @@
"type": "Link"
}
],
"modified": "2023-08-08 15:32:20.304160",
"modified": "2023-08-08 22:28:39.633891",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Manufacturing",
Expand All @@ -339,7 +339,7 @@
{
"color": "Grey",
"doc_view": "List",
"label": "Multi-level BOM Creator",
"label": "BOM Creator",
"link_to": "BOM Creator",
"type": "DocType"
},
Expand Down
28 changes: 22 additions & 6 deletions erpnext/public/js/bom_configurator/bom_configurator.bundle.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,15 @@ class BOMConfigurator {

bind_events() {
frappe.views.trees["BOM Configurator"].events = {
frm: this.frm,
add_item: this.add_item,
add_sub_assembly: this.add_sub_assembly,
get_sub_assembly_modal_fields: this.get_sub_assembly_modal_fields,
convert_to_sub_assembly: this.convert_to_sub_assembly,
delete_node: this.delete_node,
edit_qty: this.edit_qty,
frm: this.frm,
load_tree: this.load_tree,
set_default_qty: this.set_default_qty,
}
}

Expand Down Expand Up @@ -93,9 +94,8 @@ class BOMConfigurator {
display: inline-flex;
min-width: 128px;
border: 1px solid var(--bg-gray);
"
data-bom-qty-docname="${docname}">
<div style="padding-right:5px">${qty} ${uom}</div>
">
<div style="padding-right:5px" data-bom-qty-docname="${docname}">${qty} ${uom}</div>
<div class="fg-item-amt" style="padding-left:12px; border-left:1px solid var(--bg-gray)">
${amount}
</div>
Expand All @@ -108,7 +108,7 @@ class BOMConfigurator {
label:__(frappe.utils.icon('edit', 'sm') + " Qty"),
click: function(node) {
let view = frappe.views.trees["BOM Configurator"];
view.events.edit_qty(node);
view.events.edit_qty(node, view);
},
btnClass: "hidden-xs"
},
Expand Down Expand Up @@ -232,6 +232,7 @@ class BOMConfigurator {
});

dialog.show();
view.events.set_default_qty(dialog);

dialog.set_primary_action(__("Add"), () => {
let bom_item = dialog.get_values();
Expand Down Expand Up @@ -285,6 +286,8 @@ class BOMConfigurator {
});

dialog.show();
view.events.set_default_qty(dialog);

dialog.set_primary_action(__("Add"), () => {
let bom_item = dialog.get_values();

Expand All @@ -307,6 +310,17 @@ class BOMConfigurator {
});
}

set_default_qty(dialog) {
dialog.fields_dict.items.grid.fields_map.item_code.onchange = function (event) {
if (event) {
let name = $(event.currentTarget).closest('.grid-row').attr("data-name")
let item_row = dialog.fields_dict.items.grid.grid_rows_by_docname[name].doc;
item_row.qty = 1;
dialog.fields_dict.items.grid.refresh()
}
}
}

delete_node(node, view) {
frappe.confirm(__("Are you sure you want to delete this Item?"), () => {
frappe.call({
Expand All @@ -324,7 +338,7 @@ class BOMConfigurator {
});
}

edit_qty(node) {
edit_qty(node, view) {
let qty = node.data.qty || this.frm.doc.qty;
frappe.prompt([
{ label: __("Qty"), fieldname: "qty", default: qty, fieldtype: "Float", reqd: 1 },
Expand All @@ -339,11 +353,13 @@ class BOMConfigurator {
doctype: doctype,
docname: docname,
qty: data.qty,
parent: node.data.parent_id,
},
callback: (r) => {
node.data.qty = data.qty;
let uom = node.data.uom || this.frm.doc.uom;
$(node.parent.get(0)).find(`[data-bom-qty-docname='${docname}']`).html(data.qty + " " + uom);
view.events.load_tree(r, node);
}
});
},
Expand Down
2 changes: 0 additions & 2 deletions erpnext/setup/doctype/holiday_list/holiday_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
from frappe import _, throw
from frappe.model.document import Document
from frappe.utils import formatdate, getdate, today
from holidays import country_holidays
from holidays.utils import list_supported_countries


class OverlapError(frappe.ValidationError):
Expand Down

0 comments on commit 2e70255

Please sign in to comment.