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"]