Compare commits

..

15 Commits

Author SHA1 Message Date
Frappe PR Bot
6f80af0355 chore(release): Bumped to Version 15.45.3
## [15.45.3](https://github.com/frappe/erpnext/compare/v15.45.2...v15.45.3) (2024-12-08)

### Bug Fixes

* duplicate buttons ([11fc560](11fc560a88))
2024-12-08 09:23:09 +00:00
rohitwaghchaure
0c3bf2daf1 Merge pull request #44597 from rohitwaghchaure/fixed-duplicate-buttons
fix: duplicate buttons
2024-12-08 14:51:46 +05:30
Rohit Waghchaure
11fc560a88 fix: duplicate buttons 2024-12-08 14:44:19 +05:30
Frappe PR Bot
0cd495a128 chore(release): Bumped to Version 15.45.2
## [15.45.2](https://github.com/frappe/erpnext/compare/v15.45.1...v15.45.2) (2024-12-07)

### Bug Fixes

* BOM name issue (backport [#44586](https://github.com/frappe/erpnext/issues/44586)) ([#44589](https://github.com/frappe/erpnext/issues/44589)) ([408a092](408a09233b))
2024-12-07 08:18:12 +00:00
rohitwaghchaure
3a98660739 Merge pull request #44593 from frappe/mergify/bp/version-15/pr-44589
fix: BOM name issue (backport #44586) (backport #44589)
2024-12-07 13:46:44 +05:30
rohitwaghchaure
97c91c2217 Merge branch 'version-15' into mergify/bp/version-15/pr-44589 2024-12-07 13:12:59 +05:30
rohitwaghchaure
a204abcaa5 chore: fix conflicts 2024-12-07 13:10:40 +05:30
Frappe PR Bot
3b57767d36 chore(release): Bumped to Version 15.45.1
## [15.45.1](https://github.com/frappe/erpnext/compare/v15.45.0...v15.45.1) (2024-12-07)

### Bug Fixes

* BOM for variant items (backport [#44580](https://github.com/frappe/erpnext/issues/44580)) ([#44584](https://github.com/frappe/erpnext/issues/44584)) ([2a2d8da](2a2d8da628))
* BOM name issue (backport [#44575](https://github.com/frappe/erpnext/issues/44575)) ([#44579](https://github.com/frappe/erpnext/issues/44579)) ([27b63be](27b63beb18))
* variant qty while making work order from BOM (backport [#44548](https://github.com/frappe/erpnext/issues/44548)) ([#44551](https://github.com/frappe/erpnext/issues/44551)) ([3c50cfe](3c50cfef4e))
2024-12-07 07:35:56 +00:00
rohitwaghchaure
dc74912f5d Merge pull request #44592 from frappe/mergify/bp/version-15/pr-44584
fix: BOM for variant items (backport #44580) (backport #44584)
2024-12-07 13:04:33 +05:30
rohitwaghchaure
d860a5b35d Merge pull request #44591 from frappe/mergify/bp/version-15/pr-44579
fix: BOM name issue (backport #44575) (backport #44579)
2024-12-07 13:04:03 +05:30
rohitwaghchaure
b00cc83ae6 Merge pull request #44590 from frappe/mergify/bp/version-15/pr-44551
fix: variant qty while making work order from BOM (backport #44548) (backport #44551)
2024-12-07 13:03:47 +05:30
mergify[bot]
408a09233b fix: BOM name issue (backport #44586) (#44589)
fix: BOM name issue (#44586)

(cherry picked from commit d871e21a40)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
(cherry picked from commit a5cc307417)

# Conflicts:
#	erpnext/manufacturing/doctype/bom/bom.py
2024-12-07 07:29:44 +00:00
mergify[bot]
2a2d8da628 fix: BOM for variant items (backport #44580) (#44584)
fix: BOM for variant items (#44580)

(cherry picked from commit 93e9517f5d)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
(cherry picked from commit 0b268279cf)
2024-12-07 06:57:37 +00:00
mergify[bot]
27b63beb18 fix: BOM name issue (backport #44575) (#44579)
fix: BOM name issue (#44575)

fix: bom name issue
(cherry picked from commit b7a3c6b6ca)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
(cherry picked from commit 03ae9e27be)
2024-12-07 06:56:36 +00:00
mergify[bot]
3c50cfef4e fix: variant qty while making work order from BOM (backport #44548) (#44551)
fix: variant qty while making work order from BOM (#44548)

(cherry picked from commit 1571dff3ef)

Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
(cherry picked from commit 63b1df38a8)
2024-12-07 06:56:31 +00:00
4 changed files with 67 additions and 42 deletions

View File

@@ -4,7 +4,7 @@ import inspect
import frappe
from frappe.utils.user import is_website_user
__version__ = "15.45.0"
__version__ = "15.45.3"
def get_default_company(user=None):

View File

@@ -182,25 +182,30 @@ frappe.ui.form.on("BOM", {
},
make_work_order(frm) {
frm.events.setup_variant_prompt(frm, "Work Order", (frm, item, data, variant_items) => {
frappe.call({
method: "erpnext.manufacturing.doctype.work_order.work_order.make_work_order",
args: {
bom_no: frm.doc.name,
item: item,
qty: data.qty || 0.0,
project: frm.doc.project,
variant_items: variant_items,
},
freeze: true,
callback(r) {
if (r.message) {
let doc = frappe.model.sync(r.message)[0];
frappe.set_route("Form", doc.doctype, doc.name);
}
},
});
});
frm.events.setup_variant_prompt(
frm,
"Work Order",
(frm, item, data, variant_items, use_multi_level_bom) => {
frappe.call({
method: "erpnext.manufacturing.doctype.work_order.work_order.make_work_order",
args: {
bom_no: frm.doc.name,
item: item,
qty: data.qty || 0.0,
project: frm.doc.project,
variant_items: variant_items,
use_multi_level_bom: use_multi_level_bom,
},
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) {
@@ -250,6 +255,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) {
fields.push({
fieldtype: "Float",
@@ -285,6 +297,7 @@ frappe.ui.form.on("BOM", {
fieldname: "items",
fieldtype: "Table",
label: __("Raw Materials"),
depends_on: "eval:!doc.use_multi_level_bom",
fields: [
{
fieldname: "item_code",
@@ -347,14 +360,15 @@ frappe.ui.form.on("BOM", {
(data) => {
let item = data.item || frm.doc.item;
let variant_items = data.items || [];
let use_multi_level_bom = data.use_multi_level_bom || 0;
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]));
}
});
callback(frm, item, data, variant_items);
callback(frm, item, data, variant_items, use_multi_level_bom);
},
__(title),
__("Create")
@@ -364,7 +378,7 @@ frappe.ui.form.on("BOM", {
dialog.fields_dict.items.df.data.push({
item_code: d.item_code,
variant_item_code: "",
qty: d.qty,
qty: (d.qty / frm.doc.quantity) * (dialog.fields_dict.qty.value || 1),
source_warehouse: d.source_warehouse,
operation: d.operation,
});

View File

@@ -176,13 +176,10 @@ class BOM(WebsiteGenerator):
search_key = f"{self.doctype}-{self.item}%"
existing_boms = frappe.get_all(
"BOM", filters={"name": ("like", search_key), "amended_from": ["is", "not set"]}, pluck="name"
"BOM", filters={"name": search_key, "amended_from": ["is", "not set"]}, pluck="name"
)
if existing_boms:
index = self.get_next_version_index(existing_boms)
else:
index = 1
index = self.get_index_for_bom(existing_boms)
prefix = self.doctype
suffix = "%.3i" % index # convert index to string (1 -> "001")
@@ -200,21 +197,23 @@ class BOM(WebsiteGenerator):
name = f"{prefix}-{truncated_item_name}-{suffix}"
if frappe.db.exists("BOM", name):
conflicting_bom = frappe.get_doc("BOM", name)
existing_boms = frappe.get_all(
"BOM", filters={"name": ("like", search_key), "amended_from": ["is", "not set"]}, pluck="name"
)
if conflicting_bom.item != self.item:
msg = _("A BOM with name {0} already exists for item {1}.").format(
frappe.bold(name), frappe.bold(conflicting_bom.item)
)
frappe.throw(
_("{0}{1} Did you rename the item? Please contact Administrator / Tech support").format(
msg, "<br>"
)
)
index = self.get_index_for_bom(existing_boms)
suffix = "%.3i" % index
name = f"{prefix}-{self.item}-{suffix}"
self.name = name
def get_index_for_bom(self, existing_boms):
index = 1
if existing_boms:
index = self.get_next_version_index(existing_boms)
return index
@staticmethod
def get_next_version_index(existing_boms: list[str]) -> int:
# split by "/" and "-"

View File

@@ -1299,7 +1299,7 @@ def get_item_details(item, project=None, skip_bom_info=False, throw=True):
@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"):
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.update(item_details)
wo_doc.bom_no = bom_no
wo_doc.use_multi_level_bom = cint(use_multi_level_bom)
if flt(qty) > 0:
wo_doc.qty = flt(qty)
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")
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["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()