306 lines
11 KiB
Markdown
306 lines
11 KiB
Markdown
# Contexte Cursor — App mobile Bons Points
|
||
|
||
> **Usage :** ouvrir ce dépôt dans un workspace Cursor dédié (`mobile/`), coller la section **« Prompt de démarrage »** dans le premier message, puis référencer ce fichier avec `@docs/CONTEXTE_CURSOR.md`.
|
||
|
||
---
|
||
|
||
## Prompt de démarrage (à copier-coller)
|
||
|
||
```
|
||
Tu travailles sur le projet Bons Points — app Android Flutter commerciale, 100 % locale.
|
||
|
||
Dépôt : https://git.ptits-pas.fr/jmartin/bonpoint
|
||
Clone : git clone ssh://git@git.ptits-pas.fr:2222/jmartin/bonpoint.git
|
||
|
||
Structure :
|
||
- docs/ → cahier des charges et ce fichier
|
||
- web/ → prototype Node.js (référence métier + UI, NE PAS modifier sauf demande)
|
||
- mobile/ → app Flutter à créer et développer ICI
|
||
|
||
Lis en priorité :
|
||
1. docs/CONTEXTE_CURSOR.md
|
||
2. docs/CAHIER_DES_CHARGES_APP_ANDROID.md
|
||
3. web/src/db.js (schéma SQLite, règles par défaut, logique scores)
|
||
|
||
Vision :
|
||
- App Play Store freemium (1 enfant gratuit + AdMob, Premium IAP ~3–5 €)
|
||
- Données famille UNIQUEMENT sur le téléphone (SQLite), pas de backend SaaS
|
||
- Pas de login compte ; PIN parent local
|
||
- Français uniquement en v1
|
||
|
||
Hors périmètre (ne pas implémenter) :
|
||
- OK Google / Nest / Dialogflow / voix
|
||
- Sync cloud temps réel
|
||
- iOS
|
||
- Confusion avec P'titsPas (app.ptits-pas.fr = autre produit pro)
|
||
|
||
Stack imposée : Flutter + drift ou sqflite + Riverpod ou Bloc.
|
||
|
||
Commence par : flutter create dans mobile/ (org fr.ptitspas.bonpoint), reprendre le modèle de données de web/src/db.js, écran onboarding sans compte.
|
||
```
|
||
|
||
---
|
||
|
||
## 1. Identité du projet
|
||
|
||
| | |
|
||
|--|--|
|
||
| **Nom produit** | Bons Points / Bonpoint |
|
||
| **Type** | App Android familiale — système de bons points pour enfants |
|
||
| **Objectif business** | App **publique** Play Store, **monétisée** (freemium), pas un outil perso famille seul |
|
||
| **Argument marketing** | « 100 % local, zéro cloud, zéro compte — vos données restent sur votre téléphone » |
|
||
| **Prototype** | `web/` + site `https://bonpoint.ptits-pas.fr` (labo UX + règles métier) |
|
||
| **À développer** | `mobile/` — Flutter from scratch |
|
||
|
||
### Ce n’est PAS
|
||
|
||
- **P’titsPas** (`app.ptits-pas.fr`) — SaaS garde d’enfants / collectivités, login, autre codebase (`/home/deploy/dev/ptitspas-app`).
|
||
- Une app avec serveur backend pour les données enfants.
|
||
- Un projet vocal Nest / Google Home (abandonné, voir `docs/GOOGLE_HOME.md`).
|
||
|
||
---
|
||
|
||
## 2. Dépôt Git
|
||
|
||
| | |
|
||
|--|--|
|
||
| **Web** | https://git.ptits-pas.fr/jmartin/bonpoint |
|
||
| **SSH (PC / clé jmartin)** | `ssh://git@git.ptits-pas.fr:2222/jmartin/bonpoint.git` |
|
||
| **SSH (serveur deploy)** | `gitea-jmartin:jmartin/bonpoint.git` (alias dans `~/.ssh/config`) |
|
||
| **Branche principale** | `main` |
|
||
| **État mobile** | `mobile/` = placeholder (`README.md` seulement), **pas encore de projet Flutter** |
|
||
|
||
```bash
|
||
git clone ssh://git@git.ptits-pas.fr:2222/jmartin/bonpoint.git
|
||
cd bonpoint
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Structure du dépôt
|
||
|
||
```
|
||
bonpoint/
|
||
├── README.md
|
||
├── .gitignore
|
||
├── docs/
|
||
│ ├── CONTEXTE_CURSOR.md ← ce fichier
|
||
│ ├── CAHIER_DES_CHARGES_APP_ANDROID.md ← spec produit v0.2
|
||
│ └── GOOGLE_HOME.md ← archive (Nest abandonné)
|
||
├── web/ ← NE PAS casser ; référence uniquement
|
||
│ ├── src/
|
||
│ │ ├── db.js ← ★ source de vérité métier + seed règles
|
||
│ │ ├── server.js
|
||
│ │ ├── auth.js ← PIN bcrypt
|
||
│ │ └── routes/
|
||
│ ├── public/ ← maquettes HTML/CSS (inspiration UI)
|
||
│ ├── docker-compose.yml
|
||
│ └── package.json
|
||
└── mobile/ ← ★ TRAVAILLER ICI
|
||
└── README.md
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Décisions produit (validées)
|
||
|
||
| Sujet | Décision |
|
||
|-------|----------|
|
||
| Plateforme | Android seulement (pas iOS v1) |
|
||
| Framework | **Flutter** |
|
||
| Données | **SQLite locale** (drift ou sqflite) |
|
||
| Réseau usage quotidien | **Aucun** (mode avion OK) |
|
||
| Authentification | **Pas de compte** ; **PIN parent** hashé local |
|
||
| Monétisation | **Freemium** : 1 enfant + pubs / Premium IAP (multi-enfants, sans pub, édition complète) |
|
||
| Pubs | AdMob **Families-compliant** (child-directed, rating G) |
|
||
| Sauvegarde | Export/import fichier JSON (obligatoire v1) |
|
||
| Voix / Nest / TV | **Abandonné** |
|
||
| Langue | Français |
|
||
|
||
---
|
||
|
||
## 5. Modèle freemium (cible — à affiner)
|
||
|
||
| | Gratuit | Premium (IAP unique ~2,99–4,99 €) |
|
||
|--|---------|-----------------------------------|
|
||
| Enfants | 1 max | Plusieurs (ex. 8 max) |
|
||
| Règles / récompenses | Pack défaut + édition limitée | Édition complète |
|
||
| Publicités | Bandeau AdMob (hors espace parent) | Aucune |
|
||
| Historique | 30 jours (proposition) | Illimité |
|
||
| Export sauvegarde | Oui | Oui |
|
||
|
||
---
|
||
|
||
## 6. Règles métier (à porter à l’identique)
|
||
|
||
Source : `web/src/db.js`
|
||
|
||
1. **Score entier**, affiché tel quel.
|
||
2. **Plancher à 0** : `nouveauScore = max(0, score + delta)` — le delta enregistré dans `mouvements` est le **delta réel** appliqué.
|
||
3. **Mouvement** = toute action (règle appliquée, achat boutique, annulation).
|
||
4. **Annulation** = inverse le delta (respect plancher 0) — voir `annulerMouvement()`.
|
||
5. **Boutique** : achat si `score >= cout_points`, sinon erreur `pas_assez_de_points`.
|
||
|
||
### Familles de règles (seed)
|
||
|
||
| Clé | Libellé |
|
||
|-----|---------|
|
||
| MAISON | 🏠 Maison & rangement |
|
||
| ROUTINE | ⏰ Matin, soir & école |
|
||
| FRATRIE | 👫 Fratrie & entraide |
|
||
| RESPECT | 🙏 Respect & écoute |
|
||
| ECRANS | 📱 Écrans |
|
||
| BONUS | 🌟 Bonus |
|
||
|
||
~36 règles dans `REGLES_DEFAUT` (version `famille-v5`) — **à généraliser** pour l’app publique (retirer références « Ariana 7h20 » etc. ou les garder comme exemples modifiables).
|
||
|
||
11 récompenses dans `RECOMPENSES_DEFAUT` (version `famille-v2`).
|
||
|
||
---
|
||
|
||
## 7. Schéma SQLite (référence)
|
||
|
||
```sql
|
||
enfants (id, prenom, date_naissance, score, couleur, ordre)
|
||
regles (id, libelle, points, icone, actif, ordre, famille, famille_ordre)
|
||
mouvements (id, enfant_id, regle_id?, delta, note?, cree_le)
|
||
recompenses (id, libelle, cout_points, icone, actif, ordre)
|
||
config (cle, valeur) -- ex. pin_hash, regles_version, premium_unlocked
|
||
```
|
||
|
||
**PIN :** bcrypt du PIN parent dans `config.pin_hash` (voir `web/src/auth.js`).
|
||
|
||
---
|
||
|
||
## 8. Écrans MVP (v1.0)
|
||
|
||
| Écran | Accès | Description |
|
||
|-------|-------|-------------|
|
||
| Onboarding | 1er lancement | Bienvenue → créer 1er enfant → PIN → importer règles défaut |
|
||
| Tableau de bord | Tous | Liste enfants + scores ; lien espace parent |
|
||
| Fiche enfant | Tous | Photo, score, historique, bouton boutique |
|
||
| Boutique | Tous | Liste récompenses, achat |
|
||
| Espace parent | PIN | Multi-sélection, grille règles, historique + annulation |
|
||
| Réglages | Parent | Export/import, premium, politique confidentialité |
|
||
| Premium | Parent | Achat IAP, restauration |
|
||
|
||
Inspiration UI : `web/public/*.html` + `web/public/css/style.css` (couleurs, cartes, avatars ronds).
|
||
|
||
---
|
||
|
||
## 9. Stack technique recommandée
|
||
|
||
| Couche | Choix |
|
||
|--------|--------|
|
||
| UI | Flutter + Material 3 |
|
||
| État | Riverpod **ou** Bloc |
|
||
| BDD | drift **ou** sqflite |
|
||
| IAP | `in_app_purchase` |
|
||
| Pub | `google_mobile_ads` (tag child-directed) |
|
||
| PIN | `bcrypt` ou package hash équivalent |
|
||
| Export | JSON + checksum ; chiffrement AES optionnel (mot de passe parent) |
|
||
| Tests | `flutter test` + tests unitaires logique scores |
|
||
|
||
**Package Android :** `fr.ptitspas.bonpoint` (proposition).
|
||
|
||
---
|
||
|
||
## 10. Réseau (minimal)
|
||
|
||
| Cas | Réseau ? |
|
||
|-----|----------|
|
||
| Scores, règles, historique | Non |
|
||
| AdMob | Oui |
|
||
| Play Billing (IAP) | Oui |
|
||
| Envoi données enfants vers serveur | **Jamais** |
|
||
|
||
Landing marketing future (hors app) : `bonpoint.ptits-pas.fr/download` → redirect Play Store + QR cartons.
|
||
|
||
---
|
||
|
||
## 11. Play Store (contraintes)
|
||
|
||
- Compte développeur ~25 € (une fois).
|
||
- Compte **personnel récent** : test fermé **12 testeurs** × **14 jours** consécutifs avant production.
|
||
- Déclaration **Families** obligatoire (app pour enfants).
|
||
- Politique de confidentialité (URL statique).
|
||
- App **non répertoriée** possible en test interne.
|
||
|
||
---
|
||
|
||
## 12. Points NON tranchés (demander au porteur de projet)
|
||
|
||
| # | Question |
|
||
|---|----------|
|
||
| 1 | Nom Play Store : « Bons Points » ou « Bonpoint » ? |
|
||
| 2 | Prix IAP : 2,99 / 3,99 / 4,99 € ? |
|
||
| 3 | Limite enfants premium : illimité ou plafond (6 / 8) ? |
|
||
| 4 | Compte Play : perso ou micro-entreprise ? |
|
||
| 5 | Édition règles en gratuit : lecture seule ou N règles custom ? |
|
||
| 6 | Historique gratuit : 30 j / 50 mouvements / illimité ? |
|
||
| 7 | Riverpod ou Bloc ? drift ou sqflite ? |
|
||
|
||
**Ne pas inventer** — proposer une valeur par défaut raisonnable et la documenter si bloqué.
|
||
|
||
---
|
||
|
||
## 13. Conventions de développement
|
||
|
||
- **UI / textes utilisateur :** français.
|
||
- **Code :** anglais (noms de classes, fichiers, variables) — cohérent avec l’écosystème Flutter.
|
||
- **Commits :** messages en français, concis.
|
||
- **Scope :** travailler dans `mobile/` ; ne pas modifier `web/` ni `infra_v2` sans demande explicite.
|
||
- **Pas de sur-ingénierie :** MVP d’abord, premium/AdMob en phase 4.
|
||
- **Ne pas commit** `.env`, clés AdMob, fichiers `google-services.json` de prod dans le dépôt public.
|
||
|
||
---
|
||
|
||
## 14. Ordre de développement suggéré
|
||
|
||
1. `flutter create` dans `mobile/` (org `fr.ptitspas.bonpoint`)
|
||
2. Modèle de données + migrations SQLite
|
||
3. Seed règles/récompenses (porter depuis `web/src/db.js`)
|
||
4. Onboarding + tableau de bord + 1 enfant
|
||
5. Espace parent (PIN, appliquer règle, annulation)
|
||
6. Fiche enfant + boutique
|
||
7. Export/import sauvegarde
|
||
8. IAP Premium + AdMob
|
||
9. Polish, légal, build release
|
||
|
||
---
|
||
|
||
## 15. Fichiers clés à lire en premier
|
||
|
||
| Fichier | Pourquoi |
|
||
|---------|----------|
|
||
| `docs/CAHIER_DES_CHARGES_APP_ANDROID.md` | Spec complète v0.2 |
|
||
| `web/src/db.js` | Schéma, seed, `appliquerRegle`, `acheterRecompense`, `annulerMouvement` |
|
||
| `web/src/auth.js` | Vérification PIN |
|
||
| `web/public/index.html` | Accueil |
|
||
| `web/public/parent.html` | Espace parent |
|
||
| `web/public/boutique.html` | Boutique |
|
||
| `web/public/css/style.css` | Charte visuelle |
|
||
|
||
---
|
||
|
||
## 16. Historique projet (éviter de refaire les erreurs)
|
||
|
||
| Tentative | Résultat |
|
||
|-----------|----------|
|
||
| Dialogflow + webhook | OK en simulateur, **inutilisable** sur Nest/téléphone (Conversational Actions mortes depuis 06/2023) |
|
||
| Smart Home Google | Répond « batterie » au lieu de « bons points » — **abandonné** |
|
||
| PWA / Cast TV | Affichage possible, pas de voix custom — **hors scope** |
|
||
| App Nest installée | **Impossible** (pas de store sur Nest Hub) |
|
||
|
||
---
|
||
|
||
## 17. Contacts & infra (info)
|
||
|
||
- **Prototype web prod :** https://bonpoint.ptits-pas.fr (Docker sur infra OVH, `/home/deploy/infra_v2/apps/bonpoint` — legacy, le dépôt canonique est maintenant `git.ptits-pas.fr/jmartin/bonpoint`)
|
||
- **Porteur projet :** Julien Martin (`jmartin@ptits-pas.fr`)
|
||
- **Gitea :** self-hosted `git.ptits-pas.fr`
|
||
|
||
---
|
||
|
||
*Dernière mise à jour : juin 2026 — aligné sur CDC v0.2 et dépôt `main`.*
|