-- Mise à jour des champs email--
UPDATE tb_utilisateur SET email='example@exampl.com' WHERE email IS NULL__@@__
---Application des niveau de sécurité par défaut sur tout les contenans ayant un niveau de sécurité null---
UPDATE ardoc.tb_contenant SET idsecurite = (SELECT id FROM tb_securite WHERE defaut=1) WHERE idsecurite IS NULL__@@__
--Application du statut ouvert à tous les contenants
UPDATE ardoc.tb_contenant SET statut='Ouvert' WHERE statut NOT IN ('Ouvert', 'Fermé')__@@__
UPDATE ardoc.tb_contenant SET capacite=0 WHERE capacite IS NULL__@@__
--Application de la civilité à tous les user n'ayant pas de civilité
UPDATE tb_utilisateur SET civilite='Monsieur' WHERE civilite NOT IN ('Monsieur', 'Madame')__@@__
--Application de la civilité à tous les contacts n'ayant pas de civilité
UPDATE melbox.tb_contact SET civilite='Monsieur' WHERE civilite NOT IN ('Monsieur', 'Madame')__@@__

--- Mise à jour des meubles où la capacité et le nombre d'étagère ne sont pas renseignés
UPDATE ardoc.tb_meuble SET nbre_tablette=0 WHERE nbre_tablette IS NULL__@@__
UPDATE ardoc.tb_meuble SET capacite=0 WHERE capacite IS NULL__@@__

--- Mise à jour des chronogramme n'ayant pas longueurnumero renseignée
UPDATE melbox.tb_chronogramme SET longueurnumero=0 WHERE longueurnumero IS NULL__@@__

---Mise à jour des rayonnages
UPDATE ardoc.tb_rayonnage SET statut='Ouvert' WHERE statut NOT IN ('Ouvert', 'Fermé')__@@__
UPDATE ardoc.tb_rayonnage SET nbre_tablette=0 WHERE nbre_tablette IS NULL__@@__

---TABLE AFFAIRE---
ALTER TABLE tb_affaire ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE tb_affaire ALTER COLUMN libelle SET NOT NULL__@@__
---Table Dossier----
ALTER TABLE tb_dossier ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE tb_dossier ALTER COLUMN libelle SET NOT NULL__@@__
---Table Tiers----
ALTER TABLE tb_tiers ALTER COLUMN nom SET NOT NULL__@@__
ALTER TABLE tb_tiers ALTER COLUMN idpays SET NOT NULL__@@__
ALTER TABLE tb_tiers ALTER COLUMN ville SET NOT NULL__@@__
---Table contact----
ALTER TABLE melbox.tb_contact ALTER COLUMN civilite SET NOT NULL__@@__
ALTER TABLE melbox.tb_contact ALTER COLUMN idtiers SET NOT NULL__@@__
ALTER TABLE melbox.tb_contact ALTER COLUMN nom SET NOT NULL__@@__
ALTER TABLE melbox.tb_contact ADD CONSTRAINT chk_contact_civilite_monsieur_madame CHECK (civilite IN ('Monsieur', 'Madame'))__@@__

---On supprile les contacts qui n'ont pas de Tiers----
DELETE FROM melbox.tb_contact WHERE idtiers IS NULL__@@__

---Table groupe----
ALTER TABLE tb_groupe ALTER COLUMN libelle SET NOT NULL__@@__

---Table droit----
ALTER TABLE tb_droit ALTER COLUMN libelle SET NOT NULL__@@__

---Table profil----
ALTER TABLE tb_profil ALTER COLUMN libelle SET NOT NULL__@@__

---Table utilisateur----
ALTER TABLE tb_utilisateur ALTER COLUMN nom SET NOT NULL__@@__
ALTER TABLE tb_utilisateur ALTER COLUMN login SET NOT NULL__@@__
ALTER TABLE tb_utilisateur ALTER COLUMN email SET NOT NULL__@@__
ALTER TABLE tb_utilisateur ALTER COLUMN civilite SET NOT NULL__@@__
ALTER TABLE tb_utilisateur ADD CONSTRAINT chk_utilisateur_civilite_monsieur_madame CHECK (civilite IN ('Monsieur', 'Madame'))__@@__

---Table Chronogramme---- 
ALTER TABLE melbox.tb_chronogramme ALTER COLUMN type SET NOT NULL__@@__
ALTER TABLE melbox.tb_chronogramme ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE melbox.tb_chronogramme ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE melbox.tb_chronogramme ALTER COLUMN longueurnumero SET NOT NULL__@@__

---Table Modèle de traitement---- 
ALTER TABLE tb_modeletraitement ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE tb_modeletraitement ALTER COLUMN libelle SET NOT NULL__@@__

