Files
Odoo-18.0-20251222/sale_fixed_discount/tests/test_sale_fixed_discount.py
tocmo0nlord adbe430761
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled
Initial commit: Odoo 18.0-20251222 extra-addons
2026-03-13 20:43:25 +00:00

138 lines
5.2 KiB
Python
Executable File

# Copyright 2017-18 ForgeFlow S.L.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.exceptions import ValidationError
from odoo.tests import Form
from odoo.addons.base.tests.common import BaseCommon
class TestSaleFixedDiscount(BaseCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env.user.groups_id |= cls.env.ref("sale.group_discount_per_so_line")
cls.partner = cls.env["res.partner"].create({"name": "Test"})
cls.tax = cls.env["account.tax"].create(
{
"name": "TAX 15%",
"amount_type": "percent",
"type_tax_use": "sale",
"amount": 15.0,
}
)
cls.product = cls.env["product.product"].create(
{"name": "Test product", "type": "consu"}
)
cls.product2 = cls.env["product.product"].create(
{"name": "Test product 2", "type": "consu"}
)
cls.sale = cls.env["sale.order"].create(
{"name": "Test Sale Order", "partner_id": cls.partner.id}
)
cls.so_line = cls.env["sale.order.line"]
cls.sale_line1 = cls.so_line.create(
{
"order_id": cls.sale.id,
"name": "Line 1",
"price_unit": 200.0,
"product_uom_qty": 1,
"product_id": cls.product.id,
"tax_id": [(6, 0, [cls.tax.id])],
}
)
def test_01_discounts(self):
"""Tests multiple discounts in line with taxes."""
with Form(self.sale) as sale_order:
with sale_order.order_line.edit(0) as line:
line.discount_fixed = 20.0
self.assertEqual(line.discount, 10.0)
self.assertEqual(line.price_subtotal, 180.0)
self.assertEqual(self.sale.amount_total, 207.00)
with Form(self.sale) as sale_order:
with sale_order.order_line.edit(0) as line:
line.product_uom_qty = 2
line.price_unit = 200.0
self.assertEqual(line.discount, 10.0)
self.assertEqual(line.price_subtotal, 360.0)
self.assertEqual(self.sale.amount_total, 414.00)
with Form(self.sale) as sale_order:
with sale_order.order_line.edit(0) as line:
line.product_uom_qty = 1
line.price_unit = 200.0
line.discount_fixed = 0.0
line.discount = 50.0
self.assertEqual(line.price_subtotal, 100.0)
self.assertEqual(self.sale.amount_total, 115.00)
with Form(self.sale) as sale_order:
with sale_order.order_line.new() as line2:
line2.product_id = self.product2
line2.product_uom_qty = 1
line2.price_unit = 100.0
line2.discount_fixed = 5.0
self.assertEqual(line2.discount, 5.0)
self.assertEqual(line2.price_subtotal, 95.0)
#
self.assertEqual(self.sale.amount_total, 224.25)
def test_02_fixed_discount_mismatch(self):
"""Tests fixed discount mismatch."""
with self.assertRaisesRegex(
ValidationError,
"Please correct one of the discounts",
):
with Form(self.sale) as sale_order:
with sale_order.order_line.edit(0) as line:
line.discount_fixed = 20.0
line.discount = 5.0
def test_03_fixed_discount_invoice(self):
"""Test discount_fixed value propagation to account.move.
Case of editing order line by using UI.
"""
with Form(self.sale) as sale_order:
with sale_order.order_line.edit(0) as line:
line.discount_fixed = 20.0
self.sale.action_confirm()
self.sale._create_invoices()
self.assertEqual(self.sale.invoice_ids.invoice_line_ids.discount_fixed, 20.0)
self.assertEqual(self.sale.invoice_ids.invoice_line_ids.discount, 10.0)
self.assertEqual(self.sale.invoice_ids.tax_totals["base_amount"], 180.0)
self.assertEqual(self.sale.invoice_ids.tax_totals["total_amount"], 207.0)
def test_04_fixed_discount_without_price(self):
with Form(self.sale) as sale_order:
with sale_order.order_line.edit(0) as line:
line.product_uom_qty = 1.0
line.price_unit = 0.0
line.discount_fixed = 50.0
self.assertEqual(line.discount, 0.0)
self.assertEqual(line.price_subtotal, 0.0)
self.assertEqual(self.sale.amount_total, 0.0)
def test_05_fixed_discount_invoice(self):
"""Test discount_fixed value propagation to account.move.
Case of editing order line without using UI (onchange would be not triggered).
"""
self.sale.order_line.discount_fixed = 20.0
self.sale.action_confirm()
self.sale._create_invoices()
self.assertEqual(self.sale.invoice_ids.invoice_line_ids.discount_fixed, 20.0)
self.assertEqual(self.sale.invoice_ids.invoice_line_ids.discount, 10.0)
self.assertEqual(self.sale.invoice_ids.tax_totals["base_amount"], 180.0)
self.assertEqual(self.sale.invoice_ids.tax_totals["total_amount"], 207.0)