Spécifications de l'architecture

Spécifications techniques & Blueprints SaaS

Structure multi-tenant, schéma relationnel et stratégie d'évolution.

💡
Architecture multi-tenant partitionnée : chaque boutique possède un tenant_id. Les requêtes filtrent impérativement par cette clé pour isoler inventaire, paiements et facturation de chaque marchand.
📋 tenantsPostgreSQL

Contient les informations et la configuration des sous-boutiques (Multi-tenant).

ColonneTypeDescription
iduuidIdentifiant unique de la boutiquePRIMARY KEY DEFAULT gen_random_uuid()
slugvarchar(50)Identifiant d'URL sous-domaine (ex: 'djelika-couture')UNIQUE NOT NULL
namevarchar(100)Nom commercial de la boutiqueNOT NULL
logo_urltextLien vers l'image du logoNULL
banner_urltextLien vers l'image d'en-tête de la boutiqueNULL
descriptiontextDescription textuelleNULL
owner_namevarchar(100)Nom du gérantNOT NULL
owner_emailvarchar(100)Email de contact propriétaireNOT NULL
phonevarchar(30)Numéro de téléphone WhatsApp professionnelNOT NULL
countryvarchar(50)Pays d'exploitation (Mali)NOT NULL
cityvarchar(50)Ville de domiciliation (Bamako, Sikasso, Ségou…)NOT NULL
addresstextAdresse physique exacteNOT NULL
primary_colorvarchar(7)Couleur primaire de l'interface en hexaDEFAULT '#223f6d'
secondary_colorvarchar(7)Couleur secondaire de l'interfaceDEFAULT '#b07c4f'
theme_fontvarchar(50)Police d'écriture styliséeDEFAULT 'Inter'
planvarchar(15)Type d'abonnement ('free', 'standard', 'premium')DEFAULT 'free'
commission_ratenumeric(5,2)% prélevé sur les ventes directesDEFAULT 3.0
currencyvarchar(3)Devise par défaut (FCFA / XOF au Mali)NOT NULL DEFAULT 'XOF'
created_attimestampDate de création sur la plateformeDEFAULT timezone('utc'::text, now())
📋 productsPostgreSQL

Catalogue produits propre à chaque boutique (cloisonnement tenant_id).

ColonneTypeDescription
iduuidIdentifiant du produitPRIMARY KEY DEFAULT gen_random_uuid()
tenant_iduuidAssociation au tenant propriétaireREFERENCES tenants(id) ON DELETE CASCADE
namevarchar(150)Nom de l'articleNOT NULL
descriptiontextDescription marketingNULL
categoryvarchar(100)Catégorie de premier niveauNOT NULL
subcategoryvarchar(100)Sous-catégorie optionnelleNULL
priceintegerPrix standard (FCFA)NOT NULL
promo_priceintegerPrix de réductionNULL
stockintegerQuantité en inventaire physiqueNOT NULL DEFAULT 0
image_urltextLien de la photo de gardeNOT NULL
galleryjsonbListe d'images annexes en tableau JSONNULL
variantsjsonbCaractéristiques configurables (tailles, couleurs, motifs)DEFAULT '[]'
is_featuredbooleanAfficher en vedette sur la page de gardeDEFAULT false
is_promobooleanIndicateur de réduction activeDEFAULT false
created_attimestampDate d'enregistrementDEFAULT now()
📋 ordersPostgreSQL

Commandes de clients enregistrées dans les boutiques.

ColonneTypeDescription
iduuidIdentifiant de la commandePRIMARY KEY
tenant_iduuidTenant concerné par la venteREFERENCES tenants(id)
order_numbervarchar(30)Numéro de facture unique (ex: FAC-DJK-1002)UNIQUE NOT NULL
customer_namevarchar(150)Nom complet du clientNOT NULL
customer_emailvarchar(150)Mail de contactNULL
customer_phonevarchar(30)Téléphone WhatsApp pour la messagerieNOT NULL
addresstextDescription physique de livraison (ex: Rue 224, Badalabougou)NOT NULL
delivery_zone_idvarchar(50)Zone de livraison sélectionnéeNOT NULL
delivery_feeintegerFrais calculés automatiquementNOT NULL
total_amountintegerTotal TTC encaisséNOT NULL
payment_methodvarchar(20)Mécanique: 'cod' (Livraison), 'mobile_money', 'bank_transfer'NOT NULL
payment_providervarchar(30)Opérateur Mobile Money: 'orange_money', 'moov_money', 'wave'NULL
payment_statusvarchar(15)Statut financier: 'pending', 'paid', 'failed'DEFAULT 'pending'
shipping_statusvarchar(15)Statut logistique: 'pending', 'validated', 'in_transit', 'delivered'DEFAULT 'pending'
created_attimestampDate d'achatDEFAULT now()
📋 order_itemsPostgreSQL

Lignes de détails au sein d'une commande (relation un-à-plusieurs).

ColonneTypeDescription
iduuidIdentifiant de lignePRIMARY KEY
order_iduuidLiaison vers la table parentREFERENCES orders(id) ON DELETE CASCADE
product_iduuidL'article achetéNOT NULL
product_namevarchar(200)Nom du produit figé au jour de la venteNOT NULL
priceintegerTarif unitaire d'achat ou promotionNOT NULL
quantityintegerQuantité commandéeNOT NULL DEFAULT 1
selected_variantsvarchar(255)Spécificités sélectionnées par l'acheteurNULL
📋 shipping_zonesPostgreSQL

Grille de zonage tarifaire propre à chaque boutique locale.

ColonneTypeDescription
iduuidId de zonePRIMARY KEY
tenant_iduuidS'applique à la boutiqueREFERENCES tenants(id) ON DELETE CASCADE
namevarchar(100)Ex: 'Bamako Rive Gauche', 'Sikasso ville'NOT NULL
feeintegerMontant appliqué aux livraisonsNOT NULL DEFAULT 0
estimated_timevarchar(50)Délai (ex: '24h', 'Dans la journée')NULL
📋 saas_subscriptionsPostgreSQL

Archives comptables SaaS, suivi de la facturation des boutiques (Orange Money / Wave / carte).

ColonneTypeDescription
iduuidId d'abonnementPRIMARY KEY
tenant_iduuidBoutique abonnéeREFERENCES tenants(id)
plan_typevarchar(15)'free', 'standard', 'premium'NOT NULL
billing_cyclevarchar(15)'monthly', 'yearly'NOT NULL
amount_paidintegerMontant acquittéNOT NULL
statusvarchar(15)Statut d'abonnement ('active', 'past_due', 'cancelled')DEFAULT 'active'
expires_attimestampDate anniversaire de paiementNOT NULL