IWEY API

Documentation base de données

Tables et colonnes PostgreSQL — 9 schémas métier, descriptions en français.

Vue globale — modèle entité-association

Relations logiques entre les schémas identity, academic_structure et pedagogy. Les références inter-domaines ne sont pas toujours des clés étrangères SQL.

erDiagram
  identity_account ||--o{ identity_profile : possede
  identity_profile ||--o| identity_student : etudiant
  identity_profile ||--o| identity_teacher : enseignant
  identity_student }o--|| academic_structure_program : inscrit_programme
  identity_student }o--|| academic_structure_level : niveau_courant
  identity_teacher }o--o| academic_structure_department : rattache
  academic_structure_institution ||--o{ academic_structure_site : possede
  academic_structure_site ||--o{ academic_structure_department : contient
  academic_structure_department ||--o{ academic_structure_program : propose
  academic_structure_program ||--o{ academic_structure_program_level : cursus
  academic_structure_program_level ||--o{ academic_structure_semester : semestres
  academic_structure_semester ||--o{ academic_structure_teaching_unit : ue
  academic_structure_teaching_unit ||--o{ academic_structure_subject : matieres
  academic_structure_subject }o--o| pedagogy_course : cours_lms
  academic_structure_program ||--o{ academic_structure_cohort : cohortes
  academic_structure_cohort ||--o{ academic_structure_cohort_member : membres
  academic_structure_cohort_member }o--|| identity_student : etudiant
  academic_structure_program ||--o{ academic_structure_school_class : classes
  academic_structure_school_class ||--o{ academic_structure_class_student : effectif
  academic_structure_class_student }o--|| identity_student : etudiant
  pedagogy_course }o--o| academic_structure_department : departement
  pedagogy_course }o--|| identity_teacher : responsable
  pedagogy_course ||--o{ pedagogy_course_participation : inscriptions
  pedagogy_course_participation }o--|| identity_student : etudiant

Schéma identity — Identité & authentification

Comptes utilisateurs, profils multi-rôles, étudiants et enseignants, sessions et contrôle d’accès (RBAC).

erDiagram
  account ||--|| identity : profil_civil
  account ||--o{ profile : profils
  role ||--o{ profile : role
  role ||--o{ role_permission : permissions
  permission ||--o{ role_permission : roles
  profile ||--o| student : etudiant
  profile ||--o| teacher : enseignant
  account ||--o{ login_session : sessions
  account ||--o{ login_attempt : tentatives

identity.account — Compte

Identifiant de connexion (email, téléphone) et statut du compte.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant unique du compte
email VARCHAR(255) non Adresse email de connexion
phone VARCHAR(30) oui Numéro de téléphone
password_hash VARCHAR(255) oui Hash du mot de passe (bcrypt)
account_status VARCHAR(20) non Statut : applicant, active, suspended, deactivated
created_at TIMESTAMPTZ non Date de création du compte
last_access_at TIMESTAMPTZ oui Dernière connexion

identity.identity — Identité civile

Informations personnelles rattachées au compte (1:1).

Colonne Type SQL Null Clé Description
account_id UUID non PK, FK → identity.account(id) Compte associé
first_name VARCHAR(100) non Prénom
last_name VARCHAR(100) non Nom de famille
birth_date DATE oui Date de naissance
gender VARCHAR(20) oui Genre : male, female, other
nationality VARCHAR(100) oui Nationalité
avatar_file_id UUID oui Photo de profil (kora.file)

identity.role — Rôle

Rôle système ou personnalisé avec périmètre d’action par défaut.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du rôle
name VARCHAR(100) non Libellé affiché
api_value VARCHAR(50) non Valeur API unique
type VARCHAR(20) non Type : system ou custom
default_scope VARCHAR(10) non Périmètre : self, own, all
color VARCHAR(20) oui Couleur UI

identity.permission — Permission

Droit atomique module + action pour le RBAC.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la permission
unique_key VARCHAR(100) non Clé unique (module.action)
module VARCHAR(50) non Module fonctionnel
action VARCHAR(50) non Action autorisée

identity.role_permission — Permission de rôle

Association N:N entre rôles et permissions.

Colonne Type SQL Null Clé Description
role_id UUID non PK, FK → identity.role(id) Rôle
permission_id UUID non PK, FK → identity.permission(id) Permission

identity.profile — Profil

Profil actif d’un compte pour un rôle donné (multi-profils).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du profil
account_id UUID non FK → identity.account(id) Compte parent
role_id UUID non FK → identity.role(id) Rôle associé
is_default_profile BOOLEAN non Profil par défaut du compte
profile_status VARCHAR(10) non Statut : active ou inactive
created_at TIMESTAMPTZ non Date de création

identity.student — Étudiant

Extension profil étudiant avec numéro, programme et niveau courants.

Colonne Type SQL Null Clé Description
profile_id UUID non PK, FK → identity.profile(id) Profil étudiant
student_number VARCHAR(50) non Numéro étudiant interne
institutional_id VARCHAR(50) oui Identifiant institutionnel
program_id UUID non Programme courant (academic_structure.program)
level_id UUID non Niveau courant (academic_structure.level)
academic_status VARCHAR(20) non Statut : active, leave, graduated, withdrawn
scholarship_type VARCHAR(20) non Bourse : none, national, partial, full

identity.teacher — Enseignant

Extension profil enseignant avec département et tarif horaire.

Colonne Type SQL Null Clé Description
profile_id UUID non PK, FK → identity.profile(id) Profil enseignant
department_id UUID oui Département (academic_structure.department)
hourly_rate NUMERIC(12,2) oui Tarif horaire

identity.login_session — Session de connexion

Session active avec appareil, IP et profil sélectionné.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de session
account_id UUID non FK → identity.account(id) Compte connecté
active_profile_id UUID oui FK → identity.profile(id) Profil actif
device VARCHAR(255) oui Appareil / user-agent
ip_address VARCHAR(45) oui Adresse IP
is_active BOOLEAN non Session encore valide
started_at TIMESTAMPTZ non Début de session

identity.login_attempt — Tentative de connexion

Historique des tentatives (succès, échec, en cours).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de tentative
account_id UUID non FK → identity.account(id) Compte concerné
status VARCHAR(20) non Statut : successful, failed, in_progress
attempted_at TIMESTAMPTZ non Horodatage de la tentative

Schéma academic_structure — Structure académique

Organisation institutionnelle : sites, départements, programmes, cursus (niveaux, semestres, UE, matières), classes et cohortes.

erDiagram
  institution ||--o{ site : possede
  site ||--o{ department : contient
  department ||--o{ program : propose
  program ||--o{ school_class : classes
  program ||--o{ cohort : cohortes
  level ||--o{ school_class : niveau
  academic_year ||--o{ school_class : annee
  school_class ||--o{ class_student : etudiants
  program ||--o{ program_level : cursus
  program_level ||--o{ semester : semestres
  semester ||--o{ teaching_unit : ue
  teaching_unit ||--o{ subject : matieres
  cohort ||--o{ cohort_member : membres

academic_structure.institution — Institution

Établissement d’enseignement supérieur (racine hiérarchique).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’institution
name VARCHAR(255) non Nom complet
short_name VARCHAR(50) non Sigle ou nom court

academic_structure.site — Site / campus

Campus ou site géographique rattaché à une institution.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du site
institution_id UUID non FK → academic_structure.institution(id) Institution parente
code VARCHAR(20) non Code site unique
name VARCHAR(255) non Nom du campus
city VARCHAR(100) oui Ville
country VARCHAR(100) oui Pays
is_active BOOLEAN non Site actif

academic_structure.department — Département

Unité pédagogique rattachée à un site.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du département
site_id UUID non FK → academic_structure.site(id) Site parent
name VARCHAR(255) non Nom du département
head_id UUID oui Responsable (identity.teacher)

academic_structure.program — Programme / formation

Formation diplômante rattachée à un département, avec cursus et métadonnées.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du programme
department_id UUID non FK → academic_structure.department(id) Département porteur
code VARCHAR(20) non Code programme unique
name VARCHAR(255) non Intitulé de la formation
duration_years SMALLINT non Durée en années
description TEXT oui Description détaillée
specialty VARCHAR(255) oui Spécialité ou filière
degree_type VARCHAR(30) non Type de diplôme : licence_lmd, master, bts, dut, certificate, other
total_ects SMALLINT oui Total crédits ECTS visés
diploma_title VARCHAR(255) oui Titre du diplôme délivré
status VARCHAR(20) non Statut : draft, active, archived

academic_structure.level — Niveau d’études

Niveau LMD ou formation continue (L1, L2, M1…).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du niveau
name VARCHAR(100) non Libellé du niveau
type VARCHAR(20) non Type : LMD ou training
sort_order SMALLINT non Ordre d’affichage
is_active BOOLEAN non Niveau actif

academic_structure.academic_year — Année académique

Période scolaire avec dates de début et fin.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’année
label VARCHAR(20) non Libellé (ex. 2025-2026)
start_date DATE non Date de début
end_date DATE non Date de fin
status VARCHAR(20) non Statut : planned, active, archived

academic_structure.school_class — Classe pédagogique

Groupe d’étudiants pour un programme, niveau et année donnés.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la classe
program_id UUID non FK → academic_structure.program(id) Programme
level_id UUID non FK → academic_structure.level(id) Niveau
academic_year_id UUID non FK → academic_structure.academic_year(id) Année académique
name VARCHAR(255) non Nom de la classe
max_capacity SMALLINT oui Effectif maximum
status VARCHAR(20) non Statut : active, inactive

academic_structure.cohort — Cohorte

Promotion d’étudiants entrés la même année dans un programme.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la cohorte
program_id UUID non FK → academic_structure.program(id) Programme
academic_year_id UUID non FK → academic_structure.academic_year(id) Année d’entrée
name VARCHAR(255) non Nom de la cohorte
description TEXT oui Description
status VARCHAR(20) non Statut : active, archived
created_at TIMESTAMPTZ non Date de création

academic_structure.class_student — Affectation classe-étudiant

Inscription d’un étudiant dans une classe (historique via end_date).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’affectation
school_class_id UUID non FK → academic_structure.school_class(id) Classe
student_id UUID non Étudiant (identity.student)
assigned_at DATE non Date d’affectation
end_date DATE oui Date de fin (null = actif)

academic_structure.cohort_member — Membre de cohorte

Appartenance d’un étudiant à une cohorte avec historique.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du membre
cohort_id UUID non FK → academic_structure.cohort(id) Cohorte
student_id UUID non Étudiant (identity.student)
joined_at DATE non Date d’entrée dans la cohorte
left_at DATE oui Date de sortie (null = actif)

academic_structure.program_level — Niveau du cursus

Niveau LMD rattaché à un programme (ex. L1 du cursus Licence).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant
program_id UUID non FK → academic_structure.program(id) Programme
level_id UUID non FK → academic_structure.level(id) Niveau
label VARCHAR(100) non Libellé affiché
sort_order SMALLINT non Ordre dans le cursus
ects SMALLINT oui Crédits ECTS du niveau

academic_structure.semester — Semestre

Semestre d’un niveau de cursus (S1, S2…).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du semestre
program_level_id UUID non FK → academic_structure.program_level(id) Niveau de cursus
number SMALLINT non Numéro de semestre (1–12)
start_date DATE oui Date de début
end_date DATE oui Date de fin
ects SMALLINT oui Crédits ECTS du semestre

academic_structure.teaching_unit — Unité d’enseignement (UE)

Bloc pédagogique regroupant des matières dans un semestre.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’UE
semester_id UUID non FK → academic_structure.semester(id) Semestre parent
code VARCHAR(30) non Code UE
name VARCHAR(255) non Intitulé de l’UE
ects SMALLINT oui Crédits ECTS de l’UE

academic_structure.subject — Matière

Matière du référentiel, optionnellement liée à un cours LMS.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la matière
teaching_unit_id UUID non FK → academic_structure.teaching_unit(id) UE parente
code VARCHAR(30) non Code matière
name VARCHAR(255) non Intitulé
hours SMALLINT oui Volume horaire
course_id UUID oui Cours LMS associé (pedagogy.course)

Schéma pedagogy — Pédagogie (cours LMS)

Cours en ligne, contenus (sections, activités), inscriptions individuelles ou par lot (classe/cohorte), classes virtuelles et groupes.

erDiagram
  course ||--o{ section : contient
  section ||--o{ activity : activites
  section ||--o{ section : sous_sections
  course ||--o{ course_resource : ressources
  course ||--o{ course_participation : inscriptions
  course ||--o{ course_enrollment_batch : inscriptions_lot
  course ||--o{ virtual_class : classes_virtuelles
  virtual_class ||--o{ virtual_class_participant : participants
  course ||--o{ course_group : groupes
  course_group ||--o{ course_group_member : membres
  course ||--o{ grouping : regroupements
  grouping ||--o{ grouping_course_group : groupes_lies

pedagogy.course — Cours LMS

Cours pédagogique indépendant des programmes, rattaché à un département.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du cours
code VARCHAR(30) non Code cours unique
title VARCHAR(255) non Titre du cours
level_id UUID oui Niveau (academic_structure.level)
academic_year_id UUID oui Année académique (academic_structure.academic_year)
lead_teacher_id UUID non Enseignant responsable (identity.teacher)
department_id UUID oui Département (academic_structure.department)
ects_credits NUMERIC(4,1) oui Crédits ECTS
status VARCHAR(20) non Statut : draft, active, suspended, completed
price NUMERIC(12,2) non Tarif du cours

pedagogy.section — Section

Chapitre ou module du cours, hiérarchique (sous-sections).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la section
course_id UUID non FK → pedagogy.course(id) Cours parent
parent_section_id UUID oui FK → pedagogy.section(id) Section parente
title VARCHAR(255) non Titre de la section
sort_order SMALLINT non Ordre d’affichage

pedagogy.activity — Activité

Activité pédagogique dans une section (meet, devoir, forum, examen…).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’activité
section_id UUID non FK → pedagogy.section(id) Section parente
type VARCHAR(20) non Type : meet, assignment, forum, exam, workshop, url
title VARCHAR(255) non Titre de l’activité
sort_order SMALLINT non Ordre dans la section

pedagogy.course_resource — Ressource de cours

Fichier attaché au cours (document, vidéo…).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la ressource
course_id UUID non FK → pedagogy.course(id) Cours
file_id UUID non Fichier (kora.file)
added_by_id UUID non Auteur de l’ajout (identity.account)
sort_order SMALLINT non Ordre d’affichage
visible_to_students BOOLEAN non Visible par les étudiants
added_at TIMESTAMPTZ non Date d’ajout

pedagogy.course_participation — Inscription au cours

Participation d’un étudiant à un cours avec traçabilité de la source.

Colonne Type SQL Null Clé Description
course_id UUID non PK, FK → pedagogy.course(id) Cours
student_id UUID non PK Étudiant (identity.student)
role VARCHAR(20) non Rôle : student ou assistant
enrolled_at DATE non Date d’inscription
enrollment_source VARCHAR(20) non Source : individual, cohort ou class
source_cohort_id UUID oui Cohorte source (academic_structure.cohort)
source_class_id UUID oui Classe source (academic_structure.school_class)
enrolled_by_id UUID oui Inscrit par (identity.account)
notification_sent_at TIMESTAMPTZ oui Date d’envoi de la notification

pedagogy.course_enrollment_batch — Lot d’inscriptions

Traçabilité d’une inscription en masse (classe, cohorte ou individuelle).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du lot
course_id UUID non FK → pedagogy.course(id) Cours cible
enrollment_source VARCHAR(20) non Source : individual, cohort ou class
source_cohort_id UUID oui Cohorte source
source_class_id UUID oui Classe source
enrolled_by_id UUID non Opérateur (identity.account)
requested_count INT non Nombre d’inscriptions demandées
enrolled_count INT non Nombre inscrits avec succès
skipped_count INT non Nombre ignorés (doublons, erreurs)
notify_students BOOLEAN non Notification email aux étudiants
created_at TIMESTAMPTZ non Date de l’opération

pedagogy.virtual_class — Classe virtuelle

Session synchrone en visioconférence rattachée à un cours.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la session
course_id UUID non FK → pedagogy.course(id) Cours
title VARCHAR(255) non Titre de la session
starts_at TIMESTAMPTZ non Début prévu
ends_at TIMESTAMPTZ non Fin prévue
meet_link VARCHAR(500) oui Lien visioconférence
status VARCHAR(20) non Statut : upcoming, in_progress, completed, cancelled

pedagogy.virtual_class_participant — Participant classe virtuelle

Participant à une session (modérateur ou participant).

Colonne Type SQL Null Clé Description
virtual_class_id UUID non PK, FK → pedagogy.virtual_class(id) Session
account_id UUID non PK Compte (identity.account)
role VARCHAR(20) non Rôle : moderator ou participant

pedagogy.course_group — Groupe de travail

Groupe d’étudiants au sein d’un cours.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du groupe
course_id UUID non FK → pedagogy.course(id) Cours
name VARCHAR(255) non Nom du groupe

pedagogy.course_group_member — Membre de groupe

Étudiant membre d’un groupe de travail.

Colonne Type SQL Null Clé Description
course_group_id UUID non PK, FK → pedagogy.course_group(id) Groupe
student_id UUID non PK Étudiant (identity.student)

pedagogy.grouping — Regroupement de groupes

Ensemble nommé de groupes de travail (ex. TP A, TP B).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du regroupement
course_id UUID non FK → pedagogy.course(id) Cours
name VARCHAR(255) non Nom du regroupement

pedagogy.grouping_course_group — Liaison regroupement-groupe

Association N:N entre regroupements et groupes.

Colonne Type SQL Null Clé Description
grouping_id UUID non PK, FK → pedagogy.grouping(id) Regroupement
course_group_id UUID non PK, FK → pedagogy.course_group(id) Groupe

Schéma evaluation — Évaluation

Éléments d’évaluation (devoirs, TP, examens), notes, banque de questions, feuilles de présence.

erDiagram
  evaluation_item ||--o{ evaluation_grade : notes
  evaluation_item ||--o| homework : devoir
  evaluation_item ||--o| practical_work : tp
  evaluation_item ||--o| exam : examen
  practical_work ||--o{ practical_work_submission : rendus
  practical_work_submission ||--o{ practical_work_submission_file : fichiers
  exam_template ||--o{ template_question : questions
  question ||--o{ template_question : modeles
  exam ||--o{ exam_attempt : tentatives
  attendance_sheet ||--o{ attendance_entry : entrees

evaluation.evaluation_item — Élément d’évaluation

Évaluation rattachée à un cours avec coefficient (somme ≤ 100 % par cours).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant
course_id UUID non Cours (pedagogy.course)
type VARCHAR(20) non Type : homework, practical_work, exam, quiz
title VARCHAR(255) non Intitulé
weight NUMERIC(5,2) non Coefficient (0–100)

evaluation.evaluation_grade — Note

Note attribuée à un étudiant pour un élément d’évaluation.

Colonne Type SQL Null Clé Description
evaluation_item_id UUID non PK, FK → evaluation.evaluation_item(id) Élément
student_id UUID non PK Étudiant (identity.student)
score NUMERIC(5,2) oui Note obtenue
feedback TEXT oui Commentaire du correcteur

evaluation.exam_template — Modèle d’examen

Gabarit réutilisable pour composer des examens.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du modèle
name VARCHAR(255) non Nom du modèle
grading_scale TEXT oui Barème de notation
default_duration_minutes SMALLINT oui Durée par défaut (minutes)

evaluation.question — Question

Question de banque (QCM, ouverte, vrai/faux).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la question
statement TEXT non Énoncé
type VARCHAR(20) non Type : multiple_choice, open, true_false
difficulty VARCHAR(20) non Difficulté : easy, medium, hard
subject VARCHAR(100) oui Matière ou thème

evaluation.template_question — Question du modèle

Association N:N modèle d’examen ↔ questions.

Colonne Type SQL Null Clé Description
template_id UUID non PK, FK → evaluation.exam_template(id) Modèle
question_id UUID non PK, FK → evaluation.question(id) Question

evaluation.homework — Devoir

Extension devoir à rendre (présentiel ou distanciel).

Colonne Type SQL Null Clé Description
evaluation_item_id UUID non PK, FK → evaluation.evaluation_item(id) Élément parent
subject_file_id UUID oui Sujet (kora.file)
exam_date TIMESTAMPTZ non Date de l’épreuve
start_time TIME oui Heure de début
end_time TIME oui Heure de fin
location VARCHAR(255) oui Lieu
max_score NUMERIC(5,2) non Note maximale

evaluation.practical_work — Travaux pratiques (TP)

Travaux pratiques avec fenêtre de dépôt et contraintes fichiers.

Colonne Type SQL Null Clé Description
evaluation_item_id UUID non PK, FK → evaluation.evaluation_item(id) Élément parent
statement_file_id UUID oui Énoncé (kora.file)
situation TEXT oui Contexte / situation
instructions TEXT oui Consignes
opens_at TIMESTAMPTZ non Ouverture des dépôts
deadline_at TIMESTAMPTZ non Date limite
max_score NUMERIC(5,2) non Note maximale
max_files SMALLINT non Nombre max de fichiers
max_size_mb INTEGER non Taille max par fichier (Mo)

evaluation.practical_work_submission — Rendu de TP

Dépôt d’un étudiant pour un TP.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du rendu
practical_work_id UUID non FK → evaluation.practical_work(evaluation_item_id) TP
student_id UUID non Étudiant (identity.student)
status VARCHAR(20) non Statut : submitted, graded, late
submitted_at TIMESTAMPTZ non Date de dépôt

evaluation.practical_work_submission_file — Fichier de rendu

Fichier joint à un rendu de TP.

Colonne Type SQL Null Clé Description
submission_id UUID non PK, FK → evaluation.practical_work_submission(id) Rendu
file_id UUID non PK Fichier (kora.file)

evaluation.exam — Examen

Examen en ligne basé sur un modèle optionnel.

Colonne Type SQL Null Clé Description
evaluation_item_id UUID non PK, FK → evaluation.evaluation_item(id) Élément parent
template_id UUID oui FK → evaluation.exam_template(id) Modèle utilisé
start_date TIMESTAMPTZ non Date de début
duration_minutes SMALLINT non Durée (minutes)
status VARCHAR(20) non Statut : scheduled, in_progress, completed, cancelled

evaluation.exam_attempt — Tentative d’examen

Réponses et note brute d’un étudiant pour un examen.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la tentative
exam_id UUID non FK → evaluation.exam(evaluation_item_id) Examen
student_id UUID non Étudiant (identity.student)
answers JSONB oui Réponses sérialisées
raw_score NUMERIC(5,2) oui Note brute
submitted_at TIMESTAMPTZ non Date de soumission

evaluation.attendance_sheet — Feuille de présence

Session de présence (virtuelle ou présentiel) pour un cours.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la feuille
course_id UUID non Cours (pedagogy.course)
virtual_class_id UUID oui Classe virtuelle (pedagogy.virtual_class)
type VARCHAR(20) non Type : virtual ou in_person
status VARCHAR(20) non Statut : open ou closed
session_date DATE non Date de la session

evaluation.attendance_entry — Entrée de présence

Statut de présence d’un étudiant pour une session.

Colonne Type SQL Null Clé Description
attendance_sheet_id UUID non PK, FK → evaluation.attendance_sheet(id) Feuille
student_id UUID non PK Étudiant (identity.student)
status VARCHAR(20) non Statut : present, absent, late
speaking_time_sec SMALLINT oui Temps de parole (visio)

Schéma tuition — Scolarité & admissions

Frais de scolarité, échéanciers, paiements, candidatures et inscriptions administratives.

erDiagram
  tuition_fees ||--o{ payment_installment : echeances
  payment_installment ||--o{ payment : paiements
  application ||--o{ application_document : pieces
  tuition_fees }o--|| student : etudiant
  enrollment }o--|| student : etudiant
  enrollment }o--|| program : programme

tuition.tuition_fees — Frais de scolarité

Montant total des frais pour un étudiant sur une année académique.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant
student_id UUID non Étudiant (identity.student)
academic_year_id UUID non Année (academic_structure.academic_year)
total_amount NUMERIC(12,2) non Montant total
currency VARCHAR(3) non Devise : XOF, EUR ou USD

tuition.payment_installment — Échéance de paiement

Tranche d’un échéancier de scolarité.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’échéance
tuition_fees_id UUID non FK → tuition.tuition_fees(id) Frais parent
sequence SMALLINT non Numéro d’échéance
amount NUMERIC(12,2) non Montant dû
status VARCHAR(20) non Statut : upcoming, paid, unpaid, overdue
due_date DATE non Date d’échéance

tuition.payment — Paiement

Paiement effectué pour une échéance.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du paiement
installment_id UUID non FK → tuition.payment_installment(id) Échéance réglée
reference_transaction VARCHAR(100) non Référence transaction unique
amount NUMERIC(12,2) non Montant payé
payment_method VARCHAR(20) non Moyen : mobile_money, card, bank_transfer, cash
paid_at TIMESTAMPTZ non Date de paiement

tuition.payment_reminder — Relance de paiement

Notification de relance envoyée à un étudiant.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la relance
student_id UUID non Étudiant (identity.student)
channel VARCHAR(10) non Canal : email ou sms
sent_at TIMESTAMPTZ non Date d’envoi

tuition.application — Candidature

Demande d’admission d’un candidat à un programme.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la candidature
applicant_id UUID non Candidat (identity.account)
program_id UUID non Programme visé (academic_structure.program)
status VARCHAR(20) non Statut : received, in_progress, accepted, rejected
submitted_at DATE non Date de dépôt

tuition.application_document — Pièce jointe candidature

Document justificatif attaché à une candidature.

Colonne Type SQL Null Clé Description
application_id UUID non PK, FK → tuition.application(id) Candidature
file_id UUID non PK Fichier (kora.file)
document_type VARCHAR(30) non Type : identity_document, transcript, motivation_letter, other

tuition.enrollment — Inscription administrative

Inscription validée d’un étudiant à un programme pour une année.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’inscription
student_id UUID non Étudiant (identity.student)
program_id UUID non Programme (academic_structure.program)
academic_year_id UUID non Année (academic_structure.academic_year)
status VARCHAR(20) non Statut : active, suspended, closed
created_at TIMESTAMPTZ non Date de création

Schéma communication — Communication

Messagerie, groupes de travail, contacts, événements, annonces et notifications multi-canal.

erDiagram
  work_group ||--o{ work_group_member : membres
  work_group ||--o{ conversation : fils
  conversation ||--o{ conversation_participant : participants
  conversation ||--o{ message : messages
  message ||--o{ message_attachment : pieces
  announcement ||--o{ announcement_attachment : pieces
  notification ||--o{ notification_channel : canaux

communication.work_group — Groupe de travail

Espace collaboratif lié optionnellement à un cours.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du groupe
code VARCHAR(30) non Code unique
name VARCHAR(255) non Nom du groupe
course_id UUID oui Cours associé (pedagogy.course)
owner_id UUID non Propriétaire (identity.account)

communication.work_group_member — Membre de groupe de travail

Compte membre d’un groupe de travail.

Colonne Type SQL Null Clé Description
work_group_id UUID non PK, FK → communication.work_group(id) Groupe
account_id UUID non PK Compte (identity.account)
joined_at DATE non Date d’adhésion

communication.conversation — Conversation

Fil de discussion privé ou de groupe.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la conversation
type VARCHAR(10) non Type : private ou group
work_group_id UUID oui FK → communication.work_group(id) Groupe de travail lié

communication.conversation_participant — Participant conversation

Préférences et statut d’un compte dans une conversation.

Colonne Type SQL Null Clé Description
conversation_id UUID non PK, FK → communication.conversation(id) Conversation
account_id UUID non PK Compte (identity.account)
favorite BOOLEAN non Conversation favorite
muted BOOLEAN non Notifications coupées
archived BOOLEAN non Conversation archivée

communication.message — Message

Message texte dans une conversation.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du message
conversation_id UUID non FK → communication.conversation(id) Conversation
author_id UUID non Auteur (identity.account)
content TEXT non Contenu du message
sent_at TIMESTAMPTZ non Date d’envoi

communication.message_attachment — Pièce jointe message

Fichier attaché à un message.

Colonne Type SQL Null Clé Description
message_id UUID non PK, FK → communication.message(id) Message
file_id UUID non PK Fichier (kora.file)

communication.contact — Contact

Relation entre deux comptes (avec blocage).

Colonne Type SQL Null Clé Description
account_id UUID non PK Compte propriétaire
contact_account_id UUID non PK Compte contact (identity.account)
is_blocked BOOLEAN non Contact bloqué

communication.contact_request — Demande de contact

Invitation à ajouter un contact.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la demande
requester_id UUID non Demandeur (identity.account)
recipient_id UUID non Destinataire (identity.account)
status VARCHAR(20) non Statut : pending, accepted, rejected

communication.event — Événement calendrier

Événement personnel ou lié à un cours.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’événement
title VARCHAR(255) non Titre
calendar VARCHAR(20) non Calendrier : personal, work, family, health
course_id UUID oui Cours associé (pedagogy.course)
owner_id UUID non Propriétaire (identity.account)
starts_at TIMESTAMPTZ non Début
ends_at TIMESTAMPTZ non Fin

communication.announcement — Annonce

Communication institutionnelle ou pédagogique.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’annonce
title VARCHAR(255) non Titre
category VARCHAR(20) non Catégorie : academic, administrative, events, urgent
author_id UUID non Auteur (identity.account)
is_pinned BOOLEAN non Épinglée en tête
archived BOOLEAN non Archivée
published_at TIMESTAMPTZ non Date de publication

communication.announcement_attachment — Pièce jointe annonce

Fichier attaché à une annonce.

Colonne Type SQL Null Clé Description
announcement_id UUID non PK, FK → communication.announcement(id) Annonce
file_id UUID non PK Fichier (kora.file)

communication.notification — Notification

Notification système ou métier pour un compte.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la notification
account_id UUID non Destinataire (identity.account)
type VARCHAR(30) non Type : academic_announcement, message, payment, grade…
title VARCHAR(255) non Titre
content TEXT oui Corps du message
link VARCHAR(500) oui Lien de redirection
context_id UUID oui Identifiant contexte métier
created_at TIMESTAMPTZ non Date de création

communication.notification_channel — Canal de notification

État de livraison par canal (email, push, SMS…).

Colonne Type SQL Null Clé Description
notification_id UUID non PK, FK → communication.notification(id) Notification
channel VARCHAR(10) non PK Canal : email, in_app, push, sms
delivery_status VARCHAR(20) non Statut : pending, sent, failed
sent_at TIMESTAMPTZ oui Date d’envoi effectif
read_at TIMESTAMPTZ oui Date de lecture
is_read BOOLEAN non Marquée comme lue

communication.notification_preference — Préférence de notification

Abonnement d’un compte à un type de notification par canal.

Colonne Type SQL Null Clé Description
account_id UUID non PK Compte (identity.account)
notification_type VARCHAR(30) non PK Type de notification
channel VARCHAR(10) non PK Canal : email, in_app, push, sms
is_active BOOLEAN non Préférence active

Schéma academic_documents — Documents académiques

Documents officiels délivrés aux étudiants (carte, certificats, relevés) et dossiers académiques.

erDiagram
  document }o--|| student : etudiant
  academic_record }o--|| student : etudiant
  document }o--|| file : fichier
  academic_record }o--|| file : fichier

academic_documents.document — Document étudiant

Document administratif ou justificatif rattaché à un étudiant.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du document
student_id UUID non Étudiant (identity.student)
file_id UUID non Fichier (kora.file)
type VARCHAR(30) non Type : student_card, enrollment_certificate, identity_document…
is_confidential BOOLEAN non Document confidentiel
issued_at DATE oui Date de délivrance
expires_at DATE oui Date d’expiration

academic_documents.academic_record — Dossier académique

Acte officiel (diplôme, relevé, attestation de réussite).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du dossier
student_id UUID non Étudiant (identity.student)
file_id UUID non Fichier (kora.file)
record_number VARCHAR(50) non Numéro d’enregistrement unique
type VARCHAR(30) non Type : graduated, success_certificate, official_transcript
title VARCHAR(255) oui Titre du document
honors VARCHAR(50) oui Mention ou félicitations
obtained_at DATE oui Date d’obtention

Schéma platform — Plateforme

Licence multi-tenant, comptes bootstrap, journal d’événements métier et logs système.

erDiagram
  platform_license ||--o{ bootstrap_account : provisionnement
  event_log }o--o| account : acteur
  system_log }o--o| account : contexte

platform.platform_license — Licence plateforme

Licence d’activation par tenant et environnement.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de la licence
tenant_id VARCHAR(100) non Identifiant tenant unique
fingerprint_key VARCHAR(255) oui Empreinte machine
status VARCHAR(20) non Statut : active ou inactive
environment VARCHAR(20) non Environnement : production, staging, dev
activated_at TIMESTAMPTZ oui Date d’activation

platform.bootstrap_account — Compte bootstrap

Compte administrateur initial provisionné à l’installation.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant
account_id UUID non Compte (identity.account)
role VARCHAR(20) non Rôle : director ou administrator
provisioned_at TIMESTAMPTZ non Date de provisionnement

platform.event_log — Journal d’événements

Audit trail des actions métier avec états avant/après.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant de l’événement
domain VARCHAR(30) non Domaine : course, payment, account, system
account_id UUID oui Acteur (identity.account)
active_profile_id UUID oui Profil actif (identity.profile)
affected_account_id UUID oui Compte impacté
component VARCHAR(100) oui Composant source
event_name VARCHAR(100) non Nom de l’événement
description TEXT oui Description
data_before JSONB oui État avant modification
data_after JSONB oui État après modification
origin VARCHAR(10) oui Origine : web, mobile ou api
ip_address VARCHAR(45) oui Adresse IP
occurred_at TIMESTAMPTZ non Horodatage

platform.system_log — Log système

Logs techniques des services (requêtes HTTP, erreurs, performances).

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du log
service VARCHAR(50) non Nom du service
level VARCHAR(10) non Niveau : debug, info, warning, error, critical
message TEXT non Message
request_id VARCHAR(100) oui Identifiant de requête
http_method VARCHAR(10) oui Méthode HTTP
endpoint VARCHAR(255) oui Endpoint appelé
http_status_code SMALLINT oui Code HTTP de réponse
duration_ms INTEGER oui Durée en millisecondes
error_stack TEXT oui Stack trace
account_id UUID oui Compte associé
occurred_at TIMESTAMPTZ non Horodatage

Schéma kora — Fichiers (Kora)

Stockage de fichiers, arborescence de dossiers, quotas et partages entre comptes.

erDiagram
  storage_quota }o--|| account : quota
  folder ||--o{ folder : sous_dossiers
  folder ||--o{ file : contient
  folder ||--o{ folder_share : partages
  file ||--o{ file_share : partages

kora.storage_quota — Quota de stockage

Espace disque consommé et limite par compte.

Colonne Type SQL Null Clé Description
account_id UUID non PK Compte (identity.account)
used_bytes BIGINT non Octets utilisés
max_bytes BIGINT oui Plafond autorisé
updated_at TIMESTAMPTZ non Dernière mise à jour

kora.folder — Dossier

Dossier hiérarchique avec suppression logique.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du dossier
owner_id UUID non Propriétaire (identity.account)
parent_folder_id UUID oui FK → kora.folder(id) Dossier parent
name VARCHAR(255) non Nom du dossier
created_at TIMESTAMPTZ non Date de création
deleted_at TIMESTAMPTZ oui Date de suppression logique

kora.file — Fichier

Fichier stocké avec métadonnées et origine module.

Colonne Type SQL Null Clé Description
id UUID non PK Identifiant du fichier
owner_id UUID non Propriétaire (identity.account)
folder_id UUID oui FK → kora.folder(id) Dossier conteneur
name VARCHAR(255) non Nom du fichier
extension VARCHAR(20) oui Extension
mime_type VARCHAR(100) oui Type MIME
size_bytes BIGINT non Taille en octets
storage_path VARCHAR(500) non Chemin de stockage physique
origin VARCHAR(20) non Origine : user_upload ou system_generated
source_module VARCHAR(20) non Module source : kora, course, evaluation…
created_at TIMESTAMPTZ non Date de création
updated_at TIMESTAMPTZ oui Dernière modification
deleted_at TIMESTAMPTZ oui Date de suppression logique

kora.folder_share — Partage de dossier

Accès partagé à un dossier pour un compte.

Colonne Type SQL Null Clé Description
folder_id UUID non PK, FK → kora.folder(id) Dossier partagé
account_id UUID non PK Bénéficiaire (identity.account)
shared_by_id UUID non Partagé par (identity.account)
access_level VARCHAR(10) non Niveau : read ou write
shared_at TIMESTAMPTZ non Date du partage

kora.file_share — Partage de fichier

Accès partagé à un fichier pour un compte.

Colonne Type SQL Null Clé Description
file_id UUID non PK, FK → kora.file(id) Fichier partagé
account_id UUID non PK Bénéficiaire (identity.account)
shared_by_id UUID non Partagé par (identity.account)
access_level VARCHAR(10) non Niveau : read ou write
shared_at TIMESTAMPTZ non Date du partage