Dashboard Revendeur (Self-Service)
Interface de self-service pour revendeurs actifs — consultation revenus, abonnés, sessions, profil.
URL de production : https://admin-rgz.duckdns.org/dashboard/revendeurAuth : JWT RS256 + verif reseller_id ownership Accessible : Revendeurs (V1/V2/V3), NOC, Admin
Sections Principales
Section 1 : Mes Revenus
Affichage détaillé revenus revendeur avec split 50/50 RGZ.
┌─ REVENUS ───────────────────────────────────┐
│ Période : [30 jours ▼] [90 jours] [YTD] │
├─────────────────────────────────────────────┤
│ │
│ TOTAL BRUT (période) 450 000 F │
│ Commission système (-1.5%) -6 750 F │
│ NET (avant split) 443 250 F │
│ │
│ ┌─────────────────────────────────────────┐│
│ │ Split 50/50 RGZ ↔ Revendeur ││
│ │ ││
│ │ Part RGZ 221 625 F (50%) ✓ ││
│ │ Votre part 221 625 F (50%) 💰 ││
│ └─────────────────────────────────────────┘│
│ │
│ DÉTAIL PAR JOUR (graphique linéaire) │
│ ↑ 20K │
│ │ ╱╲ ╱╲ ╱╲ │
│ 15K │───╱ ╲──╱ ╲──╱ ╲── │
│ 10K │ │
│ │────────────────────→ (30j) │
│ │
│ Jours actifs : 28/30 │
│ Moyenne par jour : 14 870 F │
│ Meilleur jour : 22 450 F (17/02/2026) │
│ Dépôt prévu : 25/02/2026 (RGZ part) │
│ │
│ [Télécharger rapports détaillés (CSV/PDF)]│
│ [Voir factures mensuelles] │
└─────────────────────────────────────────────┘Métrique Détaillées
| Métrique | Calcul | Fréquence MAJ |
|---|---|---|
| Total brut | SUM invoices montant (période) | 1 min |
| Commission | Total × 1.5% | 1 min |
| NET (avant split) | Total - Commission | 1 min |
| Part RGZ | NET × 50% | 1 min |
| Votre part | NET × 50% | 1 min |
| Jours actifs | COUNT(DISTINCT date invoices) | 1 min |
| Moyenne/jour | NET / jours_actifs | 1 min |
| Meilleur jour | MAX(daily_revenue) | 1 min |
| Dépôt prévu | Calculé selon calendrier financier | Hebdo |
API : GET /api/v1/dashboard/revendeur/revenue?period=30d → Cache Redis 5 min
TIP
Transparence financière — Le revendeur voit exactement le calcul NET = (Total - Commission) × 50%. Pas de surprise. Télécharge facture officielle mensuelle (PDF signé RGZ).
Section 2 : Mes Abonnés
Liste abonnés du revendeur avec filtrage et recherche.
┌─ MES ABONNÉS ───────────────────────────────┐
│ Filtre : [Tous ▼] [Actifs] [Suspendus] │
│ Recherche : [MSISDN ou subscriber_ref...] │
├─────────────────────────────────────────────┤
│ Affichage : 1-20 de 1234 │
│ │
│ subscriber_ref │ MSISDN │ Status │ Devices │ Forfait │
│─────────────────────────────────────────────│
│ RGZ-0197979964 │ +229979... │ Active │ 1 / 2 │ Mensuel │
│ RGZ-0267834512 │ +229678... │ Active │ 2 / 2 │ Hebdo │
│ RGZ-0145639217 │ +229456... │ Suspended │ 0 │ Expiré │
│ RGZ-0178945623 │ +229789... │ Blocked │ 0 │ N/A │
│ ... │ ... │ ... │ ... │ ... │
│ │
│ [Afficher plus] ou [Pagination 20/50/100] │
│ [Exporter CSV (abonnés actifs)] │
└─────────────────────────────────────────────┘Colonnes Abonnés
| Colonne | Visible Revendeur | Notes |
|---|---|---|
| subscriber_ref | ✓ | ID unique "RGZ-MSISDN" |
| MSISDN | ✓ | Masqué dernier 3 chiffres (privacy) |
| Status | ✓ | active/suspended/blocked |
| Devices actifs | ✓ | Compteur MACs sessions actuelles |
| Forfait actif | ✓ | Journalier/Hebdo/Mensuel (ou expiré) |
| Données consommées | ✓ | Seulement si fair-use en vigueur |
| Créé le | ✓ | Date inscription |
| Dernière session | ✓ | Horodatage ou "jamais" |
API : GET /api/v1/dashboard/revendeur/subscribers?page=1&status=active&limit=20
WARNING
Privacy — Revendeur ne voit PAS les MACs détaillées (sécurité équipement abonné). Juste compteur "X devices connectés".
Section 3 : Mes Sessions
Sessions RADIUS actives en temps réel.
┌─ MES SESSIONS ACTIVES ──────────────────────┐
│ Refresh : Real-time (5s) │
│ Filtre : [Tous] [Journalier] [Hebdo] [Mens]│
├─────────────────────────────────────────────┤
│ Total sessions : 567 | Données ↓/↑ : 2.3GB │
│ │
│ Abonné │ MAC │ Depuis │ Débit │
│─────────────────────────────────────────────│
│ RGZ-019... │ C8:2A:**:**│ 02:45 │ 5.2M │
│ RGZ-026... │ D4:5E:**:**│ 15:32 │ 2.1M │
│ RGZ-014... │ 88:A1:**:**│ 23:12 │ 1.8M │
│ ... │ ... │ ... │ ... │
│ │
│ Légende : ↓ = download, ↑ = upload (Mbps) │
│ [Déconnecter session] [Historique] [Export]│
│ │
│ HISTORIQUE SESSIONS (derniers 7j) │
│ Graphique linéaire : sessions actives │
│ Crête : 892 sessions (17/02 16h) │
│ Moyenne : 456 sessions │
│ │
└─────────────────────────────────────────────┘Colonnes Session Temps Réel
| Colonne | Source | Refresh | Éditable |
|---|---|---|---|
| subscriber_ref | radius_sessions FK | Real-time | ✗ |
| MAC (masquée) | radius_sessions | Real-time | ✗ |
| Depuis | session_start | Real-time | ✗ |
| Débit actuel | Acct-Output-Octets diff | 30s | ✗ |
| Forfait | invoices (dernière) | 1 min | ✗ |
| Bytes ↓/↑ | sum(Acct-*-Octets) | 30s | ✗ |
Actions :
- Déconnecter (CoA RADIUS) : Admin + Revendeur
- Historique (7j) : CSV export
API : GET /api/v1/dashboard/revendeur/sessions?active=true (Websocket pour live)
TIP
Débit Temps Réel — Revendeur voit upload/download live. Utile pour diagnostiquer congestion ou slow client. Données brutes = octets/intervalle → conversion Mbps frontend.
Section 4 : Mon Profil
Paramètres + infos revendeur.
┌─ MON PROFIL ────────────────────────────────┐
│ [Infos générales] [Sites] [Documents] │
├─────────────────────────────────────────────┤
│ │
│ INFOS GÉNÉRALES │
│ ┌──────────────────────────────────────────┐│
│ │ Nom revendeur : Kossou Tech Connect ││
│ │ Classification : V2 (Multi-site) ││
│ │ Status : Active ││
│ │ Date validation : 15/12/2025 ││
│ │ Responsable : Kossou Jacques ││
│ │ Email : contact@kossou.bj ││
│ │ Téléphone : +229 97 98 XX XX ││
│ │ Adresse : Cotonou, Rue du Commerce ││
│ └──────────────────────────────────────────┘│
│ │
│ SITES (V2) │
│ ┌──────────────────────────────────────────┐│
│ │ S1 | Cotonou Centre | 10.142.0.0/24 ││
│ │ S2 | Cotonou Sud | 10.143.0.0/24 ││
│ │ [Ajouter site] (si V3 upgrade possible) ││
│ └──────────────────────────────────────────┘│
│ │
│ DOCUMENTS CONTRAT │
│ ┌──────────────────────────────────────────┐│
│ │ [📄 Convention partenariat v1.0.docx] ││
│ │ [📄 IFU technique v2.3.pdf] ││
│ │ [📄 Amendement ARCEP 2026-02.pdf] ││
│ │ [📄 SLA document v1.0.pdf] ││
│ └──────────────────────────────────────────┘│
│ │
│ PARAMÈTRES │
│ ┌──────────────────────────────────────────┐│
│ │ Notification email invoices : ✓ OUI ││
│ │ Rappel paiement avant : 3 jours ││
│ │ Compte bancaire IBAN : [IBAN...] ││
│ │ [Modifier] [Valider] ││
│ └──────────────────────────────────────────┘│
│ │
│ SUSPENSION / RÉSILIATION │
│ [Demander suspension (30j)] [Résilier] │
│ │
└─────────────────────────────────────────────┘Champs Profil (Lecture Seule)
| Champ | Éditablité | Notes |
|---|---|---|
| Nom revendeur | ✗ | Immuable après validation |
| Classification | ✗ | Modifiable par Admin (V1→V2→V3 upgrade) |
| Status | ✗ | Admin only |
| Dates | ✗ | Timestamps audit |
| Responsable | ✓ | Revendeur peut éditer |
| ✓ | Revendeur peut éditer | |
| Téléphone | ✓ | Revendeur peut éditer |
| Sites | ✓ (Admin) | Admin ajoute sites (V2/V3) |
| Paramètres email | ✓ | Revendeur contrôle |
| IBAN | ✓ | Revendeur renseigne pour virement |
API : GET /api/v1/dashboard/revendeur/profile (read) + PATCH /api/v1/dashboard/revendeur/profile (write champs autorisés)
INFO
Autonomie revendeur — Peut modifier nom responsable, emails, params notifications, IBAN. Impossible de changer classification (admin only). Demande suspension/résiliation créé ticket support pour approbation admin.
Navigation Revendeur
Authentification Revendeur
JWT claim : {
sub: reseller_id (UUID),
role: 'reseller',
reseller_name: 'Kossou Tech',
exp: timestamp (8h)
}
Vérification ownership :
- Endpoint /api/v1/dashboard/revendeur/*
- Valide JWT claim.reseller_id = resource.reseller_id
- Jamais faire confiance au frontend (reseller_id)
- Code backend : if current_user.reseller_id != resource.reseller_id: raise 403Session : Redis TTL 8h, inactivité 1h = logout auto
WARNING
Sécurité IDOR — Systématiquement valider ownership avant retourner données (LL#SEC-01). Revendeur A ne peut jamais voir revenus Revendeur B même si URL manipulée.
Intégrations Outils RGZ
| Outil | Impact Dashboard Revendeur | API |
|---|---|---|
| #19 Moteur Facturation | Calcul revenus 50/50 | GET /api/v1/dashboard/revendeur/revenue |
| #20 Vouchers | Pas visible revendeur | N/A (admin only) |
| #21 Réconciliation | Données factures mises à jour | Auto 00:15 UTC |
| #51 Dashboard Revendeur | CETTE interface | GET /api/v1/dashboard/revendeur/* |
| #56 Onboarding | Status étape visible en profil | GET /api/v1/resellers/{id}/onboarding-step |
| #6 RADIUS | Sessions actives affichées | Websocket stream |
| #47 ARCEP | Documents téléchargement | GET /api/v1/reports/arcep/... (revendeur peut télécharger export personnel) |
Dernière mise à jour : 2026-02-24 Stack : React 18 + Tailwind CSS Hébergement : docker/web/ (nginx:alpine) HTTPS : Let's Encrypt Traefik Polling : Websocket pour sessions real-time, HTTP polling 5s pour autres