Generación de reportes estáticos y
dinámicos en Odoo.
MSc. Ismel Rabaza Andino (irabaza@hlg.desoft.cu)
Ing. Liber Matos Martín (liber@hlg.desoft.cu)
Informatizamos para la Sociedad Cubana
Odoo
Odoo (anteriormente OpenERP) es un sistema de código
abierto y multiplataforma para la planificación de los
recursos empresariales (ERP).
Informatizamos para la Sociedad Cubana
Reportes en Odoo
Informes PDF, SXW, XLS
Vistas personalizadas
Dashboards (Tableros)
Informatizamos para la Sociedad Cubana
Reportes QWeb
Odoo introduce una vía nueva para la generación de
informes basada en QWeb que brinda mayor comodidad y
agiliza el proceso. QWeb es el motor de plantillas XML
usado por Odoo para generar fragmentos y páginas
HTML. Tiene la ventaja que su mecanismo de herencia es
bastante similar al usado por el framework de Odoo.
Odoo también soporta el sistema de reportes con
integración con OpenOffice / RML y WebKit para mantener
la compatibilidad con las versiones anteriores.
Informatizamos para la Sociedad Cubana
QWeb
Las directivas de la plantilla son especificadas como
atributos XML con el prefijo t-
Condicionales (t-if)
<t t-if="condition"> <div t-if="condition">
<p>Test</p> <p>Test</p>
</t> </div>
Salida de datos (t-esc , t-raw)
<p><t t-esc="value"/></p>
Ciclos (t-foreach)
<t t-foreach="[1, 2, 3]" t-as="i">
<p><t t-esc="i"/></p>
</t>
Informatizamos para la Sociedad Cubana
QWeb
Asignación de Variables (t-set)
<div t-foreach=“widget.get_products()" t-as=“p">
<t t-set=“location" t-value=“p.location"/>
<t t-if=“location“>
<span><t t-esc=“location.name"/></span>
</t>
</div>
Atributos (t-att- , t-attf-)
t-att-$name (Un atributo llamado $name se crea y se
renderea con el valor resultado)
<img t-att-src=“widget.product_icon_url(p.id)"/>
<div t-attf-class=“products #{p.checked ? '' :
'display_none'}" > ... </div>
Informatizamos para la Sociedad Cubana
QWeb
Llamando sub-plantillas (t-call)
<t t-name=“ProductDetails">
<tr t-att-data-id=„product.id'>
<td><t t-esc=„product.name' /></td>
<td><t t-esc=„product.unit_price' /></td>
<td><t t-esc=„product.code' /></td>
</tr>
</t>
<div t-foreach=“widget.get_products()" t-as=“product">
<t t-call="ProductDetails"/>
</div>
Informatizamos para la Sociedad Cubana
Creando un reporte estático con QWeb
1. Un reporte debe ser declarado como una acción de
reporte (ir.actions.report.xml). Para simplicidad el
framework proporciona la etiqueta <report>
<report
id="account_invoices“
model="account.invoice"
string="Invoices"
report_type="qweb-pdf"
name="account.report_invoice"
file="account.report_invoice“ />
Informatizamos para la Sociedad Cubana
Creando un reporte estático con QWeb
2. Plantilla QWeb.
<template id="report_invoice">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="report.external_layout">
<div class="page">
<h2>Report title</h2>
<p>This object's name is <span t-
field="o.name"/></p>
</div>
</t>
</t>
</t>
</template>
Informatizamos para la Sociedad Cubana
Creando un reporte estático con QWeb
Variables accesibles en el contexto de la plantilla QWeb del
reporte.
docs records a los cuales se le está realizando el reporte
doc_ids lista de IDs de los docs records
doc_model modelo de los records seleccionados (docs)
time referencia al módulo estándar time de Python
user record res.user del usuario que imprime el reporte
res_company record res.company de la compañía del
usuario logueado
Informatizamos para la Sociedad Cubana
Creando un reporte estático con QWeb
3. Creación del Parser para reportes personalizados.
Para crear el Parser se debe definir una clase que herede de
report_sxw.rml_parse. Los métodos a los que se quiere
acceder desde la plantilla QWeb deben ser declarados en el
localcontext de la clase definida. Crear otra clase que hereda
de osv.AbstractModel para establecer el vínculo entre el Parser
y la plantilla Qweb.
class report_invoices(osv.AbstractModel):
_name = „report.<module_name>.<report_name>‟
_inherit = „report.abstract_report‟
_template = „<module_name>.<report_name>‟
_wrapped_report_class = <parser_class_name>
Informatizamos para la Sociedad Cubana
Creando un reporte estático con QWeb
4. Declarar un formato de hoja si se desea que el reporte
siempre use dicho formato.
<record id="paperformat_invoice" model="report.paperformat“>
<field name="name">French Bank Check</field>
<field name="default" eval="True"/>
<field name="format">custom</field>
<field name="page_height">80</field>
<field name="page_width">175</field>
<field name="orientation">Portrait</field>
<field name="margin_top">3</field>
<field name="margin_bottom">3</field>
<field name="margin_left">3</field>
<field name="margin_right">3</field>
<field name="header_line" eval="False"/>
<field name="header_spacing">3</field>
<field name="dpi">80</field>
</record>
Informatizamos para la Sociedad Cubana
Creando un reporte estático con QWeb
Informatizamos para la Sociedad Cubana
Observaciones Reportes QWeb
• Los reportes Qweb son generados en HTML y se
convierten a PDF (si report_type es qweb-pdf) por lo
que se pueden acceder a los mismos directamente vía
URL, ya sea al reporte HTML como al PDF.
• El uso de CSS para los estilos del reporte varía según la
versión de wkhtml2pdf. Se recomienda instalar
exactamente la misma versión de wkhtml2pdf en entorno
de despliegue que la que se usó en entorno de desarrollo.
• Los reportes son más sencillos de lograr que usando
OpenOffice / RML
Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
Odoo introduce un nuevo método de presentación de
informes creados a partir de vistas SQL, pero que
permiten al usuario visualizar la información como se
desee (referencias cruzadas).
Permite conformar una tabla según los datos escogidos
(medidas), visualizar gráficas de barras y de pastel,
exportar a excel.
Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
1. Crear un modelo que se llena a partir de una vista
SQL.
class sale_report(osv.osv):
_name = "sale.report"
_auto = False
_columns = {
„date': fields.datetime('Date Order',
readonly=True),
„name': fields.char(„Name', readonly=True),
...
}
def init(self, cr):
cr.execute(“”” consulta SQL “””)
Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
2. Creación de la vista XML.
<record id="view_order_product_graph"
model="ir.ui.view">
<field name="name">sale.report.graph</field>
<field name="model">sale.report</field>
<field name="arch" type="xml">
<graph string="Sales Analysis" type="pivot"
stacked="True">
<field name="section_id" type="row"/>
<field name="date" interval="month"
type="col"/>
<field name="price_total"
type="measure"/>
</graph>
</field>
</record> Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
Columnas
Filas Medidas
Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
Modificando los indicadores a mostrar (medidas).
Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
Agrupando según otros criterios.
Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
Las gráficas muestran la información obtenida en la tabla de
datos.
Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
Gráfico de pastel.
Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
Filtros personalizados (Favoritos)
Odoo permite definir informes pre-definidos para cada
reporte dinámico (información que usualmente es muy
consultada). Esto se logra creando records en el modelo
ir.filter
<record id="filter_sale_report_salespersons"
model="ir.filters">
<field name="name">By Salespersons</field>
<field name="model_id">sale.report</field>
<field name="user_id" eval="False"/>
<field name="context">{'group_by':
['date:month', 'user_id']}</field>
</record>
Informatizamos para la Sociedad Cubana
Reportes dinámicos con Vistas SQL
Informatizamos para la Sociedad Cubana
Observaciones Reportes Dinámicos
• Permiten que el usuario obtenga la información deseada
al añadir o eliminar medidas. Un reporte puede servir
para obtener varios reportes de un cliente específico.
• La complejidad radica en declarar en el modelo todos los
campos que pueden constituir medidas, filas y columnas
en el reporte y obtener la información a partir de una
consulta SQL como única alternativa.
• Permite exportar a excel la tabla resultante con la
información deseada (aunque no indica si en ese
momento se estaba realizando una búsqueda).
Informatizamos para la Sociedad Cubana
Generación de reportes estáticos y
dinámicos en Odoo.
MSc. Ismel Rabaza Andino (irabaza@hlg.desoft.cu)
Ing. Liber Matos Martín (liber@hlg.desoft.cu)
Informatizamos para la Sociedad Cubana