Cómo generar reporte PDF desde un registro en Odoo
Imprimir reporte PDF
1 diciembre, 2021 por
Cómo generar reporte PDF desde un registro en Odoo
Yen Martínez
| Sin comentarios

Es un requerimiento bastante común entre los usuarios de Odoo, la opción de imprimir o generar un PDF con la información que se guarda en un registro determinado.

En este tutorial quiero mostrarte la forma de lograr esto. La idea es extraer del sistema, en un formato atractivo/personalizado, los datos que tenemos almacenados sobre un registro.

En primer lugar: seamos ordenados, los recursos referentes a reportes, conviene ubicarlos en una carpeta reports dentro de la estructura de carpetas de nuestro módulo Odoo, así podremos ubicarlo con facilidad en un momento futuro. 

Supongamos que tenemos un módulo pdf_report_example, donde definimos un modelo report.example con los campos:

  • field_m2o: Campo Many2one con otro modelo del cual necesitamos el campo name.

  • o2m_ids: Que muestra un listado de registros de otro modelo con campos: campo1, campo2, campo3.

Vamos entonces a crear un archivo en nuestro directorio reports/example_report.xml, con la siguiente estructura:

<?xml version="1.0" encoding="UTF-8"?>

<odoo>

   <data>

       <template id="report_example_template">

           <t t-call="web.html_container">

               <t t-foreach="docs" t-as="doc">

                   <t t-call="web.external_layout">

                       <div class="page">

                           <h1 class="text-center text-info">

                               <span>Example report</span>

                           </h1>

                           <strong>Data name: </strong><span t-field="doc.field_m2o.name"/>

                           <hr/>

                           <div class="table border-table">

                               <div class="row bg-info">

                                   <div class="col-4" style="border-top:1px solid black;">

                                       <span >Data col 1</span>

                                   </div>

                                   <div class="col-4" style="border-top:1px solid black;">

                                       <span >Data col 2</span>

                                   </div>

                                   <div class="col-4" style="border-top:1px solid black;">

                                       <span >Data col 3</span>

                                   </div>

                               </div>

                               <t t-foreach="doc.o2m_ids" t-as="item">

                                   <div class="row">

                                   <div class="col-4" style="border-top:1px solid black;">

                                       <span t-esc="item.campo1"/>

                                   </div>

                                   <div class="col-4" style="border-top:1px solid black;">

                                       <span t-esc="item.campo2"/>

                                   </div>

                                   <div class="col-4" style="border-top:1px solid black;">

                                       <span t-esc="item.campo3"/>

                                   </div>

                               </div>

                               </t>

                           </div>

                       </div>

                   </t>

               </t>

           </t>

       </template>

   </data>

</odoo>

En este ejemplo, la variable doc, representa el registro desde el cual generas el PDF (docs contiene el listado de registros, teniendo en cuenta que la opción de Imprimir del menú contextual, se habilita cuando seleccionas uno o varios registros de la vista listado, al igual que cuando accedes desde un formulario. En el caso de la vista listado, estarías generando una página del PDF por cada registro seleccionado).

Tu diseño de PDF estará dentro de las etiquetas:

<div class="page">

...

</div>

Y si utilizas la plantilla base external_layout, como en el ejemplo:

<t t-call="web.external_layout">

    ...   

</t>

entonces estás generando un pdf con el encabezado y el footer que le defina el usuario al seleccionar el tipo de formato: Clean, Boxed, Background, etc.

Para estudiar con mayor profundidad las plantillas disponibles, puedes acceder al módulo base de Odoo web/views/report_templates.xml.



Nota


Al diseñar tu formato, ten presente que trabajas sobre una rejilla o grid de 12 unidades (valores enteros). Por lo que si quieres dividir el espacio en 3 partes iguales en la horizontal, por ejemplo, debes utilizar: 

<div class=’row’>

           <div class="col-4"/> 

           <div class="col-4"/>

           <div class="col-4"/>

</div>

como se muestra en el ejemplo. Cualquier combinación debe sumar máximo 12, para mantener las proporciones.


Una vez ‘dibujado’ nuestro impreso (template), necesitamos establecer la forma de llamarlo. Para ello podemos acceder al botón Imprimir en el menú contextual, o podemos mostrar un botón en el formulario del registro (o en otra vista) que llame a un action que a su vez, genere este formato.
A continuación de la plantilla <template></template>, definamos nuestro action:

      

<!-- Este action muestra el reporte en HTML desde el menú contextual-->

<report

               id="report_example_menu"

               model="report.example"

               string="Example report HTML"

               name="pdf_report_example.report_example_template"

               file="pdf_report_example.report_example_template"

               report_type="qweb-html"

               menu="True"/>

Al establecer menu=’True’, estamos indicando que sí queremos que se genere el documento desde el menú contextual (desde la parte central superior del formulario).

Podemos generar de una vez el formato en PDF, o mostrar primero la vista HTML y luego permitir la generación del PDF. Esto lo podemos controlar desde el  atributo report_type:

report_type="qweb-html" o  report_type="qweb-pdf"

      

 <!-- Este action muestra el reporte en PDF desde el botón del form-->

 <report

               id="report_example_button"

               model="report.example"

               string="Example report"

               name="pdf_report_example.report_example_template"

               file="pdf_report_example.report_example_template"

               report_type="qweb-pdf"

               menu="False"/>

Contando con que hemos incluido un botón en nuestro formulario para Imprimir nuestro documento:

<div class="oe_button_box">

   <button class="oe_stat_button"         

                name="pdf_report_example.report_example_button" 

                type="action"

                string="Example report"

                 icon="fa-print"/>

</div>

De esta forma podemos generar la información de nuestro registro, en un PDF o en una vista HTML que luego podremos imprimir también.

Ahora sólo nos falta incluir este .xml en el __manifest__.py de nuestro módulo.
Ojalá este material te sirva de ayuda.

Cómo generar reporte PDF desde un registro en Odoo
Yen Martínez
1 diciembre, 2021
Share this post
Archivar
Registrarse to leave a comment