feat: Allow Editing of Items and Quantities in Work Order

(cherry picked from commit b5e6c3e703)

# Conflicts:
#	erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json
#	erpnext/manufacturing/doctype/work_order/work_order.js
#	erpnext/manufacturing/doctype/work_order/work_order.py
This commit is contained in:
Rohit Waghchaure
2025-11-07 15:25:47 +05:30
committed by Mergify
parent 29c976e9ae
commit a34839ab7d
4 changed files with 71 additions and 0 deletions

View File

@@ -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",
@@ -243,13 +244,42 @@
"fieldname": "enforce_time_logs",
"fieldtype": "Check",
"label": "Enforce Time Logs"
<<<<<<< HEAD
=======
},
{
"fieldname": "section_break_xhtl",
"fieldtype": "Section Break",
"label": "Extra Material Transfer"
},
{
"fieldname": "column_break_kemp",
"fieldtype": "Column Break"
},
{
"description": "The user will be able to transfer additional materials from the store to the Work in Progress (WIP) warehouse.",
"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"
>>>>>>> b5e6c3e703 (feat: Allow Editing of Items and Quantities in Work Order)
}
],
"icon": "icon-wrench",
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
<<<<<<< HEAD
"modified": "2025-05-16 11:23:16.916512",
=======
"modified": "2025-11-07 14:52:56.241459",
>>>>>>> b5e6c3e703 (feat: Allow Editing of Items and Quantities in Work Order)
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Manufacturing Settings",

View File

@@ -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"]

View File

@@ -242,6 +242,36 @@ frappe.ui.form.on("Work Order", {
frm.trigger("add_custom_button_to_return_components");
frm.trigger("allow_alternative_item");
<<<<<<< HEAD
=======
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) {
frm.toggle_display("reserve_stock", false);
if (frm.doc.__onload?.enable_stock_reservation) {
frm.toggle_display("reserve_stock", true);
}
},
has_unreserved_stock(frm) {
let has_unreserved_stock = frm.doc.required_items.some(
(item) => flt(item.required_qty) > flt(item.stock_reserved_qty)
);
return has_unreserved_stock;
},
has_reserved_stock(frm) {
let has_reserved_stock = frm.doc.required_items.some((item) => flt(item.stock_reserved_qty) > 0);
return has_reserved_stock;
>>>>>>> b5e6c3e703 (feat: Allow Editing of Items and Quantities in Work Order)
},
add_custom_button_to_return_components: function (frm) {

View File

@@ -141,6 +141,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)
@@ -167,7 +168,16 @@ class WorkOrder(Document):
validate_uom_is_integer(self, "stock_uom", ["required_qty"])
<<<<<<< HEAD
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()
>>>>>>> b5e6c3e703 (feat: Allow Editing of Items and Quantities in Work Order)
self.validate_operations_sequence()
def validate_operations_sequence(self):