---Table Liste de diffusion---- 
ALTER TABLE melbox.tb_listediffusion ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE melbox.tb_listediffusion ALTER COLUMN libelle SET NOT NULL__@@__

---Table Liste d'autorité---- 
ALTER TABLE tb_listeautorite ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE tb_listeautorite ALTER COLUMN libelle SET NOT NULL__@@__

---Table Connexion---- 
ALTER TABLE tb_connexion ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE tb_connexion ALTER COLUMN idengine SET NOT NULL__@@__
ALTER TABLE tb_connexion ALTER COLUMN idencode SET NOT NULL__@@__
ALTER TABLE tb_connexion ALTER COLUMN host SET NOT NULL__@@__
ALTER TABLE tb_connexion ALTER COLUMN dbname SET NOT NULL__@@__
ALTER TABLE tb_connexion ALTER COLUMN username SET NOT NULL__@@__

---Table Métadonnée---- 
ALTER TABLE tb_metadonnee ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE tb_metadonnee ALTER COLUMN idtype SET NOT NULL__@@__

---Table Variable---- 
ALTER TABLE tb_variable ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE tb_variable ALTER COLUMN idtype SET NOT NULL__@@__

---Table Template---- 
ALTER TABLE tb_template ALTER COLUMN libelle SET NOT NULL__@@__

---Table Modèle d'indextion---- 
ALTER TABLE tb_modeleindexation ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE tb_modeleindexation ALTER COLUMN code SET NOT NULL__@@__

---Table Modèle de lecture---- 
ALTER TABLE tb_modelelecture ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE tb_modelelecture ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE tb_modelelecture ALTER COLUMN iddocument SET NOT NULL__@@__
ALTER TABLE tb_modelelecture ALTER COLUMN idclassement SET NOT NULL__@@__

---Table Liaison--- 
ALTER TABLE tb_liaison ALTER COLUMN libelle SET NOT NULL__@@__

---Table Classement--- 
ALTER TABLE tb_classement ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE tb_classement ALTER COLUMN libelle SET NOT NULL__@@__

---Table Entité--- 
ALTER TABLE tb_entite ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE tb_entite ALTER COLUMN libelle SET NOT NULL__@@__

---Table Répertoire--- 
ALTER TABLE starged.tb_repertoire ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE starged.tb_repertoire ALTER COLUMN libelle SET NOT NULL__@@__

---Table Sécurité--- 
ALTER TABLE tb_securite ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE tb_securite ALTER COLUMN libelle SET NOT NULL__@@__

---Table Conservation--- 
ALTER TABLE tb_conservation ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE tb_conservation ALTER COLUMN libelle SET NOT NULL__@@__

---Table Meuble---
ALTER TABLE ardoc.tb_meuble ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE ardoc.tb_meuble ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE ardoc.tb_meuble ALTER COLUMN nbre_tablette SET NOT NULL__@@__
ALTER TABLE ardoc.tb_meuble ALTER COLUMN capacite SET NOT NULL__@@__

---Table Contenant---
ALTER TABLE ardoc.tb_contenant ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE ardoc.tb_contenant ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE ardoc.tb_contenant ALTER COLUMN idsecurite SET NOT NULL__@@__
ALTER TABLE ardoc.tb_contenant ALTER COLUMN capacite SET NOT NULL__@@__
ALTER TABLE ardoc.tb_contenant ALTER COLUMN statut SET NOT NULL__@@__
ALTER TABLE ardoc.tb_contenant ADD CONSTRAINT chk_only_statut_ouvert_ferme CHECK (statut IN ('Ouvert', 'Fermé'))__@@__

---Table Archive---
ALTER TABLE ardoc.tb_archive ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE ardoc.tb_archive ALTER COLUMN estserielle SET NOT NULL__@@__
ALTER TABLE ardoc.tb_archive ALTER COLUMN idclassement SET NOT NULL__@@__
ALTER TABLE ardoc.tb_archive ALTER COLUMN titre SET NOT NULL__@@__
ALTER TABLE ardoc.tb_archive ALTER COLUMN idauteur SET NOT NULL__@@__
ALTER TABLE ardoc.tb_archive ALTER COLUMN sof SET NOT NULL__@@__
ALTER TABLE ardoc.tb_archive ADD CONSTRAINT chk_archive_sof_only_destruction_definitive_adefinir CHECK (sof IN ('Destruction', 'A définir', 'Définitive'))__@@__

---Table Magasin---
ALTER TABLE ardoc.tb_magasin ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE ardoc.tb_magasin ALTER COLUMN superficie SET NOT NULL__@@__

