Du design
au développement.
Le pont entre le prototype abouti et la mise en production. Cahier des charges, architecture, modèle de données, API, sécurité et déploiement, réunis en un document de référence.
Cahier des charges
Ce que la plateforme doit faire, pour qui, et avec quelles contraintes. Le contrat fonctionnel.
Objectif
Frank'line est une maison de polos et de maille. La plateforme doit permettre de vendre en ligne (boutique e-commerce), de raconter la marque (magazine éditorial), et de gérer l'activité (back-office). Le polo est le cœur du catalogue ; les compléments (L'Atelier) et la Maison sont secondaires.
Périmètre fonctionnel
| Module | Fonctions attendues | Priorité |
|---|---|---|
| Catalogue | Collections, fiches produit, filtres, recherche, variantes (couleur/taille) | Indispensable |
| Panier & commande | Panier persistant, checkout, paiement, confirmation, suivi | Indispensable |
| Compte client | Inscription, commandes, traçabilité, factures, favoris, adresses, fidélité | Indispensable |
| Personnalisation | Monogrammage (1 à 3 initiales), coffret signature | Importante |
| Magazine | Journal, articles, catégories | Importante |
| Services | Carte-cadeau, rendez-vous sur-mesure | Souhaitable |
| Back-office | Tableau de bord, commandes, stock/appro, clients, contenu, stats, équipe | Indispensable |
| Réseaux | WhatsApp, Instagram, Facebook, TikTok | Souhaitable |
Exigences non fonctionnelles
- Performance · LCP < 2,5 s, CLS < 0,1, images < 120 Ko
- Accessibilité · WCAG 2.1 niveau AA, navigation clavier, focus visible
- Responsive · mobile d'abord, 4 breakpoints (≤720 / ≤1000 / ≤1440 / +)
- Sécurité · paiement 3D Secure, données chiffrées, RGPD
- Marque · palette Heritage, zéro vert, zéro cadratin, apostrophe rouge, inspiration Tommy
- International · FR primaire + EN, multi-devises (EUR d'abord)
Stack technique
Recommandation de pile technologique. Le front actuel est statique : il sert de référence visuelle exacte à reproduire dans le framework choisi.
| Couche | Recommandation | Alternative |
|---|---|---|
| Front boutique | Next.js (React) · SSR/SSG pour le SEO | Nuxt (Vue), Astro |
| Style | Reprendre frankline.css · tokens en CSS variables | Tailwind mappé sur les tokens |
| Back-office | App React séparée (sous-domaine admin.) | Admin intégré protégé |
| API | Node.js (NestJS/Express) REST · ou GraphQL | Django REST, Laravel |
| Base de données | PostgreSQL | MySQL |
| Paiement | Stripe (carte, Apple Pay, 4×) | Adyen, Mollie |
| Médias | CDN + stockage objet (S3) | Cloudinary |
| Hébergement | Conteneurs (Docker) · CI/CD GitLab | Vercel + base managée |
frankline.css contient déjà tous les tokens et composants.Architecture générale
Vue en couches. Le client et l'admin sont deux applications distinctes consommant la même API.
Base de données
Modèle relationnel (schéma conceptuel). ● clé primaire · ● clé étrangère.
- iduuid
- namevarchar
- slugvarchar
- categoryenum
- price_centsint
- descriptiontext
- statusenum
- iduuid
- product_idfk
- colorvarchar
- sizevarchar
- skuvarchar
- stock_qtyint
- iduuid
- emailvarchar
- first_namevarchar
- last_namevarchar
- loyalty_tierenum
- created_atts
- iduuid
- refvarchar
- customer_idfk
- statusenum
- total_centsint
- shippingjsonb
- created_atts
- iduuid
- order_idfk
- variant_idfk
- qtyint
- unit_centsint
- monogramvarchar
- iduuid
- customer_idfk
- line1 / line2varchar
- zip / cityvarchar
- countryvarchar
- is_defaultbool
- iduuid
- title / slugvarchar
- categoryenum
- bodyrichtext
- statusenum
- published_atts
- iduuid
- emailvarchar
- roleenum
- password_hashvarchar
- last_logints
- iduuid
- customer_idfk
- variant_idfk
- added_atts
product1 ··· Nvariant(un polo a plusieurs couleurs/tailles)customer1 ··· Norder1 ··· Norder_itemN ··· 1variantcustomer1 ··· Naddresset 1 ··· Nwishlistuser(admin) isolé descustomer· table et authentification séparées
API · endpoints
REST, réponses JSON. Préfixe /api/v1. Authentification par jeton (Bearer) pour les routes privées.
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /products?category=&sort=&page= | Liste filtrée & paginée |
| GET | /products/:slug | Fiche produit + variantes |
| GET | /search?q= | Recherche |
| GET | /articles · /articles/:slug | Magazine |
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /cart | Panier courant (session) |
| POST | /cart/items | Ajouter (variant + qty + monogramme) |
| PUT | /cart/items/:id | Modifier quantité |
| DEL | /cart/items/:id | Retirer |
| POST | /checkout | Créer commande + intent paiement |
| POST | /webhooks/stripe | Confirmation paiement (signé) |
| Méthode | Chemin | Rôle |
|---|---|---|
| POST | /auth/register · /auth/login | Compte client |
| GET | /me/orders · /me/orders/:ref | Commandes + traçabilité |
| GET | /me/orders/:ref/invoice | Facture PDF |
| GET | /me/wishlist | Favoris |
| PUT | /me/addresses/:id | Carnet d'adresses |
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /admin/stats | KPI, ventes, acquisition |
| PUT | /admin/orders/:id/status | Avancer une commande |
| POST | /admin/products | Créer produit + variantes |
| PUT | /admin/stock/:sku | Ajuster le stock |
| POST | /admin/team/invite | Inviter un collaborateur |
GET /products/polo-colette// 200 OK { "id": "a3f…", "name": "Polo Colette", "category": "femme", "price_cents": 8900, "variants": [ { "sku": "COL-BLU-S", "color": "Blush", "size": "S", "stock": 4 }, { "sku": "COL-BLU-M", "color": "Blush", "size": "M", "stock": 11 } ], "monogram_available": true }
Paiement · Afrique & International
Frank'line se déploie en Côte d'Ivoire, en Afrique de l'Ouest puis à l'international. Le système de paiement est donc multi-canal : mobile money local, cartes, et agrégateurs régionaux, branchés derrière une couche d'abstraction unique.
Couche d'abstraction paiement
L'application ne parle jamais directement à un opérateur. Elle passe par un service Paiement interne qui expose une interface unique (createPayment, confirmPayment, refund) et route vers le bon fournisseur selon le pays, la devise et le moyen choisi. On peut ainsi ajouter/retirer un opérateur sans toucher au checkout.
Mobile money Afrique de l'Ouest
| Moyen | Zone | Intégration |
|---|---|---|
| Orange Money | CI, SN, ML, BF… | API Orange / via agrégateur |
| MTN Mobile Money | CI, autres | MTN MoMo API / agrégateur |
| Moov Money | CI, zone UEMOA | API Moov / agrégateur |
| Wave | CI, SN | API Wave (paiement & QR) |
| Carte prépayée / GIM-UEMOA | UEMOA | Via agrégateur régional |
Agrégateurs recommandés
Plutôt que d'intégrer chaque opérateur un par un, on s'appuie sur un agrégateur qui réunit Orange/MTN/Moov/Wave + cartes en une seule API. Choix recommandé selon couverture :
| Agrégateur | Couverture | Moyens réunis |
|---|---|---|
| CinetPay | CI & Afrique de l'Ouest/Centrale | Orange, MTN, Moov, Wave, Visa/MC |
| PayDunya | UEMOA | Mobile money + cartes |
| Paystack | Afrique anglophone + expansion | Cartes, mobile money, virement |
| Flutterwave | Pan-africain + international | Mobile money, cartes, USSD |
| Stripe | International (Europe, US…) | Cartes, Apple/Google Pay, paiement 4× |
International
- Cartes · Visa, Mastercard, Amex (3D Secure)
- Wallets · Apple Pay, Google Pay, PayPal
- Paiement fractionné · 3× / 4× (selon marché)
Devises & tarification
| Marché | Devise | Format |
|---|---|---|
| Côte d'Ivoire / UEMOA | Franc CFA (XOF) | 52 000 FCFA · sans décimale |
| Zone euro | Euro (EUR) | 89 € |
| International | USD & autres | selon localisation |
Flux mobile money (ex. Orange Money / Wave)
Le paiement mobile money est asynchrone : la commande reste en attente de paiement jusqu'au webhook de confirmation. L'écran de checkout affiche un état « en attente de validation sur votre téléphone » avec compte à rebours et reprise possible.
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /payment/methods?country=CI | Moyens disponibles selon pays |
| POST | /payment/intent | Créer un paiement (moyen + montant) |
| GET | /payment/:id/status | Polling de l'état (mobile money) |
| POST | /webhooks/payment/:provider | Confirmation signée par l'agrégateur |
| POST | /payment/:id/refund | Remboursement (admin) |
Authentification & rôles
Deux mondes séparés : les clients (boutique) et les utilisateurs internes (back-office). Jamais la même table, jamais le même jeton.
| Rôle | Accès | Peut faire |
|---|---|---|
| CLIENT | Boutique | Commander, suivre, favoris, compte |
| ADMIN | Back-office complet | Tout · produits, stock, équipe, réglages, paiements |
| ÉDITEUR | Back-office partiel | Commandes, stock, produits, contenu · pas l'équipe ni les réglages |
| LECTURE | Back-office lecture | Voir commandes & stats · aucune modification |
- Jetons JWT courte durée + refresh token httpOnly
- Double authentification (2FA) obligatoire pour ADMIN
- Journal des accès back-office (qui, quoi, quand)
- Invitation collaborateur par e-mail avec rôle pré-assigné, expiration 72h
admin.frank-line.com), isolé de la boutique : cookies séparés, politique CORS stricte, jamais exposé au client.Flux métier
Les parcours critiques, étape par étape.
Commande + paiement
Cycle de vie d'une commande
confirmée → en préparation (atelier, +5j si monogramme) → expédiée (n° suivi transporteur) → en livraison → livrée. Chaque transition notifie le client et s'affiche dans la traçabilité (côté client) et le back-office (côté admin).
Réapprovisionnement
Quand stock_qty passe sous un seuil défini par variante, une alerte apparaît au tableau de bord et un bon de commande fournisseur peut être généré. La chaîne d'appro (filature → tissage → coupe → broderie → contrôle) est suivie par étapes.
Intégrations externes
Services tiers, branchés via API/webhooks depuis le back-office.
| Service | Usage | Mécanisme |
|---|---|---|
| Stripe | Paiement carte, Apple Pay, paiement en 4× | SDK + webhooks signés |
| Transporteur | Étiquettes, numéros de suivi, statuts | API REST + callback |
| E-mail transactionnel | Confirmation, expédition, réinitialisation | API (templates) |
| WhatsApp Business | Messagerie client, confirmations | Cloud API Meta |
| Instagram Shopping | Catalogue taggable, DM unifiés | Graph API Meta |
| Facebook / Meta | Boutique Meta, publicités, Messenger | Graph API |
| TikTok Shop | Catalogue, vidéos shoppables | TikTok Business API |
Services transverses
Les briques techniques partagées par toute la plateforme, au-delà du métier.
| Service | Rôle | Techno recommandée |
|---|---|---|
| Recherche | Recherche produit instantanée, filtres, suggestions | Meilisearch / Algolia |
| Cache & sessions | Panier invité, sessions, file d'attente | Redis |
| Stockage média | Images produit, optimisation, CDN | S3 + CDN (responsive) |
| E-mail / SMS | Transactionnel (commande, expédition) + SMS mobile money | API e-mail + passerelle SMS locale |
| File de tâches | Broderie, génération facture PDF, exports | Worker + file (BullMQ) |
| Internationalisation | FR / EN, devises XOF / EUR / USD | i18n + table de devises |
| Journalisation | Logs applicatifs, journal d'audit admin | Logs centralisés |
Déploiement CI/CD
Le prototype se déploie déjà en statique via GitLab Pages. En production, le même pipeline build les apps et l'API.
# .gitlab-ci.yml (production) stages: [ lint, test, build, deploy ] lint: # eslint + stylelint + prettier test: # unitaires (jest) + e2e (playwright) build: # build front boutique + admin + api (docker) deploy: # push images → registre → orchestrateur environment: production only: [ main ]
| Env | Branche | URL |
|---|---|---|
| Développement | feature/* | local · review apps |
| Recette | develop | staging.frank-line.com |
| Production | main | frank-line.com · admin.frank-line.com |
DATABASE_URL=postgres://… STRIPE_SECRET_KEY=sk_live_… STRIPE_WEBHOOK_SECRET=whsec_… JWT_SECRET=… S3_BUCKET / S3_KEY / S3_SECRET=… MAIL_API_KEY=… META_APP_ID / META_APP_SECRET=…
Sécurité & RGPD
- HTTPS partout · HSTS
- Paiement 3D Secure · PCI géré par Stripe (aucune carte stockée)
- Mots de passe hachés (bcrypt/argon2)
- 2FA admin · journal des accès
- Rate-limiting · protection CSRF/XSS · en-têtes CSP
- Sauvegardes BDD quotidiennes chiffrées
- Consentement cookies (bandeau)
- Droit d'accès, rectification, effacement, portabilité
- Données minimisées · durées de conservation définies
- Sous-traitants conformes (paiement, e-mail, hébergement)
- Registre des traitements · DPO désignable
- Pages légales déjà rédigées (CGV, Mentions, Confidentialité)
Monitoring & SEO
Surveiller la santé de la plateforme et garantir sa visibilité dès la mise en ligne.
- Suivi des erreurs (Sentry) · alertes temps réel
- Disponibilité (uptime) · sondes par environnement
- Cœur web vitaux · LCP, CLS, INP suivis en continu
- Tableau de bord technique · latence API, taux d'erreur
- Alertes paiement · échecs mobile money / carte
- Rendu serveur (SSR/SSG) · pages produit indexables
- Métadonnées · Open Graph, données structurées Product
sitemap.xml·robots.txt· URLs propres (slug)- Analytics respectueux RGPD · tunnel de conversion
- Balises hreflang · FR / EN multi-marchés
Roadmap de mise en œuvre
Séquence recommandée pour passer du prototype à la production.
| Jalon | Contenu | Sortie |
|---|---|---|
| J1 · Socle | Repo, CI/CD, BDD, auth, API catalogue | Catalogue navigable connecté |
| J2 · Achat | Panier, checkout, Stripe, commandes, e-mails | Premier paiement de bout en bout |
| J3 · Compte | Inscription, traçabilité, factures, favoris, fidélité | Espace client complet |
| J4 · Back-office | Commandes, stock/appro, produits, stats, équipe | Gestion autonome |
| J5 · Contenu & services | Journal, carte-cadeau, sur-mesure, monogramme | Plateforme complète |
| J6 · Réseaux & lancement | WhatsApp/IG/Meta/TikTok, SEO, perf, recette | Mise en production |
03-prototype/ : le développement consiste à reproduire ces écrans en les branchant à l'API décrite ici. Aucun écran n'est à inventer.