[FIX] account_edi_ubl_cii: round PriceAmount (repr. error)

We no longer round the PriceAmount since
0fd7284158483bce3308e7c5ba42e3c6ee5abd10.

But then, we may encounter a representation error if the PriceAmount is
not exactly representable as a binary fraction (see:
https://docs.python.org/3/tutorial/floatingpoint.html#representation-error).

For instance: having a line with `price_subtotal` = 306.45 and
`quantity` = 3, we will compute the PriceAmount as 306.45 / 3 which
yields 102.14999999999999.

To avoid such a case we round "reasonably" the PriceAmount.

opw-3729369

closes odoo/odoo#154361

X-original-commit: f27818e7bc62c548e9bd76d47594d3dcdec85d3d
Signed-off-by: Laurent Smet (las) <las@odoo.com>
Signed-off-by: Julien Van Roy (juvr) <juvr@odoo.com>
This commit is contained in:
Julien Van Roy
2024-02-19 09:06:53 +00:00
parent 84f9524b35
commit 40b99b686d
2 changed files with 21 additions and 2 deletions
@@ -4,6 +4,7 @@ from lxml import etree
from odoo import models, _
from odoo.tools import html2plaintext, cleanup_xml_node
from odoo.tools.float_utils import float_round
class AccountEdiXmlUBL20(models.AbstractModel):
@@ -338,7 +339,7 @@ class AccountEdiXmlUBL20(models.AbstractModel):
'currency_dp': self._get_currency_decimal_places(line.currency_id),
# The price of an item, exclusive of VAT, after subtracting item price discount.
'price_amount': gross_price_unit,
'price_amount': float_round(gross_price_unit, 10),
'product_price_dp': self.env['decimal.precision'].precision_get('Product Price'),
# The number of item units to which the price applies.
@@ -1,9 +1,12 @@
# -*- coding: utf-8 -*-
import base64
from lxml import etree
from odoo import Command
from odoo.addons.l10n_account_edi_ubl_cii_tests.tests.common import TestUBLCommon
from odoo.addons.account.tests.test_account_move_send import TestAccountMoveSendCommon
from odoo.tests import tagged
import base64
@tagged('post_install_l10n', 'post_install', '-at_install')
class TestUBLBE(TestUBLCommon, TestAccountMoveSendCommon):
@@ -486,6 +489,21 @@ class TestUBLBE(TestUBLCommon, TestAccountMoveSendCommon):
self._assert_invoice_attachment(invoice.ubl_cii_xml_id, None, 'from_odoo/bis3_export_with_changed_taxes.xml')
def test_export_rounding_price_amount(self):
invoice = self._generate_move(
self.partner_1,
self.partner_2,
move_type='out_invoice',
invoice_line_ids=[{
'product_id': self.product_a.id,
'quantity': 3,
'price_unit': 102.15,
'tax_ids': [Command.set([self.tax_12.id])]
}],
)
price_amount = etree.fromstring(invoice.ubl_cii_xml_id.raw).find('.//{*}InvoiceLine/{*}Price/{*}PriceAmount')
self.assertEqual(price_amount.text, '102.15')
####################################################
# Test import
####################################################