
--Fonction pour créer une fiche si celle-ci n'existe pas
CREATE OR REPLACE FUNCTION newRemboursement(userId CHAR(10), monthFile CHAR(10)) RETURNS int AS $$        
DECLARE 
    returnValue INT;
	forfaitRecord RECORD;
BEGIN 
    SELECT COUNT(*) INTO returnValue
    FROM remboursement
    WHERE "rVisiteur" = userId AND "rMois" = monthFile;
	
	IF returnValue = 0 THEN
        -- Ajoute une nouvelle ligne à la table remboursement
        INSERT INTO remboursement
        VALUES(userId, monthFile, 0, 0, CURRENT_DATE, 'CR');
		
		-- Parcours des lignes de la table forfait pour insérer dans ligne_hors_forfait
        FOR forfaitRecord IN SELECT * FROM forfait LOOP
            INSERT INTO ligne_forfait
            VALUES(userId, monthFile, forfaitRecord."fId", 0, 0);
        END LOOP;

        -- Mettre à jour la valeur de returnValue après l'insertion
        returnValue := 1; -- Valeur pour indiquer qu'une ligne a été insérée
    END IF;

    RETURN returnValue;
END;
$$ LANGUAGE 'plpgsql';



--Fonction pour passer les fiches de "créé" à "saisi cloturé" ET passe les frais HF sur la fiche suivante 
--dateN -> '202403'
CREATE OR REPLACE FUNCTION updateEtat(curMonth varchar(6), prevMonth varchar(6)) RETURNS bool AS $$        
DECLARE 
	"listeVisiteur" RECORD;
	curMontantValid FLOAT;
	oldMontantValid FLOAT;
BEGIN 
    --Update les fiches Créées en cloturé si la date est inf au mois courant
    UPDATE remboursement 
    SET "rEtat" = 'CL'
    WHERE "rEtat" = 'CR' AND "rMois" < curMonth;

    --Crée une Fiche pour tous les visiteurs qui n'ont pas de fiches mais dont les frais HF doivent être reportés
    FOR "listeVisiteur" IN
        SELECT "rVisiteur", SUM("lhMontant") as "montant" FROM remboursement 
        INNER JOIN ligne_hors_forfait ON "rVisiteur" = "lhVisiteur" AND "rMois" = "lhMois"
        WHERE "rMois" <= curMonth AND "rEtat" = 'CL' AND "lhJustificatif" = FALSE AND "lhRefus" = FALSE
        GROUP BY "rVisiteur"
    LOOP
		--Crée la demande si elle n'existe pas
		PERFORM newRemboursement("listeVisiteur"."rVisiteur", curMonth); 
		--RECUP l'ancien montant
		SELECT "rMontantValide" INTO curMontantValid
		FROM remboursement
		WHERE "rVisiteur" = "listeVisiteur"."rVisiteur" AND "rMois" = curMonth;

		SELECT "rMontantValide" INTO oldMontantValid
		FROM remboursement
		WHERE "rVisiteur" = "listeVisiteur"."rVisiteur" AND "rMois" = prevMonth;
		--Actualise les montants totaux de remboursement
		UPDATE remboursement 
		SET "rMontantValide" = curMontantValid + "listeVisiteur"."montant"
		WHERE "rVisiteur" = "listeVisiteur"."rVisiteur" AND "rMois" = curMonth;

		UPDATE remboursement 
		SET "rMontantValide" = oldMontantValid - "listeVisiteur"."montant"
		WHERE "rVisiteur" = "listeVisiteur"."rVisiteur" AND "rMois" = prevMonth;
    END LOOP;  

    --Passe les lignes HF non validé avec justif 
    UPDATE ligne_hors_forfait
    SET "lhMois" = curMonth
    WHERE "lhMois" <= prevMonth AND "lhJustificatif" = FALSE AND "lhRefus" = FALSE;

    --Passe le remboursement en validé
    UPDATE remboursement 
    SET "rEtat" = 'VA'
    WHERE "rEtat" = 'CL' AND "rMois" < prevMonth;   

	RETURN true;
END;
$$ LANGUAGE 'plpgsql';




--AJOUTE LES LIGNES HF
INSERT ligne_hors_forfait
("lhVisiteur", "lhMois", "lhLibelle", "lhDate", "lhMontant", "lhJustificatif", "lhRefus")
VALUES (:userId, :monthF, :libelle, :dateL, :mttF, 'true', 'false');

--UPDATE LES LIGNES HF SI REFUS
UPDATE ligne_hors_forfait
SET "lhRefus" = 'true'
WHERE "rVisiteur" = '' AND "rMois" = '' AND "lhId" = '';

--UPDATE LES LIGNE FORFAIT
UPDATE ligne_forfait
SET "lfQuantite" = :qttF,
"lfMontant" = :mttF
WHERE "rVisiteur" = :userId AND "rMois" = :monthF AND "lfForfait" = :idForfait;



