Files
project.linkedcorp.net/backend/database/migrations/038_integrations.sql
T
2026-10-29 17:15:12 -05:00

81 lines
4.3 KiB
SQL

-- Conexiones externas (conectores de solo lectura, contrato v1 en data/conectores/README.md),
-- empleados importados de nómina y vínculo de pacientes con el sistema origen. Idempotente.
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS external_connections (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(120) NOT NULL,
base_url VARCHAR(255) NOT NULL,
token_encrypted TEXT NOT NULL,
is_active TINYINT(1) NOT NULL DEFAULT 1,
created_by INT NULL,
edit_version INT UNSIGNED NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_ext_conn_creator FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Una fuente por destino: qué tabla del conector alimenta Pacientes o Empleados, cómo (importar o
-- consultar en vivo), el mapeo de campos y el estado de la última sincronización.
CREATE TABLE IF NOT EXISTS external_sources (
id INT AUTO_INCREMENT PRIMARY KEY,
purpose ENUM('patients','employees') NOT NULL UNIQUE,
connection_id INT NOT NULL,
source_key VARCHAR(64) NOT NULL,
table_name VARCHAR(64) NOT NULL,
mode ENUM('import','live') NOT NULL DEFAULT 'import',
field_map_json TEXT NOT NULL,
filter_json TEXT NULL,
changed_field VARCHAR(64) NULL,
last_full_sync_at DATETIME NULL,
last_sync_at DATETIME NULL,
last_max_recno INT UNSIGNED NULL,
last_changed_value VARCHAR(40) NULL,
last_result_json TEXT NULL,
edit_version INT UNSIGNED NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_ext_source_conn FOREIGN KEY (connection_id) REFERENCES external_connections(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS employees (
id INT AUTO_INCREMENT PRIMARY KEY,
identification VARCHAR(40) NOT NULL UNIQUE,
last_names VARCHAR(120) NOT NULL DEFAULT '',
first_names VARCHAR(120) NOT NULL DEFAULT '',
phone VARCHAR(40) NULL,
phone2 VARCHAR(40) NULL,
birth_date DATE NULL,
position VARCHAR(120) NULL,
department_name VARCHAR(120) NULL,
hire_date DATE NULL,
leave_date DATE NULL,
is_active TINYINT(1) NOT NULL DEFAULT 1,
in_source TINYINT(1) NOT NULL DEFAULT 1,
user_id INT NULL UNIQUE,
synced_at DATETIME NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_employee_name (last_names, first_names),
CONSTRAINT fk_employee_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Tercera fuente: proveedores (médicos que facturan), para buscarlos y agregarlos como empleados.
ALTER TABLE external_sources MODIFY purpose ENUM('patients','employees','providers') NOT NULL;
-- Origen del empleado: nómina (se sincroniza) o proveedor de SAGA cargado a mano (médicos que facturan;
-- la sincronización de nómina no los inactiva). Correo: los proveedores lo tienen, la nómina no.
ALTER TABLE employees ADD COLUMN IF NOT EXISTS origin ENUM('payroll','provider') NOT NULL DEFAULT 'payroll' AFTER is_active;
ALTER TABLE employees ADD COLUMN IF NOT EXISTS email VARCHAR(160) NULL AFTER phone2;
-- Pacientes vinculados al origen (SAGA): source_name guarda el nombre tal como viene (SAGA no
-- separa nombres y apellidos ni respeta un orden); mientras recepción no lo separe a mano, el
-- nombre visible es ese. Manda el origen en identificación/teléfono/correo/nombre de origen.
ALTER TABLE clinic_patients ADD COLUMN IF NOT EXISTS external_source VARCHAR(20) NULL AFTER notes;
ALTER TABLE clinic_patients ADD COLUMN IF NOT EXISTS external_id VARCHAR(40) NULL AFTER external_source;
ALTER TABLE clinic_patients ADD COLUMN IF NOT EXISTS source_name VARCHAR(160) NULL AFTER external_id;
ALTER TABLE clinic_patients ADD COLUMN IF NOT EXISTS name_split TINYINT(1) NOT NULL DEFAULT 1 AFTER source_name;
ALTER TABLE clinic_patients ADD COLUMN IF NOT EXISTS synced_at DATETIME NULL AFTER name_split;
ALTER TABLE clinic_patients MODIFY phone VARCHAR(40) NOT NULL DEFAULT '';
CREATE UNIQUE INDEX IF NOT EXISTS uq_clinic_patient_external ON clinic_patients (external_source, external_id);