|
|
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;
|