262 Commits

Author SHA1 Message Date
ccfcfa3287 chore: ignorer le dossier .cursor (config IDE Cursor)
Made-with: Cursor
2026-04-11 18:02:52 +02:00
dbca12d5d1 scripts: ajout des inscriptions parent test (Martin, Durand/Rousseau, Lecomte)
Scripts Node POST /api/v1/auth/register/parent alignés sur docs/test-data et le seed, avec photos ressources/Photos (réduction JPEG via sharp-cli pour Durand/Rousseau).

Made-with: Cursor
2026-04-11 18:02:52 +02:00
4fe29799cd fix(api): CORS + CORP sur réponses statiques /uploads (Flutter web)
- enableCors avant les statics
- Access-Control-Allow-Origin * + Cross-Origin-Resource-Policy sur fichiers
- OPTIONS préflight pour /uploads et /api/v1/uploads

Made-with: Cursor
2026-04-11 17:11:23 +02:00
3bfdadd301 fix(front): images validation dossier, traces debug, baseUrl via Env
- ApiConfig.baseUrl dérivé de Env.apiBaseUrl (alignement API / origine médias).
- AuthNetworkImage : uploads publics sans Bearer (CORS web) ; log erreurs en debug.
- debugPrint kDebugMode : GET dossier, EnfantDossier.fromJson, absoluteMediaUrl, carte enfant.
- ParentDossier id depuis user_id ; fallbacks présentation / photo.

Made-with: Cursor
2026-04-11 17:08:34 +02:00
09289882d0 fix: photos admin — URL via /api/v1/uploads + static Express
- Nest: servir le volume uploads aussi sous /api/v1/uploads (Traefik /api)
- Flutter: _fullPhotoUrl = base API + chemin /uploads/... (plus d’origine site seul)
- EnfantDossier: tolérer photoUrl camelCase

Made-with: Cursor
2026-04-11 16:47:29 +02:00
e7f0037ac3 fix: motivation dossier famille à l’inscription + servir /uploads + Traefik
- Inscription parent: créer dossier_famille + dossier_famille_enfants (presentation_dossier)
- Nest: useStaticAssets sur le volume uploads (chemins /uploads/photos/…)
- docker-compose: route Traefik PathPrefix /uploads → API (priorité 18)
- Front: ParentDossier.id depuis user_id (aligné API)

Made-with: Cursor
2026-04-11 16:37:44 +02:00
4969be5809 feat(inscription): payload enfant/photo et limite JSON 15 Mo côté API
- Express/Nest : body parser json et urlencoded à 15 Mo pour les photos base64.
- Front : envoi d’inscription parent (authService, payload, étape 3).

Made-with: Cursor
2026-04-11 16:36:15 +02:00
d7ccbfbe35 feat(api): dossier famille — photo_url et consent_photo par enfant
- DossierFamilleEnfantDto: champs optionnels Swagger
- Mapping getDossierFamilleByNumero + fallback dossier_famille_enfants
- GET dossiers/:num (type family) enrichi via délégation existante

Made-with: Cursor
2026-04-11 16:31:11 +02:00
2b3128ce4a fix(api): inscription parent — body 15mb, uploads persistants, 409 si unique PG
- NestExpressApplication + useBodyParser json/urlencoded 15mb
- UPLOAD_PHOTOS_DIR: résolution chemin absolu/relatif + doc .env.example / proxy
- docker-compose: volume backend_uploads + UPLOAD_PHOTOS_DIR par défaut
- Map erreur PostgreSQL 23505 → ConflictException (parent + AM)
- Logs Nest si échec SMTP après inscription (email déjà géré)

Made-with: Cursor
2026-04-10 17:40:23 +02:00
077a1ca3ed fix(bdd): genre_type inclut Autre (alignement API inscription enfants)
Made-with: Cursor
2026-03-31 00:08:41 +02:00
bf05b1d7d7 feat(inscription): email accusé réception, photos enfants, formulaires identité
- Backend: mail après inscription parent avec n° dossier, UPLOAD_PHOTOS_DIR, réponse API
- Frontend: imageBytes + payload photo, utils email/code postal/téléphone, champs dédiés
- Formulaires admin, login (focus), personal_info, child_card, custom_app_text_field

