Explorar el Código

Ficha de servicios técnicos Bioelectric

Sebas hace 5 años
commit
59d2732e31

+ 6 - 0
__init__.py

@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# License, author and contributors information in:
+# __openerp__.py file at the root folder of this module.
+
+from . import models
+# from . import reports

BIN
__init__.pyc


+ 39 - 0
__openerp__.py

@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+###############################################################################
+
+{
+    'name': 'Config work order',
+    'summary': 'Work config orders',
+    'category': 'Repair',
+    'version': '0.1',
+    'description': """
+    """,
+    'author': 'Sebastian Penayo - Eiru',
+    'website': 'https://www.eiru.com.py',
+    'depends': [
+        'product',
+    ],
+    'data': [
+        'data/report_paperformat_mejorado.xml',
+        'data/sequence_mejorado.xml',
+        'views/config_order_mejorado.xml',
+    ],
+    'test': [
+    ],
+    'installable': True,
+}

+ 20 - 0
data/report_paperformat_mejorado.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="paperformat_repair_configorder" model="report.paperformat">
+            <field name="name">Configuraciones</field>
+            <field name="default" eval="True"/>
+            <field name="format">custom</field>
+            <field name="page_height">150</field>
+            <field name="page_width">80</field>
+            <field name="orientation">Portrait</field>
+            <field name="margin_top">1</field>
+            <field name="margin_bottom">1</field>
+            <field name="margin_left">1</field>
+            <field name="margin_right">1</field>
+            <field name="header_line" eval="False" />
+            <field name="header_spacing">0</field>
+            <field name="dpi">300</field>
+        </record>
+    </data>
+</openerp>

+ 20 - 0
data/sequence_mejorado.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data noupdate="1">
+
+        <!-- Sequences for repair.workorder -->
+        <record id="seq_type_workorder" model="ir.sequence.type">
+            <field name="name">Orden de Configuración</field>
+            <field name="code">repair.configorderimproved</field>
+        </record>
+
+        <record id="seq_sale_order" model="ir.sequence">
+            <field name="name">Orden de Configuración</field>
+            <field name="code">repair.configorderimproved</field>
+            <field name="prefix">CF</field>
+            <field name="padding">3</field>
+            <field name="company_id" eval="False"/>
+        </record>
+
+    </data>
+</openerp>

+ 3 - 0
models/__init__.py

@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import config_order

BIN
models/__init__.pyc


+ 283 - 0
models/config_order.py

