From a0d0f70f6292d15740a8b9d665d9832939865233 Mon Sep 17 00:00:00 2001 From: esaLCuE Date: Fri, 21 Mar 2025 10:28:50 +0100 Subject: [PATCH 1/5] Changed item group field to multiselect and added items multiselect field --- .../itemwise_recommended_reorder_level.js | 55 +++++++++++++++++++ .../itemwise_recommended_reorder_level.py | 27 +++++++-- .../stock/report/stock_ledger/stock_ledger.py | 17 ++++++ 3 files changed, 95 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js index 8d46b14a177..e23546e452c 100644 --- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js +++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js @@ -16,6 +16,7 @@ frappe.query_reports["Itemwise Recommended Reorder Level"] = { default: frappe.datetime.get_today(), }, { +<<<<<<< HEAD fieldname: "item_group", label: __("Item Group"), fieldtype: "Link", @@ -30,3 +31,57 @@ frappe.query_reports["Itemwise Recommended Reorder Level"] = { }, ], }; +======= + "fieldname":"brand", + "label": __("Brand"), + "fieldtype": "Link", + "options": "Brand" + }, + { + "fieldname":"item_group", + "label": __("Item Group"), + "fieldtype": "MultiSelectList", + "width": "100", + get_data: function(txt) { + return frappe.db.get_link_options('Item Group', txt); + }, + + on_change: function(report){ + let itGro = frappe.query_report.get_filter_value("item_group"); + console.log("itGro : ", itGro); + let itNam = frappe.query_report.get_filter_value("item_name"); + console.log("itNam : ", itNam); + + frappe.db.get_list("Item", { + filters: { + item_group:["in", itGro], + name:["in", itNam] + }, + fields:["name"] + }).then((items) => { + let itemNames = items.map(item=>item.name); + frappe.query_report.set_filter_value("item_name", itemNames); + }) + + report.refresh(); + } + }, + { + "fieldname":"item_name", + "label": __("Items"), + "fieldtype": "MultiSelectList", + "width": "100", + get_data: function(txt) { + let itGro = frappe.query_report.get_filter_value("item_group"); + if (itGro==""){ + return frappe.db.get_link_options('Item', txt) + } else { + return frappe.db.get_link_options('Item', txt, { + "item_group":["in", itGro] + }); + } + } + }, + ] +} +>>>>>>> 01f8923e0f (Changed item group field to multiselect and added items multiselect field) diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py index c4358b809fc..f8da3077267 100644 --- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py +++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: GNU General Public License v3. See license.txt +from erpnext.stock.report.stock_ledger.stock_ledger import get_item_name_condition import frappe from frappe import _ from frappe.query_builder.functions import Abs, Sum @@ -69,10 +70,13 @@ def get_columns(): def get_item_info(filters): from erpnext.stock.report.stock_ledger.stock_ledger import get_item_group_condition + from pypika import Criterion item = frappe.qb.DocType("Item") + ig = frappe.qb.DocType("Item Group") query = ( frappe.qb.from_(item) + .from_(ig) .select( item.name, item.item_name, @@ -82,14 +86,29 @@ def get_item_info(filters): item.safety_stock, item.lead_time_days, ) - .where((item.is_stock_item == 1) & (item.disabled == 0)) + .where( + (item.is_stock_item == 1) + & (item.disabled == 0) + & (item.item_group == ig.name) + ) ) if brand := filters.get("brand"): query = query.where(item.brand == brand) - - if conditions := get_item_group_condition(filters.get("item_group"), item): - query = query.where(conditions) + + groups = filters.get("item_group") + conditions = [] + for group in groups: + if condition := get_item_group_condition(group, item): + conditions.append(condition) + query = query.where(Criterion.any(conditions)) + + items = filters.get("item_name") + conditions=[] + for itm in items: + if condition := get_item_name_condition(itm, item): + conditions.append(condition) + query = query.where(Criterion.any(conditions)) return query.run(as_dict=True) diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py index 391395503b0..2da1f958671 100644 --- a/erpnext/stock/report/stock_ledger/stock_ledger.py +++ b/erpnext/stock/report/stock_ledger/stock_ledger.py @@ -657,3 +657,20 @@ def check_inventory_dimension_filters_applied(filters) -> bool: return True return False + +def get_item_name_condition(itemf, item_table=None): + item_name_details = frappe.db.get_value("Item", itemf, as_dict=1) + if item_name_details: + if item_table: + itn = frappe.qb.DocType("Item") + return item_table.name.isin( + ( + frappe.qb.from_(itn) + .select(itn.name) + .where( + (itemf == itn.item_code) + ) + ) + ) + else: + return -- GitLab From 4199f36522276181b4d34cb592301eb63b4fe5c6 Mon Sep 17 00:00:00 2001 From: esaLCuE Date: Fri, 21 Mar 2025 12:18:24 +0100 Subject: [PATCH 2/5] fix: material request option checks all items have one --- .../doctype/production_plan/production_plan.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py index 6f600cc08e3..3d4d39c0e3a 100644 --- a/erpnext/manufacturing/doctype/production_plan/production_plan.py +++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py @@ -550,6 +550,7 @@ class ProductionPlan(Document): self.db_set("status", self.status) def on_submit(self): + self.check_production_items() self.update_bin_qty() self.update_sales_order() @@ -734,6 +735,7 @@ class ProductionPlan(Document): if self.sub_assembly_items: item["use_multi_level_bom"] = 0 + self.check_production_items() set_default_warehouses(item, default_warehouses) work_order = self.create_work_order(item) if work_order: @@ -1099,6 +1101,11 @@ class ProductionPlan(Document): all_work_orders_completed = all(s == "Completed" for s in wo_status) return all_work_orders_completed + def check_production_items(self): + items_data = self.get_production_items() + for key, item in items_data.items(): + if (item["material_request"] is None and self.get_items_from=="Material Request"): + frappe.throw("Une demande de matériel est nécessaire pour chaque article") @frappe.whitelist() def download_raw_materials(doc, warehouses=None): -- GitLab From e96440e66b6538c13a2f7534defb6c1c7161ab34 Mon Sep 17 00:00:00 2001 From: esaLCuE Date: Fri, 21 Mar 2025 17:11:58 +0100 Subject: [PATCH 3/5] wip --- test.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 test.txt diff --git a/test.txt b/test.txt new file mode 100644 index 00000000000..632e4fe73c3 --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +Bonjour -- GitLab From e8fca71e5cd8f9df7cff7e3dafe74302c1d20410 Mon Sep 17 00:00:00 2001 From: esaLCuE Date: Thu, 27 Mar 2025 11:34:15 +0100 Subject: [PATCH 4/5] fixes update --- .../doctype/production_plan/production_plan.py | 4 +++- erpnext/setup/install.py | 2 +- .../itemwise_recommended_reorder_level.py | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py index 3d4d39c0e3a..f375aebcde6 100644 --- a/erpnext/manufacturing/doctype/production_plan/production_plan.py +++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py @@ -1103,9 +1103,11 @@ class ProductionPlan(Document): def check_production_items(self): items_data = self.get_production_items() + row=0 for key, item in items_data.items(): + row += 1 if (item["material_request"] is None and self.get_items_from=="Material Request"): - frappe.throw("Une demande de matériel est nécessaire pour chaque article") + frappe.throw(_("Row #{0} : This article is not related to a material request").format(row)) @frappe.whitelist() def download_raw_materials(doc, warehouses=None): diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index cfe62b16b11..91a4cf1bd16 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -97,7 +97,7 @@ def set_single_defaults(): pass setup_currency_exchange() - set_venue_settings_defaults() +# set_venue_settings_defaults() def setup_currency_exchange(): diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py index f8da3077267..cad2c089b4b 100644 --- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py +++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py @@ -73,10 +73,10 @@ def get_item_info(filters): from pypika import Criterion item = frappe.qb.DocType("Item") - ig = frappe.qb.DocType("Item Group") +# ig = frappe.qb.DocType("Item Group") query = ( frappe.qb.from_(item) - .from_(ig) +# .from_(ig) .select( item.name, item.item_name, @@ -89,7 +89,7 @@ def get_item_info(filters): .where( (item.is_stock_item == 1) & (item.disabled == 0) - & (item.item_group == ig.name) +# & (item.item_group == ig.name) ) ) -- GitLab From 804c2a18afb514e5556537de9115f2b7dddcf17a Mon Sep 17 00:00:00 2001 From: esaLCuE Date: Fri, 4 Apr 2025 11:56:07 +0200 Subject: [PATCH 5/5] More explicit names --- .../itemwise_recommended_reorder_level.js | 29 ++++--------------- .../stock/report/stock_ledger/stock_ledger.py | 12 ++++---- 2 files changed, 11 insertions(+), 30 deletions(-) diff --git a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js index e23546e452c..ee9c819ebd0 100644 --- a/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js +++ b/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.js @@ -16,22 +16,6 @@ frappe.query_reports["Itemwise Recommended Reorder Level"] = { default: frappe.datetime.get_today(), }, { -<<<<<<< HEAD - fieldname: "item_group", - label: __("Item Group"), - fieldtype: "Link", - options: "Item Group", - reqd: 1, - }, - { - fieldname: "brand", - label: __("Brand"), - fieldtype: "Link", - options: "Brand", - }, - ], -}; -======= "fieldname":"brand", "label": __("Brand"), "fieldtype": "Link", @@ -47,15 +31,13 @@ frappe.query_reports["Itemwise Recommended Reorder Level"] = { }, on_change: function(report){ - let itGro = frappe.query_report.get_filter_value("item_group"); - console.log("itGro : ", itGro); - let itNam = frappe.query_report.get_filter_value("item_name"); - console.log("itNam : ", itNam); + let selectedGroups = frappe.query_report.get_filter_value("item_group"); + let selectedItems = frappe.query_report.get_filter_value("item_name"); frappe.db.get_list("Item", { filters: { - item_group:["in", itGro], - name:["in", itNam] + item_group:["in", selectedGroups], + name:["in", selectedItems] }, fields:["name"] }).then((items) => { @@ -83,5 +65,4 @@ frappe.query_reports["Itemwise Recommended Reorder Level"] = { } }, ] -} ->>>>>>> 01f8923e0f (Changed item group field to multiselect and added items multiselect field) +} \ No newline at end of file diff --git a/erpnext/stock/report/stock_ledger/stock_ledger.py b/erpnext/stock/report/stock_ledger/stock_ledger.py index 2da1f958671..77d97ebe3ef 100644 --- a/erpnext/stock/report/stock_ledger/stock_ledger.py +++ b/erpnext/stock/report/stock_ledger/stock_ledger.py @@ -658,17 +658,17 @@ def check_inventory_dimension_filters_applied(filters) -> bool: return False -def get_item_name_condition(itemf, item_table=None): - item_name_details = frappe.db.get_value("Item", itemf, as_dict=1) +def get_item_name_condition(selectedItem, item_table=None): + item_name_details = frappe.db.get_value("Item", selectedItem, as_dict=1) if item_name_details: if item_table: - itn = frappe.qb.DocType("Item") + itm = frappe.qb.DocType("Item") return item_table.name.isin( ( - frappe.qb.from_(itn) - .select(itn.name) + frappe.qb.from_(itm) + .select(itm.name) .where( - (itemf == itn.item_code) + (selectedItem == itm.item_code) ) ) ) -- GitLab