--
-- BEGIN - [#10410] - Rendre la nature de l'emplacement paramétrable
--

--
-- Table: nature_emplacement
--
CREATE TABLE IF NOT EXISTS nature_emplacement (
    nature_emplacement integer NOT NULL,
    code character varying(20) NOT NULL,
    libelle character varying(100) NOT NULL,
    description character varying(255),
    archivage boolean DEFAULT false NOT NULL,
    inhumations boolean DEFAULT true NOT NULL,
    reductions boolean DEFAULT true NOT NULL,
    om_validite_debut date,
    om_validite_fin date,
    -- Sous-formulaires affichables
    sf_defunt boolean DEFAULT true NOT NULL,
    sf_autorisation boolean DEFAULT true NOT NULL,
    sf_reprise_abandon boolean DEFAULT true NOT NULL,
    sf_genealogie boolean DEFAULT true NOT NULL,
    sf_contrat boolean DEFAULT true NOT NULL,
    sf_courrier boolean DEFAULT true NOT NULL,
    sf_operation_trt boolean DEFAULT true NOT NULL,
    sf_travaux boolean DEFAULT true NOT NULL,
    sf_dossier boolean DEFAULT true NOT NULL,
    -- Blocs d'affichage dans les vues Twig
    bloc_acte boolean DEFAULT true NOT NULL,
    bloc_bati boolean DEFAULT true NOT NULL,
    bloc_place boolean DEFAULT true NOT NULL,
    bloc_abandon boolean DEFAULT true NOT NULL
);

--
-- Commentaires sur la table nature_emplacement
--
COMMENT ON TABLE nature_emplacement IS 'Natures d''emplacement paramétrables (concession, colombarium, enfeu, etc.)';
COMMENT ON COLUMN nature_emplacement.nature_emplacement IS 'Identifiant unique de la nature d''emplacement';
COMMENT ON COLUMN nature_emplacement.code IS 'Code de la nature d''emplacement (utilisé dans le code de l''application)';
COMMENT ON COLUMN nature_emplacement.libelle IS 'Libellé de la nature d''emplacement';
COMMENT ON COLUMN nature_emplacement.description IS 'Description détaillée de la nature d''emplacement';
COMMENT ON COLUMN nature_emplacement.archivage IS 'Indique si cette nature d''emplacement permet l''archivage';
COMMENT ON COLUMN nature_emplacement.inhumations IS 'Indique si cette nature d''emplacement permet les inhumations';
COMMENT ON COLUMN nature_emplacement.reductions IS 'Indique si cette nature d''emplacement permet les réductions';
COMMENT ON COLUMN nature_emplacement.om_validite_debut IS 'Date de début de validité';
COMMENT ON COLUMN nature_emplacement.om_validite_fin IS 'Date de fin de validité';
COMMENT ON COLUMN nature_emplacement.sf_defunt IS 'Afficher le sous-formulaire Défunt';
COMMENT ON COLUMN nature_emplacement.sf_autorisation IS 'Afficher le sous-formulaire Autorisation (Contacts)';
COMMENT ON COLUMN nature_emplacement.sf_reprise_abandon IS 'Afficher le sous-formulaire Reprise sur abandon';
COMMENT ON COLUMN nature_emplacement.sf_genealogie IS 'Afficher le sous-formulaire Généalogie';
COMMENT ON COLUMN nature_emplacement.sf_contrat IS 'Afficher le sous-formulaire Contrat';
COMMENT ON COLUMN nature_emplacement.sf_courrier IS 'Afficher le sous-formulaire Courrier';
COMMENT ON COLUMN nature_emplacement.sf_operation_trt IS 'Afficher le sous-formulaire Opération';
COMMENT ON COLUMN nature_emplacement.sf_travaux IS 'Afficher le sous-formulaire Travaux';
COMMENT ON COLUMN nature_emplacement.sf_dossier IS 'Afficher le sous-formulaire Dossier';
COMMENT ON COLUMN nature_emplacement.bloc_acte IS 'Afficher le bloc Acte de concession dans la vue';
COMMENT ON COLUMN nature_emplacement.bloc_bati IS 'Afficher le bloc Bâti dans la vue';
COMMENT ON COLUMN nature_emplacement.bloc_place IS 'Afficher le bloc Gestion de la place dans la vue';
COMMENT ON COLUMN nature_emplacement.bloc_abandon IS 'Afficher le bloc Abandon dans la vue';

--
-- Séquence pour nature_emplacement
--
CREATE SEQUENCE IF NOT EXISTS nature_emplacement_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

ALTER SEQUENCE nature_emplacement_seq OWNED BY nature_emplacement.nature_emplacement;

--
-- Contrainte de clé primaire sur nature_emplacement
--
ALTER TABLE ONLY nature_emplacement
    DROP CONSTRAINT IF EXISTS nature_emplacement_pkey,
    ADD CONSTRAINT nature_emplacement_pkey PRIMARY KEY (nature_emplacement);

--
-- Contrainte d'unicité sur le code
--
ALTER TABLE ONLY nature_emplacement
    DROP CONSTRAINT IF EXISTS nature_emplacement_code_unique,
    ADD CONSTRAINT nature_emplacement_code_unique UNIQUE (code);

--
-- Insertion des natures d'emplacement par défaut
--
INSERT INTO nature_emplacement (
    nature_emplacement, code, libelle, description, 
    archivage, inhumations, reductions,
    sf_defunt, sf_autorisation, sf_reprise_abandon, sf_genealogie, 
    sf_contrat, sf_courrier, sf_operation_trt, sf_travaux, sf_dossier,
    bloc_acte, bloc_bati, bloc_place, bloc_abandon
) VALUES
(1, 'concession', 'Concession', 'Concession funéraire', 
    true, true, true,
    true, true, true, true, true, true, true, true, true,
    true, true, true, true),
(2, 'colombarium', 'Colombarium', 'Colombarium', 
    true, true, true,
    true, true, true, true, true, true, true, true, true,
    true, true, true, true),
(3, 'enfeu', 'Enfeu', 'Enfeu', 
    true, true, true,
    true, true, true, true, true, true, true, true, true,
    true, false, true, false),
(4, 'terraincommunal', 'Terrain communal', 'Terrain communal', 
    true, true, false,
    true, true, true, true, true, true, true, true, true,
    true, false, true, false),
(5, 'depositoire', 'Dépositoire', 'Dépositoire', 
    false, true, false,
    true, true, false, false, false, true, true, false, true,
    true, false, false, false),
(6, 'ossuaire', 'Ossuaire', 'Ossuaire', 
    false, false, false,
    false, false, false, false, false, true, false, false, true,
    true, false, false, false);

--
-- Mise à jour de la séquence
--
SELECT setval('nature_emplacement_seq', (SELECT MAX(nature_emplacement) FROM nature_emplacement));

--
-- Modification du champ nature existant dans la table emplacement
-- On transforme le champ nature de type character varying(20) en integer
-- pour pouvoir référencer la table nature_emplacement
--

-- Étape 1: Ajouter temporairement une colonne nature_temp pour stocker les valeurs converties
ALTER TABLE emplacement ADD COLUMN IF NOT EXISTS nature_temp integer;
ALTER TABLE emplacement_archive ADD COLUMN IF NOT EXISTS nature_temp integer;

-- Étape 2: Migration des données de l'ancienne colonne nature (varchar) vers nature_temp (integer)
UPDATE emplacement SET nature_temp = 1 WHERE LOWER(nature) = 'concession';
UPDATE emplacement SET nature_temp = 2 WHERE LOWER(nature) = 'colombarium';
UPDATE emplacement SET nature_temp = 3 WHERE LOWER(nature) = 'enfeu';
UPDATE emplacement SET nature_temp = 4 WHERE LOWER(nature) = 'terraincommunal' OR LOWER(nature) = 'terrain communal';
UPDATE emplacement SET nature_temp = 5 WHERE LOWER(nature) = 'depositoire' OR LOWER(nature) = 'dépositoire';
UPDATE emplacement SET nature_temp = 6 WHERE LOWER(nature) = 'ossuaire';

UPDATE emplacement_archive SET nature_temp = 1 WHERE LOWER(nature) = 'concession';
UPDATE emplacement_archive SET nature_temp = 2 WHERE LOWER(nature) = 'colombarium';
UPDATE emplacement_archive SET nature_temp = 3 WHERE LOWER(nature) = 'enfeu';
UPDATE emplacement_archive SET nature_temp = 4 WHERE LOWER(nature) = 'terraincommunal' OR LOWER(nature) = 'terrain communal';
UPDATE emplacement_archive SET nature_temp = 5 WHERE LOWER(nature) = 'depositoire' OR LOWER(nature) = 'dépositoire';
UPDATE emplacement_archive SET nature_temp = 6 WHERE LOWER(nature) = 'ossuaire';

-- Étape 3: Supprimer l'ancienne colonne nature
ALTER TABLE emplacement DROP COLUMN IF EXISTS nature;
ALTER TABLE emplacement_archive DROP COLUMN IF EXISTS nature;

-- Étape 4: Renommer la colonne temporaire en nature
ALTER TABLE emplacement RENAME COLUMN nature_temp TO nature;
ALTER TABLE emplacement_archive RENAME COLUMN nature_temp TO nature;

--
-- Commentaires sur le champ nature modifié
--
COMMENT ON COLUMN emplacement.nature IS 'Référence vers la nature de l''emplacement paramétrable';
COMMENT ON COLUMN emplacement_archive.nature IS 'Référence vers la nature de l''emplacement paramétrable';

--
-- Contrainte de clé étrangère entre emplacement et nature_emplacement
--
ALTER TABLE ONLY emplacement
    DROP CONSTRAINT IF EXISTS emplacement_nature_fkey,
    ADD CONSTRAINT emplacement_nature_fkey 
        FOREIGN KEY (nature) 
        REFERENCES nature_emplacement(nature_emplacement);

--
-- Modification de la table tarif pour lier à nature_emplacement
-- On transforme le champ nature de type character varying(15) en integer
--

-- Étape 1: Ajouter temporairement une colonne nature_temp pour stocker les valeurs converties
ALTER TABLE tarif ADD COLUMN IF NOT EXISTS nature_temp integer;

-- Étape 2: Migration des données de l'ancienne colonne nature (varchar) vers nature_temp (integer)
UPDATE tarif SET nature_temp = 1 WHERE LOWER(nature) = 'concession';
UPDATE tarif SET nature_temp = 2 WHERE LOWER(nature) = 'colombarium';
UPDATE tarif SET nature_temp = 3 WHERE LOWER(nature) = 'enfeu';
UPDATE tarif SET nature_temp = 4 WHERE LOWER(nature) = 'terraincommunal' OR LOWER(nature) = 'terrain communal';

-- Étape 3: Suppression de la contrainte check sur nature dans la table tarif
ALTER TABLE tarif DROP CONSTRAINT IF EXISTS check_tarif_nature;

-- Étape 4: Supprimer l'ancienne colonne nature
ALTER TABLE tarif DROP COLUMN IF EXISTS nature;

-- Étape 5: Renommer la colonne temporaire en nature
ALTER TABLE tarif RENAME COLUMN nature_temp TO nature;

--
-- Commentaire sur le champ nature de tarif
--
COMMENT ON COLUMN tarif.nature IS 'Référence vers la nature de l''emplacement paramétrable';

--
-- Contrainte de clé étrangère entre tarif et nature_emplacement
--
ALTER TABLE ONLY tarif
    DROP CONSTRAINT IF EXISTS tarif_nature_fkey,
    ADD CONSTRAINT tarif_nature_fkey 
        FOREIGN KEY (nature) 
        REFERENCES nature_emplacement(nature_emplacement);

--
-- END - [#10410] - Rendre la nature de l'emplacement paramétrable
--
