-- 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);