Reportes QWEB

Los reportes QWeb en Odoo son la herramienta principal para diseñar documentos como facturas, cotizaciones o compras con un formato totalmente personalizado. Gracias a la potencia de QWeb, es posible adaptar la apariencia de los reportes a las necesidades de cada empresa, desde un diseño sencillo hasta plantillas complejas con estilos avanzados. En este blog veremos qué son, explicaremos sus características y mostraremos un ejemplo sencillo de su implementación en Odoo.

Daniel Sánchez

9/26/20255 min read

¿Qué son los reportes QWeb en Odoo?

Son el sistema principal para generar documentos en PDF, HTML o texto a partir de plantillas QWeb, que es un motor de renderizado de vistas que usa sintaxis XML.

Características de los reportes QWeb

Por mencionar algunas:

  • Permiten combinar HTML con expresiones dinámicas en Python (t-esc, t-foreach, t-if, etc.).

  • Los reportes son, en esencia, vistas QWeb diseñadas para impresión.

  • Se asocian a un modelo (por ejemplo, sale.order) y se pueden ejecutar desde botones, menús o acciones automáticas.

  • Se usan para documentos como facturas, órdenes de venta, cotizaciones, órdenes de compra, etiquetas, etc.

  • Permites personalización completa de diseño con HTML, CSS y condicionales.

Tipos de reportes QWeb

  • qweb-pdf: Genera un archivo PDF listo para imprimir o enviar. Se utiliza en facturas, cotizaciones, compras, etc.

  • qweb-html: Muestra el reporte directamente en el navegador como una vista previa en HTML. Se utiliza en la previsualización de documentos.

  • qweb-text: Genera salida en texto plano. Ideal para integraciones o reportes que no necesitan formato gráfico.

Ejemplo de reporte QWeb en Odoo

Se utilizará el módulo de ventas para crear un reporte dentro de las cotizaciones (modelo sale.order).

Dentro de un módulo personalizado agregamos el archivo ir_actions_report.xml dentro de la carpeta report. Es importante notar que no es estricto el nombre y la ubicación del archivo, y pueden ser a decisión del desarrollador o usuario. El código del archivo es el siguiente:

donde:

  • name: Es el nombre de la acción que genera el reporte. En este caso “Reporte Ventas”, el cual veremos dentro del modelo sale.order.

  • model: Es el nombre técnico del modelo del que se generará el reporte. En este caso, ventas o cotizaciones (sale.order).

  • report_type: El tipo del reporte que será renderizado. Debe ser uno entre sus posibles valores: qweb-htlml, qweb-pdf y qweb-text.

  • report_name: Es el identificador técnico interno del reporte.

  • report_file: Es el nombre de la plantilla que define la estructura del reporte.

  • print_report_name: El nombre que tendrá el archivo. En este caso, se utiliza una condicional para obtener el nombre según el estado de la venta. Si el estado es Cotización (draft) o Cotización enviada (sent), el nombre será ‘Cotización - [folio_de_la_order]’, en caso contrario, será ‘Venta - [folio_de_la_order]’.

  • binding_model_id: Módulo y nombre del que se generará el reporte.

Definimos report_sale_order como el nombre de la plantilla que define la estructura del reporte, por lo que creamos un archivo ir_actions_report_template.xml dentro de la carpeta report del módulo personalizado (el nombre y ubicación pueden ser a decisión del desarrollador/usuario) con id igual a report_sale_order. La estructura básica en código de la plantilla es la siguiente.

Al mapear los dos archivos anteriores dentro del módulo e instalarlo en una base, observamos que el modelo sale.order ya tiene disponible la acción “Reporte Ventas” para generar el reporte.

Al accionar el botón, se descarga el reporte a partir de la plantilla básica que definimos anteriormente. En este caso, la plantilla es solo una página en blanco.

Notemos que en nuestra plantilla utilizamos la plantilla modular html_container, perteneciente al módulo web. Esta plantilla modular contiene la información necesaria para generar el reporte, pero no es la única plantilla modular del módulo. Por ejemplo, el módulo también añade varias plantillas modulares que funcionan como cabeceras, las mismas que pueden ser modificadas o personalizadas dentro del propio sistema. En este caso, utilizaremos la plantilla modular external_layout del módulo web, y al llamarla, declaramos las variables doc, forced_vat y address que la plantilla espera recibir para construir el encabezado. El código de nuestra plantilla queda de la siguiente manera:

Y al volver a imprimir el reporte, notamos que se agregó el encabezado en automático:

donde la imagen es el logo de la empresa asociada al registro del modelo de ventas.

Dentro de nuestra plantilla podemos llamar a otros campos de la venta. Agregamos el folio de la venta dentro del reporte, modificando nuestra plantilla de la siguiente manera:

El cual nos genera el siguiente reporte:

Por lo que de esta forma podemos agregar campos de la orden para mostrarlos en el reporte según el diseño que queramos.

Por último, en este caso estamos utilizando un reporte tipo qweb-pdf, pero una buena práctica es primero utilizar qweb-html para definir la estructura general del reporte y visualizarla directo en el navegador sin tener que imprimir el reporte cada vez que hagamos cambios. A la acción que genera el reporte le cambiamos el tipo qweb-pdf por qweb-html de la siguiente manera:

Y al volver a generar el reporte desde la venta, vemos que se previsualiza directo en el navegador.

Consejos rápidos:

  • Define correctamente el report_type (qweb-pdf, qweb-html, qweb-text) según el formato que necesites.

  • Usa clases CSS de Bootstrap (ya incluidas en Odoo) para dar formato a tablas y textos sin complicarte.

  • Testea primero en HTML (qweb-html) antes de exportar a PDF para detectar problemas de diseño.

  • Mantén las plantillas modulares: utiliza t-call para incluir fragmentos y no duplicar código.

  • Aprovecha las expresiones dinámicas para recorrer listas, aplicar condiciones y mostrar datos de forma segura en el reporte.

  • Personaliza el nombre del archivo generado de acuerdo a tus necesidades.

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.