feat: Version 3.3.4 - Nouvelle architecture pages, optimisations widgets Flutter et API
- Mise à jour VERSION vers 3.3.4 - Optimisations et révisions architecture API (deploy-api.sh, scripts de migration) - Ajout documentation Stripe Tap to Pay complète - Migration vers polices Inter Variable pour Flutter - Optimisations build Android et nettoyage fichiers temporaires - Amélioration système de déploiement avec gestion backups - Ajout scripts CRON et migrations base de données 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,22 +1,567 @@
|
||||
# PLANNING STRIPE - DÉVELOPPEUR FLUTTER
|
||||
## App Flutter - Intégration Stripe Tap to Pay (iOS uniquement V1)
|
||||
### Période : 25/08/2024 - 05/09/2024
|
||||
## App Flutter - Intégration Stripe Terminal Payments
|
||||
### V1 ✅ Stripe Connect (Réalisée - 01/09/2024)
|
||||
### V2 🔄 Tap to Pay (En cours de développement)
|
||||
|
||||
---
|
||||
|
||||
## 📅 LUNDI 25/08 - Setup et architecture (8h)
|
||||
## 🎯 V2 - TAP TO PAY (NFC intégré uniquement)
|
||||
### Période estimée : 1.5 semaine de développement
|
||||
### Dernière mise à jour : 29/09/2025
|
||||
|
||||
### 🌅 Matin (4h)
|
||||
### 📱 CONFIGURATIONS STRIPE TAP TO PAY CONFIRMÉES
|
||||
- **iOS** : iPhone XS ou plus récent + iOS 16.4 minimum (source : Stripe docs officielles)
|
||||
- **Android** : Appareils certifiés par Stripe (liste mise à jour hebdomadairement via API)
|
||||
- **SDK Terminal** : Version 4.6.0 utilisée (minimum requis 2.23.0 ✅)
|
||||
- **Batterie minimum** : 10% pour les paiements
|
||||
- **NFC** : Obligatoire et activé
|
||||
- **Web** : Non supporté (même sur mobile avec NFC)
|
||||
|
||||
#### ✅ Installation packages (EN COURS D'IMPLÉMENTATION)
|
||||
```yaml
|
||||
# pubspec.yaml - PLANIFIÉ
|
||||
dependencies:
|
||||
stripe_terminal: ^3.2.0 # Pour Tap to Pay (iOS uniquement)
|
||||
stripe_ios: ^10.0.0 # SDK iOS Stripe
|
||||
dio: ^5.4.0 # Déjà présent
|
||||
device_info_plus: ^10.1.0 # Info appareils
|
||||
shared_preferences: ^2.2.2 # Déjà présent
|
||||
---
|
||||
|
||||
## 📋 RÉSUMÉ EXÉCUTIF V2
|
||||
|
||||
### 🎯 Objectif Principal
|
||||
Permettre aux membres des amicales de pompiers d'encaisser des paiements par carte bancaire sans contact directement depuis leur téléphone (iPhone XS+ avec iOS 16.4+ dans un premier temps).
|
||||
|
||||
### 💡 Fonctionnalités Clés
|
||||
- **Tap to Pay** sur iPhone/Android (utilisation du NFC intégré du téléphone uniquement)
|
||||
- **Montants flexibles** : Prédéfinis (10€, 20€, 30€, 50€) ou personnalisés
|
||||
- **Mode offline** : File d'attente avec synchronisation automatique
|
||||
- **Dashboard vendeur** : Suivi des ventes en temps réel
|
||||
- **Reçus numériques** : Envoi par email/SMS
|
||||
- **Multi-rôles** : Intégration avec le système de permissions existant
|
||||
|
||||
### ⚠️ Contraintes Techniques
|
||||
- **iOS uniquement en V2.1** : iPhone XS minimum, iOS 16.4+
|
||||
- **Android en V2.2** : Liste d'appareils certifiés via API
|
||||
- **Connexion internet** : Requise pour initialisation, mode offline disponible ensuite
|
||||
- **Compte Stripe** : L'amicale doit avoir complété l'onboarding V1
|
||||
|
||||
---
|
||||
|
||||
## 🗓️ PLANNING DÉTAILLÉ V2
|
||||
|
||||
### 📦 PHASE 1 : SETUP TECHNIQUE ET ARCHITECTURE
|
||||
**Durée estimée : 1 jour**
|
||||
**Objectif : Préparer l'environnement et l'architecture pour Stripe Tap to Pay**
|
||||
|
||||
#### 📚 1.1 Installation des packages (4h)
|
||||
- [x] Ajouter `mek_stripe_terminal: ^4.6.0` dans pubspec.yaml ✅ FAIT
|
||||
- [x] Ajouter `flutter_stripe: ^12.0.0` pour le SDK Stripe ✅ FAIT
|
||||
- [x] Ajouter `device_info_plus: ^10.1.0` pour détecter le modèle d'iPhone ✅ FAIT
|
||||
- [x] Ajouter `battery_plus: ^6.1.0` pour le niveau de batterie ✅ FAIT
|
||||
- [x] Ajouter `network_info_plus: ^5.0.3` pour l'IP et WiFi ✅ FAIT
|
||||
- [x] Ajouter `nfc_manager: ^3.5.0` pour la détection NFC ✅ FAIT
|
||||
- [x] Connectivity déjà présent : `connectivity_plus: ^6.1.3` ✅ FAIT
|
||||
- [x] Exécuter `flutter pub get` ✅ FAIT
|
||||
- [ ] Exécuter `cd ios && pod install`
|
||||
- [ ] Vérifier la compilation iOS sans erreurs
|
||||
- [ ] Documenter les versions exactes installées
|
||||
|
||||
#### 🔧 1.2a Configuration iOS native (2h)
|
||||
- [ ] Modifier `ios/Runner/Info.plist` avec les permissions NFC
|
||||
- [ ] Ajouter `NSLocationWhenInUseUsageDescription` (requis par Stripe)
|
||||
- [ ] Configurer les entitlements Tap to Pay Apple Developer
|
||||
- [ ] Tester sur simulateur iOS
|
||||
- [ ] Vérifier les permissions sur appareil physique
|
||||
- [ ] Documenter les changements dans Info.plist
|
||||
|
||||
#### 🤖 1.2b Configuration Android native (2h)
|
||||
- [ ] Modifier `android/app/src/main/AndroidManifest.xml` avec permissions NFC
|
||||
- [ ] Ajouter `<uses-permission android:name="android.permission.NFC" />`
|
||||
- [ ] Ajouter `<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />`
|
||||
- [ ] Ajouter `<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />`
|
||||
- [ ] Ajouter `<uses-feature android:name="android.hardware.nfc" android:required="false" />`
|
||||
- [ ] Vérifier/modifier `minSdkVersion 28` dans `android/app/build.gradle`
|
||||
- [ ] Vérifier `targetSdkVersion 33` ou plus récent
|
||||
- [ ] Tester sur appareil Android certifié Stripe
|
||||
- [ ] Documenter les changements
|
||||
|
||||
#### 🏗️ 1.3 Architecture des services (4h)
|
||||
- [ ] Créer `lib/core/services/stripe_tap_to_pay_service.dart`
|
||||
- [ ] Implémenter le singleton StripeTapToPayService
|
||||
- [ ] Créer la méthode `initialize()` avec gestion du token
|
||||
- [ ] Créer la méthode `_fetchConnectionToken()` via API
|
||||
- [ ] Implémenter la connexion au "lecteur" local (le téléphone)
|
||||
- [ ] Créer `lib/core/repositories/payment_repository.dart`
|
||||
- [ ] Implémenter les méthodes CRUD pour les paiements
|
||||
- [ ] Intégrer avec le pattern Repository existant
|
||||
- [ ] Ajouter les injections dans `app.dart`
|
||||
|
||||
---
|
||||
|
||||
### 🔍 PHASE 2 : VÉRIFICATION COMPATIBILITÉ
|
||||
**Durée estimée : 1.5 jours**
|
||||
**Objectif : Détecter et informer sur la compatibilité Tap to Pay**
|
||||
|
||||
#### 📱 2.1 Service de détection d'appareil (4h) ✅ COMPLÉTÉ
|
||||
- [x] Créer `lib/core/services/device_info_service.dart` ✅ FAIT
|
||||
- [x] Lister les modèles iPhone compatibles (XS, XR, 11, 12, 13, 14, 15, 16) ✅ FAIT
|
||||
- [x] Vérifier la version iOS (≥ 16.4 pour Tap to Pay) ✅ FAIT - iOS 16.4 minimum confirmé par Stripe
|
||||
- [x] Créer méthode `collectDeviceInfo()` et `canUseTapToPay()` ✅ FAIT avec batterie minimum 10%
|
||||
- [x] Retourner les infos : model, osVersion, isCompatible, batteryLevel, IP ✅ FAIT
|
||||
- [x] Gérer le cas Android (SDK ≥ 28 pour Tap to Pay) ✅ FAIT
|
||||
- [x] Ajouter logs de debug pour diagnostic ✅ FAIT
|
||||
- [x] Envoi automatique à l'API après login : POST `/users/device-info` ✅ FAIT dans ApiService
|
||||
- [x] Sauvegarde dans Hive box settings ✅ FAIT avec préfixe `device_`
|
||||
- [x] **NOUVEAU** : Vérification certification Stripe via API `/stripe/devices/check-tap-to-pay` ✅ FAIT
|
||||
- [x] **NOUVEAU** : Méthode `checkStripeCertification()` pour Android ✅ FAIT
|
||||
- [x] **NOUVEAU** : Stockage `device_stripe_certified` dans Hive ✅ FAIT
|
||||
- [x] **NOUVEAU** : Messages d'erreur détaillés selon le problème (NFC, certification, batterie) ✅ FAIT
|
||||
|
||||
#### 🎨 2.2 Écran de vérification (4h)
|
||||
- [ ] Créer `lib/presentation/payment/compatibility_check_page.dart`
|
||||
- [ ] Design responsive avec icônes et messages clairs
|
||||
- [ ] Afficher le modèle d'appareil détecté
|
||||
- [ ] Afficher la version iOS
|
||||
- [ ] Message explicatif si non compatible
|
||||
- [ ] Bouton "Continuer" si compatible
|
||||
- [ ] Bouton "Retour" si non compatible
|
||||
- [ ] Intégrer avec la navigation existante
|
||||
|
||||
#### 🔄 2.3 Intégration dans le flux utilisateur (4h)
|
||||
- [ ] Ajouter vérification au démarrage de l'app
|
||||
- [ ] Sauvegarder le résultat dans SharedPreferences
|
||||
- [ ] Afficher/masquer les fonctionnalités selon compatibilité
|
||||
- [ ] Ajouter indicateur dans le dashboard utilisateur
|
||||
- [ ] Gérer le cas de mise à jour iOS pendant utilisation
|
||||
|
||||
---
|
||||
|
||||
### 💳 PHASE 3 : INTERFACE DE PAIEMENT
|
||||
**Durée estimée : 2 jours**
|
||||
**Objectif : Créer les écrans de sélection et confirmation de paiement**
|
||||
|
||||
#### 🎯 3.1 Écran de sélection du montant (6h)
|
||||
- [ ] Créer `lib/presentation/payment/payment_amount_page.dart`
|
||||
- [ ] Design avec chips pour montants prédéfinis (10€, 20€, 30€, 50€)
|
||||
- [ ] Champ de saisie pour montant personnalisé
|
||||
- [ ] Validation min 1€, max 999€
|
||||
- [ ] Afficher info amicale en header
|
||||
- [ ] Calculer et afficher les frais Stripe (si applicable)
|
||||
- [ ] Bouton "Continuer" avec montant sélectionné
|
||||
- [ ] Animation de sélection des chips
|
||||
- [ ] Responsive pour toutes tailles d'écran
|
||||
|
||||
#### 📝 3.2 Écran de détails du paiement (4h)
|
||||
- [ ] Créer `lib/presentation/payment/payment_details_page.dart`
|
||||
- [ ] Formulaire optionnel : nom, email, téléphone du donateur
|
||||
- [ ] Checkbox pour reçu (email ou SMS)
|
||||
- [ ] Résumé : montant, amicale, date
|
||||
- [ ] Bouton "Payer avec carte sans contact"
|
||||
- [ ] Possibilité d'ajouter une note/commentaire
|
||||
- [ ] Sauvegarde locale des infos saisies
|
||||
|
||||
#### 🎨 3.3 Composants UI réutilisables (4h)
|
||||
- [ ] Créer `lib/presentation/widgets/payment/amount_selector_widget.dart`
|
||||
- [ ] Créer `lib/presentation/widgets/payment/payment_summary_card.dart`
|
||||
- [ ] Créer `lib/presentation/widgets/payment/donor_info_form.dart`
|
||||
- [ ] Styles cohérents avec le design existant
|
||||
- [ ] Animations et feedback visuel
|
||||
|
||||
---
|
||||
|
||||
### 📲 PHASE 4 : FLUX TAP TO PAY
|
||||
**Durée estimée : 3 jours**
|
||||
**Objectif : Implémenter le processus de paiement sans contact**
|
||||
|
||||
#### 🎯 4.1 Écran Tap to Pay principal (8h)
|
||||
- [ ] Créer `lib/presentation/payment/tap_to_pay_page.dart`
|
||||
- [ ] Afficher montant en grand format
|
||||
- [ ] Animation NFC (ondes pulsantes)
|
||||
- [ ] Instructions "Approchez la carte du dos de l'iPhone"
|
||||
- [ ] Gestion des états : attente, lecture, traitement, succès, échec
|
||||
- [ ] Bouton annuler pendant l'attente
|
||||
- [ ] Timeout après 60 secondes
|
||||
- [ ] Son/vibration au succès
|
||||
|
||||
#### 🔄 4.2 Intégration Stripe Tap to Pay (6h)
|
||||
- [ ] Initialiser le service Tap to Pay local (pas de découverte de lecteurs)
|
||||
- [ ] Créer PaymentIntent via API backend
|
||||
- [ ] Implémenter `collectPaymentMethod()` avec NFC du téléphone
|
||||
- [ ] Implémenter `confirmPaymentIntent()`
|
||||
- [ ] Gérer les erreurs Stripe spécifiques
|
||||
- [ ] Logs détaillés pour debug
|
||||
- [ ] Gestion des timeouts et retry
|
||||
|
||||
#### ✅ 4.3 Écran de confirmation (4h)
|
||||
- [ ] Créer `lib/presentation/payment/payment_success_page.dart`
|
||||
- [ ] Animation de succès (check vert)
|
||||
- [ ] Afficher montant et référence de transaction
|
||||
- [ ] Options : Envoyer reçu, Nouveau paiement, Retour
|
||||
- [ ] Partage du reçu (share sheet iOS)
|
||||
- [ ] Sauvegarde locale de la transaction
|
||||
|
||||
#### ❌ 4.4 Gestion des erreurs (4h)
|
||||
- [ ] Créer `lib/presentation/payment/payment_error_page.dart`
|
||||
- [ ] Messages d'erreur traduits en français
|
||||
- [ ] Différencier : carte refusée, solde insuffisant, erreur réseau, etc.
|
||||
- [ ] Bouton "Réessayer" avec même montant
|
||||
- [ ] Bouton "Changer de montant"
|
||||
- [ ] Logs pour support technique
|
||||
|
||||
---
|
||||
|
||||
### 📶 PHASE 5 : MODE OFFLINE ET SYNCHRONISATION
|
||||
**Durée estimée : 2 jours**
|
||||
**Objectif : Permettre les paiements sans connexion internet**
|
||||
|
||||
#### 💾 5.1 Service de queue offline (6h)
|
||||
- [ ] Créer `lib/core/services/offline_payment_queue_service.dart`
|
||||
- [ ] Stocker les paiements dans SharedPreferences
|
||||
- [ ] Structure : amount, timestamp, amicale_id, user_id, status
|
||||
- [ ] Méthode `addToQueue()` pour nouveaux paiements
|
||||
- [ ] Méthode `getQueueSize()` pour badge notification
|
||||
- [ ] Méthode `clearQueue()` après sync réussie
|
||||
- [ ] Limite de 100 paiements en queue
|
||||
- [ ] Expiration après 7 jours
|
||||
|
||||
#### 🔄 5.2 Service de synchronisation (6h)
|
||||
- [ ] Créer `lib/core/services/payment_sync_service.dart`
|
||||
- [ ] Détecter le retour de connexion avec ConnectivityPlus
|
||||
- [ ] Envoyer les paiements par batch à l'API
|
||||
- [ ] Gérer les échecs partiels
|
||||
- [ ] Retry avec backoff exponentiel
|
||||
- [ ] Notification de sync réussie
|
||||
- [ ] Logs de synchronisation
|
||||
|
||||
#### 📊 5.3 UI du mode offline (4h)
|
||||
- [ ] Indicateur "Mode hors ligne" dans l'app bar
|
||||
- [ ] Badge avec nombre de paiements en attente
|
||||
- [ ] Écran de détail de la queue
|
||||
- [ ] Bouton "Forcer la synchronisation"
|
||||
- [ ] Messages informatifs sur l'état
|
||||
|
||||
---
|
||||
|
||||
### 📈 PHASE 6 : DASHBOARD ET STATISTIQUES
|
||||
**Durée estimée : 2 jours**
|
||||
**Objectif : Tableau de bord pour suivre les ventes**
|
||||
|
||||
#### 📊 6.1 Dashboard vendeur (8h)
|
||||
- [ ] Créer `lib/presentation/dashboard/vendor_dashboard_page.dart`
|
||||
- [ ] Widget statistiques du jour (nombre, montant total)
|
||||
- [ ] Widget statistiques de la semaine
|
||||
- [ ] Widget statistiques du mois
|
||||
- [ ] Graphique d'évolution (fl_chart)
|
||||
- [ ] Liste des 10 dernières transactions
|
||||
- [ ] Filtres par période
|
||||
- [ ] Export CSV des données
|
||||
|
||||
#### 📱 6.2 Détail d'une transaction (4h)
|
||||
- [ ] Créer `lib/presentation/payment/transaction_detail_page.dart`
|
||||
- [ ] Afficher toutes les infos de la transaction
|
||||
- [ ] Status : succès, en attente, échoué
|
||||
- [ ] Option renvoyer le reçu
|
||||
- [ ] Option annuler (si possible)
|
||||
- [ ] Historique des actions
|
||||
|
||||
#### 🔔 6.3 Notifications et rappels (4h)
|
||||
- [ ] Widget de rappel de synchronisation
|
||||
- [ ] Notification de paiements en attente
|
||||
- [ ] Alerte si compte Stripe a un problème
|
||||
- [ ] Rappel de fin de journée pour sync
|
||||
|
||||
---
|
||||
|
||||
### 🧪 PHASE 7 : TESTS ET VALIDATION
|
||||
**Durée estimée : 2 jours**
|
||||
**Objectif : Assurer la qualité et la fiabilité**
|
||||
|
||||
#### ✅ 7.1 Tests unitaires (6h)
|
||||
- [ ] Tests StripeTerminalService
|
||||
- [ ] Tests DeviceCompatibilityService
|
||||
- [ ] Tests OfflineQueueService
|
||||
- [ ] Tests PaymentRepository
|
||||
- [ ] Tests de validation des montants
|
||||
- [ ] Tests de sérialisation/désérialisation
|
||||
- [ ] Coverage > 80%
|
||||
|
||||
#### 📱 7.2 Tests d'intégration (6h)
|
||||
- [ ] Test flux complet de paiement
|
||||
- [ ] Test mode offline vers online
|
||||
- [ ] Test gestion des erreurs
|
||||
- [ ] Test sur différents iPhones
|
||||
- [ ] Test avec cartes de test Stripe
|
||||
- [ ] Test limites et edge cases
|
||||
|
||||
#### 🎭 7.3 Tests utilisateurs (4h)
|
||||
- [ ] Créer scénarios de test
|
||||
- [ ] Test avec 5 utilisateurs pilotes
|
||||
- [ ] Collecter les retours
|
||||
- [ ] Corriger les bugs identifiés
|
||||
- [ ] Valider l'ergonomie
|
||||
|
||||
---
|
||||
|
||||
### 🚀 PHASE 8 : DÉPLOIEMENT ET DOCUMENTATION
|
||||
**Durée estimée : 1 jour**
|
||||
**Objectif : Mise en production et formation**
|
||||
|
||||
#### 📦 8.1 Build et déploiement (4h)
|
||||
- [ ] Build iOS release
|
||||
- [ ] Upload sur TestFlight
|
||||
- [ ] Tests de non-régression
|
||||
- [ ] Déploiement sur App Store
|
||||
- [ ] Monitoring des premières 24h
|
||||
|
||||
#### 📚 8.2 Documentation (4h)
|
||||
- [ ] Guide utilisateur pompier (PDF)
|
||||
- [ ] Vidéo tutoriel Tap to Pay
|
||||
- [ ] FAQ problèmes courants
|
||||
- [ ] Documentation technique
|
||||
- [ ] Formation équipe support
|
||||
|
||||
---
|
||||
|
||||
## 🔄 FLOW COMPLET DE PAIEMENT TAP TO PAY
|
||||
|
||||
### 📋 Vue d'ensemble du processus
|
||||
|
||||
Le flow de paiement se déroule en plusieurs étapes distinctes entre l'application Flutter, l'API PHP et Stripe :
|
||||
|
||||
```
|
||||
App Flutter → API PHP → Stripe Terminal API → Retour App → NFC Payment → Confirmation
|
||||
```
|
||||
|
||||
### 🎯 Étapes détaillées du flow
|
||||
|
||||
#### 1️⃣ **PRÉPARATION DU PAIEMENT (App Flutter)**
|
||||
- L'utilisateur sélectionne ou crée un passage
|
||||
- Choix du montant et sélection "Carte Bancaire"
|
||||
- Récupération du `passage_id` existant ou 0 pour nouveau
|
||||
|
||||
#### 2️⃣ **CRÉATION DU PAYMENT INTENT (App → API → Stripe)**
|
||||
|
||||
**Requête App → API:**
|
||||
```json
|
||||
POST /api/stripe/payments/create-intent
|
||||
{
|
||||
"amount": 2000, // en centimes
|
||||
"currency": "eur",
|
||||
"payment_method_types": ["card_present"],
|
||||
"passage_id": 123, // ou 0 si nouveau
|
||||
"amicale_id": 45,
|
||||
"member_id": 67,
|
||||
"stripe_account": "acct_xxx",
|
||||
"metadata": {
|
||||
"passage_id": "123",
|
||||
"type": "tap_to_pay"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**L'API fait alors :**
|
||||
1. Validation des données reçues
|
||||
2. Appel Stripe API pour créer le PaymentIntent
|
||||
3. Stockage en base de données locale
|
||||
4. Retour à l'app avec `payment_intent_id` et `client_secret`
|
||||
|
||||
**Réponse API → App:**
|
||||
```json
|
||||
{
|
||||
"payment_intent_id": "pi_xxx",
|
||||
"client_secret": "pi_xxx_secret_xxx",
|
||||
"amount": 2000,
|
||||
"status": "requires_payment_method"
|
||||
}
|
||||
```
|
||||
|
||||
#### 3️⃣ **COLLECTE DE LA CARTE (App avec SDK Stripe Terminal)**
|
||||
|
||||
L'application utilise le SDK natif pour :
|
||||
1. Activer le NFC du téléphone
|
||||
2. Afficher l'écran "Approchez la carte"
|
||||
3. Lire les données de la carte sans contact
|
||||
4. Traiter le paiement localement via le SDK
|
||||
|
||||
#### 4️⃣ **TRAITEMENT DU PAIEMENT (SDK → Stripe)**
|
||||
|
||||
Le SDK Stripe Terminal :
|
||||
- Envoie les données cryptées de la carte à Stripe
|
||||
- Traite l'autorisation bancaire
|
||||
- Retourne le statut du paiement à l'app
|
||||
|
||||
#### 5️⃣ **CONFIRMATION ET SAUVEGARDE (App → API)**
|
||||
|
||||
**Si paiement réussi :**
|
||||
```json
|
||||
POST /api/stripe/payments/confirm
|
||||
{
|
||||
"payment_intent_id": "pi_xxx",
|
||||
"status": "succeeded",
|
||||
"amount": 2000
|
||||
}
|
||||
```
|
||||
|
||||
**Puis sauvegarde du passage :**
|
||||
```json
|
||||
POST /api/passages
|
||||
{
|
||||
"id": 123,
|
||||
"fk_type": 1, // Effectué
|
||||
"montant": "20.00",
|
||||
"fk_type_reglement": 3, // CB
|
||||
"stripe_payment_id": "pi_xxx",
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### 📊 Différences Web vs Tap to Pay
|
||||
|
||||
| Aspect | Paiement Web | Tap to Pay |
|
||||
|--------|-------------|------------|
|
||||
| **payment_method_types** | ["card"] | ["card_present"] |
|
||||
| **SDK utilisé** | Stripe.js | Stripe Terminal SDK |
|
||||
| **Collecte carte** | Formulaire web | NFC téléphone |
|
||||
| **Metadata** | type: "web" | type: "tap_to_pay" |
|
||||
| **Environnement** | Navigateur | App native |
|
||||
| **Prérequis** | Aucun | iPhone XS+ iOS 16.4+ |
|
||||
|
||||
### ⚡ Points clés du flow
|
||||
|
||||
1. **Passage ID** : Toujours inclus (existant ou 0)
|
||||
2. **Double confirmation** : PaymentIntent ET Passage sauvegardé
|
||||
3. **Metadata Stripe** : Permet la traçabilité bidirectionnelle
|
||||
4. **Endpoint unifié** : `/api/stripe/payments/` pour tous types
|
||||
5. **Gestion erreurs** : À chaque étape du processus
|
||||
|
||||
## 🔄 PHASE 9 : ÉVOLUTIONS FUTURES (V2.2+)
|
||||
|
||||
### 📱 Support Android (V2.2)
|
||||
- [ ] Vérification appareils Android certifiés via API
|
||||
- [ ] Intégration SDK Android Tap to Pay
|
||||
- [ ] Tests sur appareils Android certifiés
|
||||
|
||||
### 🌍 Fonctionnalités avancées (V2.3)
|
||||
- [ ] Multi-devises
|
||||
- [ ] Paiements récurrents (abonnements)
|
||||
- [ ] Programme de fidélité
|
||||
- [ ] Intégration comptable
|
||||
- [ ] Rapports fiscaux automatiques
|
||||
|
||||
---
|
||||
|
||||
## 📊 MÉTRIQUES DE SUCCÈS
|
||||
|
||||
### KPIs Techniques
|
||||
- [ ] Taux de succès des paiements > 95%
|
||||
- [ ] Temps moyen de transaction < 15 secondes
|
||||
- [ ] Synchronisation offline réussie > 99%
|
||||
- [ ] Crash rate < 0.1%
|
||||
|
||||
### KPIs Business
|
||||
- [ ] Adoption par > 50% des membres en 3 mois
|
||||
- [ ] Augmentation des dons de 30%
|
||||
- [ ] Satisfaction utilisateur > 4.5/5
|
||||
- [ ] Réduction des paiements espèces de 60%
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ RISQUES ET MITIGATION
|
||||
|
||||
### Risques Techniques
|
||||
| Risque | Impact | Probabilité | Mitigation |
|
||||
|--------|--------|-------------|------------|
|
||||
| Incompatibilité iOS | Élevé | Moyen | Détection précoce, messages clairs |
|
||||
| Problèmes réseau | Moyen | Élevé | Mode offline robuste |
|
||||
| Erreurs Stripe | Élevé | Faible | Retry logic, logs détaillés |
|
||||
| Performance | Moyen | Moyen | Optimisation, cache |
|
||||
|
||||
### Risques Business
|
||||
| Risque | Impact | Probabilité | Mitigation |
|
||||
|--------|--------|-------------|------------|
|
||||
| Résistance au changement | Élevé | Moyen | Formation, support, incentives |
|
||||
| Conformité RGPD | Élevé | Faible | Audit, documentation |
|
||||
| Coûts Stripe | Moyen | Certain | Communication transparente |
|
||||
|
||||
---
|
||||
|
||||
## 📅 HISTORIQUE V1 - STRIPE CONNECT (COMPLÉTÉE)
|
||||
|
||||
### ✅ Fonctionnalités V1 Réalisées (01/09/2024)
|
||||
|
||||
#### Configuration Stripe Connect
|
||||
- ✅ Widget `amicale_form.dart` avec intégration Stripe
|
||||
- ✅ Service `stripe_connect_service.dart` complet
|
||||
- ✅ Création de comptes Stripe Express
|
||||
- ✅ Génération de liens d'onboarding
|
||||
- ✅ Vérification du statut en temps réel
|
||||
- ✅ Messages utilisateur en français
|
||||
- ✅ Interface responsive mobile/desktop
|
||||
|
||||
#### API Endpoints Intégrés
|
||||
- ✅ `/amicales/{id}/stripe/create-account` - Création compte
|
||||
- ✅ `/amicales/{id}/stripe/account-status` - Vérification statut
|
||||
- ✅ `/amicales/{id}/stripe/onboarding-link` - Lien configuration
|
||||
- ✅ `/amicales/{id}/stripe/create-location` - Location Terminal
|
||||
|
||||
#### Statuts et Messages
|
||||
- ✅ "💳 Activez les paiements par carte bancaire"
|
||||
- ✅ "⏳ Configuration Stripe en cours"
|
||||
- ✅ "✅ Compte Stripe configuré - 100% des paiements"
|
||||
|
||||
---
|
||||
|
||||
## 📝 NOTES DE DÉVELOPPEMENT
|
||||
|
||||
### Points d'attention pour la V2
|
||||
1. **Dépendance V1** : L'amicale doit avoir complété l'onboarding Stripe (V1) avant de pouvoir utiliser Tap to Pay (V2)
|
||||
2. **Architecture existante** : Utiliser le pattern Repository et les services singleton déjà en place
|
||||
3. **Gestion d'erreurs** : Utiliser `ApiException` pour tous les messages d'erreur
|
||||
4. **Réactivité** : Utiliser `ValueListenableBuilder` avec les Box Hive
|
||||
5. **Multi-environnement** : L'ApiService détecte automatiquement DEV/REC/PROD
|
||||
|
||||
### Conventions de code
|
||||
- Noms de fichiers en snake_case
|
||||
- Classes en PascalCase
|
||||
- Variables et méthodes en camelCase
|
||||
- Pas de Provider/Bloc, utiliser l'injection directe
|
||||
- Tests unitaires obligatoires pour chaque service
|
||||
|
||||
### 🎯 Scope Stripe - Exclusivement logiciel
|
||||
- **TAP TO PAY UNIQUEMENT** : Utilisation du NFC intégré du téléphone
|
||||
- **PAS de terminaux physiques** : Pas de Bluetooth, USB ou Lightning
|
||||
- **PAS de lecteurs externes** : Pas de WisePad, Reader M2, etc.
|
||||
- **Futur** : Paiements Web via Stripe.js
|
||||
|
||||
### Ressources utiles
|
||||
- [Documentation Stripe Terminal Flutter](https://stripe.com/docs/terminal/payments/setup-flutter)
|
||||
- [Apple Tap to Pay Requirements](https://developer.apple.com/tap-to-pay/)
|
||||
- [Flutter Hive Documentation](https://docs.hivedb.dev/)
|
||||
|
||||
---
|
||||
|
||||
## 🔄 DERNIÈRES MISES À JOUR
|
||||
|
||||
- **29/09/2025** : Clarification du scope et mise à jour complète
|
||||
- ✅ Scope : TAP TO PAY UNIQUEMENT (pas de terminaux physiques)
|
||||
- ✅ Suppression références Bluetooth et lecteurs externes
|
||||
- ✅ Réduction estimation : 1.5 semaine au lieu de 2-3 semaines
|
||||
- ✅ DeviceInfoService avec vérification API pour Android
|
||||
- ✅ Intégration endpoints `/stripe/devices/check-tap-to-pay`
|
||||
- ✅ Gestion batterie minimum 10%
|
||||
- ✅ Messages d'erreur détaillés selon le problème
|
||||
- ✅ Correction bug Tap to Pay sur web mobile
|
||||
- ✅ SDK Stripe Terminal 4.6.0 (compatible avec requirements)
|
||||
- **28/09/2025** : Création du planning détaillé V2 avec 9 phases et 200+ TODO
|
||||
- **01/09/2024** : V1 Stripe Connect complétée et opérationnelle
|
||||
- **25/08/2024** : Début du développement V1
|
||||
|
||||
---
|
||||
|
||||
## 📞 CONTACTS PROJET
|
||||
|
||||
- **Product Owner** : À définir
|
||||
- **Tech Lead Flutter** : À définir
|
||||
- **Support Stripe** : support@stripe.com
|
||||
- **Équipe Backend PHP** : À coordonner pour les endpoints API
|
||||
|
||||
---
|
||||
|
||||
*Document de planification V2 - Terminal Payments*
|
||||
*Dernière révision : 28/09/2025*
|
||||
connectivity_plus: ^5.0.2 # Connectivité réseau
|
||||
```
|
||||
|
||||
@@ -32,18 +577,33 @@ pod install
|
||||
#### ✅ Configuration iOS
|
||||
```xml
|
||||
<!-- ios/Runner/Info.plist -->
|
||||
<key>NSBluetoothAlwaysUsageDescription</key>
|
||||
<string>L'app utilise Bluetooth pour Tap to Pay</string>
|
||||
<key>NSBluetoothPeripheralUsageDescription</key>
|
||||
<string>L'app utilise Bluetooth pour accepter les paiements</string>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>Localisation nécessaire pour les paiements</string>
|
||||
<key>UIBackgroundModes</key>
|
||||
<array>
|
||||
<string>bluetooth-central</string>
|
||||
<string>bluetooth-peripheral</string>
|
||||
<string>external-accessory</string>
|
||||
</array>
|
||||
<string>Localisation nécessaire pour les paiements Stripe</string>
|
||||
<!-- Pas de permissions Bluetooth requises pour Tap to Pay -->
|
||||
<!-- Le NFC est géré nativement par le SDK Stripe -->
|
||||
```
|
||||
|
||||
#### ✅ Configuration Android
|
||||
```xml
|
||||
<!-- android/app/src/main/AndroidManifest.xml -->
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
|
||||
<!-- Déclaration de la fonctionnalité NFC (optionnelle pour ne pas exclure les appareils sans NFC) -->
|
||||
<uses-feature android:name="android.hardware.nfc" android:required="false" />
|
||||
```
|
||||
|
||||
```gradle
|
||||
// android/app/build.gradle
|
||||
android {
|
||||
defaultConfig {
|
||||
minSdkVersion 28 // Minimum requis pour Tap to Pay Android
|
||||
targetSdkVersion 33 // Ou plus récent
|
||||
compileSdkVersion 33
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 🌆 Après-midi (4h)
|
||||
@@ -97,10 +657,10 @@ class StripeTerminalService {
|
||||
modelIdentifier.startsWith(model)
|
||||
);
|
||||
|
||||
// iOS 15.4 minimum
|
||||
// iOS 16.4 minimum
|
||||
final osVersion = iosInfo.systemVersion.split('.').map(int.parse).toList();
|
||||
final isOSSupported = osVersion[0] > 15 ||
|
||||
(osVersion[0] == 15 && osVersion.length > 1 && osVersion[1] >= 4);
|
||||
final isOSSupported = osVersion[0] > 16 ||
|
||||
(osVersion[0] == 16 && osVersion.length > 1 && osVersion[1] >= 4);
|
||||
|
||||
return isSupported && isOSSupported;
|
||||
}
|
||||
@@ -190,7 +750,7 @@ class _CompatibilityCheckScreenState extends State<CompatibilityCheckScreen> {
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
Text(
|
||||
'Tap to Pay nécessite un iPhone XS ou plus récent avec iOS 15.4+',
|
||||
'Tap to Pay nécessite un iPhone XS ou plus récent avec iOS 16.4+',
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(fontSize: 16),
|
||||
),
|
||||
@@ -467,17 +1027,9 @@ class _TapToPayScreenState extends State<TapToPayScreen> {
|
||||
|
||||
setState(() => _status = 'Connexion au lecteur...');
|
||||
|
||||
// 2. Découvrir et connecter le lecteur Tap to Pay
|
||||
await _terminalService.discoverReaders(
|
||||
config: LocalMobileDiscoveryConfiguration(),
|
||||
);
|
||||
|
||||
final readers = await _terminalService.getDiscoveredReaders();
|
||||
if (readers.isEmpty) {
|
||||
throw Exception('Aucun lecteur Tap to Pay disponible');
|
||||
}
|
||||
|
||||
await _terminalService.connectToReader(readers.first);
|
||||
// 2. Initialiser le lecteur Tap to Pay local (le téléphone)
|
||||
await _terminalService.initializeLocalReader();
|
||||
// Pas de découverte de lecteurs externes - le téléphone EST le lecteur
|
||||
|
||||
setState(() => _status = 'Prêt pour le paiement');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user