Propagation depuis develop. Co-authored-by: Julien Martin <julien.martin@ptits-pas.fr>
86 lines
3.3 KiB
SQL
86 lines
3.3 KiB
SQL
-- Ticket #193 — Back métier absences / congés / arrêt (périodes par placement)
|
|
-- Idempotent : safe à rejouer.
|
|
-- Remplace la table legacy `evenements` (mal conçue, non utilisée en API).
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- Enums
|
|
-- ---------------------------------------------------------------------------
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'type_absence_garde_type') THEN
|
|
CREATE TYPE type_absence_garde_type AS ENUM (
|
|
'absence_enfant',
|
|
'conge_am',
|
|
'arret_maladie_am'
|
|
);
|
|
END IF;
|
|
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_absence_garde_type') THEN
|
|
CREATE TYPE statut_absence_garde_type AS ENUM (
|
|
'en_attente',
|
|
'accepte',
|
|
'refuse'
|
|
);
|
|
END IF;
|
|
END $$;
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- Table absences_garde (1 ligne = 1 période)
|
|
-- ---------------------------------------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS absences_garde (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
id_placement UUID NOT NULL
|
|
REFERENCES enfants_assistantes_maternelles(id) ON DELETE CASCADE,
|
|
type type_absence_garde_type NOT NULL,
|
|
date_debut DATE NOT NULL,
|
|
date_fin DATE NOT NULL,
|
|
statut statut_absence_garde_type NOT NULL DEFAULT 'en_attente',
|
|
-- TTL purge : obligatoire ; pour statut=accepte utiliser 'infinity' (pas de purge métier)
|
|
expire_at TIMESTAMPTZ NOT NULL,
|
|
cree_par UUID REFERENCES utilisateurs(id) ON DELETE SET NULL,
|
|
id_card_instance UUID NULL,
|
|
motif TEXT,
|
|
cree_le TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
modifie_le TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
CONSTRAINT chk_absences_garde_dates CHECK (date_fin >= date_debut)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_absences_garde_placement_dates
|
|
ON absences_garde (id_placement, date_debut, date_fin);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_absences_garde_placement_type_statut
|
|
ON absences_garde (id_placement, type, statut);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_absences_garde_expire_at
|
|
ON absences_garde (expire_at)
|
|
WHERE statut IN ('en_attente', 'refuse');
|
|
|
|
COMMENT ON TABLE absences_garde IS
|
|
'Vérité métier des absences/congés/arrêts par couple AM↔enfant (placement). Les cartes collectent ; cette table stocke.';
|
|
COMMENT ON COLUMN absences_garde.expire_at IS
|
|
'Purge auto (job ultérieur) pour en_attente/refuse. accepte → infinity.';
|
|
COMMENT ON COLUMN absences_garde.id_card_instance IS
|
|
'Réf. carte de collecte (FK cards quand le module Cartes existera).';
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
-- Drop legacy evenements (+ enums si plus référencés)
|
|
-- ---------------------------------------------------------------------------
|
|
DROP TABLE IF EXISTS evenements CASCADE;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM pg_type WHERE typname = 'type_evenement_type')
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM information_schema.columns
|
|
WHERE udt_name = 'type_evenement_type'
|
|
) THEN
|
|
DROP TYPE type_evenement_type;
|
|
END IF;
|
|
IF EXISTS (SELECT 1 FROM pg_type WHERE typname = 'statut_evenement_type')
|
|
AND NOT EXISTS (
|
|
SELECT 1 FROM information_schema.columns
|
|
WHERE udt_name = 'statut_evenement_type'
|
|
) THEN
|
|
DROP TYPE statut_evenement_type;
|
|
END IF;
|
|
END $$;
|