Loading data/ddl/package/FORMULE_ULHN/body.sql +130 −148 Original line number Diff line number Diff line Loading @@ -43,8 +43,8 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS RETURN 0; END IF; IF feuille.EXISTS(c) THEN IF feuille(c).cells.EXISTS(l) THEN IF feuille.exists(c) THEN IF feuille(c).cells.exists(l) THEN IF feuille(c).cells(l).enCalcul THEN raise_application_error( -20001, 'Dépendance cyclique : la cellule [' || c || ';' || l || '] est déjà en cours de calcul'); END IF; Loading @@ -52,13 +52,13 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS END IF; END IF; feuille(c).cells(l).enCalcul := TRUE; feuille(c).cells(l).enCalcul := true; val := calcCell( c, l ); IF ose_formule.debug_actif THEN dbgCell( c, l, val ); END IF; feuille(c).cells(l).valeur := val; feuille(c).cells(l).enCalcul := FALSE; feuille(c).cells(l).enCalcul := false; RETURN val; END; Loading @@ -76,8 +76,8 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS val FLOAT; cellRes FLOAT; BEGIN IF feuille.EXISTS('__' || fncName || '__' || c || '__') THEN IF feuille('__' || fncName || '__' || c || '__').cells.EXISTS(1) THEN IF feuille.exists('__' || fncName || '__' || c || '__') THEN IF feuille('__' || fncName || '__' || c || '__').cells.exists(1) THEN RETURN feuille('__' || fncName || '__' || c || '__').cells(1).valeur; END IF; END IF; Loading @@ -86,13 +86,13 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS WHEN fncName = 'somme' THEN val := 0; FOR l IN 1 .. ose_formule.volumes_horaires.LENGTH LOOP FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP val := val + COALESCE(cell(c, l),0); END LOOP; WHEN fncName = 'max' THEN val := NULL; FOR l IN 1 .. ose_formule.volumes_horaires.LENGTH LOOP FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP cellRes := cell(c,l); IF val IS NULL OR val < cellRes THEN val := cellRes; Loading Loading @@ -126,100 +126,99 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS -- T=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.E20];[.$AM20]*[.E20])) -- T=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.E20];[.$AJ20]*[.E20])) WHEN 'T' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fi; RETURN cell('AP',l) * vh.taux_fi; ELSE RETURN cell('AM',l) * vh.taux_fi; RETURN cell('AJ',l) * vh.taux_fi; END IF; END IF; -- U=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.F20];[.$AM20]*[.F20])) -- U=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.F20];[.$AJ20]*[.F20])) WHEN 'U' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fa; RETURN cell('AP',l) * vh.taux_fa; ELSE RETURN cell('AM',l) * vh.taux_fa; RETURN cell('AJ',l) * vh.taux_fa; END IF; END IF; -- V=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.G20];[.$AM20]*[.G20])) -- V=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.G20];[.$AJ20]*[.G20])) WHEN 'V' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fc; RETURN cell('AP',l) * vh.taux_fc; ELSE RETURN cell('AM',l) * vh.taux_fc; RETURN cell('AJ',l) * vh.taux_fc; END IF; END IF; -- W=IF(OR(ISBLANK([.$H20]);[.$H20]<>"Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AS20];[.$AM20])) -- !!!!! modifié manuellement : supression du is_blank inutile !!!!! -- W=IF([.$H20]<>"Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20];[.$AJ20])) WHEN 'W' THEN IF vh.volume_horaire_ref_id IS NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l); RETURN cell('AP',l); ELSE RETURN cell('AM',l); RETURN cell('AJ',l); END IF; END IF; -- X=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AV20]*[.E20];[.$AO20]*[.E20])) -- X=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.E20];[.$AL20]*[.E20])) WHEN 'X' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AV',l) * vh.taux_fi; RETURN cell('AS',l) * vh.taux_fi; ELSE RETURN cell('AO',l) * vh.taux_fi; RETURN cell('AL',l) * vh.taux_fi; END IF; END IF; -- Y=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AV20]*[.F20];[.$AO20]*[.F20])) -- Y=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.F20];[.$AL20]*[.F20])) WHEN 'Y' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AV',l) * vh.taux_fa; RETURN cell('AS',l) * vh.taux_fa; ELSE RETURN cell('AO',l) * vh.taux_fa; RETURN cell('AL',l) * vh.taux_fa; END IF; END IF; -- Z=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AV20]*[.G20];[.$AO20]*[.G20])) -- Z=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.G20];[.$AL20]*[.G20])) WHEN 'Z' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AV',l) * vh.taux_fc; RETURN cell('AS',l) * vh.taux_fc; ELSE RETURN cell('AO',l) * vh.taux_fc; RETURN cell('AL',l) * vh.taux_fc; END IF; END IF; Loading @@ -231,55 +230,28 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS -- AB=IF(OR(ISBLANK([.$H20]);[.$H20]<>"Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AV20];[.$AO20])) -- !!!!! modifié manuellement : supression du is_blank inutile !!!!! -- AB=IF([.$H20]<>"Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20];[.$AL20])) WHEN 'AB' THEN IF vh.volume_horaire_ref_id IS NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AV',l); RETURN cell('AS',l); ELSE RETURN cell('AO',l); RETURN cell('AL',l); END IF; END IF; -- AE=IF([.M20]>0;SUMIF([.AD21:.AD$500];[.AD20];[.M21:.$M500])+[.M20];0) -- AE=IF(ISERROR([.I20]);1;[.I20])*[.K20] WHEN 'AE' THEN IF vh.heures > 0 THEN val := 0; FOR sumIfRow IN l + 1 .. ose_formule.volumes_horaires.LENGTH LOOP IF ose_formule.volumes_horaires.items(sumIfRow).param_5 = vh.param_5 THEN val := val + ose_formule.volumes_horaires.items(sumIfRow).heures; END IF; END LOOP; RETURN val + vh.heures; ELSE RETURN 0; END IF; -- AF=IF([.M20]>0;MIN([.M20];[.AE20]);0) WHEN 'AF' THEN IF vh.heures > 0 THEN RETURN LEAST(vh.heures, cell('AE',l)); ELSE RETURN 0; END IF; -- AH=IF(ISERROR([.I20]);1;[.I20])*[.K20] WHEN 'AH' THEN RETURN vh.taux_service_du * vh.ponderation_service_du; -- AI=IF(ISERROR([.J20]);1;IF(i_depassement_service_du_sans_hc="Oui";0;[.J20]))*[.L20] WHEN 'AI' THEN -- AF=IF(ISERROR([.J20]);1;IF(i_depassement_service_du_sans_hc="Oui";0;[.J20]))*[.L20] WHEN 'AF' THEN IF i.depassement_service_du_sans_hc THEN RETURN 0; ELSE Loading @@ -288,139 +260,131 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS -- AK=IF([.$D20]="Oui";[.$AF20]*[.$AH20];0) WHEN 'AK' THEN -- AH=IF([.$D20]="Oui";[.$M20]*[.$AE20];0) WHEN 'AH' THEN IF vh.service_statutaire THEN RETURN cell('AF',l) * cell('AH',l); RETURN vh.heures * cell('AE',l); ELSE RETURN 0; END IF; -- AL15=SUM([.AK$1:.AK$1048576]) WHEN 'AL15' THEN RETURN calcFnc('somme','AK'); -- AI15=SUM([.AH$1:.AH$1048576]) WHEN 'AI15' THEN RETURN calcFnc('somme','AH'); -- AL16=MIN([.AL15];i_service_du) WHEN 'AL16' THEN RETURN LEAST(cell('AL15'), i.service_du); -- AI16=MIN([.AI15];i_service_du) WHEN 'AI16' THEN RETURN LEAST(cell('AI15'), i.service_du); -- AL17=i_service_du-[.AL16] WHEN 'AL17' THEN RETURN i.service_du - cell('AL16'); -- AI17=i_service_du-[.AI16] WHEN 'AI17' THEN RETURN i.service_du - cell('AI16'); -- AL=IF([.AL$15]>0;[.AK20]/[.AL$15];0) WHEN 'AL' THEN IF cell('AL15') > 0 THEN RETURN cell('AK',l) / cell('AL15'); -- AI=IF([.AI$15]>0;[.AH20]/[.AI$15];0) WHEN 'AI' THEN IF cell('AI15') > 0 THEN RETURN cell('AH',l) / cell('AI15'); ELSE RETURN 0; END IF; -- AM=[.AL$16]*[.AL20] WHEN 'AM' THEN RETURN cell('AL16') * cell('AL',l); -- AJ=[.AI$16]*[.AI20] WHEN 'AJ' THEN RETURN cell('AI16') * cell('AI',l); -- AN=IF(AND([.AK20]>0;[.AL$17]=0);([.AK20]-[.AM20])/[.$AH20];0)+IF(AND([.AL$17]=0;[.D20]<>"Oui");[.AF20];0) WHEN 'AN' THEN IF cell('AK',l) > 0 AND cell('AL17') = 0 THEN IF cell('AL17') = 0 AND NOT vh.service_statutaire THEN RETURN ((cell('AK',l) - cell('AM',l)) / cell('AH',l)) + cell('AF',l); ELSE RETURN ((cell('AK',l) - cell('AM',l)) / cell('AH',l)); END IF; ELSE IF cell('AL17') = 0 AND NOT vh.service_statutaire THEN RETURN cell('AF',l); -- AK=IF([.AI$17]=0;([.AH20]-[.AJ20])/[.$AE20];0) WHEN 'AK' THEN IF cell('AI17') = 0 THEN RETURN (cell('AH',l) - cell('AJ',l)) / cell('AE',l); ELSE RETURN 0; END IF; END IF; -- AO=IF(i_depassement_service_du_sans_hc="Non";[.AN20]*[.$AI20];0) WHEN 'AO' THEN -- AL=IF(i_depassement_service_du_sans_hc="Non";[.AK20]*[.$AF20];0) WHEN 'AL' THEN IF NOT i.depassement_service_du_sans_hc THEN RETURN cell('AN',l) * cell('AI',l); RETURN cell('AK',l) * cell('AF',l); ELSE RETURN 0; END IF; -- AQ=IF([.$D20]="Oui";[.$AF20]*[.$AH20];0) WHEN 'AQ' THEN -- AN=IF([.$D20]="Oui";[.$M20]*[.$AE20];0) WHEN 'AN' THEN IF vh.service_statutaire THEN RETURN cell('AF',l) * cell('AH',l); RETURN vh.heures * cell('AE',l); ELSE RETURN 0; END IF; -- AR=IF([.AQ20]+[.AR19]>i_service_du;i_service_du;[.AQ20]+[.AR19]) WHEN 'AR' THEN IF cell('AQ',l) + cell('AR',l-1) > i.service_du THEN -- AO=IF([.AN20]+[.AO19]>i_service_du;i_service_du;[.AN20]+[.AO19]) WHEN 'AO' THEN IF cell('AN',l) + cell('AO',l-1) > i.service_du THEN RETURN i.service_du; ELSE RETURN cell('AQ',l) + cell('AR',l-1); RETURN cell('AN',l) + cell('AO',l-1); END IF; -- AS=[.AR20]-[.AR19] WHEN 'AS' THEN RETURN cell('AR',l) - cell('AR',l-1); -- AP=[.AO20]-[.AO19] WHEN 'AP' THEN RETURN cell('AO',l) - cell('AO',l-1); -- AT=IF([.AQ20]>0;([.AQ20]-[.AS20])/[.AH20];0) WHEN 'AT' THEN IF cell('AQ',l) > 0 THEN RETURN (cell('AQ',l) - cell('AS',l)) / cell('AH',l); -- AQ=IF([.AN20]>0;([.AN20]-[.AP20])/[.AE20];0) WHEN 'AQ' THEN IF cell('AN',l) > 0 THEN RETURN (cell('AN',l) - cell('AP',l)) / cell('AE',l); ELSE RETURN 0; END IF; -- AU=IF([.D20]="Oui";0;[.AF20]) WHEN 'AU' THEN -- AR=IF([.D20]="Oui";0;[.M20]) WHEN 'AR' THEN IF vh.service_statutaire THEN RETURN 0; ELSE RETURN cell('AF',l); RETURN vh.heures; END IF; -- AV=([.AT20]+[.AU20])*[.AI20] WHEN 'AV' THEN RETURN (cell('AT',l) + cell('AU',l)) * cell('AI',l); -- AS=([.AQ20]+[.AR20])*[.AF20] WHEN 'AS' THEN RETURN (cell('AQ',l) + cell('AR',l)) * cell('AF',l); -- AR19 WHEN 'AR19' THEN -- AO19 WHEN 'AO19' THEN RETURN 0; ELSE DBMS_OUTPUT.put_line('La colonne c=' || c || ', l=' || l || ' n''existe pas!'); dbms_output.put_line('La colonne c=' || c || ', l=' || l || ' n''existe pas!'); raise_application_error( -20001, 'La colonne c=' || c || ', l=' || l || ' n''existe pas!'); END CASE; raise_application_error( -20001, 'La colonne c=' || c || ', l=' || l || ' n''existe pas!'); Loading @@ -431,27 +395,19 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS PROCEDURE CALCUL_RESULTAT IS BEGIN feuille.DELETE; feuille.delete; IF ose_formule.intervenant.depassement_service_du_sans_hc THEN -- HC traitées comme du service ose_formule.intervenant.service_du := ose_formule.intervenant.heures_service_statutaire + ose_formule.intervenant.heures_service_modifie; IF ose_formule.intervenant.annee_id < 2022 THEN FORMULE_ULHN_2021.CALCUL_RESULTAT; RETURN; END IF; -- pré-traitement spécifique au Havre : à conserver lors de modifications ultérieures de la formule FOR l IN 1 .. ose_formule.volumes_horaires.LENGTH LOOP -- on est en réel : param_1 n'est pas utile puisqu'on a l'ID du service à dispo IF ose_formule.volumes_horaires.items(l).param_1 IS NULL THEN ose_formule.volumes_horaires.items(l).param_5 := COALESCE(ose_formule.volumes_horaires.items(l).service_id,0) || '-' || COALESCE(ose_formule.volumes_horaires.items(l).service_referentiel_id,0) || '-' || COALESCE(ose_formule.volumes_horaires.items(l).type_intervention_code,'0'); ELSE -- en mode test, on doit fournir param1 obligatoirement! ose_formule.volumes_horaires.items(l).param_5 := ose_formule.volumes_horaires.items(l).param_1 || '-' || COALESCE(ose_formule.volumes_horaires.items(l).type_intervention_code,'0'); IF ose_formule.intervenant.depassement_service_du_sans_hc THEN -- HC traitées comme du service ose_formule.intervenant.service_du := ose_formule.intervenant.heures_service_statutaire + ose_formule.intervenant.heures_service_modifie; END IF; END LOOP; -- transmission des résultats aux volumes horaires et volumes horaires référentiel FOR l IN 1 .. ose_formule.volumes_horaires.LENGTH LOOP FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP ose_formule.volumes_horaires.items(l).service_fi := mainCell('Service FI', 'T',l); ose_formule.volumes_horaires.items(l).service_fa := mainCell('Service FA', 'U',l); ose_formule.volumes_horaires.items(l).service_fc := mainCell('Service FC', 'V',l); Loading Loading @@ -487,14 +443,40 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS BEGIN RETURN ' SELECT fvh.*, NULL param_1, NULL param_2, NULL param_3, NULL param_4, NULL param_5 ORDRE, ID, VOLUME_HORAIRE_ID, VOLUME_HORAIRE_REF_ID, SERVICE_ID, SERVICE_REFERENTIEL_ID, INTERVENANT_ID, TYPE_INTERVENTION_ID, TYPE_VOLUME_HORAIRE_ID, ETAT_VOLUME_HORAIRE_ID, TYPE_VOLUME_HORAIRE_CODE, TAUX_FI, TAUX_FA, TAUX_FC, STRUCTURE_ID, STRUCTURE_CODE, STRUCTURE_IS_AFFECTATION, STRUCTURE_IS_UNIV, STRUCTURE_IS_EXTERIEUR, PONDERATION_SERVICE_DU, PONDERATION_SERVICE_COMPL, SERVICE_STATUTAIRE, CASE WHEN 0 > MIN(heures) OVER (PARTITION BY service_id, type_intervention_id, periode_id, horaire_debut, horaire_fin) THEN CASE WHEN volume_horaire_id = MIN(volume_horaire_id) OVER (PARTITION BY service_id, type_intervention_id, periode_id, horaire_debut, horaire_fin) THEN SUM(heures) OVER (PARTITION BY service_id, type_intervention_id, periode_id, horaire_debut, horaire_fin) ELSE 0 END ELSE heures END HEURES, HORAIRE_DEBUT, HORAIRE_FIN, TYPE_INTERVENTION_CODE, TAUX_SERVICE_DU, TAUX_SERVICE_COMPL FROM V_FORMULE_VOLUME_HORAIRE fvh v_formule_volume_horaire ORDER BY ordre '; Loading data/ddl/package/FORMULE_ULHN/definition.sql +1 −1 Original line number Diff line number Diff line CREATE OR REPLACE PACKAGE FORMULE_ULHN AS CREATE OR REPLACE PACKAGE "FORMULE_ULHN" AS PROCEDURE CALCUL_RESULTAT; Loading Loading
data/ddl/package/FORMULE_ULHN/body.sql +130 −148 Original line number Diff line number Diff line Loading @@ -43,8 +43,8 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS RETURN 0; END IF; IF feuille.EXISTS(c) THEN IF feuille(c).cells.EXISTS(l) THEN IF feuille.exists(c) THEN IF feuille(c).cells.exists(l) THEN IF feuille(c).cells(l).enCalcul THEN raise_application_error( -20001, 'Dépendance cyclique : la cellule [' || c || ';' || l || '] est déjà en cours de calcul'); END IF; Loading @@ -52,13 +52,13 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS END IF; END IF; feuille(c).cells(l).enCalcul := TRUE; feuille(c).cells(l).enCalcul := true; val := calcCell( c, l ); IF ose_formule.debug_actif THEN dbgCell( c, l, val ); END IF; feuille(c).cells(l).valeur := val; feuille(c).cells(l).enCalcul := FALSE; feuille(c).cells(l).enCalcul := false; RETURN val; END; Loading @@ -76,8 +76,8 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS val FLOAT; cellRes FLOAT; BEGIN IF feuille.EXISTS('__' || fncName || '__' || c || '__') THEN IF feuille('__' || fncName || '__' || c || '__').cells.EXISTS(1) THEN IF feuille.exists('__' || fncName || '__' || c || '__') THEN IF feuille('__' || fncName || '__' || c || '__').cells.exists(1) THEN RETURN feuille('__' || fncName || '__' || c || '__').cells(1).valeur; END IF; END IF; Loading @@ -86,13 +86,13 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS WHEN fncName = 'somme' THEN val := 0; FOR l IN 1 .. ose_formule.volumes_horaires.LENGTH LOOP FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP val := val + COALESCE(cell(c, l),0); END LOOP; WHEN fncName = 'max' THEN val := NULL; FOR l IN 1 .. ose_formule.volumes_horaires.LENGTH LOOP FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP cellRes := cell(c,l); IF val IS NULL OR val < cellRes THEN val := cellRes; Loading Loading @@ -126,100 +126,99 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS -- T=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.E20];[.$AM20]*[.E20])) -- T=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.E20];[.$AJ20]*[.E20])) WHEN 'T' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fi; RETURN cell('AP',l) * vh.taux_fi; ELSE RETURN cell('AM',l) * vh.taux_fi; RETURN cell('AJ',l) * vh.taux_fi; END IF; END IF; -- U=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.F20];[.$AM20]*[.F20])) -- U=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.F20];[.$AJ20]*[.F20])) WHEN 'U' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fa; RETURN cell('AP',l) * vh.taux_fa; ELSE RETURN cell('AM',l) * vh.taux_fa; RETURN cell('AJ',l) * vh.taux_fa; END IF; END IF; -- V=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.G20];[.$AM20]*[.G20])) -- V=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.G20];[.$AJ20]*[.G20])) WHEN 'V' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fc; RETURN cell('AP',l) * vh.taux_fc; ELSE RETURN cell('AM',l) * vh.taux_fc; RETURN cell('AJ',l) * vh.taux_fc; END IF; END IF; -- W=IF(OR(ISBLANK([.$H20]);[.$H20]<>"Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AS20];[.$AM20])) -- !!!!! modifié manuellement : supression du is_blank inutile !!!!! -- W=IF([.$H20]<>"Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20];[.$AJ20])) WHEN 'W' THEN IF vh.volume_horaire_ref_id IS NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l); RETURN cell('AP',l); ELSE RETURN cell('AM',l); RETURN cell('AJ',l); END IF; END IF; -- X=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AV20]*[.E20];[.$AO20]*[.E20])) -- X=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.E20];[.$AL20]*[.E20])) WHEN 'X' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AV',l) * vh.taux_fi; RETURN cell('AS',l) * vh.taux_fi; ELSE RETURN cell('AO',l) * vh.taux_fi; RETURN cell('AL',l) * vh.taux_fi; END IF; END IF; -- Y=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AV20]*[.F20];[.$AO20]*[.F20])) -- Y=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.F20];[.$AL20]*[.F20])) WHEN 'Y' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AV',l) * vh.taux_fa; RETURN cell('AS',l) * vh.taux_fa; ELSE RETURN cell('AO',l) * vh.taux_fa; RETURN cell('AL',l) * vh.taux_fa; END IF; END IF; -- Z=IF(OR(ISBLANK([.$H20]);[.$H20]="Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AV20]*[.G20];[.$AO20]*[.G20])) -- Z=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.G20];[.$AL20]*[.G20])) WHEN 'Z' THEN IF vh.type_intervention_code IS NULL OR vh.volume_horaire_ref_id IS NOT NULL THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AV',l) * vh.taux_fc; RETURN cell('AS',l) * vh.taux_fc; ELSE RETURN cell('AO',l) * vh.taux_fc; RETURN cell('AL',l) * vh.taux_fc; END IF; END IF; Loading @@ -231,55 +230,28 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS -- AB=IF(OR(ISBLANK([.$H20]);[.$H20]<>"Référentiel");0;IF(i_type_volume_horaire_code="REALISE";[.$AV20];[.$AO20])) -- !!!!! modifié manuellement : supression du is_blank inutile !!!!! -- AB=IF([.$H20]<>"Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20];[.$AL20])) WHEN 'AB' THEN IF vh.volume_horaire_ref_id IS NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AV',l); RETURN cell('AS',l); ELSE RETURN cell('AO',l); RETURN cell('AL',l); END IF; END IF; -- AE=IF([.M20]>0;SUMIF([.AD21:.AD$500];[.AD20];[.M21:.$M500])+[.M20];0) -- AE=IF(ISERROR([.I20]);1;[.I20])*[.K20] WHEN 'AE' THEN IF vh.heures > 0 THEN val := 0; FOR sumIfRow IN l + 1 .. ose_formule.volumes_horaires.LENGTH LOOP IF ose_formule.volumes_horaires.items(sumIfRow).param_5 = vh.param_5 THEN val := val + ose_formule.volumes_horaires.items(sumIfRow).heures; END IF; END LOOP; RETURN val + vh.heures; ELSE RETURN 0; END IF; -- AF=IF([.M20]>0;MIN([.M20];[.AE20]);0) WHEN 'AF' THEN IF vh.heures > 0 THEN RETURN LEAST(vh.heures, cell('AE',l)); ELSE RETURN 0; END IF; -- AH=IF(ISERROR([.I20]);1;[.I20])*[.K20] WHEN 'AH' THEN RETURN vh.taux_service_du * vh.ponderation_service_du; -- AI=IF(ISERROR([.J20]);1;IF(i_depassement_service_du_sans_hc="Oui";0;[.J20]))*[.L20] WHEN 'AI' THEN -- AF=IF(ISERROR([.J20]);1;IF(i_depassement_service_du_sans_hc="Oui";0;[.J20]))*[.L20] WHEN 'AF' THEN IF i.depassement_service_du_sans_hc THEN RETURN 0; ELSE Loading @@ -288,139 +260,131 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS -- AK=IF([.$D20]="Oui";[.$AF20]*[.$AH20];0) WHEN 'AK' THEN -- AH=IF([.$D20]="Oui";[.$M20]*[.$AE20];0) WHEN 'AH' THEN IF vh.service_statutaire THEN RETURN cell('AF',l) * cell('AH',l); RETURN vh.heures * cell('AE',l); ELSE RETURN 0; END IF; -- AL15=SUM([.AK$1:.AK$1048576]) WHEN 'AL15' THEN RETURN calcFnc('somme','AK'); -- AI15=SUM([.AH$1:.AH$1048576]) WHEN 'AI15' THEN RETURN calcFnc('somme','AH'); -- AL16=MIN([.AL15];i_service_du) WHEN 'AL16' THEN RETURN LEAST(cell('AL15'), i.service_du); -- AI16=MIN([.AI15];i_service_du) WHEN 'AI16' THEN RETURN LEAST(cell('AI15'), i.service_du); -- AL17=i_service_du-[.AL16] WHEN 'AL17' THEN RETURN i.service_du - cell('AL16'); -- AI17=i_service_du-[.AI16] WHEN 'AI17' THEN RETURN i.service_du - cell('AI16'); -- AL=IF([.AL$15]>0;[.AK20]/[.AL$15];0) WHEN 'AL' THEN IF cell('AL15') > 0 THEN RETURN cell('AK',l) / cell('AL15'); -- AI=IF([.AI$15]>0;[.AH20]/[.AI$15];0) WHEN 'AI' THEN IF cell('AI15') > 0 THEN RETURN cell('AH',l) / cell('AI15'); ELSE RETURN 0; END IF; -- AM=[.AL$16]*[.AL20] WHEN 'AM' THEN RETURN cell('AL16') * cell('AL',l); -- AJ=[.AI$16]*[.AI20] WHEN 'AJ' THEN RETURN cell('AI16') * cell('AI',l); -- AN=IF(AND([.AK20]>0;[.AL$17]=0);([.AK20]-[.AM20])/[.$AH20];0)+IF(AND([.AL$17]=0;[.D20]<>"Oui");[.AF20];0) WHEN 'AN' THEN IF cell('AK',l) > 0 AND cell('AL17') = 0 THEN IF cell('AL17') = 0 AND NOT vh.service_statutaire THEN RETURN ((cell('AK',l) - cell('AM',l)) / cell('AH',l)) + cell('AF',l); ELSE RETURN ((cell('AK',l) - cell('AM',l)) / cell('AH',l)); END IF; ELSE IF cell('AL17') = 0 AND NOT vh.service_statutaire THEN RETURN cell('AF',l); -- AK=IF([.AI$17]=0;([.AH20]-[.AJ20])/[.$AE20];0) WHEN 'AK' THEN IF cell('AI17') = 0 THEN RETURN (cell('AH',l) - cell('AJ',l)) / cell('AE',l); ELSE RETURN 0; END IF; END IF; -- AO=IF(i_depassement_service_du_sans_hc="Non";[.AN20]*[.$AI20];0) WHEN 'AO' THEN -- AL=IF(i_depassement_service_du_sans_hc="Non";[.AK20]*[.$AF20];0) WHEN 'AL' THEN IF NOT i.depassement_service_du_sans_hc THEN RETURN cell('AN',l) * cell('AI',l); RETURN cell('AK',l) * cell('AF',l); ELSE RETURN 0; END IF; -- AQ=IF([.$D20]="Oui";[.$AF20]*[.$AH20];0) WHEN 'AQ' THEN -- AN=IF([.$D20]="Oui";[.$M20]*[.$AE20];0) WHEN 'AN' THEN IF vh.service_statutaire THEN RETURN cell('AF',l) * cell('AH',l); RETURN vh.heures * cell('AE',l); ELSE RETURN 0; END IF; -- AR=IF([.AQ20]+[.AR19]>i_service_du;i_service_du;[.AQ20]+[.AR19]) WHEN 'AR' THEN IF cell('AQ',l) + cell('AR',l-1) > i.service_du THEN -- AO=IF([.AN20]+[.AO19]>i_service_du;i_service_du;[.AN20]+[.AO19]) WHEN 'AO' THEN IF cell('AN',l) + cell('AO',l-1) > i.service_du THEN RETURN i.service_du; ELSE RETURN cell('AQ',l) + cell('AR',l-1); RETURN cell('AN',l) + cell('AO',l-1); END IF; -- AS=[.AR20]-[.AR19] WHEN 'AS' THEN RETURN cell('AR',l) - cell('AR',l-1); -- AP=[.AO20]-[.AO19] WHEN 'AP' THEN RETURN cell('AO',l) - cell('AO',l-1); -- AT=IF([.AQ20]>0;([.AQ20]-[.AS20])/[.AH20];0) WHEN 'AT' THEN IF cell('AQ',l) > 0 THEN RETURN (cell('AQ',l) - cell('AS',l)) / cell('AH',l); -- AQ=IF([.AN20]>0;([.AN20]-[.AP20])/[.AE20];0) WHEN 'AQ' THEN IF cell('AN',l) > 0 THEN RETURN (cell('AN',l) - cell('AP',l)) / cell('AE',l); ELSE RETURN 0; END IF; -- AU=IF([.D20]="Oui";0;[.AF20]) WHEN 'AU' THEN -- AR=IF([.D20]="Oui";0;[.M20]) WHEN 'AR' THEN IF vh.service_statutaire THEN RETURN 0; ELSE RETURN cell('AF',l); RETURN vh.heures; END IF; -- AV=([.AT20]+[.AU20])*[.AI20] WHEN 'AV' THEN RETURN (cell('AT',l) + cell('AU',l)) * cell('AI',l); -- AS=([.AQ20]+[.AR20])*[.AF20] WHEN 'AS' THEN RETURN (cell('AQ',l) + cell('AR',l)) * cell('AF',l); -- AR19 WHEN 'AR19' THEN -- AO19 WHEN 'AO19' THEN RETURN 0; ELSE DBMS_OUTPUT.put_line('La colonne c=' || c || ', l=' || l || ' n''existe pas!'); dbms_output.put_line('La colonne c=' || c || ', l=' || l || ' n''existe pas!'); raise_application_error( -20001, 'La colonne c=' || c || ', l=' || l || ' n''existe pas!'); END CASE; raise_application_error( -20001, 'La colonne c=' || c || ', l=' || l || ' n''existe pas!'); Loading @@ -431,27 +395,19 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS PROCEDURE CALCUL_RESULTAT IS BEGIN feuille.DELETE; feuille.delete; IF ose_formule.intervenant.depassement_service_du_sans_hc THEN -- HC traitées comme du service ose_formule.intervenant.service_du := ose_formule.intervenant.heures_service_statutaire + ose_formule.intervenant.heures_service_modifie; IF ose_formule.intervenant.annee_id < 2022 THEN FORMULE_ULHN_2021.CALCUL_RESULTAT; RETURN; END IF; -- pré-traitement spécifique au Havre : à conserver lors de modifications ultérieures de la formule FOR l IN 1 .. ose_formule.volumes_horaires.LENGTH LOOP -- on est en réel : param_1 n'est pas utile puisqu'on a l'ID du service à dispo IF ose_formule.volumes_horaires.items(l).param_1 IS NULL THEN ose_formule.volumes_horaires.items(l).param_5 := COALESCE(ose_formule.volumes_horaires.items(l).service_id,0) || '-' || COALESCE(ose_formule.volumes_horaires.items(l).service_referentiel_id,0) || '-' || COALESCE(ose_formule.volumes_horaires.items(l).type_intervention_code,'0'); ELSE -- en mode test, on doit fournir param1 obligatoirement! ose_formule.volumes_horaires.items(l).param_5 := ose_formule.volumes_horaires.items(l).param_1 || '-' || COALESCE(ose_formule.volumes_horaires.items(l).type_intervention_code,'0'); IF ose_formule.intervenant.depassement_service_du_sans_hc THEN -- HC traitées comme du service ose_formule.intervenant.service_du := ose_formule.intervenant.heures_service_statutaire + ose_formule.intervenant.heures_service_modifie; END IF; END LOOP; -- transmission des résultats aux volumes horaires et volumes horaires référentiel FOR l IN 1 .. ose_formule.volumes_horaires.LENGTH LOOP FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP ose_formule.volumes_horaires.items(l).service_fi := mainCell('Service FI', 'T',l); ose_formule.volumes_horaires.items(l).service_fa := mainCell('Service FA', 'U',l); ose_formule.volumes_horaires.items(l).service_fc := mainCell('Service FC', 'V',l); Loading Loading @@ -487,14 +443,40 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS BEGIN RETURN ' SELECT fvh.*, NULL param_1, NULL param_2, NULL param_3, NULL param_4, NULL param_5 ORDRE, ID, VOLUME_HORAIRE_ID, VOLUME_HORAIRE_REF_ID, SERVICE_ID, SERVICE_REFERENTIEL_ID, INTERVENANT_ID, TYPE_INTERVENTION_ID, TYPE_VOLUME_HORAIRE_ID, ETAT_VOLUME_HORAIRE_ID, TYPE_VOLUME_HORAIRE_CODE, TAUX_FI, TAUX_FA, TAUX_FC, STRUCTURE_ID, STRUCTURE_CODE, STRUCTURE_IS_AFFECTATION, STRUCTURE_IS_UNIV, STRUCTURE_IS_EXTERIEUR, PONDERATION_SERVICE_DU, PONDERATION_SERVICE_COMPL, SERVICE_STATUTAIRE, CASE WHEN 0 > MIN(heures) OVER (PARTITION BY service_id, type_intervention_id, periode_id, horaire_debut, horaire_fin) THEN CASE WHEN volume_horaire_id = MIN(volume_horaire_id) OVER (PARTITION BY service_id, type_intervention_id, periode_id, horaire_debut, horaire_fin) THEN SUM(heures) OVER (PARTITION BY service_id, type_intervention_id, periode_id, horaire_debut, horaire_fin) ELSE 0 END ELSE heures END HEURES, HORAIRE_DEBUT, HORAIRE_FIN, TYPE_INTERVENTION_CODE, TAUX_SERVICE_DU, TAUX_SERVICE_COMPL FROM V_FORMULE_VOLUME_HORAIRE fvh v_formule_volume_horaire ORDER BY ordre '; Loading
data/ddl/package/FORMULE_ULHN/definition.sql +1 −1 Original line number Diff line number Diff line CREATE OR REPLACE PACKAGE FORMULE_ULHN AS CREATE OR REPLACE PACKAGE "FORMULE_ULHN" AS PROCEDURE CALCUL_RESULTAT; Loading