Référence des tables
Cette page est générée depuis le schéma réel de la base (information_schema et pg_constraint). Les règles métier — valeurs autorisées, fenêtres de dates, absence d’auto-référence — sont des contraintes CHECK : la base les refuse même si le code se trompe. Les horodatages sont avec fuseau (timestamptz), les montants en centimes, les paramètres en jsonb.
themes — Domaines
Section intitulée « themes — Domaines »Premier niveau de la taxonomie — « المجال الرئيسي ». Un produit appartient obligatoirement à un domaine.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
title_ar |
texte | non | — | Titre en arabe. |
slug |
texte | non | — | Identifiant d’URL, unique. |
subtitle_ar |
texte | oui | — | Sous-titre en arabe. |
description_ar |
texte long | oui | — | Description en arabe. |
color |
texte | oui | — | Repère visuel. |
position |
entier | non | 0 | Ordre d’affichage. |
active |
booléen | non | true | Masqué de la vitrine si faux. |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
- unique :
slug
sub_themes — Sous-thématiques
Section intitulée « sub_themes — Sous-thématiques »Second niveau de la taxonomie — le vivier de la vente croisée. Facultative pour un parcours ou un niveau.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
theme_id |
entier | non | — | Domaine (obligatoire). |
title_ar |
texte | non | — | Titre en arabe. |
slug |
texte | non | — | Identifiant d’URL, unique. |
description_ar |
texte long | oui | — | Description en arabe. |
position |
entier | non | 0 | Ordre d’affichage. |
active |
booléen | non | true | Masqué de la vitrine si faux. |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
- unique :
slug theme_id→themes.id(suppression en cascade)
products — Produits
Section intitulée « products — Produits »Tout ce qui se vend : article, livre audio, programme, parcours, pack, niveau. Les composites ne sont pas des tables à part.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
title_ar |
texte | non | — | Titre en arabe. |
slug |
texte | non | — | Identifiant d’URL, unique. |
subtitle_ar |
texte | oui | — | Sous-titre en arabe. |
description_ar |
texte long | oui | — | Description en arabe. |
author_ar |
texte | oui | — | Auteur en arabe. |
cover_path |
texte | oui | — | Visuel (chemin privé). |
theme_id |
entier | non | — | Domaine (obligatoire). |
sub_theme_id |
entier | oui | — | Sous-thématique (facultative). |
position |
entier | non | 0 | Ordre d’affichage. |
kind |
texte | non | — | Type sur l’échelle de montée en gamme. |
is_offer |
booléen | non | true | Vendable séparément. |
is_featured |
booléen | non | false | Mis en avant sur l’accueil. |
price_base |
entier | oui | — | Prix de base, en centimes. |
price_promo |
entier | oui | — | Prix promotionnel, en centimes. |
promo_starts_at |
date-heure (fuseau) | oui | — | Début de la fenêtre promotionnelle. |
promo_ends_at |
date-heure (fuseau) | oui | — | Fin de la fenêtre promotionnelle. |
currency |
texte | non | ‘MAD’ | Devise (ISO 4217). |
status |
texte | non | ‘draft’ | Cycle de vie. |
published_at |
date-heure (fuseau) | oui | — | Date de publication. |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
kind∈ {article,collection,livre,programme,parcours,pack_specialise,pack_global,presentiel,podcast}CHECK ((price_promo IS NULL) OR (price_base IS NULL) OR (price_promo <= price_base))CHECK ((promo_starts_at IS NULL) OR (promo_ends_at IS NULL) OR (promo_ends_at > promo_starts_at))- unique :
slug status∈ {draft,published,archived}sub_theme_id→sub_themes.id(mis à vide à la suppression)theme_id→themes.id
product_compose — Composition
Section intitulée « product_compose — Composition »Arbre réflexif : un produit en contient d’autres, dans un ordre. Un même produit peut avoir plusieurs parents.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
parent_product_id |
entier | non | — | Le produit qui contient. |
child_product_id |
entier | non | — | Le produit contenu. |
position |
entier | non | 0 | Ordre d’affichage. |
Contraintes
child_product_id→products.id(suppression en cascade)parent_product_id≠child_product_id— pas d’auto-référence- unique :
parent_product_id,child_product_id parent_product_id→products.id(suppression en cascade)
product_contents — Contenus
Section intitulée « product_contents — Contenus »Les segments consommables d’un produit — jamais vendus séparément, donc sans prix.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
product_id |
entier | non | — | Produit concerné. |
title_ar |
texte | non | — | Titre en arabe. |
type |
texte | non | — | Type de média. |
position |
entier | non | 0 | Ordre d’affichage. |
duration_s |
entier | oui | — | Durée en secondes. |
storage_key |
texte | oui | — | Clé du fichier sur le stockage privé — jamais exposée. |
preview |
booléen | non | false | Extrait gratuit. |
status |
texte | non | ‘draft’ | Cycle de vie. |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
product_id→products.id(suppression en cascade)status∈ {draft,published,archived}type∈ {audio,article,article_audio,video}
product_prerequisites — Prérequis
Section intitulée « product_prerequisites — Prérequis »Un produit en exige un autre, selon une règle. Relation distincte de la composition : exiger n’est pas contenir.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
product_id |
entier | non | — | Produit concerné. |
required_product_id |
entier | non | — | Le produit exigé. |
rule |
texte | non | ‘certified’ | Ce qui satisfait le prérequis : acquis, terminé, certifié. |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
product_id≠required_product_id— pas d’auto-référenceproduct_id→products.id(suppression en cascade)- unique :
product_id,required_product_id required_product_id→products.id(suppression en cascade)rule∈ {owned,completed,certified}
users — Comptes
Section intitulée « users — Comptes »Apprenants et administrateurs dans une seule table. L’identifiant est l’e-mail ou le téléphone.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
name |
texte | non | — | Nom. |
email |
texte | oui | — | Adresse e-mail, unique. |
phone |
texte | oui | — | Téléphone E.164, unique. |
password |
texte | oui | — | Mot de passe haché — administrateurs seulement. |
role |
texte | non | ‘learner’ | Apprenant ou administrateur. |
status |
texte | non | ‘invited’ | Cycle de vie. |
locale |
texte | non | ‘ar’ | Langue de l’interface. |
verified_at |
date-heure (fuseau) | oui | — | Première connexion réussie. |
last_login_at |
date-heure (fuseau) | oui | — | Dernière connexion. |
invited_by |
entier | oui | — | Administrateur qui a invité le compte. |
remember_token |
texte | oui | — | Session persistante (cadre Laravel). |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
- unique :
email CHECK ((email IS NOT NULL) OR (phone IS NOT NULL))invited_by→users.id(mis à vide à la suppression)- unique :
phone role∈ {learner,admin}status∈ {invited,active,disabled}
devices — Appareils
Section intitulée « devices — Appareils »Les appareils connectés à un compte ; un jeton par appareil.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
user_id |
entier | non | — | Compte concerné. |
device_key |
texte | non | — | Identifiant stable fourni par l’application. |
platform |
texte | non | — | ios, android ou web. |
name |
texte | oui | — | Nom. |
app_version |
texte | oui | — | Version de l’application. |
push_token |
texte | oui | — | Jeton de notification (lot L10). |
token_id |
entier | oui | — | Jeton d’API courant. |
last_seen_at |
date-heure (fuseau) | oui | — | Dernière requête vue. |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
platform∈ {ios,android,web}- unique :
user_id,device_key user_id→users.id(suppression en cascade)
otp_challenges — Codes de connexion
Section intitulée « otp_challenges — Codes de connexion »Un code à usage unique en attente. Le code n’est jamais stocké en clair.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
identifier |
texte | non | — | E-mail ou téléphone normalisé. |
channel |
texte | non | — | Canal d’envoi du code. |
code_hash |
texte | non | — | Empreinte HMAC du code. |
expires_at |
date-heure (fuseau) | non | — | Échéance. |
attempts |
entier | non | ‘0’ | Tentatives consommées. |
consumed_at |
date-heure (fuseau) | oui | — | Consommé (utilisé ou invalidé). |
ip_address |
texte | oui | — | Adresse de la demande. |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
channel∈ {mail,sms,whatsapp,log}
personal_access_tokens — Jetons d’API
Section intitulée « personal_access_tokens — Jetons d’API »Jetons Sanctum portés par l’application mobile (table du cadre Laravel).
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
tokenable_type |
texte | non | — | Type du porteur (cadre). |
tokenable_id |
entier | non | — | Porteur du jeton. |
name |
texte long | non | — | Nom. |
token |
texte | non | — | Empreinte du jeton. |
abilities |
texte long | oui | — | Permissions. |
last_used_at |
date-heure | oui | — | Dernière utilisation. |
expires_at |
date-heure | oui | — | Échéance. |
created_at |
date-heure | oui | — | Création. |
updated_at |
date-heure | oui | — | Dernière modification. |
Contraintes
- unique :
token
access_rights — Droits d’accès
Section intitulée « access_rights — Droits d’accès »Le « DROIT_ACCES » du dossier d’architecture, à la granularité produit, avec son origine.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
user_id |
entier | non | — | Compte concerné. |
product_id |
entier | non | — | Produit concerné. |
status |
texte | non | ‘active’ | Cycle de vie. |
origin |
texte | non | — | D’où vient le droit : achat, pack, parcours, abonnement, promotion, cadeau, admin, migration, partenaire. |
source_ref |
texte | oui | — | Référence de la source (commande, note d’octroi…). |
granted_by |
entier | oui | — | Administrateur qui a accordé. |
granted_at |
date-heure (fuseau) | non | — | Accordé le. |
expires_at |
date-heure (fuseau) | oui | — | Échéance. |
revoked_at |
date-heure (fuseau) | oui | — | Révoqué le. |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
granted_by→users.id(mis à vide à la suppression)origin∈ {purchase,pack,pathway,subscription,promotion,gift,admin,migration,partner}product_id→products.id(suppression en cascade)status∈ {active,revoked,expired}user_id→users.id(suppression en cascade)
settings — Paramètres
Section intitulée « settings — Paramètres »Réglages métier modifiables sans déploiement, typés, mis en cache.
| Colonne | Type | Nul | Défaut | Rôle |
|---|---|---|---|---|
id |
entier | non | séquence | Identifiant technique. |
group |
texte | non | — | Onglet de l’écran Paramètres. |
key |
texte | non | — | Clé lue par le code, unique. |
type |
texte | non | — | Type de média. |
value |
jsonb | oui | — | Valeur typée (jsonb). |
options |
jsonb | oui | — | Choix possibles pour une liste. |
label |
texte | non | — | Libellé affiché (clé de traduction). |
help |
texte | oui | — | Aide affichée (clé de traduction). |
unit |
texte | oui | — | Unité affichée. |
position |
entier | non | 0 | Ordre d’affichage. |
created_at |
date-heure (fuseau) | oui | — | Création. |
updated_at |
date-heure (fuseau) | oui | — | Dernière modification. |
Contraintes
- unique :
key type∈ {string,text,integer,boolean,money,select}