diff --git a/maintenance_equipment_certification/models/maintenance_equipment_certificate.py b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py
index e08eab18b..164f8923c 100644
--- a/maintenance_equipment_certification/models/maintenance_equipment_certificate.py
+++ b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py
@@ -3,6 +3,8 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import timedelta
+from markupsafe import Markup, escape
+
from odoo import api, fields, models
@@ -75,10 +77,29 @@ def _cron_notify_expiring_certificates(self):
equipment = cert.equipment_id
user = equipment.technician_user_id or equipment.owner_user_id
if not user:
+ equipment.activity_schedule(
+ "mail.mail_activity_data_todo",
+ date_deadline=cert.renewal_date,
+ summary=self.env._("Certificate expiration: no assignee to notify"),
+ note=Markup(
+ "Certificate %s (renewal: %s) could not send "
+ "expiration reminder: no technician or owner is assigned."
+ )
+ % (escape(cert.name), cert.renewal_date),
+ )
continue
if template:
template.send_mail(
cert.id,
email_layout_xmlid="mail.mail_notification_light",
+ email_values={"partner_ids": [user.partner_id.id]},
+ )
+ equipment.message_post(
+ body=Markup(
+ "Certificate expiration reminder sent for "
+ "%s (renewal: %s)."
+ )
+ % (escape(cert.name), cert.renewal_date),
+ subtype_xmlid="mail.mt_note",
)
cert.expiration_notify_count = expected
diff --git a/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py
index c2c2814c0..17502473c 100644
--- a/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py
+++ b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py
@@ -110,6 +110,10 @@ def test_full_notification_lifecycle(self):
cert = self._make_certificate(25)
self._run_cron()
self.assertEqual(cert.expiration_notify_count, 1)
+ chatter_msgs = self.equipment.message_ids.filtered(
+ lambda m: "Test Certificate" in (m.body or "")
+ )
+ self.assertTrue(chatter_msgs, "Expected chatter note on equipment after send")
# 5 days out: 30-day + 7-day rules now triggered.
self._shift_renewal(cert, 5)
@@ -183,3 +187,12 @@ def test_cron_guard_conditions(self):
cert = self._make_certificate(10, equipment_id=equipment_no_user.id)
self._run_cron()
self.assertEqual(cert.expiration_notify_count, 0)
+ self.assertEqual(
+ len(equipment_no_user.activity_ids),
+ 1,
+ "Expected one activity on equipment with no assignee",
+ )
+ self.assertIn(
+ "no assignee",
+ equipment_no_user.activity_ids.summary,
+ )