[FIX] sale: fix amount to invoice multiple SO one invoice line

From an internal feedback, someone reported that the code added:

e2ec9e6c86949f5781d03a7dbb1065ef8af3196a

might cause an issue in case of several sale order linked to the same
invoice line.

With this changeset, in this case we will have the same behavior as
before, eg:

- one sale order line (SOL1) has amount_total 700
- one sale order line (SOL2) has amount_total 1400

if the invoice line linked to both line has price_total:

* 700 => amount_to_invoice of: SOL1 will be 0, SOL2 will be 700
* 1400 => amount_to_invoice of: SOL1 will be -700, SOL2 will be 0
* 2100 => amount_to_invoice of: SOL1 will be -1400, SOL2 will be -700

opw-3437237

closes odoo/odoo#133498

X-original-commit: 15a90c9f6cbf5a1750fafee994fda4b6ec2ebc14
Signed-off-by: Nicolas Lempereur (nle) <nle@odoo.com>
This commit is contained in:
Nicolas Lempereur
2023-09-07 13:10:09 +00:00
parent a188d9c894
commit d262dfac69
2 changed files with 42 additions and 1 deletions
+1 -1
View File
@@ -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,
+41
View File
@@ -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)