{"id":444,"date":"2025-09-26T09:49:35","date_gmt":"2025-09-26T09:49:35","guid":{"rendered":"https:\/\/sienna-manatee-218967.hostingersite.com\/blogs\/reportes-qweb-2\/"},"modified":"2026-05-01T18:54:30","modified_gmt":"2026-05-01T18:54:30","slug":"reportes-qweb","status":"publish","type":"post","link":"https:\/\/exdoo.mx\/blogs\/reportes-qweb\/","title":{"rendered":"Reportes QWEB"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/banners-sitio-web-05-AE07pJNrE6t6b1Ky-2-scaled-1.jpg\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p dir=\"auto\" class=\"body\"><em><u>\u00bfQu\u00e9 son los reportes QWeb en Odoo?<\/u><\/em><\/p>\n<div style=\"background:linear-gradient(135deg,#0A7099 0%,#0d8db8 100%);color:#fff;padding:28px 26px;border-radius:16px;margin:0 0 28px;box-shadow:0 4px 16px rgba(10,112,153,.2);\">\n<div style=\"display:inline-block;background:rgba(255,255,255,.18);padding:6px 14px;border-radius:20px;font-size:12px;font-weight:700;letter-spacing:.5px;margin-bottom:12px;color:#fff;\">\ud83d\udcd8 ART\u00cdCULO T\u00c9CNICO<\/div>\n<p style=\"font-size:16px;line-height:1.6;margin:0;color:#fff;opacity:.95;\">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.<\/p>\n<\/div>\n<p dir=\"auto\" class=\"body\"><em><u>Caracter\u00edsticas de los reportes QWeb<\/u><\/em><\/p>\n<p dir=\"auto\" class=\"body\">Por mencionar algunas:<\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li>Permiten combinar HTML con expresiones din\u00e1micas en Python (t-esc, t-foreach, t-if, etc.).<\/li>\n<li>Los reportes son, en esencia, vistas QWeb dise\u00f1adas para impresi\u00f3n.<\/li>\n<li>Se asocian a un modelo (por ejemplo, sale.order) y se pueden ejecutar desde botones, men\u00fas o acciones autom\u00e1ticas.<\/li>\n<li>Se usan para documentos como facturas, \u00f3rdenes de venta, cotizaciones, \u00f3rdenes de compra, etiquetas, etc.<\/li>\n<li>Permites personalizaci\u00f3n completa de dise\u00f1o con HTML, CSS y condicionales.<\/li>\n<\/ul>\n<p dir=\"auto\" class=\"body\"><em><u>Tipos de reportes QWeb<\/u><\/em><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><strong>qweb-pdf:<\/strong> Genera un archivo PDF listo para imprimir o enviar. Se utiliza en facturas, cotizaciones, compras, etc.<\/li>\n<li><strong>qweb-html:<\/strong> Muestra el reporte directamente en el navegador como una vista previa en HTML. Se utiliza en la previsualizaci\u00f3n de documentos.<\/li>\n<li><strong>qweb-text:<\/strong> Genera salida en texto plano. Ideal para integraciones o reportes que no necesitan formato gr\u00e1fico.<\/li>\n<\/ul>\n<h3 style=\"color:#0A7099;margin-top:22px;font-size:16px;\">Ejemplo de reporte QWeb en Odoo<\/h3>\n<p dir=\"auto\" class=\"body\">Se utilizar\u00e1 el m\u00f3dulo de ventas para crear un reporte dentro de las cotizaciones (modelo sale.order).<\/p>\n<p class=\"body\" dir=\"auto\">Dentro de un m\u00f3dulo personalizado agregamos el archivo <strong><em>ir_actions_report.xml<\/em><\/strong> dentro de la carpeta <strong><em>report<\/em><\/strong>. Es importante notar que no es estricto el nombre y la ubicaci\u00f3n del archivo, y pueden ser a decisi\u00f3n del desarrollador o usuario. El c\u00f3digo del archivo es el siguiente:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-10.05.13a-a.m.-Yg24lR3MGvsKJD5Z-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p dir=\"auto\" class=\"body\">donde:<\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><strong>name:<\/strong> Es el nombre de la acci\u00f3n que genera el reporte. En este caso \u201cReporte Ventas\u201d, el cual veremos dentro del modelo sale.order.<\/li>\n<li><strong>model:<\/strong> Es el nombre t\u00e9cnico del modelo del que se generar\u00e1 el reporte. En este caso, ventas o cotizaciones (sale.order).<\/li>\n<li><strong>report_type:<\/strong> El tipo del reporte que ser\u00e1 renderizado. Debe ser uno entre sus posibles valores: qweb-htlml, qweb-pdf y qweb-text.<\/li>\n<li><strong>report_name:<\/strong> Es el identificador t\u00e9cnico interno del reporte.<\/li>\n<li><strong>report_file:<\/strong> Es el nombre de la plantilla que define la estructura del reporte.<\/li>\n<li><strong>print_report_name:<\/strong> El nombre que tendr\u00e1 el archivo. En este caso, se utiliza una condicional para obtener el nombre seg\u00fan el estado de la venta. Si el estado es Cotizaci\u00f3n (draft) o Cotizaci\u00f3n enviada (sent), el nombre ser\u00e1 \u2018Cotizaci\u00f3n &#8211; [folio_de_la_order]\u2019, en caso contrario, ser\u00e1 \u2018Venta &#8211; [folio_de_la_order]\u2019.<\/li>\n<li><strong>binding_model_id:<\/strong> M\u00f3dulo y nombre del que se generar\u00e1 el reporte.<\/li>\n<\/ul>\n<p dir=\"auto\" class=\"body\">Definimos <strong><em>report_sale_order<\/em><\/strong> como el nombre de la plantilla que define la estructura del reporte, por lo que creamos un archivo <strong><em>ir_actions_report_template.xml<\/em><\/strong> dentro de la carpeta <strong><em>report<\/em><\/strong> del m\u00f3dulo personalizado (el nombre y ubicaci\u00f3n pueden ser a decisi\u00f3n del desarrollador\/usuario) con id igual a report_sale_order. La estructura b\u00e1sica en c\u00f3digo de la plantilla es la siguiente.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-10.11.09a-a.m.-YNqMJGnxr1tpKqPa-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p class=\"body\" dir=\"auto\">Al mapear los dos archivos anteriores dentro del m\u00f3dulo e instalarlo en una base, observamos que el modelo sale.order ya tiene disponible la acci\u00f3n \u201cReporte Ventas\u201d para generar el reporte.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-10.14.20a-a.m.-YX4jPM8D79ieW9pv-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p class=\"body\" dir=\"auto\">Al accionar el bot\u00f3n, se descarga el reporte a partir de la plantilla b\u00e1sica que definimos anteriormente. En este caso, la plantilla es solo una p\u00e1gina en blanco.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-10.24.14a-a.m.-dJoPJyE9gou6jJZ7-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p dir=\"auto\" class=\"body\">Notemos que en nuestra plantilla utilizamos la plantilla modular <strong><em>html_container<\/em><\/strong>, perteneciente al m\u00f3dulo <strong><em>web<\/em><\/strong>. Esta plantilla modular contiene la informaci\u00f3n necesaria para generar el reporte, pero no es la \u00fanica plantilla modular del m\u00f3dulo. Por ejemplo, el m\u00f3dulo tambi\u00e9n a\u00f1ade 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 <strong><em>external_layout<\/em><\/strong> del m\u00f3dulo <strong><em>web<\/em><\/strong>, y al llamarla, declaramos las variables <strong><em>doc<\/em><\/strong>, <strong><em>forced_vat<\/em><\/strong> y <strong><em>address<\/em><\/strong> que la plantilla espera recibir para construir el encabezado. El c\u00f3digo de nuestra plantilla queda de la siguiente manera:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-10.57.51a-a.m.-YrD4ayjjvKswGWNb-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p dir=\"auto\" class=\"body\">Y al volver a imprimir el reporte, notamos que se agreg\u00f3 el encabezado en autom\u00e1tico:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-11.01.22a-a.m.-m2Wq437jrgU99aPx-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p class=\"body\" dir=\"auto\">donde la imagen es el logo de la empresa asociada al registro del modelo de ventas.<\/p>\n<p class=\"body\" dir=\"auto\">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:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-11.06.29a-a.m.-A3Qlpeeb4auMk7yL-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p class=\"body\" dir=\"auto\">El cual nos genera el siguiente reporte:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-11.08.17a-a.m.-AR01Jo6n5oilL485-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p class=\"body\" dir=\"auto\">Por lo que de esta forma podemos agregar campos de la orden para mostrarlos en el reporte seg\u00fan el dise\u00f1o que queramos.<\/p>\n<p class=\"body\" dir=\"auto\">Por \u00faltimo, en este caso estamos utilizando un reporte tipo <strong><em>qweb-pdf<\/em><\/strong>, pero una buena pr\u00e1ctica es primero utilizar <strong><em>qweb-html<\/em><\/strong> 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\u00f3n que genera el reporte le cambiamos el tipo <strong><em>qweb-pdf<\/em><\/strong> por <strong><em>qweb-html<\/em><\/strong> de la siguiente manera:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-11.11.19a-a.m.-AVLxJyOZLlt7XRV7-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p dir=\"auto\" class=\"body\"><span>Y al volver a generar el reporte desde la venta, vemos que se previsualiza directo en el navegador.<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/exdoo.mx\/blogs\/wp-content\/uploads\/2026\/05\/captura-de-pantalla-2025-09-25-a-la-s-11.15.10a-a.m.-mnl43LeaXbFDGxxE-2.png\" alt=\"\"  style=\"max-width:100%;height:auto;border-radius:10px;box-shadow:0 2px 8px rgba(0,0,0,0.12);display:block;margin:14px auto;\" \/><\/p>\n<p class=\"body\" dir=\"auto\"><span><strong>Consejos r\u00e1pidos:<\/strong><\/span><\/p>\n<ul style=\"padding-left:22px;line-height:1.9;\">\n<li><span>Define correctamente el report_type (qweb-pdf, qweb-html, qweb-text) seg\u00fan el formato que necesites.<\/span><\/li>\n<li><span>Usa clases CSS de Bootstrap (ya incluidas en Odoo) para dar formato a tablas y textos sin complicarte.<\/span><\/li>\n<li><span>Testea primero en HTML (qweb-html) antes de exportar a PDF para detectar problemas de dise\u00f1o.<\/span><\/li>\n<li><span>Mant\u00e9n las plantillas modulares: utiliza t-call para incluir fragmentos y no duplicar c\u00f3digo.<\/span><\/li>\n<li><span>Aprovecha las expresiones din\u00e1micas para recorrer listas, aplicar condiciones y mostrar datos de forma segura en el reporte.<\/span><\/li>\n<li><span>Personaliza el nombre del archivo generado de acuerdo a tus necesidades<\/span>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 son los reportes QWeb en Odoo? \ud83d\udcd8 ART\u00cdCULO T\u00c9CNICO Son el sistema principal para generar documentos en PDF, HTML o texto a partir de plantillas QWeb, que\u2026<\/p>\n","protected":false},"author":1,"featured_media":432,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"class_list":["post-444","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/comments?post=444"}],"version-history":[{"count":3,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/444\/revisions"}],"predecessor-version":[{"id":1958,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/posts\/444\/revisions\/1958"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media\/432"}],"wp:attachment":[{"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/media?parent=444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/categories?post=444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/exdoo.mx\/blogs\/wp-json\/wp\/v2\/tags?post=444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}