110 lines
4.1 KiB
Python
110 lines
4.1 KiB
Python
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
from odoo.exceptions import ValidationError
|
||
|
from odoo.fields import Command
|
||
|
from odoo.tests import tagged
|
||
|
|
||
|
from odoo.addons.sale.tests.common import SaleCommon
|
||
|
|
||
|
|
||
|
@tagged('post_install', '-at_install')
|
||
|
class TestSaleOrderDiscount(SaleCommon):
|
||
|
|
||
|
@classmethod
|
||
|
def setUpClass(cls):
|
||
|
super().setUpClass()
|
||
|
cls.wizard = cls.env['sale.order.discount'].create({
|
||
|
'sale_order_id': cls.sale_order.id,
|
||
|
'discount_type': 'amount',
|
||
|
})
|
||
|
|
||
|
def test_amount(self):
|
||
|
self.wizard.write({
|
||
|
'discount_amount': 55,
|
||
|
'discount_type': 'amount',
|
||
|
})
|
||
|
self.wizard.action_apply_discount()
|
||
|
|
||
|
discount_line = self.sale_order.order_line[-1]
|
||
|
self.assertEqual(discount_line.price_unit, -55)
|
||
|
self.assertEqual(discount_line.product_uom_qty, 1.0)
|
||
|
self.assertFalse(discount_line.tax_id)
|
||
|
|
||
|
def test_so_discount(self):
|
||
|
solines = self.sale_order.order_line
|
||
|
amount_before_discount = self.sale_order.amount_total
|
||
|
self.assertEqual(len(solines), 2)
|
||
|
|
||
|
# No taxes
|
||
|
solines.tax_id = [Command.clear()]
|
||
|
self.wizard.write({
|
||
|
'discount_percentage': 0.5, # 50%
|
||
|
'discount_type': 'so_discount',
|
||
|
})
|
||
|
self.wizard.action_apply_discount()
|
||
|
|
||
|
discount_line = self.sale_order.order_line[-1]
|
||
|
self.assertAlmostEqual(discount_line.price_unit, -amount_before_discount*0.5)
|
||
|
self.assertFalse(discount_line.tax_id)
|
||
|
self.assertEqual(discount_line.product_uom_qty, 1.0)
|
||
|
|
||
|
# One tax group
|
||
|
discount_line.unlink()
|
||
|
dumb_tax = self.env['account.tax'].create({'name': 'test'})
|
||
|
solines.tax_id = dumb_tax
|
||
|
self.wizard.action_apply_discount()
|
||
|
|
||
|
discount_line = self.sale_order.order_line - solines
|
||
|
discount_line.ensure_one()
|
||
|
self.assertAlmostEqual(discount_line.price_unit, -amount_before_discount*0.5)
|
||
|
self.assertEqual(discount_line.tax_id, dumb_tax)
|
||
|
self.assertEqual(discount_line.product_uom_qty, 1.0)
|
||
|
|
||
|
# Two tax groups
|
||
|
discount_line.unlink()
|
||
|
solines[0].tax_id = [Command.clear()]
|
||
|
self.wizard.action_apply_discount()
|
||
|
discount_lines = self.sale_order.order_line - solines
|
||
|
self.assertEqual(len(discount_lines), 2)
|
||
|
self.assertEqual(discount_lines[0].price_unit, -solines[0].price_subtotal * 0.5)
|
||
|
self.assertEqual(discount_lines[1].price_unit, -solines[1].price_subtotal * 0.5)
|
||
|
self.assertEqual(discount_lines[0].tax_id, solines[0].tax_id)
|
||
|
self.assertEqual(discount_lines[1].tax_id, solines[1].tax_id)
|
||
|
self.assertTrue(all(line.product_uom_qty == 1.0 for line in discount_lines))
|
||
|
|
||
|
def test_sol_discount(self):
|
||
|
so_amount = self.sale_order.amount_untaxed
|
||
|
self.wizard.write({
|
||
|
'discount_percentage': 0.5, # 50%
|
||
|
'discount_type': 'sol_discount',
|
||
|
})
|
||
|
self.wizard.action_apply_discount()
|
||
|
|
||
|
self.assertTrue(
|
||
|
all(line.discount == 50 for line in self.sale_order.order_line)
|
||
|
)
|
||
|
self.assertAlmostEqual(self.sale_order.amount_untaxed, so_amount*0.5)
|
||
|
|
||
|
self.wizard.write({'discount_percentage': -0.5})
|
||
|
self.wizard.action_apply_discount()
|
||
|
|
||
|
self.assertTrue(
|
||
|
all(line.discount == -50 for line in self.sale_order.order_line)
|
||
|
)
|
||
|
self.assertAlmostEqual(self.sale_order.amount_untaxed, so_amount*1.5)
|
||
|
|
||
|
def test_sol_discount_removal(self):
|
||
|
so_amount = self.sale_order.amount_untaxed
|
||
|
self.wizard.write({'discount_percentage': 0.5, 'discount_type': 'sol_discount'})
|
||
|
self.wizard.action_apply_discount()
|
||
|
|
||
|
self.wizard.write({'discount_percentage': 0})
|
||
|
self.wizard.action_apply_discount()
|
||
|
|
||
|
self.assertFalse(self.sale_order.order_line.filtered('discount'))
|
||
|
self.assertAlmostEqual(self.sale_order.amount_untaxed, so_amount)
|
||
|
|
||
|
def test_percent_discount_above_100(self):
|
||
|
with self.assertRaises(ValidationError):
|
||
|
self.wizard.write({'discount_percentage': 1.1, 'discount_type': 'sol_discount'})
|