482 lines
26 KiB
SQL
482 lines
26 KiB
SQL
-- Outil de suivi des CV IT Club
|
|
-- Schéma MySQL / MariaDB (InnoDB, utf8mb4)
|
|
-- Version 1.8 de la base, format de profil cv-profil.schema.json 1.2
|
|
-- Base déjà créée : exécuter à la place les fichiers migration-*.sql, dans l'ordre.
|
|
|
|
SET NAMES utf8mb4;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Comptes et rôles
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE utilisateurs (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
identifiant VARCHAR(190) NOT NULL, -- nom de connexion, choisi par le gestionnaire
|
|
nom_affiche VARCHAR(120) NOT NULL,
|
|
mot_de_passe VARCHAR(255) NOT NULL, -- password_hash() de PHP
|
|
totp_secret VARCHAR(255) NULL, -- clé de l'application d'authentification, chiffrée
|
|
totp_active_le DATETIME NULL, -- NULL : double authentification à activer
|
|
totp_dernier_pas BIGINT NULL, -- dernier code accepté : un code ne sert qu'une fois
|
|
codes_secours TEXT NULL, -- empreintes des codes de secours restants (JSON)
|
|
session_version INT UNSIGNED NOT NULL DEFAULT 1, -- +1 ferme toutes les sessions du compte
|
|
changer_mot_de_passe TINYINT(1) NOT NULL DEFAULT 0, -- mot de passe donné par le gestionnaire : à changer
|
|
role ENUM('admin','recruteur') NOT NULL DEFAULT 'recruteur', -- admin : gère aussi les comptes
|
|
actif TINYINT(1) NOT NULL DEFAULT 1,
|
|
en_attente TINYINT(1) NOT NULL DEFAULT 0, -- demande de compte à valider par le gestionnaire (actif = 0)
|
|
cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
derniere_connexion DATETIME NULL,
|
|
langue CHAR(2) NOT NULL DEFAULT 'fr', -- langue de l'interface pour ce compte
|
|
UNIQUE KEY identifiant (identifiant)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Candidats
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE candidats (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
prenom VARCHAR(100) NOT NULL,
|
|
nom VARCHAR(100) NOT NULL,
|
|
email VARCHAR(190) NULL,
|
|
telephone VARCHAR(40) NULL,
|
|
rue VARCHAR(200) NULL,
|
|
code_postal VARCHAR(20) NULL,
|
|
ville VARCHAR(100) NULL,
|
|
pays VARCHAR(100) NULL,
|
|
nationalites VARCHAR(60) NULL, -- codes ISO 3166-1 séparés par des virgules : FR,MA
|
|
hors_ue TINYINT(1) NULL, -- 0 : au moins une nationalité UE, EEE ou suisse ; 1 : aucune ; NULL : inconnu
|
|
permis_travail VARCHAR(300) NULL, -- statut du permis de travail au Luxembourg, texte libre
|
|
permis_expire_le DATE NULL, -- fin de validité du titre
|
|
titre VARCHAR(200) NULL,
|
|
resume TEXT NULL,
|
|
disponibilite VARCHAR(200) NULL, -- disponibilité telle que le CV l'écrit, gardée en note
|
|
disponibilite_code ENUM('immediate','1_mois','2_mois','3_mois','date','a_preciser') NULL,
|
|
disponible_le DATE NULL, -- date de disponibilité, quand elle est connue
|
|
tjm SMALLINT UNSIGNED NULL, -- taux journalier souhaité, en euros
|
|
salaire_souhaite INT UNSIGNED NULL, -- salaire annuel brut souhaité, en euros
|
|
mobilite VARCHAR(200) NULL, -- zones acceptées, déplacements
|
|
teletravail ENUM('non','partiel','complet') NULL,
|
|
niveau_etudes VARCHAR(20) NULL, -- bac, bac+2, bac+3, bac+4, bac+5, doctorat, autre
|
|
encadrement TINYINT(1) NULL, -- a encadré une équipe : 1, 0 ou inconnu
|
|
benevolat TEXT NULL, -- une activité par ligne (CV Europass)
|
|
permis_conduire VARCHAR(100) NULL, -- catégories : B, A1
|
|
|
|
annees_experience DECIMAL(4,1) NOT NULL DEFAULT 0, -- recalculé par PHP à l'import
|
|
seniorite ENUM('junior','intermediaire','confirme','expert') NOT NULL,
|
|
|
|
statut ENUM('recu','en_cours','entretiens','non_retenu','valide','embauche') NOT NULL DEFAULT 'recu',
|
|
motif_refus VARCHAR(500) NULL, -- obligatoire si statut = non_retenu
|
|
archive_le DATETIME NULL, -- profil archivé : sorti du Kanban, gardé dans la base
|
|
archive_par INT UNSIGNED NULL,
|
|
supprime_le DATETIME NULL, -- profil à la corbeille : effacé pour de bon 30 jours après
|
|
supprime_par INT UNSIGNED NULL,
|
|
position_kanban INT NOT NULL DEFAULT 0, -- ordre dans la colonne
|
|
|
|
json_source JSON NOT NULL, -- JSON importé, conservé tel quel
|
|
schema_version VARCHAR(10) NOT NULL,
|
|
texte_recherche MEDIUMTEXT NOT NULL, -- texte complet, pour la recherche de phrases exactes
|
|
|
|
photo VARCHAR(100) NULL, -- chemin interne de la photo, pour reconnaître le candidat
|
|
conserver_jusqu_au DATE NULL, -- échéance de suppression (RGPD)
|
|
consentement_le DATE NULL, -- date de l'accord du candidat pour la conservation
|
|
consentement_note VARCHAR(200) NULL, -- comment l'accord a été recueilli
|
|
cree_par INT UNSIGNED NOT NULL,
|
|
cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
modifie_par INT UNSIGNED NULL,
|
|
modifie_le DATETIME NULL,
|
|
|
|
UNIQUE KEY uq_candidat_email (email), -- détection des doublons
|
|
KEY idx_statut (statut, position_kanban),
|
|
KEY idx_seniorite (seniorite),
|
|
KEY fk_candidat_cree_par (cree_par),
|
|
KEY fk_candidat_modifie_par (modifie_par),
|
|
KEY idx_archive (archive_le),
|
|
KEY fk_candidat_archive_par (archive_par),
|
|
KEY idx_supprime (supprime_le),
|
|
KEY idx_hors_ue (hors_ue),
|
|
KEY idx_permis_expire (permis_expire_le),
|
|
KEY fk_candidat_supprime_par (supprime_par),
|
|
FULLTEXT KEY ft_recherche (texte_recherche),
|
|
CONSTRAINT fk_candidat_cree_par FOREIGN KEY (cree_par) REFERENCES utilisateurs(id),
|
|
CONSTRAINT fk_candidat_modifie_par FOREIGN KEY (modifie_par) REFERENCES utilisateurs(id),
|
|
CONSTRAINT fk_candidat_archive_par FOREIGN KEY (archive_par) REFERENCES utilisateurs(id),
|
|
CONSTRAINT fk_candidat_supprime_par FOREIGN KEY (supprime_par) REFERENCES utilisateurs(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE liens (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
type ENUM('linkedin','github','portfolio','site','autre') NOT NULL,
|
|
url VARCHAR(500) NOT NULL,
|
|
CONSTRAINT fk_lien_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE experiences (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
poste VARCHAR(200) NOT NULL,
|
|
employeur VARCHAR(200) NULL,
|
|
client VARCHAR(200) NULL,
|
|
projet VARCHAR(200) NULL,
|
|
mission TEXT NULL,
|
|
charge VARCHAR(300) NULL, -- charge en jours-homme, avec sa répartition
|
|
lieu VARCHAR(150) NULL,
|
|
type ENUM('emploi','mission','alternance','stage','independant') NOT NULL,
|
|
date_debut DATE NOT NULL, -- 1er du mois (ou 1er janvier si mois inconnu)
|
|
date_fin DATE NULL, -- NULL = en cours
|
|
description TEXT NULL,
|
|
technologies VARCHAR(1000) NULL, -- liste séparée par des virgules, pour l'affichage
|
|
KEY idx_exp_candidat (candidat_id, date_debut),
|
|
CONSTRAINT fk_exp_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE formations (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
diplome VARCHAR(250) NOT NULL,
|
|
etablissement VARCHAR(250) NULL,
|
|
date_debut VARCHAR(7) CHARACTER SET ascii NULL, -- AAAA-MM ou AAAA
|
|
date_fin VARCHAR(7) CHARACTER SET ascii NULL,
|
|
lieu VARCHAR(150) NULL,
|
|
annee_fin SMALLINT UNSIGNED NULL,
|
|
CONSTRAINT fk_formation_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE certifications (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
nom VARCHAR(250) NOT NULL,
|
|
organisme VARCHAR(250) NULL,
|
|
annee SMALLINT UNSIGNED NULL,
|
|
CONSTRAINT fk_certif_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Référentiel des technologies, partagé entre candidats (filtres, statistiques)
|
|
CREATE TABLE technologies (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
nom VARCHAR(100) NOT NULL UNIQUE,
|
|
categorie ENUM('langage','framework','base_de_donnees','outil','cloud','methode','autre') NOT NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE candidat_technologie (
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
technologie_id INT UNSIGNED NOT NULL,
|
|
annees DECIMAL(4,1) NULL,
|
|
PRIMARY KEY (candidat_id, technologie_id),
|
|
CONSTRAINT fk_ct_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_ct_techno FOREIGN KEY (technologie_id) REFERENCES technologies(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE langues (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
langue VARCHAR(60) NOT NULL,
|
|
niveau ENUM('A1','A2','B1','B2','C1','C2','natif') NULL,
|
|
-- Grille européenne (CECRL), quand le CV la donne
|
|
ecoute ENUM('A1','A2','B1','B2','C1','C2') NULL,
|
|
lecture ENUM('A1','A2','B1','B2','C1','C2') NULL,
|
|
production_orale ENUM('A1','A2','B1','B2','C1','C2') NULL,
|
|
interaction_orale ENUM('A1','A2','B1','B2','C1','C2') NULL,
|
|
ecriture ENUM('A1','A2','B1','B2','C1','C2') NULL,
|
|
CONSTRAINT fk_langue_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Documents attachés (CV d'origine, rapport, lettres, diplômes)
|
|
-- Les fichiers sont stockés hors de la racine web ; la base garde le chemin.
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE documents (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
type ENUM('cv_origine','rapport','cv_itclub','cv_anonyme','autre') NOT NULL,
|
|
nom_fichier VARCHAR(255) NOT NULL, -- nom affiché
|
|
chemin VARCHAR(500) NOT NULL, -- chemin interne, nom aléatoire
|
|
type_mime VARCHAR(100) NOT NULL,
|
|
taille_octets INT UNSIGNED NOT NULL,
|
|
ajoute_par INT UNSIGNED NOT NULL,
|
|
ajoute_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
KEY idx_doc_candidat (candidat_id),
|
|
CONSTRAINT fk_doc_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_doc_utilisateur FOREIGN KEY (ajoute_par) REFERENCES utilisateurs(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Commentaires
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE commentaires (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
auteur_id INT UNSIGNED NOT NULL,
|
|
texte TEXT NOT NULL,
|
|
cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
modifie_le DATETIME NULL,
|
|
KEY idx_com_candidat (candidat_id, cree_le),
|
|
CONSTRAINT fk_com_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_com_auteur FOREIGN KEY (auteur_id) REFERENCES utilisateurs(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Journal d'audit : qui a modifié quoi et quand
|
|
-- Pas de clé étrangère vers candidats : la trace survit à une suppression.
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE historique (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
candidat_id INT UNSIGNED NULL,
|
|
utilisateur_id INT UNSIGNED NOT NULL,
|
|
action VARCHAR(40) NOT NULL, -- code de l'action, voir ACTIONS_JOURNAL
|
|
champ VARCHAR(100) NULL,
|
|
ancienne_valeur TEXT NULL,
|
|
nouvelle_valeur TEXT NULL,
|
|
cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
KEY idx_hist_candidat (candidat_id, cree_le),
|
|
KEY idx_hist_utilisateur (utilisateur_id, cree_le),
|
|
CONSTRAINT fk_hist_utilisateur FOREIGN KEY (utilisateur_id) REFERENCES utilisateurs(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Mots-clés et métadonnées de recherche
|
|
-- Fournis par l'analyse (manuel = 0) ou ajoutés à la main sur la fiche (manuel = 1).
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE mots_cles (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
type ENUM('role','specialite','secteur','mot_cle') NOT NULL,
|
|
mot VARCHAR(80) NOT NULL,
|
|
manuel TINYINT(1) NOT NULL DEFAULT 0,
|
|
UNIQUE KEY uq_mot (candidat_id, type, mot),
|
|
CONSTRAINT fk_mot_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Index de recherche : un terme normalisé par ligne, avec son poids.
|
|
-- Reconstruit par PHP à chaque import ou modification d'un profil.
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE index_recherche (
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
terme VARCHAR(60) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
|
|
poids SMALLINT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (candidat_id, terme),
|
|
KEY idx_terme (terme),
|
|
CONSTRAINT fk_index_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Traductions du contenu d'un profil, pour générer le CV dans une autre langue.
|
|
-- L'empreinte désigne la version du profil traduite : si le profil change, la traduction est périmée.
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE traductions (
|
|
candidat_id INT UNSIGNED NOT NULL,
|
|
langue CHAR(2) NOT NULL,
|
|
contenu JSON NOT NULL,
|
|
empreinte CHAR(40) CHARACTER SET ascii NOT NULL,
|
|
origine ENUM('automatique','fichier') NOT NULL,
|
|
cree_par INT UNSIGNED NOT NULL,
|
|
cree_le DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (candidat_id, langue),
|
|
CONSTRAINT fk_trad_candidat FOREIGN KEY (candidat_id) REFERENCES candidats(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_trad_utilisateur FOREIGN KEY (cree_par) REFERENCES utilisateurs(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Profils à traduire dans les langues de l'interface : le navigateur d'un compte connecté les traite un par un
|
|
CREATE TABLE 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;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- 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,
|
|
auto VARCHAR(20) NULL, -- relance créée par Vivier (permis) : mise à jour quand la date change
|
|
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),
|
|
KEY idx_relance_auto (candidat_id, auto),
|
|
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;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Échecs de connexion récents : blocage temporaire (voir src/securite.php)
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE tentatives_connexion (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
cle VARCHAR(190) NOT NULL,
|
|
moment DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
KEY idx_cle (cle, moment)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Invitations : un lien à usage unique, valable 48 heures
|
|
CREATE TABLE 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,
|
|
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,
|
|
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 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)
|
|
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;
|
|
|
|
-- ---------------------------------------------------------------
|
|
-- Synonymes de recherche : traduit un mot tapé en filtre ou en termes
|
|
-- ---------------------------------------------------------------
|
|
CREATE TABLE synonymes_recherche (
|
|
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
terme VARCHAR(100) NOT NULL,
|
|
cible_type ENUM('seniorite','texte') NOT NULL,
|
|
cible VARCHAR(100) NOT NULL,
|
|
KEY idx_terme (terme)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
INSERT INTO synonymes_recherche (terme, cible_type, cible) VALUES
|
|
('senior', 'seniorite', 'confirme'),
|
|
('senior', 'seniorite', 'expert'),
|
|
('sénior', 'seniorite', 'confirme'),
|
|
('sénior', 'seniorite', 'expert'),
|
|
('junior', 'seniorite', 'junior'),
|
|
('confirmé','seniorite', 'confirme'),
|
|
('expert', 'seniorite', 'expert'),
|
|
('intermédiaire', 'seniorite', 'intermediaire'),
|
|
('dev', 'texte', 'développeur'),
|
|
('developer','texte', 'développeur'),
|
|
('développeuse','texte', 'développeur'),
|
|
('fullstack','texte', 'full-stack'),
|
|
('backend', 'texte', 'back-end'),
|
|
('frontend','texte', 'front-end'),
|
|
('js', 'texte', 'javascript'),
|
|
('ts', 'texte', 'typescript'),
|
|
('postgres','texte', 'postgresql'),
|
|
('k8s', 'texte', 'kubernetes'),
|
|
('po', 'texte', 'product owner'),
|
|
('pm', 'texte', 'chef de projet'),
|
|
('lead', 'texte', 'technical lead'),
|
|
('architect','texte', 'architecte'),
|
|
('tester', 'texte', 'testeur'),
|
|
('qa', 'texte', 'test');
|