@@ -0,0 +1,283 @@
+# -*- coding: utf-8 -*-
+# License, author and contributors information in:
+# __openerp__.py file at the root folder of this module.
+
+from openerp import api, models, fields
+from openerp.exceptions import ValidationError, except_orm, Warning, RedirectWarning
+import logging
+
+_log = logging.getLogger(__name__)
+
+
+class ConfigOrder(models.Model):
+    _name = 'repair.configorderimproved'
+    _description = 'Config order improved'
+    # _inherit = ['mail.thread', 'ir.needaction_mixin']
+
+    def _get_user(self):
+        return self.env.uid
+
+    def _get_number(self):
+        return self.env['ir.sequence'].get('repair.configorderimproved') or '*'
+
+    name = fields.Char(
+        string=u'Orden',
+        readonly=True,
+        default=_get_number
+    )
+    user_id = fields.Many2one(
+        comodel_name='res.users',
+        string='Técnico Responsable',
+        default=_get_user
+    )
+    partner_id = fields.Many2one(
+        comodel_name='res.partner',
+        string='Cliente'
+    )
+
+    order_date = fields.Datetime(
+        string='Fecha Instalación',
+        default=fields.Datetime.now
+    )
+    planned_date = fields.Datetime(
+        string='Fecha de Inicio'
+    )
+    pedido_obra = fields.Char(
+        string='Pedido por'
+    )
+    name_obra = fields.Char(
+        string='Obra'
+    )
+    movil = fields.Char(
+        string='Móvil'
+    )
+    brand_eq = fields.Char(
+        string='Marca Equipo'
+    )
+    gas_eq = fields.Char(
+        string='Gas'
+    )
+    turb_eq = fields.Char(
+        string='Turbina ev.'
+    )
+    model_eq = fields.Char(
+        string='Modelo'
+    )
+    carga_eq = fields.Char(
+        string='Carga (A)'
+    )
+    capacitor_eq = fields.Char(
+        string='Capacitor'
+    )
+    serie_eq = fields.Char(
+        string='N° Serie'
+    )
+    tension_eq = fields.Char(
+        string='Tensión (V)'
+    )
+    largo_eq = fields.Char(
+        string='Largo Ducto'
+    )
+    capacidad_eq = fields.Char(
+        string='Capacidad'
+    )
+    presion_ini_eq = fields.Char(
+        string='Presión Inicial'
+    )
+    presion_fin_eq = fields.Char(
+        string='Presión Final'
+    )
+    estado_eq = fields.Char(
+        string='Estado de equipo '
+    )
+    trabajo_eq = fields.Char(
+        string='Trabajo realizado'
+    )
+    mante_eq = fields.Char(
+        string='Mantenimiento'
+    )
+    garan_eq = fields.Char(
+        string='Garantía'
+    )
+    ficha_eq= fields.Char(
+        string='Ficha N°'
+    )
+    lacre_eq = fields.Char(
+        string='Lacre/Sello'
+    )
+    tablero = fields.Char(
+        string='Tablero'
+    )
+    disyuntor_tab = fields.Char(
+        string='Disyuntor dif.2'
+    )
+    tension_tab = fields.Char(
+        string='Tensión R (v)'
+    )
+
+    serie_tab = fields.Char(
+        string='N° de Serie'
+    )
+    cargar_tab = fields.Char(
+        string='Carga R (A)'
+    )
+    tensions_tab = fields.Char(
+        string='Tensión S (v)'
+    )
+    limitador_tab = fields.Char(
+        string='Limitador (A)'
+    )
+    cargas_tab = fields.Char(
+        string='Carga S (A)'
+    )
+    tensiont_tab = fields.Char(
+        string='Tensión T (v)'
+    )
+    disyuntor2_tab = fields.Char(
+        string='Disyuntor dif.'
+    )
+    cargat_tab = fields.Char(
+        string='Carga T (A)'
+    )
+    potencia_tab = fields.Char(
+        string='Potencia actual'
+    )
+    estado_tab = fields.Char(
+        string='Estado de equipo '
+    )
+    trabajo_tab = fields.Char(
+        string='Trabajo realizado'
+    )
+    mante_tab = fields.Char(
+        string='Mantenimiento'
+    )
+    garan_tab = fields.Char(
+        string='Garantía'
+    )
+    ficha_tab = fields.Char(
+        string='Ficha N°'
+    )
+    lacre_tab = fields.Char(
+        string='Lacre/Sello'
+    )
+
+    equipo_tel = fields.Char(
+        string='Tipo de equipo'
+    )
+    capacidad_tel = fields.Char(
+        string='Capacidad'
+    )
+    tension_tel = fields.Char(
+        string='Tensión'
+    )
+    contrasena_tel = fields.Char(
+        string='Contraseña'
+    )
+    dns_tel= fields.Char(
+        string='Servidor DNS fav.'
+    )
+    port_tel = fields.Char(
+        string='Puerto HTTP'
+    )
+    brand_tel = fields.Char(
+        string='Marca'
+    )
+    portact_tel = fields.Char(
+        string='Puertos activos'
+    )
+    ip_tel = fields.Char(
+        string='Dirección IPv4'
+    )
+    dnsalt_tel = fields.Char(
+        string='Serv. DNS alt'
+    )
+    host_tel = fields.Char(
+        string='Puerto Host'
+    )
+    model_tel = fields.Char(
+        string='Modelo'
+    )
+    zonas_tel = fields.Char(
+        string='Zonas act.'
+    )
+    mac_tel = fields.Char(
+        string='Dir. Mac'
+    )
+    correo_tel = fields.Char(
+        string='Correo'
+    )
+    ippub_tel = fields.Char(
+        string='IP Pública'
+    )
+    serie_tel = fields.Char(
+        string='N° Serie'
+    )
+    usuario_tel = fields.Char(
+        string='Usuario'
+    )
+    iprouter_tel = fields.Char(
+        string='Dir. IP router'
+    )
+    contrasena2_tel = fields.Char(
+        string='Contraseña'
+    )
+    contrdeco_tel = fields.Char(
+        string='Contraseña deco'
+    )
+    estado_tel = fields.Char(
+        string='Estado de equipo '
+    )
+    trabajo_tel = fields.Char(
+        string='Trabajo realizado'
+    )
+    mante_tel = fields.Char(
+        string='Mantenimiento'
+    )
+    garan_tel = fields.Char(
+        string='Garantía'
+    )
+    ficha_tel = fields.Char(
+        string='Ficha N°'
+    )
+    lacre_tel = fields.Char(
+        string='Lacre/Sello'
+    )
+    state = fields.Selection([
+        ('draft', 'Pendiente'),
+        ('in_progress', 'En progreso'),
+        ('done', 'Realizado'),
+        ('canceled', 'Cancelado')],
+        string='Estado',
+        default='draft'
+    )
+
+
+    @api.one
+    def onchange_partner_id(self, partner_id):
+        _log.info('-'*100)
+        _log.info(partner_id)
+
+    @api.one
+    def button_in_progress(self):
+        self.state = 'in_progress'
+
+    @api.one
+    def button_in_progress_back(self):
+        self.state = 'draft'
+
+    @api.one
+    def button_done(self):
+        product = self.line_ids
+        # works = self.consumed_ids
+        if not product:
+            raise Warning('La configuración debe tener cámaras asociadas')
+        else:
+            self.state = 'done'
+
+    @api.one
+    def button_done_back(self):
+        self.state = 'in_progress'
+
+    @api.one
+    def button_cancel(self):
+        self.state = 'canceled'

