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