# ✅ Migration Stripe "Option A" - Résumé

## 📅 Date : 3 novembre 2025

---

## 🎯 Objectif

Optimiser la création de compte Stripe Connect en **1 seule requête** côté Flutter qui crée :
1. Le compte Stripe Connect
2. La Location Terminal (pour Tap to Pay)
3. Le lien d'onboarding

---

## ✅ Modifications Flutter APPLIQUÉES

### **1. Modèle `AmicaleModel`**
- ✅ Ajout du champ `stripeLocationId` (HiveField 27)
- ✅ Ajout dans le constructeur
- ✅ Ajout dans `fromJson()`
- ✅ Ajout dans `toJson()`
- ✅ Ajout dans `copyWith()`
- ✅ Adaptateurs Hive régénérés

### **2. Service `StripeTapToPayService`**
- ✅ Récupération du `location_id` depuis `amicale.stripeLocationId`
- ✅ Validation que le `location_id` existe avant initialisation
- ✅ Suppression de la méthode `_fetchConfiguration()` (inutile)
- ✅ Plus besoin de l'endpoint `GET /api/stripe/configuration`

### **3. Service `StripeConnectService`**
- ✅ Simplification de `createStripeAccount()` : 1 seule requête
- ✅ Ajout des URLs `return_url` et `refresh_url` dans la requête
- ✅ Récupération de `location_id` et `onboarding_url` dans la réponse
- ✅ Suppression de l'appel à `/stripe/locations`
- ✅ Ajout de `locationId` dans `StripeAccountStatus`
- ✅ Conservation de `getOnboardingLink()` (marqué déprécié)

---

## ⚠️ Modifications Backend REQUISES

### **1. Base de données**
```sql
ALTER TABLE amicales
ADD COLUMN stripe_location_id VARCHAR(255) NULL
AFTER stripe_id;
```

### **2. Endpoint `POST /stripe/accounts`**
**Modifications nécessaires** :
- Accepter `return_url` et `refresh_url` dans la requête
- Créer le compte Stripe Connect
- Créer la Location Terminal
- Créer le lien d'onboarding
- Sauvegarder `stripe_id`, `stripe_location_id`, `chk_stripe` en BDD
- Retourner : `account_id`, `location_id`, `onboarding_url`, `charges_enabled`, `payouts_enabled`, `existing`

**Voir le code complet** : `docs/STRIPE-BACKEND-MIGRATION.md`

### **3. Endpoint `GET /stripe/accounts/{id}/status`**
**Modification** :
- Ajouter `location_id` dans la réponse JSON

### **4. Endpoint `POST /stripe/locations`**
**Action** : À supprimer (devenu inutile) ou garder pour compatibilité temporaire

---

## 📊 Comparaison Avant/Après

| Aspect | Avant | Après |
|--------|-------|-------|
| **Appels API Flutter → Backend** | 3 | 1 |
| **Latence totale** | ~3-5s | ~1-2s |
| **Gestion erreurs** | Complexe (try/catch multiples) | Simplifié (transaction atomique) |
| **Atomicité BDD** | ❌ Non garantie | ✅ Oui (transaction) |
| **Location ID sauvegardé** | ❌ Non | ✅ Oui |
| **Code à maintenir** | Plus complexe | Plus simple |

---

## 🔄 Flow optimisé

```
Flutter (1 appel)          Backend (3 appels Stripe)       Stripe API
      │                              │                           │
      │  POST /stripe/accounts       │                           │
      │  {                           │                           │
      │    fk_entite: 123,          │                           │
      │    return_url: "...",       │                           │
      │    refresh_url: "..."       │                           │
      │  }                           │                           │
      ├─────────────────────────────>│                           │
      │                              │  1. Create Account        │
      │                              ├──────────────────────────>│
      │                              │<──────────────────────────┤
      │                              │  account_id: acct_xxx     │
      │                              │                           │
      │                              │  2. Create Location       │
      │                              ├──────────────────────────>│
      │                              │<──────────────────────────┤
      │                              │  location_id: tml_xxx     │
      │                              │                           │
      │                              │  3. Create AccountLink    │
      │                              ├──────────────────────────>│
      │                              │<──────────────────────────┤
      │                              │  onboarding_url           │
      │                              │                           │
      │                              │  (Sauvegarde en BDD)      │
      │                              │                           │
      │<─────────────────────────────┤                           │
      │  {                           │                           │
      │    account_id: acct_xxx,    │                           │
      │    location_id: tml_xxx,    │                           │
      │    onboarding_url: "..."    │                           │
      │  }                           │                           │
```

