From 69a9fa486542cb19ce10f2d3f986df2a82c55688 Mon Sep 17 00:00:00 2001 From: pkhu-odoo Date: Fri, 13 Feb 2026 12:36:12 +0530 Subject: [PATCH] [ADD] zero_stock_approval: create module and implement approval logic Task Description - 1. Add a new Boolean field zero_stock_approval in the Sales Order form view. 2. The field should be read-only for Sales Users and editable only by the Administrator (or Sales Manager). 3. If zero_stock_approval is enabled, the user should be allowed to confirm the quotation regardless of product stock availability. 4. If zero_stock_approval is disabled, the system should prevent confirmation of the quotation when the available quantity is less than the ordered quantity. - Created new module `zero_stock_approval` with required base files - Inherited `sale.order` model and added `zero_stock_approval` field - Overridden `action_confirm` method to apply custom business logic - Extended `view_order_form` to include the new approval field Task-5929841 --- sale_order_zero_stock_blockage/__init__.py | 1 + sale_order_zero_stock_blockage/__manifest__.py | 10 ++++++++++ .../models/__init__.py | 1 + .../models/sale_order.py | 17 +++++++++++++++++ .../views/sale_order_views.xml | 17 +++++++++++++++++ 5 files changed, 46 insertions(+) create mode 100644 sale_order_zero_stock_blockage/__init__.py create mode 100644 sale_order_zero_stock_blockage/__manifest__.py create mode 100644 sale_order_zero_stock_blockage/models/__init__.py create mode 100644 sale_order_zero_stock_blockage/models/sale_order.py create mode 100644 sale_order_zero_stock_blockage/views/sale_order_views.xml diff --git a/sale_order_zero_stock_blockage/__init__.py b/sale_order_zero_stock_blockage/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/sale_order_zero_stock_blockage/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_order_zero_stock_blockage/__manifest__.py b/sale_order_zero_stock_blockage/__manifest__.py new file mode 100644 index 00000000000..deac470dd6c --- /dev/null +++ b/sale_order_zero_stock_blockage/__manifest__.py @@ -0,0 +1,10 @@ +{ + 'name': "sale_order_zero_stock_blockage", + 'author': "pkhu", + 'license': "LGPL-3", + 'depends': ['sale_management', 'stock'], + 'data': [ + 'views/sale_order_views.xml', + ], + 'auto_install': True, +} diff --git a/sale_order_zero_stock_blockage/models/__init__.py b/sale_order_zero_stock_blockage/models/__init__.py new file mode 100644 index 00000000000..6aacb753131 --- /dev/null +++ b/sale_order_zero_stock_blockage/models/__init__.py @@ -0,0 +1 @@ +from . import sale_order diff --git a/sale_order_zero_stock_blockage/models/sale_order.py b/sale_order_zero_stock_blockage/models/sale_order.py new file mode 100644 index 00000000000..97111b6f4a5 --- /dev/null +++ b/sale_order_zero_stock_blockage/models/sale_order.py @@ -0,0 +1,17 @@ +from odoo import fields, models +from odoo.exceptions import AccessError + + +class SaleOrder(models.Model): + _inherit = ['sale.order'] + + zero_stock_approval = fields.Boolean(default=False, string="Approval") + + def action_confirm(self): + for record in self: + for line in record.order_line: + # if not record.zero_stock_approval and not self.env.user.has_group('sales_team.group_sale_manager'): + if not record.zero_stock_approval and not self.env.user.has_group('sales_team.group_sale_manager') and line.product_id.type == 'consu' and line.product_id.is_storable and line.product_id.qty_available < line.product_uom_qty: + raise AccessError( + "Access denied: You are not authorized to confirm this sales order.") + return super().action_confirm() diff --git a/sale_order_zero_stock_blockage/views/sale_order_views.xml b/sale_order_zero_stock_blockage/views/sale_order_views.xml new file mode 100644 index 00000000000..2bd0816d022 --- /dev/null +++ b/sale_order_zero_stock_blockage/views/sale_order_views.xml @@ -0,0 +1,17 @@ + + + + + sale.order.form.inherit.sale.new + sale.order + + + + + + + + + + +