BIN
models/config_order.pyc


+ 5 - 0
reports/__init__.py

@@ -0,0 +1,5 @@
+# -*- coding: utf-8 -*-
+# License, author and contributors information in:
+# __openerp__.py file at the root folder of this module.
+
+# from . import parser

BIN
reports/__init__.pyc


+ 181 - 0
reports/config_order_company.xml

@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+        <!-- Declarar el informe -->
+        <report
+            id="action_work_order_company_mejorado_report"
+            string="Work order (company copy)"
+            model="repair.workorderimproved"
+            report_type="qweb-pdf"
+            name="repair_workorder_mejorado.company_report"
+            file="workorder_company"
+         />
+
+        <record id="action_work_order_company_mejorado_report" model="ir.actions.report.xml">
+            <field name="paperformat_id" ref="repair_workorder_mejorado.paperformat_repair_workorder"/>
+        </record>
+
+        <!-- Informe -->
+        <template id="company_report">
+            <t t-call="report.html_container">
+                <t t-foreach="doc_ids" t-as="doc_id">
+                    <t t-raw="translate_doc(doc_id, doc_model, 'partner_id.lang', 'repair_workorder_mejorado.company_report_document')"/>
+                </t>
+            </t>
+        </template>
+
+        <template id="workorder_company">
+            <div class="page">
+                <style>
+                    body {
+                        color: #000;
+                        font-family: Arial, Helvetica, sans-serif;
+                        font-size: 14px;
+                        letter-spacing: 0.0px;
+                        line-height: 20px;
+                        margin:0;
+                        padding:0;
+                        word-spacing:1px;
+                    }
+                    .text-lg {
+                        font-size: 18px;
+                        font-weight: bold;
+                    }
+                    .text-md {
+                        display: inline-block;
+                        font-size: 18px;
+                        font-weight: bold;
+                    }
+                    .bordered {
+                        border: 1px solid #000;
+                        padding: 10px;
+                    }
+                    /* http://www.squareonemd.co.uk/how-to-crop-an-image-with-a-css-class/ */
+                    .image-container {
+                        width: 366px;
+                        text-align: center;
+                    }
+                    .image-cropper {
+                        position: relative;
+                        height: 45px;
+                        overflow: hidden;
+                    }
+                    .centered {
+                        position: absolute;
+                        left: -50%;
+                        top: -50%;
+                        max-width: 100%;
+                    }
+                    .bottom {
+                        position: absolute;
+                        bottom: 0px;
+                        max-width: 100%;
+                    }
+                    .top {
+                        position: absolute;
+                        top: 0px;
+                        max-width: 100%;
+                    }
+                    .separator {
+                        border-top: 1px solid #000;
+                        margin-top: 20px;
+                        margin-bottom: 20px;
+                    }
+                </style>
+                <section class="header">
+                    <div class="row">
+                        <div class="col-xs-12">
+                        <p class="text-center" style="margin-top: 10px; margin-bottom: 10px;"><span class="text-lg">PARTE TRABAJO <span t-if="o.name" t-field="o.name"/></span></p>
+                        <div class="image-container">
+                            <div class="image-cropper">
+                                <img class="top" t-att-src="'data:image/png;base64,%s' % printBarcode(o.id, 732, 472)"/>
+                            </div>
+                        </div>
+                        </div>
+                    </div>
+                </section>
+                <div class="row"><div class="col-xs-12"><div class="separator"/></div></div>
+                <div class="row">
+                    <div class="col-xs-12">
+                        MATERIAL A RECOGER<br/>
+                        <t t-if="o.line_ids">
+                            <table class="order_lines" style="width: 100%;">
+                                <thead>
+                                    <tr>
+                                        <th style="width: 75%;">Concepto</th>
+                                        <th style="width: 25%;" class="text-right">Uds.</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <t t-foreach="o.line_ids" t-as="line">
+                                        <tr>
+                                            <td><span t-if="line.description" t-field="line.description"></span></td>
+                                            <td class="text-right"><span t-if="line.quantity" t-field="line.quantity"></span></td>
+                                        </tr>
+                                    </t>
+                                </tbody>
+                            </table>
+                        </t>
+                        <br/>
+                        <span class="text-md">Fecha Recogida: <span t-if="o.planned_end_date" t-field="o.planned_end_date"/></span><br/>
+                        Cliente: <span t-if="o.partner_id.name" t-field="o.partner_id.name"/><br/>
+                        Teléfono: <span t-if="o.partner_id.phone" t-field="o.partner_id.phone"/><t t-if="o.partner_id.mobile"> - <span t-field="o.partner_id.mobile"/></t><br/>
+                        Fecha Entrada: <span t-if="o.order_date" t-field="o.order_date"/>
+                    </div>
+                </div>
+                <t t-if="o.consumed_ids">
+                    <div class="row"><div class="col-xs-12"><div class="separator"/></div></div>
+                    <table class="consumed_lines" style="width: 100%;">
+                        <thead>
+                            <tr>
+                                <th style="width: 45%;">Concepto</th>
+                                <th style="width: 15%;" class="text-right">Uds.</th>
+                                <th style="width: 20%;" class="text-right">Precio</th>
+                                <th style="width: 20%;" class="text-right">Subtotal</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <t t-foreach="o.consumed_ids" t-as="consumed">
+                                <tr>
+                                    <td><span t-if="consumed.description" t-field="consumed.description"/></td>
+                                    <td class="text-right"><span t-if="consumed.quantity" t-field="consumed.quantity"/></td>
+                                    <td class="text-right"><span t-if="consumed.price_unit" t-field="consumed.price_unit"/></td>
+                                    <td class="text-right"><span t-if="consumed.subtotal and consumed.price_unit" t-raw="consumed.quantity * consumed.price_unit"/></td>
+                                </tr>
+                            </t>
+                        </tbody>
+                    </table>
+                    <t t-set="total" t-value="get_total(o)"/>
+                    <p class="text-right" style="margin-top: 10px; margin-bottom: 0px;">Total <span class="text-md" t-esc="total"></span></p>
+                </t>
+                <t t-if="o.causes">
+                    <div class="row"><div class="col-xs-12"><div class="separator"/></div></div>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <div t-field="o.causes"/>
+                        </div>
+                    </div>
+                </t>
+                <div class="row"><div class="col-xs-12"><div class="separator"/></div></div>
+                <div class="row">
+                    <div class="col-xs-6">
+                        <p class="text-center bordered sign"><br/><br/><br/><br/>Firma cliente</p>
+                    </div>
+                    <div class="col-xs-6">
+                        <p class="agreement">Doy mi consentimiento para la realización de las operaciones y montaje del material aquí descritos.</p>
+                    </div>
+                </div>
+            </div>
+        </template>
+
+        <!-- Contenido del informe -->
+        <template id="company_report_document">
+            <t t-call="report.html_container">
+                <t t-call="repair_workorder_mejorado.workorder_company"/>
+            </t>
+        </template>
+
+
+    </data>
+</openerp>

