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..15adb51f8 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): + activities = self.search( + [ + ("to_review_date", "=", fields.datetime.today()), + ("agreement_type_id.review_user_id", "!=", False), + ] + ) + for activity in activities: + if ( + self.env["mail.activity"].search_count( + [("res_id", "=", activity.id), ("res_model", "=", "agreement")] + ) + == 0 + ): + activity.activity_schedule( + "agreement_legal.mail_activity_review_agreement", + user_id=activity.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/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 + + +