---Table Rayonnage---
ALTER TABLE ardoc.tb_rayonnage ALTER COLUMN code SET NOT NULL__@@__
ALTER TABLE ardoc.tb_rayonnage ALTER COLUMN libelle SET NOT NULL__@@__
ALTER TABLE ardoc.tb_rayonnage ALTER COLUMN nbre_tablette SET NOT NULL__@@__
ALTER TABLE ardoc.tb_rayonnage ALTER COLUMN statut SET NOT NULL__@@__
ALTER TABLE ardoc.tb_rayonnage ADD CONSTRAINT chk_rayonnage_only_statut_ouvert_ferme CHECK (statut IN ('Ouvert', 'Fermé'))__@@__

-- FUNCTION: ardoc.set_size_add()

-- DROP FUNCTION IF EXISTS ardoc.set_size_add();

CREATE OR REPLACE FUNCTION ardoc.set_size_add()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$


DECLARE
   rec record;
BEGIN
	IF(coalesce(NEW.idmeuble, 0)>0) THEN
		UPDATE ardoc.tb_meuble SET taille_totale=taille_totale + NEW.capacite WHERE id=NEW.idmeuble;
	ELSEIF(coalesce(NEW.idrayonnage, 0)>0) THEN
		UPDATE ardoc.tb_rayonnage SET taille_totale=taille_totale + NEW.capacite WHERE id=NEW.idrayonnage;
	ELSEIF(coalesce(NEW.idcontenant, 0)>0) THEN
		select MIN(numerodebut) AS numerodebut, MAX(numerofin) AS numerofin, MIN(datedebut) AS datedebut, MAX(datefin) AS datefin, MAX(dua) AS dua INTO rec from ardoc.tb_contenant WHERE idcontenant=NEW.idcontenant;
		IF FOUND rec THEN
			UPDATE ardoc.tb_contenant SET numerodebut=rec.numerodebut, numerofin=rec.numerofin, datedebut=rec.datedebut, datefin=rec.datefin, dua = rec.dua, taille_totale=taille_totale + NEW.capacite WHERE id=NEW.idcontenant;	
		END IF;	
	END IF;
	IF NEW.code IS NULL THEN
		NEW.code = get_code('tb_contenant');
	END IF;
	IF NEW.idsecurite IS NULL THEN
		NEW.idsecurite = (SELECT id FROM tb_securite WHERE defaut=1);
	END IF;
	RETURN NEW;	
END;
$BODY$__@@__

ALTER FUNCTION ardoc.set_size_add()
    OWNER TO postgres__@@__

COMMENT ON FUNCTION ardoc.set_size_add()
    IS 'Met à jour le taille totale lors de l''ajout'__@@__	
	
-- FUNCTION: ardoc.set_size_edit()

-- DROP FUNCTION IF EXISTS ardoc.set_size_edit();

CREATE OR REPLACE FUNCTION ardoc.set_size_edit()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$

DECLARE
   rec record;
