Commit 4f884d5e authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Nouvelle formule du Havre

parent 7ef2e596
Loading
Loading
Loading
Loading
+130 −148
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;

@@ -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
@@ -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!');
@@ -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);
@@ -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
    ';
+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;