138 lines
5.2 KiB
Python
Executable File
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)
|