# -*- coding: utf-8 -*- """Respuesta (instancia llenada) de una plantilla de formulario. Guarda el snapshot de versión de la plantilla (`plantilla_version`), las respuestas como JSON en `respuestas`, la firma como PNG en `firma_imagen` (Binary) y las fotos/archivos en `skeen.formulario.adjunto`. El `token` es un HMAC que viaja en el enlace público; una vez llenada la respuesta el token deja de ser válido para reenvíos. """ from odoo import api, fields, models class SkeenFormularioRespuesta(models.Model): _name = 'skeen.formulario.respuesta' _description = 'Respuesta de formulario' _order = 'create_date desc, id desc' name = fields.Char(string='Folio', readonly=True, copy=False) plantilla_id = fields.Many2one('skeen.formulario.plantilla', string='Plantilla', required=True, ondelete='restrict', index=True) plantilla_version = fields.Integer(string='Versión de la plantilla', default=1) partner_id = fields.Many2one('res.partner', string='Paciente', required=True, ondelete='cascade', index=True, domain=[('is_patient', '=', True)]) cita_id = fields.Many2one('skeen.cita', string='Cita', ondelete='set null', index=True) respuestas = fields.Text(string='Respuestas (JSON)', default='{}') firma_imagen = fields.Binary(string='Firma (PNG)', attachment=True) firma_nombre = fields.Char(string='Firmado por') foto_ids = fields.One2many('skeen.formulario.adjunto', 'respuesta_id', string='Fotos y archivos') estado = fields.Selection([ ('borrador', 'Borrador'), ('enviado', 'Enviado'), ('llenado', 'Llenado'), ('cancelado', 'Cancelado'), ], string='Estado', default='borrador', required=True, index=True) enviado_at = fields.Datetime(string='Enviado el') llenado_at = fields.Datetime(string='Llenado el') token = fields.Char(string='Token', index=True, copy=False) canal_envio = fields.Selection([ ('whatsapp', 'WhatsApp'), ('email', 'Correo'), ('enlace', 'Enlace'), ('manual', 'Manual'), ], string='Canal de envío', default='enlace') ip_llenado = fields.Char(string='IP de llenado') creado_por_empleado = fields.Boolean(string='Llenado por el personal', default=False) notas = fields.Text(string='Notas') _sql_constraints = [ ('token_uniq', 'unique(token)', 'El token del formulario debe ser único.'), ] @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.formulario.respuesta') or 'FORM-00001') return super().create(vals_list) def tiene_firma(self): self.ensure_one() return bool(self.firma_imagen)