From c0193ff4bb58ae717d2de5daf1db284fa0142a47 Mon Sep 17 00:00:00 2001 From: vdorge Date: Mon, 25 Aug 2025 10:23:02 +0000 Subject: [PATCH] Ajouter migrations/03_checks.sql --- migrations/03_checks.sql | 140 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 migrations/03_checks.sql diff --git a/migrations/03_checks.sql b/migrations/03_checks.sql new file mode 100644 index 0000000..9d1e159 --- /dev/null +++ b/migrations/03_checks.sql @@ -0,0 +1,140 @@ +-- ============================================= +-- 03_checks.sql : Contraintes CHECK & NOT NULL +-- A exécuter après 01_init.sql (et 02_indexes.sql) +-- ============================================= + +-- ============== +-- UTILISATEURS +-- ============== +-- (Regex email déjà présente dans 01_init.sql) +-- Optionnel : forcer prenom/nom non vides si fournis +ALTER TABLE utilisateurs + ADD CONSTRAINT chk_utilisateurs_prenom_non_vide + CHECK (prenom IS NULL OR btrim(prenom) <> ''), + ADD CONSTRAINT chk_utilisateurs_nom_non_vide + CHECK (nom IS NULL OR btrim(nom) <> ''); + +-- ========================= +-- ASSISTANTES_MATERNELLES +-- ========================= +-- NIR : aujourd’hui en 15 chiffres (Sprint 2 : chiffrement) +ALTER TABLE assistantes_maternelles + ADD CONSTRAINT chk_am_nir_format + CHECK (nir_chiffre IS NULL OR nir_chiffre ~ '^[0-9]{15}$'), + ADD CONSTRAINT chk_am_nb_max_enfants + CHECK (nb_max_enfants IS NULL OR nb_max_enfants BETWEEN 0 AND 10), + ADD CONSTRAINT chk_am_ville_non_vide + CHECK (ville_residence IS NULL OR btrim(ville_residence) <> ''); + +-- ========= +-- PARENTS +-- ========= +-- Interdiction d’être co-parent de soi-même +ALTER TABLE parents + ADD CONSTRAINT chk_parents_co_parent_diff + CHECK (id_co_parent IS NULL OR id_co_parent <> id_utilisateur); + +-- ========= +-- ENFANTS +-- ========= +-- Cohérence statut / dates de naissance +ALTER TABLE enfants + ADD CONSTRAINT chk_enfants_dates_exclusives + CHECK (NOT (date_naissance IS NOT NULL AND date_prevue_naissance IS NOT NULL)), + ADD CONSTRAINT chk_enfants_statut_dates + CHECK ( + -- a_naitre => date_prevue_naissance requise + (statut = 'a_naitre' AND date_prevue_naissance IS NOT NULL) + OR + -- actif/scolarise => date_naissance requise + (statut IN ('actif','scolarise') AND date_naissance IS NOT NULL) + OR statut IS NULL -- si statut non encore fixé + ), + ADD CONSTRAINT chk_enfants_consentement_coherent + CHECK ( + (consentement_photo = true AND date_consentement_photo IS NOT NULL) + OR + (consentement_photo = false AND date_consentement_photo IS NULL) + ); + +-- ================= +-- ENFANTS_PARENTS +-- ================= +-- (PK composite déjà en place, rien à ajouter ici) + +-- ======== +-- DOSSIERS +-- ======== +ALTER TABLE dossiers + ADD CONSTRAINT chk_dossiers_budget_nonneg + CHECK (budget IS NULL OR budget >= 0), + ADD CONSTRAINT chk_dossiers_type_contrat_non_vide + CHECK (type_contrat IS NULL OR btrim(type_contrat) <> ''), + ADD CONSTRAINT chk_dossiers_planning_json + CHECK (planning_souhaite IS NULL OR jsonb_typeof(planning_souhaite) = 'object'); + +-- ======== +-- MESSAGES +-- ======== +-- Contenu obligatoire, non vide +ALTER TABLE messages + ALTER COLUMN contenu SET NOT NULL; +ALTER TABLE messages + ADD CONSTRAINT chk_messages_contenu_non_vide + CHECK (btrim(contenu) <> ''); + +-- ========= +-- CONTRATS +-- ========= +ALTER TABLE contrats + ADD CONSTRAINT chk_contrats_tarif_nonneg + CHECK (tarif_horaire IS NULL OR tarif_horaire >= 0), + ADD CONSTRAINT chk_contrats_indemnites_nonneg + CHECK (indemnites_repas IS NULL OR indemnites_repas >= 0); + +-- ================== +-- AVENANTS_CONTRATS +-- ================== +-- Rien de spécifique (statut enum déjà en place) + +-- ========= +-- EVENEMENTS +-- ========= +ALTER TABLE evenements + ADD CONSTRAINT chk_evenements_dates_coherentes + CHECK (date_fin IS NULL OR date_debut IS NULL OR date_fin >= date_debut); + +-- ================= +-- SIGNALEMENTS_BUGS +-- ================= +-- Description obligatoire, non vide +ALTER TABLE signalements_bugs + ALTER COLUMN description SET NOT NULL; +ALTER TABLE signalements_bugs + ADD CONSTRAINT chk_bugs_description_non_vide + CHECK (btrim(description) <> ''); + +-- ======= +-- UPLOADS +-- ======= +-- URL obligatoire + format basique (chemin absolu ou http(s)) +ALTER TABLE uploads + ALTER COLUMN fichier_url SET NOT NULL; +ALTER TABLE uploads + ADD CONSTRAINT chk_uploads_url_format + CHECK (fichier_url ~ '^(https?://.+|/[^\\s]+)$'); + +-- ============= +-- NOTIFICATIONS +-- ============= +-- Contenu obligatoire, non vide +ALTER TABLE notifications + ALTER COLUMN contenu SET NOT NULL; +ALTER TABLE notifications + ADD CONSTRAINT chk_notifications_contenu_non_vide + CHECK (btrim(contenu) <> ''); + +-- =========== +-- VALIDATIONS +-- =========== +-- Rien de plus ici (Sprint 1 Ticket 8 enrichira la table)