> ## Documentation Index
> Fetch the complete documentation index at: https://docs.colismove.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Scénarios métier ColisMove

> 24 scénarios de référence couvrant le cycle de vie complet d'une réservation, du happy path aux cas limites (litiges, KYC, multi-colis, photos, GPS). Source unique de vérité pour les tests E2E.

Cette section liste les **24 scénarios métier de référence** validés en planning. Ils servent de checklist d'intégration backend ↔ frontend ↔ Stripe ↔ KYC et sont la source unique de vérité pour les tests E2E.

Chaque scénario lié à un commit ou une epic est implémenté et couvert par tests d'intégration.

## Machine à états d'une réservation

Le cycle de vie complet d'une réservation suit cette machine à états (10 états, 12 transitions) :

```mermaid theme={null}
stateDiagram-v2
    [*] --> EN_ATTENTE_PAIEMENT : Sender crée booking
    EN_ATTENTE_PAIEMENT --> RESERVATION_PAYEE : Stripe checkout success
    EN_ATTENTE_PAIEMENT --> ERREUR_PAIEMENT : Stripe checkout failure
    RESERVATION_PAYEE --> EN_ATTENTE : Auto post-payment
    EN_ATTENTE --> ACCEPTEE : Carrier accepte
    EN_ATTENTE --> REFUSEE : Carrier refuse
    EN_ATTENTE --> ANNULEE : Sender annule
    ACCEPTEE --> EN_COURS_DE_LIVRAISON : QR dépôt scanné
    ACCEPTEE --> ANNULEE : Annulation pré-dépôt
    EN_COURS_DE_LIVRAISON --> LIVREE : QR livraison scanné
    EN_COURS_DE_LIVRAISON --> LITIGE : Litige ouvert (transit)
    LIVREE --> LITIGE : Litige post-livraison

    REFUSEE --> [*]
    ANNULEE --> [*]
    ERREUR_PAIEMENT --> [*]
    LITIGE --> [*]
```

### Effets de bord clés

| Transition                | Effets                                                |
| ------------------------- | ----------------------------------------------------- |
| `→ ACCEPTEE`              | QR code dépôt généré + push au sender                 |
| `→ EN_COURS_DE_LIVRAISON` | Compteur photos validé (gates `confirmerDepot`)       |
| `→ LIVREE`                | Stripe transfer carrier, wallet crédité, push + email |
| `→ ANNULEE` (pré-dépôt)   | Stripe refund full, push sender                       |
| `→ LITIGE`                | Hold Stripe, notification superadmin                  |

## Happy Path Sc 1 — Yaoundé→Paris

Diagramme de séquence du parcours nominal (réservation, paiement, dépôt, transit, livraison, paiement carrier) :

```mermaid theme={null}
sequenceDiagram
    actor Sender
    actor Carrier
    participant FE as Frontend Web/Mobile
    participant API as Backend Spring Boot
    participant Stripe
    participant FCM as FCM/WhatsApp
    actor Recipient

    Carrier->>FE: Annonce un trajet (Yaoundé→Paris)
    FE->>API: POST /v1/api/announcements
    Sender->>FE: Booking 5kg sur cette annonce
    FE->>API: POST /v1/api/bookings (EN_ATTENTE_PAIEMENT)
    FE->>Stripe: Checkout Session (escrow)
    Stripe-->>API: webhook checkout.session.completed
    API->>API: → RESERVATION_PAYEE → EN_ATTENTE
    API->>FCM: Push carrier "Nouvelle réservation"
    Carrier->>FE: Accepte
    FE->>API: POST /v1/api/bookings/{id}/accept
    API->>API: → ACCEPTEE + génère QR dépôt
    API->>FCM: Push sender "QR dépôt prêt"
    Sender->>Carrier: Remise du colis
    Carrier->>FE: Scan QR dépôt
    FE->>API: POST /v1/api/qrcode/process-depot
    API->>API: → EN_COURS_DE_LIVRAISON
    Carrier->>Recipient: Livraison à Paris
    Recipient->>FE: Scan QR livraison (recipient page)
    FE->>API: POST /v1/api/qrcode/process-livraison
    API->>API: → LIVREE
    API->>Stripe: Transfer 85% au carrier (Connect)
    API->>FCM: Push + email confirmation
```

## Vue d'ensemble des 24 scénarios

