diff --git a/addons/sale/models/sale_order.py b/addons/sale/models/sale_order.py index 464da51139a..2f7de9ec508 100644 --- a/addons/sale/models/sale_order.py +++ b/addons/sale/models/sale_order.py @@ -604,7 +604,7 @@ class SaleOrder(models.Model): order.amount_to_invoice = order.amount_total for invoice in order.invoice_ids.filtered(lambda x: x.state == 'posted'): - prices = sum(invoice.line_ids.filtered(lambda x: x.sale_line_ids.order_id.id == order.id).mapped('price_total')) + prices = sum(invoice.line_ids.filtered(lambda x: order in x.sale_line_ids.order_id).mapped('price_total')) invoice_amount_currency = invoice.currency_id._convert( prices * -invoice.direction_sign, order.currency_id, diff --git a/addons/sale/tests/test_sale_to_invoice.py b/addons/sale/tests/test_sale_to_invoice.py index 5b5755ae46d..b1cf0b04ee2 100644 --- a/addons/sale/tests/test_sale_to_invoice.py +++ b/addons/sale/tests/test_sale_to_invoice.py @@ -989,3 +989,44 @@ class TestSaleToInvoice(TestSaleCommon): self.assertEqual(sale_order_1.amount_to_invoice, 0.0) self.assertEqual(sale_order_2.amount_to_invoice, 0.0) + + def test_amount_to_invoice_one_line_multiple_so(self): + """ Testing creating two SOs linked to the same invoice line. Drawback: the substracted + amount to the amount_total will take both sale order into account. + """ + sale_order_1 = self.env['sale.order'].create({ + 'partner_id': self.partner_a.id, + 'order_line': [ + Command.create({ + 'product_id': self.company_data['product_delivery_no'].id, + 'product_uom_qty': 10, + }), + ], + }) + sale_order_2 = self.env['sale.order'].create({ + 'partner_id': self.partner_a.id, + 'order_line': [ + Command.create({ + 'product_id': self.company_data['product_delivery_no'].id, + 'product_uom_qty': 20, + }), + ], + }) + + sale_order_1.action_confirm() + sale_order_2.action_confirm() + sale_order_1.order_line.qty_delivered = 10 + sale_order_2.order_line.qty_delivered = 20 + + self.env['sale.advance.payment.inv'].create({ + 'advance_payment_method': 'delivered', + 'sale_order_ids': [Command.set((sale_order_2).ids)], + }).create_invoices() + + sale_order_1.invoice_ids = sale_order_2.invoice_ids + sale_order_1.invoice_ids.line_ids.sale_line_ids += sale_order_1.order_line + + sale_order_1.invoice_ids.action_post() + + self.assertEqual(sale_order_1.amount_to_invoice, -700.0) + self.assertEqual(sale_order_2.amount_to_invoice, 0.0)