+ 191 - 0
reports/config_order_partner.xml

@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+
+        <!-- Declarar el informe -->
+        <report
+            id="action_work_order_partner_mejorado_report"
+            string="Work order (partner copy)"
+            model="repair.workorderimproved"
+            report_type="qweb-pdf"
+            name="repair_workorder_mejorado.partner_report"
+            file="workorder_partner"
+         />
+
+        <record id="action_work_order_partner_mejorado_report" model="ir.actions.report.xml">
+            <field name="paperformat_id" ref="repair_workorder_mejorado.paperformat_repair_workorder"/>
+        </record>
+
+        <!-- Informe -->
+        <template id="partner_report">
+            <t t-call="report.html_container">
+                <t t-foreach="doc_ids" t-as="doc_id">
+                    <t t-raw="translate_doc(doc_id, doc_model, 'partner_id.lang', 'repair_workorder_mejorado.partner_report_document')"/>
+                </t>
+            </t>
+        </template>
+
+        <template id="workorder_partner">
+            <div class="page">
+                <style>
+                    body {
+                        color: #000;
+                        font-family: Arial, Helvetica, sans-serif;
+                        font-size: 14px;
+                        letter-spacing: 0.0px;
+                        line-height: 20px;
+                        margin:0;
+                        padding:0;
+                        word-spacing:1px;
+                    }
+                    .text-lg {
+                        font-size: 18px;
+                        font-weight: bold;
+                    }
+                    .text-md {
+                        display: inline-block;
+                        font-size: 18px;
+                        font-weight: bold;
+                    }
+                    .bordered {
+                        border: 1px solid #000;
+                        padding: 10px;
+                    }
+                    /* http://www.squareonemd.co.uk/how-to-crop-an-image-with-a-css-class/ */
+                    .image-container {
+                        width: 366px;
+                        text-align: center;
+                    }
+                    .image-cropper {
+                        position: relative;
+                        height: 45px;
+                        overflow: hidden;
+                    }
+                    .centered {
+                        position: absolute;
+                        left: -50%;
+                        top: -50%;
+                        max-width: 100%;
+                    }
+                    .bottom {
+                        position: absolute;
+                        bottom: 0px;
+                        max-width: 100%;
+                    }
+                    .top {
+                        position: absolute;
+                        top: 0px;
+                        max-width: 100%;
+                    }
+                    .separator {
+                        border-top: 1px solid #000;
+                        margin-top: 20px;
+                        margin-bottom: 20px;
+                    }
+                </style>
+                <section class="header">
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <p class="text-center" style="margin-top: 10px; margin-bottom: 10px;"><span class="text-lg">COMPROBANTE SAT <span t-if="o.name" t-field="o.name"/></span></p>
+                            <div class="image-container">
+                                <div class="image-cropper">
+                                    <img class="top" t-att-src="'data:image/png;base64,%s' % printBarcode(o.id, 732, 472)"/>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </section>
+                <div class="row"><div class="col-xs-12"><div class="separator"/></div></div>
+                <div class="row">
+                    <div class="col-xs-12">
+                        MATERIAL A RECOGER<br/>
+                        <t t-if="o.line_ids">
+                            <table class="order_lines" style="width: 100%;">
+                                <thead>
+                                    <tr>
+                                        <th style="width: 75%;">Concepto</th>
+                                        <th style="width: 25%;" class="text-right">Uds.</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <t t-foreach="o.line_ids" t-as="line">
+                                        <tr>
+                                            <td><span t-if="line.description" t-field="line.description"></span></td>
+                                            <td class="text-right"><span t-if="line.quantity" t-field="line.quantity"></span></td>
+                                        </tr>
+                                    </t>
+                                </tbody>
+                            </table>
+                        </t>
+                        <br/>
+                        Cliente: <span t-if="o.partner_id.name" t-field="o.partner_id.name"/><br/>
+                        Teléfono: <span t-if="o.partner_id.phone" t-field="o.partner_id.phone"/><t t-if="o.partner_id.mobile"> - <span t-field="o.partner_id.mobile"/></t><br/>
+                        Fecha Entrada: <span t-if="o.order_date" t-field="o.order_date"/><br/>
+                        Fecha Recogida: <span t-if="o.planned_end_date" t-field="o.planned_end_date"/>
+                    </div>
+                </div>
+                <t t-if="o.consumed_ids">
+                    <div class="row"><div class="col-xs-12"><div class="separator"/></div></div>
+                    <table class="consumed_lines" style="width: 100%;">
+                        <thead>
+                            <tr>
+                                <th style="width: 45%;">Concepto</th>
+                                <th style="width: 15%;" class="text-right">Uds.</th>
+                                <th style="width: 20%;" class="text-right">Precio</th>
+                                <th style="width: 20%;" class="text-right">Subtotal</th>
+                            </tr>
+                        </thead>
+                        <tbody>
+                            <t t-foreach="o.consumed_ids" t-as="consumed">
+                                <tr>
+                                    <td><span t-if="consumed.description" t-field="consumed.description"/></td>
+                                    <td class="text-right"><span t-if="consumed.quantity" t-field="consumed.quantity"/></td>
+                                    <td class="text-right"><span t-if="consumed.price_unit" t-field="consumed.price_unit"/></td>
+                                    <td class="text-right"><span t-if="consumed.subtotal and consumed.price_unit" t-raw="consumed.quantity * consumed.price_unit"/></td>
+                                </tr>
+                            </t>
+                        </tbody>
+                    </table>
+                    <t t-set="total" t-value="get_total(o)"/>
+                    <p class="text-right" style="margin-top: 10px; margin-bottom: 0px;">Total <span class="text-md" t-esc="total"></span> EUR</p>
+
+                </t>
+                <section class="warning">
+                    <div class="row"><div class="col-xs-12"><div class="separator"/></div></div>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <p style="text-align: justify; margin-bottom: 0px;">
+                                <small class="warning-text">Presupuesto estimado, si durante la reparación el importe se modificara sustancialmente se consultará al cliente para su aprobación.</small>
+                            </p>
+                        </div>
+                    </div>
+                </section>
+                <t t-if="o.partner_id.company_id">
+                    <div class="row"><div class="col-xs-12"><div class="separator"/></div></div>
+                    <div class="row">
+                        <div class="col-xs-12">
+                            <p class="company-info text-center">
+                                <t t-if="o.partner_id.company_id.name"><span t-field="o.partner_id.company_id.name"/></t>
+                                <t t-if="o.partner_id.company_id.street">- <span t-field="o.partner_id.company_id.street"/>,</t>
+                                <t t-if="o.partner_id.company_id.zip"> <span t-field="o.partner_id.company_id.zip"/></t>
+                                <t t-if="o.partner_id.company_id.city">- <span t-field="o.partner_id.company_id.city"/></t>
+                                <t t-if="o.partner_id.company_id.state_id">(<span t-field="o.partner_id.company_id.state_id.name"/>)</t>
+                                <t t-if="o.partner_id.company_id.phone">- <span t-field="o.partner_id.company_id.phone"/></t>
+                                <t t-if="o.partner_id.company_id.email">- <span t-field="o.partner_id.company_id.email"/></t>
+                                <t t-if="o.partner_id.company_id.website">- <span t-field="o.partner_id.company_id.website"/></t>
+                            </p>
+                        </div>
+                    </div>
+                </t>
+            </div>
+        </template>
+
+        <!-- Contenido del informe -->
+        <template id="partner_report_document">
+            <t t-call="report.html_container">
+                <t t-call="repair_workorder_mejorado.workorder_partner"/>
+            </t>
+        </template>
+
+    </data>
+</openerp>