Made-with: Cursor
2026-03-31 00:04:38 +02:00
110240b682 feat(frontend): inscription — UI cartes enfant, formatage noms, focus Tab
- Formulaire infos perso : ordre de tabulation explicite, Checkbox Material
  pour le consentement photo, formatage nom/prénom/ville à la perte de focus
  et à la soumission (name_format_utils).
- Carte enfant : cadre photo, croix, ombres, consentement ; formatage
  prénom/nom enfant ; normalisation avant passage étape 4.
- Asset photo_frame.png ; HoverReliefWidget clipBehavior.
- Ajustements payload / modèle / étapes inscription liés au parcours.

Made-with: Cursor
2026-03-28 20:40:27 +01:00
a723412043 revert(ui): ChildCardWidget identique au commit b18d5c8 (7 fév. 2026)
- Restauration fichier tel que dans feat(frontend): Refonte multi-modes (#78)
- Retrait onGenreChanged (step3/step5) ; genre API: défaut Autre si non renseigné
  jusqu’à nouvelle UI genre

Made-with: Cursor
2026-03-28 18:22:22 +01:00
1e21fe25f3 fix(front): genre enfant — pastilles au lieu du dropdown sur fond beige
Le commit cd2bf63 ajoutait un Dropdown dans un bloc bg_beige, lourd sur
les cartes aquarellées. Remplacement par trois choix tactiles discrets
(Garçon / Fille / Autre), espacements alignés sur prénom/nom.

Made-with: Cursor
2026-03-28 18:15:02 +01:00
cd2bf63b8a feat(front): inscription parent — genre obligatoire H/F/Autre (#101)
- ChildData.genre + copyWith ; liste déroulante sur la carte enfant
- Validation et payload API alignés sur GenreType
- Étape 3 : mises à jour via copyWith (préservation du genre)

Made-with: Cursor
2026-03-28 18:08:32 +01:00
de60a001cc feat(front): inscription parent — soumission réelle vers POST /auth/register/parent (#101)
- ParentRegistrationPayload : validation client et mapping UserRegistrationData → JSON API
- AuthService.registerParent
- Étape 5 : appel API, chargement, erreurs en dialogue, succès inchangé puis /login

Made-with: Cursor
2026-03-28 18:07:52 +01:00
481fa66630 chore(front): supprimer le préremplissage et les données aléatoires à l’inscription
- Parcours AM : plus de jeu de test Marie DUBOIS ni photo factice
- Parcours parent : plus de DataGenerator ; enfants vides à l’ajout
- Suppression de data_generator.dart (inutilisé)

Made-with: Cursor
2026-03-28 18:07:46 +01:00
0a07fade40 docs: liste tickets — fermeture #106 #107 #109 #119 (Gitea)
Made-with: Cursor
2026-03-26 00:20:32 +01:00
0e8a999e41 Merge branch 'feature/107-onglet-a-valider' into develop
Conflits pending-families : conservation du DTO/SQL develop (date_soumission, emails, parents).

Made-with: Cursor
2026-03-26 00:16:53 +01:00
2e02f60601 feat(admin): onglet À valider, dossier unifié et modales de validation
- Onglet « À valider » (AM + familles), pending-families et détail dossier par numéro.
- Wizards validation AM et famille, modale commune, chargement via GET /dossiers/:num.
- UI : cartes enfants, photo AM (cadre uniforme, ratio), NIR affiché formaté (espaces autour du tiret).
- Backend : DTO / routes parents pending ; scripts de test et mise à jour issue Gitea.

Tickets #107, #119.

Made-with: Cursor
2026-03-26 00:15:18 +01:00
0e6e473e84 feat: pending-families ajoute parents[] (email/tel/ville/cp) + ordre stable
Made-with: Cursor
2026-03-25 10:58:29 +01:00
cc3639b19a fix: dossier AM expose texte_motivation (alias biographie) pour le front
Made-with: Cursor
2026-03-23 23:43:00 +01:00
cf9cd495bf feat: enrichissement GET pending-families (date_soumission, nombre_enfants, emails)
Made-with: Cursor
2026-03-23 23:37:50 +01:00
76ba28a7ce fix: dossier famille - un seul texte_motivation, plus de tableau presentation
Made-with: Cursor
2026-03-18 01:56:58 +01:00
1772744c81 feat(#119): dossier famille = 1 par famille, N enfants; retrait repas/type_contrat/budget; adresse dans API parents
Made-with: Cursor
2026-03-18 01:52:28 +01:00
5465117238 fix: renvoyer le genre des enfants dans le dossier famille (GET dossiers/parents)
Made-with: Cursor
2026-03-18 01:35:27 +01:00
6e2343087e feat(#119): GET /dossiers/:numeroDossier unifié AM ou famille (type + dossier)
Made-with: Cursor
2026-03-17 23:11:53 +01:00
f6fabc521e feat(#119): GET /parents/dossier-famille/:numeroDossier - dossier famille complet (admin/gestionnaire)
Made-with: Cursor
2026-03-17 22:40:48 +01:00
5390276ecd fix: ParentsModule - import JwtModule pour AuthGuard (évite restart loop au déploiement)
Made-with: Cursor
2026-03-13 16:49:39 +01:00
7e9306de01 fix: GET /parents/pending-families 500 + #113 doublons inscription
- parents.service: normaliser parentIds (array ou string PG) pour éviter 500
- auth.service: doublons à l'inscription (#113) - parent/co-parent même email, NIR et numéro agrément AM
- docs: mise à jour statuts tickets

Made-with: Cursor
2026-03-13 16:30:12 +01:00
d832559027 Merge branch 'develop' of https://git.ptits-pas.fr/jmartin/petitspas into develop 2026-03-13 10:52:28 +01:00
54ad1d2aa1 docs: retirer référence aux scripts Gitea validation supprimés
Made-with: Cursor
2026-03-13 10:52:15 +01:00
86b28abe51 feat(#111): Reprise après refus – backend
- GET /auth/reprise-dossier?token= : dossier pour préremplir (token seul)
- PATCH /auth/reprise-resoumettre : token + champs modifiables → en_attente, token invalidé
- POST /auth/reprise-identify : numero_dossier + email → type + token
- UserService: findByTokenReprise, resoumettreReprise, findByNumeroDossierAndEmailForReprise

Made-with: Cursor
2026-03-12 23:04:45 +01:00
86d8189038 feat(#110): Refus sans suppression – token reprise + email
- Colonnes token_reprise, token_reprise_expire_le (migration + BDD.sql)
- refuser: génère token (7j), enregistre, trace validations, envoie email (template refus + lien reprise)
- MailService.sendRefusEmail ; échec email ne bloque pas le refus

Made-with: Cursor
2026-03-12 22:56:27 +01:00
dbcb3611d4 feat(#108): Validation dossier famille – POST /parents/:parentId/valider-dossier
- getFamilyUserIds(parentId) : tous les user_id de la famille (co_parent + enfants partagés)
- Valide en une fois tous les comptes en_attente/refuse de la famille (validateUser)
- Réponse : liste des Users validés

Made-with: Cursor
2026-03-12 22:46:17 +01:00
1fa70f4052 feat(#106): Liste familles en attente – GET /parents/pending-families
- Une entrée par famille (co_parent + enfants partagés, même logique que backfill #103)
- libelle, parentIds, numero_dossier ; filtre statut en_attente
- AuthGuard + RolesGuard sur controller parents

Made-with: Cursor
2026-03-12 22:36:16 +01:00
393a527c37 feat(#105): Statut « refusé » – enum, migration, pending/reprise, refuser, connexion
- Enum statut_utilisateur_type + valeur 'refuse' (migration + BDD.sql)
- GET /users/reprise, PATCH /users/:id/refuser (refus_compte en validations)
- PATCH /users/:id/valider accepte en_attente et refuse (reprise)
- Connexion refusée si statut refuse

Made-with: Cursor
2026-03-12 22:21:12 +01:00
dfd58d9b6c feat(#103): Numéro de dossier – backend
- Colonne numero_dossier (utilisateurs, assistantes_maternelles, parents)
- Table numero_dossier_sequence, format AAAA-NNNNNN, séquence par année
- Génération à la soumission AM et parent (famille)
- Backfill existants (famille = co_parent ou enfants partagés)
- API PATCH /users/:id/numero-dossier (gestionnaire/admin)
- Garde-fous: max 2 parents/dossier, pas de mélange AM/parent

Made-with: Cursor
2026-03-12 22:12:33 +01:00
34a36b069e docs: liste tickets complète (23_LISTE-TICKETS) + script gitea-close-issue
Made-with: Cursor
2026-03-11 22:19:33 +01:00
2fa546e6b7 fix(inscription AM): format NIR Corse + extraction message erreur API
Made-with: Cursor
2026-02-26 21:02:40 +01:00
8636b16659 feat(inscription AM): câblage API step 4 + AuthService.registerAM avec nir_utils
Made-with: Cursor
2026-02-26 20:52:37 +01:00
7e17e5ff8d Merge branch 'feature/91-cablage-inscription-am' into develop
Made-with: Cursor
2026-02-26 19:11:38 +01:00
e8b6d906e6 Merge branch 'feature/prefill-am-marie-dubois' into develop
Made-with: Cursor
2026-02-26 19:10:47 +01:00
ae0be04964 test(inscription AM): Préremplissage données de test Marie DUBOIS
Étapes 1 à 3 du formulaire d'inscription AM : remplacer les données
aléatoires par le jeu de test officiel (03_seed_test_data.sql).

Made-with: Cursor
2026-02-26 19:10:04 +01:00
ca98821b3e Merge develop into master (squash): ticket #102 NIR harmonisation
- Backend: DTO NIR 15 car 2A/2B, validation format+clé, warning cohérence
- BDD: nir_chiffre NOT NULL, migration pour bases existantes
- Seeds: 02 nir_chiffre, 03 Marie 2A / Fatima 99
- Frontend: nir_utils, nir_text_field, formulaire pro, mock inscription AM

Made-with: Cursor
2026-02-26 13:55:42 +01:00
447f3d4137 fix(#102): 02_seed - ajouter nir_chiffre à l'INSERT assistantes_maternelles (NOT NULL)
Made-with: Cursor
2026-02-26 13:53:41 +01:00
721f40599b feat(frontend): NIR 15 car., formatage, validation, widget dédié (#102)
- nir_utils: normalizeNir, formatNir, validateNir (format + clé), Corse 2A/2B
- NirInputFormatter: formatage auto à la saisie (espaces + tiret)
- NirTextField: widget réutilisable pour champ NIR
- professional_info_form_screen: NIR 15 car., affichage formaté à l'init
- custom_app_text_field: paramètre inputFormatters

Refs: #102
Made-with: Cursor
2026-02-26 13:49:57 +01:00
a9c6b9e15b feat(#102): BDD nir_chiffre NOT NULL + migration pour bases existantes
Made-with: Cursor
2026-02-26 12:56:15 +01:00
38c003ef6f feat(#102): mock préremplissage AM étape 2 - NIR Marie Dubois 2A (Ajaccio)
Made-with: Cursor
2026-02-26 11:24:27 +01:00
3dbddbb8c4 feat(#102): seed NIR Marie 2A (Corse Ajaccio), Fatima 99 (étranger), doc
Made-with: Cursor
2026-02-26 11:23:59 +01:00