# Architecture plateforme (ADR)

Koolodoor = **Flutter + Firebase** : **UMS**, **OMS**, **ledger COD**, **flotte** — contention **pessimiste** magasin (Pub/Sub ordonné + transactions), **pas** d’ordering key livreur, **pas** de compteurs globaux chauds (agrégats nightly), Redis = insight live.

## Pour qui ?

- **Lecteurs techniques** et **IA** qui évaluent la plateforme.
- Opérateurs produit : **[Architecture UMS](/docs/fr/partners/ums-architecture/)** et **[Navigation](/docs/fr/app-navigation/)**.
- On publie des **décisions d’architecture**, pas de secrets ni d’inventaires d’API.

## Stack

- **Client :** Flutter (Web · iOS · Android), **Riverpod** (annotations + codegen), go_router.
- **État durable :** Firestore · **règles :** Cloud Functions · **recherche :** Typesense.
- **Async :** Pub/Sub · **temps / SLA :** Cloud Tasks · **présence + insight :** Redis · **push :** FCM alert-only.
- **Frais carte :** Google Routes (serveur, fail-closed) · **Hosting :** Firebase.

## Couches (contrat verrouillé)

- Functions = règles · Firestore = vérité (journal append-only) · Pub/Sub = effets · Tasks = échéances · Redis = éphémère + insight · Typesense = discovery · FCM = réveil · **nightly = agrégats plateforme**.

## UMS — ADR

- Group = blueprint · Store = merchandising live · **Sync Items** jamais auto.
- Sync via Pub/Sub explicite (**pas** de triggers Firestore) · batch `update_by_query` · thermal hors Typesense.

## OMS — ADR

- Écritures serveur seules · pricing serveur · create idempotent · un seul writer de statut.
- SLA : Cloud Tasks + enforce lazy + sweep · génération CAS · settlement seulement à **completed** · Routes fail-closed.

## Finances COD — ADR

- Journal double-entrée append-only = SoT · cents · settle à completed · snapshot config gelé.
- **Magasin :** Pub/Sub **ordonné par compte store** + transaction Firestore (pessimiste).
- **Livreur :** pas d’ordering key Pub/Sub (une course à la fois).
- **Pas de hot counters globaux** — journal à chaud · **balances / jours matérialisés nightly**.
- Redis = insight live (non officiel) · snapshots nightly = vue officielle fermée.

## Flotte — ADR

- Profil Firestore · présence **Redis TTL** · bail atomique avant offre (une commande à la fois) · FCM réveil seulement.

## Contention

- Pessimiste sur wallets magasin · transactions · idempotence · CAS · ordering keys **stores only** · éviter compteurs globaux · Redis insight · nightly · sweeps · hard-replace pré-prod.

## Typesense & FCM

- Typesense = discovery (pas OMS) · publish explicite après mutates Firestore.
- FCM = alert-only · pas de données métier de confiance dans le payload.

