[MIG] sale_order_invoice_untaxed_amount: migrate to 18.0

This commit is contained in:
Stéphan Sainléger
2026-07-23 12:18:37 +02:00
parent 4c51357735
commit c06b8437ac
12 changed files with 430 additions and 0 deletions

View File

@@ -0,0 +1 @@
from . import test_sale_order_invoice_untaxed_amount

View File

@@ -0,0 +1,134 @@
# Copyright (C) 2021 ForgeFlow S.L.
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html)
from odoo.tests import common
class TestSaleOrderInvoiceUntaxedAmount(common.TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# Partners
cls.res_partner_1 = cls.env["res.partner"].create({"name": "Wood Corner"})
# Products
cls.product_1 = cls.env["product.product"].create(
{
"name": "Desk Combination",
"type": "consu",
"invoice_policy": "order",
}
)
cls.product_2 = cls.env["product.product"].create(
{
"name": "Conference Chair",
"type": "consu",
"invoice_policy": "order",
}
)
cls.product_3 = cls.env["product.product"].create(
{
"name": "Repair Services",
"type": "service",
"invoice_policy": "order",
}
)
# Sale Order
cls.tax = cls.env["account.tax"].create(
{"name": "Tax 21", "type_tax_use": "sale", "amount": 21}
)
cls.sale_order_1 = cls.env["sale.order"].create(
{"partner_id": cls.res_partner_1.id}
)
cls.order_line_1 = cls.env["sale.order.line"].create(
{
"order_id": cls.sale_order_1.id,
"product_id": cls.product_1.id,
"product_uom": cls.product_1.uom_id.id,
"product_uom_qty": 10.0,
"price_unit": 10.0,
"tax_id": [(6, 0, cls.tax.ids)],
}
)
cls.order_line_2 = cls.env["sale.order.line"].create(
{
"order_id": cls.sale_order_1.id,
"product_id": cls.product_2.id,
"product_uom": cls.product_2.uom_id.id,
"product_uom_qty": 25.0,
"price_unit": 4.0,
"tax_id": [(6, 0, cls.tax.ids)],
}
)
cls.order_line_3 = cls.env["sale.order.line"].create(
{
"order_id": cls.sale_order_1.id,
"product_id": cls.product_3.id,
"product_uom": cls.product_3.uom_id.id,
"product_uom_qty": 20.0,
"price_unit": 5.0,
"tax_id": [(6, 0, cls.tax.ids)],
}
)
# Total untaxed amount: 10*10 + 25*4 + 20*5 = 100 + 100 + 100 = 300
def test_untaxed_amount_without_invoice(self):
"""No invoice yet: nothing invoiced, everything uninvoiced."""
self.assertEqual(self.sale_order_1.amount_untaxed, 300.0)
self.assertEqual(
self.sale_order_1.invoiced_untaxed_amount,
0.0,
"Invoiced Untaxed Amount should be 0.0 without invoice",
)
# Order still in draft: uninvoiced amount is forced to 0.0
self.assertEqual(
self.sale_order_1.uninvoiced_untaxed_amount,
0.0,
"Uninvoiced Untaxed Amount should be 0.0 while in draft",
)
def test_untaxed_amount_with_down_payment(self):
"""A fixed down payment of 100 is invoiced."""
context_payment = {
"active_ids": [self.sale_order_1.id],
"active_id": self.sale_order_1.id,
}
payment = (
self.env["sale.advance.payment.inv"]
.with_context(context_payment)
.create({"advance_payment_method": "fixed", "fixed_amount": 100})
)
payment.create_invoices()
# The fixed down payment (100) is a tax-included amount.
# With a 21% tax, the invoiced untaxed amount is 100 / 1.21 = 82.64.
self.assertAlmostEqual(
self.sale_order_1.invoiced_untaxed_amount,
82.64,
places=2,
msg="Invoiced Untaxed Amount should be 82.64 (100 tax included / 1.21)",
)
self.assertAlmostEqual(
self.sale_order_1.uninvoiced_untaxed_amount,
217.36,
places=2,
msg="Uninvoiced Untaxed Amount should be 217.36 (300 - 82.64)",
)
def test_untaxed_amount_fully_invoiced(self):
"""The whole order is invoiced: nothing remains uninvoiced."""
self.sale_order_1.action_confirm()
self.sale_order_1._create_invoices(final=True)
self.assertEqual(
self.sale_order_1.invoiced_untaxed_amount,
300.0,
"Invoiced Untaxed Amount should equal the full untaxed total",
)
self.assertEqual(
self.sale_order_1.uninvoiced_untaxed_amount,
0.0,
"Uninvoiced Untaxed Amount should be 0 once fully invoiced",
)