Commit 987a80b2 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Nouvelle formule du Havre

(cherry picked from commit 4f884d5e)
parent c42fb189
Loading
Loading
Loading
Loading
+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 (
@@ -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
@@ -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
@@ -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);
@@ -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;



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

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