# -*- 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( string='Cantidad', default=1, digits=(5, 3) ) 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, digits=(5, 3) ) price_unit = fields.Float( string='Precio Unit.' ) subtotal = fields.Float( string='Subtotal', compute='compute_subtotal', digits=(10, 0) ) @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, digits=(5, 3) ) price_unit = fields.Float( string='Precio Unit.' ) subtotal = fields.Float( string='Subtotal', compute='compute_subtotal', digits=(10, 0) ) @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', digits=(10, 0) ) @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')