# 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`.*