return: SETOF activite.p_gmt_valorises lang: plpgsql src: | DECLARE _nb_jours_presence int; _dzf1 int; _fzf1 int; _dzf2 int; _fzf2 int; _dzf3 int; _fzf3 int; _zone_sejour int; _montant_valorise int; _montant_fj int; _input_record RECORD; _output_record activite.p_gmt_valorises%ROWTYPE; BEGIN FOR _input_record IN SELECT p_sejours_groupes_smr.no_sejour , p_sejours_groupes_smr.nb_jours_presence , p_sejours_groupes_smr.gme_code , p_sejours_groupes_smr.gmt_code , p_sejours_groupes_smr.date_debut_gmt , p_sejours_groupes_smr.date_fin_gmt , v_tarifs_prive_gmt_forfaitisables.texte , v_tarifs_prive_gmt_forfaitisables.dzf , v_tarifs_prive_gmt_forfaitisables.fzf , v_tarifs_prive_gmt_forfaitisables.tzb , v_tarifs_prive_gmt_forfaitisables.tzf1 , v_tarifs_prive_gmt_forfaitisables.tzf2 , v_tarifs_prive_gmt_forfaitisables.tzf3 , v_tarifs_prive_gmt_forfaitisables.szb , v_tarifs_prive_gmt_forfaitisables.szh FROM activite.p_sejours_groupes_smr JOIN base.v_tarifs_prive_gmt_forfaitisables ON p_sejours_groupes_smr.gmt_code = v_tarifs_prive_gmt_forfaitisables.code AND p_sejours_groupes_smr.date_fin_gmt BETWEEN v_tarifs_prive_gmt_forfaitisables.date_debut AND v_tarifs_prive_gmt_forfaitisables.date_fin AND p_sejours_groupes_smr.gme_code = v_tarifs_prive_gmt_forfaitisables.gme_code WHERE p_sejours_groupes_smr.types_gmt_code = 'hc_forfaitisable' LOOP _nb_jours_presence := LEAST(_input_record.nb_jours_presence, 90); SELECT COALESCE(activite.get_montant_fj_valorise_par_sejour(_input_record.no_sejour), 0) INTO _montant_fj; -- Une zone forfaitaire dure 3 semaines soit 21 jours -- Nous ne disposons que des valeurs de début de zone forfaitaire (dzf) et de fin de zone forfaitaire (fzf) -- Nous calculons donc les autres délimiteurs des trois zones différentes (dzf1, fzf1, dzf2, fzf2, dzf3, fzf3) -- Chaque zone INCLUT ses propres délimiteurs de début et fin de zone (soit 7 jours complets) -- Le début des zones commence le lendemain de la fin de zone de la précédente (logique) (ex : dzf2 = fzf1 + 1) -- Sauf pour dzf1 qui est égal au dzf déjà fourni par l'ATIH -- La fin d'une zone est donc calculée comme étant début de la zone + 6 jours (ex : dzf1 = 8, fzf = 14) -- Sauf pour fzf3 qui est égal à fzf déjà fourni par l'ATIH _dzf1 := _input_record.dzf; _fzf1 := _dzf1 + 6; _dzf2 := _fzf1 + 1; _fzf2 := _dzf2 + 6; _dzf3 := _fzf2 + 1; _fzf3 := _input_record.fzf; IF _nb_jours_presence > _fzf3 THEN _zone_sejour := 5; ELSIF _nb_jours_presence >= _dzf3 THEN _zone_sejour := 4; ELSIF _nb_jours_presence >= _dzf2 THEN _zone_sejour := 3; ELSIF _nb_jours_presence >= _dzf1 THEN _zone_sejour := 2; ELSE _zone_sejour := 1; END IF; CASE _zone_sejour WHEN 1 THEN _montant_valorise := _input_record.tzb - (_input_record.dzf - _nb_jours_presence) * _input_record.szb; WHEN 2 THEN _montant_valorise := _input_record.tzf1; WHEN 3 THEN _montant_valorise := _input_record.tzf2; WHEN 4 THEN _montant_valorise := _input_record.tzf3; WHEN 5 THEN _montant_valorise := _input_record.tzf3 + (_nb_jours_presence - _input_record.fzf) * _input_record.szh; END CASE; _output_record.no_sejour := _input_record.no_sejour; _output_record.gme_code := _input_record.gme_code; _output_record.gmt_code := _input_record.gmt_code; _output_record.gmt_libelle := _input_record.texte; _output_record.date_debut_gmt := _input_record.date_debut_gmt; _output_record.date_fin_gmt := _input_record.date_fin_gmt; _output_record.montant_valorise := _montant_valorise - _montant_fj; _output_record.montant_valorise_par_jour := (_montant_valorise - _montant_fj) / _nb_jours_presence; RETURN NEXT _output_record; END LOOP; RETURN; END;