Skip to content

Commit e90ac57

Browse files
author
GuillermoNforgeflow
committed
[ADD]mail_notify_employee_leave
1 parent f752a76 commit e90ac57

File tree

14 files changed

+762
-0
lines changed

14 files changed

+762
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
.. image:: https://odoo-community.org/readme-banner-image
2+
:target: https://odoo-community.org/get-involved?utm_source=readme
3+
:alt: Odoo Community Association
4+
5+
==========================
6+
Mail Notify Employee Leave
7+
==========================
8+
9+
..
10+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
11+
!! This file is generated by oca-gen-addon-readme !!
12+
!! changes will be overwritten. !!
13+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
14+
!! source digest: sha256:5f7b7a7481f72c60524273bb94fd697a975d3547b0b94c1f823902dfdaf99387
15+
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
16+
17+
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
18+
:target: https://odoo-community.org/page/development-status
19+
:alt: Beta
20+
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
21+
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
22+
:alt: License: AGPL-3
23+
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmail-lightgray.png?logo=github
24+
:target: https://github.com/OCA/mail/tree/17.0/mail_notify_employee_leave
25+
:alt: OCA/mail
26+
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
27+
:target: https://translation.odoo-community.org/projects/mail-17-0/mail-17-0-mail_notify_employee_leave
28+
:alt: Translate me on Weblate
29+
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
30+
:target: https://runboat.odoo-community.org/builds?repo=OCA/mail&target_branch=17.0
31+
:alt: Try me on Runboat
32+
33+
|badge1| |badge2| |badge3| |badge4| |badge5|
34+
35+
This module automatically notifies users when they mention or assign a
36+
colleague who is out of office. The notification includes the expected
37+
return date of the absent user and is sent only once per day per user.
38+
39+
**Table of contents**
40+
41+
.. contents::
42+
:local:
43+
44+
Bug Tracker
45+
===========
46+
47+
Bugs are tracked on `GitHub Issues <https://github.com/OCA/mail/issues>`_.
48+
In case of trouble, please check there if your issue has already been reported.
49+
If you spotted it first, help us to smash it by providing a detailed and welcomed
50+
`feedback <https://github.com/OCA/mail/issues/new?body=module:%20mail_notify_employee_leave%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
51+
52+
Do not contact contributors directly about support or help with technical issues.
53+
54+
Credits
55+
=======
56+
57+
Authors
58+
-------
59+
60+
* ForgeFlow
61+
62+
Contributors
63+
------------
64+
65+
- `ForgeFlow <https://www.forgeflow.com>`__:
66+
67+
- Guillermo Navas <guillermo.navas@forgeflow.com>
68+
69+
Maintainers
70+
-----------
71+
72+
This module is maintained by the OCA.
73+
74+
.. image:: https://odoo-community.org/logo.png
75+
:alt: Odoo Community Association
76+
:target: https://odoo-community.org
77+
78+
OCA, or the Odoo Community Association, is a nonprofit organization whose
79+
mission is to support the collaborative development of Odoo features and
80+
promote its widespread use.
81+
82+
This module is part of the `OCA/mail <https://github.com/OCA/mail/tree/17.0/mail_notify_employee_leave>`_ project on GitHub.
83+
84+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import models
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Copyright 2026 ForgeFlow S.L.
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3+
4+
{
5+
"name": "Mail Notify Employee Leave",
6+
"summary": """
7+
Notifies users when they mention or assign someone who is out of office.
8+
""",
9+
"version": "17.0.1.0.0",
10+
"license": "AGPL-3",
11+
"author": "ForgeFlow, Odoo Community Association (OCA)",
12+
"website": "https://github.com/OCA/mail",
13+
"depends": ["mail", "hr_holidays"],
14+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# Translation of Odoo Server.
2+
# This file contains the translation of the following modules:
3+
# * mail_notify_employee_leave
4+
#
5+
msgid ""
6+
msgstr ""
7+
"Project-Id-Version: Odoo Server 17.0+e\n"
8+
"Report-Msgid-Bugs-To: \n"
9+
"POT-Creation-Date: 2026-03-05 10:44+0000\n"
10+
"PO-Revision-Date: 2026-03-05 10:44+0000\n"
11+
"Last-Translator: \n"
12+
"Language-Team: \n"
13+
"MIME-Version: 1.0\n"
14+
"Content-Type: text/plain; charset=UTF-8\n"
15+
"Content-Transfer-Encoding: \n"
16+
"Plural-Forms: \n"
17+
18+
#. module: mail_notify_employee_leave
19+
#. odoo-python
20+
#: code:addons/mail_notify_employee_leave/models/mail_thread.py:0
21+
#, python-format
22+
msgid "%(name)s is out of office, expected back on %(date)s."
23+
msgstr "%(name)s estará ausente hasta %(date)s."
24+
25+
#. module: mail_notify_employee_leave
26+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_hr_employee__absence_notified_date
27+
msgid "Date of Last Absence Notification"
28+
msgstr "Fecha de la última notificación"
29+
30+
#. module: mail_notify_employee_leave
31+
#: model:ir.model.fields,help:mail_notify_employee_leave.field_hr_employee__absence_notified_date
32+
msgid "Date of the last notification record"
33+
msgstr "Fecha del último registro de notificaciones"
34+
35+
#. module: mail_notify_employee_leave
36+
#: model:ir.model,name:mail_notify_employee_leave.model_mail_thread
37+
msgid "Email Thread"
38+
msgstr "Hilo de correo electrónico"
39+
40+
#. module: mail_notify_employee_leave
41+
#: model:ir.model,name:mail_notify_employee_leave.model_hr_employee
42+
msgid "Employee"
43+
msgstr "Empleado"
44+
45+
#. module: mail_notify_employee_leave
46+
#: model:ir.model,name:mail_notify_employee_leave.model_hr_leave
47+
msgid "Time Off"
48+
msgstr "Ausencias"
49+
50+
#. module: mail_notify_employee_leave
51+
#: model:ir.model.fields,field_description:mail_notify_employee_leave.field_hr_employee__absence_notified_user_ids
52+
msgid "Users Notified Today"
53+
msgstr "Usuarios notificados hoy"
54+
55+
#. module: mail_notify_employee_leave
56+
#: model:ir.model.fields,help:mail_notify_employee_leave.field_hr_employee__absence_notified_user_ids
57+
msgid "Users who have already been notified today about this absence"
58+
msgstr "Usuarios que ya fueron notificados hoy sobre esta ausencia"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from . import mail_thread
2+
from . import hr_leave
3+
from . import hr_employee
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from odoo import fields, models
2+
3+
4+
class HrEmployee(models.Model):
5+
_inherit = "hr.employee"
6+
7+
absence_notified_user_ids = fields.Many2many(
8+
"res.users",
9+
string="Users Notified Today",
10+
help="Users who have already been notified today about this absence",
11+
)
12+
absence_notified_date = fields.Date(
13+
string="Date of Last Absence Notification",
14+
help="Date of the last notification record",
15+
)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from odoo import models
2+
3+
4+
class HrLeave(models.Model):
5+
_inherit = "hr.leave"
6+
7+
def _validate_leave_request(self):
8+
"""
9+
Override _validate_leave_request to skip absence notifications when
10+
approving leaves. The context flag 'skip_absence_notification' prevents
11+
_notify_thread from sending messages,
12+
"""
13+
if not self.env.context.get("skip_absence_notification"):
14+
return super(
15+
HrLeave, self.with_context(skip_absence_notification=True)
16+
)._validate_leave_request()
17+
return super()._validate_leave_request()
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from odoo import _, fields, models
2+
3+
4+
class MailThread(models.AbstractModel):
5+
_inherit = "mail.thread"
6+
7+
def _notify_thread(self, message, msg_vals=False, **kwargs):
8+
"""
9+
Alert the current user when a partner affected by the message is linked
10+
is out of office. It ensures that each absent employee triggers only
11+
one notification per user per day by recording notifications in
12+
'user.absence.notification' and sending an internal message with the
13+
employee's expected return date.
14+
"""
15+
recipients_data = super()._notify_thread(message, msg_vals=msg_vals, **kwargs)
16+
17+
if self.env.context.get("skip_absence_notification"):
18+
return recipients_data
19+
20+
affected_partner_ids = msg_vals.get("partner_ids", []) if msg_vals else []
21+
22+
today = fields.Date.today()
23+
24+
for partner_id in affected_partner_ids:
25+
partner = self.env["res.partner"].browse(partner_id)
26+
employee = self.env["hr.employee"].search(
27+
[("user_id.partner_id", "=", partner.id)], limit=1
28+
)
29+
if employee and employee.is_absent:
30+
if employee.absence_notified_date != today:
31+
employee.absence_notified_user_ids = [(5, 0, 0)]
32+
employee.absence_notified_date = today
33+
34+
if self.env.user not in employee.absence_notified_user_ids:
35+
body = _(
36+
"%(name)s is out of office, expected back on %(date)s."
37+
) % {
38+
"name": employee.name,
39+
"date": employee.leave_date_to,
40+
}
41+
self.message_notify(
42+
partner_ids=[self.env.user.partner_id.id],
43+
body=body,
44+
subject="User out of office",
45+
subtype_xmlid="mail.mt_note",
46+
notify_author=True,
47+
)
48+
employee.absence_notified_user_ids = [(4, self.env.user.id)]
49+
50+
return recipients_data
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[build-system]
2+
requires = ["whool"]
3+
build-backend = "whool.buildapi"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
- [ForgeFlow](https://www.forgeflow.com):
2+
- Guillermo Navas \<<guillermo.navas@forgeflow.com>\>

0 commit comments

Comments
 (0)