[IMP+REF] contract: Allow to set recurrency at header level

Big refactoring for allowing to define recurrency at header level for simplifying
the use of the module for most of the cases where you don't need different
recurrency at line level.
This commit is contained in:
Pedro M. Baeza
2020-07-14 20:23:08 +02:00
committed by Francisco Ivan Anton Prieto
parent fc4eb98c74
commit 3374384101
12 changed files with 541 additions and 345 deletions

View File

@@ -9,7 +9,7 @@ from dateutil.relativedelta import relativedelta
from odoo import fields
from odoo.exceptions import UserError, ValidationError
from odoo.tests import common
from odoo.tests import Form, common
def to_date(date):
@@ -72,6 +72,7 @@ class TestContractBase(common.SavepointCase):
"name": "Test Contract",
"partner_id": cls.partner.id,
"pricelist_id": cls.partner.property_product_pricelist.id,
"line_recurrence": True,
}
)
cls.contract2 = cls.env["contract.contract"].create(
@@ -79,6 +80,7 @@ class TestContractBase(common.SavepointCase):
"name": "Test Contract 2",
"partner_id": cls.partner.id,
"pricelist_id": cls.partner.property_product_pricelist.id,
"line_recurrence": True,
"contract_type": "purchase",
"contract_line_ids": [
(
@@ -152,7 +154,7 @@ class TestContract(TestContractBase):
self.assertEqual(self.acct_line.price_unit, 10)
def test_contract(self):
recurring_next_date = to_date("2018-02-15")
self.assertEqual(self.contract.recurring_next_date, to_date("2018-01-15"))
self.assertAlmostEqual(self.acct_line.price_subtotal, 50.0)
res = self.acct_line._onchange_product_id()
self.assertIn("uom_id", res["domain"])
@@ -161,22 +163,12 @@ class TestContract(TestContractBase):
self.contract.recurring_create_invoice()
self.invoice_monthly = self.contract._get_related_invoices()
self.assertTrue(self.invoice_monthly)
self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date)
self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-02-15"))
self.inv_line = self.invoice_monthly.invoice_line_ids[0]
self.assertTrue(self.inv_line.tax_ids)
self.assertAlmostEqual(self.inv_line.price_subtotal, 50.0)
self.assertEqual(self.contract.user_id, self.invoice_monthly.user_id)
def test_contract_recurring_next_date(self):
recurring_next_date = to_date("2018-01-15")
self.assertEqual(self.contract.recurring_next_date, recurring_next_date)
contract_line = self.acct_line.copy({"recurring_next_date": "2018-01-14"})
recurring_next_date = to_date("2018-01-14")
self.assertEqual(self.contract.recurring_next_date, recurring_next_date)
contract_line.cancel()
recurring_next_date = to_date("2018-01-15")
self.assertEqual(self.contract.recurring_next_date, recurring_next_date)
def test_contract_daily(self):
recurring_next_date = to_date("2018-02-23")
last_date_invoiced = to_date("2018-02-22")
@@ -306,7 +298,6 @@ class TestContract(TestContractBase):
self.acct_line.date_start = "2018-01-01"
self.acct_line.recurring_invoicing_type = "post-paid"
self.acct_line.date_end = "2018-03-15"
self.acct_line._onchange_date_start()
self.assertTrue(self.acct_line.create_invoice_visibility)
self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-02-01"))
self.assertFalse(self.acct_line.last_date_invoiced)
@@ -333,7 +324,6 @@ class TestContract(TestContractBase):
self.acct_line.date_start = "2018-01-01"
self.acct_line.recurring_invoicing_type = "pre-paid"
self.acct_line.date_end = "2018-03-15"
self.acct_line._onchange_date_start()
self.assertTrue(self.acct_line.create_invoice_visibility)
self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-01-01"))
self.assertFalse(self.acct_line.last_date_invoiced)
@@ -363,12 +353,6 @@ class TestContract(TestContractBase):
self.contract.partner_id.property_product_pricelist,
)
def test_onchange_date_start(self):
recurring_next_date = to_date("2018-01-01")
self.acct_line.date_start = recurring_next_date
self.acct_line._onchange_date_start()
self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date)
def test_uom(self):
uom_litre = self.env.ref("uom.product_uom_litre")
self.acct_line.uom_id = uom_litre.id
@@ -1626,7 +1610,6 @@ class TestContract(TestContractBase):
self.acct_line.date_start = "2018-01-01"
self.acct_line.recurring_invoicing_type = "post-paid"
self.acct_line.date_end = "2018-03-15"
self.acct_line._onchange_date_start()
contracts = self.contract2
for _i in range(10):
contracts |= self.contract.copy()
@@ -1642,7 +1625,6 @@ class TestContract(TestContractBase):
self.acct_line.date_start = "2018-01-01"
self.acct_line.recurring_invoicing_type = "post-paid"
self.acct_line.date_end = "2018-03-15"
self.acct_line._onchange_date_start()
self.contract2.unlink()
contracts = self.contract
for _i in range(10):
@@ -1674,7 +1656,6 @@ class TestContract(TestContractBase):
self.acct_line.recurring_invoicing_type = "post-paid"
self.acct_line.recurring_rule_type = "monthlylastday"
self.acct_line.date_end = "2018-03-15"
self.acct_line._onchange_date_start()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
)
@@ -1699,7 +1680,6 @@ class TestContract(TestContractBase):
self.acct_line.recurring_invoicing_type = "pre-paid"
self.acct_line.recurring_rule_type = "monthlylastday"
self.acct_line.date_end = "2018-03-15"
self.acct_line._onchange_date_start()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
)
@@ -1740,7 +1720,6 @@ class TestContract(TestContractBase):
self.acct_line.recurring_invoicing_type = "pre-paid"
self.acct_line.recurring_rule_type = "monthly"
self.acct_line.date_end = "2018-08-15"
self.acct_line._onchange_date_start()
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
@@ -1759,7 +1738,6 @@ class TestContract(TestContractBase):
self.acct_line.recurring_invoicing_type = "post-paid"
self.acct_line.recurring_rule_type = "monthly"
self.acct_line.date_end = "2018-08-15"
self.acct_line._onchange_date_start()
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
@@ -1778,7 +1756,6 @@ class TestContract(TestContractBase):
self.acct_line.recurring_invoicing_type = "post-paid"
self.acct_line.recurring_rule_type = "monthly"
self.acct_line.date_end = "2018-03-15"
self.acct_line._onchange_date_start()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
)
@@ -1802,7 +1779,6 @@ class TestContract(TestContractBase):
self.acct_line.recurring_invoicing_type = "pre-paid"
self.acct_line.recurring_rule_type = "monthly"
self.acct_line.date_end = "2018-03-15"
self.acct_line._onchange_date_start()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
)
@@ -1826,7 +1802,6 @@ class TestContract(TestContractBase):
self.acct_line.recurring_invoicing_type = "post-paid"
self.acct_line.recurring_rule_type = "yearly"
self.acct_line.date_end = "2020-03-15"
self.acct_line._onchange_date_start()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
)
@@ -1850,7 +1825,6 @@ class TestContract(TestContractBase):
self.acct_line.recurring_invoicing_type = "pre-paid"
self.acct_line.recurring_rule_type = "yearly"
self.acct_line.date_end = "2020-03-15"
self.acct_line._onchange_date_start()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
)
@@ -2024,30 +1998,6 @@ class TestContract(TestContractBase):
{"last_date_invoiced": self.acct_line.date_end + relativedelta(days=1)}
)
def test_init_last_date_invoiced(self):
self.acct_line.write(
{"date_start": "2019-01-01", "recurring_next_date": "2019-03-01"}
)
line_monthlylastday = self.acct_line.copy(
{
"recurring_rule_type": "monthlylastday",
"recurring_next_date": "2019-03-31",
}
)
line_prepaid = self.acct_line.copy(
{"recurring_invoicing_type": "pre-paid", "recurring_rule_type": "monthly"}
)
line_postpaid = self.acct_line.copy(
{"recurring_invoicing_type": "post-paid", "recurring_rule_type": "monthly"}
)
lines = line_monthlylastday | line_prepaid | line_postpaid
lines.write({"last_date_invoiced": False})
self.assertFalse(any(lines.mapped("last_date_invoiced")))
lines._init_last_date_invoiced()
self.assertEqual(line_monthlylastday.last_date_invoiced, to_date("2019-02-28"))
self.assertEqual(line_prepaid.last_date_invoiced, to_date("2019-02-28"))
self.assertEqual(line_postpaid.last_date_invoiced, to_date("2019-01-31"))
def test_delay_invoiced_contract_line(self):
self.acct_line.write(
{"last_date_invoiced": self.acct_line.date_start + relativedelta(days=1)}
@@ -2236,6 +2186,31 @@ class TestContract(TestContractBase):
self.terminate_reason, "terminate_comment", to_date("2018-02-13"),
)
def test_recurrency_propagation(self):
# Existing contract
vals = {
"recurring_rule_type": "yearly",
"recurring_interval": 2,
"date_start": to_date("2020-01-01"),
}
vals2 = vals.copy()
vals2["line_recurrence"] = False
self.contract.write(vals2)
for field in vals:
self.assertEqual(vals[field], self.acct_line[field])
# New contract
contract_form = Form(self.env["contract.contract"])
contract_form.partner_id = self.partner
contract_form.name = "Test new contract"
contract_form.line_recurrence = False
for field in vals:
setattr(contract_form, field, vals[field])
with contract_form.contract_line_fixed_ids.new() as line_form:
line_form.product_id = self.product_1
contract2 = contract_form.save()
for field in vals:
self.assertEqual(vals[field], contract2.contract_line_ids[field])
def test_currency(self):
currency_eur = self.env.ref("base.EUR")
currency_cad = self.env.ref("base.CAD")