La generación de notificaciones por correo electrónico es una funcionalidad muy solicitada por los usuarios de Odoo, que con frecuencia desean adicionar a las funciones básicas, la posibilidad de enviar también un correo de alerta según parámetros específicos. Más allá de reportes y gráficos, los especialistas de inventario, de nómina, de ventas, los contadores, etc... confían en el hecho de que el sistema que usen, se encargue de avisar cuándo hay alguna acción que tomar antes de un evento crítico.
Si bien es cierto que con un conocimiento avanzado de la plataforma, esto se puede lograr a punta de configuración (o tal vez usando el Studio), resulta muy práctico tener el ‘know how’ necesario para realizarlo de forma dinámica desde el código.
Usemos un caso de estudio donde tenemos ya creado un modelo ‘example.concept’ con un conjunto de atributos. Luego de tener nuestro módulo ‘my_module’ funcionando (no nos vamos a centrar en esta parte del caso de estudio), necesitamos que el sistema envíe un correo de notificación, informando al usuario que creó el registro, que se ha alcanzado la fecha de alerta configurada.
Para obtener este resultado, puedes seguir los siguientes pasos:
1 - Crear una plantilla de correo (preferentemente en la carpeta data, dentro de la estructura de tu módulo), en un fichero mail_data.xml.
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Email Templates -->
<template id="example_alert_notification_template">
<p> Dear <t t-esc="partner_name"/>:</p>
<p> Example concept with code number:
<t t-esc="example_code"/>, amounting
<t t-esc="amount"/> USD, is about to expire.</p>
<p> Greetings,</p>
<p> System admin</p>
</template>
</data>
</odoo>
2 – Crear un método que permita generar el correo de notificación, para los registros que cumplen con ciertos parámetros. En este caso de ejemplo tomaremos los registros cuya fecha de alerta coincide con el día de hoy.
class ExampleConcept(models.Model)
_name=’example.concept’
# Field definitions
…
def example_concept_alert(self):
example_data_ids = self.search([]).filtered(
lambda f: f.date_alert == date.today()
)
if example_data_ids:
for dta in example_data_ids:
# List Every recipient involved
email_values = [dta.user_id.partner_id.email]
example_template = self.env.ref(
"my_module.example_alert_notification_template")
vals = {
"partner_name": dta.partner_id.name,
"dta_code": dta.name,
"amount": dta.amount
}
rendered_body = example_template ._render(vals, engine="ir.qweb") body=self.env["mail.render.mixin"]._replace_local_links(rendered_body)
self.env['mail.mail'].sudo().create({
'email_from': 'noresponder@sample.com',
'body_html': body,
'subject': _('Example concept period expired'),
'email_to': ','.join(email_values),
'auto_delete': True,
}).send()
Si quieres que el correo se envíe al presionar algún botón, solo tendrás que llamar a este método desde tu botón.
3 – Si deseas activarlo mediante un cron, debes incluir en la misma carpeta data de tu módulo, un nuevo fichero cron_data.xml.
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="ir_cron_example_concept_alert" model="ir.cron">
<field name="name">Example concept alert</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="user_id" ref="base.user_root"/>
<field name="doall" eval="False"/>
<field name="model_id" ref="model_example_concept"/>
<field name="state">code</field>
<field name="code">model.example_concept_alert()</field>
</record>
</odoo>
Y listo… solo te queda asegurarte de que incluyes los archivos mail_data.xml y cron_data.xml en tu archivo __manifest__.py.