Squash merge de la branche develop dans master : un seul commit sur master pour regrouper la livraison liée au ticket #50 (affichage dynamique des CGU et de la politique de confidentialité à l'inscription) ainsi que la documentation et les ajustements associés. Frontend (P'titsPas) : modale de validation bloquante avec onglets CGU / confidentialité, chargement des PDF depuis l'API des documents légaux actifs, affichage via pdfx (PdfViewPinch et barre de progression latérale sur le web, repli PdfView sous Windows). Branchement dans le flux d'inscription (écran de présentation), enrichissement du UserService et correction des chemins média pour les URL absolues. Documentation: jeux de fichiers juridiques (markdown et PDF de référence), réorganisation (dossier docs/juridique, archives, renommage du briefing), mises à jour index, liste de tickets et décisions projet. Scripts et métadonnées mineures (Gitea, pubspec, index web). Made-with: Cursor
14 KiB
📋 Décisions Projet - P'titsPas
Version : 1.1
Date : 9 Février 2026
Auteur : Équipe PtitsPas
🎯 Objectif de ce document
Ce document trace toutes les décisions importantes prises lors de la conception du projet P'titsPas. Il sert de référence pour comprendre les choix techniques et fonctionnels.
📊 Décisions Architecture
1. Mono-repo vs Multi-repo
Décision : ✅ Mono-repo
Justification :
- Code cohérent dans un seul dépôt Git
- Commits atomiques (frontend + backend + BDD en même temps)
- CI/CD simplifié (un seul webhook)
- Facilite le travail collaboratif
Structure :
ptitspas-app/
├── frontend/ # Application Flutter
├── backend/ # API NestJS
├── database/ # Migrations SQL/Prisma
├── api-contracts/ # Contrats OpenAPI + Prisma
├── docs/ # Documentation
└── docker-compose.yml # Orchestration
2. Déploiement On-Premise
Décision : ✅ Application on-premise avec configuration dynamique
Justification :
- Chaque collectivité a son infrastructure (SMTP, domaines, ports)
- Autonomie totale (pas de dépendance à notre infra)
- Conformité aux politiques IT locales
- Sécurité (données restent dans le SI de la collectivité)
Solution technique :
- Table
configurationen BDD (clé/valeur) - Panneau Paramètres (3 sections) dans le dashboard à la première connexion ; navigation bloquée jusqu'à sauvegarde
- Configuration SMTP dynamique
- Personnalisation (nom app, logo, URL)
Référence : 21_CONFIGURATION-SYSTEME.md
3. Gestion des fichiers uploadés
Décision : ✅ Système de fichiers local avec volume Docker
Justification :
- Simplicité (pas de S3/MinIO pour on-premise)
- Performance (accès direct au disque)
- Coût (pas de service externe)
Solution technique :
- Stockage dans
/uploads/photos/ - Volume Docker persistant
- Service Upload avec Multer
- Validation taille (depuis config)
Alternatives rejetées :
- ❌ Base de données (BYTEA) : Mauvaise performance
- ❌ S3/MinIO : Overkill pour on-premise
4. Documents légaux (CGU/Privacy)
Décision : ✅ Versioning automatique avec traçabilité RGPD
Justification :
- Conformité juridique (preuve d'acceptation)
- Flexibilité (chaque collectivité adapte ses CGU)
- Traçabilité (hash SHA-256, IP, User-Agent)
- Sécurité juridique (pas de retour en arrière)
Solution technique :
- Table
documents_legaux(versioning auto-incrémenté) - Table
acceptations_documents(traçabilité RGPD) - Upload PDF par l'admin
- Activation manuelle après prévisualisation
- Documents génériques v1 fournis par défaut
Référence : 22_DOCUMENTS-LEGAUX.md
🔧 Décisions Fonctionnelles
5. Workflow inscription sans mot de passe
Décision : ✅ Pas de mot de passe lors de l'inscription, lien email après validation
Justification :
- Simplifie l'inscription (moins de friction)
- Adapté aux parents séparés/divorcés (communication difficile)
- Sécurité (token UUID avec expiration)
- Validation gestionnaire avant activation
Workflow :
- Parent/AM s'inscrit (sans MDP)
- Gestionnaire valide
- Email envoyé avec lien création MDP (valable 7 jours)
- Utilisateur crée son MDP
- Compte activé
Référence : 20_WORKFLOW-CREATION-COMPTE.md
6. Genre enfant obligatoire (H/F)
Décision : ✅ Genre obligatoire (H/F uniquement)
Justification :
- Contexte métier : Enfants à garder (pas de genre neutre)
- Conformité CDC
- Simplicité
Implémentation :
- Champ
genreENUM('H', 'F') NOT NULL dans tableenfants
7. Suppression champs téléphone
Décision : ✅ Un seul champ "Téléphone" (mobile privilégié)
Justification :
- Simplification (plus besoin de "Mobile" et "Téléphone fixe")
- Réalité terrain : Tout le monde a un mobile
- Note dans l'interface : "(mobile privilégié)"
Implémentation :
- Supprimer
mobileettelephone_fixe - Garder uniquement
telephone
8. NIR obligatoire pour Assistantes Maternelles
Décision : ✅ NIR (Numéro de Sécurité sociale) obligatoire
Justification :
- Conformité CDC
- Nécessaire pour génération automatique du contrat
- Stockage sécurisé (chiffrement recommandé)
Implémentation :
- Champ
nir_chiffreVARCHAR(15) NOT NULL dansassistantes_maternelles - Validation : 15 chiffres exactement
- Affichage masqué dans l'interface (XXX XX XX XX XXX 123)
9. Suppression notifications SMS
Décision : ✅ Supprimer les notifications SMS, garder uniquement Email
Justification :
- Pas de plus-value identifiée
- Coût supplémentaire (service SMS)
- Complexité (intégration Twilio/OVH)
- Email suffit largement
Action :
- Amender le CDC v1.4
- Remplacer "Email OU SMS" par "Email"
- Supprimer toute mention de SMS
Référence : Ticket #57
🚫 Décisions Phase 2 (reportées)
10. Gestion erreurs SMTP (renvoyer email)
Décision : ⏸️ Phase 2 ou cas par cas
Justification :
- Pas prioritaire pour MVP
- Downtime SMTP rare (< 24h)
- Recréation dossier acceptable en phase de test
- Peut être ajouté plus tard si besoin terrain
11. Sauvegarde & Restauration automatique
Décision : ⏸️ Phase finale (quand tout fonctionne)
Justification :
- Pas bloquant pour développement
- Nécessite application stable
- Script
pg_dumpsimple à ajouter - Documentation pour admins sys
À faire :
- Script
backup.shavec cron - Guide sauvegarde/restauration
- Test restauration
12. RGPD avancé (droit à l'oubli, export données)
Décision : ⏸️ Phase 2
Justification :
- Conformité de base assurée (consentement, traçabilité)
- Droit à l'oubli : Peu de demandes en phase test
- Export données : Peut être fait manuellement en phase test
À faire :
- API suppression compte (soft delete)
- API export données personnelles (JSON)
- Anonymisation comptes inactifs
13. Statistiques dashboard
Décision : ⏸️ Phase 2 (besoin d'utilisateurs d'abord)
Justification :
- Pas de données = pas de statistiques
- Fonctionnalité importante pour vente
- Nécessite application en production
À faire :
- API statistiques (comptes, enfants, AM, validations)
- Widgets dashboard (graphiques)
- Export rapports
14. Migration de données
Décision : ❌ Pas de migration prévue
Justification :
- Pas de système existant à migrer
- Application nouvelle
- Import CSV peut être ajouté cas par cas si besoin
15. Documentation utilisateur
Décision : ⏸️ Phase 2 (formation présentiel prioritaire)
Justification :
- Premiers utilisateurs : Formation directe par l'équipe
- Documentation nécessaire pour scalabilité
- Vidéos tutoriels utiles mais pas bloquant
À faire :
- Guide utilisateur gestionnaire
- Guide utilisateur parent/AM
- FAQ
- Vidéos tutoriels
🔐 Décisions Sécurité
16. Chiffrement mots de passe configuration
Décision : ✅ AES-256-CBC pour mots de passe SMTP
Justification :
- Sécurité (mots de passe SMTP en clair = risque)
- Conformité sécurité
- Déchiffrement uniquement en mémoire
Implémentation :
- Type
encrypteddans tableconfiguration - Clé de chiffrement dans
.env(32 caractères) - Service ConfigService gère chiffrement/déchiffrement
17. Hash mots de passe utilisateurs
Décision : ✅ Bcrypt avec 12 rounds
Justification :
- Standard industrie
- Résistant aux attaques brute-force
- Configurable (rounds dans config)
18. Tokens création mot de passe
Décision : ✅ UUID avec expiration 7 jours
Justification :
- Sécurité (UUID impossible à deviner)
- Expiration (limite fenêtre d'attaque)
- Durée configurable (dans table
configuration)
19. JWT sessions
Décision : ✅ JWT avec expiration 24h
Justification :
- Stateless (pas de session en BDD)
- Performance (pas de lookup BDD à chaque requête)
- Durée configurable
📊 Décisions Base de Données
20. PostgreSQL vs autres SGBD
Décision : ✅ PostgreSQL 17
Justification :
- Open-source
- Robuste et performant
- Support JSON (flexibilité)
- Support UUID natif
- Communauté active
21. ORM : Prisma vs TypeORM
Décision : ✅ Prisma (mais TypeORM déjà en place)
Justification Prisma :
- Type-safety
- Migrations claires
- Génération client automatique
Note : Le projet YNOV utilise TypeORM. À évaluer si migration vers Prisma nécessaire.
22. Migrations versionnées
Décision : ✅ Migrations SQL versionnées
Justification :
- Traçabilité des changements schéma
- Rollback possible
- Déploiement automatisé
Implémentation :
- Fichiers
XX_nom_migration.sql - Exécution via
prisma migrate deploy - User
app_adminpour DDL - User
app_userpour DML (runtime)
🧪 Décisions Tests
23. Stratégie de tests
Décision : ✅ Tests unitaires + intégration + E2E
Justification :
- Qualité code
- Confiance déploiement
- Détection régression
Couverture cible :
- Tests unitaires : > 80%
- Tests intégration : Workflows complets
- Tests E2E : Parcours utilisateurs critiques
📝 Décisions Documentation
24. Structure documentation
Décision : ✅ Documentation centralisée dans /docs/ avec numérotation
Justification :
- Lisibilité (ordre logique)
- Maintenance (tout au même endroit)
- Versioning (Git)
Structure :
docs/
├── 00_INDEX.md
├── 01_CAHIER-DES-CHARGES.md
├── 02_ARCHITECTURE.md
├── 03_DEPLOYMENT.md
├── 10_DATABASE.md
├── 11_API.md
├── 20_WORKFLOW-CREATION-COMPTE.md
├── 21_CONFIGURATION-SYSTEME.md
├── 22_DOCUMENTS-LEGAUX.md # pointeur → juridique/
├── 27_BRIEFING-FRONTEND.md
├── PROCEDURE-API-GITEA.md # pointeur → 26_GITEA-API.md
├── juridique/
│ ├── README.md
│ ├── cgu.md
│ ├── cgc.md
│ └── 22_DOCUMENTS-LEGAUX.md
├── archive/
│ ├── README.md
│ ├── temporaires/
│ └── obsolete/
├── 23_LISTE-TICKETS.md
├── 24_DECISIONS-PROJET.md (ce document)
├── 90_AUDIT.md
└── test-data/
🔄 Décisions Workflow
25. Gitea + Webhook + Déploiement automatique
Décision : ✅ Déploiement automatique sur push master
Justification :
- Productivité (pas de déploiement manuel)
- Fiabilité (script testé)
- Rapidité (feedback immédiat)
Workflow :
- Push sur
master - Webhook Gitea déclenché
- Script
deploy-ptitspas.shexécuté - Git pull + Migrations + Docker rebuild + Restart
26. Branches Git
Décision : ✅ Stratégie simple : master + feature branches
Justification :
- Simplicité (petite équipe)
- Flexibilité
Branches :
master: Productionarchive/*: Archives (ex: maquette initiale)migration/*: Migrations (ex: intégration YNOV)feature/*: Nouvelles fonctionnalités
🎫 Décisions Ticketing
27. Taille des tickets
Décision : ✅ Tickets relativement petits (2-6h)
Justification :
- Granularité (suivi précis)
- Motivation (tickets terminables rapidement)
- Revue de code facilitée
28. Organisation tickets
Décision : ✅ 1 ticket = 1 fonctionnalité complète (Front + Back + BDD si nécessaire)
Justification :
- Cohérence (toute la feature développée ensemble)
- Testable (end-to-end immédiatement)
- Atomique (livraison de valeur fonctionnelle)
Alternative rejetée :
- ❌ 1 ticket Front + 1 ticket Back + 1 ticket BDD = Dépendances complexes
🚀 Décisions Déploiement
29. Docker Compose vs Kubernetes
Décision : ✅ Docker Compose
Justification :
- Simplicité (on-premise petite/moyenne collectivité)
- Pas de besoin de scalabilité horizontale
- Maintenance facile
Alternative rejetée :
- ❌ Kubernetes : Overkill pour on-premise mono-instance
30. Traefik comme reverse proxy
Décision : ✅ Traefik
Justification :
- Configuration automatique (labels Docker)
- SSL Let's Encrypt automatique
- Dashboard intégré
📊 Logs & Monitoring
31. Système de logs
Décision : ✅ Winston avec rotation quotidienne
Justification :
- Standard NestJS
- Rotation automatique (pas de disque plein)
- Niveaux de log (info, warn, error)
- Transports multiples (console + fichier)
Logs à capturer :
- Logs applicatifs (info, warn, error)
- Logs emails (succès/échec SMTP)
- Logs connexions (qui se connecte quand)
- Logs validations (qui valide quoi)
📋 Résumé des décisions critiques
| # | Décision | Statut | Impact |
|---|---|---|---|
| 1 | Mono-repo | ✅ Phase 1 | Architecture |
| 2 | On-premise avec config dynamique | ✅ Phase 1 | Déploiement |
| 3 | Système de fichiers pour uploads | ✅ Phase 1 | Stockage |
| 4 | Versioning documents légaux | ✅ Phase 1 | RGPD |
| 5 | Inscription sans MDP | ✅ Phase 1 | UX |
| 6 | Genre enfant obligatoire (H/F) | ✅ Phase 1 | Métier |
| 7 | Un seul champ téléphone | ✅ Phase 1 | Simplification |
| 8 | NIR obligatoire AM | ✅ Phase 1 | Conformité |
| 9 | Suppression SMS | ✅ Phase 1 | Simplification |
| 10 | Renvoyer email | ⏸️ Phase 2 | Nice-to-have |
| 11 | Sauvegarde auto | ⏸️ Phase finale | Ops |
| 12 | RGPD avancé | ⏸️ Phase 2 | Conformité |
| 13 | Statistiques | ⏸️ Phase 2 | Business |
| 14 | Migration données | ❌ Rejeté | N/A |
| 15 | Doc utilisateur | ⏸️ Phase 2 | Formation |
| 31 | Logs Winston | ✅ Phase 1 | Monitoring |
🔄 Historique des modifications
| Date | Version | Modifications |
|---|---|---|
| 25/11/2025 | 1.0 | Création du document - Toutes les décisions initiales |
| 09/02/2026 | 1.1 | Configuration initiale : un seul panneau Paramètres (3 sections) dans le dashboard, plus de Setup Wizard dédié ; navigation bloquée jusqu'à sauvegarde |
Dernière mise à jour : 9 Février 2026
Version : 1.1
Statut : ✅ Document validé