BEGIN
	IF (NEW.onsa>0) THEN
		IF (OLD.idrayonnage IS NULL AND NEW.idrayonnage IS NOT NULL) THEN --It's add
			UPDATE ardoc.tb_rayonnage SET taille_totale = taille_totale + NEW.capacite  WHERE id = NEW.idrayonnage ;
		ELSEIF (NEW.idrayonnage IS NOT NULL AND OLD.idrayonnage IS NOT NULL AND NEW.idrayonnage<>OLD.idrayonnage) THEN
			UPDATE ardoc.tb_rayonnage SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idrayonnage;
			UPDATE ardoc.tb_rayonnage SET taille_totale = taille_totale + NEW.capacite  WHERE id = NEW.idrayonnage;
		ELSEIF (NEW.idrayonnage IS NULL AND OLD.idrayonnage IS NOT NULL) THEN
			UPDATE ardoc.tb_rayonnage SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idrayonnage;
		ELSEIF (OLD.idcontenant IS NULL AND NEW.idcontenant IS NOT NULL) THEN --It's add
			UPDATE ardoc.tb_contenant SET taille_totale = taille_totale + NEW.capacite  WHERE id = NEW.idcontenant ;
		ELSEIF (NEW.idcontenant IS NOT NULL AND OLD.idcontenant IS NOT NULL AND NEW.idcontenant<>OLD.idcontenant) THEN
			UPDATE ardoc.tb_contenant SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idcontenant;
			UPDATE ardoc.tb_contenant SET taille_totale = taille_totale + NEW.capacite  WHERE id = NEW.idcontenant;
		ELSEIF (NEW.idcontenant IS NULL AND OLD.idcontenant IS NOT NULL) THEN
			UPDATE ardoc.tb_contenant SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idcontenant;
		END IF;
		--raise NOTICE  'id versement: %', NEW.idversement;
	ELSE
		-- raise NOTICE  'new id meuble: %', NEW.idmeuble;
		-- raise NOTICE  'old id meuble: %', OLD.idmeuble;
		IF (NEW.idmeuble = OLD.idmeuble) THEN -- On a peut être changé la taille
			UPDATE ardoc.tb_meuble SET taille_totale = taille_totale + (NEW.capacite - OLD.capacite)  WHERE id = NEW.idmeuble ;
		ELSEIF (NEW.idmeuble IS NOT NULL AND OLD.idmeuble IS NULL) THEN -- On range de nouveau dans un meuble
			UPDATE ardoc.tb_meuble SET taille_totale = taille_totale + NEW.capacite  WHERE id = NEW.idmeuble;
		ELSEIF (NEW.idmeuble IS NULL AND OLD.idmeuble IS NOT NULL) THEN	-- On enlève d'un meuble
			UPDATE ardoc.tb_meuble SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idmeuble;
		ELSEIF (NEW.idmeuble IS NOT NULL AND OLD.idmeuble IS NOT NULL) THEN	-- On déplace d'un meuble à un autre
			UPDATE ardoc.tb_meuble SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idmeuble;
			UPDATE ardoc.tb_meuble SET taille_totale = taille_totale + NEW.capacite  WHERE id = NEW.idmeuble;
		END IF;
		select MIN(numerodebut) AS numerodebut, MAX(numerofin) AS numerofin, MIN(datedebut) AS datedebut, MAX(datefin) AS datefin, MAX(dua) AS dua, MAX(duc) AS duc INTO rec from ardoc.tb_contenant WHERE idcontenant=NEW.idcontenant;
		IF FOUND rec THEN
			UPDATE ardoc.tb_contenant SET numerodebut=rec.numerodebut, numerofin=rec.numerofin, datedebut=rec.datedebut, datefin=rec.datefin, dua = rec.dua, duc = rec.duc WHERE id=NEW.idcontenant;
		ELSE 
		UPDATE ardoc.tb_contenant SET numerodebut=NULL, numerofin=NULL, datedebut = NULL, datefin = NULL, dua=NULL, duc=NULL WHERE id = OLD.idcontenant;	
		END IF;
		IF (NEW.idcontenant = OLD.idcontenant) THEN
			UPDATE ardoc.tb_contenant SET taille_totale = taille_totale + (NEW.capacite - OLD.capacite)  WHERE id = NEW.idcontenant ;
		ELSE
			UPDATE ardoc.tb_contenant SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idcontenant;
			UPDATE ardoc.tb_contenant SET taille_totale = taille_totale + NEW.capacite  WHERE id = NEW.idcontenant;
		END IF;
		IF(NEW.statut <> OLD.statut OR NEW.estactif <> OLD.estactif) THEN
			UPDATE ardoc.tb_contenant SET estactif = NEW.estactif, statut = NEW.statut  WHERE idcontenant = NEW.id ;
		END IF;	
	END IF;
	IF (NEW.idversement is distinct from OLD.idversement) THEN
		select MIN(idversement) AS idversement INTO rec from ardoc.tb_contenant WHERE idcontenant=NEW.idcontenant GROUP BY idversement;
		IF FOUND rec THEN
			IF rec.idversement IS NULL THEN
				-- raise NOTICE  'FOUND record: %', rec.idversement;
				UPDATE ardoc.tb_contenant SET idversement = NULL WHERE id=NEW.idcontenant;
			ELSE
				UPDATE ardoc.tb_contenant SET idversement = rec.idversement, statut='Ouvert' WHERE id=NEW.idcontenant;
			END IF;				
		END IF;	 
	END IF;
	RETURN NEW;
END;
$BODY$__@@__

ALTER FUNCTION ardoc.set_size_edit()
    OWNER TO postgres__@@__

COMMENT ON FUNCTION ardoc.set_size_edit()
    IS 'Met à jour l''attribut hasarchive de la table tb_contenant'__@@__

-- FUNCTION: ardoc.set_size_delete()

-- DROP FUNCTION IF EXISTS ardoc.set_size_delete();

CREATE OR REPLACE FUNCTION ardoc.set_size_delete()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$

DECLARE
BEGIN
	IF(OLD.idmeuble IS NOT NULL) THEN
		UPDATE ardoc.tb_meuble SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idmeuble;
	ELSEIF(OLD.idrayonnage IS NOT NULL) THEN
		UPDATE ardoc.tb_rayonnage SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idrayonnage;
	ELSEIF(OLD.idcontenant IS NOT NULL) THEN
		UPDATE ardoc.tb_contenant SET taille_totale = taille_totale - OLD.capacite  WHERE id = OLD.idcontenant;	
	END IF;
	RETURN NEW;	
END;
$BODY$__@@__

ALTER FUNCTION ardoc.set_size_delete()
    OWNER TO postgres__@@__

COMMENT ON FUNCTION ardoc.set_size_delete()
    IS 'Met à jour le taille totale lors de la suppression'__@@__