+ 95 - 0
reports/parser.py

@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+# License, author and contributors information in:
+# __openerp__.py file at the root folder of this module.
+
+from functools import partial
+from openerp.osv import osv
+from openerp import exceptions, _
+from reportlab.graphics.barcode import createBarcodeDrawing
+
+
+class PartnerReport(osv.AbstractModel):
+    _name = 'report.repair_workorder_mejorado.partner_report'
+
+    def get_total(self, cr, uid, workorder, context=None):
+        total = 0
+        for line_consumed in workorder.consumed_ids:
+            total += line_consumed.quantity * line_consumed.price_unit
+        return total
+
+    def render_html(self, cr, uid, ids, data=None, context=None):
+        report_obj = self.pool['report']
+        repair_workorder_obj = self.pool['repair.workorderimproved']
+        report = report_obj._get_report_from_name(
+            cr, uid, 'repair_workorder_mejorado.partner_report')
+        selected_orders = repair_workorder_obj.browse(
+            cr, uid, ids, context=context)
+
+        docargs = {
+            'doc_ids': ids,
+            'doc_model': report.model,
+            'docs': selected_orders,
+            'get_total': partial(
+                self.get_total, cr, uid, context=context),
+            'printBarcode': partial(
+                self.printBarcode, cr, uid, context=context),
+        }
+
+        return report_obj.render(
+            cr, uid, ids, 'repair_workorder_mejorado.partner_report',
+            docargs, context=context)
+
+    def printBarcode(self, cr, uid, value, width, height, context=None):
+        try:
+            width, height = int(width), int(height)
+            barcode = createBarcodeDrawing(
+                'EAN13', value=value, format='png', width=width, height=height)
+            barcode = barcode.asString('png')
+            barcode = barcode.encode('base64', 'strict')
+        except (ValueError, AttributeError):
+            raise exceptions.Warning(_('Cannot convert into barcode.'))
+
+        return barcode
+
+
+class CompanyReport(osv.AbstractModel):
+    _name = 'report.repair_workorder_mejorado.company_report'
+
+    def get_total(self, cr, uid, workorder, context=None):
+        total = 0
+        for line_consumed in workorder.consumed_ids:
+            total += line_consumed.quantity * line_consumed.price_unit
+        return total
+
+    def render_html(self, cr, uid, ids, data=None, context=None):
+        report_obj = self.pool['report']
+        repair_workorder_obj = self.pool['repair.workorderimproved']
+        report = report_obj._get_report_from_name(
+            cr, uid, 'repair_workorder_mejorado.company_report')
+        selected_orders = repair_workorder_obj.browse(
+            cr, uid, ids, context=context)
+
+        docargs = {
+            'doc_ids': ids,
+            'doc_model': report.model,
+            'docs': selected_orders,
+            'get_total': partial(
+                self.get_total, cr, uid, context=context),
+            'printBarcode': partial(
+                self.printBarcode, cr, uid, context=context),
+        }
+        return report_obj.render(
+            cr, uid, ids, 'repair_workorder_mejorado.company_report',
+            docargs, context=context)
+
+    def printBarcode(self, cr, uid, value, width, height, context=None):
+        try:
+            width, height = int(width), int(height)
+            barcode = createBarcodeDrawing(
+                'EAN13', value=value, format='png', width=width, height=height)
+            barcode = barcode.asString('png')
+            barcode = barcode.encode('base64', 'strict')
+        except (ValueError, AttributeError):
+            raise exceptions.Warning(_('Cannot convert into barcode.'))
+
+        return barcode

