En Côte d'Ivoire, l'argent des associations, tontines et groupes communautaires circule déjà par mobile money, mais la décision collective qui l'entoure reste orale et invérifiable : un trésorier tient un cahier, personne ne peut lui donner tort ni raison, et ce climat de soupçon — plus que la fraude elle-même — use les groupes jusqu'à leur extinction. Les outils existants (compte mobile money personnel, groupe WhatsApp, cahier/tableur, compte bancaire associatif) ne couvrent chacun qu'un morceau du problème : aucun ne porte la gouvernance (qui décide, à combien de voix, avec quelle trace). Djelimeet numérise cette règle de gouvernance — pas l'argent, qui reste chez l'opérateur mobile money agréé.
- Réduire à zéro les sorties de caisse non collégiales : 100 % des retraits de groupe passent par un vote à seuil (≥ 80 % des chefs actifs), sans exception technique possible (contrainte en base, pas seulement en écran).
- Fiabilité du grand livre : 0 écriture modifiable ou supprimable après coup, vérifié par triggers PostgreSQL (
deny_ledger_mutation, assert_transaction_balanced) sur 100 % des tables financières. - Idempotence : un rejeu de webhook ou d'appel réseau ne crédite jamais deux fois un wallet ou une caisse (0 double-crédit toléré en production).
- Délai de traitement d'une demande de retrait sans quorum : expiration automatique sous 72 h, restitution à 100 % des fonds gelés.
- Couverture du contrat d'API : 147 opérations OpenAPI 3.1 documentées sur 13 domaines, chaque route livrée correspond exactement à une opération du contrat (0 route hors spec).
- Pilote commercial (horizon 90 jours post-lancement) : 3 groupes pilotes signés, mesure du taux de couverture opérateur chez les membres (seuil cible ≥ 80 % pour que le module financier soit viable) et du délai d'obtention du contrat marchand.
| Rôle | Attentes |
|---|
| Membre | Visibilité sur la caisse de ses groupes, paiement de cotisation simple, confiance que son argent ne peut pas disparaître sans trace. |
| Trésorier | Ne plus porter seul la charge de la preuve ; un journal qui parle pour lui en assemblée générale. |
| Chef (bureau) | Pouvoir de décision collégiale réel sur les sorties de fonds ; outil de gouvernance, pas de comptabilité d'expert-comptable. |
| Secrétaire | Réunions qui se convoquent et se documentent seules (présence QR, PV). |
| Modérateur | Traiter les signalements de contenu de son groupe sans voir les autres groupes. |
| Back-office système (support, finance_admin, moderator, super_admin) | Superviser la plateforme (facturation, réconciliation, litiges) sans jamais pouvoir lire un PIN ni modifier une écriture. |
| Opérateur mobile money (Wave) | Rester le seul détenteur réel des fonds — Djelimeet ne doit jamais être requalifié en émetteur de monnaie électronique. |
| Investisseur / partenaire | Modèle économique soutenable (abonnement, pas de commission sur les flux) et défendable réglementairement. |
| Terme | Définition |
|---|
| Tenant | Le groupe (association, tontine...) ; toute donnée cloisonnée par group_id. |
| Collège des chefs | Ensemble des membres actifs portant le rôle « chef » au moment de l'ouverture d'une demande de retrait ; figé à cet instant (ADR-06). |
| Seuil des 80 % | requiredApprovals = ceil(0.8 × N), N = chefs actifs hors demandeur. |
| Grand livre (ledger) | Ensemble des écritures en partie double (ledger_entries) ; seule source de vérité des soldes, jamais modifiable. |
| Float | Solde réel détenu chez l'opérateur mobile money pour le compte marchand Djelimeet ; modélisé comme un compte du plan comptable, pas un solde caché. |
| Reddition de comptes | Justification d'un décaissement par des lignes de dépense déclarées par le bénéficiaire — jamais des écritures comptables. |
| Palier (abonnement) | Tranche de tarification par nombre de membres actifs à l'échéance (Découverte / Association / Fédération / Grand groupe). |
| RLS | Row-Level Security PostgreSQL ; isolation d'un tenant au niveau base, en plus du middleware applicatif. |
| OTP | Code à usage unique à 6 chiffres, canal WhatsApp d'abord puis SMS, utilisé pour l'authentification et la re-vérification des votes. |
Inclus (v1) : identité par numéro de téléphone (OTP, PIN), groupes multi-tenant avec RBAC cumulatif, grand livre en partie double, wallet et rechargement (Wave), cotisations (montant fixe ou cagnotte libre, tarifs par classe de membre), retraits à 80 % avec reddition de comptes, réunions avec présence QR et PV, billetterie d'événements (formules, contrôle d'entrée), fil social modéré, sondages, notifications, abonnement par groupe/palier, back-office système (facturation, réconciliation, litiges, modération).
Exclus (hors v1) : catégories comptables et budgets prévisionnels, deuxième opérateur mobile money branché (architecture prête, intégration non faite), commission sur les flux comme source de revenu, versionnement de rupture de l'API (/v2), notifications financières désactivables sous quelque forme que ce soit, module tontine dédié (praticable aujourd'hui via cotisation + retrait, sans schéma spécifique).
| ID | Description | Priorité | RG liées |
|---|
| EXF-01 | Un utilisateur s'inscrit et se connecte uniquement par numéro de téléphone + OTP, jamais par mot de passe. | MUST | RG-01, RG-02 |
| EXF-02 | Un code PIN à 4 chiffres protège chaque opération financière, jamais l'ouverture de l'app, et n'est jamais lisible par l'administration. | MUST | RG-03 |
| EXF-03 | Un membre peut appartenir simultanément à plusieurs groupes, chacun cloisonné (fil, caisse, membres, réunions). | MUST | RG-06, RG-14 |
| EXF-04 | Les rôles de groupe (membre, secrétaire, trésorier, modérateur, chef) se cumulent au sein d'une adhésion ; la permission effective est l'union des rôles. | MUST | RG-07 |
| EXF-05 | Un trésorier peut ouvrir une demande de retrait avec motif et devis chiffré ; les fonds sont gelés immédiatement. | MUST | RG-19, RG-22 |
| EXF-06 | Chaque chef actif (hors demandeur et hors trésorier demandeur) vote une seule fois sur une demande de retrait, après ré-authentification OTP. | MUST | RG-08, RG-20 |
| EXF-07 | Une demande de retrait atteint l'exécution seulement si approvalsCount ≥ requiredApprovals ; sinon elle expire sous 72 h et restitue les fonds. | MUST | RG-19, RG-24 |
| EXF-08 | Un décaissement exécuté reste « à solder » jusqu'à ce que le bénéficiaire déclare des lignes de justification. | MUST | RG-25 |
| EXF-09 | Toute variation de solde (cotisation, retrait, abonnement, billetterie) produit une écriture en partie double, jamais un simple incrément de champ. | MUST | RG-09, RG-10 |
| EXF-10 | Un webhook de paiement rejoué (Wave) ne crédite jamais deux fois le même wallet ou la même caisse. | MUST | RG-11, RG-17 |
| EXF-11 | Un secrétaire peut planifier une réunion, générer un QR de présence tournant (60 s) et publier un PV immuable. | MUST | RG-26, RG-30 |
| EXF-12 | Un organisateur peut créer un événement à formules multiples (Standard/VIP/VVIP), vendre des billets avec réservation temporaire de 10 minutes. | MUST | RG-27, RG-28 |
| EXF-13 | Un groupe peut publier sur son fil interne, marquer explicitement un contenu comme public pour le site vitrine. | SHOULD | RG-31 |
| EXF-14 | Un membre peut signaler un contenu ; un modérateur de groupe traite les signalements de son groupe, un modérateur système voit tous les groupes. | MUST | RG-32 |
| EXF-15 | Un groupe souscrit un abonnement par palier de membres, prélevé sur la caisse avec autorisation explicite d'un chef. | MUST | RG-29 |
| EXF-16 | Les alertes financières (cotisation, vote de retrait, retrait exécuté/échoué, abonnement) ne sont jamais désactivables par l'utilisateur. | MUST | RG-13 |
| EXF-17 | Le back-office système peut changer le seuil des 80 % uniquement via une double validation à deux signatures distinctes. | MUST | RG-35 |
| EXF-18 | Un bureau peut consulter la description de profil et les avis anonymisés d'un demandeur d'adhésion avant de l'accepter. | SHOULD | RG-33 |
| ID | Catégorie | Critère chiffré |
|---|
| EXN-01 | Sécurité — auth | OTP : TTL 5 min, 3 envois/numéro/h, 10 envois/IP/h, 5 tentatives puis blocage 15 min. |
| EXN-02 | Sécurité — session | Access token 15 min, refresh token opaque 30 j, rotation à chaque usage, réutilisation d'un refresh révoqué = révocation de toute la famille. |
| EXN-03 | Disponibilité — réconciliation | Rapprochement des webhooks Wave en retard : sweep périodique toutes les 5 min, écart toujours tracé (jamais d'ajustement silencieux). |
| EXN-04 | Performance — présence | QR de présence régénéré toutes les 60 s, scan validé hors ligne avec dérive d'horloge tolérée de ±2 fenêtres (±120 s). |
| EXN-05 | Fiabilité — retraits | Fenêtre de quorum 72 h, relances automatiques programmées avant échéance (push puis WhatsApp puis SMS en approche de délai). |
| EXN-06 | Intégrité — montants | 100 % des montants stockés en entiers (bigint) francs CFA, aucun type flottant ou décimal dans le schéma financier. |
| EXN-07 | Contrat d'API | 147 opérations OpenAPI 3.1 ; toute opération financière ou hors-ligne porte un en-tête Idempotency-Key (UUID v7). |
| EXN-08 | Confidentialité | Un modérateur de groupe n'accède jamais aux groupes dont il n'est pas membre ; RLS PostgreSQL sur les tables financières en plus du scope applicatif. |
| EXN-09 | Portabilité mobile | Lecture offline-first côté app (file de mutation avec clé d'idempotence) ; un secrétaire doit pouvoir pointer 80 présences sans réseau. |
- Réglementaire : aucune détention de fonds, aucune commission sur les flux — positionnement éditeur de logiciel, pas émetteur de monnaie électronique au sens UEMOA/BCEAO ; position à faire confirmer par un juriste ivoirien avant le premier franc réel.
- Technique : SQL brut paramétré sur PostgreSQL comme couche d'accès (pas de Lucid ORM) pour les domaines financiers — cohérence de style imposée par
CLAUDE.md du dépôt backend ; AdonisJS 6 / TypeScript ESM ; Redis pour OTP et verrous courts ; BullMQ pour les jobs asynchrones. - Opérateur : un seul opérateur mobile money en production au lancement (Wave) ; l'interface
PaymentProvider doit rester multi-opérateur dès le premier jour sans que l'ajout d'un deuxième opérateur soit une refonte. - Budgétaire : modèle économique fondé exclusivement sur l'abonnement par groupe/palier ; le palier gratuit (≤ 15 membres) est un moteur d'acquisition volontairement non rentable.
- Marché : cible initiale Abidjan, langue française, montants exclusivement en francs CFA (XOF).
| Risque | Impact | Parade |
|---|
| Confier sa caisse à une jeune application (objection de tout bureau) | Élevé — bloque l'adoption | Le produit se vend d'abord sans sa partie financière (vie de groupe, réunions) ; l'argent ne quitte jamais le compte tenu chez l'opérateur agréé. |
| Dépendance à un seul opérateur (panne, changement tarifaire, refus de contrat) | Élevé — bloque tout le module financier | Architecture multi-opérateur dès le premier jour au niveau du modèle de données et de l'interface PaymentProvider ; ajouter le second est un connecteur, pas une refonte. |
| Requalification réglementaire (émetteur de monnaie électronique) | Moyen — risque juridique existentiel | Aucune détention de fonds, aucune commission sur les flux, revenus exclusivement en abonnement ; validation juridique avant tout flux réel. |
| Incident financier public (retrait exécuté deux fois, solde faux) | Fatal — réputationnel et légal | Grand livre en partie double, écritures non modifiables, idempotence systématique, réconciliation quotidienne ; au moindre écart, blocage plutôt que passage silencieux. |
| Cumul de rôles qui viderait le mécanisme des 80 % de son sens | Élevé — contourne l'invariant central | Séparation des pouvoirs codée en base (RG-08) : un chef-trésorier ne vote pas sur sa propre demande et ne compte pas dans le quorum. |
Voir l'artefact dédié regles_gestion (RG-01 à RG-35), regroupées par domaine : identité/RBAC, groupes, finance/grand livre, retraits à double validation, abonnements, billetterie/événements, réunions/PV, social, notifications, admin. Chaque exigence fonctionnelle ci-dessus référence les RG qui la justifient.