-- Vivier : passage d'une base 1.3 à 1.4 -- Un seul état « Entretiens en cours », archivage, suivi des entretiens, relances, besoins clients, -- champs commerciaux, consentement, import en lot, sauvegardes. -- À exécuter une seule fois dans phpMyAdmin. SET NAMES utf8mb4; -- Les deux anciens états d'entretien deviennent « entretiens » ALTER TABLE candidats MODIFY statut ENUM('recu','en_cours','entretien_1_valide','entretien_2_valide','entretiens', 'non_retenu','valide','embauche') NOT NULL DEFAULT 'recu'; UPDATE candidats SET statut = 'entretiens' WHERE statut IN ('entretien_1_valide', 'entretien_2_valide'); ALTER TABLE candidats MODIFY statut ENUM('recu','en_cours','entretiens','non_retenu','valide','embauche') NOT NULL DEFAULT 'recu'; ALTER TABLE candidats ADD COLUMN disponible_le DATE NULL AFTER disponibilite, ADD COLUMN tjm SMALLINT UNSIGNED NULL AFTER disponible_le, ADD COLUMN salaire_souhaite INT UNSIGNED NULL AFTER tjm, ADD COLUMN mobilite VARCHAR(200) NULL AFTER salaire_souhaite, ADD COLUMN teletravail ENUM('non','partiel','complet') NULL AFTER mobilite, ADD COLUMN archive_le DATETIME NULL AFTER motif_refus, ADD COLUMN archive_par INT UNSIGNED NULL AFTER archive_le, ADD COLUMN consentement_le DATE NULL AFTER conserver_jusqu_au, ADD COLUMN consentement_note VARCHAR(200) NULL AFTER consentement_le, ADD KEY idx_archive (archive_le), ADD CONSTRAINT fk_candidat_archive_par FOREIGN KEY (archive_par) REFERENCES utilisateurs(id); -- Le journal accepte de nouvelles actions sans changer la table à chaque version ALTER TABLE historique MODIFY action VARCHAR(40) NOT NULL; -- --------------------------------------------------------------- -- Besoins clients : les missions à pourvoir, et les profils proposés pour chacune -- --------------------------------------------------------------- CREATE TABLE besoins ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, client VARCHAR(200) NOT NULL, intitule VARCHAR(200) NOT NULL, description TEXT NULL, technologies VARCHAR(1000) NULL, -- liste séparée par des virgules seniorite_min ENUM('junior','intermediaire','confirme','expert') NULL, langues VARCHAR(300) NULL, -- liste séparée par des virgules lieu VARCHAR(150) NULL, teletravail ENUM('non','partiel','complet') NULL, tjm_max SMALLINT UNSIGNED NULL, -- budget journalier du client, en euros date_debut DATE NULL, statut ENUM('ouvert','pourvu','ferme') NOT NULL DEFAULT 'ouvert', cree_par INT UNSIGNED NOT NULL, cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, modifie_le DATETIME NULL, KEY idx_besoin_statut (statut), CONSTRAINT fk_besoin_cree_par FOREIGN KEY (cree_par) REFERENCES utilisateurs(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE besoin_candidat ( besoin_id INT UNSIGNED NOT NULL, candidat_id INT UNSIGNED NOT NULL, etat ENUM('propose','presente','retenu','ecarte') NOT NULL DEFAULT 'propose', note VARCHAR(500) NULL, ajoute_par INT UNSIGNED NOT NULL, ajoute_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (besoin_id, candidat_id), KEY idx_bc_candidat (candidat_id), CONSTRAINT fk_bc_besoin FOREIGN KEY (besoin_id) REFERENCES besoins(id) ON DELETE CASCADE, CONSTRAINT fk_bc_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE, CONSTRAINT fk_bc_utilisateur FOREIGN KEY (ajoute_par) REFERENCES utilisateurs(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- --------------------------------------------------------------- -- Entretiens : un candidat peut en passer plusieurs pendant le statut « Entretiens en cours » -- --------------------------------------------------------------- CREATE TABLE entretiens ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, candidat_id INT UNSIGNED NOT NULL, date_entretien DATETIME NOT NULL, type ENUM('telephone','visio','presentiel','technique','client') NOT NULL, interlocuteur VARCHAR(150) NULL, -- qui a mené l'entretien besoin_id INT UNSIGNED NULL, -- besoin client concerné, s'il y en a un avis ENUM('favorable','reserve','defavorable') NULL, compte_rendu TEXT NULL, cree_par INT UNSIGNED NOT NULL, cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_entretien_candidat (candidat_id, date_entretien), KEY idx_entretien_date (date_entretien), CONSTRAINT fk_entretien_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE, CONSTRAINT fk_entretien_besoin FOREIGN KEY (besoin_id) REFERENCES besoins(id) ON DELETE SET NULL, CONSTRAINT fk_entretien_cree_par FOREIGN KEY (cree_par) REFERENCES utilisateurs(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- --------------------------------------------------------------- -- Relances : une chose à faire pour un candidat, à une date donnée -- --------------------------------------------------------------- CREATE TABLE relances ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, candidat_id INT UNSIGNED NOT NULL, echeance DATE NOT NULL, objet VARCHAR(200) NOT NULL, fait_le DATETIME NULL, fait_par INT UNSIGNED NULL, cree_par INT UNSIGNED NOT NULL, cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_relance_echeance (fait_le, echeance), KEY idx_relance_candidat (candidat_id), CONSTRAINT fk_relance_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE, CONSTRAINT fk_relance_fait_par FOREIGN KEY (fait_par) REFERENCES utilisateurs(id), CONSTRAINT fk_relance_cree_par FOREIGN KEY (cree_par) REFERENCES utilisateurs(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- --------------------------------------------------------------- -- Import en lot : un CV par ligne, en attente d'analyse ou de relecture. -- La ligne disparaît quand le profil est enregistré. -- --------------------------------------------------------------- CREATE TABLE imports_lot ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, jeton CHAR(32) CHARACTER SET ascii NOT NULL, -- nom du dossier temporaire nom_fichier VARCHAR(255) NOT NULL, etat ENUM('en_attente','pret','erreur') NOT NULL DEFAULT 'en_attente', erreur VARCHAR(1000) NULL, candidat VARCHAR(200) NULL, -- nom lu dans le profil, une fois l'analyse faite meta JSON NULL, -- fichiers rangés dans le dossier temporaire cree_par INT UNSIGNED NOT NULL, cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uq_lot_jeton (jeton), CONSTRAINT fk_lot_cree_par FOREIGN KEY (cree_par) REFERENCES utilisateurs(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- --------------------------------------------------------------- -- Sauvegardes de la base : une ligne par exécution, réussie ou non -- --------------------------------------------------------------- CREATE TABLE sauvegardes ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, origine ENUM('planifiee','manuelle') NOT NULL, reussie TINYINT(1) NOT NULL DEFAULT 0, fichier VARCHAR(100) NULL, -- nom du zip dans stockage/sauvegardes, NULL s'il a été supprimé taille_octets INT UNSIGNED NULL, profils INT UNSIGNED NULL, -- nombre de profils dans la sauvegarde envoi ENUM('envoye','sans_piece','echec','non_demande') NOT NULL DEFAULT 'non_demande', detail VARCHAR(500) NULL, cree_par INT UNSIGNED NULL, -- NULL : tâche planifiée KEY idx_sauvegarde_date (cree_le), CONSTRAINT fk_sauvegarde_cree_par FOREIGN KEY (cree_par) REFERENCES utilisateurs(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;