---

## ✅ Tests à effectuer

### **Backend (après implémentation)**
1. [ ] Migration SQL appliquée
2. [ ] Test avec Postman : nouvelle amicale
3. [ ] Test avec Postman : amicale existante
4. [ ] Vérification BDD : `stripe_location_id` bien sauvegardé
5. [ ] Logs vérifiés (pas d'erreurs)

### **Flutter (maintenant)**
1. [ ] Compilation OK (déjà fait ✅)
2. [ ] Test création compte depuis l'app Web admin
3. [ ] Vérification que le `location_id` est bien dans l'amicale
4. [ ] Test paiement Tap to Pay avec le `location_id`
5. [ ] Vérification que l'erreur "Erreur inattendue" n'apparaît plus

---

## 🚨 Points d'attention

### **Backend**
- Utiliser une **transaction BDD** pour garantir l'atomicité
- Bien logger chaque étape pour le debug
- Gérer le cas des comptes existants (avec/sans `location_id`)
- Tester avec des clés Stripe de test d'abord

### **Flutter**
- Le backend doit être déployé **AVANT** de tester l'app
- Si le backend n'est pas prêt, l'app retournera une erreur 400/500
- Les anciens comptes sans `location_id` devront être migrés

---

## 📚 Documentation

- **Code Backend complet** : `docs/STRIPE-BACKEND-MIGRATION.md`
- **Code Flutter modifié** : `lib/core/services/stripe_connect_service.dart`
- **Modèle modifié** : `lib/core/data/models/amicale_model.dart`
- **Service Tap to Pay** : `lib/core/services/stripe_tap_to_pay_service.dart`

---

## 🎯 Prochaines étapes

### **Étape 1 : Backend**
1. Implémenter les modifications backend
2. Tester avec Postman
3. Valider que tout fonctionne

### **Étape 2 : Migration des données existantes**
Pour les amicales qui ont déjà un `stripe_id` mais pas de `stripe_location_id` :

```sql
-- Identifier les amicales concernées
SELECT id, name, stripe_id, stripe_location_id
FROM amicales
WHERE stripe_id IS NOT NULL
  AND stripe_location_id IS NULL;
```

**Option A** : Les créer manuellement via l'API Stripe
**Option B** : Ajouter un endpoint de migration `POST /stripe/migrate-locations`

### **Étape 3 : Tests complets**
1. Test création nouvelle amicale
2. Test amicale existante avec compte
3. Test Tap to Pay avec paiement CB
4. Validation que l'erreur est corrigée

---

## ✅ État actuel

| Composant | État | Commentaire |
|-----------|------|-------------|
| **AmicaleModel** | ✅ Modifié | Champ `stripeLocationId` ajouté |
| **StripeTapToPayService** | ✅ Modifié | Utilise `amicale.stripeLocationId` |
| **StripeConnectService** | ✅ Modifié | 1 seule requête optimisée |
| **Build Runner** | ✅ Exécuté | Adaptateurs Hive régénérés |
| **Compilation Flutter** | ✅ OK | Aucune erreur |
| **Backend** | ⏳ En attente | À implémenter |
| **Tests** | ⏳ En attente | Après implémentation Backend |

---

## 📞 Support

- Documentation Stripe Connect : https://stripe.com/docs/connect
- Documentation Terminal Locations : https://stripe.com/docs/terminal/fleet/locations
- Documentation AccountLinks : https://stripe.com/docs/connect/account-links
