Loading data/ddl/package/FORMULE_ULHN/body.sql +248 −195 Original line number Diff line number Diff line CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS decalageLigne NUMERIC DEFAULT 21; CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS decalageLigne NUMERIC DEFAULT 19; /* Stockage des valeurs intermédiaires */ TYPE t_cell IS RECORD ( Loading @@ -16,24 +15,11 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS debugLine NUMERIC; PROCEDURE dbg( val CLOB ) IS BEGIN ose_formule.volumes_horaires.items(debugLine).debug_info := ose_formule.volumes_horaires.items(debugLine).debug_info || val; END; PROCEDURE dbgi( val CLOB ) IS BEGIN ose_formule.intervenant.debug_info := ose_formule.intervenant.debug_info || val; END; PROCEDURE dbgDump( val CLOB ) IS BEGIN dbg('<div class="dbg-dump">' || val || '</div>'); END; PROCEDURE dbgCell( c VARCHAR2, l NUMERIC, val FLOAT ) IS ligne NUMERIC; BEGIN Loading @@ -50,9 +36,13 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS dbgi( '[calc|' || fncName || '|' || c || '|' || res ); END; FUNCTION cell( c VARCHAR2, l NUMERIC DEFAULT 0 ) RETURN FLOAT IS FUNCTION cell( c VARCHAR2, l NUMERIC DEFAULT 9999 ) RETURN FLOAT IS val FLOAT; BEGIN IF l = 0 THEN RETURN 0; END IF; IF feuille.exists(c) THEN IF feuille(c).cells.exists(l) THEN IF feuille(c).cells(l).enCalcul THEN Loading Loading @@ -94,7 +84,7 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS CASE -- Liste des fonctions supportées WHEN fncName = 'total' THEN WHEN fncName = 'somme' THEN val := 0; FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP val := val + COALESCE(cell(c, l),0); Loading Loading @@ -122,257 +112,284 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS END; FUNCTION calcVersion RETURN NUMERIC IS BEGIN RETURN 1; END; FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT IS vh ose_formule.t_volume_horaire; i ose_formule.t_intervenant; v NUMERIC; val FLOAT; BEGIN v := calcVersion; i := ose_formule.intervenant; IF l > 0 THEN IF l > 0 AND l <> 9999 THEN vh := ose_formule.volumes_horaires.items(l); END IF; CASE CASE c -- j=SI(ESTVIDE(C22);0;RECHERCHEH(SI(ET(C22="TP";TP_vaut_TD="Oui");"TD";C22);types_intervention;2;0)) -- = RECHERCHEH(SI(ET(C22="TP";TP_vaut_TD="Oui");"TD";C22);types_intervention;2;0) WHEN c = 'j' AND v >= 1 THEN --RETURN GREATEST(vh.taux_service_du * vh.ponderation_service_du,1); RETURN vh.taux_service_du * vh.ponderation_service_du ; -- k=SI(ESTVIDE(C22);0;RECHERCHEH(C22;types_intervention;3;0)) -- =RECHERCHEH(C22;types_intervention;3;0) WHEN c = 'k' AND v >= 1 THEN RETURN vh.taux_service_compl; -- l=SI(H22="Oui";I22*J22;0) WHEN c = 'l' AND v >= 1 THEN IF vh.service_statutaire THEN RETURN vh.heures * cell( 'j', l ); ELSE -- T=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.E20];[.$AJ20]*[.E20])) WHEN 'T' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AP',l) * vh.taux_fi; ELSE RETURN cell('AJ',l) * vh.taux_fi; END IF; END IF; -- l522=SOMME(L22:L81) WHEN c = 'l522' AND v >= 1 THEN RETURN calcFnc('total','l'); -- n=SI($L$82>0;L22/$L$82;0) WHEN c = 'n' AND v >= 1 THEN IF cell('l522') > 0 THEN RETURN cell('l',l) / cell('l522'); ELSE -- U=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.F20];[.$AJ20]*[.F20])) WHEN 'U' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; END IF; -- o=MIN(service_du;$L$82)*N22 WHEN c = 'o' AND v >= 1 THEN RETURN LEAST(ose_formule.intervenant.service_du, cell('l522')) * cell('n',l); -- p=SI(L22<>0;O22/L22;0) WHEN c = 'p' AND v >= 1 THEN IF cell('l',l) <> 0 THEN RETURN cell('o',l) / cell('l',l); ELSE RETURN 0; END IF; -- q=SI($L$82>service_du;1-P22;0) WHEN c = 'q' AND v >= 1 THEN IF cell('l522') > ose_formule.intervenant.service_du THEN RETURN 1 - cell('p',l); IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AP',l) * vh.taux_fa; ELSE RETURN 0; RETURN cell('AJ',l) * vh.taux_fa; END IF; END IF; -- r=I22*Q22*K22 -- Changement : ajout de * vh.ponderation_service_du pour prendre en compte le modulateur WHEN c = 'r' AND v >= 1 THEN RETURN vh.heures * cell('q',l) * cell('k',l) * vh.ponderation_service_du; -- t=SI(service_du=0;0;SI(T21+L22>service_du;service_du;T21+L22)) WHEN c = 't' AND v >= 1 THEN IF l = 0 THEN RETURN 0; END IF; IF i.service_du = 0 THEN -- V=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.G20];[.$AJ20]*[.G20])) WHEN 'V' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF (cell('t',l-1) + cell('l',l)) > ose_formule.intervenant.service_du THEN RETURN ose_formule.intervenant.service_du; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AP',l) * vh.taux_fc; ELSE RETURN cell('t',l-1) + cell('l',l); RETURN cell('AJ',l) * vh.taux_fc; END IF; END IF; -- u=SI(service_du=0;0;SI(T21+L22>service_du;service_du-T21;L22)) WHEN c = 'u' AND v >= 1 THEN IF i.service_du = 0 THEN -- 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 --SI(T21+L22>service_du;service_du-T21;L22) IF cell('t',l-1) + cell('l',l) > i.service_du THEN RETURN i.service_du - cell('t',l-1); IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AP',l); ELSE RETURN cell('l',l); RETURN cell('AJ',l); END IF; END IF; -- v=SI(service_du=0;I22;SI(J22>0;SI(T21+L22<service_du;0;((T21+L22)-service_du)/J22);0)) WHEN c = 'v' AND v >= 1 THEN IF i.service_du = 0 THEN RETURN vh.heures; ELSE --SI(J22>0;SI(T21+L22<service_du;0;((T21+L22)-service_du)/J22);0) IF cell('j',l) > 0 THEN --SI(T21+L22<service_du;0;((T21+L22)-service_du)/J22) IF cell('t',l-1) + cell('l',l) < i.service_du THEN -- X=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.E20];[.$AL20]*[.E20])) WHEN 'X' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE --((T21+L22)-service_du)/J22 RETURN ((cell('t',l-1) + cell('l',l)) - i.service_du) / cell('j',l); END IF; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fi; ELSE RETURN 0; RETURN cell('AL',l) * vh.taux_fi; END IF; END IF; -- w=SI(OU(service_realise<service_du;HC_autorisees<>"Oui");0;(V22+SI(H22<>"Oui";I22;0))*K22) -- Changement : ajout de * vh.ponderation_service_du pour prendre en compte le modulateur WHEN c = 'w' AND v >= 1 THEN IF cell('service_realise') < ose_formule.intervenant.service_du OR ose_formule.intervenant.depassement_service_du_sans_hc THEN RETURN 0; ELSE --(V22+SI(H22<>"Oui";I22;0))*K22 RETURN (cell('v',l) + CASE WHEN NOT vh.service_statutaire THEN vh.heures ELSE 0 END ) * cell('k',l) * vh.ponderation_service_du; END IF; -- y=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$U22*D22;$O22*D22)) WHEN c = 'y' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN -- Y=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.F20];[.$AL20]*[.F20])) WHEN 'Y' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('u',l) * vh.taux_fi; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fa; ELSE RETURN cell('o',l) * vh.taux_fi; RETURN cell('AL',l) * vh.taux_fa; END IF; END IF; -- z=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$U22*E22;$O22*E22)) WHEN c = 'z' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN -- Z=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.G20];[.$AL20]*[.G20])) WHEN 'Z' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('u',l) * vh.taux_fa; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fc; ELSE RETURN cell('o',l) * vh.taux_fa; RETURN cell('AL',l) * vh.taux_fc; END IF; END IF; -- aa=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$U22*F22;$O22*F22)) WHEN c = 'aa' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN -- AA=0 WHEN 'AA' THEN RETURN 0; -- 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 ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('u',l) * vh.taux_fc; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l); ELSE RETURN cell('o',l) * vh.taux_fc; RETURN cell('AL',l); END IF; END IF; -- ab=SI($C22="Référentiel";SI(contexte_calcul="Réalisé";$U22;$R22);0) WHEN c = 'ab' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('u',l); -- AE=IF(ISERROR([.I20]);1;[.I20])*[.K20] WHEN 'AE' THEN RETURN vh.taux_service_du * vh.ponderation_service_du; -- 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 RETURN cell('r',l); RETURN vh.taux_service_compl * vh.ponderation_service_compl; END IF; -- AH=IF([.$D20]="Oui";[.$M20]*[.$AE20];0) WHEN 'AH' THEN IF vh.service_statutaire THEN RETURN vh.heures * cell('AE',l); ELSE RETURN 0; END IF; -- ac=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$V22*D22;$R22*D22)) WHEN c = 'ac' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('w',l) * vh.taux_fi; -- AI15=SUM([.AH$1:.AH$1048576]) WHEN 'AI15' THEN RETURN calcFnc('somme','AH'); -- AI16=MIN([.AI15];i_service_du) WHEN 'AI16' THEN RETURN LEAST(cell('AI15'), i.service_du); -- AI17=i_service_du-[.AI16] WHEN 'AI17' THEN RETURN i.service_du - cell('AI16'); -- 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 cell('r',l) * vh.taux_fi; END IF; RETURN 0; END IF; -- ad=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$V22*E22;$R22*E22)) WHEN c = 'ad' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('w',l) * vh.taux_fa; -- AJ=[.AI$16]*[.AI20] WHEN 'AJ' THEN RETURN cell('AI16') * cell('AI',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 cell('r',l) * vh.taux_fa; END IF; RETURN 0; END IF; -- ae=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$V22*F22;$R22*F22)) WHEN c = 'ae' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('w',l) * vh.taux_fc; -- 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('AK',l) * cell('AF',l); ELSE RETURN cell('r',l) * vh.taux_fc; END IF; RETURN 0; END IF; -- af=0 WHEN c = 'af' AND v >= 1 THEN -- AN=IF([.$D20]="Oui";[.$M20]*[.$AE20];0) WHEN 'AN' THEN IF vh.service_statutaire THEN RETURN vh.heures * cell('AE',l); ELSE RETURN 0; END IF; -- ag=SI($C22="Référentiel";SI(contexte_calcul="Réalisé";$V22;$R22);0) WHEN c = 'ag' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('w',l); -- 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('r',l); RETURN cell('AN',l) + cell('AO',l-1); END IF; -- AP=[.AO20]-[.AO19] WHEN 'AP' THEN RETURN cell('AO',l) - cell('AO',l-1); -- 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; -- d17=SI(contexte_calcul="Réalisé";MAX($T$22:$T$81);SOMME($O$22:$O$81)) WHEN c='service_realise' AND v >= 1 THEN IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN calcFnc('max','t'); -- AR=IF([.D20]="Oui";0;[.M20]) WHEN 'AR' THEN IF vh.service_statutaire THEN RETURN 0; ELSE RETURN calcFnc('total','o'); RETURN vh.heures; END IF; -- AS=([.AQ20]+[.AR20])*[.AF20] WHEN 'AS' THEN RETURN (cell('AQ',l) + cell('AR',l)) * cell('AF',l); -- AO19 WHEN 'AO19' THEN RETURN 0; ELSE 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!'); END CASE; END; END; Loading @@ -380,17 +397,26 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS BEGIN feuille.delete; IF ose_formule.intervenant.annee_id < 2022 THEN FORMULE_ULHN_2021.CALCUL_RESULTAT; RETURN; END IF; 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; -- transmission des résultats aux volumes horaires et volumes horaires référentiel FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP ose_formule.volumes_horaires.items(l).service_fi := mainCell('Service FI', 'y',l); ose_formule.volumes_horaires.items(l).service_fa := mainCell('Service FA', 'z',l); ose_formule.volumes_horaires.items(l).service_fc := mainCell('Service FC', 'aa',l); ose_formule.volumes_horaires.items(l).service_referentiel := mainCell('Service référentiel', 'ab',l); ose_formule.volumes_horaires.items(l).heures_compl_fi := mainCell('Heures compl. FI', 'ac',l); ose_formule.volumes_horaires.items(l).heures_compl_fa := mainCell('Heures compl. FA', 'ad',l); ose_formule.volumes_horaires.items(l).heures_compl_fc := mainCell('Heures compl. FC', 'ae',l); ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'af',l); ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'ag',l); 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); ose_formule.volumes_horaires.items(l).service_referentiel := mainCell('Service référentiel', 'W',l); ose_formule.volumes_horaires.items(l).heures_compl_fi := mainCell('Heures compl. FI', 'X',l); ose_formule.volumes_horaires.items(l).heures_compl_fa := mainCell('Heures compl. FA', 'Y',l); ose_formule.volumes_horaires.items(l).heures_compl_fc := mainCell('Heures compl. FC', 'Z',l); ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'AA',l); ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'AB',l); END LOOP; END; Loading @@ -417,16 +443,43 @@ 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'; ordre '; END; END FORMULE_ULHN; No newline at end of file Loading
data/ddl/package/FORMULE_ULHN/body.sql +248 −195 Original line number Diff line number Diff line CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS decalageLigne NUMERIC DEFAULT 21; CREATE OR REPLACE PACKAGE BODY FORMULE_ULHN AS decalageLigne NUMERIC DEFAULT 19; /* Stockage des valeurs intermédiaires */ TYPE t_cell IS RECORD ( Loading @@ -16,24 +15,11 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS debugLine NUMERIC; PROCEDURE dbg( val CLOB ) IS BEGIN ose_formule.volumes_horaires.items(debugLine).debug_info := ose_formule.volumes_horaires.items(debugLine).debug_info || val; END; PROCEDURE dbgi( val CLOB ) IS BEGIN ose_formule.intervenant.debug_info := ose_formule.intervenant.debug_info || val; END; PROCEDURE dbgDump( val CLOB ) IS BEGIN dbg('<div class="dbg-dump">' || val || '</div>'); END; PROCEDURE dbgCell( c VARCHAR2, l NUMERIC, val FLOAT ) IS ligne NUMERIC; BEGIN Loading @@ -50,9 +36,13 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS dbgi( '[calc|' || fncName || '|' || c || '|' || res ); END; FUNCTION cell( c VARCHAR2, l NUMERIC DEFAULT 0 ) RETURN FLOAT IS FUNCTION cell( c VARCHAR2, l NUMERIC DEFAULT 9999 ) RETURN FLOAT IS val FLOAT; BEGIN IF l = 0 THEN RETURN 0; END IF; IF feuille.exists(c) THEN IF feuille(c).cells.exists(l) THEN IF feuille(c).cells(l).enCalcul THEN Loading Loading @@ -94,7 +84,7 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS CASE -- Liste des fonctions supportées WHEN fncName = 'total' THEN WHEN fncName = 'somme' THEN val := 0; FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP val := val + COALESCE(cell(c, l),0); Loading Loading @@ -122,257 +112,284 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS END; FUNCTION calcVersion RETURN NUMERIC IS BEGIN RETURN 1; END; FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT IS vh ose_formule.t_volume_horaire; i ose_formule.t_intervenant; v NUMERIC; val FLOAT; BEGIN v := calcVersion; i := ose_formule.intervenant; IF l > 0 THEN IF l > 0 AND l <> 9999 THEN vh := ose_formule.volumes_horaires.items(l); END IF; CASE CASE c -- j=SI(ESTVIDE(C22);0;RECHERCHEH(SI(ET(C22="TP";TP_vaut_TD="Oui");"TD";C22);types_intervention;2;0)) -- = RECHERCHEH(SI(ET(C22="TP";TP_vaut_TD="Oui");"TD";C22);types_intervention;2;0) WHEN c = 'j' AND v >= 1 THEN --RETURN GREATEST(vh.taux_service_du * vh.ponderation_service_du,1); RETURN vh.taux_service_du * vh.ponderation_service_du ; -- k=SI(ESTVIDE(C22);0;RECHERCHEH(C22;types_intervention;3;0)) -- =RECHERCHEH(C22;types_intervention;3;0) WHEN c = 'k' AND v >= 1 THEN RETURN vh.taux_service_compl; -- l=SI(H22="Oui";I22*J22;0) WHEN c = 'l' AND v >= 1 THEN IF vh.service_statutaire THEN RETURN vh.heures * cell( 'j', l ); ELSE -- T=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.E20];[.$AJ20]*[.E20])) WHEN 'T' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AP',l) * vh.taux_fi; ELSE RETURN cell('AJ',l) * vh.taux_fi; END IF; END IF; -- l522=SOMME(L22:L81) WHEN c = 'l522' AND v >= 1 THEN RETURN calcFnc('total','l'); -- n=SI($L$82>0;L22/$L$82;0) WHEN c = 'n' AND v >= 1 THEN IF cell('l522') > 0 THEN RETURN cell('l',l) / cell('l522'); ELSE -- U=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.F20];[.$AJ20]*[.F20])) WHEN 'U' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; END IF; -- o=MIN(service_du;$L$82)*N22 WHEN c = 'o' AND v >= 1 THEN RETURN LEAST(ose_formule.intervenant.service_du, cell('l522')) * cell('n',l); -- p=SI(L22<>0;O22/L22;0) WHEN c = 'p' AND v >= 1 THEN IF cell('l',l) <> 0 THEN RETURN cell('o',l) / cell('l',l); ELSE RETURN 0; END IF; -- q=SI($L$82>service_du;1-P22;0) WHEN c = 'q' AND v >= 1 THEN IF cell('l522') > ose_formule.intervenant.service_du THEN RETURN 1 - cell('p',l); IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AP',l) * vh.taux_fa; ELSE RETURN 0; RETURN cell('AJ',l) * vh.taux_fa; END IF; END IF; -- r=I22*Q22*K22 -- Changement : ajout de * vh.ponderation_service_du pour prendre en compte le modulateur WHEN c = 'r' AND v >= 1 THEN RETURN vh.heures * cell('q',l) * cell('k',l) * vh.ponderation_service_du; -- t=SI(service_du=0;0;SI(T21+L22>service_du;service_du;T21+L22)) WHEN c = 't' AND v >= 1 THEN IF l = 0 THEN RETURN 0; END IF; IF i.service_du = 0 THEN -- V=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AP20]*[.G20];[.$AJ20]*[.G20])) WHEN 'V' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF (cell('t',l-1) + cell('l',l)) > ose_formule.intervenant.service_du THEN RETURN ose_formule.intervenant.service_du; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AP',l) * vh.taux_fc; ELSE RETURN cell('t',l-1) + cell('l',l); RETURN cell('AJ',l) * vh.taux_fc; END IF; END IF; -- u=SI(service_du=0;0;SI(T21+L22>service_du;service_du-T21;L22)) WHEN c = 'u' AND v >= 1 THEN IF i.service_du = 0 THEN -- 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 --SI(T21+L22>service_du;service_du-T21;L22) IF cell('t',l-1) + cell('l',l) > i.service_du THEN RETURN i.service_du - cell('t',l-1); IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AP',l); ELSE RETURN cell('l',l); RETURN cell('AJ',l); END IF; END IF; -- v=SI(service_du=0;I22;SI(J22>0;SI(T21+L22<service_du;0;((T21+L22)-service_du)/J22);0)) WHEN c = 'v' AND v >= 1 THEN IF i.service_du = 0 THEN RETURN vh.heures; ELSE --SI(J22>0;SI(T21+L22<service_du;0;((T21+L22)-service_du)/J22);0) IF cell('j',l) > 0 THEN --SI(T21+L22<service_du;0;((T21+L22)-service_du)/J22) IF cell('t',l-1) + cell('l',l) < i.service_du THEN -- X=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.E20];[.$AL20]*[.E20])) WHEN 'X' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE --((T21+L22)-service_du)/J22 RETURN ((cell('t',l-1) + cell('l',l)) - i.service_du) / cell('j',l); END IF; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fi; ELSE RETURN 0; RETURN cell('AL',l) * vh.taux_fi; END IF; END IF; -- w=SI(OU(service_realise<service_du;HC_autorisees<>"Oui");0;(V22+SI(H22<>"Oui";I22;0))*K22) -- Changement : ajout de * vh.ponderation_service_du pour prendre en compte le modulateur WHEN c = 'w' AND v >= 1 THEN IF cell('service_realise') < ose_formule.intervenant.service_du OR ose_formule.intervenant.depassement_service_du_sans_hc THEN RETURN 0; ELSE --(V22+SI(H22<>"Oui";I22;0))*K22 RETURN (cell('v',l) + CASE WHEN NOT vh.service_statutaire THEN vh.heures ELSE 0 END ) * cell('k',l) * vh.ponderation_service_du; END IF; -- y=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$U22*D22;$O22*D22)) WHEN c = 'y' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN -- Y=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.F20];[.$AL20]*[.F20])) WHEN 'Y' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('u',l) * vh.taux_fi; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fa; ELSE RETURN cell('o',l) * vh.taux_fi; RETURN cell('AL',l) * vh.taux_fa; END IF; END IF; -- z=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$U22*E22;$O22*E22)) WHEN c = 'z' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN -- Z=IF([.$H20]="Référentiel";0;IF(i_type_volume_horaire_code="REALISE";[.$AS20]*[.G20];[.$AL20]*[.G20])) WHEN 'Z' THEN IF vh.volume_horaire_ref_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('u',l) * vh.taux_fa; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l) * vh.taux_fc; ELSE RETURN cell('o',l) * vh.taux_fa; RETURN cell('AL',l) * vh.taux_fc; END IF; END IF; -- aa=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$U22*F22;$O22*F22)) WHEN c = 'aa' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN -- AA=0 WHEN 'AA' THEN RETURN 0; -- 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 ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('u',l) * vh.taux_fc; IF vh.type_volume_horaire_code = 'REALISE' THEN RETURN cell('AS',l); ELSE RETURN cell('o',l) * vh.taux_fc; RETURN cell('AL',l); END IF; END IF; -- ab=SI($C22="Référentiel";SI(contexte_calcul="Réalisé";$U22;$R22);0) WHEN c = 'ab' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('u',l); -- AE=IF(ISERROR([.I20]);1;[.I20])*[.K20] WHEN 'AE' THEN RETURN vh.taux_service_du * vh.ponderation_service_du; -- 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 RETURN cell('r',l); RETURN vh.taux_service_compl * vh.ponderation_service_compl; END IF; -- AH=IF([.$D20]="Oui";[.$M20]*[.$AE20];0) WHEN 'AH' THEN IF vh.service_statutaire THEN RETURN vh.heures * cell('AE',l); ELSE RETURN 0; END IF; -- ac=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$V22*D22;$R22*D22)) WHEN c = 'ac' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('w',l) * vh.taux_fi; -- AI15=SUM([.AH$1:.AH$1048576]) WHEN 'AI15' THEN RETURN calcFnc('somme','AH'); -- AI16=MIN([.AI15];i_service_du) WHEN 'AI16' THEN RETURN LEAST(cell('AI15'), i.service_du); -- AI17=i_service_du-[.AI16] WHEN 'AI17' THEN RETURN i.service_du - cell('AI16'); -- 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 cell('r',l) * vh.taux_fi; END IF; RETURN 0; END IF; -- ad=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$V22*E22;$R22*E22)) WHEN c = 'ad' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('w',l) * vh.taux_fa; -- AJ=[.AI$16]*[.AI20] WHEN 'AJ' THEN RETURN cell('AI16') * cell('AI',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 cell('r',l) * vh.taux_fa; END IF; RETURN 0; END IF; -- ae=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$V22*F22;$R22*F22)) WHEN c = 'ae' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN RETURN 0; ELSE IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('w',l) * vh.taux_fc; -- 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('AK',l) * cell('AF',l); ELSE RETURN cell('r',l) * vh.taux_fc; END IF; RETURN 0; END IF; -- af=0 WHEN c = 'af' AND v >= 1 THEN -- AN=IF([.$D20]="Oui";[.$M20]*[.$AE20];0) WHEN 'AN' THEN IF vh.service_statutaire THEN RETURN vh.heures * cell('AE',l); ELSE RETURN 0; END IF; -- ag=SI($C22="Référentiel";SI(contexte_calcul="Réalisé";$V22;$R22);0) WHEN c = 'ag' AND v >= 1 THEN IF vh.service_referentiel_id IS NOT NULL THEN IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN cell('w',l); -- 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('r',l); RETURN cell('AN',l) + cell('AO',l-1); END IF; -- AP=[.AO20]-[.AO19] WHEN 'AP' THEN RETURN cell('AO',l) - cell('AO',l-1); -- 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; -- d17=SI(contexte_calcul="Réalisé";MAX($T$22:$T$81);SOMME($O$22:$O$81)) WHEN c='service_realise' AND v >= 1 THEN IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN RETURN calcFnc('max','t'); -- AR=IF([.D20]="Oui";0;[.M20]) WHEN 'AR' THEN IF vh.service_statutaire THEN RETURN 0; ELSE RETURN calcFnc('total','o'); RETURN vh.heures; END IF; -- AS=([.AQ20]+[.AR20])*[.AF20] WHEN 'AS' THEN RETURN (cell('AQ',l) + cell('AR',l)) * cell('AF',l); -- AO19 WHEN 'AO19' THEN RETURN 0; ELSE 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!'); END CASE; END; END; Loading @@ -380,17 +397,26 @@ CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS BEGIN feuille.delete; IF ose_formule.intervenant.annee_id < 2022 THEN FORMULE_ULHN_2021.CALCUL_RESULTAT; RETURN; END IF; 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; -- transmission des résultats aux volumes horaires et volumes horaires référentiel FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP ose_formule.volumes_horaires.items(l).service_fi := mainCell('Service FI', 'y',l); ose_formule.volumes_horaires.items(l).service_fa := mainCell('Service FA', 'z',l); ose_formule.volumes_horaires.items(l).service_fc := mainCell('Service FC', 'aa',l); ose_formule.volumes_horaires.items(l).service_referentiel := mainCell('Service référentiel', 'ab',l); ose_formule.volumes_horaires.items(l).heures_compl_fi := mainCell('Heures compl. FI', 'ac',l); ose_formule.volumes_horaires.items(l).heures_compl_fa := mainCell('Heures compl. FA', 'ad',l); ose_formule.volumes_horaires.items(l).heures_compl_fc := mainCell('Heures compl. FC', 'ae',l); ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'af',l); ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'ag',l); 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); ose_formule.volumes_horaires.items(l).service_referentiel := mainCell('Service référentiel', 'W',l); ose_formule.volumes_horaires.items(l).heures_compl_fi := mainCell('Heures compl. FI', 'X',l); ose_formule.volumes_horaires.items(l).heures_compl_fa := mainCell('Heures compl. FA', 'Y',l); ose_formule.volumes_horaires.items(l).heures_compl_fc := mainCell('Heures compl. FC', 'Z',l); ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'AA',l); ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'AB',l); END LOOP; END; Loading @@ -417,16 +443,43 @@ 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'; ordre '; END; END FORMULE_ULHN; No newline at end of file