Creación de reportes con rml en OpenERP (Odoo)

Una de las formas más nativas para crear reportes en OpenERP es usando las herramientas bases como el lenguaje estructurado rml, que tiene una característica muy similar al xml.

OpenERP aligera un poco el trabajo, debido a que hereda por defecto la cabecera y el pie, si deseamos crear un reporte desde cero con rml, simplemente nos concentramos en el contenido de dicho reporte.

La estructura base del árbol del reporte, es simplemente un directorio dentro del módulo en donde irá la función para generar el PDF de una vista específica. Es decir, creamos un directorio llamado report, siguiendo el estándar, luego, debemos crear un árbol parecido al siguiente:

report
    |- __init__.py
    |- reporte.xml
    |- reporte.py
    '- reporte.rml

Hay quienes usan herramientas alternativas como el OpenOffice con un plugins que viene dentro del módulo document de OpenERP que se instala en el programa de ofimática.

En el contenido del archivo __init__.py debe tener algo similar a lo siguiente:

import reporte

El contenido del archivo reporte.xml debe tener algo parecido a lo siguiente:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
    
        <report
            id="imprimir_reporte"
            name="imprimir.reporte"
            model="tabla.estudiante"
            rml="app_modulo/report/reporte.rml"
            string="Reporte PDF"
        />
            
    </data>
</openerp>

El contenido del archivo reporte.py debería tener algo perecido a lo siguiente:

# -*- coding: utf-8 -*-

import time
from openerp.report import report_sxw

class impresion_reporte(report_sxw.rml_parse):
    def __init__(self, cr, uid, name, context):
        super(impresion_reporte, self).__init__(cr, uid, name, context=context)
        self.localcontext.update({
            'time': time
        })

report_sxw.report_sxw('report.albaranes.entrada.pre',
    'app_modulo/report/reporte.rml',
    parser=imprimir_reporte,
    header='external'
)

En el parámetro header se asigna el valor del tipo de cabecera que tendrá el documento o reporte, por omisión son los que vienen declarados en el OpenERP, cosa que nos facilita la construcción del reporte. El valor del parámetro parse debe ser el mismo nombre del id del elemento report que se ha creado en el archivo reporte.xml, cuando hacemos clic sobre Reporte PDF mediante el id se llamará el método que tomará los valores del archivo rml donde está construida nuestra estructura del reporte.

