--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; --UPDATE les 'vlaidée et mise en paiement en remboursé UPDATE remboursement SET "rEtat" = 'RB' WHERE "rEtat" = "VA" 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;