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