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">
<div class="page">
Aquà va nuestro código .......
</div>
Al final asà quedo mi nueva Vista para el Reporte de AlbarÔn:
<!-- 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>