diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index fb4d7b4ddea826c5af40b0e3e05a4d6a8de39ae7..e98699824401ddd027df2be4c7269211fcdddbf3 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -105,6 +105,9 @@ frappe.ui.form.on("Sales Order", { frm.set_value("reserve_stock", 0); frm.set_df_property("reserve_stock", "read_only", 1); frm.set_df_property("reserve_stock", "hidden", 1); + frm.fields_dict.items.grid.update_docfield_property('reserve_stock', 'hidden', 1); + frm.fields_dict.items.grid.update_docfield_property('reserve_stock', 'default', 0); + frm.fields_dict.items.grid.update_docfield_property('reserve_stock', 'read_only', 1); } }) } diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 8ce2b38bcb670178845837198b96d196f49f967c..9d3a77bb5a7b060c0d2a250669dc66b917c1790b 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -70,6 +70,7 @@ class SalesOrder(SellingController): self.validate_for_items() self.validate_warehouse() self.validate_drop_ship() + self.validate_reserved_stock() self.validate_serial_no_based_delivery() self.validate_recurring_items() self.validate_subscription_dates() @@ -581,6 +582,17 @@ class SalesOrder(SellingController): if self.order_type == "Shopping Cart" and not self.skip_delivery_note: self.skip_delivery_note = 1 + def validate_reserved_stock(self): + """Clean reserved stock flag for non-stock Item""" + + enable_stock_reservation = frappe.db.get_single_value( + "Stock Settings", "enable_stock_reservation" + ) + + for item in self.items: + if item.reserve_stock and (not enable_stock_reservation or not cint(item.is_stock_item)): + item.reserve_stock = 0 + def has_unreserved_stock(self) -> bool: """Returns True if there is any unreserved item in the Sales Order.""" diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index 1c95d3f81444a58dfe3d16937475e3a0593a4418..7f4ce0b02660b845f0a7d5d216281bc9be3bae07 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -10,6 +10,7 @@ "item_code", "customer_item_code", "ensure_delivery_based_on_produced_serial_no", + "is_stock_item", "reserve_stock", "is_recurring_item", "col_break1", @@ -883,6 +884,7 @@ { "allow_on_submit": 1, "default": "1", + "depends_on": "eval:doc.is_stock_item", "fieldname": "reserve_stock", "fieldtype": "Check", "label": "Reserve Stock", @@ -910,19 +912,29 @@ }, { "default": "0", - "depends_on": "eval:doc.is_recurring_item", - "fetch_from": "item_code.is_recurring_item", - "fieldname": "is_recurring_item", + "fetch_from": "item_code.is_stock_item", + "fieldname": "is_stock_item", "fieldtype": "Check", - "label": "Is Recurring Item", - "read_only": 1 + "hidden": 1, + "label": "Is Stock Item", + "print_hide": 1, + "report_hide": 1 }, { - "collapsible": 1, - "fieldname": "accounting_dimensions_section", - "fieldtype": "Section Break", - "label": "Accounting Dimensions" - } + "default": "0", + "depends_on": "eval:doc.is_recurring_item", + "fetch_from": "item_code.is_recurring_item", + "fieldname": "is_recurring_item", + "fieldtype": "Check", + "label": "Is Recurring Item", + "read_only": 1 + }, + { + "collapsible": 1, + "fieldname": "accounting_dimensions_section", + "fieldtype": "Section Break", + "label": "Accounting Dimensions" + } ], "idx": 1, "istable": 1,