v1.0 Novembre 2025
5.2.4

Diagramme de Séquence
Génération QR Code

La solution de cashback nouvelle génération

24 novembre 2025
Version 1.0
1

PRÉSENTATION GÉNÉRALE

1.1 Objectif du Document

Ce document décrit le diagramme de séquence pour la fonctionnalité de génération de QR code dans l'application mobile REWAPP. Cette fonctionnalité permet aux utilisateurs de convertir leurs points en un QR code scannable par un commerçant partenaire pour obtenir une réduction immédiate sur leurs achats.

1.2 Contexte Fonctionnel

La génération de QR code est au cœur du système de cashback commerçant REWAPP. Elle permet aux utilisateurs de :

  • Convertir leurs points accumulés en valeur dépensable
  • Bénéficier d'un ratio avantageux (+5% vs cashback bancaire)
  • Utiliser leurs points instantanément chez un partenaire

1.3 Règles Fondamentales

10 pts = 1,05€ Ratio +5%
60 sec Validité
Unique Usage
10 pts Minimum
2

ACTEURS ET COMPOSANTS

2.1 Acteurs Principaux

Acteurs du Flux

Acteur Description Responsabilité
Client Utilisateur de l'application mobile Initie la génération du QR code, sélectionne le montant
Application Mobile Interface Angular + Ionic Affiche l'interface, gère le compteur, affiche le QR code

2.2 Composants Backend

Architecture Technique

Composant Technologie Responsabilité
API Gateway Kong / AWS API Gateway Authentification, rate limiting, routage
Service QR Codes NestJS Microservice Génération, validation, gestion du cycle de vie
Service Points NestJS Microservice Vérification solde, blocage/déblocage des points
Cache Redis Redis 7+ Stockage temporaire du QR code, gestion expiration
Base de Données PostgreSQL 15+ Persistance des transactions QR code
3

DIAGRAMME DE SÉQUENCE PLANTUML

3.1 Diagramme Complet

Diagramme de Séquence - Génération QR Code REWAPP
4

FLUX NOMINAL DÉTAILLÉ

4.1 Phase 1 : Consultation du Solde

ÉtapeActionDétail
1.1Ouverture de l'écranL'utilisateur accède à l'écran "Utiliser mes points" depuis le menu principal
1.2Requête APIL'application envoie GET /api/v1/points/balance avec le token JWT
1.3Vérification soldeLe Service Points interroge la base de données pour récupérer le solde disponible
1.4AffichageL'application affiche le solde en points ET sa valeur en euros (×0,105)

4.2 Phase 2 : Saisie du Montant

ÉtapeActionDétail
2.1Sélection montantL'utilisateur saisit le nombre de points à utiliser (slider ou champ numérique)
2.2Validation localeVérification côté client : montant ≥ 10 pts ET montant ≤ solde disponible
2.3Aperçu conversionAffichage en temps réel : "X points = Y,YY€" (formule : points × 0,105)
2.4ConfirmationL'utilisateur clique sur le bouton "Générer QR Code"

4.3 Phase 3 : Génération du QR Code

ÉtapeActionDétail
3.1Requête générationPOST /api/v1/qrcode/generate avec { points: montant }
3.2Blocage des pointsLes points sont immédiatement verrouillés (indisponibles pour autre usage)
3.3Création identifiantGénération d'un UUID v4 unique pour ce QR code
3.4Construction payloadAssemblage des données : userId, points, valeur, timestamps
3.5Signature HMACApplication de la signature HMAC-SHA256 avec clé secrète serveur
3.6Stockage cacheEnregistrement dans Redis avec TTL de 70 secondes
3.7PersistanceEnregistrement en base PostgreSQL pour historique et audit
3.8Retour clientQR code encodé en base64 + métadonnées

4.4 Phase 4 : Affichage et Compteur

ÉtapeActionDétail
4.1Affichage QRQR code affiché en grand format (plein écran recommandé)
4.2Démarrage compteurCompteur à rebours initialisé à 60 secondes
4.3Code couleurVert (60-31s)Orange (30-11s)Rouge (10-0s)
4.4Feedback haptiqueVibration légère quand le compteur passe sous 10 secondes
4.5Fin de compteurÀ 0s, QR code marqué comme expiré
5

SCÉNARIOS ALTERNATIFS

5.1 Scénario A : Solde Insuffisant

Pré-condition

L'utilisateur a moins de 10 points disponibles

ÉtapeActionRésultat
A.1Ouverture écranLe solde affiché est < 10 points
A.2Interface adaptéeLe bouton "Générer QR Code" est désactivé (grisé)
A.3Message informatif"Solde insuffisant. Minimum requis : 10 points (1,05€)"
A.4SuggestionLien vers la liste des partenaires pour gagner plus de points

