Parcourir la source

Nuevo orden de trabajo mejorado, con registro del nombre de la obra y contacto para bioelectric

Sebas il y a 5 ans
commit
3c08826a51

+ 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


+ 44 - 0
__openerp__.py

@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+#    Trey, Kilobytes de Soluciones
+#    Copyright (C) 2014-Today Trey, Kilobytes de Soluciones <www.trey.es>
+#
+#    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': 'Repair work order',
+    'summary': 'Work orders for repair shop',
+    'category': 'Repair',
+    'version': '0.1',
+    'description': """
+    """,
+    'author': 'Trey (www.trey.es) - Eiru',
+    'website': 'https://www.eiru.com.py',
+    'depends': [
+        'product',
+        'account',
+        'sale',
+    ],
+    'data': [
+        'data/report_paperformat_mejorado.xml',
+        'data/sequence_mejorado.xml',
+        'views/work_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_workorder" model="report.paperformat">
+            <field name="name">Repair Workorder</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">Work Order</field>
+            <field name="code">repair.workorderimproved</field>
+        </record>
+
+        <record id="seq_sale_order" model="ir.sequence">
+            <field name="name">Work Order</field>
+            <field name="code">repair.workorderimproved</field>
+            <field name="prefix">OT</field>
+            <field name="padding">3</field>
+            <field name="company_id" eval="False"/>
+        </record>
+
+    </data>
+</openerp>

+ 479 - 0
i18n/es.po

@@ -0,0 +1,479 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# 	* repair_workorder_mejorado
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-06-11 09:48+0000\n"
+"PO-Revision-Date: 2019-06-11 09:58+0100\n"
+"Last-Translator: Sebas <sebas@eiru.py>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: \n"
+"X-Generator: Poedit 1.5.4\n"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorder:repair_workorder_mejorado.form_repair_workorder_mejorado
+#: field:repair.workorderimproved,actions:0
+msgid "Actions"
+msgstr "Acciones"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+#: field:repair.workorderimproved,actions:0
+msgid "Recommendations"
+msgstr "Recomendaciones"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+msgid "Back"
+msgstr "Volver"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorderimproved.form_repair_workorder_mejorado
+msgid "Begin work"
+msgstr "Iniciar trabajo"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorderimproved.partner_report_done_document
+msgid "COMPROBANTE SAT"
+msgstr "COMPROBANTE SAT"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder.form_repair_workorder_mejorado
+msgid "Cancel"
+msgstr "Cancelar"
+
+#. module: repair_workorder_mejorado
+#: selection:repair.workorderimproved,state:0
+msgid "Canceled"
+msgstr "Cancelada"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+#: selection:repair.workorderimproved,state:0
+msgid "Invoiced"
+msgstr "Facturado"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+#: field:repair.workorderimproved,causes:0
+msgid "Causes"
+msgstr "Causas"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Cliente:"
+msgstr "Cliente:"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,name:0
+msgid "Code"
+msgstr "Código"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Concepto"
+msgstr "Concepto"
+
+#. module: repair_workorder_mejorado
+#: model:ir.actions.act_window,name:repair_workorder_mejorado.action_repair_workorder_consumed_mejorado
+#: view:repair.workorderimproved.consumed:repair_workorder_mejorado.form_repair_workorder_consumed_mejorado
+#: view:repair.workorderimproved.consumed:repair_workorder_mejorado.search_repair_workorder_consumed_mejorado
+#: view:repair.workorderimproved.consumed:repair_workorder_mejorado.tree_repair_workorder_consumed_mejorado
+msgid "Consumed products and services"
+msgstr "Productos y servicios consumidos"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,create_uid:0
+#: field:repair.workorderimproved.consumed,create_uid:0
+#: field:repair.workorderimproved.line,create_uid:0
+msgid "Created by"
+msgstr "Creada por"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,create_date:0
+#: field:repair.workorderimproved.consumed,create_date:0
+#: field:repair.workorderimproved.line,create_date:0
+msgid "Created on"
+msgstr "Creada el"
+
+#. module: repair_workorder_mejorado
+#: help:repair.workorderimproved,message_last_post:0
+#: help:repair.workorderimproved.consumed,message_last_post:0
+#: help:repair.workorderimproved.line,message_last_post:0
+msgid "Date of the last message posted on the record."
+msgstr "Fecha del último mensaje publicado en el registro."
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved.consumed,description:0
+#: field:repair.workorderimproved.line,description:0
+msgid "Description"
+msgstr "Descripción"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+#: field:repair.workorderimproved,diagnostic:0
+msgid "Diagnostic"
+msgstr "Diagnóstico"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+#: selection:repair.workorderimproved,state:0
+msgid "Done"
+msgstr "Realizada"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+msgid ""
+"Doy mi consentimiento para la realización de las operaciones y montaje del "
+"material aquí descritos."
+msgstr ""
+"Doy mi consentimiento para la realización de las operaciones y montaje del "
+"material aquí descritos."
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "EUR"
+msgstr "EUR"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,user_id:0
+msgid "Engineer"
+msgstr "Ingeniero"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Fecha Entrada:"
+msgstr "Fecha Entrada:"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Fecha Recogida:"
+msgstr "Fecha Recogida:"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+msgid "Firma cliente"
+msgstr "Firma cliente"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,message_follower_ids:0
+#: field:repair.workorderimproved.consumed,message_follower_ids:0
+#: field:repair.workorderimproved.line,message_follower_ids:0
+msgid "Followers"
+msgstr "Seguidores"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.search_repair_workorder
+#: view:repair.workorderimproved.consumed:repair_workorder_mejorado.search_repair_workorder_consumed
+#: view:repair.workorderimproved.line:repair_workorder_mejorado.search_repair_workorder_line
+msgid "Group By..."
+msgstr "Agrupado por..."
+
+#. module: repair_workorder_mejorado
+#: help:repair.workorderimproved,message_summary:0
+#: help:repair.workorderimproved.consumed,message_summary:0
+#: help:repair.workorderimproved.line,message_summary:0
+msgid ""
+"Holds the Chatter summary (number of messages, ...). This summary is "
+"directly in html format in order to be inserted in kanban views."
+msgstr ""
+"Mantiene el resumen del Chat (número de mensajes, ...). Este resumen está "
+"directamente en formato HTML para poder ser insertado en vistas kanban."
+
+#. module: repair_workorder_mejorado
+#: help:repair.workorderimproved,message_unread:0
+#: help:repair.workorderimproved.consumed,message_unread:0
+#: help:repair.workorderimproved.line,message_unread:0
+msgid "If checked new messages require your attention."
+msgstr "Si se marca los nuevos mensajes requerirán tu atención."
+
+#. module: repair_workorder_mejorado
+#: selection:repair.workorderimproved,state:0
+msgid "In progress"
+msgstr "En progreso"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,message_is_follower:0
+#: field:repair.workorderimproved.consumed,message_is_follower:0
+#: field:repair.workorderimproved.line,message_is_follower:0
+msgid "Is a Follower"
+msgstr "Es un Seguidor"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,message_last_post:0
+#: field:repair.workorderimproved.consumed,message_last_post:0
+#: field:repair.workorderimproved.line,message_last_post:0
+msgid "Last Message Date"
+msgstr "Fecha del Último Mensaje"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,write_uid:0
+#: field:repair.workorderimproved.consumed,write_uid:0
+#: field:repair.workorderimproved.line,write_uid:0
+msgid "Last Updated by"
+msgstr "Última Actualización por"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,write_date:0
+#: field:repair.workorderimproved.consumed,write_date:0
+#: field:repair.workorderimproved.line,write_date:0
+msgid "Last Updated on"
+msgstr "Última Actualización el"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Material a recoger: XXXXXXXX"
+msgstr "Material a recoger: XXXXXXXX"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,message_ids:0
+#: field:repair.workorderimproved.consumed,message_ids:0
+#: field:repair.workorderimproved.line,message_ids:0
+msgid "Messages"
+msgstr "Mensajes"
+
+#. module: repair_workorder_mejorado
+#: help:repair.workorderimproved,message_ids:0
+#: help:repair.workorderimproved.consumed,message_ids:0
+#: help:repair.workorderimproved.line,message_ids:0
+msgid "Messages and communication history"
+msgstr "Historial de mensajes y comunicaciones"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved.consumed:repair_workorder_mejorado.search_repair_workorder_consumed_mejorado
+msgid "Nombre"
+msgstr "Nombre"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+msgid "Operations"
+msgstr "Operaciones"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+msgid "Order Lines"
+msgstr "Líneas de Pedido"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,order_date:0
+msgid "Order date"
+msgstr "Fecha de pedido"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+msgid "PARTE TRABAJO"
+msgstr "PARTE TRABAJO"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.search_repair_workorder_mejorado
+#: field:repair.workorderimproved,partner_id:0
+msgid "Partner"
+msgstr "Cliente"
+
+#. module: repair_workorder_mejorado
+#: selection:repair.workorderimproved,state:0
+msgid "Pending"
+msgstr "Pendiente"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,planned_end_date:0
+msgid "Planned end date"
+msgstr "Fecha prevista de finalización"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,planned_start_date:0
+msgid "Planned start date"
+msgstr "Fecha prevista de inicio"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Precio"
+msgstr "Precio"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid ""
+"Presupuesto estimado, si durante la reparación el importe se modificara "
+"sustancialmente se consultará al cliente para su aprobación."
+msgstr ""
+"Presupuesto estimado, si durante la reparación el importe se modificara "
+"sustancialmente se consultará al cliente para su aprobación."
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved.consumed,price_unit:0
+msgid "Price unit"
+msgstr "Precio unitario"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+msgid "Print partner copy"
+msgstr "Imprimir copia cliente"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved.consumed,product_id:0
+#: selection:repair.workorder.consumed,type:0
+msgid "Product"
+msgstr "Producto"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,consumed_ids:0
+msgid "Product & Services consumed"
+msgstr "Productos y Servicios consumidos"
+
+#. module: repair_workorder_mejorado
+#: model:ir.model,name:repair_workorder_mejorado.model_repair_workorder_line
+msgid "Product to repair"
+msgstr "Producto a reparar"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,line_ids:0
+msgid "Products delivered"
+msgstr "Productos enviados"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved.consumed,quantity:0
+#: field:repair.workorderimproved.line,quantity:0
+msgid "Quantity"
+msgstr "Cantidad"
+
+#. module: repair_workorder_mejorado
+#: selection:repair.workorderimproved.consumed,type:0
+msgid "Service"
+msgstr "Servicio"
+
+#. module: repair_workorder_mejorado
+#: model:ir.model,name:repair_workorder_mejorado.model_repair_workorder_consumed
+msgid "Services for repair"
+msgstr "Servicios de la reparación"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,state:0
+msgid "State"
+msgstr "Estado"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Subtotal"
+msgstr "Subtotal"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,message_summary:0
+#: field:repair.workorderimproved.consumed,message_summary:0
+#: field:repair.workorderimproved.line,message_summary:0
+msgid "Summary"
+msgstr "Resumen"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Teléfono:"
+msgstr "Teléfono:"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+msgid "To draft"
+msgstr "A borrador"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Total"
+msgstr "Total"
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved.consumed,type:0
+msgid "Type"
+msgstr "Tipo"
+
+#. module: repair_workorder_mejorado
+#: view:website:repair_workorder_mejorado.partner_report_document
+#: view:website:repair_workorder_mejorado.partner_report_done_document
+msgid "Uds."
+msgstr "Uds."
+
+#. module: repair_workorder_mejorado
+#: field:repair.workorderimproved,message_unread:0
+#: field:repair.workorderimproved.consumed,message_unread:0
+#: field:repair.workorderimproved.line,message_unread:0
+msgid "Unread Messages"
+msgstr "Mensajes no leídos"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.search_repair_workorder_mejorado
+msgid "User"
+msgstr "Usuario"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+#: selection:repair.workorderimproved,state:0
+msgid "Warranty"
+msgstr "Garantía"
+
+#. module: repair_workorder_mejorado
+#: model:ir.actions.act_window,name:repair_workorder_mejorado.action_repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.search_repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.tree_repair_workorder_mejorado
+msgid "Work Order"
+msgstr "Orden de Trabajo"
+
+#. module: repair_workorder_mejorado
+#: model:ir.model,name:repair_workorder_mejorado.model_repair_workorder
+#: model:ir.ui.menu,name:repair_workorder_mejorado.repair_workorder_mejorado
+#: field:repair.workorderimproved.consumed,workorder_id:0
+#: field:repair.workorderimproved.line,workorder_id:0
+msgid "Work order"
+msgstr "Orden de trabajo"
+
+#. module: repair_workorder_mejorado
+#: model:ir.actions.report.xml,name:repair_workorder_mejorado.action_work_order_report_mejorado
+#: model:ir.actions.report.xml,name:repair_workorder_mejorado.action_work_order_report_done
+msgid "Work order (partner copy)"
+msgstr "Orden de trabajo (copia cliente)"
+
+#. module: repair_workorder_mejorado
+#: model:ir.actions.act_window,name:repair_workorder_mejorado.action_repair_workorder_line_mejorado
+#: view:repair.workorderimproved.line:repair_workorder_mejorado.form_repair_workorder_line_mejorado
+#: view:repair.workorderimproved.line:repair_workorder_mejorado.search_repair_workorder_line_mejorado
+#: view:repair.workorderimproved.line:repair_workorder_mejorado.tree_repair_workorder_line_mejorado
+msgid "Work order line"
+msgstr "Línea de Orden de trabajo"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+msgid "Workorder"
+msgstr "Línea de trabajo"
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+msgid "describe the actions..."
+msgstr "Describa las acciones..."
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+msgid "describe the recommendations..."
+msgstr "Describa las recomendaciones..."
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder_mejorado.form_repair_workorder_mejorado
+msgid "describe the diagnostic..."
+msgstr "describa el diagnóstico..."
+
+#. module: repair_workorder_mejorado
+#: view:repair.workorderimproved:repair_workorder.form_repair_workorder_mejorado
+msgid "what happens to it"
+msgstr "qué le pasa"

+ 5 - 0
models/__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 work_order

BIN
models/__init__.pyc


+ 275 - 0
models/work_order.py

@@ -0,0 +1,275 @@
+# -*- 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 WorkOrder(models.Model):
+    _name = 'repair.workorderimproved'
+    _description = 'Work 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.workorderimproved') or '*'
+
+    name = fields.Char(
+        string=u'Code',
+        readonly=True,
+        default=_get_number
+    )
+    user_id = fields.Many2one(
+        comodel_name='res.users',
+        string='Engineer',
+        default=_get_user
+    )
+    partner_id = fields.Many2one(
+        comodel_name='res.partner',
+        string='Partner'
+    )
+    line_ids = fields.One2many(
+        comodel_name='repair.workorderimproved.line',
+        inverse_name='workorder_id',
+        string='Products delivered'
+    )
+    consumed_ids = fields.One2many(
+        comodel_name='repair.workorderimproved.consumed',
+        inverse_name='workorder_id',
+        string='Product & Services consumed'
+    )
+    order_date = fields.Datetime(
+        string='Order date',
+        default=fields.Datetime.now
+    )
+    planned_start_date = fields.Datetime(
+        string='Planned start date'
+    )
+    planned_end_date = fields.Datetime(
+        string='Planned end date'
+    )
+    name_obra = fields.Char(
+        string='Obra'
+    )
+    contacto_obra = fields.Char(
+        string='Contacto de la Obra'
+    )
+    emergente = fields.Text(
+        string='Pedidos adicionales y emergentes'
+    )
+    diagnostic = fields.Text(
+        string='Diagnostic'
+    )
+    causes = fields.Text(
+        string='Causes'
+    )
+    actions = fields.Text(
+        string='Acciones'
+    )
+    recommendations = fields.Text(
+        string="recommendations"
+    )
+    state = fields.Selection([
+        ('draft', 'Pending'),
+        ('in_progress', 'In progress'),
+        ('done', 'Done'),
+        ('canceled', 'Canceled'),
+        ('invoiced', 'Invoiced')],
+        string='State',
+        default='draft'
+    )
+    invoice_ids = fields.One2many('account.invoice', 'work_invoice_id')
+    invoice_count = fields.Integer(
+        string='Facturas',
+        compute='_get_invoice_count',
+    )
+
+    @api.multi
+    def button_draft(self):
+        if self.invoice_count > 0:
+            raise Warning('Este trabajo tiene una factura asociada')
+        if self.invoice_count == 0:
+            for work in self:
+                work.write({'state': 'draft'})
+            return True
+
+    @api.one
+    @api.depends('invoice_ids')
+    def _get_invoice_count(self):
+        self.invoice_count = len(self.invoice_ids)
+
+    @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 or not works:
+            raise Warning('El trabajo debe tener productos y trabajos asociados')
+        else:
+            self.state = 'done'
+
+    @api.one
+    def button_done_back(self):
+        self.state = 'in_progress'
+
+    @api.one
+    def button_cancel(self):
+        self.state = 'canceled'
+
+    @api.multi
+    def Facturado(self):
+        inv_obj = self.env['account.invoice']
+        inv_line_obj = self.env['account.invoice.line']
+        customer = self.partner_id
+        if not customer.name:
+            raise osv.except_osv(_('UserError!'), _('Please select a Customer.'))
+        company_id = self.env['res.users'].browse(1).company_id
+        self.ensure_one()
+        ir_values = self.env['ir.values']
+        inv_data = {
+            'name': customer.name,
+            'reference': customer.name,
+            'account_id': customer.property_account_receivable.id,
+            'partner_id': customer.id,
+            'origin': self.name,
+            'work_invoice_id': self.id
+        }
+        inv_id = inv_obj.create(inv_data)
+        for records in self.consumed_ids:
+            if records.product_id.id:
+                income_account = records.product_id.categ_id.property_account_income_categ.id
+            if not income_account:
+                raise osv.except_osv(_('UserError!'), _('There is no income account defined '
+                                                        'for this product: "%s".') % (records.product_id.name,))
+            inv_line_data = {
+                'name': records.product_id.name,
+                'account_id': income_account,
+                'price_unit': records.price_unit,
+                'quantity': records.quantity,
+                'product_id': records.product_id.id,
+                'invoice_id': inv_id.id,
+                'invoice_line_tax_id': [(6, 0, [x.id for x in records.product_id.taxes_id])],
+            }
+            inv_line_obj.create(inv_line_data)
+        self.state = 'invoiced'
+        imd = self.env['ir.model.data']
+        action = imd.xmlid_to_object('account.action_invoice_tree1')
+        list_view_id = imd.xmlid_to_res_id('account.invoice_tree')
+        form_view_id = imd.xmlid_to_res_id('account.invoice_form')
+        result = {
+            'name': action.name,
+            'help': action.help,
+            'type': 'ir.actions.act_window',
+            'views': [[list_view_id, 'tree'], [form_view_id, 'form'], [False, 'graph'], [False, 'kanban'],
+                      [False, 'calendar'], [False, 'pivot']],
+            'target': action.target,
+            'context': action.context,
+            'res_model': 'account.invoice',
+        }
+        if len(inv_id) > 1:
+            result['domain'] = "[('id','in',%s)]" % inv_id.ids
+        elif len(inv_id) == 1:
+            result['views'] = [(form_view_id, 'form')]
+            result['res_id'] = inv_id.ids[0]
+        else:
+            result = {'type': 'ir.actions.act_window_close'}
+        invoiced_records = self.env['repair.workorderimproved']
+        total = 0
+        self.stage_id = 3
+        for rows in invoiced_records:
+            invoiced_date = rows.date
+            invoiced_date = invoiced_date[0:10]
+            if invoiced_date == str(date.today()):
+                total = total + rows.price_subtotal
+        inv_id.signal_workflow('invoice_open')
+        return result
+
+
+class WorkOrderLine(models.Model):
+    _name = 'repair.workorderimproved.line'
+    _description = 'Product to repair'
+    _inherit = ['mail.thread', 'ir.needaction_mixin']
+
+    workorder_id = fields.Many2one(
+        comodel_name='repair.workorderimproved',
+        string='Work order improved')
+    description = fields.Char(string='Description')
+    quantity = fields.Float(string='Quantity', default=1.0)
+    brand = fields.Char(string='Marca')
+    number = fields.Char(string="Numero de serie")
+
+
+class WorkOrderConsumed(models.Model):
+    _name = 'repair.workorderimproved.consumed'
+    _description = 'Services for repair'
+    _inherit = ['mail.thread', 'ir.needaction_mixin']
+
+    workorder_id = fields.Many2one(
+        comodel_name='repair.workorderimproved',
+        string='Work order'
+    )
+    product_id = fields.Many2one(
+        comodel_name='product.product',
+        string='Product'
+    )
+    type = fields.Selection([
+        ('service', 'Service'),
+        ('product', 'Product')],
+        string='Type',
+        required=True,
+        default='service'
+    )
+    description = fields.Char(
+        string='Description',
+        required=True
+    )
+    quantity = fields.Float(
+        string='Quantity',
+        default=1
+    )
+    price_unit = fields.Float(
+        string='Price unit'
+    )
+    subtotal = fields.Float(
+        string='Subtotal',
+        compute='compute_subtotal'
+    )
+
+    @api.one
+    @api.depends('quantity', 'price_unit')
+    def compute_subtotal(self):
+        self.subtotal = self.quantity * self.price_unit
+
+    @api.onchange('product_id')
+    def onchange_product_id(self):
+        if self.product_id:
+            self.description = self.product_id.name
+            self.type = 'service' if self.product_id.type == 'service' \
+                else 'product'
+
+            # @ TODO impuestos??
+            # Obtener el precio del producto a partir de la tarifa del cliente
+            self.price_unit = self.product_id.list_price
+
+class AccountInvoice(models.Model):
+    _inherit = 'account.invoice'
+
+    work_invoice_id = fields.Many2one('repair.workorderimproved')

