From be5b7ddb3e4e9864d20547b225ec1117436eddd9 Mon Sep 17 00:00:00 2001 From: Damien Bouvy Date: Thu, 13 Feb 2020 08:47:45 +0000 Subject: [PATCH] [IMP] sale: better invoice_status computation Works correctly on virtual records during onchanges, notably. Since the data was obtained from a read_group using the ids of self, virtual records never could find any of their data. closes odoo/odoo#45264 Signed-off-by: Damien Bouvy (dbo) --- addons/sale/models/sale.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index febc16cd23e..8d7f7a4d1bb 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -75,9 +75,15 @@ class SaleOrder(models.Model): """ # Ignore the status of the deposit product deposit_product_id = self.env['sale.advance.payment.inv']._default_product_id() - line_invoice_status_all = [(d['order_id'][0], d['invoice_status']) for d in self.env['sale.order.line'].read_group([('order_id', 'in', self.ids), ('product_id', '!=', deposit_product_id.id)], ['order_id', 'invoice_status'], ['order_id', 'invoice_status'], lazy=False)] + line_data = self.env['sale.order.line'].read_group( + domain=[('order_id', 'in', self.ids), ('product_id', '!=', deposit_product_id.id)], + fields=['order_id', 'invoice_status'], + groupby=['order_id', 'invoice_status'], + lazy=False) + line_invoice_status_all = [(d['order_id'][0], d['invoice_status']) for d in line_data] for order in self: - line_invoice_status = [d[1] for d in line_invoice_status_all if d[0] == order.id] + order_id = order.id or order._origin and order._origin.id + line_invoice_status = [d[1] for d in line_invoice_status_all if d[0] == order_id] if order.state not in ('sale', 'done'): order.invoice_status = 'no' elif any(invoice_status == 'to invoice' for invoice_status in line_invoice_status):