Import initial de Vivier depuis l'hebergement OVH
This commit is contained in:
commit
839e5e57c5
126 files changed
+22447
No files matched your search
+481
@@ -0,0 +1,481 @@
|
||||
-- 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');
|
||||
Reference in new issue
Block a user