d85a7196f0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
81 lines
4.3 KiB
SQL
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);
|