diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index 3888bffa657..390ab7b91ef 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -53,22 +53,31 @@ class SaleOrder(models.Model): for possible refunds created directly from existing invoices. This is necessary since such a refund is not directly linked to the SO. """ + # 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)] for order in self: invoice_ids = order.order_line.mapped('invoice_lines').mapped('invoice_id').filtered(lambda r: r.type in ['out_invoice', 'out_refund']) # Search for invoices which have been 'cancelled' (filter_refund = 'modify' in # 'account.invoice.refund') # use like as origin may contains multiple references (e.g. 'SO01, SO02') - refunds = invoice_ids.search([('origin', 'like', order.name), ('company_id', '=', order.company_id.id)]).filtered(lambda r: r.type in ['out_invoice', 'out_refund']) + refunds = invoice_ids.search([('origin', 'like', order.name), ('company_id', '=', order.company_id.id), ('type', 'in', ('out_invoice', 'out_refund'))]) invoice_ids |= refunds.filtered(lambda r: order.name in [origin.strip() for origin in r.origin.split(',')]) - # Search for refunds as well - refund_ids = self.env['account.invoice'].browse() - if invoice_ids: - for inv in invoice_ids: - refund_ids += refund_ids.search([('type', '=', 'out_refund'), ('origin', '=', inv.number), ('origin', '!=', False), ('journal_id', '=', inv.journal_id.id)]) - # Ignore the status of the deposit product - deposit_product_id = self.env['sale.advance.payment.inv']._default_product_id() - line_invoice_status = [line.invoice_status for line in order.order_line if line.product_id != deposit_product_id] + # Search for refunds as well + domain_inv = expression.OR([ + ['&', ('origin', '=', inv.number), ('journal_id', '=', inv.journal_id.id)] + for inv in invoice_ids if inv.number + ]) + if domain_inv: + refund_ids = self.env['account.invoice'].search(expression.AND([ + ['&', ('type', '=', 'out_refund'), ('origin', '!=', False)], + domain_inv + ])) + else: + refund_ids = self.env['account.invoice'].browse() + + line_invoice_status = [d[1] for d in line_invoice_status_all if d[0] == order.id] if order.state not in ('sale', 'done'): invoice_status = 'no'