El contenido del archivo reporte.rml debería tener algo similar a lo siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<document filename="Reporte_Impreso.pdf">
  
  <template pageSize="(595.0,842.0)" title="Reporte Impreso" author="Satélite Guayana (@sateliteguayana)" allowSplitting="20">
    <pageTemplate id="first">
        <frame id="first" x1="0.0" y1="57.0" width="538" height="728"/>
    </pageTemplate>
  </template>
  
  <stylesheet>
  
    <blockTableStyle id="letters_tab">
        <blockAlignment value="LEFT"/>
        <blockValign value="TOP"/>
    </blockTableStyle>
  
    <blockTableStyle id="linea_tab_head">
        <blockAlignment value="LEFT"/>
        <blockValign value="TOP"/>
        <lineStyle kind="LINEBELOW" colorName="#000000" start="0,-1" stop="0,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#000000" start="1,-1" stop="1,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#000000" start="2,-1" stop="2,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#000000" start="3,-1" stop="3,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#000000" start="4,-1" stop="4,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#000000" start="5,-1" stop="5,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#000000" start="6,-1" stop="6,-1"/>
    </blockTableStyle>
    
    <blockTableStyle id="linea_tab_normal">
        <blockAlignment value="LEFT"/>
        <blockValign value="TOP"/>
        <lineStyle kind="LINEBEFORE" colorName="#e6e6e6" start="0,-1" stop="0,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="0,-1" stop="0,-1"/>
        <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="0,-1" stop="0,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="1,-1" stop="1,-1"/>
        <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="0,-1" stop="1,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="2,-1" stop="2,-1"/>
        <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="0,-1" stop="2,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="3,-1" stop="3,-1"/>
        <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="0,-1" stop="3,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="4,-1" stop="4,-1"/>
        <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="0,-1" stop="4,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="5,-1" stop="5,-1"/>
        <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="0,-1" stop="5,-1"/>
        <lineStyle kind="LINEBELOW" colorName="#e6e6e6" start="6,-1" stop="6,-1"/>
        <lineStyle kind="LINEAFTER" colorName="#e6e6e6" start="0,-1" stop="6,-1"/>
    </blockTableStyle>
    
    <initialize><paraStyle name="all" alignment="justify"/></initialize>
    <paraStyle name="modelo_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="terp_default_Bold_8" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="head_modelo" fontName="Helvetica-Bold" fontSize="8.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>    
    <paraStyle name="head_modelo_6" fontName="Helvetica-Bold" fontSize="6.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="head_modelo_Centre" fontName="Helvetica-Bold" fontSize="8.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="head_modelo_6_centro" fontName="Helvetica-Bold" fontSize="6.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="terp_default_Centre_8" fontName="Helvetica" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="terp_default_Centre_9" fontName="Helvetica" fontSize="8.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="cont_modelo_6_centro" fontName="Helvetica" fontSize="6.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="linea_tab_head_1" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="6.0"/>
    <paraStyle name="linea_tab_head_1_Centre" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="linea_tab_head_1_Right" fontName="Helvetica-Bold" fontSize="8.0" leading="10" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="head_modelo_Right" fontName="Helvetica-Bold" fontSize="8.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="cont_modelo_6_normal" fontName="Helvetica" fontSize="6.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="cont_modelo_6_bold" fontName="Helvetica-Bold" fontSize="6.0" leading="11" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="cont_modelo_6_right" fontName="Helvetica" fontSize="6.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="terp_default_2" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
    <paraStyle name="espacio_5cm" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="6.0" spaceAfter="0.0"/>
    <paraStyle name="espacio_1cm" fontName="Helvetica" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="3.0" spaceAfter="0.0"/>
    <images/>
  </stylesheet>
  
  <story>
  <pto>
    <para style="modelo_8">[[repeatIn(objects,'estudiante')]]</para>    
    <para style="espacio_1cm"><font color="white"> </font></para>        
    <blockTable style="letters_tab">
        <tr><td width="500"><para style="terp_header">Código de pre-entrada: [[ estudiante.name ]]</para></td></tr>
    </blockTable>    
    <para style="espacio_5cm"><font color="white"> </font></para>    
    <blockTable style="Header_Order_Reference_Tbl">
        <tr>
            <td width="100.0"><para style="linea_tab_head_1">Dirección</para></td>
            <td width="100.0"><para style="modelo_8">[[estudiante.direccion or '' ]]</para></td>
            <td width="100.0"><para style="linea_tab_head_1">Correo electrónico</para></td>
            <td width="100.0"><para style="modelo_8">[[ estudiante.email or '' ]]</para></td>
        </tr>
        <tr>
            <td width="100.0"><para style="linea_tab_head_1">Nivel</para></td>
            <td width="100.0"><para style="modelo_8">[[ estudiante.nivel or '' ]]</para></td>
            <td width="100.0"><para style="linea_tab_head_1">Turno</para></td>
            <td width="100.0"><para style="modelo_8">[[estudiante.turno_id.name or '' ]]</para></td>
        </tr>
    </blockTable>
    <blockTable repeatRows="1" style="linea_tab_head" colWidths="200.0,120.0,50.0,50.0,50.0">
        <tr>
            <td><para style="head_modelo">Materia</para></td>
            <td><para style="head_modelo">Sección</para></td>
            <td><para style="head_modelo_6_centro">Aula</para></td>
            <td><para style="head_modelo_6_centro">Hora</para></td>
            <td><para style="head_modelo_6_centro">Día</para></td>
        </tr>
    </blockTable>
    <section>
        <para style="terp_default_2">[[ repeatIn([line for line in estudiante.materias_ids],'materias') ]]</para>
        <blockTable style="linea_tab_normal" colWidths="200.0,120.0,50.0,50.0,50.0">
            <tr>
                <td><para style="cont_modelo_6_normal">[[ materias.name or '' ]]</para></td>
                <td><para style="cont_modelo_6_normal">[[ materias.seccion or '' ]]</para></td>
                <td><para style="cont_modelo_6_centro">[[ materias.aula_id.name or '' ]]</para></td>
                <td><para style="cont_modelo_6_centro">[[ materias.hora or '' ]]</para></td>
                <td><para style="cont_modelo_6_centro">[[ materias.dia or '' ]]</para></td>
            </tr>
        </blockTable>
    </section>
    
  </pto>
  </story>
</document>

El archivo rml diagrama toda la estructura de cómo se mostrarán los datos en el reporte o PDF, en la sección template se configuran los parámetros base del archivo, luego dentro de la sección stylesheet se configura todo el estilo y diseño que llevarán las tablas, las fuentes, columnas, alineación de los párrafos, entre otras características, posteriormente, en la sección story y pto, va el argumento del reporte o contenido real, donde se desglosan los datos de la tabla que hemos definido en el atributo del archivo reporte.xml.

Para iterar una tabla line relacionada con la tabla padre, en el ejemplo la tabla materias_ids relacionada con la tabla estudiantes, se debe realizar dentro de una sección section.

En Internet se consigue bastante material de rml, sin embargo, hay cosas propias de OpenERP, lo expuesto acá es un ejemplo muy sencillo, de los reportes más completos en los módulos de OpenERP para tomar como ejemplo están: Compras, Ventas y Almacén.

Advertisements

About felixurbina

Humano con todos los defectos y virtudes que vienen de fábrica.
This entry was posted in Odoo, OpenERP. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s