From 58bcd394caff12967b63d0b837d5b5249f5df148 Mon Sep 17 00:00:00 2001 From: jem-odoo Date: Wed, 20 Mar 2019 08:42:38 +0000 Subject: [PATCH] [IMP] sale: make confirmation_date required for confirmed SO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Somehow, when a sales order is confirmed, its confirmation date might not be set (or it is possible to remove it). This makes no sense as we expect it to be set when the SO is confirmed. This commit adds an SQL constraint to ensure the confirmation date is required when the SO is confirmed or done. To populate this column, the confirmation can be deduced from the mail.message, with the confirmed subtype. Task-1930506 closes odoo/odoo#33230 Signed-off-by: Jérome Maes (jem) --- addons/sale/models/sale.py | 6 +++++- addons/sale/views/sale_views.xml | 2 +- addons/sale_stock/models/sale_order.py | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index 77bd31385cc..4bbb9283081 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -198,6 +198,10 @@ class SaleOrder(models.Model): authorized_transaction_ids = fields.Many2many('payment.transaction', compute='_compute_authorized_transaction_ids', string='Authorized Transactions', copy=False, readonly=True) + _sql_constraints = [ + ('confirmation_date_conditional_required', "CHECK( (state IN ('sale', 'done') AND confirmation_date IS NOT NULL) OR state NOT IN ('sale', 'done') )", "A confirmed sales order requires a confirmation date."), + ] + @api.depends('pricelist_id', 'date_order', 'company_id') def _compute_currency_rate(self): for order in self: @@ -221,7 +225,7 @@ class SaleOrder(models.Model): """ for order in self: dates_list = [] - confirm_date = fields.Datetime.from_string((order.confirmation_date or order.write_date) if order.state == 'sale' else fields.Datetime.now()) + confirm_date = fields.Datetime.from_string(order.confirmation_date if order.state in ['sale', 'done'] else fields.Datetime.now()) for line in order.order_line.filtered(lambda x: x.state != 'cancel' and not x._is_delivery()): dt = confirm_date + timedelta(days=line.customer_lead or 0.0) dates_list.append(dt) diff --git a/addons/sale/views/sale_views.xml b/addons/sale/views/sale_views.xml index 23c5895fc08..363fdd21f84 100644 --- a/addons/sale/views/sale_views.xml +++ b/addons/sale/views/sale_views.xml @@ -289,7 +289,7 @@ - + diff --git a/addons/sale_stock/models/sale_order.py b/addons/sale_stock/models/sale_order.py index 15054b6507e..6e7106a930c 100644 --- a/addons/sale_stock/models/sale_order.py +++ b/addons/sale_stock/models/sale_order.py @@ -48,7 +48,7 @@ class SaleOrder(models.Model): super(SaleOrder, self)._compute_expected_date() for order in self: dates_list = [] - confirm_date = fields.Datetime.from_string((order.confirmation_date or order.write_date) if order.state == 'sale' else fields.Datetime.now()) + confirm_date = fields.Datetime.from_string(order.confirmation_date if order.state in ['sale', 'done'] else fields.Datetime.now()) for line in order.order_line.filtered(lambda x: x.state != 'cancel' and not x._is_delivery()): dt = confirm_date + timedelta(days=line.customer_lead or 0.0) dates_list.append(dt) @@ -301,7 +301,7 @@ class SaleOrderLine(models.Model): @api.onchange('product_uom_qty') def _onchange_product_uom_qty(self): - # When modifying a one2many, _origin doesn't guarantee that its values will be the ones + # When modifying a one2many, _origin doesn't guarantee that its values will be the ones # in database. Hence, we need to explicitly read them from there. if self._origin: product_uom_qty_origin = self._origin.read(["product_uom_qty"])[0]["product_uom_qty"]