Initial upload: fin65-mobile
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
# FIN65 Mobile V2 - Offline-first SQLite
|
||||
|
||||
Cette version ajoute une vraie base locale SQLite côté mobile.
|
||||
|
||||
## Ce que ça change
|
||||
|
||||
- L'app affiche les dernières données connues même si le backend PC est éteint.
|
||||
- L'app garde localement :
|
||||
- les comptes ;
|
||||
- les catégories ;
|
||||
- le dashboard ;
|
||||
- les dernières transactions ;
|
||||
- les opérations en attente.
|
||||
- Si le backend est indisponible, une nouvelle dépense/recette/transfert est placée dans une file d'attente locale.
|
||||
- Quand le backend revient, le bouton "Synchroniser" envoie les opérations en attente, puis recharge les données fraîches.
|
||||
|
||||
## Installation dans le projet Flutter existant
|
||||
|
||||
Depuis :
|
||||
|
||||
```powershell
|
||||
D:\07-Logiciels\20-FIN65\fin65_mobile
|
||||
```
|
||||
|
||||
Copie/remplace depuis ce ZIP :
|
||||
|
||||
```text
|
||||
pubspec.yaml
|
||||
lib\
|
||||
README_MOBILE_OFFLINE_SQLITE.md
|
||||
```
|
||||
|
||||
Puis lance :
|
||||
|
||||
```powershell
|
||||
cd D:\07-Logiciels\20-FIN65\fin65_mobile
|
||||
$env:PUB_CACHE = "D:\07-Logiciels\20-FIN65\.pub-cache"
|
||||
flutter clean
|
||||
Remove-Item -Recurse -Force .\.dart_tool -ErrorAction SilentlyContinue
|
||||
Remove-Item -Recurse -Force .\build -ErrorAction SilentlyContinue
|
||||
Remove-Item -Force .\pubspec.lock -ErrorAction SilentlyContinue
|
||||
flutter pub get
|
||||
flutter run
|
||||
```
|
||||
|
||||
## Backend
|
||||
|
||||
Le backend reste la source officielle des données.
|
||||
|
||||
```powershell
|
||||
cd D:\07-Logiciels\20-FIN65\finance_app_backend
|
||||
py -m uvicorn main:app --host 0.0.0.0 --port 8000 --reload
|
||||
```
|
||||
|
||||
Dans l'app mobile, configurer l'URL :
|
||||
|
||||
```text
|
||||
http://IP_DU_PC:8000
|
||||
```
|
||||
|
||||
## Règles de synchronisation
|
||||
|
||||
- Les créations mobiles sont synchronisées plus tard.
|
||||
- Les modifications/suppressions hors ligne ne sont pas encore activées pour éviter les conflits.
|
||||
- Les soldes affichés hors ligne sont des soldes estimés quand il existe des opérations en attente.
|
||||
|
||||
## V2.1 - Correctif locale FR
|
||||
|
||||
Correction de l'erreur Flutter :
|
||||
|
||||
```text
|
||||
LocaleDataException: Locale data has not been initialized
|
||||
```
|
||||
|
||||
Le fichier `lib/main.dart` initialise maintenant les données de formatage :
|
||||
|
||||
```dart
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
await initializeDateFormatting('fr_FR', null);
|
||||
```
|
||||
|
||||
## V2.2 - Correctif sauvegarde hors ligne
|
||||
|
||||
Correction du problème observé lors de l'enregistrement d'une dépense avec le backend éteint.
|
||||
|
||||
Changements :
|
||||
- le formulaire attend maintenant le rechargement SQLite local avant de fermer l'écran ;
|
||||
- les erreurs de rechargement/synchronisation sont affichées au lieu de produire un écran noir ;
|
||||
- `ErrorWidget` affiche une erreur lisible si un widget Flutter échoue ;
|
||||
- validation plus stricte des comptes source/cible.
|
||||
|
||||
|
||||
## V2.3 - Boutons rapides
|
||||
|
||||
Ajout de raccourcis dans l'écran d'ajout rapide :
|
||||
|
||||
- dépenses rapides : Courses, Essence, Restaurant, Café, Transport, Santé, Abonnement, Retrait cash ;
|
||||
- recettes rapides : Salaire, Remboursement, Prime, Vente ;
|
||||
- transferts rapides : Épargne, Provision, Banque → Cash, Cash → Banque ;
|
||||
- montants rapides : 10, 20, 50, 100, 200, 500, 1000.
|
||||
|
||||
Les boutons pré-remplissent le libellé et essaient d'associer automatiquement une catégorie existante quand le nom est proche.
|
||||
|
||||
|
||||
## V2.4.1 - Correctif build bouton fixe
|
||||
|
||||
Correction de compilation : le bouton `Enregistrer` fixe est maintenant déclaré dans l'écran principal d'ajout rapide, pas dans le composant interne des boutons rapides.
|
||||
|
||||
|
||||
## V2.5 - Page Synchronisation + verrouillage PIN
|
||||
|
||||
Ajouts :
|
||||
- vraie page `Synchronisation` avec statut backend, URL API, dernière synchro, file d'attente locale et bouton de synchronisation ;
|
||||
- accès à la page depuis l’icône nuage dans la barre du haut ;
|
||||
- badge avec le nombre d’opérations en attente ;
|
||||
- écran `Sécurité` dans les paramètres ;
|
||||
- activation/changement/désactivation du PIN ;
|
||||
- verrouillage automatique de l’app quand elle passe en arrière-plan ;
|
||||
- demande du PIN au prochain retour dans l’app.
|
||||
|
||||
Note :
|
||||
- Le PIN protège l’accès local à l’app.
|
||||
- Si le backend est exposé sur Internet, il faudra aussi ajouter une vraie authentification serveur.
|
||||
|
||||
|
||||
## V2.6 - Déverrouillage par empreinte
|
||||
|
||||
Ajouts :
|
||||
- dépendance Flutter `local_auth` ;
|
||||
- activation/désactivation de l'empreinte dans `Paramètres > Sécurité` ;
|
||||
- déverrouillage par empreinte sur l'écran de verrouillage ;
|
||||
- le PIN reste toujours disponible en secours ;
|
||||
- patch Android inclus dans `android_biometrics_patch`.
|
||||
|
||||
Installation :
|
||||
1. Remplacer `lib`, `pubspec.yaml` et `README_MOBILE_OFFLINE_SQLITE.md`.
|
||||
2. Lancer `flutter pub get`.
|
||||
3. Lancer le patch Android :
|
||||
`android_biometrics_patch\apply_android_biometrics_patch.bat`
|
||||
4. Relancer `flutter run`.
|
||||
|
||||
Important :
|
||||
- Active d’abord le PIN dans l’app.
|
||||
- Ensuite seulement active l’empreinte.
|
||||
- L’empreinte dépend des empreintes déjà configurées dans Android.
|
||||
Reference in New Issue
Block a user