# Modulo Vacunacion **Proyecto:** clinica-veterinaria **Modulo:** VET-002 **Prioridad:** P1 - Core **Estado:** Especificacion **Fecha:** 2026-01-07 --- ## 1. DESCRIPCION GENERAL El modulo de Vacunacion gestiona la cartilla digital de vacunas de cada mascota, incluyendo esquemas por especie/edad, recordatorios automaticos, control de lotes y generacion de certificados para SENASICA. ### Proposito - Registro de vacunas aplicadas - Esquemas automaticos por especie - Alertas de proximas vacunas - Control de lotes y caducidad - Certificados oficiales - Reporte a SENASICA (rabia) ### Alcance - Todas las especies con vacunas - Esquemas personalizables - Recordatorios multicanal (email, SMS, push) - Integracion con SENASICA - Historial completo de inmunizaciones --- ## 2. ENTIDADES ### 2.1 vacuna (catalogo) ```yaml tabla: veterinaria.vacunas descripcion: "Catalogo de vacunas disponibles" campos: - nombre: id tipo: UUID pk: true - nombre: tenant_id tipo: UUID not_null: true descripcion: "Null para vacunas globales" - nombre: codigo tipo: VARCHAR(20) unique: true descripcion: "Codigo interno" - nombre: nombre tipo: VARCHAR(200) not_null: true descripcion: "Nombre comercial" - nombre: nombre_generico tipo: VARCHAR(200) descripcion: "Nombre generico/principio activo" - nombre: fabricante tipo: VARCHAR(100) - nombre: especies_aplicables tipo: UUID[] descripcion: "Array de IDs de especies" - nombre: enfermedades_previene tipo: TEXT[] descripcion: "Enfermedades que previene" - nombre: via_administracion tipo: ENUM valores: ['subcutanea', 'intramuscular', 'intranasal', 'oral'] - nombre: dosis_ml tipo: DECIMAL(4,2) descripcion: "Dosis estandar en ml" - nombre: requiere_refuerzo tipo: BOOLEAN default: true - nombre: intervalo_refuerzo_dias tipo: INTEGER descripcion: "Dias entre aplicaciones" - nombre: intervalo_anual_dias tipo: INTEGER default: 365 descripcion: "Frecuencia de refuerzo anual" - nombre: edad_minima_semanas tipo: INTEGER descripcion: "Edad minima para aplicar" - nombre: obligatoria tipo: BOOLEAN default: false descripcion: "Si es obligatoria por ley" - nombre: reportar_senasica tipo: BOOLEAN default: false descripcion: "Si debe reportarse a SENASICA" - nombre: precio_sugerido tipo: DECIMAL(10,2) - nombre: activo tipo: BOOLEAN default: true indices: - nombre: idx_vacuna_especies tipo: GIN campos: [especies_aplicables] - nombre: idx_vacuna_senasica campos: [reportar_senasica] where: "reportar_senasica = true" seeds: # Caninos - {codigo: 'PARVO', nombre: 'Parvovirus Canino', especies: ['CAN'], obligatoria: false} - {codigo: 'MOQUILLO', nombre: 'Moquillo Canino', especies: ['CAN'], obligatoria: false} - {codigo: 'QUINTUPLE', nombre: 'Quintuple Canina', especies: ['CAN'], obligatoria: false} - {codigo: 'RABIA_CAN', nombre: 'Rabia Canina', especies: ['CAN'], obligatoria: true, reportar_senasica: true} - {codigo: 'BORDETELLA', nombre: 'Bordetella (Tos de Perrera)', especies: ['CAN'], obligatoria: false} # Felinos - {codigo: 'TRIPLE_FEL', nombre: 'Triple Felina', especies: ['FEL'], obligatoria: false} - {codigo: 'LEUCEMIA', nombre: 'Leucemia Felina', especies: ['FEL'], obligatoria: false} - {codigo: 'RABIA_FEL', nombre: 'Rabia Felina', especies: ['FEL'], obligatoria: true, reportar_senasica: true} ``` ### 2.2 esquema_vacunacion ```yaml tabla: veterinaria.esquemas_vacunacion descripcion: "Esquemas de vacunacion por especie/edad" campos: - nombre: id tipo: UUID pk: true - nombre: especie_id tipo: UUID fk: veterinaria.especies(id) not_null: true - nombre: nombre tipo: VARCHAR(100) not_null: true descripcion: "Ej: Cachorro, Adulto, Senior" - nombre: edad_inicio_semanas tipo: INTEGER descripcion: "Edad minima en semanas" - nombre: edad_fin_semanas tipo: INTEGER descripcion: "Edad maxima en semanas (null = sin limite)" - nombre: descripcion tipo: TEXT - nombre: activo tipo: BOOLEAN default: true seeds: - {especie: 'CAN', nombre: 'Cachorro (0-16 sem)', edad_inicio: 0, edad_fin: 16} - {especie: 'CAN', nombre: 'Adulto (16+ sem)', edad_inicio: 16, edad_fin: null} - {especie: 'FEL', nombre: 'Gatito (0-16 sem)', edad_inicio: 0, edad_fin: 16} - {especie: 'FEL', nombre: 'Adulto (16+ sem)', edad_inicio: 16, edad_fin: null} ``` ### 2.3 esquema_vacuna_detalle ```yaml tabla: veterinaria.esquema_vacuna_detalle descripcion: "Vacunas incluidas en cada esquema" campos: - nombre: id tipo: UUID pk: true - nombre: esquema_id tipo: UUID fk: veterinaria.esquemas_vacunacion(id) not_null: true on_delete: CASCADE - nombre: vacuna_id tipo: UUID fk: veterinaria.vacunas(id) not_null: true - nombre: semana_aplicacion tipo: INTEGER descripcion: "Semana de edad para aplicar" - nombre: orden tipo: INTEGER descripcion: "Orden de prioridad" - nombre: es_refuerzo tipo: BOOLEAN default: false descripcion: "Si es refuerzo de aplicacion anterior" indices: - nombre: uk_esquema_vacuna campos: [esquema_id, vacuna_id, semana_aplicacion] unique: true seeds_cachorro: # Esquema cachorro canino - {esquema: 'Cachorro', vacuna: 'PARVO', semana: 6, orden: 1} - {esquema: 'Cachorro', vacuna: 'QUINTUPLE', semana: 8, orden: 2} - {esquema: 'Cachorro', vacuna: 'QUINTUPLE', semana: 12, orden: 3, es_refuerzo: true} - {esquema: 'Cachorro', vacuna: 'RABIA_CAN', semana: 16, orden: 4} ``` ### 2.4 vacunacion (aplicacion) ```yaml tabla: veterinaria.vacunaciones descripcion: "Registro de vacunas aplicadas" campos: - nombre: id tipo: UUID pk: true - nombre: tenant_id tipo: UUID not_null: true - nombre: mascota_id tipo: UUID fk: veterinaria.mascotas(id) not_null: true - nombre: vacuna_id tipo: UUID fk: veterinaria.vacunas(id) not_null: true - nombre: fecha_aplicacion tipo: DATE not_null: true - nombre: fecha_proxima tipo: DATE descripcion: "Fecha sugerida de proxima aplicacion" - nombre: lote tipo: VARCHAR(50) descripcion: "Numero de lote" - nombre: fecha_caducidad_lote tipo: DATE descripcion: "Caducidad del lote usado" - nombre: fabricante tipo: VARCHAR(100) - nombre: veterinario_id tipo: UUID fk: core.usuarios(id) not_null: true descripcion: "Quien aplico" - nombre: cedula_veterinario tipo: VARCHAR(20) descripcion: "Cedula profesional (para certificados)" - nombre: consulta_id tipo: UUID fk: veterinaria.consultas(id) descripcion: "Consulta donde se aplico (si aplica)" - nombre: dosis_aplicada_ml tipo: DECIMAL(4,2) - nombre: via_administracion tipo: ENUM valores: ['subcutanea', 'intramuscular', 'intranasal', 'oral'] - nombre: sitio_aplicacion tipo: VARCHAR(50) descripcion: "Ej: muslo derecho, escapula" - nombre: reaccion_adversa tipo: BOOLEAN default: false - nombre: descripcion_reaccion tipo: TEXT - nombre: costo tipo: DECIMAL(10,2) - nombre: certificado_generado tipo: BOOLEAN default: false - nombre: certificado_url tipo: VARCHAR(500) - nombre: reportado_senasica tipo: BOOLEAN default: false - nombre: fecha_reporte_senasica tipo: TIMESTAMP - nombre: notas tipo: TEXT - nombre: created_at tipo: TIMESTAMP default: NOW() indices: - nombre: idx_vacunacion_mascota campos: [mascota_id] - nombre: idx_vacunacion_fecha campos: [fecha_aplicacion DESC] - nombre: idx_vacunacion_proxima campos: [fecha_proxima] where: "fecha_proxima IS NOT NULL" - nombre: idx_vacunacion_senasica campos: [reportado_senasica, fecha_aplicacion] where: "reportado_senasica = false" rls: - policy: "tenant_isolation" using: "tenant_id = current_tenant_id()" ``` ### 2.5 recordatorio_vacuna ```yaml tabla: veterinaria.recordatorios_vacunas descripcion: "Recordatorios programados" campos: - nombre: id tipo: UUID pk: true - nombre: vacunacion_id tipo: UUID fk: veterinaria.vacunaciones(id) not_null: true on_delete: CASCADE descripcion: "Vacunacion de referencia" - nombre: fecha_recordatorio tipo: DATE not_null: true descripcion: "Fecha para enviar recordatorio" - nombre: tipo tipo: ENUM valores: ['7_dias_antes', '3_dias_antes', '1_dia_antes', 'dia_programado', 'vencido'] - nombre: canal tipo: ENUM valores: ['email', 'sms', 'push', 'whatsapp'] - nombre: enviado tipo: BOOLEAN default: false - nombre: fecha_envio tipo: TIMESTAMP - nombre: error_envio tipo: TEXT indices: - nombre: idx_recordatorio_fecha campos: [fecha_recordatorio] where: "enviado = false" ``` --- ## 3. ESQUEMAS DE VACUNACION ### 3.1 Caninos (Perros) ```yaml cachorro_canino: - semana_6: vacuna: "Parvovirus" nota: "Primera vacuna" - semana_8: vacuna: "Quintuple (Parvovirus, Moquillo, Hepatitis, Parainfluenza, Leptospirosis)" nota: "Inicio de esquema completo" - semana_12: vacuna: "Quintuple (Refuerzo)" nota: "Refuerzo obligatorio" - semana_16: vacuna: "Rabia" nota: "Obligatoria por ley" reportar_senasica: true - semana_16: vacuna: "Bordetella (opcional)" nota: "Recomendada para perros en contacto con otros" adulto_canino: - anual: vacunas: ["Quintuple", "Rabia"] nota: "Refuerzos anuales" - cada_6_meses: vacuna: "Bordetella (opcional)" nota: "Para perros sociales" ``` ### 3.2 Felinos (Gatos) ```yaml gatito_felino: - semana_8: vacuna: "Triple Felina (Rinotraqueitis, Calicivirus, Panleucopenia)" nota: "Primera vacuna" - semana_12: vacuna: "Triple Felina (Refuerzo)" nota: "Refuerzo" - semana_12: vacuna: "Leucemia Felina" nota: "Segun riesgo" - semana_16: vacuna: "Rabia" nota: "Obligatoria" reportar_senasica: true adulto_felino: - anual: vacunas: ["Triple Felina", "Rabia"] - anual_riesgo: vacuna: "Leucemia Felina" nota: "Solo gatos de exterior o conviviendo con positivos" ``` --- ## 4. API ENDPOINTS ### Vacunaciones ```yaml endpoints: - method: GET path: /api/v1/mascotas/{mascotaId}/vacunaciones descripcion: "Historial de vacunas de una mascota" query: desde: date hasta: date response: Array de vacunaciones con detalles - method: GET path: /api/v1/mascotas/{mascotaId}/vacunaciones/pendientes descripcion: "Vacunas pendientes segun esquema" response: Array de vacunas sugeridas con fecha - method: POST path: /api/v1/mascotas/{mascotaId}/vacunaciones descripcion: "Registrar aplicacion de vacuna" body: vacuna_id: string (requerido) fecha_aplicacion: date (requerido) lote: string fabricante: string via_administracion: string sitio_aplicacion: string dosis_ml: number costo: number notas: string response: Vacunacion registrada + proxima fecha - method: GET path: /api/v1/vacunaciones/{id} descripcion: "Detalle de una vacunacion" response: Vacunacion completa - method: PATCH path: /api/v1/vacunaciones/{id}/reaccion descripcion: "Registrar reaccion adversa" body: reaccion_adversa: boolean descripcion_reaccion: string response: Vacunacion actualizada ``` ### Certificados ```yaml - method: GET path: /api/v1/vacunaciones/{id}/certificado descripcion: "Generar certificado PDF" response: PDF file - method: POST path: /api/v1/mascotas/{mascotaId}/cartilla descripcion: "Generar cartilla completa PDF" body: incluir_proximas: boolean response: PDF file ``` ### Recordatorios ```yaml - method: GET path: /api/v1/recordatorios/pendientes descripcion: "Recordatorios pendientes de envio" query: fecha: date (default: hoy) response: Array de recordatorios - method: POST path: /api/v1/recordatorios/enviar descripcion: "Procesar y enviar recordatorios" body: fecha: date response: Resumen de envios ``` ### SENASICA ```yaml - method: GET path: /api/v1/senasica/pendientes descripcion: "Vacunas de rabia pendientes de reportar" query: desde: date hasta: date response: Array de vacunaciones - method: POST path: /api/v1/senasica/reportar descripcion: "Generar reporte mensual SENASICA" body: mes: number anio: number response: Archivo de reporte + resumen ``` --- ## 5. FLUJOS DE USUARIO ### 5.1 Aplicar Vacuna ``` 1. Veterinario abre expediente de mascota 2. Ir a seccion "Vacunas" 3. Click "Nueva Vacunacion" 4. Sistema muestra: - Vacunas sugeridas segun edad/especie - Vacunas vencidas (alertas) 5. Seleccionar vacuna del catalogo 6. Completar datos: - Lote - Fabricante - Via de administracion - Sitio de aplicacion 7. Guardar 8. Sistema: - Calcula proxima fecha - Programa recordatorios - Si es rabia, marca para SENASICA 9. Ofrecer generar certificado ``` ### 5.2 Verificar Esquema ``` 1. Abrir expediente de mascota 2. Ir a seccion "Vacunas" 3. Vista de timeline muestra: - Vacunas aplicadas (verde) - Vacunas pendientes segun esquema (amarillo) - Vacunas vencidas (rojo) 4. Click en pendiente para aplicar 5. Click en aplicada para ver detalle/certificado ``` ### 5.3 Procesar Recordatorios Diarios ``` 1. Cron job diario (8am) 2. Sistema busca recordatorios con fecha = hoy 3. Por cada recordatorio: - Obtener datos de mascota y propietario - Preparar mensaje personalizado - Enviar por canal configurado - Marcar como enviado 4. Generar log de envios 5. Alertar errores a administrador ``` ### 5.4 Generar Reporte SENASICA ``` 1. Admin accede a seccion SENASICA 2. Selecciona mes/ano 3. Sistema genera reporte con: - Total vacunas de rabia aplicadas - Por especie (canino/felino) - Por municipio - Datos de veterinarios 4. Descargar en formato requerido 5. Marcar vacunaciones como reportadas ``` --- ## 6. CERTIFICADO DE VACUNACION ### Contenido del Certificado ```yaml certificado_vacunacion: encabezado: - Logo de clinica - Nombre de clinica - Direccion - Telefono - RFC datos_mascota: - Nombre - Especie y raza - Sexo - Edad - Color - Microchip (si tiene) - Foto datos_propietario: - Nombre completo - Direccion - Telefono datos_vacunacion: - Vacuna aplicada - Fecha de aplicacion - Lote - Fabricante - Fecha de proxima aplicacion - Via y sitio de administracion datos_veterinario: - Nombre completo - Cedula profesional - Firma digital pie: - Numero de folio - Fecha de emision - QR de verificacion ``` --- ## 7. INTEGRACION SENASICA ### Requerimientos del Reporte ```yaml reporte_senasica: frecuencia: "Mensual" plazo: "Primeros 5 dias del mes siguiente" datos_requeridos: - Numero de vacunas de rabia aplicadas - Desglose por especie (canino/felino) - Municipio de aplicacion - Clave de establecimiento - Datos del MVZ responsable formato: - Excel con plantilla oficial - O captura en sistema web SENASICA ``` --- ## 8. VALIDACIONES ```yaml validaciones: - regla: "Vacuna debe ser aplicable a la especie" condicion: vacuna.especies_aplicables NOT CONTAINS mascota.especie_id error: "Esta vacuna no aplica para esta especie" - regla: "Edad minima para aplicar" condicion: mascota.edad_semanas < vacuna.edad_minima_semanas error: "La mascota no tiene la edad minima para esta vacuna" - regla: "Lote no caducado" condicion: fecha_aplicacion > fecha_caducidad_lote error: "El lote de vacuna esta caducado" - regla: "Veterinario con cedula para rabia" condicion: vacuna.reportar_senasica AND NOT veterinario.cedula error: "Se requiere cedula profesional para vacunas de rabia" - regla: "No duplicar vacuna en mismo dia" condicion: EXISTS vacunacion con misma vacuna y fecha warning: "Ya existe una aplicacion de esta vacuna en la misma fecha" ``` --- ## 9. DEPENDENCIAS ### Depende de - `veterinaria.mascotas` - Paciente a vacunar - `veterinaria.propietarios` - Para recordatorios - `core.usuarios` - Veterinario que aplica - `notificaciones` - Envio de recordatorios ### Dependientes - `veterinaria.consultas` - Vinculo con consulta - `reportes` - Estadisticas de vacunacion - `facturacion` - Cobro de vacunas --- **Documento creado:** 2026-01-07 **Autor:** Agente Orquestador Workspace **Version:** 1.0.0