5.2 Scénario B : Régénération Immédiate

Pré-condition

L'utilisateur souhaite générer un nouveau QR code alors qu'un est actif

ÉtapeActionRésultat
B.1Demande régénérationL'utilisateur clique sur "Nouveau QR Code"
B.2Confirmation requisePopup : "Un QR code est actif. Le remplacer annulera l'actuel."
B.3aConfirmationAncien QR invalidé, points débloqués, nouveau QR généré
B.3bAnnulationRetour à l'écran avec le QR code actif

5.3 Scénario C : Perte de Connexion

Pré-condition

La connexion internet est perdue après la génération du QR code

ÉtapeActionRésultat
C.1QR généréLe QR code est affiché localement
C.2Perte connexionLe compteur continue de fonctionner (données locales)
C.3Scan possibleLe commerçant peut scanner (le QR contient toutes les infos signées)
C.4ReconnexionSynchronisation automatique de l'état à la reconnexion
C.5ExpirationSi expiré hors-ligne, le déblocage se fait à la reconnexion

5.4 Scénario D : Application en Arrière-plan

ÉtapeActionRésultat
D.1Mise en arrière-planLe compteur continue en background
D.2Notification localeNotification : "Votre QR code expire dans 30 secondes"
D.3Retour appRéouverture affiche le temps restant réel
D.4Expiration backgroundSi expiré, message affiché au retour + points restaurés
6

GESTION DES ERREURS ET EXCEPTIONS

6.1 Erreurs Côté Client

Erreurs Client

CodeErreurMessage UtilisateurAction Technique
E001Montant invalide"Le montant doit être entre 10 et votre solde"Validation front bloquante
E002Timeout requête"Connexion lente. Veuillez réessayer."Retry automatique (max 3 fois)
E003QR non généré"Impossible de générer le QR code. Réessayez."Log erreur + écran fallback

6.2 Erreurs Côté Serveur

Erreurs Serveur

Code HTTPCode InterneDescriptionTraitement
400QR_INVALID_AMOUNTMontant < 10 ou > soldeRetour message validation
401AUTH_EXPIREDToken JWT expiréRedirection login
409QR_ALREADY_ACTIVEUn QR code est déjà actifProposition d'annuler l'actif
422POINTS_LOCK_FAILEDÉchec blocage pointsRetry interne + alerte
429RATE_LIMITEDTrop de demandesMessage "Attendez quelques secondes"
500INTERNAL_ERRORErreur serveurLog Sentry + message générique
503SERVICE_UNAVAILABLEService indisponibleMode dégradé + retry

6.3 Exceptions Métier

Exceptions

ExceptionContexteComportement
Points expirés pendant générationDes points sélectionnés expirent pendant le processusRecalcul automatique du montant disponible
Compte suspenduUtilisateur marqué comme suspectBlocage avec message "Contactez le support"
QR code compromisDétection de pattern frauduleuxInvalidation immédiate + alerte admin
7

RÈGLES MÉTIER ASSOCIÉES

7.1 Ratio de Conversion

🛍️ RÈGLE FONDAMENTALE

10 points = 1,05€ chez les commerçants
Formule : Valeur en € = Nombre de points × 0,105

Exemples de Conversion

PointsValeur CommerçantCalcul
101,05€10 × 0,105
505,25€50 × 0,105
10010,50€100 × 0,105
20021,00€200 × 0,105
50052,50€500 × 0,105
1000105,00€1000 × 0,105

7.2 Validité du QR Code

⏱️ VALIDITÉ STRICTE : 60 SECONDES

Début : Timestamp de génération côté serveur
Fin : Timestamp + 60 secondes exactement
Tolérance : Aucune (expiration stricte)
Marge technique : QR stocké 70s en cache (10s buffer pour latence)

7.3 Usage Unique

🔒 RÈGLE : UN QR CODE = UN USAGE UNIQUE

• Premier scan valide = QR code consommé définitivement
• Toute tentative de réutilisation = rejet immédiat
• Aucune possibilité de "réactiver" un QR code scanné

7.4 Blocage des Points (FIFO)

📊 Les points les plus anciens sont bloqués en priorité

Système FIFO (First In, First Out) pour la gestion des points

Exemple de Blocage FIFO

LotPointsExpirationBlocage 200 pts
Lot 1 (ancien)15010/01/2026150 bloqués
Lot 230015/02/202650 bloqués
Lot 3 (récent)40020/03/20260 bloqué
TOTAL850-200 bloqués
8

CONSIDÉRATIONS DE SÉCURITÉ

