From b5e6c3e70302b0ab72f6af0d0b786dff34db654f Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 7 Nov 2025 15:25:47 +0530 Subject: [PATCH] feat: Allow Editing of Items and Quantities in Work Order --- .../manufacturing_settings/manufacturing_settings.json | 10 +++++++++- .../manufacturing_settings/manufacturing_settings.py | 1 + erpnext/manufacturing/doctype/work_order/work_order.js | 5 +++++ erpnext/manufacturing/doctype/work_order/work_order.py | 7 ++++++- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json index 7eadbf22c81..80e97f8fb46 100644 --- a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json +++ b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json @@ -15,6 +15,7 @@ "bom_section", "update_bom_costs_automatically", "column_break_lhyt", + "allow_editing_of_items_and_quantities_in_work_order", "section_break_6", "default_wip_warehouse", "default_fg_warehouse", @@ -261,13 +262,20 @@ "fieldname": "transfer_extra_materials_percentage", "fieldtype": "Percent", "label": "Transfer Extra Raw Materials to WIP (%)" + }, + { + "default": "0", + "description": "If enabled, the system will allow users to edit the raw materials and their quantities in the Work Order. The system will not reset the quantities as per the BOM, if the user has changed them.", + "fieldname": "allow_editing_of_items_and_quantities_in_work_order", + "fieldtype": "Check", + "label": "Allow Editing of Items and Quantities in Work Order" } ], "icon": "icon-wrench", "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2025-09-08 19:48:31.726126", + "modified": "2025-11-07 14:52:56.241459", "modified_by": "Administrator", "module": "Manufacturing", "name": "Manufacturing Settings", diff --git a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py index 85669c8372a..b3d7742929e 100644 --- a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py +++ b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py @@ -18,6 +18,7 @@ class ManufacturingSettings(Document): from frappe.types import DF add_corrective_operation_cost_in_finished_good_valuation: DF.Check + allow_editing_of_items_and_quantities_in_work_order: DF.Check allow_overtime: DF.Check allow_production_on_holidays: DF.Check backflush_raw_materials_based_on: DF.Literal["BOM", "Material Transferred for Manufacture"] diff --git a/erpnext/manufacturing/doctype/work_order/work_order.js b/erpnext/manufacturing/doctype/work_order/work_order.js index 5d739a7fd8a..6c9c707fa22 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.js +++ b/erpnext/manufacturing/doctype/work_order/work_order.js @@ -239,6 +239,11 @@ frappe.ui.form.on("Work Order", { frm.trigger("add_custom_button_to_return_components"); frm.trigger("allow_alternative_item"); frm.trigger("hide_reserve_stock_button"); + frm.trigger("toggle_items_editable"); + }, + + toggle_items_editable(frm) { + frm.toggle_enable("required_items", frm.doc.__onload?.allow_editing_items === 1 ? 1 : 0); }, hide_reserve_stock_button(frm) { diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index 8abda8f9d39..1a8e8c53590 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -151,6 +151,7 @@ class WorkOrder(Document): def onload(self): ms = frappe.get_doc("Manufacturing Settings") + self.set_onload("allow_editing_items", ms.allow_editing_of_items_and_quantities_in_work_order) self.set_onload("material_consumption", ms.material_consumption) self.set_onload("backflush_raw_materials_based_on", ms.backflush_raw_materials_based_on) self.set_onload("overproduction_percentage", ms.overproduction_percentage_for_work_order) @@ -205,7 +206,11 @@ class WorkOrder(Document): validate_uom_is_integer(self, "stock_uom", ["required_qty"]) - self.set_required_items(reset_only_qty=len(self.get("required_items"))) + if not len(self.get("required_items")) or not frappe.db.get_single_value( + "Manufacturing Settings", "allow_editing_of_items_and_quantities_in_work_order" + ): + self.set_required_items(reset_only_qty=len(self.get("required_items"))) + self.enable_auto_reserve_stock() self.validate_operations_sequence() self.validate_subcontracting_inward_order()