Files
Vivier/sql/migration-1.7-vers-1.8.sql
T

150 lines
9.2 KiB
SQL

-- Vivier : migration 1.7 vers 1.8
-- À passer une fois, dans phpMyAdmin, base de Vivier, onglet SQL. Faire d'abord une sauvegarde (onglet Exporter).
--
-- Contenu :
-- 1. Sécurité des accès : double authentification, invitations, sessions, journal des connexions.
-- 2. Profils : disponibilité en liste fixe, nationalités, permis de travail, champs du CV Europass.
-- 3. Traduction des profils dans la langue de l'interface : file d'attente.
-- 4. Reprise des disponibilités déjà saisies.
--
-- Après la migration, chaque compte active la double authentification à sa prochaine connexion.
SET NAMES utf8mb4;
-- ---------------------------------------------------------------
-- 1. Comptes : double authentification, version de session, mot de passe à changer
-- ---------------------------------------------------------------
ALTER TABLE utilisateurs
ADD COLUMN totp_secret VARCHAR(255) NULL AFTER mot_de_passe, -- clé de l'application d'authentification, chiffrée
ADD COLUMN totp_active_le DATETIME NULL AFTER totp_secret, -- NULL : double authentification à activer
ADD COLUMN totp_dernier_pas BIGINT NULL AFTER totp_active_le, -- dernier code accepté : un code ne sert qu'une fois
ADD COLUMN codes_secours TEXT NULL AFTER totp_dernier_pas, -- empreintes des codes de secours restants (JSON)
ADD COLUMN session_version INT UNSIGNED NOT NULL DEFAULT 1 AFTER codes_secours, -- +1 ferme toutes les sessions du compte
ADD COLUMN changer_mot_de_passe TINYINT(1) NOT NULL DEFAULT 0 AFTER session_version; -- mot de passe donné par le gestionnaire
-- Invitations : un lien à usage unique, valable 48 heures, remplace la page publique de demande de compte
CREATE TABLE IF NOT EXISTS invitations (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
jeton CHAR(64) CHARACTER SET ascii NOT NULL, -- empreinte SHA-256 du jeton : le lien lui-même n'est jamais enregistré
nom_affiche VARCHAR(120) NULL, -- nom proposé par le gestionnaire, modifiable par la personne
cree_par INT UNSIGNED NOT NULL,
cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
expire_le DATETIME NOT NULL,
utilise_le DATETIME NULL,
annule_le DATETIME NULL,
utilisateur_id INT UNSIGNED NULL, -- compte créé avec ce lien
UNIQUE KEY uq_invitation_jeton (jeton),
CONSTRAINT fk_invitation_cree_par FOREIGN KEY (cree_par) REFERENCES utilisateurs(id),
CONSTRAINT fk_invitation_utilisateur FOREIGN KEY (utilisateur_id) REFERENCES utilisateurs(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Journal des connexions : chaque essai, réussi ou non. Gardé 12 mois.
CREATE TABLE IF NOT EXISTS connexions (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
moment DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
utilisateur_id INT UNSIGNED NULL,
identifiant VARCHAR(190) NOT NULL,
ip VARCHAR(45) NOT NULL,
reseau VARCHAR(45) NOT NULL, -- réseau de l'adresse (IPv4 /24, IPv6 /48) : sert à repérer un lieu nouveau
navigateur VARCHAR(255) NOT NULL DEFAULT '',
resultat VARCHAR(20) NOT NULL, -- reussie, mot_de_passe, code, bloquee, desactive, attente
KEY idx_connexion_moment (moment),
KEY idx_connexion_compte (utilisateur_id, reseau),
CONSTRAINT fk_connexion_utilisateur FOREIGN KEY (utilisateur_id) REFERENCES utilisateurs(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ---------------------------------------------------------------
-- 2. Profils
-- ---------------------------------------------------------------
ALTER TABLE candidats
ADD COLUMN disponibilite_code ENUM('immediate','1_mois','2_mois','3_mois','date','a_preciser') NULL AFTER disponibilite,
ADD COLUMN nationalites VARCHAR(60) NULL AFTER pays, -- codes ISO 3166-1 séparés par des virgules : FR,MA
ADD COLUMN hors_ue TINYINT(1) NULL AFTER nationalites, -- 0 : au moins une nationalité UE, EEE ou suisse ; 1 : aucune ; NULL : inconnu
ADD COLUMN permis_travail VARCHAR(300) NULL AFTER hors_ue, -- statut du permis de travail au Luxembourg, texte libre
ADD COLUMN permis_expire_le DATE NULL AFTER permis_travail, -- fin de validité du titre
ADD COLUMN benevolat TEXT NULL AFTER encadrement, -- une activité par ligne (CV Europass)
ADD COLUMN permis_conduire VARCHAR(100) NULL AFTER benevolat, -- catégories : B, A1
ADD KEY idx_hors_ue (hors_ue),
ADD KEY idx_permis_expire (permis_expire_le);
ALTER TABLE experiences
ADD COLUMN projet VARCHAR(200) NULL AFTER client,
ADD COLUMN mission TEXT NULL AFTER projet,
ADD COLUMN charge VARCHAR(300) NULL AFTER mission; -- charge en jours-homme, avec sa répartition
ALTER TABLE formations
ADD COLUMN date_debut VARCHAR(7) CHARACTER SET ascii NULL AFTER etablissement, -- AAAA-MM ou AAAA
ADD COLUMN date_fin VARCHAR(7) CHARACTER SET ascii NULL AFTER date_debut,
ADD COLUMN lieu VARCHAR(150) NULL AFTER date_fin;
-- Niveaux de la grille européenne (CECRL), quand le CV les donne
ALTER TABLE langues
ADD COLUMN ecoute ENUM('A1','A2','B1','B2','C1','C2') NULL AFTER niveau,
ADD COLUMN lecture ENUM('A1','A2','B1','B2','C1','C2') NULL AFTER ecoute,
ADD COLUMN production_orale ENUM('A1','A2','B1','B2','C1','C2') NULL AFTER lecture,
ADD COLUMN interaction_orale ENUM('A1','A2','B1','B2','C1','C2') NULL AFTER production_orale,
ADD COLUMN ecriture ENUM('A1','A2','B1','B2','C1','C2') NULL AFTER interaction_orale;
-- Relance créée par Vivier (renouvellement du titre de séjour) : Vivier la met à jour quand la date change
ALTER TABLE relances
ADD COLUMN auto VARCHAR(20) NULL AFTER objet,
ADD KEY idx_relance_auto (candidat_id, auto);
-- ---------------------------------------------------------------
-- 3. Traductions à faire : profils à traduire dans les langues de l'interface
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS traductions_a_faire (
candidat_id INT UNSIGNED NOT NULL,
langue CHAR(2) NOT NULL,
ajoute_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
essais TINYINT UNSIGNED NOT NULL DEFAULT 0,
erreur VARCHAR(500) NULL,
verrou_le DATETIME NULL, -- traduction en cours : un seul poste la fait
PRIMARY KEY (candidat_id, langue),
CONSTRAINT fk_afaire_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- ---------------------------------------------------------------
-- 4. Reprise des disponibilités
-- Une date déjà saisie par IT Club devient « Date précise ».
-- Le texte du CV est classé par règles simples ; le reste passe en « À préciser ».
-- Le texte d'origine reste en note sous la valeur, pour être corrigé à la main.
-- « Sous N mois » reçoit une date estimée : date de l'import + N mois.
-- ---------------------------------------------------------------
UPDATE candidats SET disponibilite_code = 'date'
WHERE disponibilite_code IS NULL AND disponible_le IS NOT NULL;
UPDATE candidats
SET disponible_le = STR_TO_DATE(REGEXP_SUBSTR(disponibilite, '[0-9]{2}/[0-9]{2}/[0-9]{4}'), '%d/%m/%Y'),
disponibilite_code = 'date'
WHERE disponibilite_code IS NULL AND disponibilite REGEXP '[0-9]{2}/[0-9]{2}/[0-9]{4}';
UPDATE candidats
SET disponible_le = STR_TO_DATE(REGEXP_SUBSTR(disponibilite, '[0-9]{4}-[0-9]{2}-[0-9]{2}'), '%Y-%m-%d'),
disponibilite_code = 'date'
WHERE disponibilite_code IS NULL AND disponibilite REGEXP '[0-9]{4}-[0-9]{2}-[0-9]{2}';
UPDATE candidats SET disponibilite_code = 'immediate'
WHERE disponibilite_code IS NULL
AND LOWER(disponibilite) REGEXP 'imm.{1,2}diat|tout de suite|sans pr.{1,2}avis|available now|right away|sofort|^ *disponible *\\.? *$';
UPDATE candidats SET disponibilite_code = '1_mois', disponible_le = DATE_ADD(DATE(cree_le), INTERVAL 1 MONTH)
WHERE disponibilite_code IS NULL
AND LOWER(disponibilite) REGEXP '(^|[^0-9])(1|un|one) (mois|month)|4 semaines|4 weeks|30 jours|30 days|1 monat';
UPDATE candidats SET disponibilite_code = '2_mois', disponible_le = DATE_ADD(DATE(cree_le), INTERVAL 2 MONTH)
WHERE disponibilite_code IS NULL
AND LOWER(disponibilite) REGEXP '(^|[^0-9])(2|deux|two) (mois|months)|8 semaines|8 weeks|60 jours|60 days|2 monate';
UPDATE candidats SET disponibilite_code = '3_mois', disponible_le = DATE_ADD(DATE(cree_le), INTERVAL 3 MONTH)
WHERE disponibilite_code IS NULL
AND LOWER(disponibilite) REGEXP '(^|[^0-9])(3|trois|three) (mois|months)|12 semaines|12 weeks|90 jours|90 days|3 monate';
UPDATE candidats SET disponibilite_code = 'a_preciser'
WHERE disponibilite_code IS NULL AND disponibilite IS NOT NULL AND TRIM(disponibilite) <> '';
-- ---------------------------------------------------------------
-- Les demandes de compte encore en attente restent visibles dans Comptes, pour être acceptées ou refusées.
-- Les nouvelles personnes rejoignent Vivier par un lien d'invitation.
-- ---------------------------------------------------------------