-- Estructura de la base de datos del panel de examenes.
-- Importar UNA sola vez, sobre una base VACIA:
--   cPanel -> phpMyAdmin -> seleccionar la base -> pestana Importar.
-- Generado: 2026-09-14T22:25:59.770Z

SET NAMES utf8mb4;

-- CreateTable
CREATE TABLE `usuarios` (
    `id` VARCHAR(191) NOT NULL,
    `nombre` VARCHAR(191) NOT NULL,
    `email` VARCHAR(191) NOT NULL,
    `passwordHash` VARCHAR(191) NOT NULL,
    `rol` ENUM('ADMIN', 'MEDICO', 'AUXILIAR') NOT NULL DEFAULT 'AUXILIAR',
    `activo` BOOLEAN NOT NULL DEFAULT true,
    `documento` VARCHAR(191) NULL,
    `registroMedico` VARCHAR(191) NULL,
    `licenciaSst` VARCHAR(191) NULL,
    `especialidad` VARCHAR(191) NULL,
    `firmaImagenPath` VARCHAR(191) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `usuarios_email_key`(`email`),
    INDEX `usuarios_activo_idx`(`activo`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `empresas` (
    `id` VARCHAR(191) NOT NULL,
    `nit` VARCHAR(191) NOT NULL,
    `razonSocial` VARCHAR(191) NOT NULL,
    `direccion` VARCHAR(191) NULL,
    `telefono` VARCHAR(191) NULL,
    `ciudad` VARCHAR(191) NULL,
    `contacto` VARCHAR(191) NULL,
    `email` VARCHAR(191) NULL,
    `arl` VARCHAR(191) NULL,
    `activa` BOOLEAN NOT NULL DEFAULT true,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `empresas_nit_key`(`nit`),
    INDEX `empresas_razonSocial_idx`(`razonSocial`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `pacientes` (
    `id` VARCHAR(191) NOT NULL,
    `tipoDocumento` ENUM('CC', 'CE', 'TI', 'PA', 'PEP', 'PPT') NOT NULL DEFAULT 'CC',
    `numeroDocumento` VARCHAR(191) NOT NULL,
    `primerNombre` VARCHAR(191) NOT NULL,
    `segundoNombre` VARCHAR(191) NULL,
    `primerApellido` VARCHAR(191) NOT NULL,
    `segundoApellido` VARCHAR(191) NULL,
    `fechaNacimiento` DATETIME(3) NOT NULL,
    `genero` ENUM('MASCULINO', 'FEMENINO', 'OTRO') NOT NULL,
    `estadoCivil` ENUM('SOLTERO', 'CASADO', 'UNION_LIBRE', 'SEPARADO', 'DIVORCIADO', 'VIUDO') NULL,
    `nivelEstudio` ENUM('NINGUNO', 'PRIMARIA', 'BACHILLER', 'TECNICO', 'TECNOLOGO', 'UNIVERSITARIO', 'POSGRADO') NULL,
    `direccion` VARCHAR(191) NULL,
    `telefono` VARCHAR(191) NULL,
    `email` VARCHAR(191) NULL,
    `ciudad` VARCHAR(191) NULL,
    `numeroHijos` INTEGER NULL,
    `eps` VARCHAR(191) NULL,
    `afp` VARCHAR(191) NULL,
    `arl` VARCHAR(191) NULL,
    `fotoPath` VARCHAR(191) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    INDEX `pacientes_numeroDocumento_idx`(`numeroDocumento`),
    INDEX `pacientes_primerApellido_primerNombre_idx`(`primerApellido`, `primerNombre`),
    UNIQUE INDEX `pacientes_tipoDocumento_numeroDocumento_key`(`tipoDocumento`, `numeroDocumento`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `examenes` (
    `id` VARCHAR(191) NOT NULL,
    `consecutivo` INTEGER NOT NULL AUTO_INCREMENT,
    `codigoVerificacion` VARCHAR(191) NOT NULL,
    `estado` ENUM('BORRADOR', 'EMITIDO', 'ANULADO') NOT NULL DEFAULT 'BORRADOR',
    `pacienteId` VARCHAR(191) NOT NULL,
    `empresaId` VARCHAR(191) NOT NULL,
    `medicoId` VARCHAR(191) NULL,
    `creadoPorId` VARCHAR(191) NOT NULL,
    `tipoExamen` ENUM('INGRESO', 'PERIODICO', 'RETIRO', 'POST_INCAPACIDAD', 'REUBICACION', 'POST_OCUPACIONAL') NOT NULL,
    `enfasis` JSON NOT NULL,
    `cargo` VARCHAR(191) NOT NULL,
    `sedeAtencion` VARCHAR(191) NULL,
    `fechaExamen` DATETIME(3) NOT NULL,
    `acompanante` VARCHAR(191) NULL,
    `aptitudDesdeCargo` VARCHAR(191) NULL,
    `concepto` ENUM('APTO', 'APTO_CON_RECOMENDACIONES', 'APTO_CON_RESTRICCIONES', 'NO_APTO', 'APLAZADO') NOT NULL,
    `conceptoTexto` VARCHAR(500) NOT NULL,
    `restriccionOsteomuscular` TEXT NULL,
    `restriccionAlturas` TEXT NULL,
    `restriccionEspaciosConfinados` TEXT NULL,
    `observaciones` TEXT NULL,
    `recomendaciones` JSON NOT NULL,
    `serviciosRealizados` JSON NOT NULL,
    `emitidoEn` DATETIME(3) NULL,
    `anuladoEn` DATETIME(3) NULL,
    `motivoAnulacion` TEXT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `examenes_consecutivo_key`(`consecutivo`),
    UNIQUE INDEX `examenes_codigoVerificacion_key`(`codigoVerificacion`),
    INDEX `examenes_estado_fechaExamen_idx`(`estado`, `fechaExamen`),
    INDEX `examenes_pacienteId_idx`(`pacienteId`),
    INDEX `examenes_empresaId_idx`(`empresaId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `paraclinicos` (
    `id` VARCHAR(191) NOT NULL,
    `examenId` VARCHAR(191) NOT NULL,
    `nombre` VARCHAR(191) NOT NULL,
    `resultado` ENUM('NORMAL', 'ANORMAL', 'NO_APLICA', 'PENDIENTE') NOT NULL DEFAULT 'NORMAL',
    `detalle` TEXT NULL,
    `orden` INTEGER NOT NULL DEFAULT 0,

    INDEX `paraclinicos_examenId_idx`(`examenId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `catalogo_paraclinicos` (
    `id` VARCHAR(191) NOT NULL,
    `nombre` VARCHAR(191) NOT NULL,
    `activo` BOOLEAN NOT NULL DEFAULT true,
    `orden` INTEGER NOT NULL DEFAULT 0,

    UNIQUE INDEX `catalogo_paraclinicos_nombre_key`(`nombre`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `catalogo_recomendaciones` (
    `id` VARCHAR(191) NOT NULL,
    `texto` VARCHAR(191) NOT NULL,
    `enfasis` ENUM('ALTURAS', 'ESPACIOS_CONFINADOS', 'OSTEOMUSCULAR', 'MANIPULACION_ALIMENTOS', 'CARDIOVASCULAR', 'VISUAL', 'AUDITIVO', 'RESPIRATORIO', 'GENERAL') NULL,
    `activo` BOOLEAN NOT NULL DEFAULT true,
    `orden` INTEGER NOT NULL DEFAULT 0,

    UNIQUE INDEX `catalogo_recomendaciones_texto_key`(`texto`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `configuracion` (
    `id` VARCHAR(191) NOT NULL DEFAULT 'singleton',
    `razonSocial` VARCHAR(191) NOT NULL DEFAULT '',
    `nit` VARCHAR(191) NOT NULL DEFAULT '',
    `direccion` VARCHAR(191) NOT NULL DEFAULT '',
    `ciudad` VARCHAR(191) NOT NULL DEFAULT '',
    `telefono` VARCHAR(191) NOT NULL DEFAULT '',
    `email` VARCHAR(191) NOT NULL DEFAULT '',
    `sitioWeb` VARCHAR(191) NOT NULL DEFAULT '',
    `reps` VARCHAR(191) NOT NULL DEFAULT '',
    `logoPath` VARCHAR(191) NOT NULL DEFAULT '',
    `updatedAt` DATETIME(3) NOT NULL,

    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `auditoria` (
    `id` VARCHAR(191) NOT NULL,
    `usuarioId` VARCHAR(191) NULL,
    `examenId` VARCHAR(191) NULL,
    `accion` ENUM('CREAR', 'ACTUALIZAR', 'EMITIR', 'ANULAR', 'DESCARGAR_PDF', 'INICIAR_SESION') NOT NULL,
    `detalle` TEXT NULL,
    `ip` VARCHAR(45) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),

    INDEX `auditoria_examenId_idx`(`examenId`),
    INDEX `auditoria_createdAt_idx`(`createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `intentos_acceso` (
    `id` VARCHAR(191) NOT NULL,
    `email` VARCHAR(191) NOT NULL,
    `ip` VARCHAR(45) NULL,
    `exitoso` BOOLEAN NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),

    INDEX `intentos_acceso_email_createdAt_idx`(`email`, `createdAt`),
    INDEX `intentos_acceso_ip_createdAt_idx`(`ip`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- AddForeignKey
ALTER TABLE `examenes` ADD CONSTRAINT `examenes_pacienteId_fkey` FOREIGN KEY (`pacienteId`) REFERENCES `pacientes`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `examenes` ADD CONSTRAINT `examenes_empresaId_fkey` FOREIGN KEY (`empresaId`) REFERENCES `empresas`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `examenes` ADD CONSTRAINT `examenes_medicoId_fkey` FOREIGN KEY (`medicoId`) REFERENCES `usuarios`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `examenes` ADD CONSTRAINT `examenes_creadoPorId_fkey` FOREIGN KEY (`creadoPorId`) REFERENCES `usuarios`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `paraclinicos` ADD CONSTRAINT `paraclinicos_examenId_fkey` FOREIGN KEY (`examenId`) REFERENCES `examenes`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `auditoria` ADD CONSTRAINT `auditoria_usuarioId_fkey` FOREIGN KEY (`usuarioId`) REFERENCES `usuarios`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `auditoria` ADD CONSTRAINT `auditoria_examenId_fkey` FOREIGN KEY (`examenId`) REFERENCES `examenes`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;

