# 5.1 — Création du code au premier lancement ## Objectif Au tout premier lancement, obliger le parent à créer un code à 4 chiffres (saisi deux fois pour confirmation) avant d'accéder à l'app. ## Périmètre & hors-périmètre - Inclus : détection « pas de code défini », écran de création (double saisie + validation), enregistrement. - Exclus : stockage technique détaillé (5.2), porte d'accès (5.3). ## Dépendances Jalon 0. (Le stockage de 5.2 peut être développé en parallèle/avant ; ici on consomme son interface.) ## Conception - **Domain** (`features/parental/domain/`) : - `ParentalCode` (value object) : exactement 4 chiffres ; invariant validé à la construction (sinon `Err(InvalidCodeFormat)`). - `ParentalCodeRepository` (interface) : `Future isConfigured()`, `Future> setCode(ParentalCode code)`, `Future verify(ParentalCode code)`. (Impl. en 5.2.) - **Application** : - `IsCodeConfiguredUseCase`, `SetParentalCodeUseCase` (refuse si déjà configuré, ou autorise via flux dédié — documenter). - **Presentation** : - Au démarrage, `IsCodeConfiguredUseCase` décide : non configuré → `CreateCodeView` bloquant ; configuré → espace enfant. - `CreateCodeView` : saisie 1 + saisie 2, contrôle d'égalité, format 4 chiffres, gros pavé numérique adapté. ## Plan TDD 1. **Red** : `parental_code_test.dart` — `ParentalCode('1234')` OK ; `'12'`, `'12a4'`, `''` → invalides. 2. **Green** : implémenter le value object. 3. **Red** : `set_parental_code_use_case_test.dart` — délègue à `setCode` ; refuse si déjà configuré (selon règle documentée). 4. **Green** : implémenter. 5. **Red** : `create_code_view_test.dart` (widget) — deux saisies différentes → erreur affichée, pas d'enregistrement ; deux saisies égales valides → `SetParentalCodeUseCase` appelé. 6. **Green** : implémenter l'écran. 7. **Refactor**. ## Definition of Done - Tests value object + use case + widget verts. - Premier lancement impose la création ; lancement ultérieur ne la redemande pas. - `tool/check.sh` passe ; étape 5.1 cochée dans `ROADMAP.md`. ## Risques / notes - Ne jamais logguer le code. Le value object ne doit pas exposer la valeur en clair dans `toString`.