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 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 |