ajout de script / modif d'enum et simplification du lancement en local

This commit is contained in:
951095
2025-09-19 10:22:34 +02:00
parent 4d402bb7cc
commit 80f24dce5a
25 changed files with 849 additions and 923 deletions
+89 -100
View File
@@ -1,157 +1,146 @@
# ENUMS.md — Référentiel des valeurs énumérées
# 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**, et les **tables/colonnes concernées**.
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.
> Objectif : garantir la cohérence entre la **DB**, le **backend (NestJS)** et le **frontend (Flutter)**.
> Toute évolution doit être documentée 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.
* Les valeurs ENUM sont **en minuscules** (snake\_case si nécessaire).
* Implémentées via `CREATE TYPE … AS ENUM` dans PostgreSQL.
* Les valeurs sont **renvoyées telles quelles** côté API.
---
## 1) Rôle utilisateur — `role`
## 1) Rôle utilisateur — `role_type`
**Tables/colonnes** : `utilisateurs.role`
**Valeurs autorisées** :
**Tables/colonnes** : `utilisateurs.role`
| Valeur | Description |
|---|---|
| `super_admin` | Compte technique initial / administration globale |
| `gestionnaire` | Gestion / validation des comptes, supervision |
| `parent` | Parent ou co-parent |
| `am` | Assistante maternelle |
| Valeur | Description |
| ----------------------- | ------------------------------------------------- |
| `parent` | Parent ou co-parent |
| `gestionnaire` | Gestion/validation des comptes, supervision |
| `super_admin` | Compte technique initial / administration globale |
| `assistante_maternelle` | Profil professionnel dassistante maternelle |
| `administrateur` | Administration locale / restreinte |
---
## 2) Statut utilisateur — `statut`
## 2) Genre utilisateur — `genre_type`
**Tables/colonnes** : `utilisateurs.statut`
**Valeurs autorisées** :
**Tables/colonnes** : `utilisateurs.genre`, `enfants.genre`
| Valeur | Description |
|---|---|
| `en_attente` | Compte créé mais non validé |
| `accepte` | Compte validé et actif |
| `rejete` | Demande refusée (peut être recréée ultérieurement) |
| Valeur | Description |
| ------- | ------------------- |
| `H` | Homme |
| `F` | Femme |
| `Autre` | Autre / non précisé |
---
## 3) Statut enfant — `statut`
## 3) Statut utilisateur — `statut_utilisateur_type`
**Tables/colonnes** : `enfants.statut`
**Valeurs autorisées** :
**Tables/colonnes** : `utilisateurs.statut`
| 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**
| Valeur | Description |
| ------------ | ------------------------------- |
| `en_attente` | Compte créé mais non validé |
| `actif` | Compte validé et actif |
| `suspendu` | Compte temporairement désactivé |
---
## 4) Statut dossier — `statut`
## 4) Statut enfant — `statut_enfant_type`
**Tables/colonnes** : `dossiers.statut`
**Valeurs autorisées (MVP)** :
**Tables/colonnes** : `enfants.statut`
| 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) |
| Valeur | Description |
| ----------- | ---------------------------------------------- |
| `a_naitre` | Enfant à naître (date prévue) |
| `actif` | Enfant pris en charge |
| `scolarise` | Enfant scolarisé (garde périscolaire possible) |
---
## 5) Statut contrat — `statut`
## 5) Statut dossier — `statut_dossier_type`
**Tables/colonnes** : `contrats.statut`
**Valeurs autorisées** :
**Tables/colonnes** : `dossiers.statut`
| Valeur | Description |
|---|---|
| `brouillon` | Contrat en préparation |
| `valide` | Contrat finalisé (signatures complètes) |
| `archive` | Contrat obsolète / terminé |
| Valeur | Description |
| --------- | ---------------------------- |
| `envoye` | Dossier soumis par le parent |
| `accepte` | Dossier validé par lAM |
| `refuse` | Dossier rejeté |
---
## 6) Statut avenant — `statut`
## 6) Statut contrat — `statut_contrat_type`
**Tables/colonnes** : `avenants_contrats.statut`
**Valeurs autorisées** :
**Tables/colonnes** : `contrats.statut`
| Valeur | Description |
|---|---|
| `propose` | Avenant proposé (en attente daccord) |
| `valide` | Avenant accepté et appliqué |
| `rejete` | Avenant refusé |
| Valeur | Description |
| ---------------------- | ----------------------------------------- |
| `brouillon` | Contrat en préparation |
| `en_attente_signature` | Contrat généré, en attente des signatures |
| `valide` | Contrat signé et actif |
| `resilie` | Contrat résilié |
---
## 7) Type d’événement — `type`
## 7) Statut avenant — `statut_avenant_type`
**Tables/colonnes** : `evenements.type`
**Valeurs autorisées** :
**Tables/colonnes** : `avenants_contrats.statut`
| 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 |
| Valeur | Description |
| --------- | --------------------------- |
| `propose` | Avenant proposé |
| `accepte` | Avenant accepté et appliqué |
| `refuse` | Avenant rejeté |
---
## 8) Statut d’événement — `statut`
## 8) Type d’événement — `type_evenement_type`
**Tables/colonnes** : `evenements.statut`
**Valeurs autorisées** :
**Tables/colonnes** : `evenements.type`
| Valeur | Description |
|---|---|
| Valeur | Description |
| ------------------ | -------------------------------- |
| `absence_enfant` | Absence de lenfant |
| `conge_am` | Congé de lassistante maternelle |
| `conge_parent` | Congé du parent |
| `arret_maladie_am` | Arrêt maladie de lAM |
| `evenement_rpe` | Événement organisé par le RPE |
---
## 9) Statut d’événement — `statut_evenement_type`
**Tables/colonnes** : `evenements.statut`
| Valeur | Description |
| --------- | ----------------- |
| `propose` | Événement proposé |
| `valide` | Événement validé |
| `rejete` | Événement refusé |
| `valide` | Événement validé |
| `refuse` | Événement rejeté |
---
## 9) Statut de validation compte — `statut`
## 10) Statut validation — `statut_validation_type`
**Tables/colonnes** : `validations.statut`
**Valeurs autorisées** :
**Tables/colonnes** : `validations.statut`
| Valeur | Description |
|---|---|
| `accepte` | Compte validé |
| `rejete` | Compte refusé |
| Valeur | Description |
| ------------ | ------------------------ |
| `en_attente` | En attente de validation |
| `valide` | Validation acceptée |
| `refuse` | Validation refusée |
---
## 10) Type de notification — `type`
📌 **Mainteneur** : Équipe BDD
📌 **Dernière mise à jour** : alignée sur `init.sql` (septembre 2025)
**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)
---
+107 -105
View File
@@ -1,142 +1,144 @@
# FK\_POLICIES.md — Politiques de clés étrangères
# FK_POLICIES.md
**Politique des clés étrangères (ON DELETE / ON UPDATE)** Sprint 1
Ce document recense lensemble des **relations entre tables** dans la base **PtitsPas**, avec leurs **règles de suppression** et les implications fonctionnelles.
## 🎯 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.
> Objectif : assurer la cohérence entre la **DB**, le **backend** et le **fonctionnel métier**.
> Toute nouvelle relation ou modification doit être ajoutée ici avant migration DB.
---
## 🧭 Principes généraux
## Conventions générales
- **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.
* Les FK sont définies en `REFERENCES ...`.
* Sauf précision, `ON UPDATE` est implicite = `NO ACTION`.
* Les comportements documentés sont **côté PostgreSQL**.
---
## 📚 Récapitulatif rapide (matrice)
## 1) Table `assistantes_maternelles`
| 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).
* **FK** : `id_utilisateur → utilisateurs.id`
* **ON DELETE CASCADE**
* 🔎 Si un utilisateur AM est supprimé, son profil AM est supprimé automatiquement.
---
## 🔎 Détail par domaine
## 2) Table `parents`
### 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é)
* **FK** : `id_utilisateur → utilisateurs.id`
### Enfants & liaisons
- `enfants_parents.id_parent`**CASCADE**
- `enfants_parents.id_enfant`**CASCADE**
* **ON DELETE CASCADE** → suppression dun parent entraîne suppression automatique du parent.
* **FK** : `id_co_parent → utilisateurs.id`
### 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**
* **ON DELETE NO ACTION** (par défaut) → suppression du co-parent interdite si référence active.
---
## 🧪 Scénarios de test (exemples)
## 3) Table `enfants_parents`
1. **Suppression dun parent**
- Supprimer `utilisateurs(id=parentX)`
- Attendu : `parents` (CASCADE), ses `dossiers` (CASCADE), `messages` liés aux `dossiers` (CASCADE) sont supprimés.
* **FK** : `id_parent → parents.id_utilisateur`
2. **Suppression dun co-parent**
- Supprimer `utilisateurs(id=coParentY)`
- Attendu : `parents.id_co_parent` passe à **NULL**, aucun dossier supprimé.
* **ON DELETE CASCADE** → si le parent est supprimé, le lien avec lenfant disparaît.
* **FK** : `id_enfant → enfants.id`
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é).
* **ON DELETE CASCADE** → si lenfant est supprimé, toutes ses associations avec des parents disparaissent.
---
## 🛠 Migrations associées
## 4) Table `dossiers`
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.
* **FK** : `id_parent → parents.id_utilisateur`
* **ON DELETE CASCADE** → si le parent est supprimé, ses dossiers disparaissent.
* **FK** : `id_enfant → enfants.id`
* **ON DELETE CASCADE** → si lenfant est supprimé, les dossiers liés disparaissent.
---
## 📄 Notes & futures évolutions
## 5) Table `messages`
- **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`).
* **FK** : `id_dossier → dossiers.id`
* **ON DELETE CASCADE** → si un dossier est supprimé, les messages disparaissent.
* **FK** : `id_expediteur → utilisateurs.id`
* **ON DELETE CASCADE** → si un utilisateur est supprimé, ses messages disparaissent.
---
## ✅ Checklist de conformité
## 6) Table `contrats`
- [ ] 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
* **FK** : `id_dossier → dossiers.id`
* **UNIQUE** + **ON DELETE CASCADE** → si un dossier est supprimé, le contrat disparaît.
---
**Mainteneur** : Équipe BDD
**Dernière mise à jour** : Sprint 1 Politique FK consolidée
## 7) Table `avenants_contrats`
* **FK** : `id_contrat → contrats.id`
* **ON DELETE CASCADE** → si un contrat est supprimé, ses avenants disparaissent.
* **FK** : `initie_par → utilisateurs.id`
* **ON DELETE NO ACTION** → suppression interdite tant que des avenants existent.
---
## 8) Table `evenements`
* **FK** : `id_enfant → enfants.id`
* **ON DELETE CASCADE** → si un enfant est supprimé, ses événements disparaissent.
* **FK** : `id_am → utilisateurs.id`
* **ON DELETE NO ACTION** → suppression interdite si des événements liés.
* **FK** : `id_parent → parents.id_utilisateur`
* **ON DELETE NO ACTION** → suppression interdite si des événements liés.
* **FK** : `cree_par → utilisateurs.id`
* **ON DELETE NO ACTION** → suppression interdite si référence encore utilisée.
---
## 9) Table `signalements_bugs`
* **FK** : `id_utilisateur → utilisateurs.id`
* **ON DELETE NO ACTION** → utilisateur non supprimable si bug référencé.
---
## 10) Table `uploads`
* **FK** : `id_utilisateur → utilisateurs.id`
* **ON DELETE SET NULL** → si un utilisateur est supprimé, ses fichiers restent, mais sans lien utilisateur.
---
## 11) Table `notifications`
* **FK** : `id_utilisateur → utilisateurs.id`
* **ON DELETE CASCADE** → si un utilisateur est supprimé, ses notifications disparaissent.
---
## 12) Table `validations`
* **FK** : `id_utilisateur → utilisateurs.id`
* **ON DELETE NO ACTION** → suppression interdite si validations liées.
* **FK** : `valide_par → utilisateurs.id`
* **ON DELETE NO ACTION** → suppression interdite si validations effectuées par lutilisateur.
---
📌 **Mainteneur** : Équipe BDD
📌 **Dernière mise à jour** : alignée sur `init.sql` (septembre 2025)
---