Tipos personalizados de reportes

En este blog exploraremos qué son los handlers de ir.actions.report, para qué sirven y cómo puedes aprovecharlos para crear nuevos tipos de reportes a la medida de los requerimientos.

Daniel Sánchez

7/22/20254 min read

¿Qué es ir.actions.report?

En Odoo, ir.actions.report es un modelo (model) que define acciones de reporte.

Sirve para configurar y ejecutar la generación de reportes (PDF, HTML, XML, etc.). Cuando creas un reporte en Odoo (por ejemplo, una factura en PDF), este se representa como un registro en ir.actions.report.

¿Qué son los “handlers”?

Los handlers de ir.actions.report son métodos que procesan la generación del reporte.

Son los controladores que se encargan de renderizar el contenido final.

Por ejemplo:

  • Si el report_type es qweb-pdf: Se invoca el handler para convertir la plantilla QWeb en PDF.

  • Si es qweb-html: El handler renderiza HTML.

  • Si es controller: Se usa una URL y un controlador HTTP para generar el contenido dinámico.

  • Si es py o report_py: Se llama a un método Python personalizado.

¿Para qué se usan?

Los handlers hacen posible que

  • El usuario pueda imprimir o descargar un PDF (facturas, pedidos, cotizaciones, etc.).

  • Los reportes puedan ser convertidos a diferentes formatos según la lógica definida.

  • Se puedan extender o reemplazar: por ejemplo, puedes heredar ir.actions.report y definir un handler Python propio para personalizar la salida.

  • Declarar un nuevo tipo de reporte a descargar.

Ejemplo de creación de un nuevo tipo de reportes

Heredamos la vista lista de las cotizaciones (modelo sale.order) y añadimos un botón que acciona una función dentro del elemento <header> de la siguiente manera:

El botón anterior acciona la función action_csv_test, misma que definimos dentro del modelo sale.order de la siguiente manera:

Hasta aquí tenemos lo siguiente:

  • Cuando seleccionamos uno o más registros del modelo de cotizaciones desde la vista lista, se muestra un botón llamado ‘Imprimir reporte CSV’, el cual ejecuta la función action_csv_test definida desde el modelo sale.order.

  • La función action_csv_test devuelve un registro del modelo ‘ir.actions.report’, mismos que definen acciones de reporte. Son configuraciones que enlazan una plantilla de reporte (PDF, HTML, XML, etc.) con un modelo.

  • Dentro de los datos a enviar tenemos:

     -Nombre del modelo (sale.order).

     -Opciones, dentro de las cuales agregamos los IDs de los registros sale.order de los que generaremos el reporte.

     -Formato de salida, el cual será ‘csv_test’. Este no es un formato de archivo, simplemente se utiliza como identificador para validar el formato correcto a utilizar.

      -Nombre del reporte, el cual será ‘Venta_CSV’ más la extensión del archivo.

  • Agregamos ‘csv_test’ en el campo ‘report_type’. En este campo pudimos haber agregado cualquier nombre que quisiéramos, ya que ese nombre lo declararemos como un nuevo tipo de reportes a utilizar. En este caso, el nuevo tipo de reporte se llamará ‘csv_test’.

Al tener los anteriores archivos mapeados dentro del módulo, creamos desde un archivo JavaScript el nuevo tipo de reporte. La estructura del código es la siguiente:

Desde este archivo se está declarando el nuevo tipo de reportes llamado ‘csv_test’. Lo que hará es, que cuando se genere un reporte de este tipo, llamará a la URL /csv_test_report de un controlador, y el resultado lo descargará. Este archivo se debe declarar desde los assets ‘web.assets_backend’ dentro del módulo.

Ahora que sabemos que el nuevo tipo de reporte llamará a una URL de un controlador, es hora de declararla. Creamos el siguiente controlador dentro de un archivo mapeado en la carpeta controladores del módulo, de la siguiente manera:

  • Declaramos el controlador CSVTestController, donde su URL /csv_test_report es la que generará el reporte.

  • A través de los parámetros, obtenemos el modelo y los ids de los registros de los cuales generaremos el reporte. En este caso, generamos un reporte CSV donde la primer columna, ID, será el id del registro, lo mismo con las columnas orden y partner, que serán la segunda y tercera, respectivamente.

  • Validamos el parámetro output_format y si es igual a ‘csv_test’ descargamos el archivo CSV.

Al tener los anteriores archivos mapeados dentro del módulo, generamos el reporte de la siguiente manera: seleccionamos varias ventas, se muestra el botón ‘Imprimir reporte CSV’, lo presionamos y se descarga el reporte.

El cual se ve de la siguiente manera (al abrirlo desde libreoffice y desde un editor de texto plano):

Consejos rápidos:

  • Define claramente si necesitas qweb-pdf, qweb-html o un controller especial. Usa qweb-pdf para documentos que se descargarán en PDF.

  • Si necesitas cambiar la forma de renderizar un reporte existente, hereda la clase ir.actions.report y redefine solo lo necesario.

  • Aunque el uso principal de los handlers dentro de Odoo es para declarar nuevos tipos de reportes, existen módulos que los utilizan para llamar métodos JavaScript y extender cierta funcionalidad. Entre ellos, están los módulos iot o pos_iot.

En Exdoo podemos desarrollar cualquier módulo para Odoo en México, implementamos tu ERP con consultores experimentados no solo en Odoo sino en procesos de negocios, tenemos 10 años trabajando solamente con Odoo en México y otros países.