# -*- coding: utf-8 -*- from odoo import models, fields, api class SkeenVisita(models.Model): _name = 'skeen.visita' _description = 'Visita Clínica' _order = 'date_start desc' # Identificación name = fields.Char(string='Referencia', readonly=True, copy=False) legacy_id = fields.Char(string='ID Legacy', index=True, copy=False, help='ID de la visita en el sistema legacy SKEEN') # Relaciones cita_id = fields.Many2one('skeen.cita', string='Cita Origen', ondelete='set null') partner_id = fields.Many2one('res.partner', string='Paciente', required=True, domain=[('is_patient', '=', True)]) doctor_id = fields.Many2one('hr.employee', string='Médico') cosmetologa_id = fields.Many2one('hr.employee', string='Cosmetóloga') servicio_id = fields.Many2one('skeen.servicio', string='Servicio') # Fechas date_start = fields.Datetime(string='Inicio', default=fields.Datetime.now, required=True) date_end = fields.Datetime(string='Fin') # Datos clínicos motivo = fields.Char(string='Motivo de Consulta') diagnostico = fields.Text(string='Diagnóstico') tratamiento = fields.Text(string='Tratamiento') notas = fields.Text(string='Notas') receta_text = fields.Text(string='Receta') # Estado state = fields.Selection([ ('en_curso', 'En Curso'), ('completada', 'Completada'), ('cancelada', 'Cancelada'), ], string='Estado', default='en_curso', required=True) # Origen: creada desde una cita o como consulta médica directa origen = fields.Selection([ ('cita', 'Cita'), ('consulta', 'Consulta Directa'), ], string='Origen', default='cita', required=True) # Insumos (se descargan del inventario al completar la visita) insumo_ids = fields.One2many('skeen.visita.insumo', 'visita_id', string='Insumos') insumos_descargados = fields.Boolean(string='Insumos Descargados', default=False, readonly=True, copy=False) # Adjuntos (fotos antes/después y documentos) adjunto_ids = fields.One2many('skeen.visita.adjunto', 'visita_id', string='Adjuntos') @api.model_create_multi def create(self, vals_list): for vals in vals_list: if not vals.get('name'): vals['name'] = self.env['ir.sequence'].next_by_code('skeen.visita') or 'VIS-00001' return super(SkeenVisita, self).create(vals_list) def action_complete(self): self.write({'state': 'completada', 'date_end': fields.Datetime.now()}) for visita in self: visita._descargar_insumos() def _descargar_insumos(self): """Crea el movimiento de baja en inventario por cada insumo (una sola vez)""" self.ensure_one() if self.insumos_descargados: return Move = self.env['skeen.inventario.move'] for linea in self.insumo_ids: Move.create({ 'item_id': linea.item_id.id, 'type': 'baja', 'qty': linea.qty, 'reference': self.name, 'notes': 'Consumo en visita', }) self.insumos_descargados = True def action_cancel(self): self.write({'state': 'cancelada'})