14 KiB
📋 Décisions Projet - P'titsPas
Version : 1.0
Date : 25 Novembre 2025
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) - Setup Wizard à la première connexion
- 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
├── 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 |
Dernière mise à jour : 25 Novembre 2025
Version : 1.0
Statut : ✅ Document validé