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

+
+
+
+ +
+
+
+
+
+
+
+
+ + +