Création de votre mot de passe
Vérification en deux étapes
Chargement…
Avant de commencer, confirmez que les informations ci-dessous sont correctes.
public — search_path par défaut
Rôle : Données métier principales — lu à chaque requête authentifiée. Contient les entreprises, utilisateurs (5 rôles), certifications, résultats de quiz, tokens d'accès stagiaires et historique des tokens.
⚠️ Colonnes piège : companies.token_balance (PAS tokens_remaining) · companies.contact_email/phone (PAS email/phone) · certifications.trainee_id (PAS user_id) · certifications.is_valid (PAS status)
| TABLE | COLONNES CLÉS | DESCRIPTION & RELATIONS FK |
|---|---|---|
companies | id, name, company_type, subscription_status, token_balance, trial_ends_at, grace_ends_at, contact_email, contact_phone, siret, is_active | Entreprises clientes (type=client) et agences intérim (type=agency). token_balance = crédits quiz restants. grace_ends_at = délai post-expiration avant blocage. |
users | id, email, role, client_role, company_id, first_name, last_name, stg_number, is_active, two_fa_enabled, is_2dplus_admin, site_restriction_id | 5 rôles : admin/client/agency/trainer/trainee. client_role = admin/user/viewer (pour role=client). FK → companies. 2FA obligatoire pour client admin/user. |
sites | id, company_id, name, address, city | Sites géographiques d'une entreprise. FK → companies. Lié à users.site_restriction_id pour restreindre un client à un site. |
certifications | id, trainee_id, habilitation_type_id, is_valid, valid_until, issued_at, session_id, score_percentage | Habilitations délivrées. FK → users (trainee_id), content.habilitation_types, sess.sessions. Alerte à J-30 via scheduler. |
cert_renewals | id, certification_id, renewed_at, new_valid_until, renewed_by | Historique des renouvellements. FK → certifications. |
quiz_results | id, trainee_id, session_trainee_id, quiz_id, score_correct, score_total, score_percentage, passed, failed_fundamental, answers_json, completed_at | Résultats de quiz. FK → users, session_trainees, content.quizzes. failed_fundamental=1 = question fondamentale ratée → échec automatique §D.3.1. answers_json = détail complet. |
trainee_access_tokens | id, trainee_id, session_trainee_id, token_value, temp_password, is_used, expires_at, extra_quiz_ids, selected_question_ids | Tokens QR one-shot. temp_password affiché dans QR code. extra_quiz_ids = quiz supplémentaires (multi-habilitations). selected_question_ids = questions tirées aléatoirement. |
session_trainees | id, session_id, trainee_id, habilitation_type_id, theory_score, practical_validated, support_pedagogique_recu, nir, completed_at | Ligne par (stagiaire × habilitation × session). FK → sess.sessions, users, content.habilitation_types. Pivot central de la formation. |
trainee_habilitations | id, trainee_id, habilitation_type_id, status, acquired_at | Vue agrégée des habilitations actives d'un stagiaire (toutes sessions confondues). FK → content.habilitation_types. |
token_envelopes | id, company_id, quantity, operation, notes, created_at | Historique achats/consommations tokens quiz. FK → companies. operation = credit / debit / admin_adjust. |
worker_messages | id (SERIAL), company_id, worker_id, message, created_at | Messages de la messagerie interne (module agence/intérim). FK → companies, users. |
agency_worker_profiles | id, user_id, agency_id, availability_status, skills_json | Profils intérimaires gérés par une agence. FK → users, companies (agence). |
elearning_assignments | id, user_id, module_id, assigned_by, due_date, completed_at | Affectations de modules e-learning. FK → users, content.elearning_modules. |
content
Rôle : Référentiel pédagogique — rarement modifié, très souvent lu. Contient les 4 784 questions, 20 normes (NFC18-510, CNAM R482…), grilles pratiques et modules e-learning. Préfixer toutes les requêtes : content.habilitation_types, content.quizzes, etc.
habilitation_types.label (PAS name) · questions.quiz_id (PAS habilitation_type_id — jointure via quizzes) · questions.points >= 3 = question fondamentale (échec auto si ratée, §D.3.1 NFC18-510)
| TABLE | COLONNES CLÉS | DESCRIPTION & RELATIONS |
|---|---|---|
habilitation_types | id, code, label, norm, quiz_type, passing_score, validity_years, quiz_question_count, quiz_fundamental_count, time_limit_minutes, is_active | 141 types actifs. norm = NFC18-510 / NFC18-550 / R482… quiz_type = fin_formation / entreprise / positionnement. passing_score = seuil % (défaut 70). quiz_fundamental_count = nb fondamentales attendues. |
quizzes | id, habilitation_type_id, questionnaire_type, question_count, is_essais_base | 273+ quiz. 1 quiz = 1 habilitation + 1 type. FK → habilitation_types. is_essais_base=true = quiz de base fusionné dans les ESSAIS (ex: B2V dans B2V Essais). |
questions | id, quiz_id, question_text, question_type, points, is_active, order_index | 4 784 questions (V/F + QCM). points >= 3 → fondamentale (⚡ échec auto). Source de vérité : FORMALEO_Questions.xlsx. FK → quizzes (jamais directement → habilitation_types). |
answers | id, question_id, answer_text, is_correct, order_index | ~14 000 réponses. 2 réponses/question (V/F) ou 4 (QCM). FK → questions. is_correct = booléen (une seule bonne réponse par QCM). |
eval_grids | id, habilitation_type_id, title, passing_score, version | 92 grilles d'évaluation pratique (CNAM, NFC18-510…). FK → habilitation_types. Notation A/B/C/D/NA par critère. passing_score = % minimum de critères A/B. |
eval_criteria | id, grid_id, label, weight, order_index, is_eliminatory | 719 critères. FK → eval_grids. is_eliminatory=true → note D ou NA = échec automatique de la grille. |
elearning_modules | id, title, description, duration_min, is_published, lti_tool_id | Modules e-learning. lti_tool_id = liaison SSO LTI 1.3 vers LMS externe (Memoforma). FK → sys.lti_tools. |
elearning_slides | id, module_id, slide_type, content_json, order_index | Slides des modules internes. FK → elearning_modules. slide_type = text / video / quiz / image. |
💡 Usage : Ce schéma est lu à chaque génération de quiz (token stagiaire) et à chaque soumission. Ne jamais modifier directement en production sans recalculer les statistiques habilitation_types.
sess
Rôle : Sessions de formation présentiel — créées par les formateurs 2D+, lues par les clients et l'admin. Contient aussi les données ARGALIS (import déclaratif OPCO). Toujours préfixer : sess.sessions, sess.argalis_sessions, etc.
sessions.name (PAS title) · sessions.company_id requis pour filtrer par client · argalis_sessions.formaleo_session_id = lien vers sess.sessions (NULL si session non créée dans FORMALEO) · Risque de doublons si JOIN sans DISTINCT ON
| TABLE | COLONNES CLÉS | DESCRIPTION & RELATIONS |
|---|---|---|
formation_products | id, code, label, duration_h, norm, is_active | Catalogue des produits de formation. Référentiel utilisé pour créer des sessions. FK → content.habilitation_types via norm. |
sessions | id, trainer_id, company_id, name, session_date, location, training_type, status, argalis_ref, completed_at | Sessions présentielles. company_id = client propriétaire. status = planifiée / en_cours / terminée. argalis_ref = code OPCO si session ARGALIS. FK → users (formateur), companies. |
practical_evaluations | id, session_id, trainee_id, grid_id, ratings_json, passed, evaluator_id, evaluated_at, notes | Résultats évaluation pratique par stagiaire. ratings_json = {"critere_id": "A"|"B"|"C"|"D"|"NA"}. FK → sess.sessions, users (stagiaire), content.eval_grids. |
argalis_imports | id, imported_at, filename, imported_by, status, row_count, sessions_created, trainees_linked | Historique des imports CSV OPCO ARGALIS. imported_by = user_id formateur 2D+. status = pending / success / error. |
argalis_sessions | id, import_id, argalis_ref, code_session, intitule, date_debut, date_fin, formaleo_session_id | Sessions déclarées OPCO. formaleo_session_id = FK → sess.sessions (NULL si non encore créée dans FORMALEO). argalis_ref = clé unique OPCO pour dédup import. |
argalis_session_trainees | id (SERIAL), argalis_session_id, nom, prenom, nir, date_naissance, entreprise, formaleo_trainee_id | Stagiaires déclarés OPCO. formaleo_trainee_id = FK → users si le stagiaire a été créé dans FORMALEO. NIR = numéro sécurité sociale (données sensibles RGPD). |
💡 Doublons ARGALIS : Si plusieurs imports successifs, utiliser DISTINCT ON (formaleo_session_id) dans les JOIN pour éviter la multiplication des lignes. La clé de dédup est argalis_ref (unique par session OPCO).
sys
Rôle : Infrastructure et sécurité — tables techniques invisibles des utilisateurs finaux. Journaux d'audit, métriques monitoring, smoke tests, codes 2FA, configuration applicative et intégration LTI. Toujours préfixer : sys.audit_logs, sys.monitoring_snapshots, etc.
monitoring_snapshots : snapshot toutes les 2 min, rétention 90 jours · worker_messages : SERIAL mais dans schéma public (PAS sys) · audit_logs.details = JSONB contexte libre · Codes 2FA purgés toutes les 2h par le scheduler (les codes en clair disparaissent)
| TABLE | COLONNES CLÉS | DESCRIPTION & RELATIONS |
|---|---|---|
audit_logs | id, user_email, action, target_type, target_id, details, ip_address, user_agent, created_at | Journal RGPD/ISO 27001. action = login / logout / create / update / delete / quiz_submit… details = JSONB contexte libre. Obligatoire pour tout changement de données sensibles. |
two_fa_codes | id, user_id, code_hash, purpose, expires_at, used_at, attempts | Codes 2FA temporaires (6 chiffres, 15 min). purpose = login / quiz_entreprise. Purgés toutes les 2h par le scheduler (codes expirés ou utilisés). FK → users. |
app_settings | key TEXT PRIMARY KEY, value TEXT, description, updated_at, updated_by | Configuration clé/valeur (CGV version, seuils alertes, flags feature). Modifiable depuis l'admin. Ex : cgv_version, cpu_alert_threshold. |
monitoring_snapshots | id (SERIAL), captured_at, metrics_json | Snapshots automatiques toutes les 2 min. metrics_json = pool PG (active/idle/waiting/max), heap_mb, rss_mb, cpu_pct, load_avg, ram_pct. Rétention 90 jours. Alimentent les 4 graphes sparkline de la page Diagnostique. |
monitoring_alerts | id (SERIAL), alert_type, severity, message, value, threshold_value, triggered_at, resolved_at, notified_email, notified_telegram | Alertes seuil dépassé (CPU > 90%, disque > 85%, PG waiting > 0…). severity = warning / critical. Notification email Brevo + Telegram. Résolvables manuellement. |
smoke_test_results | id (SERIAL), run_at, total_tests, passed, failed, duration_ms, details_json, status | 30 smoke tests automatiques toutes les 6h. status = ok / warning / error. details_json liste chaque test avec son résultat. Alerte Telegram si ≥ 1 échec. |
security_audits | id (SERIAL), created_at, score, max_score, grade, results_json | Audit sécurité quotidien (7h). Vérifie ISO 27001 + RGPD + infrastructure. grade = A/B/C/D. Alerte si score < 8/10. FK indirect → app_settings pour les seuils. |
lti_tools | id, name, client_id, client_secret_hash, deployment_id, platform_url, is_active | Outils LTI 1.3 configurés (ex: Memoforma). SSO vers LMS externes. client_secret_hash = bcrypt. FK ← content.elearning_modules.lti_tool_id. |
lti_states | id, state TEXT UNIQUE, tool_id, user_id, created_at, expires_at | Nonces anti-CSRF pour le flux OAuth 1.3. Expirent en 10 min. Purgés automatiquement. FK → lti_tools, users. |
💡 Usage diagnostique : SELECT COUNT(*) FROM sys.audit_logs WHERE created_at > NOW() - INTERVAL '1 hour' pour voir l'activité récente. SELECT metrics_json FROM sys.monitoring_snapshots ORDER BY captured_at DESC LIMIT 1 pour l'état actuel du pool PG.
⚠️ Les doublons (même nom + prénom dans l'entreprise cible) seront fusionnés automatiquement en conservant l'historique.
Génération en cours...
Envoyez ce lien à l'utilisateur pour qu'il crée son propre mot de passe. Valable 7 jours.
⚖️ Art. 33 RGPD — Toute violation de données personnelles doit être notifiée à la CNIL dans un délai de 72 heures si elle présente un risque pour les droits et libertés des personnes.
Chargement...
🔒 Ce module ne peut être consulté qu'une seule fois. Une fois terminé, il sera verrouillé.
Chargement des modules…
Chargement…