diff --git a/agreement_legal/__manifest__.py b/agreement_legal/__manifest__.py index 84cf9123d..41b061324 100644 --- a/agreement_legal/__manifest__.py +++ b/agreement_legal/__manifest__.py @@ -14,6 +14,7 @@ "version": "14.0.2.4.1", "depends": ["contacts", "agreement", "product"], "data": [ + "data/cron.xml", "data/ir_sequence.xml", "data/agreement_stage.xml", "data/agreement_type.xml", diff --git a/agreement_legal/data/cron.xml b/agreement_legal/data/cron.xml new file mode 100644 index 000000000..9098de89c --- /dev/null +++ b/agreement_legal/data/cron.xml @@ -0,0 +1,25 @@ + + + + + Agreement needs a review + note + default + + fa-tasks + 0 + + + + Agreement: Check to Review Days + + code + model._alert_to_review_date() + + 20 + minutes + -1 + + + + diff --git a/agreement_legal/models/agreement.py b/agreement_legal/models/agreement.py index 947deffb2..59e67c35d 100644 --- a/agreement_legal/models/agreement.py +++ b/agreement_legal/models/agreement.py @@ -3,6 +3,7 @@ import ast import json as simplejson +from datetime import timedelta from lxml import etree @@ -293,6 +294,44 @@ class Agreement(models.Model): readonly = fields.Boolean( related="stage_id.readonly", ) + readonly = fields.Boolean( + related="stage_id.readonly", + ) + to_review_date = fields.Date( + compute="_compute_to_review_date", + store=True, + readonly=False, + help="Date used to warn us some days before agreement expires", + ) + + @api.depends("agreement_type_id", "end_date") + def _compute_to_review_date(self): + for record in self: + if record.end_date: + record.to_review_date = record.end_date + timedelta( + days=-record.agreement_type_id.review_days + ) + + @api.model + def _alert_to_review_date(self): + agreements = self.search( + [ + ("to_review_date", "=", fields.Date.today()), + ("agreement_type_id.review_user_id", "!=", False), + ] + ) + for agreement in agreements: + if ( + self.env["mail.activity"].search_count( + [("res_id", "=", agreement.id), ("res_model", "=", self._name)] + ) + == 0 + ): + agreement.activity_schedule( + "agreement_legal.mail_activity_review_agreement", + user_id=agreement.agreement_type_id.review_user_id.id, + note=_("Your activity is going to end soon"), + ) # compute the dynamic content for jinja expression def _compute_dynamic_description(self): diff --git a/agreement_legal/models/agreement_type.py b/agreement_legal/models/agreement_type.py index b1add48e5..2264984c8 100644 --- a/agreement_legal/models/agreement_type.py +++ b/agreement_legal/models/agreement_type.py @@ -11,3 +11,7 @@ class AgreementType(models.Model): agreement_subtypes_ids = fields.One2many( "agreement.subtype", "agreement_type_id", string="Sub-Types" ) + review_user_id = fields.Many2one( + "res.users", help="User assigned automatically the activity on review date" + ) + review_days = fields.Integer() diff --git a/agreement_legal/tests/test_agreement.py b/agreement_legal/tests/test_agreement.py index 93c9465d9..7fd75f4d2 100644 --- a/agreement_legal/tests/test_agreement.py +++ b/agreement_legal/tests/test_agreement.py @@ -148,3 +148,46 @@ class TestAgreement(TransactionCase): self.test_agreement.create_new_version() self.assertEqual(self.test_agreement.state, "draft") self.assertEqual(len(self.test_agreement.previous_version_agreements_ids), 1) + + def test_cron(self): + self.agreement_type.write( + {"review_user_id": self.env.user.id, "review_days": 0} + ) + self.agreement_type.flush() + self.test_agreement.write({"agreement_type_id": self.agreement_type.id}) + self.test_agreement.flush() + self.test_agreement.refresh() + self.assertFalse( + self.env["mail.activity"].search_count( + [ + ("res_id", "=", self.test_agreement.id), + ("res_model", "=", self.test_agreement._name), + ] + ) + ) + self.env["agreement"]._alert_to_review_date() + self.assertFalse( + self.env["mail.activity"].search_count( + [ + ("res_id", "=", self.test_agreement.id), + ("res_model", "=", self.test_agreement._name), + ] + ) + ) + self.test_agreement.to_review_date = fields.Date.today() + self.env["agreement"]._alert_to_review_date() + self.assertTrue( + self.env["mail.activity"].search_count( + [ + ("res_id", "=", self.test_agreement.id), + ("res_model", "=", self.test_agreement._name), + ] + ) + ) + + def test_partner_action(self): + action = self.test_agreement.partner_id.action_open_agreement() + self.assertIn( + self.test_agreement, self.env[action["res_model"]].search(action["domain"]) + ) + self.assertEqual(1, self.test_agreement.partner_id.agreements_count) diff --git a/agreement_legal/views/agreement.xml b/agreement_legal/views/agreement.xml index 8471e89b9..ce2a04650 100644 --- a/agreement_legal/views/agreement.xml +++ b/agreement_legal/views/agreement.xml @@ -226,6 +226,10 @@ name="end_date" attrs="{'required': [('is_template', '=', False)], 'invisible': [('is_template', '=', True)]}" /> + + agreement.type + + +