-- MàJ de la version en BDD
UPDATE om_version SET om_version = '6.6.0' WHERE exists(SELECT 1 FROM om_version) = true;
INSERT INTO om_version
SELECT ('6.6.0') WHERE exists(SELECT 1 FROM om_version) = false;

--
-- BEGIN / [#10383] Corriger la taille du champ `consultation.dossier` pour que ça corresponde à la taille du champ `dossier.dossier`
--
ALTER TABLE ONLY consultation 
    ALTER COLUMN dossier TYPE character varying(255);
--
-- END / [#10383] Corriger la taille du champ `consultation.dossier` pour que ça corresponde à la taille du champ `dossier.dossier`
--

--
-- BEGIN / [#10387] Mise à jour des données techniques et CERFA
--

-- DIA

-- Ajout données techniques et cerfa
-- Désignation du bien
ALTER TABLE donnees_techniques ADD COLUMN IF NOT EXISTS ci4na1 boolean DEFAULT false;
COMMENT ON COLUMN donnees_techniques.ci4na1 IS 'Nombre de Niveaux - Coche';
ALTER TABLE donnees_techniques ADD COLUMN IF NOT EXISTS ci4aa1 boolean DEFAULT false;
COMMENT ON COLUMN donnees_techniques.ci4aa1 IS 'Nombre d''Appartements - Coche';
ALTER TABLE donnees_techniques ADD COLUMN IF NOT EXISTS ci4la1 boolean DEFAULT false;
COMMENT ON COLUMN donnees_techniques.ci4la1 IS 'Nombre d''Autres locaux - Coche';
-- Modalité de la cession ou de la donation
ALTER TABLE donnees_techniques ADD COLUMN IF NOT EXISTS fi1t numeric;
COMMENT ON COLUMN donnees_techniques.fi1t IS 'Si TVA en sus du prix, préciser le montant (en chiffres)';
ALTER TABLE donnees_techniques ADD COLUMN IF NOT EXISTS fi1d numeric;
COMMENT ON COLUMN donnees_techniques.fi1d IS 'Évaluation hors commission (en chiffres)';
ALTER TABLE donnees_techniques ADD COLUMN IF NOT EXISTS fi1e character varying(100);
COMMENT ON COLUMN donnees_techniques.fi1e IS 'Évaluation hors commission (en lettres)';
--
-- Désignation du bien
ALTER TABLE cerfa ADD COLUMN IF NOT EXISTS ci4na1 boolean DEFAULT false;
COMMENT ON COLUMN cerfa.ci4na1 IS 'Nombre de Niveaux - Coche';
ALTER TABLE cerfa ADD COLUMN IF NOT EXISTS ci4aa1 boolean DEFAULT false;
COMMENT ON COLUMN cerfa.ci4aa1 IS 'Nombre d''Appartements - Coche';
ALTER TABLE cerfa ADD COLUMN IF NOT EXISTS ci4la1 boolean DEFAULT false;
COMMENT ON COLUMN cerfa.ci4la1 IS 'Nombre d''Autres locaux - Coche';
-- Modalité de la cession ou de la donation
ALTER TABLE cerfa ADD COLUMN IF NOT EXISTS fi1t boolean DEFAULT false;
COMMENT ON COLUMN cerfa.fi1t IS 'Si TVA en sus du prix, préciser le montant (en chiffres)';
ALTER TABLE cerfa ADD COLUMN IF NOT EXISTS fi1d boolean DEFAULT false;
COMMENT ON COLUMN cerfa.fi1d IS 'Évaluation hors commission (en chiffres)';
ALTER TABLE cerfa ADD COLUMN IF NOT EXISTS fi1e boolean DEFAULT false;
COMMENT ON COLUMN cerfa.fi1e IS 'Évaluation hors commission (en lettres)';

--
-- END / [#10387] Mise à jour des données techniques et CERFA
--

--
-- BEGIN / [#10390] Implémentation des nomenclatures Plat'AU - [#10389] [MC0044635][MC0045937] Modules Flux Platau
--

-- Création de la table document_type
CREATE TABLE IF NOT EXISTS document_type (
    document_type integer NOT NULL,
    libelle character varying(255) NOT NULL,
    code character varying(50) NOT NULL,
    document_type_categorie integer NOT NULL,
    om_validite_debut date,
    om_validite_fin date,
    CONSTRAINT document_type_pkey PRIMARY KEY (document_type)
);

CREATE SEQUENCE IF NOT EXISTS document_type_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

COMMENT ON COLUMN document_type.document_type IS 'Identifiant unique du type de document';
COMMENT ON COLUMN document_type.libelle IS 'Libellé du type de document';
COMMENT ON COLUMN document_type.code IS 'Code du type de document';
COMMENT ON COLUMN document_type.document_type_categorie IS 'Catégorie du type de document';
COMMENT ON COLUMN document_type.om_validite_debut IS 'Date de début de validité du type de document';
COMMENT ON COLUMN document_type.om_validite_fin IS 'Date de fin de validité du type de document';

-- Création de la table document_type_categorie
CREATE TABLE IF NOT EXISTS document_type_categorie (
    document_type_categorie integer NOT NULL,
    libelle character varying(255) NOT NULL,
    code character varying(50) DEFAULT NULL,
    CONSTRAINT document_type_categorie_pkey PRIMARY KEY (document_type_categorie)
);

CREATE SEQUENCE IF NOT EXISTS document_type_categorie_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

COMMENT ON COLUMN document_type_categorie.document_type_categorie IS 'Identifiant unique de la catégorie du type de document';
COMMENT ON COLUMN document_type_categorie.libelle IS 'Libellé de la catégorie du type de document';
COMMENT ON COLUMN document_type_categorie.code IS 'Code de la catégorie du type de document';

ALTER TABLE ONLY document_type
    ADD CONSTRAINT document_type_document_type_categorie_fkey FOREIGN KEY (document_type_categorie) REFERENCES document_type_categorie(document_type_categorie);

-- Création de la table type_acteur_platau
CREATE TABLE IF NOT EXISTS type_acteur_platau (
    type_acteur_platau integer NOT NULL,
    libelle character varying(255) NOT NULL,
    code character varying(50) DEFAULT NULL,
    om_validite_debut date,
    om_validite_fin date,
    CONSTRAINT type_acteur_platau_pkey PRIMARY KEY (type_acteur_platau)
);

CREATE SEQUENCE IF NOT EXISTS type_acteur_platau_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

COMMENT ON COLUMN type_acteur_platau.type_acteur_platau IS 'Identifiant unique du type acteur platau';
COMMENT ON COLUMN type_acteur_platau.libelle IS 'Libellé du type acteur platau';
COMMENT ON COLUMN type_acteur_platau.code IS 'Code du type acteur platau';
COMMENT ON COLUMN type_acteur_platau.om_validite_debut IS 'Date de début du type acteur platau';
COMMENT ON COLUMN type_acteur_platau.om_validite_fin IS 'Date de fin du type acteur platau';

--
-- END / [#10390] Implémentation des nomenclatures Plat'AU - [#10389] [MC0044635][MC0045937] Modules Flux Platau
--

--
-- BEGIN / [#10396] Intégration des type_documents dans OpenADS - [#10389] [MC0044635][MC0045937] Modules Flux Platau
--

ALTER TABLE ONLY evenement ADD COLUMN document_type integer DEFAULT NULL;

ALTER TABLE ONLY evenement
    ADD CONSTRAINT evenement_document_type_fkey FOREIGN KEY (document_type) REFERENCES document_type(document_type);

COMMENT ON COLUMN evenement.document_type IS 'Type de document de l''évènement';


ALTER TABLE ONLY instruction ADD COLUMN document_type_instruction integer DEFAULT NULL;

ALTER TABLE ONLY instruction
    ADD CONSTRAINT instruction_document_type_instruction_fkey FOREIGN KEY (document_type_instruction) REFERENCES document_type(document_type);

COMMENT ON COLUMN instruction.document_type_instruction IS 'Type de document de l''instruction';

--
-- END / [#10396] Intégration des type_documents dans OpenADS - [#10389] [MC0044635][MC0045937] Modules Flux Platau
--

--
-- BEGIN / [#10398] Nommage des document généré par les instructions avec le type document - [#10389] [MC0044635][MC0045937] Modules Flux Platau
--

ALTER TABLE instruction ADD COLUMN IF NOT EXISTS fichier_instruction_name character varying(255) DEFAULT NULL;

COMMENT ON COLUMN instruction.fichier_instruction_name IS 'Nom du fichier d''instruction';

UPDATE instruction SET fichier_instruction_name = CONCAT('instruction_', instruction,'.pdf')
    WHERE om_final_instruction IS TRUE AND om_fichier_instruction IS NOT NULL;

--
-- END / [#10398] Nommage des document généré par les instructions avec le type document - [#10389] [MC0044635][MC0045937] Modules Flux Platau
--

--
-- BEGIN / Ajout de permission
--

-- Pour permettre l'ajout de document de travail en annexe
INSERT INTO om_droit (om_droit, libelle, om_profil)
SELECT nextval('om_droit_seq'), 'document_travail_notifier', (SELECT om_profil FROM om_profil WHERE libelle = 'ADMINISTRATEUR GENERAL')
WHERE NOT EXISTS (
    SELECT om_droit FROM om_droit WHERE libelle = 'document_travail_notifier' AND om_profil = (SELECT om_profil FROM om_profil WHERE libelle = 'ADMINISTRATEUR GENERAL')
);

INSERT INTO om_droit (om_droit, libelle, om_profil)
SELECT nextval('om_droit_seq'), 'document_travail_notifier', (SELECT om_profil FROM om_profil WHERE libelle = 'INSTRUCTEUR POLYVALENT')
WHERE NOT EXISTS (
    SELECT om_droit FROM om_droit WHERE libelle = 'document_travail_notifier' AND om_profil = (SELECT om_profil FROM om_profil WHERE libelle = 'INSTRUCTEUR POLYVALENT')
);

INSERT INTO om_droit (om_droit, libelle, om_profil)
SELECT nextval('om_droit_seq'), 'document_travail_notifier', (SELECT om_profil FROM om_profil WHERE libelle = 'INSTRUCTEUR POLYVALENT COMMUNE')
WHERE NOT EXISTS (
    SELECT om_droit FROM om_droit WHERE libelle = 'document_travail_notifier' AND om_profil = (SELECT om_profil FROM om_profil WHERE libelle = 'INSTRUCTEUR POLYVALENT COMMUNE')
);

-- Pour permettre de gérer les utilisateurs liés
INSERT INTO om_droit (om_droit, libelle, om_profil)
SELECT nextval('om_droit_seq'), 'lien_om_utilisateur_om_utilisateur', (SELECT om_profil FROM om_profil WHERE libelle = 'ADMINISTRATEUR GENERAL')
WHERE NOT EXISTS (
    SELECT om_droit FROM om_droit WHERE libelle = 'lien_om_utilisateur_om_utilisateur' AND om_profil = (SELECT om_profil FROM om_profil WHERE libelle = 'ADMINISTRATEUR GENERAL')
);

-- Pour permettre de gérer les enjeux
INSERT INTO om_droit (om_droit, libelle, om_profil)
SELECT nextval('om_droit_seq'), 'enjeux', (SELECT om_profil FROM om_profil WHERE libelle = 'ADMINISTRATEUR GENERAL')
WHERE NOT EXISTS (
    SELECT om_droit FROM om_droit WHERE libelle = 'enjeux' AND om_profil = (SELECT om_profil FROM om_profil WHERE libelle = 'ADMINISTRATEUR GENERAL')
);

--
-- END / Ajout de permission
--

--
-- BEGIN / [#10406] Système de stockage de données arbitraires
--

CREATE TABLE IF NOT EXISTS extra_data_register_def (
    extra_data_register_def integer NOT NULL,
    name character varying(50) NOT NULL,
    description character varying(255) NOT NULL,
    type character varying(15) NOT NULL,
    object_name character varying(50) NULL,
    max_length integer NOT NULL,
    -- validator_cb character varying(100) NULL,
    alias_champ_fusion character varying(100) NULL,
    CONSTRAINT extra_data_register_def_pkey PRIMARY KEY (extra_data_register_def)
);
ALTER TABLE ONLY extra_data_register_def
    DROP CONSTRAINT IF EXISTS extra_data_register_def_object_name_name_uniq;
ALTER TABLE ONLY extra_data_register_def
    ADD CONSTRAINT extra_data_register_def_object_name_name_uniq UNIQUE (object_name, name);
CREATE INDEX IF NOT EXISTS extra_data_register_def_object_name_name_index ON extra_data_register_def (object_name, name);
COMMENT ON COLUMN extra_data_register_def.extra_data_register_def IS 'Identifiant technique';
COMMENT ON COLUMN extra_data_register_def.name IS 'Nom de la donnée';
COMMENT ON COLUMN extra_data_register_def.description IS 'Description de la donnée';
COMMENT ON COLUMN extra_data_register_def.type IS 'Type de la donnée';
COMMENT ON COLUMN extra_data_register_def.object_name IS 'Objet (classe) auquel est associé la donnée';
COMMENT ON COLUMN extra_data_register_def.max_length IS 'Longueur maximale de la donnée';
-- COMMENT ON COLUMN extra_data_register_def.validator_cb IS 'Méthode de validation de la donnée (callable)';
COMMENT ON COLUMN extra_data_register_def.alias_champ_fusion IS 'Alias pour la donnée en tant que champ de fusion';
CREATE SEQUENCE IF NOT EXISTS extra_data_register_def_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

CREATE TABLE IF NOT EXISTS extra_data_register_values (
    extra_data_register_values integer NOT NULL,
    definition_ref integer NOT NULL,
    object_id character varying(255) NULL,
    value_int integer NULL,
    value_str character varying(255) NULL,
    value_text text NULL,
    value_json jsonb NULL,
    value_blob bytea NULL,
    value_timestamp timestamp NULL,
    CONSTRAINT extra_data_register_values_pkey PRIMARY KEY (extra_data_register_values)
);
ALTER TABLE ONLY extra_data_register_values
    DROP CONSTRAINT IF EXISTS extra_data_register_def_fkey,
    DROP CONSTRAINT IF EXISTS extra_data_register_values_definition_ref_object_id_uniq;
ALTER TABLE ONLY extra_data_register_values
    ADD CONSTRAINT extra_data_register_def_fkey FOREIGN KEY (definition_ref) REFERENCES extra_data_register_def(extra_data_register_def),
    ADD CONSTRAINT extra_data_register_values_definition_ref_object_id_uniq UNIQUE (definition_ref, object_id);
CREATE INDEX IF NOT EXISTS extra_data_register_values_definition_ref_object_id_index ON extra_data_register_values (definition_ref, object_id);
COMMENT ON COLUMN extra_data_register_values.extra_data_register_values IS 'Identifiant technique';
COMMENT ON COLUMN extra_data_register_values.definition_ref IS 'Définition de la donnée';
COMMENT ON COLUMN extra_data_register_values.object_id IS 'Objet (instance) auquel est associé la donnée';
COMMENT ON COLUMN extra_data_register_values.value_int IS 'Valeur (integer) de la donnée';
COMMENT ON COLUMN extra_data_register_values.value_str IS 'Valeur (string) de la donnée';
COMMENT ON COLUMN extra_data_register_values.value_text IS 'Valeur (text) de la donnée';
COMMENT ON COLUMN extra_data_register_values.value_json IS 'Valeur (json) de la donnée';
COMMENT ON COLUMN extra_data_register_values.value_blob IS 'Valeur (binaire) de la donnée';
COMMENT ON COLUMN extra_data_register_values.value_timestamp IS 'Valeur (timestamp) de la donnée';
CREATE SEQUENCE IF NOT EXISTS extra_data_register_values_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

--
-- END / [#10406] Système de stockage de données arbitraires
--

--
-- BEGIN / [#10428] Module Association d’annexes - [#10389] [MC0044635][MC0045937] Modules Flux Platau
--

-- Création de la table parametrage_annexe
CREATE TABLE IF NOT EXISTS parametrage_annexe (
    parametrage_annexe integer NOT NULL,
    instruction integer NOT NULL,
    document_object_type character varying(63) NOT NULL,
    document_object_type_id integer NOT NULL,
    condition character varying(20) DEFAULT NULL,
    CONSTRAINT parametrage_annexe_pkey PRIMARY KEY (parametrage_annexe)
);

CREATE SEQUENCE IF NOT EXISTS parametrage_annexe_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

COMMENT ON COLUMN parametrage_annexe.parametrage_annexe IS 'Identifiant unique de référence du paramétrage des annexes.';
COMMENT ON COLUMN parametrage_annexe.instruction IS 'Instruction sur laquelle sera appliqué le paramétrage de l’annexe.';
COMMENT ON COLUMN parametrage_annexe.document_object_type IS 'Table sur laquel le document doit être chercher.';
COMMENT ON COLUMN parametrage_annexe.document_object_type_id IS 'ID de l''élément qui sera utilisé pour la recherche.';
COMMENT ON COLUMN parametrage_annexe.condition IS 'Conditions attendu du document pour qu’il puisse être annexés.';

ALTER TABLE ONLY parametrage_annexe
    ADD CONSTRAINT parametrage_annexe_instruction_fkey FOREIGN KEY (instruction) REFERENCES instruction(instruction);

-- Pour permettre la consultation des annexe depuis l'url de leur linstings 
INSERT INTO om_droit (om_droit, libelle, om_profil)
SELECT nextval('om_droit_seq'), 'parametrage_annexe', (SELECT om_profil FROM om_profil WHERE libelle = 'ADMINISTRATEUR TECHNIQUE ET FONCTIONNEL')
WHERE NOT EXISTS (
    SELECT om_droit FROM om_droit WHERE libelle = 'parametrage_annexe' AND om_profil = (SELECT om_profil FROM om_profil WHERE libelle = 'ADMINISTRATEUR TECHNIQUE ET FONCTIONNEL')
);

--
-- END / [#10428] Module Association d’annexes - [#10389] [MC0044635][MC0045937] Modules Flux Platau
--

-- 
-- BEGIN / [#10437] Système de modules permettant la personalisation de l'application par du code externe
--
ALTER TABLE ONLY lien_module
   DROP CONSTRAINT IF EXISTS lien_module_module_object_name_object_id_parametres_uniq;
ALTER TABLE ONLY lien_module
    ADD CONSTRAINT lien_module_module_object_name_object_id_parametres_uniq UNIQUE (module, object_name, declencheur, object_id, parametres);
--
-- END / [#10437] Système de modules permettant la personalisation de l'application par du code externe
--
