| Module | Description | État |
|---|---|---|
| Auth OTP + JWT | OTP 6 chiffres, JWT RS256, refresh tokens, blacklist Redis, garde-fous RBAC | Stable |
| Emission de bons | Création unitaire et CSV, HMAC QR, provision entreprise, ledger double-entrée | Stable |
| Validation QR (POS) | SELECT FOR UPDATE, anti double-dépense, déduit bon, crédite commerçant | Stable |
| Reversements commerçants | Wave Direct → Bictorys disbursement → PayDunya (cascade), cron 20h, Bull queue | Stable |
| Recharge provision (RH) | Bictorys Checkout + Direct (Wave/OM) + PayDunya fallback, webhook confirmation | Stable |
| Abonnement SaaS | Paiement en ligne par segment, activation auto via webhook, cron expiration/suspension | Stable |
| Espace bénéficiaire | Wallet, QR plein écran, Screen Wake Lock, PWA installable | Stable |
| Espace POS commerçant | Scanner QR, saisie montant, confirmation, dashboard, multi-vendeurs, pointage | Stable |
| Espace RH entreprise | Tableau de bord, émission, import CSV, invitations, abonnement, rapports RSE | Stable |
| Espace admin | Trésorerie, KYB, webhooks, contrats, équipe, diagnostics, abonnements | Stable |
| Signature contrat | Viewer in-page, pads de signature canvas, lien /signer?token= partageable WA/email | Stable |
| Notifications | SMS (Africa's Talking + Twilio fallback), WhatsApp (Baileys + Meta Cloud API), email | Stable |
| KYB commerçants | Upload documents, workflow PENDING→APPROVED/REJECTED, interface admin de review | Stable |
| Ledger comptable | Double-entrée INSERT-ONLY, invariant débit=crédit, export CSV | Stable |
| Webhooks paiement | Wave, Orange Money, Bictorys, PayDunya — vérification signature + idempotence | Stable |
| Module | Description | État |
|---|---|---|
| Bictorys Direct (Wave/OM) | createDirectCharge() implémenté — dépend de BICTORYS_PUBLIC_KEY non encore configuré | Config Railway |
| Wave Direct Payout | sendPayout() implémenté — nécessite compte Wave Business (contact merchant@wave.com) | Compte requis |
| PayDunya fallback | Intégré comme fallback — nécessite clés PayDunya dans Railway | Clés à ajouter |
| Diaspora / Transfert | Pages /diaspora/* existent — logique backend à compléter | En cours |
| Flash Offers géolocalisées | Modèle et endpoints créés — frontend POS partiellement connecté | En cours |
| Programme fidélité | LoyaltyCard en base, endpoint /loyalty/me — accumulation points à activer | En cours |
| Pay-requests e-commerce | API key auth, endpoints créés — intégration marchand à tester en prod | À tester |
| Support tickets | Backend complet — interface frontend admin à finaliser | En cours |
| 2FA / TOTP | OTP SMS uniquement — authenticator app non prévu en V1 | V2 |
| Service Worker offline | Manifest PWA complet — cache strategies à renforcer pour 3G dégradé | À renforcer |
| Prestataire | Usage | Priorité | Variables Railway | État |
|---|---|---|---|---|
| Bictorys | Checkout encaissements · Direct Wave/OM · Disbursements OM | Principal | BICTORYS_SECRET_KEY BICTORYS_PUBLIC_KEY BICTORYS_WEBHOOK_SECRET |
Clé invalide |
| PayDunya | Fallback encaissements · Fallback reversements Wave/OM | Fallback | PAYDUNYA_MASTER_KEY PAYDUNYA_PRIVATE_KEY PAYDUNYA_TOKEN |
À configurer |
| Wave Direct | Reversements commerçants Wave (0% commission) | Principal Wave | WAVE_API_KEY WAVE_BASE_URL |
Compte requis |
| Africa's Talking | SMS OTP + notifications | Principal SMS | AT_API_KEY AT_USERNAME |
Actif |
| Twilio | Fallback SMS | Fallback SMS | TWILIO_ACCOUNT_SID TWILIO_AUTH_TOKEN |
Configuré |
| # | Règle | Raison |
|---|---|---|
| 1 | Montants TOUJOURS en centimes FCFA (Int) | 10 000 FCFA = 1 000 000 centimes. Jamais de Float, jamais de Number JS pour les montants financiers. |
| 2 | LedgerModule : INSERT ONLY | Aucun UPDATE ni DELETE sur les entrées du ledger. Piste d'audit immuable. |
| 3 | Validation QR : SELECT FOR UPDATE dans transaction Prisma | Zéro race condition tolérée. Anti double-dépense absolu. |
| 4 | Instructions EME/paiement via queue Bull asynchrone | Jamais d'appel synchrone bloquant à une API externe sur le chemin critique. |
| 5 | Secrets 100% en variables d'environnement | Zéro hardcode dans le code source ou les commits. |
| 6 | Pour toute opération ledger : SUM(débit) = SUM(crédit) | Invariant comptable absolu. Violation = bug critique. |
| 7 | TypeScript strict — zéro any implicite | "strict": true dans tsconfig. Toutes les PR passent le typecheck. |
| 8 | Webhooks : vérification HMAC timingSafeEqual AVANT traitement | Jamais de === pour comparer les signatures. Protection contre timing attacks. |
| 9 | Affichage montants : toujours amount / 100 → FCFA | Conversion systématique centimes → FCFA dans tous les affichages. |
| 10 | Commission : Math.round(amount * rate) — jamais de float | Arrondi entier obligatoire. const commission = Math.round(amount * 0.05); |