CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- ========================================================== -- ENUMS -- ========================================================== DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'role_type') THEN CREATE TYPE role_type AS ENUM ('parent', 'gestionnaire', 'super_admin', 'assistante_maternelle','administrateur'); END IF; IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'genre_type') THEN CREATE TYPE genre_type AS ENUM ('H', 'F', 'Autre'); END IF; IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_utilisateur_type') THEN CREATE TYPE statut_utilisateur_type AS ENUM ('en_attente','actif','suspendu'); END IF; IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_enfant_type') THEN CREATE TYPE statut_enfant_type AS ENUM ('a_naitre','actif','scolarise'); END IF; IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_dossier_type') THEN CREATE TYPE statut_dossier_type AS ENUM ('envoye','accepte','refuse', 'cloture'); END IF; IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_contrat_type') THEN CREATE TYPE statut_contrat_type AS ENUM ('brouillon','en_attente_signature','valide','resilie'); END IF; IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_avenant_type') THEN CREATE TYPE statut_avenant_type AS ENUM ('propose','accepte','refuse'); END IF; IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'type_evenement_type') THEN CREATE TYPE type_evenement_type AS ENUM ('absence_enfant','conge_am','conge_parent','arret_maladie_am','evenement_rpe'); END IF; IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_evenement_type') THEN CREATE TYPE statut_evenement_type AS ENUM ('propose','valide','refuse'); END IF; IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_validation_type') THEN CREATE TYPE statut_validation_type AS ENUM ('en_attente','valide','refuse'); END IF; END $$; -- ========================================================== -- Table : utilisateurs -- ========================================================== CREATE TABLE utilisateurs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email VARCHAR(255) NOT NULL UNIQUE, CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'), password TEXT NOT NULL, prenom VARCHAR(100), nom VARCHAR(100), genre genre_type, role role_type NOT NULL, statut statut_utilisateur_type DEFAULT 'en_attente', telephone VARCHAR(20), adresse TEXT, photo_url TEXT, consentement_photo BOOLEAN DEFAULT false, date_consentement_photo TIMESTAMPTZ, changement_mdp_obligatoire BOOLEAN DEFAULT false, cree_le TIMESTAMPTZ DEFAULT now(), modifie_le TIMESTAMPTZ DEFAULT now(), ville VARCHAR(150), code_postal VARCHAR(10), mobile VARCHAR(20), telephone_fixe VARCHAR(20), profession VARCHAR(150), situation_familiale VARCHAR(50), date_naissance DATE ); -- ========================================================== -- Table : assistantes_maternelles -- ========================================================== CREATE TABLE assistantes_maternelles ( id_utilisateur UUID PRIMARY KEY REFERENCES utilisateurs(id) ON DELETE CASCADE, numero_agrement VARCHAR(50), nir_chiffre CHAR(15), nb_max_enfants INT, biographie TEXT, disponible BOOLEAN DEFAULT true, ville_residence VARCHAR(100), date_agrement DATE, annee_experience SMALLINT, specialite VARCHAR(100), place_disponible INT ); -- ========================================================== -- Table : parentschange les donnée de init -- ========================================================== CREATE TABLE parents ( id_utilisateur UUID PRIMARY KEY REFERENCES utilisateurs(id) ON DELETE CASCADE, id_co_parent UUID REFERENCES utilisateurs(id) ); -- ========================================================== -- Table : enfants -- ========================================================== CREATE TABLE enfants ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), statut statut_enfant_type, prenom VARCHAR(100), nom VARCHAR(100), genre genre_type, date_naissance DATE, date_prevue_naissance DATE, photo_url TEXT, consentement_photo BOOLEAN DEFAULT false, date_consentement_photo TIMESTAMPTZ, est_multiple BOOLEAN DEFAULT false ); -- ========================================================== -- Table : enfants_parents -- ========================================================== CREATE TABLE enfants_parents ( id_parent UUID REFERENCES parents(id_utilisateur) ON DELETE CASCADE, id_enfant UUID REFERENCES enfants(id) ON DELETE CASCADE, PRIMARY KEY (id_parent, id_enfant) ); -- ========================================================== -- Table : dossiers -- ========================================================== CREATE TABLE dossiers ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id_parent UUID REFERENCES parents(id_utilisateur) ON DELETE CASCADE, id_enfant UUID REFERENCES enfants(id) ON DELETE CASCADE, presentation TEXT, type_contrat VARCHAR(50), repas BOOLEAN DEFAULT false, budget NUMERIC(10,2), planning_souhaite JSONB, statut statut_dossier_type DEFAULT 'envoye', cree_le TIMESTAMPTZ DEFAULT now(), modifie_le TIMESTAMPTZ DEFAULT now() ); -- ========================================================== -- Table : messages -- ========================================================== CREATE TABLE messages ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id_dossier UUID REFERENCES dossiers(id) ON DELETE CASCADE, id_expediteur UUID REFERENCES utilisateurs(id) ON DELETE CASCADE, contenu TEXT, re_redige_par_ia BOOLEAN DEFAULT false, cree_le TIMESTAMPTZ DEFAULT now() ); -- ========================================================== -- Table : contrats -- ========================================================== CREATE TABLE contrats ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id_dossier UUID UNIQUE REFERENCES dossiers(id) ON DELETE CASCADE, planning JSONB, tarif_horaire NUMERIC(6,2), indemnites_repas NUMERIC(6,2), date_debut DATE, statut statut_contrat_type DEFAULT 'brouillon', signe_parent BOOLEAN DEFAULT false, signe_am BOOLEAN DEFAULT false, finalise_le TIMESTAMPTZ, cree_le TIMESTAMPTZ DEFAULT now(), modifie_le TIMESTAMPTZ DEFAULT now() ); -- ========================================================== -- Table : avenants_contrats -- ========================================================== CREATE TABLE avenants_contrats ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id_contrat UUID REFERENCES contrats(id) ON DELETE CASCADE, modifications JSONB, initie_par UUID REFERENCES utilisateurs(id), statut statut_avenant_type DEFAULT 'propose', cree_le TIMESTAMPTZ DEFAULT now(), modifie_le TIMESTAMPTZ DEFAULT now() ); -- ========================================================== -- Table : evenements -- ========================================================== CREATE TABLE evenements ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), type type_evenement_type, id_enfant UUID REFERENCES enfants(id) ON DELETE CASCADE, id_am UUID REFERENCES utilisateurs(id), id_parent UUID REFERENCES parents(id_utilisateur), cree_par UUID REFERENCES utilisateurs(id), date_debut TIMESTAMPTZ, date_fin TIMESTAMPTZ, commentaires TEXT, statut statut_evenement_type DEFAULT 'propose', delai_grace TIMESTAMPTZ, urgent BOOLEAN DEFAULT false, cree_le TIMESTAMPTZ DEFAULT now(), modifie_le TIMESTAMPTZ DEFAULT now() ); -- ========================================================== -- Table : signalements_bugs -- ========================================================== CREATE TABLE signalements_bugs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id_utilisateur UUID REFERENCES utilisateurs(id), description TEXT, cree_le TIMESTAMPTZ DEFAULT now() ); -- ========================================================== -- Table : uploads -- ========================================================== CREATE TABLE uploads ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id_utilisateur UUID REFERENCES utilisateurs(id) ON DELETE SET NULL, fichier_url TEXT NOT NULL, type VARCHAR(50), cree_le TIMESTAMPTZ DEFAULT now() ); -- ========================================================== -- Table : notifications -- ========================================================== CREATE TABLE notifications ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id_utilisateur UUID REFERENCES utilisateurs(id) ON DELETE CASCADE, contenu TEXT, lu BOOLEAN DEFAULT false, cree_le TIMESTAMPTZ DEFAULT now() ); -- ========================================================== -- Table : validations -- ========================================================== CREATE TABLE validations ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id_utilisateur UUID REFERENCES utilisateurs(id), type VARCHAR(50), statut statut_validation_type DEFAULT 'en_attente', cree_le TIMESTAMPTZ DEFAULT now(), modifie_le TIMESTAMPTZ DEFAULT now(), valide_par UUID REFERENCES utilisateurs(id), commentaire TEXT ); -- ========================================================== -- Initialisation d'un administrateur par défaut -- ========================================================== INSERT INTO utilisateurs ( id, email, password, prenom, nom, role, statut, cree_le, modifie_le ) VALUES ( gen_random_uuid(), 'admin@ptits-pas.fr', 'admin123', -- ⚠️ à remplacer par le hash réel du mot de passe 'Admin', 'PtitsPas', 'super_admin', 'actif', now(), now() ) ON CONFLICT (email) DO NOTHING;