From ec5ad7e792e7ea57c0812ce09016eece68b7d362 Mon Sep 17 00:00:00 2001 From: HENRY Florian Date: Wed, 17 Jan 2024 06:13:36 +0100 Subject: [PATCH 1/2] fix: consistency in display reserved_stock checkbox on Sales Order Item according global settings and item.is_stock_item (#38322) * fix: consistency in display reserved_stock checkbox on Sales Order Item according global settings and item.is_stock_item * fix: evaluate depends_on for fdata visibility in grid * fix: evaluate depends_on for fdata visibility in grid * chore: change after review * chore: change for review --- .../doctype/sales_order/sales_order.js | 3 ++ .../doctype/sales_order/sales_order.py | 41 ++++--------------- .../sales_order_item/sales_order_item.json | 19 ++++----- 3 files changed, 20 insertions(+), 43 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index fb4d7b4ddea..e9869982440 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 8ce2b38bcb6..faf5a03d871 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() @@ -546,40 +547,16 @@ class SalesOrder(SellingController): ).format(item.item_code) ) - def update_item_bookings(self): - confirm_after_payment = cint( - frappe.db.get_single_value("Venue Settings", "confirm_booking_after_payment") - ) + def validate_reserved_stock(self): + """Clean reserved stock flag for non-stock Item""" - for d in self.get("items"): - if d.get("item_booking"): - # Check if the confirmation should be set before the payment or if the advance paid is equal to the due amount - if not confirm_after_payment or self.grand_total == frappe.db.get_value( - self.doctype, self.name, "advance_paid" - ): - status = "Confirmed" - else: - linked_si = frappe.db.sql( - """select t1.status - from `tabSales Invoice` t1,`tabSales Invoice Item` t2 - where t1.name = t2.parent and t2.so_detail = %s and t1.docstatus = 1""", - d.name, - ) - # Check if there is any unpaid sales invoice for this sales order - if linked_si and not any([x for x in linked_si if x[0] != "Paid"]): - status = "Confirmed" - else: - status = "Not confirmed" - - if frappe.db.get_value("Item Booking", d.item_booking, "deduct_booking_credits"): - # Check directly in booking in case the pricing rule is only associated with the quotation - status = "Confirmed" - - frappe.db.set_value("Item Booking", d.item_booking, "status", status) + enable_stock_reservation = frappe.db.get_single_value( + "Stock Settings", "enable_stock_reservation" + ) - def set_skip_delivery_note(self): - if self.order_type == "Shopping Cart" and not self.skip_delivery_note: - self.skip_delivery_note = 1 + 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 1c95d3f8144..07f9b5b29c5 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,18 +912,13 @@ }, { "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 - }, - { - "collapsible": 1, - "fieldname": "accounting_dimensions_section", - "fieldtype": "Section Break", - "label": "Accounting Dimensions" + "hidden": 1, + "label": "Is Stock Item", + "print_hide": 1, + "report_hide": 1 } ], "idx": 1, -- GitLab From 63c81bb3600044ebe13ea9e7f05bc71075b563fa Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Wed, 17 Jan 2024 07:04:41 +0000 Subject: [PATCH 2/2] fix: merge conflicts --- .../doctype/sales_order/sales_order.py | 35 +++++++++++++++++++ .../sales_order_item/sales_order_item.json | 17 ++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index faf5a03d871..9d3a77bb5a7 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -547,6 +547,41 @@ class SalesOrder(SellingController): ).format(item.item_code) ) + def update_item_bookings(self): + confirm_after_payment = cint( + frappe.db.get_single_value("Venue Settings", "confirm_booking_after_payment") + ) + + for d in self.get("items"): + if d.get("item_booking"): + # Check if the confirmation should be set before the payment or if the advance paid is equal to the due amount + if not confirm_after_payment or self.grand_total == frappe.db.get_value( + self.doctype, self.name, "advance_paid" + ): + status = "Confirmed" + else: + linked_si = frappe.db.sql( + """select t1.status + from `tabSales Invoice` t1,`tabSales Invoice Item` t2 + where t1.name = t2.parent and t2.so_detail = %s and t1.docstatus = 1""", + d.name, + ) + # Check if there is any unpaid sales invoice for this sales order + if linked_si and not any([x for x in linked_si if x[0] != "Paid"]): + status = "Confirmed" + else: + status = "Not confirmed" + + if frappe.db.get_value("Item Booking", d.item_booking, "deduct_booking_credits"): + # Check directly in booking in case the pricing rule is only associated with the quotation + status = "Confirmed" + + frappe.db.set_value("Item Booking", d.item_booking, "status", status) + + def set_skip_delivery_note(self): + 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""" 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 07f9b5b29c5..7f4ce0b0266 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -919,7 +919,22 @@ "label": "Is Stock Item", "print_hide": 1, "report_hide": 1 - } + }, + { + "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, -- GitLab