Jelajahi Sumber

Módulo para la carga de orden de servicio, tipo obra.

SEBAS 1 tahun lalu
melakukan
cf621f29f7

+ 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

TEMPAT SAMPAH
__init__.pyc


+ 47 - 0
__openerp__.py

@@ -0,0 +1,47 @@
+# -*- 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': 'Orden de servicio',
+    'summary': 'Orden de servicio a realizar',
+    'category': 'Repair',
+    'version': '0.1',
+    'description': """
+    """,
+    'author': 'Trey (www.trey.es) - Eiru',
+    'website': 'https://www.eiru.com.py',
+    'depends': [
+        'product',
+        'account',
+        'sale',
+        'base',
+    ],
+    'data': [
+        'data/report_paperformat_servicio.xml',
+        'data/sequence_servicio.xml',
+        'security/ir.model.access.csv',
+        'views/orden_servicio.xml',
+        'views/sale_order.xml'
+    ],
+    'test': [
+    ],
+    'installable': True,
+}

+ 20 - 0
data/report_paperformat_servicio.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data>
+        <record id="paperformat_orden_servicio" model="report.paperformat">
+            <field name="name">Orden de servicio</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_servicio.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+    <data noupdate="1">
+
+        <!-- Sequences for repair.workorder -->
+        <record id="seq_type_servicio" model="ir.sequence.type">
+            <field name="name">Orden de servicio</field>
+            <field name="code">orden.servicio</field>
+        </record>
+
+        <record id="seq_servicio_order" model="ir.sequence">
+            <field name="name">Orden de servicio</field>
+            <field name="code">orden.servicio</field>
+            <field name="prefix">SER</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 "Informe Técnico 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"

+ 7 - 0
models/__init__.py

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

TEMPAT SAMPAH
models/__init__.pyc


+ 19 - 0
models/horario_dia.py

@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields
+
+class HorarioDia(models.Model):
+    _name = 'horario.dia'
+
+    dia_semana = fields.Selection([
+        ('lunes', 'Lunes'),
+        ('martes', 'Martes'),
+        ('miercoles', 'Miércoles'),
+        ('jueves', 'Jueves'),
+        ('viernes', 'Viernes'),
+        ('sabado', 'Sábado'),
+        ('domingo', 'Domingo')
+    ], 'Día de la semana', required=True)
+    hora_inicio = fields.Char('Hora de inicio', required=True)
+    hora_fin = fields.Char('Hora de fin', required=True)
+
+    servicio_id = fields.Many2one('orden.servicio', 'Servicio')

TEMPAT SAMPAH
models/horario_dia.pyc


+ 343 - 0
models/orden_servicio.py