8.1 Signature HMAC-SHA256

Le QR code contient une signature cryptographique garantissant son authenticité :

JSON - Structure du QR Code
{
  "data": {
    "qrId": "qr_abc123def456",
    "userId": "usr_789xyz",
    "points": 200,
    "valueEur": 21.00,
    "createdAt": 1732456800,
    "expiresAt": 1732456860
  },
  "signature": "a3b8c9d4e5f6..."
}
Algorithme de signature
signature = HMAC-SHA256(JSON.stringify(data), SERVER_SECRET_KEY)

8.2 Protections Anti-Fraude

Mesures de Sécurité

MesureDescriptionImplémentation
Rate LimitingMax 5 QR codes par heure par utilisateurRedis + middleware API Gateway
Détection anomaliesAlertes sur patterns suspectsMonitoring ML (montants, fréquence)
BlacklistBlocage de codes compromisTable PostgreSQL + check temps réel
Audit trailLogs de toutes les opérationsCloudWatch + Elasticsearch
IP TrackingSuivi des IP de générationCorrélation géographique

8.3 Protection du Secret

  • Clé HMAC stockée dans Variables d'environnement CapRover
  • Rotation automatique tous les 90 jours
  • Accès restreint aux services autorisés uniquement
  • Logs d'accès audités
9

SPÉCIFICATIONS TECHNIQUES

9.1 Endpoint API

POST /api/v1/qrcode/generate

Génère un QR code pour convertir des points en valeur dépensable.

Headers requis
Authorization: Bearer {jwt_token}
Content-Type: application/json
X-Device-Id: {device_uuid}
X-App-Version: {version}
Request Body
JSON
{
  "points": 200,
  "merchantId": "optional_merchant_uuid"
}
Response201 Created
JSON
{
  "success": true,
  "data": {
    "qrId": "qr_abc123def456",
    "qrCode": "data:image/png;base64,iVBORw0...",
    "points": 200,
    "valueEur": 21.00,
    "createdAt": "2025-11-24T10:00:00Z",
    "expiresAt": "2025-11-24T10:01:00Z",
    "ttlSeconds": 60
  }
}

9.2 Structure de Données Redis

Redis Structure
Clé : qr:{qrId}
TTL : 70 secondes
Valeur :
{
  "qrId": "qr_abc123",
  "userId": "usr_456",
  "points": 200,
  "valueEur": 21.00,
  "lockId": "lock_xyz123",
  "status": "ACTIVE",
  "createdAt": 1732456800,
  "expiresAt": 1732456860,
  "signature": "..."
}

9.3 Table PostgreSQL

qr_codes

Table de persistance des QR codes générés
ColonneTypeContrainteDescription
id UUID PK Identifiant unique du QR code
user_id UUID FK Référence utilisateur
points INTEGER NOT NULL Nombre de points
value_eur DECIMAL(10,2) NOT NULL Valeur en euros
status ENUM NOT NULL ACTIVE, USED, EXPIRED, CANCELLED
lock_id UUID NULLABLE Référence au blocage de points
scanned_by UUID NULLABLE ID commerçant si scanné
scanned_at TIMESTAMP NULLABLE Horodatage du scan
created_at TIMESTAMP NOT NULL Date de création
expires_at TIMESTAMP NOT NULL Date d'expiration
Index PostgreSQL

idx_qrcode_user_id (user_id)
idx_qrcode_status (status)
idx_qrcode_expires_at (expires_at)

10

RÉCAPITULATIF

10.1 Points Clés du Flux

  • Consultation du solde disponible en temps réel
  • Validation du montant (min 10 points, max solde)
  • Blocage immédiat des points à la génération
  • Signature cryptographique HMAC-SHA256
  • Validité stricte de 60 secondes
  • Compteur visuel avec code couleur progressif
  • Expiration automatique et déblocage des points
  • Usage unique garanti côté serveur

10.2 Métriques de Performance

< 500ms Temps génération QR (P95)
99.9% Disponibilité (mensuel)
< 0.1% Taux d'erreur (journalier)
< 5ms Latence Redis (P99)

10.3 Checklist Implémentation

  • Endpoint POST /api/v1/qrcode/generate implémenté
  • Service de blocage/déblocage des points fonctionnel
  • Signature HMAC-SHA256 avec clé sécurisée
  • Stockage Redis avec TTL configuré
  • Persistance PostgreSQL avec index optimisés
  • Compteur visuel côté mobile avec animations
  • Gestion expiration automatique (client + serveur)
  • Rate limiting configuré (5/heure)
  • Monitoring et alerting activés
  • Tests unitaires et d'intégration validés