Initial commit — app fidélité magasin (tablette)
App Flutter de programme de fidélité : login staff, clients (nom/prénom), scan QR, factures (€→points), récompenses, réglages. Backend Supabase (schéma SQL + RLS anti-triche dans supabase/). Icône incluse. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
# Fidélité — App magasin (tablette)
|
||||
|
||||
App Android (Flutter) de **programme de fidélité** pour un magasin, conçue pour
|
||||
une tablette en caisse. Chaque client a une **carte de fidélité = un QR code** :
|
||||
on le scanne, on ajoute ses factures, il cumule des **points**, qu'il peut
|
||||
échanger contre des **récompenses**.
|
||||
|
||||
**Backend : Supabase** (comptes + données partagées avec l'app client
|
||||
[`app_fideliter_client`](../app_fideliter_client)). La tablette se connecte avec
|
||||
un compte **staff** (personnel du magasin).
|
||||
|
||||
App sœur de [`gestion_prix_produit`](../gestion_prix_produit) : même stack et même
|
||||
design (Material 3, noir & blanc + accent vert émeraude pour la distinguer sur la
|
||||
même tablette).
|
||||
|
||||
## Fonctions
|
||||
|
||||
- **Connexion staff** : email + mot de passe (compte staff, voir SETUP).
|
||||
- **Clients** : liste, recherche (nom / téléphone / code), création « au comptoir »
|
||||
(code unique + QR générés côté serveur).
|
||||
- **Scanner** : scan du QR d'un client → ouverture directe de sa fiche.
|
||||
(Caméra de la tablette ; la scanette externe viendra ensuite.)
|
||||
- **Fiche client** : solde de points, **ajout d'une facture** (montant € → points
|
||||
selon le ratio), **utilisation d'une récompense** (débit), historique, correction
|
||||
manuelle.
|
||||
- **Récompenses** : catalogue (ex : « Café offert » = 10 pts), activer/désactiver.
|
||||
- **Réglages** : **ratio** « euros pour 1 point », nom du magasin, déconnexion.
|
||||
|
||||
### Calcul des points
|
||||
|
||||
`points gagnés = montant de la facture ÷ (euros par point)`
|
||||
|
||||
Points **fractionnaires**. Ex : avec 1 pt = 10 €, une facture de 12 € rapporte
|
||||
`1,2 pt`. Le solde est recalculé **côté base** (trigger) à chaque mouvement, donc
|
||||
fiable même si plusieurs appareils écrivent.
|
||||
|
||||
## Configuration (à faire une fois)
|
||||
|
||||
Voir **[`supabase/SETUP.md`](supabase/SETUP.md)** : créer le projet Supabase,
|
||||
exécuter [`supabase/schema.sql`](supabase/schema.sql), coller l'URL + la clé anon
|
||||
dans [`lib/supabase_config.dart`](lib/supabase_config.dart), créer le compte staff.
|
||||
|
||||
## Techno
|
||||
|
||||
- Flutter (Material 3, thème noir & blanc + accent vert)
|
||||
- `supabase_flutter` (auth staff + base de données partagée)
|
||||
- `mobile_scanner` (scan du QR), `qr_flutter` (affichage du QR d'un client)
|
||||
|
||||
## Lancer l'app
|
||||
|
||||
```bash
|
||||
flutter run
|
||||
```
|
||||
|
||||
## Structure
|
||||
|
||||
```text
|
||||
lib/
|
||||
├── main.dart # init (locale fr, Supabase) + thème
|
||||
├── config.dart # constantes par défaut
|
||||
├── supabase_config.dart # URL + clé anon (À REMPLIR)
|
||||
├── theme.dart
|
||||
├── models/ # client, mouvement, recompense
|
||||
├── services/
|
||||
│ ├── reglages.dart # ratio €/point + nom magasin (Supabase)
|
||||
│ ├── client_repository.dart # clients + factures + récompenses (Supabase)
|
||||
│ └── recompense_repository.dart # catalogue (Supabase)
|
||||
├── screens/
|
||||
│ ├── auth_gate.dart # login staff ↔ app selon la session
|
||||
│ ├── staff_login_screen.dart
|
||||
│ ├── home_shell.dart # 4 onglets + navigation
|
||||
│ ├── clients_screen.dart
|
||||
│ ├── client_edit_screen.dart
|
||||
│ ├── client_detail_screen.dart
|
||||
│ ├── scan_screen.dart
|
||||
│ ├── recompenses_screen.dart
|
||||
│ └── reglages_screen.dart
|
||||
├── widgets/ # pastille_points, qr_client
|
||||
└── utils/format.dart
|
||||
supabase/
|
||||
├── schema.sql # tables + triggers + sécurité (RLS)
|
||||
└── SETUP.md # guide de configuration
|
||||
```
|
||||
|
||||
## Prochaines étapes (roadmap)
|
||||
|
||||
1. **Scanette externe** : le lecteur se comporte comme un clavier — un champ caché
|
||||
reçoit le code et appelle `scan_screen.dart` → `_ouvrirParCode` (déjà factorisé).
|
||||
2. **Temps réel** : abonnement Supabase Realtime pour mettre à jour les soldes
|
||||
sans rafraîchir.
|
||||
3. Impression du QR (carte physique), statistiques, bonus de bienvenue / paliers.
|
||||
Reference in New Issue
Block a user