From 073c2f2ffb6caab194ee24426b36b5858ef0801f Mon Sep 17 00:00:00 2001 From: vikvi-odoo Date: Fri, 29 May 2026 12:15:33 +0530 Subject: [PATCH 1/3] [IMP] sale_zero_stock_blockage: add zero stock approval restriction on order confirmation Introduce a 'Zero Stock Approval' boolean field to enforce inventory checks during the sales order confirmation workflow. - Add `zero_stock_approval` boolean field to the `sale.order` model. - Restrict field edit permissions in the XML view layout: set to readonly for regular Sales Users (`sales_team.group_sale_manager` group excluded) and editable for Sales Administrators. - Override `action_confirm` to intercept the confirmation process; block regular sales users from confirming orders with storable items at zero or negative stock unless a manager has checked the approval box. --- dev_zero_stock_blockage/__init__.py | 1 + dev_zero_stock_blockage/__manifest__.py | 12 +++++++++++ dev_zero_stock_blockage/models/__init__.py | 1 + .../models/zero_stoack_blockage.py | 20 +++++++++++++++++++ .../views/sale_zero_stock.xml | 14 +++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 dev_zero_stock_blockage/__init__.py create mode 100644 dev_zero_stock_blockage/__manifest__.py create mode 100644 dev_zero_stock_blockage/models/__init__.py create mode 100644 dev_zero_stock_blockage/models/zero_stoack_blockage.py create mode 100644 dev_zero_stock_blockage/views/sale_zero_stock.xml diff --git a/dev_zero_stock_blockage/__init__.py b/dev_zero_stock_blockage/__init__.py new file mode 100644 index 00000000000..4920c6bc8a0 --- /dev/null +++ b/dev_zero_stock_blockage/__init__.py @@ -0,0 +1 @@ +from .import models diff --git a/dev_zero_stock_blockage/__manifest__.py b/dev_zero_stock_blockage/__manifest__.py new file mode 100644 index 00000000000..a65539a1c7e --- /dev/null +++ b/dev_zero_stock_blockage/__manifest__.py @@ -0,0 +1,12 @@ +{ + "name": "dev_stock_blockage", + "version": "1.0", + "depends": ["sale"], + "author": "vikvi", + "category": "Tutorials", + "license": "LGPL-3", + 'installable': True, + "data": [ + 'views/sale_zero_stock.xml' + ] +} diff --git a/dev_zero_stock_blockage/models/__init__.py b/dev_zero_stock_blockage/models/__init__.py new file mode 100644 index 00000000000..e8583c37c5e --- /dev/null +++ b/dev_zero_stock_blockage/models/__init__.py @@ -0,0 +1 @@ +from .import zero_stoack_blockage diff --git a/dev_zero_stock_blockage/models/zero_stoack_blockage.py b/dev_zero_stock_blockage/models/zero_stoack_blockage.py new file mode 100644 index 00000000000..94cd524b5a2 --- /dev/null +++ b/dev_zero_stock_blockage/models/zero_stoack_blockage.py @@ -0,0 +1,20 @@ +from odoo import models, fields, _ +from odoo.exceptions import ValidationError + + +class ZeroStock(models.Model): + _inherit = "sale.order" + + zero_stock_approval = fields.Boolean(string="Approve", default=False) + + def action_confirm(self): + for record in self: + if not record.zero_stock_approval: + for line in record.order_line: + if line.product_id.qty_available <= 0: + raise ValidationError( + "You cannot confirm this order because the product '%s' has zero stock. " + "Please ask a Sales Manager to toggle the 'Zero Stock Approval' checkbox first!" + % line.product_id.name + ) + return super().action_confirm() diff --git a/dev_zero_stock_blockage/views/sale_zero_stock.xml b/dev_zero_stock_blockage/views/sale_zero_stock.xml new file mode 100644 index 00000000000..a3213b2e70a --- /dev/null +++ b/dev_zero_stock_blockage/views/sale_zero_stock.xml @@ -0,0 +1,14 @@ + + + + zero.stock.blockage + sale.order + + + + + + + + + From cc217b9a937eed62dbc9d7da9541e5cb6d2784b4 Mon Sep 17 00:00:00 2001 From: vikvi-odoo Date: Fri, 29 May 2026 12:25:19 +0530 Subject: [PATCH 2/3] [IMP] sale_zero_stock_blockage: add zero stock approval restriction and fix linter strings Fix CI linter error by wrapping user-facing ValidationError text inside the Odoo translation underscore helper function _(). --- dev_zero_stock_blockage/models/zero_stoack_blockage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev_zero_stock_blockage/models/zero_stoack_blockage.py b/dev_zero_stock_blockage/models/zero_stoack_blockage.py index 94cd524b5a2..dc663eb9ce1 100644 --- a/dev_zero_stock_blockage/models/zero_stoack_blockage.py +++ b/dev_zero_stock_blockage/models/zero_stoack_blockage.py @@ -12,9 +12,9 @@ def action_confirm(self): if not record.zero_stock_approval: for line in record.order_line: if line.product_id.qty_available <= 0: - raise ValidationError( + raise ValidationError(_( "You cannot confirm this order because the product '%s' has zero stock. " "Please ask a Sales Manager to toggle the 'Zero Stock Approval' checkbox first!" - % line.product_id.name + % line.product_id.name) ) return super().action_confirm() From 8b0b8590a41e8c5740293828ba63f1069ba6fa0a Mon Sep 17 00:00:00 2001 From: vikvi-odoo Date: Fri, 29 May 2026 12:33:08 +0530 Subject: [PATCH 3/3] [FIX] sale_zero_stock_blockage: remove incorrect string formatting operator from translation string Fix an issue in the zero stock validation message where the %s string formatting operator was causing runtime syntax errors. --- dev_zero_stock_blockage/models/zero_stoack_blockage.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dev_zero_stock_blockage/models/zero_stoack_blockage.py b/dev_zero_stock_blockage/models/zero_stoack_blockage.py index dc663eb9ce1..4f3509cd688 100644 --- a/dev_zero_stock_blockage/models/zero_stoack_blockage.py +++ b/dev_zero_stock_blockage/models/zero_stoack_blockage.py @@ -13,8 +13,7 @@ def action_confirm(self): for line in record.order_line: if line.product_id.qty_available <= 0: raise ValidationError(_( - "You cannot confirm this order because the product '%s' has zero stock. " - "Please ask a Sales Manager to toggle the 'Zero Stock Approval' checkbox first!" - % line.product_id.name) + "You cannot confirm this order because the product has zero stock. " + "Please ask a Sales Manager to toggle the 'Zero Stock Approval' checkbox first!") ) return super().action_confirm()