feat: Intégration de la base de données PostgreSQL depuis YNOV

- Structure complète: utilisateurs, parents, assmat, enfants, contrats
- Migrations SQL avec enums et contraintes
- Seed: 1 super_admin (admin@ptits-pas.fr)
- Mot de passe: 4dm1n1strateur (hash bcrypt)
This commit is contained in:
2025-11-24 15:44:39 +01:00
parent 9cb4162165
commit bbf73458cb
30 changed files with 2212 additions and 0 deletions
+157
View File
@@ -0,0 +1,157 @@
# ENUMS.md — Référentiel des valeurs énumérées (Sprint 1)
Ce document recense **toutes les valeurs énumérées** utilisées dans la base PtitsPas, leur **sens fonctionnel**, les **colonnes concernées** et les **transitions** attendues côté métier / API.
> Objectif : garantir la **cohérence** entre la DB, le backend (NestJS) et le frontend (Flutter).
> Toute nouvelle valeur ou renommage **doit** être ajouté ici **avant** migration DB.
---
## Conventions générales
- Les valeurs ENUM sont **en minuscules** et **sans espace** (snake_case si nécessaire).
- Côté DB, elles sont implémentées via **types ENUM PostgreSQL** *ou* via `CHECK` (selon ce qui est en place dans `01_init.sql`).
- Côté API, ces valeurs sont **renvoyées telles quelles** et **documentées** dans lOpenAPI / DTO.
---
## 1) Rôle utilisateur — `role`
**Tables/colonnes** : `utilisateurs.role`
**Valeurs autorisées** :
| Valeur | Description |
|---|---|
| `super_admin` | Compte technique initial / administration globale |
| `gestionnaire` | Gestion / validation des comptes, supervision |
| `parent` | Parent ou co-parent |
| `am` | Assistante maternelle |
---
## 2) Statut utilisateur — `statut`
**Tables/colonnes** : `utilisateurs.statut`
**Valeurs autorisées** :
| Valeur | Description |
|---|---|
| `en_attente` | Compte créé mais non validé |
| `accepte` | Compte validé et actif |
| `rejete` | Demande refusée (peut être recréée ultérieurement) |
---
## 3) Statut enfant — `statut`
**Tables/colonnes** : `enfants.statut`
**Valeurs autorisées** :
| Valeur | Description |
|---|---|
| `a_naitre` | Enfant à naître (date prévue renseignée) |
| `actif` | Enfant pris en charge / en cours de garde |
| `scolarise` | Enfant scolarisé, garde potentiellement périscolaire |
**Contraintes associées** :
- `a_naitre`**`date_prevue_naissance` obligatoire**
- `actif`/`scolarise`**`date_naissance` obligatoire**
---
## 4) Statut dossier — `statut`
**Tables/colonnes** : `dossiers.statut`
**Valeurs autorisées (MVP)** :
| Valeur | Description |
|---|---|
| `envoye` | Dossier soumis par le parent (état initial) |
| `en_cours` | Échanges en cours entre parent et AM |
| `clos` | Dossier clôturé (contrat généré ou abandon) |
---
## 5) Statut contrat — `statut`
**Tables/colonnes** : `contrats.statut`
**Valeurs autorisées** :
| Valeur | Description |
|---|---|
| `brouillon` | Contrat en préparation |
| `valide` | Contrat finalisé (signatures complètes) |
| `archive` | Contrat obsolète / terminé |
---
## 6) Statut avenant — `statut`
**Tables/colonnes** : `avenants_contrats.statut`
**Valeurs autorisées** :
| Valeur | Description |
|---|---|
| `propose` | Avenant proposé (en attente daccord) |
| `valide` | Avenant accepté et appliqué |
| `rejete` | Avenant refusé |
---
## 7) Type d’événement — `type`
**Tables/colonnes** : `evenements.type`
**Valeurs autorisées** :
| Valeur | Description |
|---|---|
| `absence_enfant` | Enfant absent |
| `conge_am` | Congé de lassistante maternelle |
| `conge_parent` | Congé du parent |
| `arret_maladie_am` | Arrêt maladie AM |
| `evenement_rpe` | Événement RPE |
---
## 8) Statut d’événement — `statut`
**Tables/colonnes** : `evenements.statut`
**Valeurs autorisées** :
| Valeur | Description |
|---|---|
| `propose` | Événement proposé |
| `valide` | Événement validé |
| `rejete` | Événement refusé |
---
## 9) Statut de validation compte — `statut`
**Tables/colonnes** : `validations.statut`
**Valeurs autorisées** :
| Valeur | Description |
|---|---|
| `accepte` | Compte validé |
| `rejete` | Compte refusé |
---
## 10) Type de notification — `type`
**Tables/colonnes** : `notifications.type`
**Valeurs proposées** :
| Valeur | Description |
|---|---|
| `nouveau_message` | Nouveau message sur un dossier |
| `validation_compte` | Résultat de la validation de compte |
| `maj_contrat` | Contrat mis à jour (avenant / signature) |
| `evenement_a_venir` | Rappel dun événement proche |
---
**Mainteneur** : Équipe BDD
**Dernière mise à jour** : Sprint 1 — Ticket 9 (ENUMS)
+142
View File
@@ -0,0 +1,142 @@
# FK_POLICIES.md
**Politique des clés étrangères (ON DELETE / ON UPDATE)** Sprint 1
## 🎯 Objectif
Documenter, de façon unique et partagée, les règles de suppression/mise à jour appliquées aux **clés étrangères** de la base PtitsPas pour :
- préserver l**intégrité référentielle** ;
- conserver l**historique** utile (messages, événements…) ;
- respecter les exigences **RGPD** (suppression en cascade lorsque pertinent).
> Par défaut, **ON UPDATE = NO ACTION** (UUID immuables).
> Ce document couvre **ON DELETE** table par table.
---
## 🧭 Principes généraux
- **CASCADE** quand la donnée fille **na pas de sens sans le parent**
(ex. `dossiers` dun parent, `avenants` dun contrat).
- **SET NULL** quand on veut **préserver lhistorique** mais que le référent peut disparaître
(ex. auteur dun message supprimé, créateur dun événement).
- **RESTRICT/NO ACTION** non utilisé ici pour éviter des blocages au nettoyage.
---
## 📚 Récapitulatif rapide (matrice)
| Table (colonne FK) → Référence | ON DELETE | Raison |
|---|---:|---|
| **assistantes_maternelles(id_utilisateur)**`utilisateurs(id)` | **CASCADE** | Profil AM supprimé avec son compte |
| **parents(id_utilisateur)**`utilisateurs(id)` | **CASCADE** | Extension parent supprimée avec son compte |
| **parents(id_co_parent)**`utilisateurs(id)` | **SET NULL** | Conserver le parent principal si co-parent disparaît |
| **enfants_parents(id_parent)**`parents(id_utilisateur)` | **CASCADE** | Nettoyage liaisons N:N |
| **enfants_parents(id_enfant)**`enfants(id)` | **CASCADE** | Idem |
| **dossiers(id_parent)**`parents(id_utilisateur)` | **CASCADE** | Dossier na pas de sens sans parent |
| **dossiers(id_enfant)**`enfants(id)` | **CASCADE** | Dossier na pas de sens sans enfant |
| **messages(id_dossier)**`dossiers(id)` | **CASCADE** | Messages détruits avec le dossier |
| **messages(id_expediteur)**`utilisateurs(id)` | **SET NULL** | Garder lhistorique des échanges |
| **contrats(id_dossier)**`dossiers(id)` | **CASCADE** | 1:1, contrat détruit si dossier supprimé |
| **avenants_contrats(id_contrat)**`contrats(id)` | **CASCADE** | Avenants détruits avec le contrat |
| **avenants_contrats(initie_par)**`utilisateurs(id)` | **SET NULL** | Historiser lavenant sans bloquer |
| **evenements(id_enfant)**`enfants(id)` | **CASCADE** | Événements nont plus de sens |
| **evenements(id_am)**`utilisateurs(id)` | **SET NULL** | Garder la trace même si AM supprimée |
| **evenements(id_parent)**`parents(id_utilisateur)` | **SET NULL** | Garder la trace si parent supprimé |
| **evenements(cree_par)**`utilisateurs(id)` | **SET NULL** | Conserver lhistorique de création |
| **signalements_bugs(id_utilisateur)**`utilisateurs(id)` | **SET NULL** | Conserver le ticket même si compte supprimé |
| **uploads(id_utilisateur)**`utilisateurs(id)` | **SET NULL** | Fichier reste référencé sans lauteur |
| **notifications(id_utilisateur)**`utilisateurs(id)` | **CASCADE** | Notifications propres à lutilisateur |
| **validations(id_utilisateur)**`utilisateurs(id)` | **SET NULL** | Garder lhistorique de décision |
> **ON UPDATE** : **NO ACTION** partout (les UUID ne changent pas).
---
## 🔎 Détail par domaine
### Utilisateurs & extensions
- `assistantes_maternelles.id_utilisateur`**CASCADE**
- `parents.id_utilisateur`**CASCADE**
- `parents.id_co_parent`**SET NULL** (interdit d’être co-parent de soi-même via CHECK déjà posé)
### Enfants & liaisons
- `enfants_parents.id_parent`**CASCADE**
- `enfants_parents.id_enfant`**CASCADE**
### Dossiers & échanges
- `dossiers.id_parent`**CASCADE**
- `dossiers.id_enfant`**CASCADE**
- `messages.id_dossier`**CASCADE**
- `messages.id_expediteur`**SET NULL**
### Contrats & avenants
- `contrats.id_dossier`**CASCADE** (unique 1:1)
- `avenants_contrats.id_contrat`**CASCADE**
- `avenants_contrats.initie_par`**SET NULL**
### Événements
- `evenements.id_enfant`**CASCADE**
- `evenements.id_am`**SET NULL**
- `evenements.id_parent`**SET NULL**
- `evenements.cree_par`**SET NULL**
### Divers
- `signalements_bugs.id_utilisateur`**SET NULL**
- `uploads.id_utilisateur`**SET NULL**
- `notifications.id_utilisateur`**CASCADE**
- `validations.id_utilisateur`**SET NULL**
---
## 🧪 Scénarios de test (exemples)
1. **Suppression dun parent**
- Supprimer `utilisateurs(id=parentX)`
- Attendu : `parents` (CASCADE), ses `dossiers` (CASCADE), `messages` liés aux `dossiers` (CASCADE) sont supprimés.
2. **Suppression dun co-parent**
- Supprimer `utilisateurs(id=coParentY)`
- Attendu : `parents.id_co_parent` passe à **NULL**, aucun dossier supprimé.
3. **Suppression dun utilisateur auteur de messages**
- Supprimer `utilisateurs(id=uZ)`
- Attendu : les lignes `messages` **restent**, `id_expediteur` devient **NULL**.
4. **Suppression dun enfant**
- Supprimer `enfants(id=childA)`
- Attendu : `enfants_parents` (CASCADE), `dossiers` du childA (CASCADE), `evenements` du childA (CASCADE).
5. **Suppression dun utilisateur AM**
- Supprimer `utilisateurs(id=amB)`
- Attendu : `evenements.id_am` devient **NULL** (historique conservé).
---
## 🛠 Migrations associées
Les ajustements sont implémentés dans :
- **`/bdd/migrations/04_fk_policies.sql`**
redéfinition des contraintes FK avec les bonnes politiques (**DROP puis ADD CONSTRAINT**), de façon idempotente.
---
## 📄 Notes & futures évolutions
- **RGPD (Sprint 2)** : si vous activez le **soft delete** (`deleted_at`) côté tables métier, ces politiques restent valides (les suppressions logiques se gèrent au niveau applicatif).
- **Audit** : si vous voulez tracer les suppressions, ajoutez des triggers daudit (voir ticket Sprint 2 Audit log).
- **Performance** : chaque FK doit être **indexée côté enfant** (cf. `02_indexes.sql`).
---
## ✅ Checklist de conformité
- [ ] Toutes les FK listées existent dans la base
- [ ] Politique **ON DELETE** conforme au tableau ci-dessus
- [ ] **ON UPDATE = NO ACTION** partout
- [ ] Tests de suppression réalisés sur une base seedée
- [ ] `04_fk_policies.sql` appliqué sans erreur
---
**Mainteneur** : Équipe BDD
**Dernière mise à jour** : Sprint 1 Politique FK consolidée