diff --git a/contract/__manifest__.py b/contract/__manifest__.py
index 2851e545..fdd9cdb8 100644
--- a/contract/__manifest__.py
+++ b/contract/__manifest__.py
@@ -35,6 +35,7 @@
'views/contract_template.xml',
'views/contract_template_line.xml',
'views/res_partner_view.xml',
+ 'views/res_config_settings.xml',
],
'installable': True,
}
diff --git a/contract/migrations/12.0.5.0.1/post-migration.py b/contract/migrations/12.0.5.0.1/post-migration.py
new file mode 100644
index 00000000..9e3ada14
--- /dev/null
+++ b/contract/migrations/12.0.5.0.1/post-migration.py
@@ -0,0 +1,7 @@
+def migrate(cr, version):
+ cr.execute(
+ """\
+ UPDATE res_company
+ SET create_new_line_at_contract_line_renew = true
+ """
+ )
diff --git a/contract/models/__init__.py b/contract/models/__init__.py
index b7382c2d..6d46b4b6 100644
--- a/contract/models/__init__.py
+++ b/contract/models/__init__.py
@@ -10,3 +10,5 @@ from . import account_invoice
from . import account_invoice_line
from . import res_partner
from . import contract_tag
+from . import res_company
+from . import res_config_settings
diff --git a/contract/models/contract_line.py b/contract/models/contract_line.py
index c9d475bd..8104b65e 100644
--- a/contract/models/contract_line.py
+++ b/contract/models/contract_line.py
@@ -1156,25 +1156,43 @@ class ContractLine(models.Model):
}
@api.multi
- def _get_renewal_dates(self):
+ def _get_renewal_new_date_end(self):
self.ensure_one()
date_start = self.date_end + relativedelta(days=1)
date_end = self._get_first_date_end(
date_start, self.auto_renew_rule_type, self.auto_renew_interval
)
- return date_start, date_end
+ return date_end
+
+ @api.multi
+ def _renew_create_line(self, date_end):
+ self.ensure_one()
+ date_start = self.date_end + relativedelta(days=1)
+ is_auto_renew = self.is_auto_renew
+ self.stop(self.date_end, post_message=False)
+ new_line = self.plan_successor(
+ date_start, date_end, is_auto_renew, post_message=False
+ )
+ new_line._onchange_date_start()
+ return new_line
+
+ @api.multi
+ def _renew_extend_line(self, date_end):
+ self.ensure_one()
+ self.date_end = date_end
+ return self
@api.multi
def renew(self):
res = self.env['contract.line']
for rec in self:
- is_auto_renew = rec.is_auto_renew
- rec.stop(rec.date_end, post_message=False)
- date_start, date_end = rec._get_renewal_dates()
- new_line = rec.plan_successor(
- date_start, date_end, is_auto_renew, post_message=False
- )
- new_line._onchange_date_start()
+ company = rec.contract_id.company_id
+ date_end = rec._get_renewal_new_date_end()
+ date_start = rec.date_end + relativedelta(days=1)
+ if company.create_new_line_at_contract_line_renew:
+ new_line = rec._renew_create_line(date_end)
+ else:
+ new_line = rec._renew_extend_line(date_end)
res |= new_line
msg = _(
"""Contract line for {product}
diff --git a/contract/models/res_company.py b/contract/models/res_company.py
new file mode 100644
index 00000000..ce53ded8
--- /dev/null
+++ b/contract/models/res_company.py
@@ -0,0 +1,17 @@
+# Copyright 2019 ACSONE SA/NV
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class ResCompany(models.Model):
+
+ _inherit = 'res.company'
+
+ create_new_line_at_contract_line_renew = fields.Boolean(
+ string="Create New Line At Contract Line Renew",
+ help="If checked, a new line will be generated at contract line renew "
+ "and linked to the original one as successor. The default "
+ "behavior is to extend the end date of the contract by a new "
+ "subscription period",
+ )
diff --git a/contract/models/res_config_settings.py b/contract/models/res_config_settings.py
new file mode 100644
index 00000000..7ab0e91d
--- /dev/null
+++ b/contract/models/res_config_settings.py
@@ -0,0 +1,19 @@
+# Copyright 2019 ACSONE SA/NV
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class ResConfigSettings(models.TransientModel):
+
+ _inherit = 'res.config.settings'
+
+ create_new_line_at_contract_line_renew = fields.Boolean(
+ related="company_id.create_new_line_at_contract_line_renew",
+ readonly=False,
+ string="Create New Line At Contract Line Renew",
+ help="If checked, a new line will be generated at contract line renew "
+ "and linked to the original one as successor. The default "
+ "behavior is to extend the end date of the contract by a new "
+ "subscription period",
+ )
diff --git a/contract/tests/test_contract.py b/contract/tests/test_contract.py
index e406a45e..3253716e 100644
--- a/contract/tests/test_contract.py
+++ b/contract/tests/test_contract.py
@@ -109,6 +109,7 @@ class TestContractBase(common.SavepointCase):
cls.line_vals
)
cls.acct_line.product_id.is_auto_renew = True
+ cls.contract.company_id.create_new_line_at_contract_line_renew = True
class TestContract(TestContractBase):
@@ -1668,7 +1669,7 @@ class TestContract(TestContractBase):
self.assertTrue(line_3.successor_contract_line_id)
self.assertFalse(line_4.successor_contract_line_id)
- def test_renew(self):
+ def test_renew_create_new_line(self):
date_start = self.today - relativedelta(months=9)
date_end = (
date_start + relativedelta(months=12) - relativedelta(days=1)
@@ -1693,6 +1694,31 @@ class TestContract(TestContractBase):
new_line.date_end, date_end + relativedelta(months=12)
)
+ def test_renew_extend_original_line(self):
+ self.contract.company_id.create_new_line_at_contract_line_renew = False
+ date_start = self.today - relativedelta(months=9)
+ date_end = (
+ date_start + relativedelta(months=12) - relativedelta(days=1)
+ )
+ self.acct_line.write(
+ {
+ 'is_auto_renew': True,
+ 'date_start': date_start,
+ 'recurring_next_date': date_start,
+ 'date_end': self.today,
+ }
+ )
+ self.acct_line._onchange_is_auto_renew()
+ self.assertEqual(self.acct_line.date_end, date_end)
+ self.acct_line.renew()
+ self.assertTrue(self.acct_line.is_auto_renew)
+ self.assertEqual(
+ self.acct_line.date_start, date_start
+ )
+ self.assertEqual(
+ self.acct_line.date_end, date_end + relativedelta(months=12)
+ )
+
def test_cron_recurring_create_invoice(self):
self.acct_line.date_start = '2018-01-01'
self.acct_line.recurring_invoicing_type = 'post-paid'
diff --git a/contract/views/res_config_settings.xml b/contract/views/res_config_settings.xml
new file mode 100644
index 00000000..097aec3e
--- /dev/null
+++ b/contract/views/res_config_settings.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ res.config.settings
+
+
+
+ Contract
+
+
+
+
+
+
+