123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- # -*- 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'
- )
- obs_obra = fields.Text(
- string='Obs.'
- )
- 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')
|