openapi: 3.0.3 info: title: 'Bornive-Api - Documentación Oficial ' description: 'Desarrollado por la **Fundación Nacer Para Vivir IPS** - Gestión de salud rural de los pacientes.' version: 1.0.0 servers: - url: 'http://fnpvi.nacerparavivir.org' tags: - name: 'Afinamientos y Seguimiento' description: "\nGestión de afinamientos de presión arterial para pacientes con sospecha de HTA." - name: 'Auditoría y Logs' description: "\nMódulo para el análisis y monitoreo de los logs del sistema (laravel.log), con filtros avanzados por módulo y prioridad." - name: Autenticación description: "\nEndpoints para gestionar el acceso a la API y el perfil del usuario." - name: 'Brigadas de Salud' description: "\nGestión de brigadas en campo, incluyendo sincronización de pacientes offline y entrega de medicamentos." - name: 'Encuestas de Satisfacción' description: "\nGestión de encuestas aplicadas a los pacientes para evaluar la calidad del servicio." - name: Endpoints description: '' - name: 'Envíos de Muestras (Laboratorio)' description: "\nGestión de planillas de remisión de muestras de laboratorio desde las sedes." - name: 'Estadísticas Públicas (Landing Page)' description: "\nEndpoints sin autenticación para mostrar el impacto en la landing page." - name: 'Estadísticas y Dashboard' description: "\nMódulo para obtener el resumen de actividades del usuario logueado en el mes actual o en un rango de fechas." - name: 'Gestión de Pacientes' description: "\nEndpoints para el registro, consulta y actualización de pacientes en el sistema." - name: 'Gestión de Usuarios' description: "\nAdministración de los usuarios del sistema, sus roles (admin, auxiliar, supervisor) y sedes de pertenencia." - name: Medicamentos description: "\nCatálogo de medicamentos disponibles para entrega en visitas y brigadas." - name: 'Medicamentos de Paciente' description: "\nGestión de la relación entre pacientes y los medicamentos asignados para su tratamiento." - name: 'Notificaciones Push (FCM)' description: "\nGestión de tokens de dispositivo y envío de notificaciones push a través de Firebase Cloud Messaging (FCM)." - name: Sedes description: "\nGestión de las sedes de atención en salud disponibles en el sistema." - name: 'Tamizajes de Presión Arterial (PA)' description: "\nMódulo para el tamizaje primario de pacientes, captura de signos básicos y conducta inicial." - name: 'Tests FINDRISK' description: "\nEvaluación de riesgo de padecer diabetes tipo 2 mediante el cuestionario FINDRISK." - name: 'Visitas Domiciliarias' description: "\nGestión de visitas realizadas a pacientes en su domicilio, incluyendo toma de signos vitales, fotos y firmas." paths: /api/afinamientos: get: summary: 'Listar afinamientos' operationId: listarAfinamientos description: 'Permite obtener el histórico de afinamientos realizados, filtrando por usuario, paciente o rango de fechas.' parameters: - in: query name: usuario_id description: 'ID del usuario promotor.' example: '4044680601076201931' required: false schema: type: string description: 'ID del usuario promotor.' example: '4044680601076201931' - in: query name: paciente_id description: 'ID del paciente.' example: 550e8400-e29b-41d4-a716-446655440000 required: false schema: type: string description: 'ID del paciente.' example: 550e8400-e29b-41d4-a716-446655440000 - in: query name: fecha_desde description: 'date Fecha inicial (Y-m-d).' example: '2024-01-01' required: false schema: type: string description: 'date Fecha inicial (Y-m-d).' example: '2024-01-01' - in: query name: fecha_hasta description: 'date Fecha final (Y-m-d).' example: '2024-12-31' required: false schema: type: string description: 'date Fecha final (Y-m-d).' example: '2024-12-31' responses: 200: description: success content: application/json: schema: type: array items: type: object properties: id: type: string example: uuid-123 idpaciente: type: string example: uuid-pac idusuario: type: string example: uuid-user fecha_tamizaje: type: string example: '2024-03-25' presion_arterial_tamiz: type: string example: 145/95 promedio_sistolica: type: integer example: 138 promedio_diastolica: type: integer example: 88 conducta: type: string example: 'Seguimiento en 3 meses' nombre_paciente: type: string example: 'Juan Pérez' identificacion_paciente: type: string example: '12345678' edad_paciente: type: integer example: 45 promotor_vida: type: string example: 'Maria Gomez' example: - id: uuid-123 idpaciente: uuid-pac idusuario: uuid-user fecha_tamizaje: '2024-03-25' presion_arterial_tamiz: 145/95 promedio_sistolica: 138 promedio_diastolica: 88 conducta: 'Seguimiento en 3 meses' nombre_paciente: 'Juan Pérez' identificacion_paciente: '12345678' edad_paciente: 45 promotor_vida: 'Maria Gomez' tags: - 'Afinamientos y Seguimiento' post: summary: 'Crear afinamiento' operationId: crearAfinamiento description: "Registra un nuevo ciclo de 3 tomas de afinamiento de presión arterial.\nLos promedios se calculan automáticamente en el servidor." parameters: [] responses: 200: description: 'success creation' content: application/json: schema: type: object example: message: 'Afinamiento creado exitosamente' data: id: uuid-001 promedio_sistolica: 138 promedio_diastolica: 88 properties: message: type: string example: 'Afinamiento creado exitosamente' data: type: object properties: id: type: string example: uuid-001 promedio_sistolica: type: integer example: 138 promedio_diastolica: type: integer example: 88 tags: - 'Afinamientos y Seguimiento' requestBody: required: true content: application/json: schema: type: object properties: idpaciente: type: string description: 'ID del paciente.' example: uuid-paciente procedencia: type: string description: 'Origen/Barrio del paciente.' example: Centro fecha_tamizaje: type: date description: 'Fecha del tamizaje inicial.' example: '2024-03-25' presion_arterial_tamiz: type: string description: 'Cifra PA inicial.' example: 145/95 primer_afinamiento_fecha: type: date description: 'Fecha 1era toma.' example: '2024-03-26' nullable: true presion_sistolica_1: type: integer description: 'Presión 1era toma.' example: 138 nullable: true presion_diastolica_1: type: integer description: 'Presión 1era toma.' example: 88 nullable: true segundo_afinamiento_fecha: type: string description: 'Segundo afinamiento (opcional). Must be a valid date.' example: '2026-03-26T15:20:39' nullable: true presion_sistolica_2: type: integer description: 'Must be at least 50. Must not be greater than 300.' example: 24 nullable: true presion_diastolica_2: type: integer description: 'Must be at least 30. Must not be greater than 200.' example: 8 nullable: true tercer_afinamiento_fecha: type: string description: 'Tercer afinamiento (opcional). Must be a valid date.' example: '2026-03-26T15:20:39' nullable: true presion_sistolica_3: type: integer description: 'Must be at least 50. Must not be greater than 300.' example: 6 nullable: true presion_diastolica_3: type: integer description: 'Must be at least 30. Must not be greater than 200.' example: 25 nullable: true conducta: type: string description: '' example: architecto nullable: true required: - idpaciente - procedencia - fecha_tamizaje - presion_arterial_tamiz '/api/afinamientos/{id}': get: summary: 'Consultar afinamiento' operationId: consultarAfinamiento description: 'Obtiene los detalles de un registro específico de afinamiento.' parameters: [] responses: 200: description: success content: application/json: schema: type: object example: id: uuid-123 nombre_paciente: 'Juan Pérez' promedio_sistolica: 140 promedio_diastolica: 90 properties: id: type: string example: uuid-123 nombre_paciente: type: string example: 'Juan Pérez' promedio_sistolica: type: integer example: 140 promedio_diastolica: type: integer example: 90 tags: - 'Afinamientos y Seguimiento' put: summary: 'Actualizar afinamiento' operationId: actualizarAfinamiento description: 'Permite modificar datos de tomas previas o agregar nuevas tomas al ciclo.' parameters: [] responses: { } tags: - 'Afinamientos y Seguimiento' requestBody: required: false content: application/json: schema: type: object properties: idpaciente: type: string description: 'The id of an existing record in the pacientes table.' example: null procedencia: type: string description: 'Must not be greater than 100 characters.' example: b fecha_tamizaje: type: string description: 'Must be a valid date.' example: '2026-03-26T15:20:39' presion_arterial_tamiz: type: string description: 'Must not be greater than 20 characters.' example: ngzmiyvdljnikhwa primer_afinamiento_fecha: type: string description: 'Must be a valid date.' example: '2026-03-26T15:20:39' nullable: true presion_sistolica_1: type: integer description: 'Must be at least 50. Must not be greater than 300.' example: 24 nullable: true presion_diastolica_1: type: integer description: 'Must be at least 30. Must not be greater than 200.' example: 18 nullable: true segundo_afinamiento_fecha: type: string description: 'Must be a valid date.' example: '2026-03-26T15:20:39' nullable: true presion_sistolica_2: type: integer description: 'Toma 2da toma.' example: 135 nullable: true presion_diastolica_2: type: integer description: 'Must be at least 30. Must not be greater than 200.' example: 24 nullable: true tercer_afinamiento_fecha: type: string description: 'Must be a valid date.' example: '2026-03-26T15:20:39' nullable: true presion_sistolica_3: type: integer description: 'Must be at least 50. Must not be greater than 300.' example: 8 nullable: true presion_diastolica_3: type: integer description: 'Must be at least 30. Must not be greater than 200.' example: 6 nullable: true conducta: type: string description: '' example: architecto nullable: true delete: summary: 'Eliminar afinamiento' operationId: eliminarAfinamiento description: '' parameters: [] responses: { } tags: - 'Afinamientos y Seguimiento' security: [] parameters: - in: path name: id description: 'ID del afinamiento.' example: uuid-123 required: true schema: type: string /api/mis-afinamientos: get: summary: 'Obtener afinamientos del usuario autenticado' operationId: obtenerAfinamientosDelUsuarioAutenticado description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Afinamientos y Seguimiento' security: [] '/api/afinamientos/paciente/{pacienteId}': get: summary: 'Obtener afinamientos por paciente' operationId: obtenerAfinamientosPorPaciente description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Afinamientos y Seguimiento' security: [] parameters: - in: path name: pacienteId description: '' example: architecto required: true schema: type: string /api/logs: get: summary: 'Listar y filtrar logs' operationId: listarYFiltrarLogs description: '' parameters: - in: query name: search description: 'Busqueda por texto.' example: architecto required: false schema: type: string description: 'Busqueda por texto.' example: architecto - in: query name: type description: 'Filtrar por tipo (visita, brigada, etc).' example: architecto required: false schema: type: string description: 'Filtrar por tipo (visita, brigada, etc).' example: architecto - in: query name: status description: 'Filtrar por estado (success, error, warning).' example: architecto required: false schema: type: string description: 'Filtrar por estado (success, error, warning).' example: architecto responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Auditoría y Logs' /api/logs/stats: get: summary: '' operationId: getApiLogsStats description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Auditoría y Logs' security: [] /api/logs/export: get: summary: '' operationId: getApiLogsExport description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Auditoría y Logs' security: [] /api/logs/download: get: summary: '' operationId: getApiLogsDownload description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Auditoría y Logs' security: [] /api/logs/clear: post: summary: '' operationId: postApiLogsClear description: '' parameters: [] responses: { } tags: - 'Auditoría y Logs' requestBody: required: true content: application/json: schema: type: object properties: confirm: type: boolean description: 'Must be accepted.' example: false required: - confirm security: [] '/api/logs/{id}': get: summary: '' operationId: getApiLogsId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Auditoría y Logs' security: [] parameters: - in: path name: id description: 'The ID of the log.' example: architecto required: true schema: type: string /api/login: post: summary: 'Iniciar sesión' operationId: iniciarSesin description: 'Permite a un usuario obtener un token de acceso (Bearer) proporcionando sus credenciales.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: token: 1|ABC... usuario: id: 1 nombre: Admin rol: admin sede: id: 1 nombre: 'Sede Central' properties: token: type: string example: 1|ABC... usuario: type: object properties: id: type: integer example: 1 nombre: type: string example: Admin rol: type: string example: admin sede: type: object properties: id: type: integer example: 1 nombre: type: string example: 'Sede Central' 422: description: '' content: application/json: schema: type: object example: message: 'Las credenciales proporcionadas son incorrectas.' errors: usuario: - 'Las credenciales proporcionadas son incorrectas.' properties: message: type: string example: 'Las credenciales proporcionadas son incorrectas.' errors: type: object properties: usuario: type: array example: - 'Las credenciales proporcionadas son incorrectas.' items: type: string tags: - Autenticación requestBody: required: true content: application/json: schema: type: object properties: usuario: type: string description: 'El nombre de usuario.' example: admin contrasena: type: string description: 'La contraseña del usuario.' example: secret123 required: - usuario - contrasena security: [] /api/logout: post: summary: 'Cerrar sesión' operationId: cerrarSesin description: 'Revoca el token de acceso actual del usuario autenticado.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Sesión cerrada correctamente' properties: message: type: string example: 'Sesión cerrada correctamente' tags: - Autenticación /api/perfil: get: summary: 'Ver perfil' operationId: verPerfil description: 'Obtiene la información detallada del usuario autenticado y su sede asociada.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: id: 1 nombre: Admin usuario: admin correo: admin@test.com rol: admin sede: id: 1 nombre: 'Sede Central' properties: id: type: integer example: 1 nombre: type: string example: Admin usuario: type: string example: admin correo: type: string example: admin@test.com rol: type: string example: admin sede: type: object properties: id: type: integer example: 1 nombre: type: string example: 'Sede Central' tags: - Autenticación put: summary: 'Actualizar perfil' operationId: actualizarPerfil description: 'Permite al usuario autenticado actualizar su nombre, correo y contraseña.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Perfil actualizado correctamente' usuario: id: 1 nombre: 'Juan Perez' correo: juan@test.com properties: message: type: string example: 'Perfil actualizado correctamente' usuario: type: object properties: id: type: integer example: 1 nombre: type: string example: 'Juan Perez' correo: type: string example: juan@test.com 422: description: '' content: application/json: schema: type: object example: error: 'La contrasena actual no es correcta' properties: error: type: string example: 'La contrasena actual no es correcta' tags: - Autenticación requestBody: required: false content: application/json: schema: type: object properties: nombre: type: string description: 'El nombre completo.' example: 'Juan Perez' correo: type: string description: 'El correo electrónico.' example: juan@test.com contrasena_actual: type: string description: 'La contraseña actual (requerida si se cambia la nueva).' example: architecto contrasena_nueva: type: string description: 'La nueva contraseña (mínimo 6 caracteres).' example: architecto /api/brigadas: get: summary: 'Listar brigadas' operationId: listarBrigadas description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Brigadas de Salud' post: summary: 'Crear brigada' operationId: crearBrigada description: 'Permite crear una brigada y sincronizar los pacientes que fueron capturados offline.' parameters: [] responses: { } tags: - 'Brigadas de Salud' requestBody: required: true content: application/json: schema: type: object properties: lugar_evento: type: string description: 'Nombre del lugar.' example: 'Vereda El Cairo' fecha_brigada: type: date description: 'Fecha del evento.' example: architecto tema: type: string description: 'Tema desarrollado.' example: 'Charla HTA' pacientes: type: array description: 'Array de IDs de pacientes (reales u offline_ID).' example: - uuid-1 - offline_2 items: type: string pacientes_data: type: array description: 'Datos completos de pacientes offline para auto-creación.' example: - [] items: type: object required: - lugar_evento - fecha_brigada - tema - pacientes '/api/brigadas/{id}': get: summary: '' operationId: getApiBrigadasId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Brigadas de Salud' security: [] parameters: - in: path name: id description: 'The ID of the brigada.' example: architecto required: true schema: type: string /api/encuestas: get: summary: 'Listar todas las encuestas' operationId: listarTodasLasEncuestas description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Encuestas de Satisfacción' post: summary: 'Crear encuesta' operationId: crearEncuesta description: '' parameters: [] responses: { } tags: - 'Encuestas de Satisfacción' requestBody: required: true content: application/json: schema: type: object properties: id: type: string description: 'UUID único para la encuesta.' example: uuid-abc idpaciente: type: string description: 'ID del paciente.' example: uuid-pac idsede: type: string description: 'ID de la sede.' example: '1' domicilio: type: string description: 'Must not be greater than 255 characters.' example: 'n' entidad_afiliada: type: string description: 'Must not be greater than 100 characters.' example: g nullable: true fecha: type: string description: 'Must be a valid date.' example: '2026-03-26T15:20:39' respuestas_calificacion: type: json description: 'JSON con calificaciones (Excelente, Bueno, etc).' example: '["Excelente", "Bueno"]' respuestas_adicionales: type: json description: 'JSON con respuestas abiertas.' example: '{"pregunta1": "Respuesta"}' sugerencias: type: string description: 'Must not be greater than 1000 characters.' example: 'n' nullable: true required: - id - idpaciente - idsede - domicilio - fecha - respuestas_calificacion - respuestas_adicionales '/api/encuestas/{id}': get: summary: 'Consultar encuesta' operationId: consultarEncuesta description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Encuestas de Satisfacción' put: summary: 'Actualizar encuesta' operationId: actualizarEncuesta description: '' parameters: [] responses: { } tags: - 'Encuestas de Satisfacción' delete: summary: '' operationId: deleteApiEncuestasId description: '' parameters: [] responses: { } tags: - 'Encuestas de Satisfacción' security: [] parameters: - in: path name: id description: 'ID de la encuesta.' example: architecto required: true schema: type: string /api/mis-encuestas: get: summary: '' operationId: getApiMisEncuestas description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Encuestas de Satisfacción' security: [] '/api/encuestas/paciente/{idpaciente}': get: summary: '' operationId: getApiEncuestasPacienteIdpaciente description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Encuestas de Satisfacción' security: [] parameters: - in: path name: idpaciente description: '' example: architecto required: true schema: type: string '/api/encuestas/usuario/{idusuario}': get: summary: '' operationId: getApiEncuestasUsuarioIdusuario description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Encuestas de Satisfacción' security: [] parameters: - in: path name: idusuario description: '' example: architecto required: true schema: type: string '/api/encuestas/sede/{idsede}': get: summary: '' operationId: getApiEncuestasSedeIdsede description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Encuestas de Satisfacción' security: [] parameters: - in: path name: idsede description: '' example: architecto required: true schema: type: string /api/encuestas-estadisticas: get: summary: '' operationId: getApiEncuestasEstadisticas description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Encuestas de Satisfacción' security: [] /api/health: get: summary: 'Health Check' operationId: healthCheck description: 'Verifica si la API está respondiendo correctamente.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: status: ok timestamp: '2026-03-26T15:20:38.831636Z' properties: status: type: string example: ok timestamp: type: string example: '2026-03-26T15:20:38.831636Z' tags: - Endpoints security: [] /api/envio-muestras: get: summary: 'Listar envíos de muestras' operationId: listarEnvosDeMuestras description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Envíos de Muestras (Laboratorio)' post: summary: 'Crear planilla de envío' operationId: crearPlanillaDeEnvo description: 'Permite registrar una nueva planilla de remisión de muestras a laboratorio.' parameters: [] responses: { } tags: - 'Envíos de Muestras (Laboratorio)' requestBody: required: true content: application/json: schema: type: object properties: fecha: type: date description: 'Fecha del envío.' example: architecto idsede: type: string description: 'ID de la sede remitente.' example: architecto detalles: type: array description: 'Lista de muestras por paciente.' example: - [] items: type: object properties: paciente_id: type: string description: 'The id of an existing record in the pacientes table.' example: architecto numero_orden: type: integer description: 'Must be at least 1.' example: 22 '*': type: object description: '' example: paciente_id: architecto properties: paciente_id: type: string description: 'ID del paciente.' example: architecto numero_orden: type: integer description: 'Número de orden de laboratorio.' example: 16 required: - paciente_id - numero_orden required: - paciente_id - numero_orden responsable_transporte_id: type: string description: 'Must not be greater than 255 characters.' example: b nullable: true responsable_recepcion_id: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true required: - fecha - idsede - detalles '/api/envio-muestras/{id}': get: summary: '' operationId: getApiEnvioMuestrasId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Envíos de Muestras (Laboratorio)' security: [] put: summary: '' operationId: putApiEnvioMuestrasId description: '' parameters: [] responses: { } tags: - 'Envíos de Muestras (Laboratorio)' requestBody: required: false content: application/json: schema: type: object properties: fecha: type: string description: 'Must be a valid date.' example: '2026-03-26T15:20:39' idsede: type: string description: 'The id of an existing record in the sedes table.' example: null responsable_transporte_id: type: string description: 'Must not be greater than 255 characters.' example: b nullable: true responsable_recepcion_id: type: string description: 'Must not be greater than 255 characters.' example: 'n' nullable: true security: [] delete: summary: '' operationId: deleteApiEnvioMuestrasId description: '' parameters: [] responses: { } tags: - 'Envíos de Muestras (Laboratorio)' security: [] parameters: - in: path name: id description: 'The ID of the envio muestra.' example: architecto required: true schema: type: string '/api/envio-muestras/sede/{sedeId}': get: summary: '' operationId: getApiEnvioMuestrasSedeSedeId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Envíos de Muestras (Laboratorio)' security: [] parameters: - in: path name: sedeId description: '' example: architecto required: true schema: type: string '/api/envio-muestras/por-fecha-salida/{fecha}': get: summary: '' operationId: getApiEnvioMuestrasPorFechaSalidaFecha description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Envíos de Muestras (Laboratorio)' security: [] parameters: - in: path name: fecha description: '' example: architecto required: true schema: type: string '/api/envio-muestras/{id}/actualizar-estado-correo': put: summary: 'Actualizar estado de correo (marcar como enviado/no enviado)' operationId: actualizarEstadoDeCorreomarcarComoEnviadonoEnviado description: '' parameters: [] responses: { } tags: - 'Envíos de Muestras (Laboratorio)' security: [] parameters: - in: path name: id description: 'The ID of the envio muestra.' example: architecto required: true schema: type: string /api/v1/public/mapa-calor: get: summary: 'Mapa de Calor (v1)' operationId: mapaDeCalorv1 description: "Retorna los puntos geográficos agrupados por zona de visita y sede para el mapa de calor de la landing.\nLos datos están cacheados por 1 hora con Redis." parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true data: - zona: '208' sede_principal: cajibio lat: 2.5706 lng: -76.6619 impacto_visitas: 1 - zona: '3219342703' sede_principal: cajibio lat: 2.723 lng: -76.6584 impacto_visitas: 1 - zona: achiral sede_principal: cajibio lat: 2.6761 lng: -76.8252 impacto_visitas: 1 - zona: altamira sede_principal: cajibio lat: 2.6644 lng: -76.7318 impacto_visitas: 9 - zona: 'ALTO GRANDE' sede_principal: cajibio lat: 2.6222 lng: -76.6076 impacto_visitas: 39 - zona: 'alto piendamo' sede_principal: piendamo lat: 2.6472 lng: -76.6082 impacto_visitas: 1 - zona: arroyuela sede_principal: cajibio lat: 2.6531 lng: -76.6849 impacto_visitas: 5 - zona: AURELIA sede_principal: cajibio lat: 2.6412 lng: -76.6198 impacto_visitas: 8 - zona: B/piendalinda sede_principal: cajibio lat: 2.6459 lng: -76.5346 impacto_visitas: 1 - zona: 'bajo carrizal' sede_principal: cajibio lat: 2.5977 lng: -76.6684 impacto_visitas: 1 - zona: 'barrio Betania' sede_principal: cajibio lat: 2.6361 lng: -76.7313 impacto_visitas: 2 - zona: 'Barrio Fátima' sede_principal: morales lat: 2.7584 lng: -76.631 impacto_visitas: 1 - zona: 'Barrio La Floresta' sede_principal: morales lat: 2.7584 lng: -76.6312 impacto_visitas: 2 - zona: 'Barrio Modelo' sede_principal: morales lat: 2.7584 lng: -76.631 impacto_visitas: 2 - zona: 'barrio villamarcela' sede_principal: piendamo lat: 2.6365 lng: -76.5265 impacto_visitas: 1 - zona: Bet sede_principal: cajibio lat: 2.5862 lng: -76.7405 impacto_visitas: 1 - zona: Betania sede_principal: cajibio lat: 2.5843 lng: -76.7534 impacto_visitas: 7 - zona: 'Buena vista' sede_principal: cajibio lat: 2.6918 lng: -76.6755 impacto_visitas: 8 - zona: Buenavista sede_principal: cajibio lat: 2.6916 lng: -76.6772 impacto_visitas: 14 - zona: CAJIBIO sede_principal: cajibio lat: 2.6331 lng: -76.5912 impacto_visitas: 13 - zona: 'CAJIBIO 2' sede_principal: cajibio lat: 2.62 lng: -76.5796 impacto_visitas: 1 - zona: 'CAJIBIO 3' sede_principal: cajibio lat: 2.6136 lng: -76.632 impacto_visitas: 1 - zona: 'CAJIBIO 1' sede_principal: cajibio lat: 2.6194 lng: -76.5954 impacto_visitas: 3 - zona: 'CAJIBIO 2' sede_principal: cajibio lat: 2.6247 lng: -76.6261 impacto_visitas: 85 - zona: 'CAJIBIO 3' sede_principal: cajibio lat: 2.6124 lng: -76.6094 impacto_visitas: 36 - zona: 'CAJIBIO 4' sede_principal: cajibio lat: 2.6237 lng: -76.6264 impacto_visitas: 7 - zona: CAJIBIO4 sede_principal: cajibio lat: 2.6367 lng: -76.648 impacto_visitas: 1 - zona: 'CAJIBO 3' sede_principal: cajibio lat: 2.6238 lng: -76.5697 impacto_visitas: 1 - zona: 'campa alegre sector la selva' sede_principal: piendamo lat: 2.73 lng: -76.5869 impacto_visitas: 1 - zona: 'Campo Alegre' sede_principal: cajibio lat: 2.5777 lng: -76.7247 impacto_visitas: 3 - zona: Campoalegre sede_principal: cajibio lat: 2.5759 lng: -76.7208 impacto_visitas: 6 - zona: capilla sede_principal: cajibio lat: 2.5803 lng: -76.6232 impacto_visitas: 10 - zona: carmelo sede_principal: cajibio lat: 2.6673 lng: -76.7008 impacto_visitas: 32 - zona: carrizal sede_principal: cajibio lat: 2.597 lng: -76.6639 impacto_visitas: 31 - zona: 'casas bajas' sede_principal: cajibio lat: 2.6381 lng: -76.7333 impacto_visitas: 2 - zona: 'CASAS BAJAS' sede_principal: cajibio lat: 2.642 lng: -76.7341 impacto_visitas: 132 - zona: Casitas sede_principal: cajibio lat: 2.6904 lng: -76.6559 impacto_visitas: 2 - zona: 'CERRO BAJÓ' sede_principal: morales lat: 2.7514 lng: -76.7019 impacto_visitas: 2 - zona: 'CERRO BAJO' sede_principal: morales lat: 2.7516 lng: -76.7008 impacto_visitas: 5 - zona: cidral sede_principal: cajibio lat: 2.6751 lng: -76.6708 impacto_visitas: 24 - zona: 'cidral 9' sede_principal: cajibio lat: 2.6688 lng: -76.6629 impacto_visitas: 1 - zona: 'cidral ojo' sede_principal: cajibio lat: 2.6688 lng: -76.6628 impacto_visitas: 1 - zona: COHETERA sede_principal: cajibio lat: 2.6437 lng: -76.6293 impacto_visitas: 30 - zona: diamante sede_principal: cajibio lat: 2.6774 lng: -76.7275 impacto_visitas: 2 - zona: dinde sede_principal: cajibio lat: 2.6971 lng: -76.7581 impacto_visitas: 187 - zona: 'el cidral' sede_principal: cajibio lat: 2.6811 lng: -76.6751 impacto_visitas: 16 - zona: 'el cidral L9' sede_principal: cajibio lat: 2.674 lng: -76.6769 impacto_visitas: 1 - zona: 'el lago' sede_principal: cajibio lat: 2.5753 lng: -76.604 impacto_visitas: 1 - zona: Fátima sede_principal: morales lat: 2.7584 lng: -76.631 impacto_visitas: 1 - zona: finde sede_principal: cajibio lat: 2.6865 lng: -76.7607 impacto_visitas: 1 - zona: Florida sede_principal: cajibio lat: 2.5709 lng: -76.6947 impacto_visitas: 4 - zona: Granja sede_principal: cajibio lat: 2.6519 lng: -76.6093 impacto_visitas: 3 - zona: guangubio sede_principal: cajibio lat: 2.5815 lng: -76.6729 impacto_visitas: 67 - zona: independencia sede_principal: cajibio lat: 2.7156 lng: -76.7199 impacto_visitas: 9 - zona: independiente sede_principal: cajibio lat: 2.7095 lng: -76.7176 impacto_visitas: 1 - zona: jardín sede_principal: cajibio lat: 2.5937 lng: -76.6798 impacto_visitas: 1 - zona: 'l granja' sede_principal: cajibio lat: 2.6487 lng: -76.6107 impacto_visitas: 6 - zona: 'l palma' sede_principal: cajibio lat: 2.6655 lng: -76.6249 impacto_visitas: 1 - zona: 'l pedregosa' sede_principal: cajibio lat: 2.6666 lng: -76.6278 impacto_visitas: 1 - zona: 'l. a palma' sede_principal: cajibio lat: 2.6672 lng: -76.6272 impacto_visitas: 1 - zona: 'l. Granja' sede_principal: cajibio lat: 2.751 lng: -76.6696 impacto_visitas: 1 - zona: 'l. palma' sede_principal: cajibio lat: 2.6663 lng: -76.6259 impacto_visitas: 1 - zona: 'la arroyuela' sede_principal: cajibio lat: 2.6458 lng: -76.655 impacto_visitas: 5 - zona: 'LA AURELIA' sede_principal: cajibio lat: 2.6581 lng: -76.6207 impacto_visitas: 1 - zona: 'la balsa' sede_principal: cajibio lat: 2.5838 lng: -76.6722 impacto_visitas: 1 - zona: 'La Florida' sede_principal: cajibio lat: 2.5602 lng: -76.6945 impacto_visitas: 1 - zona: 'la granja' sede_principal: cajibio lat: 2.653 lng: -76.6128 impacto_visitas: 78 - zona: 'la granja' sede_principal: piendamo lat: 2.6472 lng: -76.6082 impacto_visitas: 1 - zona: 'la palma' sede_principal: cajibio lat: 2.6647 lng: -76.625 impacto_visitas: 134 - zona: 'la palma pedregosa' sede_principal: cajibio lat: 2.6723 lng: -76.6232 impacto_visitas: 1 - zona: 'La pama' sede_principal: cajibio lat: 2.669 lng: -76.6307 impacto_visitas: 1 - zona: 'la pedregosa' sede_principal: cajibio lat: 2.6684 lng: -76.64 impacto_visitas: 35 - zona: 'la unión' sede_principal: cajibio lat: 2.5936 lng: -76.603 impacto_visitas: 6 - zona: 'la, palma' sede_principal: cajibio lat: 2.6632 lng: -76.6284 impacto_visitas: 3 - zona: 'la. Granja' sede_principal: cajibio lat: 2.6454 lng: -76.6048 impacto_visitas: 2 - zona: 'laa casitas' sede_principal: cajibio lat: 2.6897 lng: -76.6725 impacto_visitas: 2 - zona: lago sede_principal: cajibio lat: 2.5792 lng: -76.6023 impacto_visitas: 1 - zona: laguna sede_principal: cajibio lat: 2.7027 lng: -76.7704 impacto_visitas: 77 - zona: 'laguna dinde' sede_principal: cajibio lat: 2.7062 lng: -76.7754 impacto_visitas: 24 - zona: 'las casitas' sede_principal: cajibio lat: 2.691 lng: -76.658 impacto_visitas: 62 - zona: 'loma corta' sede_principal: piendamo lat: 2.7271 lng: -76.5519 impacto_visitas: 1 - zona: 'loma larga' sede_principal: cajibio lat: 2.5685 lng: -76.6064 impacto_visitas: 5 - zona: 'Los Pinos' sede_principal: cajibio lat: 2.5731 lng: -76.6684 impacto_visitas: 1 - zona: MATARREDONDA sede_principal: morales lat: 2.7379 lng: -76.6653 impacto_visitas: 3 - zona: MESETA sede_principal: cajibio lat: 2.5904 lng: -76.6956 impacto_visitas: 18 - zona: michinchal sede_principal: cajibio lat: 2.688 lng: -76.7056 impacto_visitas: 24 - zona: monterredondo sede_principal: cajibio lat: 2.6624 lng: -76.7159 impacto_visitas: 3 - zona: MORALES sede_principal: morales lat: 2.7322 lng: -76.6541 impacto_visitas: 1 - zona: mucho sede_principal: cajibio lat: 2.6721 lng: -76.7027 impacto_visitas: 1 - zona: 'Nuevo horizonte' sede_principal: cajibio lat: 2.5961 lng: -76.6953 impacto_visitas: 26 - zona: ortega sede_principal: cajibio lat: 2.683 lng: -76.7973 impacto_visitas: 148 - zona: pal sede_principal: cajibio lat: 2.5614 lng: -76.613 impacto_visitas: 1 - zona: palace sede_principal: cajibio lat: 2.563 lng: -76.6137 impacto_visitas: 34 - zona: palma sede_principal: cajibio lat: 2.6598 lng: -76.6221 impacto_visitas: 35 - zona: palomera sede_principal: piendamo lat: 2.6792 lng: -76.5335 impacto_visitas: 1 - zona: 'PAN DE AZUCAR' sede_principal: morales lat: 2.7418 lng: -76.7019 impacto_visitas: 5 - zona: 'PAN de azúcar. san francisco cajibio' sede_principal: cajibio lat: 2.7353 lng: -76.7025 impacto_visitas: 1 - zona: Pedregosa sede_principal: cajibio lat: 2.6755 lng: -76.646 impacto_visitas: 89 - zona: pinos sede_principal: cajibio lat: 2.5724 lng: -76.6677 impacto_visitas: 13 - zona: PLAYON sede_principal: morales lat: 2.7364 lng: -76.7268 impacto_visitas: 5 - zona: poooo sede_principal: cajibio lat: 2.6234 lng: -76.571 impacto_visitas: 1 - zona: PORVENIR sede_principal: cajibio lat: 2.6476 lng: -76.649 impacto_visitas: 3 - zona: PPRIMAVERA sede_principal: cajibio lat: 2.6221 lng: -76.6578 impacto_visitas: 1 - zona: PRIMAVERA sede_principal: cajibio lat: 2.6214 lng: -76.6549 impacto_visitas: 104 - zona: PRIMAVERA⁶ sede_principal: cajibio lat: 2.6243 lng: -76.6621 impacto_visitas: 1 - zona: Recuerdo sede_principal: cajibio lat: 2.6229 lng: -76.7599 impacto_visitas: 27 - zona: 'Recuerdo Bajo' sede_principal: cajibio lat: 2.6334 lng: -76.7692 impacto_visitas: 6 - zona: 'Recuerdo Bajo 0' sede_principal: cajibio lat: 2.6032 lng: -76.7779 impacto_visitas: 1 - zona: Rosario sede_principal: cajibio lat: 2.6119 lng: -76.736 impacto_visitas: 69 - zona: ROSARIO sede_principal: morales lat: 2.7375 lng: -76.6681 impacto_visitas: 18 - zona: 'Rural El Rosario' sede_principal: morales lat: 2.7324 lng: -76.6672 impacto_visitas: 2 - zona: 'rural San Roque' sede_principal: cajibio lat: 2.7252 lng: -76.7643 impacto_visitas: 1 - zona: salero sede_principal: cajibio lat: 2.6441 lng: -76.5276 impacto_visitas: 1 - zona: 'san jose' sede_principal: cajibio lat: 2.6641 lng: -76.7003 impacto_visitas: 1 - zona: 'san antonio' sede_principal: cajibio lat: 2.7247 lng: -76.6928 impacto_visitas: 23 - zona: 'san Gabriel' sede_principal: cajibio lat: 2.6228 lng: -76.704 impacto_visitas: 69 - zona: 'san jose' sede_principal: cajibio lat: 2.6736 lng: -76.6782 impacto_visitas: 20 - zona: 'san jose' sede_principal: piendamo lat: 2.708 lng: -76.5737 impacto_visitas: 1 - zona: 'san jose carmelo' sede_principal: cajibio lat: 2.689 lng: -76.6986 impacto_visitas: 15 - zona: 'San Lorenzo' sede_principal: cajibio lat: 2.6127 lng: -76.769 impacto_visitas: 10 - zona: 'san Migue' sede_principal: cajibio lat: 2.6976 lng: -76.7549 impacto_visitas: 1 - zona: 'SAN RAFAEL' sede_principal: morales lat: 2.7352 lng: -76.6384 impacto_visitas: 3 - zona: si sede_principal: cajibio lat: 2.6234 lng: -76.571 impacto_visitas: 2 - zona: siii sede_principal: cajibio lat: 2.6234 lng: -76.571 impacto_visitas: 1 - zona: 'SOCORRO BAJÓ' sede_principal: morales lat: 2.7364 lng: -76.7414 impacto_visitas: 2 - zona: 'SOCORRO BAJO' sede_principal: morales lat: 2.7356 lng: -76.7414 impacto_visitas: 1 - zona: tigre sede_principal: cajibio lat: 2.608 lng: -76.695 impacto_visitas: 83 - zona: 'Tropical Tumaco' sede_principal: cajibio lat: 2.5932 lng: -76.7659 impacto_visitas: 5 - zona: Tumaco sede_principal: cajibio lat: 2.5957 lng: -76.7643 impacto_visitas: 12 - zona: TUNEL sede_principal: cajibio lat: 2.5534 lng: -76.5544 impacto_visitas: 3 - zona: tunia sede_principal: piendamo lat: 2.7271 lng: -76.5519 impacto_visitas: 1 - zona: unión sede_principal: cajibio lat: 2.5929 lng: -76.6061 impacto_visitas: 44 - zona: 'v/ uvales' sede_principal: piendamo lat: 2.7332 lng: -76.5693 impacto_visitas: 1 - zona: 'v/campo alegre' sede_principal: piendamo lat: 2.7334 lng: -76.5806 impacto_visitas: 1 - zona: v/salinas sede_principal: piendamo lat: 2.8241 lng: -76.5847 impacto_visitas: 1 - zona: VENTA sede_principal: cajibio lat: 2.5873 lng: -76.5595 impacto_visitas: 9 - zona: 'vereda cacahual' sede_principal: cajibio lat: 2.6924 lng: -76.7302 impacto_visitas: 1 - zona: 'vereda diamante' sede_principal: cajibio lat: 2.6733 lng: -76.7129 impacto_visitas: 1 - zona: 'vereda altamira' sede_principal: cajibio lat: 2.6699 lng: -76.7354 impacto_visitas: 5 - zona: 'vereda alto piendamo' sede_principal: piendamo lat: 2.6472 lng: -76.6082 impacto_visitas: 1 - zona: 'vereda arroyuela' sede_principal: cajibio lat: 2.6456 lng: -76.6686 impacto_visitas: 3 - zona: 'vereda buena vista' sede_principal: cajibio lat: 2.6904 lng: -76.6725 impacto_visitas: 2 - zona: 'vereda cacahual' sede_principal: cajibio lat: 2.6919 lng: -76.7272 impacto_visitas: 89 - zona: 'vereda campo alegre' sede_principal: piendamo lat: 2.7317 lng: -76.5837 impacto_visitas: 2 - zona: 'vereda campo alegre9' sede_principal: piendamo lat: 2.73 lng: -76.5869 impacto_visitas: 1 - zona: 'vereda carmelo' sede_principal: cajibio lat: 2.6641 lng: -76.7022 impacto_visitas: 1 - zona: 'vereda casas bajas' sede_principal: cajibio lat: 2.6511 lng: -76.7326 impacto_visitas: 1 - zona: 'vereda diamante' sede_principal: cajibio lat: 2.6828 lng: -76.7207 impacto_visitas: 3 - zona: 'vereda el cidral' sede_principal: cajibio lat: 2.6774 lng: -76.6764 impacto_visitas: 2 - zona: 'vereda el diamante' sede_principal: cajibio lat: 2.6837 lng: -76.7199 impacto_visitas: 3 - zona: 'Vereda El Maco' sede_principal: morales lat: 2.7586 lng: -76.6314 impacto_visitas: 2 - zona: 'vereda granja' sede_principal: cajibio lat: 2.6472 lng: -76.6082 impacto_visitas: 1 - zona: 'vereda independencia' sede_principal: cajibio lat: 2.7143 lng: -76.7196 impacto_visitas: 21 - zona: 'vereda la arroyuela' sede_principal: cajibio lat: 2.6494 lng: -76.6705 impacto_visitas: 3 - zona: 'vereda la aurelia' sede_principal: cajibio lat: 2.6486 lng: -76.5961 impacto_visitas: 2 - zona: 'vereda la aurelia.' sede_principal: cajibio lat: 2.6451 lng: -76.5952 impacto_visitas: 1 - zona: 'vereda la esmeralda' sede_principal: piendamo lat: 2.6938 lng: -76.5394 impacto_visitas: 1 - zona: 'vereda la granja' sede_principal: cajibio lat: 2.6452 lng: -76.6038 impacto_visitas: 1 - zona: 'vereda la palma' sede_principal: cajibio lat: 2.6639 lng: -76.6251 impacto_visitas: 6 - zona: 'vereda la palomera tunia' sede_principal: piendamo lat: 2.6792 lng: -76.5335 impacto_visitas: 1 - zona: 'Vereda loma de bogota' sede_principal: piendamo lat: 2.7271 lng: -76.5519 impacto_visitas: 1 - zona: 'Vereda Maci' sede_principal: morales lat: 2.7586 lng: -76.6314 impacto_visitas: 1 - zona: 'Vereda Maco' sede_principal: morales lat: 2.7586 lng: -76.6314 impacto_visitas: 1 - zona: 'vereda michinchal' sede_principal: cajibio lat: 2.6895 lng: -76.7055 impacto_visitas: 37 - zona: 'vereda puerta chiquita' sede_principal: cajibio lat: 2.6311 lng: -76.6786 impacto_visitas: 1 - zona: 'vereda salero' sede_principal: cajibio lat: 2.6865 lng: -76.6665 impacto_visitas: 3 - zona: 'vereda san g' sede_principal: cajibio lat: 2.6221 lng: -76.6982 impacto_visitas: 1 - zona: 'vereda san Gabriel' sede_principal: cajibio lat: 2.6239 lng: -76.7049 impacto_visitas: 75 - zona: 'vereda san jose' sede_principal: cajibio lat: 2.6833 lng: -76.7223 impacto_visitas: 1 - zona: 'vereda san jose' sede_principal: piendamo lat: 2.708 lng: -76.5737 impacto_visitas: 2 - zona: 'vereda san miguel' sede_principal: cajibio lat: 2.691 lng: -76.5756 impacto_visitas: 2 - zona: 'vereda vivas Balcazar' sede_principal: piendamo lat: 2.678 lng: -76.5281 impacto_visitas: 1 - zona: veredactunia sede_principal: piendamo lat: 2.6938 lng: -76.5394 impacto_visitas: 1 - zona: 'villa marcela' sede_principal: piendamo lat: 2.6365 lng: -76.5265 impacto_visitas: 1 - zona: villermosa sede_principal: cajibio lat: 2.6678 lng: -76.6598 impacto_visitas: 1 - zona: VIUDA sede_principal: cajibio lat: 2.5656 lng: -76.5918 impacto_visitas: 4 - zona: x sede_principal: cajibio lat: 2.6744 lng: -76.7303 impacto_visitas: 2 version: v1 cache: true properties: success: type: boolean example: true data: type: array example: - zona: '208' sede_principal: cajibio lat: 2.5706 lng: -76.6619 impacto_visitas: 1 - zona: '3219342703' sede_principal: cajibio lat: 2.723 lng: -76.6584 impacto_visitas: 1 - zona: achiral sede_principal: cajibio lat: 2.6761 lng: -76.8252 impacto_visitas: 1 - zona: altamira sede_principal: cajibio lat: 2.6644 lng: -76.7318 impacto_visitas: 9 - zona: 'ALTO GRANDE' sede_principal: cajibio lat: 2.6222 lng: -76.6076 impacto_visitas: 39 - zona: 'alto piendamo' sede_principal: piendamo lat: 2.6472 lng: -76.6082 impacto_visitas: 1 - zona: arroyuela sede_principal: cajibio lat: 2.6531 lng: -76.6849 impacto_visitas: 5 - zona: AURELIA sede_principal: cajibio lat: 2.6412 lng: -76.6198 impacto_visitas: 8 - zona: B/piendalinda sede_principal: cajibio lat: 2.6459 lng: -76.5346 impacto_visitas: 1 - zona: 'bajo carrizal' sede_principal: cajibio lat: 2.5977 lng: -76.6684 impacto_visitas: 1 - zona: 'barrio Betania' sede_principal: cajibio lat: 2.6361 lng: -76.7313 impacto_visitas: 2 - zona: 'Barrio Fátima' sede_principal: morales lat: 2.7584 lng: -76.631 impacto_visitas: 1 - zona: 'Barrio La Floresta' sede_principal: morales lat: 2.7584 lng: -76.6312 impacto_visitas: 2 - zona: 'Barrio Modelo' sede_principal: morales lat: 2.7584 lng: -76.631 impacto_visitas: 2 - zona: 'barrio villamarcela' sede_principal: piendamo lat: 2.6365 lng: -76.5265 impacto_visitas: 1 - zona: Bet sede_principal: cajibio lat: 2.5862 lng: -76.7405 impacto_visitas: 1 - zona: Betania sede_principal: cajibio lat: 2.5843 lng: -76.7534 impacto_visitas: 7 - zona: 'Buena vista' sede_principal: cajibio lat: 2.6918 lng: -76.6755 impacto_visitas: 8 - zona: Buenavista sede_principal: cajibio lat: 2.6916 lng: -76.6772 impacto_visitas: 14 - zona: CAJIBIO sede_principal: cajibio lat: 2.6331 lng: -76.5912 impacto_visitas: 13 - zona: 'CAJIBIO 2' sede_principal: cajibio lat: 2.62 lng: -76.5796 impacto_visitas: 1 - zona: 'CAJIBIO 3' sede_principal: cajibio lat: 2.6136 lng: -76.632 impacto_visitas: 1 - zona: 'CAJIBIO 1' sede_principal: cajibio lat: 2.6194 lng: -76.5954 impacto_visitas: 3 - zona: 'CAJIBIO 2' sede_principal: cajibio lat: 2.6247 lng: -76.6261 impacto_visitas: 85 - zona: 'CAJIBIO 3' sede_principal: cajibio lat: 2.6124 lng: -76.6094 impacto_visitas: 36 - zona: 'CAJIBIO 4' sede_principal: cajibio lat: 2.6237 lng: -76.6264 impacto_visitas: 7 - zona: CAJIBIO4 sede_principal: cajibio lat: 2.6367 lng: -76.648 impacto_visitas: 1 - zona: 'CAJIBO 3' sede_principal: cajibio lat: 2.6238 lng: -76.5697 impacto_visitas: 1 - zona: 'campa alegre sector la selva' sede_principal: piendamo lat: 2.73 lng: -76.5869 impacto_visitas: 1 - zona: 'Campo Alegre' sede_principal: cajibio lat: 2.5777 lng: -76.7247 impacto_visitas: 3 - zona: Campoalegre sede_principal: cajibio lat: 2.5759 lng: -76.7208 impacto_visitas: 6 - zona: capilla sede_principal: cajibio lat: 2.5803 lng: -76.6232 impacto_visitas: 10 - zona: carmelo sede_principal: cajibio lat: 2.6673 lng: -76.7008 impacto_visitas: 32 - zona: carrizal sede_principal: cajibio lat: 2.597 lng: -76.6639 impacto_visitas: 31 - zona: 'casas bajas' sede_principal: cajibio lat: 2.6381 lng: -76.7333 impacto_visitas: 2 - zona: 'CASAS BAJAS' sede_principal: cajibio lat: 2.642 lng: -76.7341 impacto_visitas: 132 - zona: Casitas sede_principal: cajibio lat: 2.6904 lng: -76.6559 impacto_visitas: 2 - zona: 'CERRO BAJÓ' sede_principal: morales lat: 2.7514 lng: -76.7019 impacto_visitas: 2 - zona: 'CERRO BAJO' sede_principal: morales lat: 2.7516 lng: -76.7008 impacto_visitas: 5 - zona: cidral sede_principal: cajibio lat: 2.6751 lng: -76.6708 impacto_visitas: 24 - zona: 'cidral 9' sede_principal: cajibio lat: 2.6688 lng: -76.6629 impacto_visitas: 1 - zona: 'cidral ojo' sede_principal: cajibio lat: 2.6688 lng: -76.6628 impacto_visitas: 1 - zona: COHETERA sede_principal: cajibio lat: 2.6437 lng: -76.6293 impacto_visitas: 30 - zona: diamante sede_principal: cajibio lat: 2.6774 lng: -76.7275 impacto_visitas: 2 - zona: dinde sede_principal: cajibio lat: 2.6971 lng: -76.7581 impacto_visitas: 187 - zona: 'el cidral' sede_principal: cajibio lat: 2.6811 lng: -76.6751 impacto_visitas: 16 - zona: 'el cidral L9' sede_principal: cajibio lat: 2.674 lng: -76.6769 impacto_visitas: 1 - zona: 'el lago' sede_principal: cajibio lat: 2.5753 lng: -76.604 impacto_visitas: 1 - zona: Fátima sede_principal: morales lat: 2.7584 lng: -76.631 impacto_visitas: 1 - zona: finde sede_principal: cajibio lat: 2.6865 lng: -76.7607 impacto_visitas: 1 - zona: Florida sede_principal: cajibio lat: 2.5709 lng: -76.6947 impacto_visitas: 4 - zona: Granja sede_principal: cajibio lat: 2.6519 lng: -76.6093 impacto_visitas: 3 - zona: guangubio sede_principal: cajibio lat: 2.5815 lng: -76.6729 impacto_visitas: 67 - zona: independencia sede_principal: cajibio lat: 2.7156 lng: -76.7199 impacto_visitas: 9 - zona: independiente sede_principal: cajibio lat: 2.7095 lng: -76.7176 impacto_visitas: 1 - zona: jardín sede_principal: cajibio lat: 2.5937 lng: -76.6798 impacto_visitas: 1 - zona: 'l granja' sede_principal: cajibio lat: 2.6487 lng: -76.6107 impacto_visitas: 6 - zona: 'l palma' sede_principal: cajibio lat: 2.6655 lng: -76.6249 impacto_visitas: 1 - zona: 'l pedregosa' sede_principal: cajibio lat: 2.6666 lng: -76.6278 impacto_visitas: 1 - zona: 'l. a palma' sede_principal: cajibio lat: 2.6672 lng: -76.6272 impacto_visitas: 1 - zona: 'l. Granja' sede_principal: cajibio lat: 2.751 lng: -76.6696 impacto_visitas: 1 - zona: 'l. palma' sede_principal: cajibio lat: 2.6663 lng: -76.6259 impacto_visitas: 1 - zona: 'la arroyuela' sede_principal: cajibio lat: 2.6458 lng: -76.655 impacto_visitas: 5 - zona: 'LA AURELIA' sede_principal: cajibio lat: 2.6581 lng: -76.6207 impacto_visitas: 1 - zona: 'la balsa' sede_principal: cajibio lat: 2.5838 lng: -76.6722 impacto_visitas: 1 - zona: 'La Florida' sede_principal: cajibio lat: 2.5602 lng: -76.6945 impacto_visitas: 1 - zona: 'la granja' sede_principal: cajibio lat: 2.653 lng: -76.6128 impacto_visitas: 78 - zona: 'la granja' sede_principal: piendamo lat: 2.6472 lng: -76.6082 impacto_visitas: 1 - zona: 'la palma' sede_principal: cajibio lat: 2.6647 lng: -76.625 impacto_visitas: 134 - zona: 'la palma pedregosa' sede_principal: cajibio lat: 2.6723 lng: -76.6232 impacto_visitas: 1 - zona: 'La pama' sede_principal: cajibio lat: 2.669 lng: -76.6307 impacto_visitas: 1 - zona: 'la pedregosa' sede_principal: cajibio lat: 2.6684 lng: -76.64 impacto_visitas: 35 - zona: 'la unión' sede_principal: cajibio lat: 2.5936 lng: -76.603 impacto_visitas: 6 - zona: 'la, palma' sede_principal: cajibio lat: 2.6632 lng: -76.6284 impacto_visitas: 3 - zona: 'la. Granja' sede_principal: cajibio lat: 2.6454 lng: -76.6048 impacto_visitas: 2 - zona: 'laa casitas' sede_principal: cajibio lat: 2.6897 lng: -76.6725 impacto_visitas: 2 - zona: lago sede_principal: cajibio lat: 2.5792 lng: -76.6023 impacto_visitas: 1 - zona: laguna sede_principal: cajibio lat: 2.7027 lng: -76.7704 impacto_visitas: 77 - zona: 'laguna dinde' sede_principal: cajibio lat: 2.7062 lng: -76.7754 impacto_visitas: 24 - zona: 'las casitas' sede_principal: cajibio lat: 2.691 lng: -76.658 impacto_visitas: 62 - zona: 'loma corta' sede_principal: piendamo lat: 2.7271 lng: -76.5519 impacto_visitas: 1 - zona: 'loma larga' sede_principal: cajibio lat: 2.5685 lng: -76.6064 impacto_visitas: 5 - zona: 'Los Pinos' sede_principal: cajibio lat: 2.5731 lng: -76.6684 impacto_visitas: 1 - zona: MATARREDONDA sede_principal: morales lat: 2.7379 lng: -76.6653 impacto_visitas: 3 - zona: MESETA sede_principal: cajibio lat: 2.5904 lng: -76.6956 impacto_visitas: 18 - zona: michinchal sede_principal: cajibio lat: 2.688 lng: -76.7056 impacto_visitas: 24 - zona: monterredondo sede_principal: cajibio lat: 2.6624 lng: -76.7159 impacto_visitas: 3 - zona: MORALES sede_principal: morales lat: 2.7322 lng: -76.6541 impacto_visitas: 1 - zona: mucho sede_principal: cajibio lat: 2.6721 lng: -76.7027 impacto_visitas: 1 - zona: 'Nuevo horizonte' sede_principal: cajibio lat: 2.5961 lng: -76.6953 impacto_visitas: 26 - zona: ortega sede_principal: cajibio lat: 2.683 lng: -76.7973 impacto_visitas: 148 - zona: pal sede_principal: cajibio lat: 2.5614 lng: -76.613 impacto_visitas: 1 - zona: palace sede_principal: cajibio lat: 2.563 lng: -76.6137 impacto_visitas: 34 - zona: palma sede_principal: cajibio lat: 2.6598 lng: -76.6221 impacto_visitas: 35 - zona: palomera sede_principal: piendamo lat: 2.6792 lng: -76.5335 impacto_visitas: 1 - zona: 'PAN DE AZUCAR' sede_principal: morales lat: 2.7418 lng: -76.7019 impacto_visitas: 5 - zona: 'PAN de azúcar. san francisco cajibio' sede_principal: cajibio lat: 2.7353 lng: -76.7025 impacto_visitas: 1 - zona: Pedregosa sede_principal: cajibio lat: 2.6755 lng: -76.646 impacto_visitas: 89 - zona: pinos sede_principal: cajibio lat: 2.5724 lng: -76.6677 impacto_visitas: 13 - zona: PLAYON sede_principal: morales lat: 2.7364 lng: -76.7268 impacto_visitas: 5 - zona: poooo sede_principal: cajibio lat: 2.6234 lng: -76.571 impacto_visitas: 1 - zona: PORVENIR sede_principal: cajibio lat: 2.6476 lng: -76.649 impacto_visitas: 3 - zona: PPRIMAVERA sede_principal: cajibio lat: 2.6221 lng: -76.6578 impacto_visitas: 1 - zona: PRIMAVERA sede_principal: cajibio lat: 2.6214 lng: -76.6549 impacto_visitas: 104 - zona: PRIMAVERA⁶ sede_principal: cajibio lat: 2.6243 lng: -76.6621 impacto_visitas: 1 - zona: Recuerdo sede_principal: cajibio lat: 2.6229 lng: -76.7599 impacto_visitas: 27 - zona: 'Recuerdo Bajo' sede_principal: cajibio lat: 2.6334 lng: -76.7692 impacto_visitas: 6 - zona: 'Recuerdo Bajo 0' sede_principal: cajibio lat: 2.6032 lng: -76.7779 impacto_visitas: 1 - zona: Rosario sede_principal: cajibio lat: 2.6119 lng: -76.736 impacto_visitas: 69 - zona: ROSARIO sede_principal: morales lat: 2.7375 lng: -76.6681 impacto_visitas: 18 - zona: 'Rural El Rosario' sede_principal: morales lat: 2.7324 lng: -76.6672 impacto_visitas: 2 - zona: 'rural San Roque' sede_principal: cajibio lat: 2.7252 lng: -76.7643 impacto_visitas: 1 - zona: salero sede_principal: cajibio lat: 2.6441 lng: -76.5276 impacto_visitas: 1 - zona: 'san jose' sede_principal: cajibio lat: 2.6641 lng: -76.7003 impacto_visitas: 1 - zona: 'san antonio' sede_principal: cajibio lat: 2.7247 lng: -76.6928 impacto_visitas: 23 - zona: 'san Gabriel' sede_principal: cajibio lat: 2.6228 lng: -76.704 impacto_visitas: 69 - zona: 'san jose' sede_principal: cajibio lat: 2.6736 lng: -76.6782 impacto_visitas: 20 - zona: 'san jose' sede_principal: piendamo lat: 2.708 lng: -76.5737 impacto_visitas: 1 - zona: 'san jose carmelo' sede_principal: cajibio lat: 2.689 lng: -76.6986 impacto_visitas: 15 - zona: 'San Lorenzo' sede_principal: cajibio lat: 2.6127 lng: -76.769 impacto_visitas: 10 - zona: 'san Migue' sede_principal: cajibio lat: 2.6976 lng: -76.7549 impacto_visitas: 1 - zona: 'SAN RAFAEL' sede_principal: morales lat: 2.7352 lng: -76.6384 impacto_visitas: 3 - zona: si sede_principal: cajibio lat: 2.6234 lng: -76.571 impacto_visitas: 2 - zona: siii sede_principal: cajibio lat: 2.6234 lng: -76.571 impacto_visitas: 1 - zona: 'SOCORRO BAJÓ' sede_principal: morales lat: 2.7364 lng: -76.7414 impacto_visitas: 2 - zona: 'SOCORRO BAJO' sede_principal: morales lat: 2.7356 lng: -76.7414 impacto_visitas: 1 - zona: tigre sede_principal: cajibio lat: 2.608 lng: -76.695 impacto_visitas: 83 - zona: 'Tropical Tumaco' sede_principal: cajibio lat: 2.5932 lng: -76.7659 impacto_visitas: 5 - zona: Tumaco sede_principal: cajibio lat: 2.5957 lng: -76.7643 impacto_visitas: 12 - zona: TUNEL sede_principal: cajibio lat: 2.5534 lng: -76.5544 impacto_visitas: 3 - zona: tunia sede_principal: piendamo lat: 2.7271 lng: -76.5519 impacto_visitas: 1 - zona: unión sede_principal: cajibio lat: 2.5929 lng: -76.6061 impacto_visitas: 44 - zona: 'v/ uvales' sede_principal: piendamo lat: 2.7332 lng: -76.5693 impacto_visitas: 1 - zona: 'v/campo alegre' sede_principal: piendamo lat: 2.7334 lng: -76.5806 impacto_visitas: 1 - zona: v/salinas sede_principal: piendamo lat: 2.8241 lng: -76.5847 impacto_visitas: 1 - zona: VENTA sede_principal: cajibio lat: 2.5873 lng: -76.5595 impacto_visitas: 9 - zona: 'vereda cacahual' sede_principal: cajibio lat: 2.6924 lng: -76.7302 impacto_visitas: 1 - zona: 'vereda diamante' sede_principal: cajibio lat: 2.6733 lng: -76.7129 impacto_visitas: 1 - zona: 'vereda altamira' sede_principal: cajibio lat: 2.6699 lng: -76.7354 impacto_visitas: 5 - zona: 'vereda alto piendamo' sede_principal: piendamo lat: 2.6472 lng: -76.6082 impacto_visitas: 1 - zona: 'vereda arroyuela' sede_principal: cajibio lat: 2.6456 lng: -76.6686 impacto_visitas: 3 - zona: 'vereda buena vista' sede_principal: cajibio lat: 2.6904 lng: -76.6725 impacto_visitas: 2 - zona: 'vereda cacahual' sede_principal: cajibio lat: 2.6919 lng: -76.7272 impacto_visitas: 89 - zona: 'vereda campo alegre' sede_principal: piendamo lat: 2.7317 lng: -76.5837 impacto_visitas: 2 - zona: 'vereda campo alegre9' sede_principal: piendamo lat: 2.73 lng: -76.5869 impacto_visitas: 1 - zona: 'vereda carmelo' sede_principal: cajibio lat: 2.6641 lng: -76.7022 impacto_visitas: 1 - zona: 'vereda casas bajas' sede_principal: cajibio lat: 2.6511 lng: -76.7326 impacto_visitas: 1 - zona: 'vereda diamante' sede_principal: cajibio lat: 2.6828 lng: -76.7207 impacto_visitas: 3 - zona: 'vereda el cidral' sede_principal: cajibio lat: 2.6774 lng: -76.6764 impacto_visitas: 2 - zona: 'vereda el diamante' sede_principal: cajibio lat: 2.6837 lng: -76.7199 impacto_visitas: 3 - zona: 'Vereda El Maco' sede_principal: morales lat: 2.7586 lng: -76.6314 impacto_visitas: 2 - zona: 'vereda granja' sede_principal: cajibio lat: 2.6472 lng: -76.6082 impacto_visitas: 1 - zona: 'vereda independencia' sede_principal: cajibio lat: 2.7143 lng: -76.7196 impacto_visitas: 21 - zona: 'vereda la arroyuela' sede_principal: cajibio lat: 2.6494 lng: -76.6705 impacto_visitas: 3 - zona: 'vereda la aurelia' sede_principal: cajibio lat: 2.6486 lng: -76.5961 impacto_visitas: 2 - zona: 'vereda la aurelia.' sede_principal: cajibio lat: 2.6451 lng: -76.5952 impacto_visitas: 1 - zona: 'vereda la esmeralda' sede_principal: piendamo lat: 2.6938 lng: -76.5394 impacto_visitas: 1 - zona: 'vereda la granja' sede_principal: cajibio lat: 2.6452 lng: -76.6038 impacto_visitas: 1 - zona: 'vereda la palma' sede_principal: cajibio lat: 2.6639 lng: -76.6251 impacto_visitas: 6 - zona: 'vereda la palomera tunia' sede_principal: piendamo lat: 2.6792 lng: -76.5335 impacto_visitas: 1 - zona: 'Vereda loma de bogota' sede_principal: piendamo lat: 2.7271 lng: -76.5519 impacto_visitas: 1 - zona: 'Vereda Maci' sede_principal: morales lat: 2.7586 lng: -76.6314 impacto_visitas: 1 - zona: 'Vereda Maco' sede_principal: morales lat: 2.7586 lng: -76.6314 impacto_visitas: 1 - zona: 'vereda michinchal' sede_principal: cajibio lat: 2.6895 lng: -76.7055 impacto_visitas: 37 - zona: 'vereda puerta chiquita' sede_principal: cajibio lat: 2.6311 lng: -76.6786 impacto_visitas: 1 - zona: 'vereda salero' sede_principal: cajibio lat: 2.6865 lng: -76.6665 impacto_visitas: 3 - zona: 'vereda san g' sede_principal: cajibio lat: 2.6221 lng: -76.6982 impacto_visitas: 1 - zona: 'vereda san Gabriel' sede_principal: cajibio lat: 2.6239 lng: -76.7049 impacto_visitas: 75 - zona: 'vereda san jose' sede_principal: cajibio lat: 2.6833 lng: -76.7223 impacto_visitas: 1 - zona: 'vereda san jose' sede_principal: piendamo lat: 2.708 lng: -76.5737 impacto_visitas: 2 - zona: 'vereda san miguel' sede_principal: cajibio lat: 2.691 lng: -76.5756 impacto_visitas: 2 - zona: 'vereda vivas Balcazar' sede_principal: piendamo lat: 2.678 lng: -76.5281 impacto_visitas: 1 - zona: veredactunia sede_principal: piendamo lat: 2.6938 lng: -76.5394 impacto_visitas: 1 - zona: 'villa marcela' sede_principal: piendamo lat: 2.6365 lng: -76.5265 impacto_visitas: 1 - zona: villermosa sede_principal: cajibio lat: 2.6678 lng: -76.6598 impacto_visitas: 1 - zona: VIUDA sede_principal: cajibio lat: 2.5656 lng: -76.5918 impacto_visitas: 4 - zona: x sede_principal: cajibio lat: 2.6744 lng: -76.7303 impacto_visitas: 2 items: type: object properties: zona: type: string example: '208' sede_principal: type: string example: cajibio lat: type: number example: 2.5706 lng: type: number example: -76.6619 impacto_visitas: type: integer example: 1 version: type: string example: v1 cache: type: boolean example: true tags: - 'Estadísticas Públicas (Landing Page)' security: [] /api/estadisticas: get: summary: 'Obtener estadísticas generales' operationId: obtenerEstadsticasGenerales description: "Retorna el conteo de pacientes (total) y actividades (visitas, tamizajes, envíos, encuestas) del usuario logueado.\nSi no se envían fechas, filtra por el mes actual." parameters: - in: query name: fecha_inicio description: 'date Fecha inicial (YYYY-MM-DD).' example: '2024-03-01' required: false schema: type: string description: 'date Fecha inicial (YYYY-MM-DD).' example: '2024-03-01' - in: query name: fecha_fin description: 'date Fecha final (YYYY-MM-DD).' example: '2024-03-31' required: false schema: type: string description: 'date Fecha final (YYYY-MM-DD).' example: '2024-03-31' responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Estadísticas y Dashboard' '/api/estadisticas/sede/{sedeId}': get: summary: 'Obtener estadísticas por sede específica' operationId: obtenerEstadsticasPorSedeEspecfica description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Estadísticas y Dashboard' security: [] parameters: - in: path name: sedeId description: '' example: architecto required: true schema: type: string /api/pacientes: get: summary: 'Listar pacientes' operationId: listarPacientes description: 'Obtiene todos los pacientes registrados con su sede asociada.' parameters: [] responses: 200: description: '' content: application/json: schema: type: array items: type: object properties: id: type: string example: uuid-1234 identificacion: type: string example: '102030' nombre: type: string example: Juan apellido: type: string example: Perez sede: type: object properties: id: type: integer example: 1 nombre: type: string example: 'Sede Central' example: - id: uuid-1234 identificacion: '102030' nombre: Juan apellido: Perez sede: id: 1 nombre: 'Sede Central' tags: - 'Gestión de Pacientes' post: summary: 'Registrar paciente' operationId: registrarPaciente description: 'Crea un nuevo registro de paciente.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: id: uuid-5678 identificacion: '10203040' nombre: Carlos estado: activo properties: id: type: string example: uuid-5678 identificacion: type: string example: '10203040' nombre: type: string example: Carlos estado: type: string example: activo tags: - 'Gestión de Pacientes' requestBody: required: true content: application/json: schema: type: object properties: identificacion: type: string description: 'El documento de identidad.' example: '10203040' fecnacimiento: type: string description: 'Fecha de nacimiento (Y-m-d).' example: '1990-05-15' nombre: type: string description: 'Nombres del paciente.' example: Carlos apellido: type: string description: 'Apellidos del paciente.' example: Rodriguez genero: type: string description: 'Género (Masculino/Femenino/Otro).' example: Masculino idsede: type: string description: 'ID de la sede a la que pertenece.' example: '1' required: - identificacion - fecnacimiento - nombre - apellido - genero - idsede '/api/pacientes/{id}': get: summary: 'Consultar paciente' operationId: consultarPaciente description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Gestión de Pacientes' put: summary: 'Actualizar paciente' operationId: actualizarPaciente description: '' parameters: [] responses: { } tags: - 'Gestión de Pacientes' requestBody: required: false content: application/json: schema: type: object properties: identificacion: type: string description: '' example: null fecnacimiento: type: string description: 'Must be a valid date.' example: '2026-03-26T15:20:39' nombre: type: string description: '' example: null apellido: type: string description: '' example: null genero: type: string description: '' example: null idsede: type: string description: 'The id of an existing record in the sedes table.' example: null delete: summary: 'Eliminar paciente' operationId: eliminarPaciente description: '' parameters: [] responses: { } tags: - 'Gestión de Pacientes' parameters: - in: path name: id description: 'ID del paciente.' example: architecto required: true schema: type: string '/api/pacientes/buscar/{identificacion}': get: summary: 'Buscar por identificación' operationId: buscarPorIdentificacin description: 'Encuentra un paciente usando su número de documento.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: id: uuid-1234 identificacion: '102030' nombre: Juan properties: id: type: string example: uuid-1234 identificacion: type: string example: '102030' nombre: type: string example: Juan 404: description: '' content: application/json: schema: type: object example: message: 'Paciente no encontrado' properties: message: type: string example: 'Paciente no encontrado' tags: - 'Gestión de Pacientes' parameters: - in: path name: identificacion description: 'El número del documento.' example: '102030' required: true schema: type: string /api/pacientes/sync-batch: post: summary: 'Sincronización masiva (Offline-first)' operationId: sincronizacinMasivaOfflineFirst description: 'Permite sincronizar un lote de pacientes desde la aplicación móvil. El sistema identifica si debe crear o actualizar basándose en el ID.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Sincronización completada' resultados: creados: 1 actualizados: 0 errores: [] properties: success: type: boolean example: true message: type: string example: 'Sincronización completada' resultados: type: object properties: creados: type: integer example: 1 actualizados: type: integer example: 0 errores: type: array example: [] tags: - 'Gestión de Pacientes' requestBody: required: true content: application/json: schema: type: object properties: pacientes: type: array description: 'Lista de pacientes a sincronizar.' example: - [] items: type: object properties: id: type: string description: 'UUID del paciente en el dispositivo.' example: uuid-mobile-1 identificacion: type: string description: Documento. example: '12345' nombre: type: string description: Nombre. example: Pedro apellido: type: string description: Apellido. example: Picapiedra fecnacimiento: type: string description: 'Fecha (Y-m-d).' example: '1980-01-01' required: - id - identificacion - nombre - apellido required: - pacientes '/api/pacientes/{id}/coordenadas': put: summary: 'Actualizar coordenadas' operationId: actualizarCoordenadas description: 'Actualiza la ubicación geográfica (Latitud/Longitud) del paciente.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: success: true message: 'Coordenadas actualizadas exitosamente' data: id: uuid-123 latitud: 6.2442 longitud: -75.5812 properties: success: type: boolean example: true message: type: string example: 'Coordenadas actualizadas exitosamente' data: type: object properties: id: type: string example: uuid-123 latitud: type: number example: 6.2442 longitud: type: number example: -75.5812 tags: - 'Gestión de Pacientes' requestBody: required: true content: application/json: schema: type: object properties: latitud: type: number description: 'Latitud entre -90 y 90.' example: 6.2442 longitud: type: number description: 'Longitud entre -180 y 180.' example: -75.5812 required: - latitud - longitud parameters: - in: path name: id description: 'The ID of the paciente.' example: architecto required: true schema: type: string /api/usuarios: get: summary: 'Listar usuarios' operationId: listarUsuarios description: '' parameters: - in: query name: rol description: 'Filtrar por rol (admin, auxiliar, supervisor).' example: architecto required: false schema: type: string description: 'Filtrar por rol (admin, auxiliar, supervisor).' example: architecto - in: query name: sede_id description: 'Filtrar por ID de sede.' example: architecto required: false schema: type: string description: 'Filtrar por ID de sede.' example: architecto responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Gestión de Usuarios' post: summary: 'Almacenar un nuevo usuario.' operationId: almacenarUnNuevoUsuario description: '' parameters: [] responses: { } tags: - 'Gestión de Usuarios' requestBody: required: true content: application/json: schema: type: object properties: nombre: type: string description: 'Must not be greater than 255 characters.' example: b usuario: type: string description: 'Must not be greater than 50 characters.' example: 'n' correo: type: string description: 'Must be a valid email address.' example: ashly64@example.com contrasena: type: string description: 'Must be at least 6 characters.' example: vdljnikhwaykcmyuwpwlvqwrsitcpscqldzsnrwtujwvlx rol: type: string description: '' example: supervisor enum: - admin - auxiliar - aux - supervisor sede_id: type: string description: 'The id of an existing record in the sedes table.' example: architecto required: - nombre - usuario - correo - contrasena - rol - sede_id security: [] '/api/usuarios/{id}': get: summary: 'Mostrar un usuario específico.' operationId: mostrarUnUsuarioEspecfico description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Gestión de Usuarios' security: [] put: summary: 'Actualizar un usuario específico.' operationId: actualizarUnUsuarioEspecfico description: '' parameters: [] responses: { } tags: - 'Gestión de Usuarios' security: [] delete: summary: 'Eliminar un usuario específico.' operationId: eliminarUnUsuarioEspecfico description: '' parameters: [] responses: { } tags: - 'Gestión de Usuarios' security: [] parameters: - in: path name: id description: 'The ID of the usuario.' example: architecto required: true schema: type: string '/api/usuarios/rol/{rol}': get: summary: 'Obtener usuarios por rol.' operationId: obtenerUsuariosPorRol description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Gestión de Usuarios' security: [] parameters: - in: path name: rol description: 'The rol.' example: architecto required: true schema: type: string /api/auxiliares: get: summary: 'Obtener auxiliares (método específico).' operationId: obtenerAuxiliaresmtodoEspecfico description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Gestión de Usuarios' security: [] /api/medicamentos: get: summary: 'Listar medicamentos' operationId: listarMedicamentos description: '' parameters: - in: query name: busqueda description: 'Filtrar por nombre de medicamento.' example: architecto required: false schema: type: string description: 'Filtrar por nombre de medicamento.' example: architecto responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Medicamentos post: summary: '' operationId: postApiMedicamentos description: '' parameters: [] responses: { } tags: - Medicamentos requestBody: required: true content: application/json: schema: type: object properties: nombmedicamento: type: string description: '' example: architecto required: - nombmedicamento security: [] '/api/medicamentos/{id}': get: summary: '' operationId: getApiMedicamentosId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Medicamentos security: [] put: summary: '' operationId: putApiMedicamentosId description: '' parameters: [] responses: { } tags: - Medicamentos requestBody: required: false content: application/json: schema: type: object properties: nombmedicamento: type: string description: '' example: null security: [] delete: summary: '' operationId: deleteApiMedicamentosId description: '' parameters: [] responses: { } tags: - Medicamentos security: [] parameters: - in: path name: id description: 'The ID of the medicamento.' example: architecto required: true schema: type: string /api/medicamentos/buscar: get: summary: 'Listar medicamentos' operationId: listarMedicamentos description: '' parameters: - in: query name: busqueda description: 'Filtrar por nombre de medicamento.' example: architecto required: false schema: type: string description: 'Filtrar por nombre de medicamento.' example: architecto responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Medicamentos '/api/pacientes/{id}/medicamentos': post: summary: 'Asignar medicamentos a paciente' operationId: asignarMedicamentosAPaciente description: '' parameters: [] responses: { } tags: - 'Medicamentos de Paciente' requestBody: required: true content: application/json: schema: type: object properties: medicamentos: type: array description: 'Lista de medicamentos.' example: - [] items: type: object properties: '*': type: object description: '' example: id: architecto properties: id: type: string description: 'ID del medicamento.' example: architecto dosis: type: string description: 'Dosis asignada.' example: architecto cantidad: type: integer description: 'Cantidad entregada/asignada.' example: 16 required: - id required: - medicamentos put: summary: '' operationId: putApiPacientesIdMedicamentos description: '' parameters: [] responses: { } tags: - 'Medicamentos de Paciente' security: [] delete: summary: '' operationId: deleteApiPacientesIdMedicamentos description: '' parameters: [] responses: { } tags: - 'Medicamentos de Paciente' security: [] get: summary: '' operationId: getApiPacientesIdMedicamentos description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Medicamentos de Paciente' security: [] parameters: - in: path name: id description: 'ID del paciente.' example: architecto required: true schema: type: string /api/notifications/register-device: post: summary: 'Registrar dispositivo' operationId: registrarDispositivo description: 'Registra el token FCM del dispositivo para recibir notificaciones push.' parameters: [] responses: { } tags: - 'Notificaciones Push (FCM)' requestBody: required: true content: application/json: schema: type: object properties: user_id: type: string description: 'ID del usuario.' example: architecto fcm_token: type: string description: 'Token generado por Firebase en el móvil.' example: architecto platform: type: string description: 'android, ios, web.' example: android device_name: type: string description: '' example: architecto nullable: true required: - user_id - fcm_token - platform /api/notifications/send-to-user: post: summary: '' operationId: postApiNotificationsSendToUser description: '' parameters: [] responses: { } tags: - 'Notificaciones Push (FCM)' requestBody: required: true content: application/json: schema: type: object properties: user_id: type: string description: 'The id of an existing record in the usuarios table.' example: architecto title: type: string description: 'Must not be greater than 255 characters.' example: 'n' body: type: string description: '' example: architecto data: type: object description: '' example: null properties: { } nullable: true required: - user_id - title - body security: [] /api/notifications/send-to-all: post: summary: 'Notificación masiva (Broadcast)' operationId: notificacinMasivaBroadcast description: 'Envía una notificación push a todos los dispositivos registrados en el sistema.' parameters: [] responses: { } tags: - 'Notificaciones Push (FCM)' requestBody: required: true content: application/json: schema: type: object properties: title: type: string description: 'Título de la notificación.' example: architecto body: type: string description: 'Contenido del mensaje.' example: architecto data: type: object description: 'Datos adicionales (key-value).' example: [] properties: { } nullable: true required: - title - body /api/notifications/unregister-device: post: summary: '' operationId: postApiNotificationsUnregisterDevice description: '' parameters: [] responses: { } tags: - 'Notificaciones Push (FCM)' requestBody: required: true content: application/json: schema: type: object properties: fcm_token: type: string description: '' example: architecto required: - fcm_token security: [] /api/notifications/users-with-tokens: get: summary: 'Listar usuarios con tokens' operationId: listarUsuariosConTokens description: 'Obtiene una lista paginada de usuarios que tienen tokens de FCM registrados.' parameters: - in: query name: per_page description: 'Resultados por página. Default: 15.' example: 16 required: false schema: type: integer description: 'Resultados por página. Default: 15.' example: 16 - in: query name: search description: 'Buscar por nombre, correo o usuario.' example: architecto required: false schema: type: string description: 'Buscar por nombre, correo o usuario.' example: architecto - in: query name: platform description: 'Filtrar por plataforma (android, ios, web).' example: architecto required: false schema: type: string description: 'Filtrar por plataforma (android, ios, web).' example: architecto responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Notificaciones Push (FCM)' /api/notifications/stats: get: summary: '' operationId: getApiNotificationsStats description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Notificaciones Push (FCM)' security: [] '/api/notifications/user/{userId}/tokens': get: summary: '' operationId: getApiNotificationsUserUserIdTokens description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Notificaciones Push (FCM)' security: [] parameters: - in: path name: userId description: '' example: architecto required: true schema: type: string /api/sedes: get: summary: 'Listar sedes' operationId: listarSedes description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Sedes post: summary: '' operationId: postApiSedes description: '' parameters: [] responses: { } tags: - Sedes requestBody: required: true content: application/json: schema: type: object properties: nombresede: type: string description: '' example: architecto required: - nombresede security: [] '/api/sedes/{id}': get: summary: '' operationId: getApiSedesId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Sedes security: [] put: summary: '' operationId: putApiSedesId description: '' parameters: [] responses: { } tags: - Sedes requestBody: required: false content: application/json: schema: type: object properties: nombresede: type: string description: '' example: null security: [] delete: summary: '' operationId: deleteApiSedesId description: '' parameters: [] responses: { } tags: - Sedes security: [] parameters: - in: path name: id description: 'The ID of the sede.' example: architecto required: true schema: type: string /api/tamizajes: get: summary: 'Listar tamizajes' operationId: listarTamizajes description: '' parameters: - in: query name: paciente_id description: 'Filtrar por paciente.' example: architecto required: false schema: type: string description: 'Filtrar por paciente.' example: architecto - in: query name: usuario_id description: 'Filtrar por usuario/promotor.' example: architecto required: false schema: type: string description: 'Filtrar por usuario/promotor.' example: architecto responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tamizajes de Presión Arterial (PA)' post: summary: 'Crear tamizaje' operationId: crearTamizaje description: '' parameters: [] responses: { } tags: - 'Tamizajes de Presión Arterial (PA)' requestBody: required: true content: application/json: schema: type: object properties: idpaciente: type: string description: 'ID del paciente.' example: id-paciente vereda_residencia: type: string description: Vereda. example: 'Vereda Norte' telefono: type: string description: 'Must not be greater than 20 characters.' example: gzmiyvdljnikhway nullable: true brazo_toma: type: string description: 'izquierdo o derecho.' example: izquierdo posicion_persona: type: string description: 'de_pie, acostado, sentado.' example: sentado reposo_cinco_minutos: type: string description: 'si o no.' example: si fecha_primera_toma: type: date description: 'Fecha de la toma.' example: architecto pa_sistolica: type: integer description: Sistólica. example: 120 pa_diastolica: type: integer description: Diastólica. example: 80 conducta: type: string description: 'Must not be greater than 1000 characters.' example: w nullable: true required: - idpaciente - vereda_residencia - brazo_toma - posicion_persona - reposo_cinco_minutos - fecha_primera_toma - pa_sistolica - pa_diastolica /api/tamizajes/estadisticas: get: summary: 'Obtener estadísticas de tamizajes del usuario logueado' operationId: obtenerEstadsticasDeTamizajesDelUsuarioLogueado description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tamizajes de Presión Arterial (PA)' security: [] '/api/tamizajes/paciente/{pacienteId}': get: summary: 'Obtener tamizajes por paciente' operationId: obtenerTamizajesPorPaciente description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tamizajes de Presión Arterial (PA)' security: [] parameters: - in: path name: pacienteId description: '' example: architecto required: true schema: type: string /api/tamizajes/mis-tamizajes: get: summary: 'Obtener tamizajes del usuario autenticado' operationId: obtenerTamizajesDelUsuarioAutenticado description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tamizajes de Presión Arterial (PA)' security: [] '/api/tamizajes/{id}': get: summary: 'Consultar tamizaje' operationId: consultarTamizaje description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tamizajes de Presión Arterial (PA)' put: summary: 'Actualizar tamizaje' operationId: actualizarTamizaje description: '' parameters: [] responses: { } tags: - 'Tamizajes de Presión Arterial (PA)' requestBody: required: false content: application/json: schema: type: object properties: vereda_residencia: type: string description: 'Must not be greater than 100 characters.' example: b telefono: type: string description: 'Must not be greater than 20 characters.' example: ngzmiyvdljnikhwa nullable: true brazo_toma: type: string description: '' example: izquierdo enum: - izquierdo - derecho posicion_persona: type: string description: '' example: de_pie enum: - de_pie - acostado - sentado reposo_cinco_minutos: type: string description: '' example: si enum: - si - 'no' fecha_primera_toma: type: string description: 'Must be a valid date.' example: '2026-03-26T15:20:39' pa_sistolica: type: integer description: 'Must be at least 50. Must not be greater than 300.' example: 24 pa_diastolica: type: integer description: 'Must be at least 30. Must not be greater than 200.' example: 8 conducta: type: string description: 'Must not be greater than 1000 characters.' example: u nullable: true delete: summary: 'Eliminar un tamizaje' operationId: eliminarUnTamizaje description: '' parameters: [] responses: { } tags: - 'Tamizajes de Presión Arterial (PA)' security: [] parameters: - in: path name: id description: 'ID del tamizaje.' example: architecto required: true schema: type: string /api/findrisk: get: summary: 'Listar tests realizados' operationId: listarTestsRealizados description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tests FINDRISK' post: summary: 'Crear test FINDRISK' operationId: crearTestFINDRISK description: '' parameters: [] responses: { } tags: - 'Tests FINDRISK' requestBody: required: true content: application/json: schema: type: object properties: idpaciente: type: string description: 'ID del paciente.' example: 550e8400-e29b-41d4-a716-446655440000 idsede: type: string description: 'ID de la sede.' example: '4044680601076201931' vereda: type: string description: 'Must not be greater than 100 characters.' example: 'n' nullable: true telefono: type: string description: 'Must not be greater than 20 characters.' example: gzmiyvdljnikhway nullable: true actividad_fisica: type: string description: '"si" o "no".' example: si medicamentos_hipertension: type: string description: '"si" o "no".' example: si frecuencia_frutas_verduras: type: string description: '"diariamente" o "no_diariamente".' example: diariamente azucar_alto_detectado: type: string description: '"si" o "no".' example: si peso: type: number description: 'Peso en kg.' example: 85.0 talla: type: number description: 'Talla en cm.' example: 175.0 perimetro_abdominal: type: number description: 'Perímetro abdominal en cm.' example: 102.0 antecedentes_familiares: type: string description: '(no, abuelos_tios_primos, padres_hermanos_hijos).' example: 'no' conducta: type: string description: '' example: architecto nullable: true promotor_vida: type: string description: 'Must not be greater than 100 characters.' example: 'n' nullable: true required: - idpaciente - idsede - actividad_fisica - medicamentos_hipertension - frecuencia_frutas_verduras - azucar_alto_detectado - peso - talla - perimetro_abdominal - antecedentes_familiares '/api/findrisk/{id}': get: summary: 'Consultar test FINDRISK' operationId: consultarTestFINDRISK description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tests FINDRISK' put: summary: 'Actualizar test FINDRISK' operationId: actualizarTestFINDRISK description: '' parameters: [] responses: { } tags: - 'Tests FINDRISK' requestBody: required: false content: application/json: schema: type: object properties: idsede: type: string description: 'The id of an existing record in the sedes table.' example: null vereda: type: string description: 'Must not be greater than 100 characters.' example: b nullable: true telefono: type: string description: 'Must not be greater than 20 characters.' example: ngzmiyvdljnikhwa nullable: true actividad_fisica: type: string description: '' example: si enum: - si - 'no' medicamentos_hipertension: type: string description: '' example: si enum: - si - 'no' frecuencia_frutas_verduras: type: string description: '' example: diariamente enum: - diariamente - no_diariamente azucar_alto_detectado: type: string description: '' example: si enum: - si - 'no' peso: type: number description: 'Must be at least 1. Must not be greater than 300.' example: 8 talla: type: number description: 'Must be at least 50. Must not be greater than 250.' example: 6 perimetro_abdominal: type: number description: 'Must be at least 30. Must not be greater than 200.' example: 25 antecedentes_familiares: type: string description: '' example: padres_hermanos_hijos enum: - 'no' - abuelos_tios_primos - padres_hermanos_hijos conducta: type: string description: '' example: architecto nullable: true promotor_vida: type: string description: 'Must not be greater than 100 characters.' example: 'n' nullable: true delete: summary: '' operationId: deleteApiFindriskId description: '' parameters: [] responses: { } tags: - 'Tests FINDRISK' security: [] parameters: - in: path name: id description: 'ID del test.' example: '1' required: true schema: type: string /api/findrisk-estadisticas: get: summary: '' operationId: getApiFindriskEstadisticas description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tests FINDRISK' security: [] '/api/findrisk-estadisticas/sede/{idsede}': get: summary: '' operationId: getApiFindriskEstadisticasSedeIdsede description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tests FINDRISK' security: [] parameters: - in: path name: idsede description: '' example: architecto required: true schema: type: string '/api/findrisk/paciente/{idpaciente}': get: summary: '' operationId: getApiFindriskPacienteIdpaciente description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tests FINDRISK' security: [] parameters: - in: path name: idpaciente description: '' example: architecto required: true schema: type: string '/api/findrisk/sede/{idsede}': get: summary: '' operationId: getApiFindriskSedeIdsede description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tests FINDRISK' security: [] parameters: - in: path name: idsede description: '' example: architecto required: true schema: type: string '/api/findrisk/paciente-sede/{identificacion}': get: summary: '' operationId: getApiFindriskPacienteSedeIdentificacion description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tests FINDRISK' security: [] parameters: - in: path name: identificacion description: '' example: architecto required: true schema: type: string /api/findrisk-tests/export: get: summary: '' operationId: getApiFindriskTestsExport description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Tests FINDRISK' security: [] /api/visitas: get: summary: 'Listar todas las visitas' operationId: listarTodasLasVisitas description: 'Permite filtrar las visitas por rango de fechas, usuario que realizó la visita y sede asociada al paciente.' parameters: - in: query name: fecha_desde description: 'date optional Filtrar visitas desde esta fecha.' example: '2024-01-01' required: false schema: type: string description: 'date optional Filtrar visitas desde esta fecha.' example: '2024-01-01' - in: query name: fecha_hasta description: 'date optional Filtrar visitas hasta esta fecha.' example: '2024-12-31' required: false schema: type: string description: 'date optional Filtrar visitas hasta esta fecha.' example: '2024-12-31' - in: query name: idusuario description: 'optional Filtrar por el ID del usuario que realizó la visita.' example: architecto required: false schema: type: string description: 'optional Filtrar por el ID del usuario que realizó la visita.' example: architecto - in: query name: idsede description: 'optional Filtrar por el ID de la sede a la que pertenece el paciente.' example: architecto required: false schema: type: string description: 'optional Filtrar por el ID de la sede a la que pertenece el paciente.' example: architecto responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Visitas Domiciliarias' post: summary: 'Crear visita domiciliaria' operationId: crearVisitaDomiciliaria description: 'Permite registrar una visita, procesando coordenadas, fotos de riesgo y firmas en archivos o Base64.' parameters: [] responses: { } tags: - 'Visitas Domiciliarias' requestBody: required: true content: multipart/form-data: schema: type: object properties: nombre_apellido: type: string description: 'Nombre del paciente contactado.' example: architecto identificacion: type: string description: 'Cédula del paciente.' example: architecto fecha: type: date description: 'Fecha de la visita.' example: architecto idusuario: type: string description: 'ID del usuario (Hacedor).' example: architecto idpaciente: type: string description: 'ID del paciente (opcional, se busca por cédula si falta).' example: architecto nullable: true id: type: string description: "✅ CAMBIADO: Ya no requiere que exista en la BD\nCampos opcionales." example: architecto hta: type: string description: 'Presión arterial (si/no).' example: architecto nullable: true dm: type: string description: 'Diabetes (si/no).' example: architecto nullable: true telefono: type: string description: '' example: architecto nullable: true zona: type: string description: '' example: architecto nullable: true peso: type: number description: 'Peso (kg).' example: 4326.41688 nullable: true talla: type: number description: 'Talla (cm).' example: 4326.41688 nullable: true imc: type: number description: '' example: 4326.41688 nullable: true perimetro_abdominal: type: number description: '' example: 4326.41688 nullable: true frecuencia_cardiaca: type: integer description: '' example: 16 nullable: true frecuencia_respiratoria: type: integer description: '' example: 16 nullable: true tension_arterial: type: string description: 'Valor TA (e.g. 120/80).' example: architecto nullable: true glucometria: type: number description: '' example: 4326.41688 nullable: true temperatura: type: number description: '' example: 4326.41688 nullable: true familiar: type: string description: '' example: architecto nullable: true latitud: type: number description: '✅ AGREGAR VALIDACIONES FALTANTES.' example: 4326.41688 nullable: true longitud: type: number description: '' example: 4326.41688 nullable: true estado: type: string description: '' example: architecto nullable: true sync_status: type: integer description: '' example: 16 nullable: true observaciones_adicionales: type: string description: '' example: architecto nullable: true tipo_visita: type: string description: '' example: architecto nullable: true riesgo_fotografico: type: string format: binary description: 'Archivos. Must be a file. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true riesgo_fotografico_url: type: string description: '' example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html' nullable: true riesgo_fotografico_base64: type: string description: 'Imagen del riesgo en Base64.' example: architecto nullable: true abandono_social: type: string description: '' example: architecto nullable: true motivo: type: string description: '' example: architecto nullable: true factores: type: string description: '' example: architecto nullable: true conductas: type: string description: '' example: architecto nullable: true novedades: type: string description: '' example: architecto nullable: true proximo_control: type: string description: 'Must be a valid date.' example: '2026-03-26T15:20:39' nullable: true firma: type: string format: binary description: 'Must be a file. Must be an image. Must not be greater than 2048 kilobytes.' nullable: true firma_url: type: string description: '' example: 'http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html' nullable: true firma_base64: type: string description: 'Firma en Base64.' example: architecto nullable: true medicamentos: type: json description: 'JSON con lista de medicamentos e indicaciones.' example: '[{"id": 1, "indicaciones": "Cena"}]' required: - nombre_apellido - identificacion - fecha - idusuario '/api/visitas/{id}': get: summary: '' operationId: getApiVisitasId description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Visitas Domiciliarias' security: [] put: summary: 'Actualizar visita' operationId: actualizarVisita description: '' parameters: [] responses: { } tags: - 'Visitas Domiciliarias' delete: summary: '' operationId: deleteApiVisitasId description: '' parameters: [] responses: { } tags: - 'Visitas Domiciliarias' security: [] parameters: - in: path name: id description: 'The ID of the visita.' example: 0004f8ed-7922-4ae7-9bb5-b5a80739ee69 required: true schema: type: string '/api/visitas/buscar-paciente/{identificacion}': get: summary: '' operationId: getApiVisitasBuscarPacienteIdentificacion description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Visitas Domiciliarias' security: [] parameters: - in: path name: identificacion description: '' example: architecto required: true schema: type: string /api/upload-risk-photo: post: summary: '' operationId: postApiUploadRiskPhoto description: '' parameters: [] responses: { } tags: - 'Visitas Domiciliarias' security: [] /api/upload-signature: post: summary: '' operationId: postApiUploadSignature description: '' parameters: [] responses: { } tags: - 'Visitas Domiciliarias' security: [] /api/upload-photo: post: summary: '' operationId: postApiUploadPhoto description: '' parameters: [] responses: { } tags: - 'Visitas Domiciliarias' security: [] /api/visitas/upload-risk-photo-base64: post: summary: '' operationId: postApiVisitasUploadRiskPhotoBase64 description: '' parameters: [] responses: { } tags: - 'Visitas Domiciliarias' security: [] /api/visitas/upload-signature-base64: post: summary: '' operationId: postApiVisitasUploadSignatureBase64 description: '' parameters: [] responses: { } tags: - 'Visitas Domiciliarias' security: []