BIN
models/work_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


+ 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


+ 181 - 0
reports/work_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/work_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>

+ 294 - 0
views/work_order_mejorado.xml

@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+
+        <!-- ations -->
+
+        <act_window
+            id="action_open_account_invoice_mejorado"
+            name="Trabajos"
+            res_model="account.invoice"
+            view_type="form"
+            view_mode="tree,form"
+            domain="[('work_invoice_id', '=', active_id)]"/>
+
+        <act_window
+            id="action_open_single_account_invoice_mejorado"
+            name="Trabajos"
+            res_model="account.invoice"
+            view_type="form"
+            view_mode="tree,form"
+            target="current"
+            domain="[('invoice_ids', 'in', active_id)]"/>
+
+        <!-- tree view -->
+
+        <record id="tree_repair_workorder_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorder.mejorado.tree</field>
+            <field name="model">repair.workorderimproved</field>
+            <field name="arch" type="xml">
+                <tree string="Work Order">
+                    <field name="name"/>
+                    <field name="user_id"/>
+                    <field name="partner_id"/>
+                    <field name="name_obra"/>
+                    <field name="contacto_obra"/>
+                    <field name="planned_start_date"/>
+                    <field name="planned_end_date"/>
+                    <field name="state"/>
+                </tree>
+            </field>
+        </record>
+
+        <!-- search view -->
+
+        <record id="search_repair_workorder_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorder.mejorado.search</field>
+            <field name="model">repair.workorderimproved</field>
+            <field name="arch" type="xml">
+                <search string="Work Order">
+                    <field name="name"/>
+                    <field name="user_id"/>
+                    <field name="partner_id"/>
+                    <field name="name_obra"/>
+                    <field name="contacto_obra"/>
+                    <filter string="Mis tareas" domain="[('user_id','=',uid)]"/>
+                    <filter string="Realizada" domain="[('state','=','done')]"/>
+                    <separator/>
+                    <group expand="0" string="Group By...">
+                        <filter string="User" domain="[]" context="{'group_by':'user_id'}" />
+                        <filter string="Partner" 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_workorder_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorder.mejorado.form</field>
+            <field name="model">repair.workorderimproved</field>
+            <field name="arch" type="xml">
+                <form string="Work Order">
+                    <header>
+                        <button name="Facturado" string="Crear Factura" type="object" class="btn-primary" states="done"/>
+                        <button name="button_draft" states="invoiced" string="Cambiar Estado" type="object"/>
+                        <button name="button_in_progress" type="object" states="draft,warranty" string="Begin work" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_in_progress_back" type="object" states="in_progress" string="Back" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_done" type="object" states="in_progress" string="Done" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_done_back" type="object" states="done" string="Back" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_cancel" type="object" states="draft,warranty,in_progress" string="Cancel" 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="Workorder "/>
+                                <field name="name" class="oe_inline" readonly="1"/>
+                            </h1>
+                        </div>
+                        <div class="oe_right oe_button_box">
+                            <button
+                                class="oe_inline oe_stat_button"
+                                type="action"
+                                name="%(action_open_account_invoice_mejorado)d"
+                                icon="fa-money">
+                                <field name="invoice_count" string="Facturas" widget="statinfo" />
+                            </button>
+                        </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="user_id" attrs="{'readonly': [('state','=', 'invoiced')]}" required="1"/>
+                                <field name="name_obra"/>
+                                <field name="contacto_obra"/>
+                            </group>
+                            <group name="Dates">
+                                <field name="order_date" attrs="{'readonly': [('state','=','invoiced')]}" required="1"/>
+                                <field name="planned_start_date" attrs="{'readonly': [('state','=','invoiced')]}" required="1"/>
+                                <field name="planned_end_date" attrs="{'readonly': [('state','=','invoiced')]}" required="1"/>
+                            </group>
+                        </group>
+                        <separator string="Causes"/>
+                        <field name="causes" placeholder="what happens to it" attrs="{'readonly': [('state','=','invoiced')]}"/>
+                        <notebook>
+                            <page string="Order Lines">
+                                <field name="line_ids" attrs="{'readonly': [('state','=','invoiced')]}"/>
+                                <field name="consumed_ids" attrs="{'readonly': [('state','=','invoiced')]}"/>
+                            </page>
+                            <page string="Operations">
+                                <separator string="Pedidos adicionales y emergentes"/>
+                                <field name="emergente" placeholder="describe los pedidos adicionales y emergentes..." attrs="{'readonly': [('state','=','invoiced')]}"/>
+                                <separator string="Diagnóstico y resumen de trabajo"/>
+                                <field name="diagnostic" placeholder="describe the diagnostic..." attrs="{'readonly': [('state','=','invoiced')]}"/>
+                                <separator string="Actions"/>
+                                <field name="actions" placeholder="describe the actions..." attrs="{'readonly': [('state','=','invoiced')]}"/>
+                                <separator string="Recomendaciones y sugerencias"/>
+                                <field name="recommendations" placeholder="describe the recommendations..." attrs="{'readonly': [('state','=','invoiced')]}"/>
+                            </page>
+                        </notebook>
+                    </sheet>
+                    <div class="oe_chatter">
+                        <field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
+                        <field name="message_ids" widget="mail_thread"/>
+                    </div>
+                </form>
+            </field>
+        </record>
+
+        <!-- calendar view -->
+
+        <record id="calendar_repair_workorder_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorder.mejorado.calendar</field>
+            <field name="model">repair.workorderimproved</field>
+            <field name="arch" type="xml">
+                <calendar color="user_id" date_start="planned_start_date" string="Repair">
+                    <field name="name"/>
+                </calendar>
+            </field>
+        </record>
+
+        <!-- gantt -->
+
+        <record id="gantt_repair_workorder_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorder.mejorado.calendar</field>
+            <field name="model">repair.workorderimproved</field>
+            <field name="arch" type="xml">
+                <gantt date_start="planned_start_date" date_stop="planned_end_date" progress="progress" string="Tasks" default_group_by="project_id">
+                </gantt>
+            </field>
+        </record>
+
+        <!-- action -->
+
+        <record id="action_repair_workorder_mejorado" model="ir.actions.act_window">
+            <field name="name">Work Order Mejorado</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">repair.workorderimproved</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form,calendar,gantt</field>
+            <field name="search_view_id" ref="search_repair_workorder_mejorado"/>
+        </record>
+
+        <!-- tree view -->
+
+        <record id="tree_repair_workorder_line_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorder.line.mejorado.tree</field>
+            <field name="model">repair.workorderimproved.line</field>
+            <field name="arch" type="xml">
+                <tree string="Lista de Pedidos" editable="bottom">
+                    <field name="description" required="1"/>
+                    <field name="brand" string="Cantidad" required="1"/>
+                    <field name="number" string="Logrado" required="1"/>
+                </tree>
+            </field>
+        </record>
+
+        <!-- search view -->
+
+        <record id="search_repair_workorder_line_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorder.line.mejorado.search</field>
+            <field name="model">repair.workorderimproved.line</field>
+            <field name="arch" type="xml">
+                <search string="Work order line">
+                    <field name="description"/>
+                    <field name="quantity"/>
+                    <newline />
+                    <group expand="0" string="Group By...">
+                    </group>
+                </search>
+            </field>
+        </record>
+
+        <record id="form_repair_workorder_line_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorderimproved.line.form</field>
+            <field name="model">repair.workorderimproved.line</field>
+            <field name="arch" type="xml">
+                <form string="Work order line">
+                    <sheet>
+                        <group>
+                            <field name="description" required="1"/>
+                            <field name="brand" required="1"/>
+                            <field name="number" required="1"/>
+                        </group>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+
+        <record id="action_repair_workorder_line_mejorado" model="ir.actions.act_window">
+            <field name="name">Work order line improved</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">repair.workorderimproved.line</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="search_view_id" ref="search_repair_workorder_line_mejorado"/>
+        </record>
+
+        <record id="tree_repair_workorder_consumed_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorder.consumed.mejorado.tree</field>
+            <field name="model">repair.workorderimproved.consumed</field>
+            <field name="arch" type="xml">
+                <tree string="Consumed products and services" editable="bottom">
+                    <field name="product_id"/>
+                    <field name="description"/>
+                    <field name="quantity"/>
+                    <field name="price_unit"/>
+                    <field name="subtotal"/>
+                    <field name="type"/>
+                </tree>
+            </field>
+        </record>
+
+        <record id="search_repair_workorder_consumed_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorderimproved.consumed.search</field>
+            <field name="model">repair.workorderimproved.consumed</field>
+            <field name="arch" type="xml">
+                <search string="Consumed products and services">
+                    <field name="type"/>
+                    <field name="product_id"/>
+                    <field name="description"/>
+                    <field name="quantity"/>
+                    <field name="price_unit"/>
+                    <field name="subtotal"/>
+                    <newline />
+                    <group expand="0" string="Group By...">
+                        <filter string="Nombre" domain="[]" context="{'group_by':'type'}" />
+                    </group>
+                </search>
+            </field>
+        </record>
+
+        <record id="form_repair_workorder_consumed_mejorado" model="ir.ui.view">
+            <field name="name">repair.workorderimproved.consumed.form</field>
+            <field name="model">repair.workorderimproved.consumed</field>
+            <field name="arch" type="xml">
+                <form string="Consumed products and services">
+                    <sheet>
+                        <group>
+                            <field name="product_id"/>
+                            <field name="type"/>
+                            <field name="description"/>
+                            <field name="quantity"/>
+                            <field name="price_unit"/>
+                            <field name="subtotal"/>
+                        </group>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+
+        <record id="action_repair_workorder_consumed_mejorado" model="ir.actions.act_window">
+            <field name="name">Consumed products and services</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">repair.workorderimproved.consumed</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="search_view_id" ref="search_repair_workorder_consumed_mejorado"/>
+        </record>
+
+        <menuitem id="repair_workorder_mejorado" parent="base.menu_sales" action="action_repair_workorder_mejorado" name="Work order" sequence="20"/>
+
+    </data>
+</openerp>