Automatizando tareas en Odoo - las actividades planificadas

Gustavo Orrillo
- 06/04/2022 - 1 min. de lectura


Las tareas planificadas son actividades que se ejecutan en Odoo de forma periódica. Internamente Odoo cuenta con una agenda de acciones a realizar cada determinados intervalos o en determinados días y horarios, y las ejecuta. No poseen gran complejidad (por ejemplo, no se pueden enlacar actividades) pero su simpleza la hace poderosa. Es similar al cron de Linux, es por eso que el modelo que las administra se llama ir.cron.

Para acceder a las acciones planificadas, hay que clickear en el menú "Ajustes > Técnico > Automatización > Acciones Planificadas"


Allí podemos definir una nueva acción a ejecutarse. Supongamos, que clickeamos en "Gestor de colas de mail". Ahí observaremos lo siguiente:


Vemos un botón "Ejecutar manualmente" el cual era un excelente módulo de OCA hasta que Odoo incorporó dicha funcionalidad al core. Lo que hace ese botón es, ejecutar en ese instante la acción planificada. Seguidamente 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? El código Python. 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()

Y en el objeto donde vamos a ejecutar la acción planificada, debemos definir un método con el decorador @api.model, en el cual seleccionamos con que registros vamos a trabajar y que acción vamos a realizar sobre ellos

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

A modo de ejemplo, supongamos tenemos un método en las facturas (modelo account.move) que envia un e-mail indicando que la factura de cliente tiene un saldo por pagar (método mail_customer_pending_invoice). La definición de la acción planificada será como sigue:


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()


Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.