2025-09-02 13:00:15 +02:00

266 lines
9.5 KiB
SQL

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');
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');
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(),
courriel VARCHAR(255) NOT NULL UNIQUE,
CHECK (courriel ~* '^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$'),
mot_de_passe_hash 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)
);
-- ==========================================================
-- Table : assistantes_maternelles
-- ==========================================================
CREATE TABLE assistantes_maternelles (
id_utilisateur UUID PRIMARY KEY REFERENCES utilisateurs(id) ON DELETE CASCADE,
numero_agrement VARCHAR(50),
date_naissance DATE,
ville_naissance VARCHAR(100),
pays_naissance CHAR(2),
nir_chiffre CHAR(15),
nb_max_enfants INT,
biographie TEXT,
disponible BOOLEAN DEFAULT true,
ville_residence VARCHAR(100)
);
-- ==========================================================
-- Table : parents
-- ==========================================================
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()
);
-- ==========================================================
-- Initialisation d'un administrateur par défaut
-- ==========================================================
INSERT INTO utilisateurs (
id,
courriel,
mot_de_passe_hash,
prenom,
nom,
role,
statut,
cree_le,
modifie_le
)
VALUES (
gen_random_uuid(),
'admin@ptitspas.com',
'motdepasse_hashé', -- ⚠️ à remplacer par le hash réel du mot de passe
'Admin',
'PtitsPas',
'super_admin',
'actif',
now(),
now()
)
ON CONFLICT (courriel) DO NOTHING;