Herencia Templates Qweb
Algó muy útil y necesario para el desarrollo Odoo es la herencia, en mas de una ocasión esto nos ah salvado y ayudado para adaptar el Sistema, Qweb Reports no se queda atras e implementa la herencia de las Vistas que son las que generan nuestros Reportes, para elló utilizaremos la herramienta xml Xpath.
La forma de heredar es simple, utilizaremos el ID de la vista del reporte, tal cual lo hacemos con las Vistas de Formulatios y añadimos, modificamos ó reemplazamos un elemento.
Ejemplo Herencia Xpath en Qweb Reports
Vamos a heredar el reporte de Albaran y modificar el cuerpo del Reporte, por ejemplo añadimos una tabla para tener un espacio para firmar la entrada y salida de Almacen.
El codigo para añadir estas firmas es:
<table border="0" style="border-collapse:collapse;color:000000;width:100%" cellpadding="3" cellspacing="3"> <tr> <td class="text-center" >________________________</td> <td class="text-center" >________________________</td> </tr> <tr > <td class="text-center" > <strong>Nombre y Firma Entrega</strong> </td> <td class="text-center" > <strong>Nombre y Firma Recepcion</strong> </td> </tr> </table>Heredamos la vista Qweb por medio del ID:
<template id="report_header_custom" inherit_id="stock.report_picking"> <xpath expr="//div[@class='page']" position="replace">
Al final así quedo mi nueva Vista para el Reporte de Albarán:<div class="page">Aquí va nuestro código .......
</div></xpath> </template>
<!-- Template Final -->
<template id="report_header_custom" inherit_id="stock.report_picking"> <xpath expr="//div[@class='page']" position="replace"> <div class="page"> <div class="row"><div class="col-xs-4 pull-right"> <img t-att-src="'/report/barcode/?type=%s&value=%s&width=%s&height=%s' % ('Code128', o.name, 600, 100)" style="width:300px;height:50px;"/> </div></div> <div class="row"> <div class="col-xs-6"> <div t-if="o.picking_type_id.code=='incoming' and o.partner_id"> <span><strong>Supplier Address:</strong></span> </div> <div t-if="o.picking_type_id.code=='internal' and o.partner_id"> <span><strong>Warehouse Address:</strong></span> </div> <div t-if="o.picking_type_id.code=='outgoing' and o.partner_id"> <span><strong>Customer Address:</strong></span> </div> <div t-if="o.partner_id" name="partner_header"> <div t-field="o.partner_id" t-field-options="{"widget": "contact", "fields": ["address", "name", "phone", "fax"], "no_marker": true}"/> <p t-if="o.partner_id.vat">VAT: <span t-field="o.partner_id.vat"/></p> </div> </div> <div class="col-xs-5 col-xs-offset-1"> <div t-if="o.move_lines and o.move_lines[0].partner_id and o.move_lines[0].partner_id.id != o.partner_id.id"> <span><strong>Delivery Address:</strong></span> <div t-field="o.move_lines[0].partner_id" t-field-options="{"widget": "contact", "fields": ["address", "name", "phone", "fax"], "no_marker": true}"/> </div> <div t-if="o.picking_type_id.code != 'internal' and (not o.move_lines or not o.move_lines[0].partner_id) and o.picking_type_id.warehouse_id.partner_id"> <span><strong>Warehouse Address:</strong></span> <div t-field="o.picking_type_id.warehouse_id.partner_id" t-field-options="{"widget": "contact", "fields": ["address", "name", "phone", "fax"], "no_marker": true}"/> </div> </div> </div> <h2> <span t-field="o.picking_type_id"/>: <span t-field="o.name"/> </h2> <table class="table table-condensed"> <thead> <tr> <th><strong>Order (Origin)</strong></th> <th><strong>State</strong></th> <th><strong>Commitment Date</strong></th> <th name="td_sched_date_h"><strong>Scheduled Date</strong></th> </tr> </thead> <tbody> <tr> <td> <span t-field="o.origin"/> </td> <td> <span t-field="o.state"/> </td> <td> <span t-field="o.date"/> </td> <td name="td_sched_date"> <span t-field="o.min_date"/> </td> </tr> </tbody> </table> <br/> <br/> <table class="table table-condensed" t-if="not o.pack_operation_ids"> <thead> <tr> <th><strong>Product</strong></th> <th class="text-center"><strong>Quantity</strong></th> <t t-if="o.picking_type_id.code != 'incoming'"> <th><strong>Source</strong></th></t> <th><strong>Barcode</strong></th> <t t-if="o.picking_type_id.code != 'outgoing'"><th><strong class="text-center">Destination</strong></th></t> </tr> </thead> <tbody> <tr t-foreach="o.move_lines" t-as="move"> <td><span t-field="move.product_id"/></td> <td class="text-right"><span t-field="move.product_uom_qty"/> <span t-field="move.product_uom" groups="product.group_uom"/></td> <t t-if="o.picking_type_id.code != 'incoming'"><td><span t-field="move.location_id"/></td></t> <td> <span t-if="move.product_id and move.product_id.ean13"> <img t-att-src="'/report/barcode/?type=%s&value=%s&width=%s&height=%s' % ('EAN13', move.product_id.ean13, 600, 100)" style="width:300px;height:50px"/> </span> </td> <t t-if="o.picking_type_id.code != 'outgoing'"><td><span t-field="move.location_dest_id"/></td></t> </tr> </tbody> </table> <table class="table table-condensed" t-if="o.pack_operation_ids"> <thead> <tr> <th><strong>Product</strong></th> <th class="text-right"><strong>Quantity</strong></th> <t t-if="o.picking_type_id.code != 'incoming'"><th><strong>Source</strong></th></t> <th><strong>Barcode</strong></th> <t t-if="o.picking_type_id.code != 'outgoing'"><th><strong>Destination</strong></th></t> </tr> </thead> <tbody> <tr t-foreach="o.pack_operation_ids" t-as="pack_operation"> <td><span t-field="pack_operation.product_id"/> <t t-if="not pack_operation.product_id and pack_operation.package_id"><span t-field="pack_operation.package_id"/></t></td> <td class="text-right"><span t-field="pack_operation.product_qty"/> <span t-field="pack_operation.product_uom_id" groups="product.group_uom"/></td> <t t-if="o.picking_type_id.code != 'incoming'"><td><span t-field="pack_operation.location_id"/> <span t-if="pack_operation.package_id">:</span> <span t-field="pack_operation.package_id"/> <span t-if="pack_operation.lot_id">:</span> <span t-field="pack_operation.lot_id"/> </td> </t> <td> <span t-if="pack_operation.lot_id"> <img t-att-src="'/report/barcode/?type=%s&value=%s&width=%s&height=%s' % ('Code128', pack_operation.lot_id.name, 600, 100)" style="width:300px;height:50px"/> </span> <span t-if="pack_operation.product_id and not pack_operation.lot_id and pack_operation.product_id.ean13"> <img t-att-src="'/report/barcode/?type=%s&value=%s&width=%s&height=%s' % ('EAN13', pack_operation.product_id.ean13, 600, 100)" style="width:300px;height:50px"/> </span> <span t-if="pack_operation.package_id and not pack_operation.product_id"> <img t-att-src="'/report/barcode/?type=%s&value=%s&width=%s&height=%s' % ('Code128', pack_operation.package_id.name, 600, 100)" style="width:300px;height:50px"/> </span> </td> <t t-if="o.picking_type_id.code != 'outgoing'"><td><span t-field="pack_operation.location_dest_id"/> <span t-if="pack_operation.result_package_id">:</span> <span t-field="pack_operation.result_package_id"/> </td></t> </tr> </tbody> </table> <br/> <br/> <br/> <br/> <br/> <br/> <table border="0" style="border-collapse:collapse;color:000000;width:100%" cellpadding="3" cellspacing="3"> <tr> <td class="text-center" >________________________</td> <td class="text-center" >________________________</td> </tr> <tr > <td class="text-center" > <strong>Nombre y Firma Entrega</strong> </td> <td class="text-center" > <strong>Nombre y Firma Recepcion</strong> </td> </tr> </table> </div> </xpath> </template>
Hola,
ResponderBorrarInteresante artículo, sabes cómo modificar para que el reporte salga como texto plano en "*.txt".
Con Qweb no, pero puede utilizar la librería base64 en python y construirlo a partir de concatenaciones.
Borrarhola, German
ResponderBorrarEstoy tratando de hacer un reporte con rango de fechas por medio de wizard pero no logro plasmar en el reporte la fecha inicial. el reporte los datos me los manda bien por el rango de fechas que le pongo. pero al poner la leyenda en el reporte del periodo que corresponde no me imprime nada ni me marca error la instruccion que utilizo es t-esc="fecha_ini" hay alguna manera de hacer referencia a las variables del wizard.
Tienes algun ejemplo de este tipo de reportes