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
+
+
+