BIN
reports/parser.pyc


+ 232 - 0
views/config_order_mejorado.xml

@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+
+        <!-- tree view -->
+
+        <record id="tree_repair_configorder_mejorado" model="ir.ui.view">
+            <field name="name">repair.configorder.mejorado.tree</field>
+            <field name="model">repair.configorderimproved</field>
+            <field name="arch" type="xml">
+                <tree string="FICHA TÉCNICA DE SERVICIOS">
+                    <field name="name"/>
+                    <field name="user_id"/>
+                    <field name="partner_id"/>
+                    <field name="pedido_obra"/>
+                    <field name="name_obra"/>
+                    <field name="order_date"/>
+                    <field name="planned_date"/>
+                    <field name="state"/>
+                </tree>
+            </field>
+        </record>
+
+        <!-- search view -->
+
+        <record id="search_repair_configorder_mejorado" model="ir.ui.view">
+            <field name="name">repair.configorder.mejorado.search</field>
+            <field name="model">repair.configorderimproved</field>
+            <field name="arch" type="xml">
+                <search string="FICHA TÉCNICA DE SERVICIOS">
+                    <field name="name"/>
+                    <field name="user_id"/>
+                    <field name="partner_id"/>
+                    <field name="pedido_obra"/>
+                    <field name="name_obra"/>
+                    <filter string="Mis tareas" domain="[('user_id','=',uid)]"/>
+                    <filter string="Realizada" domain="[('state','=','done')]"/>
+                    <separator/>
+                    <group expand="0" string="Agrupar por...">
+                        <filter string="Encargado" domain="[]" context="{'group_by':'user_id'}" />
+                        <filter string="Cliente" domain="[]" context="{'group_by':'partner_id'}" />
+                        <filter string="Estado" name="State" context="{'group_by':'state'}"/>
+                    </group>
+                </search>
+            </field>
+        </record>
+
+        <!-- form view -->
+
+        <record id="form_repair_configorder_mejorado" model="ir.ui.view">
+            <field name="name">repair.configorder.mejorado.form</field>
+            <field name="model">repair.configorderimproved</field>
+            <field name="arch" type="xml">
+                <form string="Orden de Configuración">
+                    <header>
+                        <button name="button_draft" states="invoiced" string="Cambiar Estado" type="object"/>
+                        <button name="button_in_progress" type="object" states="draft,warranty" string="Iniciar configuración" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_in_progress_back" type="object" states="in_progress" string="Atrás" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_done" type="object" states="in_progress" string="Realizado" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_done_back" type="object" states="done" string="Atrás" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_cancel" type="object" states="draft,warranty,in_progress" string="Cancelar" class="oe_highlight" groups="base.group_user"/>
+                        <field name="state" widget="statusbar" statusbar_visible="draft,in_progress,done" statusbar_colors='{"done":"red","warning":"blue","canceled":"red","in_progress":"blue"}'/>
+                    </header>
+                    <sheet>
+                        <div class="oe_title">
+                            <h1>
+                                <label string="Secuencia "/>
+                                <field name="name" class="oe_inline" readonly="1"/>
+                            </h1>
+                        </div>
+
+                        <group>
+                            <group>
+                                <field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": True}' attrs="{'readonly': [('state','!=', 'draft')]}" required="1"/>
+                                <field name="pedido_obra"/>
+                                <field name="name_obra"/>
+                                <field name="user_id"/>
+                            </group>
+                            <group name="Fechas">
+                                <field name="order_date" attrs="{'readonly': [('state','=','invoiced')]}" required="1"/>
+                                <field name="planned_date"/>
+                                <field name="movil"/>
+                            </group>
+                        </group>
+                        <separator string="Tipos de Servicios"/>
+                        <notebook>
+                            <page string="A- CLIMATIZACIÓN">
+                                <group>
+                                   <group>
+                                       <field name="brand_eq"/>
+                                       <field name="gas_eq"/>
+                                       <field name="turb_eq"/>
+                                   </group>
+                                   <group name="Dates">
+                                       <field name="model_eq"/>
+                                       <field name="carga_eq"/>
+                                       <field name="capacitor_eq"/>
+                                   </group>
+                                   <group name="Dates1">
+                                       <field name="serie_eq"/>
+                                       <field name="tension_eq"/>
+                                       <field name="largo_eq"/>
+                                   </group>
+                                   <group name="Dates2">
+                                       <field name="capacidad_eq"/>
+                                       <field name="presion_ini_eq"/>
+                                       <field name="presion_fin_eq"/>
+                                   </group>
+                               </group>
+                               <group>
+                                   <field name="estado_eq"/>
+                                   <field name="trabajo_eq"/>
+                                </group>
+                            </page>
+
+                            <page string="B- ELECTRICIDAD - TABLEROS">
+                                <group>
+                                   <group>
+                                       <field name="tablero"/>
+                                       <field name="disyuntor_tab"/>
+                                       <field name="tension_tab"/>
+                                   </group>
+                                   <group name="Dates">
+                                       <field name="serie_tab"/>
+                                       <field name="cargar_tab"/>
+                                       <field name="tensions_tab"/>
+                                   </group>
+                                   <group name="Dates1">
+                                       <field name="limitador_tab"/>
+                                       <field name="cargas_tab"/>
+                                       <field name="tensiont_tab"/>
+                                   </group>
+                                   <group name="Dates2">
+                                       <field name="disyuntor2_tab"/>
+                                       <field name="cargat_tab"/>
+                                       <field name="potencia_tab"/>
+                                   </group>
+                               </group>
+                               <group>
+                                   <field name="estado_tab"/>
+                                   <field name="trabajo_tab"/>
+                                </group>
+                                <group>
+                                   <group>
+                                       <field name="mante_tab"/>
+                                   </group>
+                                   <group>
+                                       <field name="garan_tab"/>
+                                   </group>
+                                   <group>
+                                       <field name="ficha_tab"/>
+                                   </group>
+                                   <group>
+                                       <field name="lacre_tab"/>
+                                   </group>
+                               </group>
+                            </page>
+
+                            <page string="C- TELECOMUNICACIONES - PCI - Alarmas.">
+                                <group>
+                                   <group>
+                                       <field name="equipo_tel"/>
+                                       <field name="capacidad_tel"/>
+                                       <field name="tension_tel"/>
+                                       <field name="contrasena_tel"/>
+                                       <field name="dns_tel"/>
+                                   </group>
+                                   <group name="Dates">
+                                       <field name="brand_tel"/>
+                                       <field name="port_tel"/>
+                                       <field name="ip_tel"/>
+                                       <field name="dnsalt_tel"/>
+                                       <field name="host_tel"/>
+                                   </group>
+                                   <group name="Dates1">
+                                       <field name="model_tel"/>
+                                       <field name="zonas_tel"/>
+                                       <field name="mac_tel"/>
+                                       <field name="correo_tel"/>
+                                       <field name="ippub_tel"/>
+                                   </group>
+                                   <group name="Dates2">
+                                       <field name="serie_tel"/>
+                                       <field name="usuario_tel"/>
+                                       <field name="iprouter_tel"/>
+                                       <field name="contrasena2_tel"/>
+                                       <field name="contrdeco_tel"/>
+                                   </group>
+                               </group>
+                               <group>
+                                   <field name="estado_tel"/>
+                                   <field name="trabajo_tel"/>
+                                </group>
+                                <group>
+                                   <group>
+                                       <field name="mante_tel"/>
+                                   </group>
+                                   <group>
+                                       <field name="garan_tel"/>
+                                   </group>
+                                   <group>
+                                       <field name="ficha_tel"/>
+                                   </group>
+                                   <group>
+                                       <field name="lacre_tel"/>
+                                   </group>
+                               </group>
+                            </page>
+                        </notebook>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+
+
+        <!-- action -->
+
+        <record id="action_repair_configorder_mejorado" model="ir.actions.act_window">
+            <field name="name">Orden de Configuración</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">repair.configorderimproved</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="search_view_id" ref="search_repair_configorder_mejorado"/>
+        </record>
+
+
+
+        <menuitem id="repair_configorder_mejorado" parent="base.menu_sales" action="action_repair_configorder_mejorado" name="Servicios técnicos" sequence="20"/>
+
+    </data>
+</openerp>