Publicidad

viernes, 3 de julio de 2015

Herencia Reportes Qweb en Odoo

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>
    </xpath>
 </template>

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&amp;value=%s&amp;width=%s&amp;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="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;, &quot;phone&quot;, &quot;fax&quot;], &quot;no_marker&quot;: 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="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;, &quot;phone&quot;, &quot;fax&quot;], &quot;no_marker&quot;: 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="{&quot;widget&quot;: &quot;contact&quot;, &quot;fields&quot;: [&quot;address&quot;, &quot;name&quot;, &quot;phone&quot;, &quot;fax&quot;], &quot;no_marker&quot;: 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&amp;value=%s&amp;width=%s&amp;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&amp;value=%s&amp;width=%s&amp;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&amp;value=%s&amp;width=%s&amp;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&amp;value=%s&amp;width=%s&amp;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>




3 comentarios:

  1. Hola,

    Interesante artĆ­culo, sabes cĆ³mo modificar para que el reporte salga como texto plano en "*.txt".

    ResponderBorrar
    Respuestas
    1. Con Qweb no, pero puede utilizar la librerĆ­a base64 en python y construirlo a partir de concatenaciones.

      Borrar
  2. hola, German
    Estoy 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

    ResponderBorrar