- 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)
141 lines
4.3 KiB
SQL
141 lines
4.3 KiB
SQL
-- =============================================
|
||
-- 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)
|