@@ -0,0 +1,343 @@
+# -*- 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
+from openerp.tools import DEFAULT_SERVER_TIME_FORMAT
+from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
+from datetime import datetime
+import logging
+
+_log = logging.getLogger(__name__)
+
+
+class OrdenServicio(models.Model):
+    _name = 'orden.servicio'
+    _description = 'Orden de servicio'
+    _inherit = ['mail.thread', 'ir.needaction_mixin']
+
+    def _get_user(self):
+        return self.env.uid
+
+    def _get_number(self):
+        return self.env['ir.sequence'].get('orden.servicio') or '*'
+
+    name = fields.Char(
+        string=u'Referencia',
+        default=_get_number
+    )
+    user_id = fields.Many2one(
+        comodel_name='res.users',
+        string='Usuario',
+        default=_get_user
+    )
+    partner_id = fields.Many2one(
+        comodel_name='res.partner',
+        string='Cliente'
+    )
+    celular_partner = fields.Char(related='partner_id.mobile', string='Móvil', store=True)
+    telefono_partner = fields.Char(related='partner_id.phone', string='Teléfono', store=True)
+    ubicacion_google_link = fields.Char(string='Ubicación Google Link')
+    name_obra = fields.Char(
+        string='Obra'
+    )
+    name_local = fields.Char(
+        string='Local'
+    )
+    order_date = fields.Datetime(
+        string='Fecha de pedido de servicio',
+        default=fields.Datetime.now
+    )
+    planned_start_date = fields.Datetime(
+        string='Fecha y hora inicio de obra'
+    )
+    planned_end_date = fields.Datetime(
+        string='Fecha y hora fin de obra'
+    )
+
+    contacto_obra = fields.Char(
+        string='Persona de contacto de la obra'
+    )
+    responsable = fields.Char(
+        string='Técnico Responsable'
+    )
+    celular_obra = fields.Char(
+        string='Celular/Tel. de la Obra'
+    )
+    nro_factura = fields.Char(
+        string='N° de factura'
+    )
+    distancia_obra = fields.Float(
+        string='Distancia en km'
+    )
+    croquis = fields.Char(
+        string='Croquis de la obra'
+    )
+    hrs_total = fields.Char(
+        string='Hora total del trabajo'
+    )
+    zona_obra = fields.Text(
+        string='Zona obra de trabajo'
+    )
+    fotos_obras = fields.Many2many(comodel_name='ir.attachment', relation='obra_attachment_rel', column1='obra_id', column2='attachment_id', string='Fotos del trabajo')
+    horarios_dia = fields.One2many('horario.dia', 'servicio_id', 'Horarios por día')
+
+    sale_order_id = fields.Many2one('sale.order', string='Orden de venta')
+
+    product_ids = fields.One2many(
+        comodel_name='servicio.producto',
+        inverse_name='servicio_id',
+        string='Productos a utilizar'
+    )
+
+    insumos_ids = fields.One2many(
+        comodel_name='servicio.insumo',
+        inverse_name='servicio_id',
+        string='Insumos a utilizar'
+    )
+
+    logistica_ids = fields.One2many(
+        comodel_name='servicio.logistica',
+        inverse_name='servicio_id',
+        string='Gastos de lógistica'
+    )
+
+    devolucion_ids = fields.One2many(
+        comodel_name='devolucion.insumo',
+        inverse_name='servicio_id',
+        string='Devolución de productos e insumos'
+    )
+
+    recepcion_ids = fields.One2many(
+        comodel_name='recepcion.fabrica',
+        inverse_name='servicio_id',
+        string='Recepción en fábrica'
+    )
+
+    invoice_ids = fields.One2many('account.invoice', 'servicio_invoice_id')
+    invoice_count = fields.Integer(
+        string='Facturas',
+        compute='_get_invoice_count',
+    )
+
+
+    state = fields.Selection([
+        ('draft', 'Pendiente'),
+        ('in_progress', 'En progreso'),
+        ('done', 'Realizado'),
+        ('canceled', 'Cancelado')],
+        string='Estado',
+        default='draft'
+    )
+
+    @api.one
+    @api.depends('invoice_ids')
+    def _get_invoice_count(self):
+        self.invoice_count = len(self.invoice_ids)
+
+    @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_back(self):
+        self.state = 'in_progress'
+
+    @api.one
+    def button_done(self):
+        self.state = 'done'
+
+
+    @api.one
+    def button_cancel(self):
+        self.state = 'canceled'
+
+    @api.one
+    def onchange_partner_id(self, partner_id):
+        _log.info('-'*100)
+        _log.info(partner_id)
+
+    @api.onchange('ubicacion_google_link')
+    def on_ubicacion_google_link_change(self):
+        for record in self:
+            if record.ubicacion_google_link:
+                # Abrir la ubicación en otra pestaña
+                # Esto puede requerir personalización adicional dependiendo de tu requisito exacto
+                url = record.ubicacion_google_link
+
+class ProductoServicio(models.Model):
+    _name = 'servicio.producto'
+
+    servicio_id = fields.Many2one(
+        comodel_name='orden.servicio',
+        string='Orden de servicio'
+    )
+
+    product_id = fields.Many2one('product.product', 'Producto')
+    categ_id = fields.Many2one('product.category', 'Categoría de producto')
+    quantity = fields.Float('Cantidad')
+    price_unit = fields.Float('Precio de costo')
+    subtotal = fields.Float('Subtotal', compute='compute_subtotal', store=True)
+
+    @api.one
+    @api.depends('quantity', 'price_unit')
+    def compute_subtotal(self):
+        self.subtotal = self.quantity * self.price_unit
+
+
+class ServicioInsumo(models.Model):
+    _name = 'servicio.insumo'
+    _description = 'Lista de Materiales proveidos'
+    _inherit = ['mail.thread', 'ir.needaction_mixin']
+
+    servicio_id = fields.Many2one(
+        comodel_name='orden.servicio',
+        string='Orden de servicio'
+    )
+    product_id = fields.Many2one(
+        comodel_name='product.product',
+        string='Insumos'
+    )
+    descripcion = fields.Char(
+        string='Descripcion',
+        required=True
+    )
+    quantity = fields.Float(
+        string='Cantidad',
+        default=1
+    )
+    price_unit = fields.Float(
+        string='Precio 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
+
+class ServicioLogistica(models.Model):
+    _name = 'servicio.logistica'
+    _description = 'Gastos de logística'
+    _inherit = ['mail.thread', 'ir.needaction_mixin']
+
+    servicio_id = fields.Many2one(
+        comodel_name='orden.servicio',
+        string='Orden de servicio'
+    )
+    product_id = fields.Many2one(
+        comodel_name='product.product',
+        string='Servicios'
+    )
+    descripcion = fields.Char(
+        string='Descripcion',
+        required=True
+    )
+    quantity = fields.Float(
+        string='Cantidad',
+        default=1
+    )
+    price_unit = fields.Float(
+        string='Precio 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
+
+class DevolucionInsumo(models.Model):
+    _name = 'devolucion.insumo'
+    _description = 'Devolución de productos e insumos'
+    _inherit = ['mail.thread', 'ir.needaction_mixin']
+
+    servicio_id = fields.Many2one(
+        comodel_name='orden.servicio',
+        string='Orden de servicio'
+    )
+    product_id = fields.Many2one(
+        comodel_name='product.product',
+        string='Productos e insumos'
+    )
+    descripcion = fields.Char(
+        string='Descripcion',
+        required=True
+    )
+    quantity = fields.Float(
+        string='Cantidad',
+        default=1
+    )
+    price_unit = fields.Float(
+        string='Precio 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
+
+
+class RecepcionFabrica(models.Model):
+    _name = 'recepcion.fabrica'
+    _description = 'Recepción en fábrica '
+    _inherit = ['mail.thread', 'ir.needaction_mixin']
+
+    servicio_id = fields.Many2one(
+        comodel_name='orden.servicio',
+        string='Orden de servicio'
+    )
+    product_id = fields.Many2one(
+        comodel_name='product.product',
+        string='Productos'
+    )
+    descripcion = fields.Char(
+        string='Descripcion',
+        required=True
+    )
+    quantity = fields.Float(
+        string='Cantidad',
+        default=1
+    )
+    price_unit = fields.Float(
+        string='Precio 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
+
+
+
+class AccountInvoice(models.Model):
+    _inherit = 'account.invoice'
+
+    servicio_invoice_id = fields.Many2one('orden.servicio')

TEMPAT SAMPAH
models/orden_servicio.pyc


+ 29 - 0
models/sale_order.py

@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# License, author and contributors information in:
+# __openerp__.py file at the root folder of this module.
+
+from openerp import models, fields, api
+
+class SaleOrder(models.Model):
+    _inherit = 'sale.order'
+
+    @api.multi
+    def open_order_service_form(self):
+        order_service_obj = self.env['orden.servicio']
+        order_service_vals = {
+            'sale_order_id': self.id,  # Pasa el ID del Pedido de Venta a la Orden de Servicio
+            'partner_id': self.partner_id,
+            # Otros campos relacionados con la Orden de Servicio que deseas establecer
+        }
+        order_service = order_service_obj.create(order_service_vals)
+
+        view_id = self.env.ref('orden_servicio.form_orden_servicio_mejorado').id
+        return {
+            'name': 'Orden de Servicio',
+            'view_type': 'form',
+            'view_mode': 'form',
+            'res_model': 'orden.servicio',
+            'res_id': order_service.id,
+            'view_id': [view_id],
+            'type': 'ir.actions.act_window',
+        }

TEMPAT SAMPAH
models/sale_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

TEMPAT SAMPAH
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

TEMPAT SAMPAH
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_orden_servicio_company_report"
+            string="Orden de servicio"
+            model="orden.servicio"
+            report_type="qweb-pdf"
+            name="orden_servicio.company_report"
+            file="servicio_company"
+         />
+
+        <record id="action_orden_servicio_report" model="ir.actions.report.xml">
+            <field name="paperformat_id" ref="orden_servicio.paperformat_orden_servicio"/>
+        </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', 'orden_servicio.company_report_document')"/>
+                </t>
+            </t>
+        </template>
+
+        <template id="servicio_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>

+ 2 - 0
security/ir.model.access.csv

@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_orden_servicio,Order Service Access,model_orden_servicio,base.group_sale_manager,1,1,1,1

+ 8 - 0
static/src/js/custom_script.js

@@ -0,0 +1,8 @@
+function onUbicacionGoogleLinkChange(ubicacionGoogleLink) {
+    var mapLinkRegex = /https?:\/\/www\.google\.com\/maps\/place\/[\w\-\+]+/;
+    var matches = ubicacionGoogleLink.match(mapLinkRegex);
+    if (matches && matches.length > 0) {
+        var mapLink = matches[0];
+        document.getElementById('ubicacion_google_link').value = mapLink;
+    }
+}

+ 495 - 0
views/orden_servicio.xml

@@ -0,0 +1,495 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+
+      <act_window
+            id="action_open_account_invoice_servicio"
+            name="Servicios"
+            res_model="account.invoice"
+            view_type="form"
+            view_mode="tree,form"
+            domain="[('servicio_invoice_id', '=', active_id)]"/>
+
+        <record id="tree_orden_servicio_mejorado" model="ir.ui.view">
+            <field name="name">orden.servicio.tree</field>
+            <field name="model">orden.servicio</field>
+            <field name="arch" type="xml">
+                <tree string="Orden de servicio">
+                    <field name="name"/>
+                    <field name="partner_id"/>
+                    <field name="celular_partner"/>
+                    <field name="name_obra"/>
+                    <field name="sale_order_id"/>
+                    <field name="order_date"/>
+                    <field name="planned_start_date"/>
+                    <field name="planned_end_date"/>
+                    <field name="state"/>
+                </tree>
+            </field>
+        </record>
+
+        <!-- search view -->
+
+        <record id="search_orden_servicio_mejorado" model="ir.ui.view">
+            <field name="name">orden.servicio.search</field>
+            <field name="model">orden.servicio</field>
+            <field name="arch" type="xml">
+                <search string="Orden de servicio">
+                    <field name="name"/>
+                    <field name="partner_id"/>
+                    <field name="name_obra"/>
+                    <field name="sale_order_id"/>
+                    <filter string="Mis tareas" domain="[('user_id','=',uid)]"/>
+                    <filter string="Realizada" domain="[('state','=','done')]"/>
+                    <separator/>
+                    <group expand="0" string="Group By...">
+                        <filter string="Usuario" 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_orden_servicio_mejorado" model="ir.ui.view">
+            <field name="name">orden.servicio.form</field>
+            <field name="model">orden.servicio</field>
+            <field name="arch" type="xml">
+                <form string="Orden de servicio">
+                    <header>
+                        <button name="button_in_progress" type="object" states="draft,done" string="Iniciar" 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="Hecho" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_done_back" type="object" states="done" string="En progreso" class="oe_highlight" groups="base.group_user"/>
+                        <button name="button_cancel" type="object" states="draft,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", "canceled":"red","in_progress":"blue"}'/>
+                    </header>
+                    <sheet>
+                        <div class="oe_title">
+                            <h1>
+                                <label string="Orden de servicio "/>
+                                <!-- <field name="name" class="oe_inline"/> -->
+                            </h1>
+                        </div>
+                        <div class="oe_right oe_button_box">
+                             <button
+                                 class="oe_inline oe_stat_button"
+                                 type="action"
+                                 name="%(action_open_account_invoice_servicio)d"
+                                 icon="fa-money">
+                                 <field name="invoice_count" string="Facturas" widget="statinfo" />
+                             </button>
+                         </div>
+                        <group>
+                            <group>
+                                <field name="name"/>
+                                <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="celular_partner"/>
+                                <field name="name_obra"/>
+                                <field name="name_local"/>
+                                <field name="contacto_obra"/>
+                                <field name="distancia_obra"/>
+                            </group>
+                            <group name="Dates">
+                                <field name="order_date"/>
+                                <field name="responsable"/>
+                                <field name="planned_start_date"/>
+                                <field name="planned_end_date"/>
+                                <field name="hrs_total"/>
+                                <field name="telefono_partner"/>
+                                <field name="celular_obra"/>
+                                <field name="sale_order_id"/>
+                            </group>
+                        </group>
+                        <group>
+<!-- <label for="horarios_dia" string="Horarios por día"/> -->
+                          <field name="horarios_dia" mode="tree" context="{'default_servicio_id': active_id}">
+                              <tree editable="bottom">
+                                  <field name="dia_semana"/>
+                                  <field name="hora_inicio" widget="odoo_timepicker"/>
+                                  <field name="hora_fin" widget="odoo_timepicker"/>
+                              </tree>
+                          </field>
+                      </group>
+                        <group>
+                                <field name="ubicacion_google_link" widget="url" target="_blank"/>
+                                <field name="croquis"/>
+                                <field name="zona_obra"/>
+                        </group>
+                        <notebook>
+                            <page>
+                                <span style="font-weight:bold;">Fotos de la Obra</span>
+                                <field name="fotos_obras" widget="many2many_binary"/>
+                            </page>
+                        </notebook>
+                        <notebook>
+                            <page>
+                                <span style="font-weight:bold;">Facturas relacionadas a esta Orden de Servicio</span>
+                                <field name="invoice_ids"/>
+                            </page>
+                        </notebook>
+                        <notebook>
+                            <page>
+                                <span style="font-weight:bold;">Productos a utilizar</span>
+                                <field name="product_ids" attrs="{'readonly': [('state','=','done')]}"/>
+                            </page>
+
+                        </notebook>
+                        <notebook>
+                            <page>
+                                <span style="font-weight:bold;">Insumos para colocación a utilizar</span>
+                                <field name="insumos_ids" attrs="{'readonly': [('state','=','done')]}"/>
+                            </page>
+                        </notebook>
+                        <notebook>
+                            <page>
+                                <span style="font-weight:bold;">Gastos de logística</span>
+                                <field name="logistica_ids" attrs="{'readonly': [('state','=','done')]}"/>
+                            </page>
+                        </notebook>
+                        <notebook>
+                            <page>
+                                <span style="font-weight:bold;">Devolución de productos e insumos</span>
+                                <field name="devolucion_ids" attrs="{'readonly': [('state','=','done')]}"/>
+                            </page>
+                        </notebook>
+                        <notebook>
+                            <page>
+                                <span style="font-weight:bold;">Recepción en fábrica</span>
+                                <field name="recepcion_ids" attrs="{'readonly': [('state','=','done')]}"/>
+                            </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>
+                <script type="text/javascript" src="/orden_servicio/static/src/js/custom_script.js"/>
+            </field>
+        </record>
+
+        <!-- calendar view -->
+
+        <record id="calendar_orden_servicio" model="ir.ui.view">
+            <field name="name">orden.servicio.calendar</field>
+            <field name="model">orden.servicio</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_orden_servicio" model="ir.ui.view">
+            <field name="name">orden.servicio.gatt</field>
+            <field name="model">orden.servicio</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_orden_servicio" model="ir.actions.act_window">
+            <field name="name">Orden de servicio</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">orden.servicio</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form,calendar,gantt</field>
+            <field name="search_view_id" ref="search_orden_servicio_mejorado"/>
+        </record>
+
+
+
+
+                <record id="tree_orden_servicio_producto" model="ir.ui.view">
+                  <field name="name">orden.servicio.producto.tree</field>
+                  <field name="model">servicio.producto</field>
+                  <field name="arch" type="xml">
+                      <tree string="Productos a utilizar" editable="bottom">
+                          <field name="product_id"/>
+                          <field name="categ_id"/>
+                          <field name="quantity"/>
+                          <field name="price_unit"/>
+                          <field name="subtotal"/>
+                      </tree>
+                  </field>
+              </record>
+
+                <record id="search_orden_servicio_producto" model="ir.ui.view">
+                       <field name="name">orden.servicio.producto.search</field>
+                       <field name="model">servicio.producto</field>
+                       <field name="arch" type="xml">
+                           <search string="Productos a utilizar">
+                               <field name="product_id"/>
+                               <field name="categ_id"/>
+                               <field name="quantity"/>
+                               <field name="price_unit"/>
+                               <field name="subtotal"/>
+                           </search>
+                       </field>
+                   </record>
+
+                   <record id="form_orden_servicio_producto" model="ir.ui.view">
+                       <field name="name">orden.servicio.producto.form</field>
+                       <field name="model">servicio.producto</field>
+                       <field name="arch" type="xml">
+                           <form string="Productos a utilizar">
+                               <sheet>
+                                   <group>
+                                       <field name="product_id"/>
+                                       <field name="categ_id"/>
+                                       <field name="quantity"/>
+                                       <field name="price_unit"/>
+                                       <field name="subtotal"/>
+                                   </group>
+                               </sheet>
+                           </form>
+                       </field>
+                   </record>
+
+                   <record id="action_orden_servicio_producto" model="ir.actions.act_window">
+                       <field name="name">Productos a utilizar</field>
+                       <field name="type">ir.actions.act_window</field>
+                       <field name="res_model">servicio.producto</field>
+                       <field name="view_type">form</field>
+                       <field name="view_mode">tree,form</field>
+                       <field name="search_view_id" ref="search_orden_servicio_producto"/>
+                   </record>
+
+
+
+
+        <record id="tree_orden_servicio_insumo" model="ir.ui.view">
+          <field name="name">orden.servicio.insumo.tree</field>
+          <field name="model">servicio.insumo</field>
+          <field name="arch" type="xml">
+              <tree string="Insumos para colocación" editable="bottom">
+                  <field name="product_id"/>
+                  <field name="descripcion"/>
+                  <field name="quantity"/>
+                  <field name="price_unit"/>
+                  <field name="subtotal"/>
+              </tree>
+          </field>
+      </record>
+
+        <record id="search_orden_servicio_insumo" model="ir.ui.view">
+               <field name="name">orden.servicio.insumo.search</field>
+               <field name="model">servicio.insumo</field>
+               <field name="arch" type="xml">
+                   <search string="Insumos para colocación">
+                       <field name="product_id"/>
+                       <field name="descripcion"/>
+                       <field name="quantity"/>
+                       <field name="price_unit"/>
+                       <field name="subtotal"/>
+                   </search>
+               </field>
+           </record>
+
+           <record id="form_orden_servicio_insumo" model="ir.ui.view">
+               <field name="name">orden.servicio.insumo.form</field>
+               <field name="model">servicio.insumo</field>
+               <field name="arch" type="xml">
+                   <form string="Insumos para colocación">
+                       <sheet>
+                           <group>
+                               <field name="product_id"/>
+                               <field name="descripcion"/>
+                               <field name="quantity"/>
+                               <field name="price_unit"/>
+                               <field name="subtotal"/>
+                           </group>
+                       </sheet>
+                   </form>
+               </field>
+           </record>
+
+           <record id="action_orden_servicio_insumo" model="ir.actions.act_window">
+               <field name="name">Insumos para colocación</field>
+               <field name="type">ir.actions.act_window</field>
+               <field name="res_model">servicio.insumo</field>
+               <field name="view_type">form</field>
+               <field name="view_mode">tree,form</field>
+               <field name="search_view_id" ref="search_orden_servicio_insumo"/>
+           </record>
+
+
+           <record id="tree_orden_servicio_logistica" model="ir.ui.view">
+             <field name="name">orden.servicio.logistica.tree</field>
+             <field name="model">servicio.logistica</field>
+             <field name="arch" type="xml">
+                 <tree string="Gastos de logística" editable="bottom">
+                     <field name="product_id"/>
+                     <field name="descripcion"/>
+                     <field name="quantity"/>
+                     <field name="price_unit"/>
+                     <field name="subtotal"/>
+                 </tree>
+             </field>
+           </record>
+
+           <record id="search_orden_servicio_logistica" model="ir.ui.view">
+                  <field name="name">orden.servicio.logistica.search</field>
+                  <field name="model">servicio.logistica</field>
+                  <field name="arch" type="xml">
+                      <search string="Gastos de logística">
+                          <field name="product_id"/>
+                          <field name="descripcion"/>
+                          <field name="quantity"/>
+                          <field name="price_unit"/>
+                          <field name="subtotal"/>
+                      </search>
+                  </field>
+              </record>
+
+              <record id="form_orden_servicio_logistica" model="ir.ui.view">
+                  <field name="name">orden.servicio.logistica.form</field>
+                  <field name="model">servicio.logistica</field>
+                  <field name="arch" type="xml">
+                      <form string="Gastos de logística">
+                          <sheet>
+                              <group>
+                                  <field name="product_id"/>
+                                  <field name="descripcion"/>
+                                  <field name="quantity"/>
+                                  <field name="price_unit"/>
+                                  <field name="subtotal"/>
+                              </group>
+                          </sheet>
+                      </form>
+                  </field>
+              </record>
+
+              <record id="action_orden_servicio_logistica" model="ir.actions.act_window">
+                  <field name="name">Gastos de logística</field>
+                  <field name="type">ir.actions.act_window</field>
+                  <field name="res_model">servicio.logistica</field>
+                  <field name="view_type">form</field>
+                  <field name="view_mode">tree,form</field>
+                  <field name="search_view_id" ref="search_orden_servicio_logistica"/>
+              </record>
+
+              <record id="tree_orden_devolucion_insumo" model="ir.ui.view">
+                <field name="name">orden.devolucion.insumo.tree</field>
+                <field name="model">devolucion.insumo</field>
+                <field name="arch" type="xml">
+                    <tree string="Devolución de productos e insumos" editable="bottom">
+                      <field name="product_id"/>
+                      <field name="descripcion"/>
+                      <field name="quantity"/>
+                      <field name="price_unit"/>
+                      <field name="subtotal"/>
+                    </tree>
+                </field>
+              </record>
+
+              <record id="search_orden_devolucion_insumo" model="ir.ui.view">
+                     <field name="name">orden.devolucion.insumo.search</field>
+                     <field name="model">devolucion.insumo</field>
+                     <field name="arch" type="xml">
+                         <search string="Devolución de productos e insumos">
+                           <field name="product_id"/>
+                           <field name="descripcion"/>
+                           <field name="quantity"/>
+                           <field name="price_unit"/>
+                           <field name="subtotal"/>
+                         </search>
+                     </field>
+                 </record>
+
+                 <record id="form_orden_devolucion_insumo" model="ir.ui.view">
+                     <field name="name">orden.devolucion.insumo.form</field>
+                     <field name="model">devolucion.insumo</field>
+                     <field name="arch" type="xml">
+                         <form string="Devolución de productos e insumos">
+                             <sheet>
+                                 <group>
+                                   <field name="product_id"/>
+                                   <field name="descripcion"/>
+                                   <field name="quantity"/>
+                                   <field name="price_unit"/>
+                                   <field name="subtotal"/>
+                                 </group>
+                             </sheet>
+                         </form>
+                     </field>
+                 </record>
+
+                 <record id="action_orden_devolucion_insumo" model="ir.actions.act_window">
+                     <field name="name">Devolución de productos e insumos</field>
+                     <field name="type">ir.actions.act_window</field>
+                     <field name="res_model">devolucion.insumo</field>
+                     <field name="view_type">form</field>
+                     <field name="view_mode">tree,form</field>
+                     <field name="search_view_id" ref="search_orden_devolucion_insumo"/>
+                 </record>
+
+
+                               <record id="tree_orden_recepcion_fabrica" model="ir.ui.view">
+                                 <field name="name">orden.recepcion.fabrica.tree</field>
+                                 <field name="model">recepcion.fabrica</field>
+                                 <field name="arch" type="xml">
+                                     <tree string="Recepción en fábrica" editable="bottom">
+                                       <field name="product_id"/>
+                                       <field name="descripcion"/>
+                                       <field name="quantity"/>
+                                       <field name="price_unit"/>
+                                       <field name="subtotal"/>
+                                     </tree>
+                                 </field>
+                               </record>
+
+                               <record id="search_orden_recepcion_fabrica" model="ir.ui.view">
+                                      <field name="name">orden.recepcion.fabrica.search</field>
+                                      <field name="model">recepcion.fabrica</field>
+                                      <field name="arch" type="xml">
+                                          <search string="Recepción en fábrica">
+                                            <field name="product_id"/>
+                                            <field name="descripcion"/>
+                                            <field name="quantity"/>
+                                            <field name="price_unit"/>
+                                            <field name="subtotal"/>
+                                          </search>
+                                      </field>
+                                  </record>
+
+                                  <record id="form_orden_recepcion_fabrica" model="ir.ui.view">
+                                      <field name="name">orden.recepcion.fabrica.form</field>
+                                      <field name="model">recepcion.fabrica</field>
+                                      <field name="arch" type="xml">
+                                          <form string="Recepción en fábrica">
+                                              <sheet>
+                                                  <group>
+                                                     <field name="product_id"/>
+                                                     <field name="descripcion"/>
+                                                     <field name="quantity"/>
+                                                     <field name="price_unit"/>
+                                                     <field name="subtotal"/>
+                                                  </group>
+                                              </sheet>
+                                          </form>
+                                      </field>
+                                  </record>
+
+                                  <record id="action_orden_recepcion_fabrica" model="ir.actions.act_window">
+                                      <field name="name">Recepción en fábrica</field>
+                                      <field name="type">ir.actions.act_window</field>
+                                      <field name="res_model">recepcion.fabrica</field>
+                                      <field name="view_type">form</field>
+                                      <field name="view_mode">tree,form</field>
+                                      <field name="search_view_id" ref="search_orden_recepcion_fabrica"/>
+                                  </record>
+
+
+        <menuitem id="orden_servicio_id" parent="base.menu_sales" action="action_orden_servicio" name="Orden de servicio" sequence="20"/>
+
+    </data>
+</openerp>

+ 19 - 0
views/sale_order.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+
+        <record id="view_sale_order_form_inherit" model="ir.ui.view">
+            <field name="name">sale.order.form.inherit</field>
+            <field name="model">sale.order</field>
+            <field name="inherit_id" ref="sale.view_order_form"/>
+            <field name="arch" type="xml">
+            <!-- <form> -->
+                <field name="order_line" position="after">
+                  <field name="state" invisible="1"/>
+                  <button name="open_order_service_form" string="Crear Orden de Servicio" type="object" class="oe_highlight" attrs="{'invisible': [('state', '!=', 'sale')]}"/>
+                </field>
+            <!-- </form> -->
+            </field>
+        </record>
+    </data>
+</openerp>