Automatizando Odoo - Actividades planificadas

27 de junio de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Las tareas planificadas son los procesos que se ejecutan en Odoo de forma periódica. Sería similar al cron de Linux pero en Odoo, con la diferencia que se implementa en modo gráfico. El colmo de la similitud es que el modelo donde se implementa se llama ir.cron.

Odoo tiene con un calendario de métodos a realizar cada determinados intervalos o en determinados días y horarios, y ejecuta dichos métodos. Estas tareas son autónomas y no presentan la complejidad de un flujo de trabajos. No es posible hacer algo como "si se ejecutó la tarea X exitosamente, entonces se debe ejecutar la tarea Y" 

Las tareas planificadas se administran con el menú "Ajustes > Técnico > Automatización > Acciones Planificadas". Y se necesita tener acceso al modo desarrollador para trabajar con ellas.


En este menú se puede definir una nueva acción a definirse, y administrar las ya presentes en el sistema. Por ejemplo si clickeamos en "Gestor de colas de mail" podemos ver lo siguiente:


Podemos apreciar que hay un botón "Ejecutar manualmente" (el cual era un excelente módulo de OCA hasta que Odoo incorporó dicha funcionalidad al core años atras). Este botón ejecuta instantaneamente la acción determinada. Tambien vemos el modelo donde se ejecutará la acción planificada (todas las acciones se "disparan desde") un modelo, con que frecuencia se ejecuta y el número de ejecuciones (se indica -1 si se lo quiere ejecutar de forma indefinida).

Lo más importante aquí es comprender el código Python que se va a ejecutar. Ahí lo que se hace por lo general es indicar del modelo con el que se va a trabajar, que acciones realizar. Siempre se invoca del modelo un método de esta forma


model.mi_metodo()

Hay otras opciones de utilizar código en las acciones planificadas, pero creo que el patrón "modelo.metodo" es el más sencillo. Solo se tiene que definir en el modelo un método con el decorador @api.model (el cual convierte al método en un método no atado a un recordset). En este método debemos seleccionar con que registros vamos a trabajar y que acción vamos a realizar sobre ellos (por ejemplo, enviar un e-mail).

@api.model
def mi_metodo(self):
my_records = self.search()
for rec in my_records:
rec.my_method()

Por ejemplo, supongamos tenemos un método en las facturas (modelo account.move) que envia un e-mail indicando que la factura si la misma esta pendiente de pago. Para ello definimos el método mail_customer_pending_invoice. La definición de la acción planificada es la siguiente:



Y la definición en el objeto account.move del método mail_customers_pending_invoices sería como se indica a continuación:

@api.model
def mail_customer_pending_invoices(self):
invs = self.search([('move_type','=','out_invoice'),('amount_residual_signed','>',0)])
for inv in invs:
inv.mail_customer_pending_invoice()



Gustavo Orrillo 27 de junio de 2023
Compartir
Archivar
Identificarse dejar un comentario