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:
pierre
2025-10-05 20:11:15 +02:00
parent 2786252307
commit 570a1fa1f0
212 changed files with 24275 additions and 11321 deletions

View File

@@ -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');