| #  | Scénario                                           | État           | Référence                                                                           |
| -- | -------------------------------------------------- | -------------- | ----------------------------------------------------------------------------------- |
| 1  | Happy Path Yaoundé→Paris (carte CM)                | OK             | Tests E2E `BookingFullJourneyIT`                                                    |
| 2  | Happy Path inverse Paris→Yaoundé                   | OK             | idem Sc 1 (sens inverse)                                                            |
| 3  | Annulation pré-dépôt par expéditeur                | Closed         | commit `087b4f2`                                                                    |
| 4  | Refus transporteur                                 | Closed         | commit `3572e91`                                                                    |
| 5  | Annulation post-dépôt → forcée vers litige         | Closed         | commit `087b4f2`                                                                    |
| 6  | Litige colis perdu (REFUND\_FULL)                  | OK             | module `colismove-litiges`                                                          |
| 7  | Litige contenu contesté (REFUND\_PARTIAL/REJECTED) | OK             | module `colismove-litiges`                                                          |
| 8  | Pays non supporté côté transporteur                | Closed         | commit `a783274`                                                                    |
| 9  | Carte refusée 3DS DSP2                             | Closed         | commit `d6ccab9`                                                                    |
| 10 | Cumul LCB-FT silencieux → Stripe Identity          | Pivot Flynanga | drop Didit, compteur déclenché                                                      |
| 11 | Webhook perdu / reconciliation cron                | Closed         | commit `d0de512`                                                                    |
| 12 | Réservation multi-colis (8 kg partagé)             | Closed         | commit `2023944`                                                                    |
| 13 | Agence B2B publie annonce groupée                  | OK             | module `colismove-agency` (74 fichiers)                                             |
| 14 | Anti-contournement chat (regex filtre)             | OK             | service Firebase Firestore                                                          |
| 15 | Prix par catégorie                                 | Closed         | Epic 4 (stories 4.1 → 4.11)                                                         |
| 16 | Reverse\_transfer LIVREE → litige tardif           | OK             | module `colismove-litiges`                                                          |
| 17 | Destinataire absent à la livraison                 | Closed         | commit `f1c9bf7`                                                                    |
| 18 | Annonce expirée sans réservation                   | OK             | `AnnonceExpirationScheduler` (02:30) + `ExpiredAnnouncementHandler` (03:00)         |
| 19 | Wallet transporteur (Stripe Express direct)        | Closed         | commit `4e873f4`                                                                    |
| 20 | Compte transporteur Stripe fermé                   | Closed         | commit `2216fd0`                                                                    |
| 21 | Photo AVANT\_DEPOT manquante                       | OK             | module `colismove-packsentry` (gates)                                               |
| 22 | Photo DEPOT manquante au scan QR                   | OK             | gates QR `confirmerDepot`                                                           |
| 23 | GPS désactivé / refusé                             | Closed         | commit `3697fe8` (`GpsStatus`)                                                      |
| 24 | Échec upload S3 / watermark                        | OK partiel     | `S3PhotoStorageAdapter` MAX\_ATTEMPTS=3, dead-letter ; Micrometer counter optionnel |

## Légende des états

* **OK** — implémenté et couvert par tests d'intégration en continu
* **Closed** — implémenté via un commit dédié référencé
* **Pivot** — décision archi explicite (voir ADR)

## Navigation par thème

Pour le détail technique avec diagrammes, navigation par catégorie :

<CardGroup cols={2}>
  <Card title="Happy paths" icon="check" href="/guides/scenarios/happy-paths">
    Sc 1, 2 — Parcours nominaux Yaoundé↔Paris
  </Card>

  <Card title="Annulations & refus" icon="ban" href="/guides/scenarios/cancellations">
    Sc 3, 4, 5, 17 — Annulations, refus, destinataire absent
  </Card>

  <Card title="Litiges" icon="gavel" href="/guides/scenarios/disputes">
    Sc 6, 7, 16 — Colis perdu, contenu contesté, litige tardif
  </Card>

  <Card title="Paiements & KYC" icon="credit-card" href="/guides/scenarios/payments-kyc">
    Sc 8, 9, 10, 11, 19, 20 — Stripe, 3DS, KYC, wallet
  </Card>

  <Card title="Multi-colis & pricing" icon="boxes-stacked" href="/guides/scenarios/multi-parcel-pricing">
    Sc 12, 13, 14, 15 — Multi-colis, agence, chat, prix catégorie
  </Card>

  <Card title="Preuves photos & GPS" icon="camera" href="/guides/scenarios/proofs-photos-gps">
    Sc 18, 21, 22, 23, 24 — Annonces, photos, GPS, S3
  </Card>
</CardGroup>

## Source canonique

Le document complet est maintenu dans le repo backend :

```
_bmad-output/planning-artifacts/scenarios-2026-05-01.md
```

Toute évolution d'un scénario doit être reflétée dans :

1. Ce document (source canonique BMAD)
2. Cette page docs (référence publique)
3. L'outil MCP `get_business_scenarios` (contexte agents IA)
