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