Commit 7d90c543 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Formule Lyon2 modifiée

parent 061527cc
Loading
Loading
Loading
Loading
+356 −282
Original line number Diff line number Diff line
CREATE OR REPLACE PACKAGE BODY FORMULE_LYON2 AS
  decalageLigne NUMERIC DEFAULT 21;

  decalageLigne NUMERIC DEFAULT 19;

  /* Stockage des valeurs intermédiaires */
  TYPE t_cell IS RECORD (
@@ -16,24 +15,11 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_LYON2 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_LYON2 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_LYON2 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,431 +112,510 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_LYON2 AS
  END;


  FUNCTION calcVersion RETURN NUMERIC IS
  BEGIN
    RETURN 1;
  END;



  FUNCTION isOui( v VARCHAR2 DEFAULT NULL ) RETURN BOOLEAN IS
  BEGIN
    RETURN LOWER(v) IN ('1','oui','true');
  END;

  FUNCTION isD4DAC10000( v VARCHAR2 DEFAULT NULL ) RETURN BOOLEAN IS
  BEGIN
    RETURN UPPER(v) IN ('D4DAC10000');
  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=H22*I22
    WHEN c = 'J' AND v >= 1 THEN
      RETURN vh.heures * vh.taux_service_du;
      -- U=IF([.$I20]="Référentiel";0;([.$AJ20]+[.$AP20]+[.$AV20]+[.$BB20]+[.$BN20])*[.F20])
      WHEN 'U' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
          RETURN (cell('AJ',l) + cell('AP',l) + cell('AV',l) + cell('BB',l) + cell('BN',l)) * vh.taux_fi;
        END IF;



    -- L=SI($H22="";0;SI(ET($B22=composante_affectation;$G22<>1;$B22<>"D4DAC10000";$D22<>"Référentiel";$C22="Oui");$J22;0))
    WHEN c = 'L' AND v >= 1 THEN
      --SI(ET($B22=composante_affectation;$G22<>1;$B22<>"D4DAC10000";$D22<>"Référentiel";$C22="Oui");$J22;0)
      IF vh.structure_is_affectation AND vh.taux_fc <> 1 AND (NOT isD4DAC10000(vh.structure_code)) AND vh.volume_horaire_ref_id IS NULL AND vh.structure_code IS NOT NULL THEN
        RETURN cell('J', l);
      ELSE
      -- V=IF([.$I20]="Référentiel";0;([.$AJ20]+[.$AP20]+[.$AV20]+[.$BB20]+[.$BN20])*[.G20])
      WHEN 'V' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
          RETURN (cell('AJ',l) + cell('AP',l) + cell('AV',l) + cell('BB',l) + cell('BN',l)) * vh.taux_fa;
        END IF;



    -- M=SI(L$52>0;L22/L$52;0)
    WHEN c = 'M' AND v >= 1 THEN
      IF cell('L52') > 0 THEN
        RETURN cell('L', l) / cell('L52');
      ELSE
      -- W=IF([.$I20]="Référentiel";0;([.$AJ20]+[.$AP20]+[.$AV20]+[.$BB20]+[.$BN20])*[.H20])
      WHEN 'W' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
          RETURN (cell('AJ',l) + cell('AP',l) + cell('AV',l) + cell('BB',l) + cell('BN',l)) * vh.taux_fc;
        END IF;



    -- N=L$53*M22
    WHEN c = 'N' AND v >= 1 THEN
      RETURN cell('L53') * cell('M', l);
      -- X=IF([.$I20]="Référentiel";[.$BH20];0)
      WHEN 'X' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN cell('BH',l);
        ELSE
          RETURN 0;
        END IF;



    -- O=SI(ET(L$54=0;HC_autorisees="Oui");L22-N22;0)
    WHEN c = 'O' AND v >= 1 THEN
      IF cell('L54') = 0 AND NOT i.depassement_service_du_sans_hc THEN
        RETURN cell('L', l) - cell('N', l);
      ELSE
      -- Y=IF([.$I20]="Référentiel";0;([.$AL20]+[.$AR20]+[.$AX20]+[.$BD20]+[.$BP20])*[.F20])
      WHEN 'Y' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
          RETURN (cell('AL',l) + cell('AR',l) + cell('AX',l) + cell('BD',l) + cell('BP',l)) * vh.taux_fi;
        END IF;



    -- Q=SI($H22="";0;SI(ET($B22<>composante_affectation;$G22<>1;$B22<>"D4DAC10000";$D22<>"Référentiel";$C22="Oui");$J22;0))
    WHEN c = 'Q' AND v >= 1 THEN
      --SI(ET($B22<>composante_affectation;$G22<>1;$B22<>"D4DAC10000";$D22<>"Référentiel";$C22="Oui");$J22;0)
      IF (NOT vh.structure_is_affectation) AND vh.taux_fc <> 1 AND (NOT isD4DAC10000(vh.structure_code)) AND vh.volume_horaire_ref_id IS NULL AND vh.structure_code IS NOT NULL THEN
        RETURN cell('J', l);
      ELSE
      -- Z=IF([.$I20]="Référentiel";0;([.$AL20]+[.$AR20]+[.$AX20]+[.$BD20]+[.$BP20])*[.G20])
      WHEN 'Z' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
          RETURN (cell('AL',l) + cell('AR',l) + cell('AX',l) + cell('BD',l) + cell('BP',l)) * vh.taux_fa;
        END IF;



    -- R=SI(Q$52>0;Q22/Q$52;0)
    WHEN c = 'R' AND v >= 1 THEN
      IF cell('Q52', l) > 0 THEN
        RETURN cell('Q', l) / cell('Q52');
      ELSE
      -- AA=IF([.$I20]="Référentiel";0;([.$AL20]+[.$AR20]+[.$AX20]+[.$BD20]+[.$BP20])*[.H20])
      WHEN 'AA' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
          RETURN (cell('AL',l) + cell('AR',l) + cell('AX',l) + cell('BD',l) + cell('BP',l)) * vh.taux_fc;
        END IF;



    -- S=Q$53*R22
    WHEN c = 'S' AND v >= 1 THEN
      RETURN cell('Q53') * cell('R', l);
      -- AB=0
      WHEN 'AB' THEN
        RETURN 0;



    -- T=SI(ET(Q$54=0;HC_autorisees="Oui");Q22-S22;0)
    WHEN c = 'T' AND v >= 1 THEN
      IF cell('Q54', l) = 0 AND NOT i.depassement_service_du_sans_hc THEN
        RETURN cell('Q', l) - cell('S', l);
      -- AC=IF([.$I20]="Référentiel";[.$BJ20];0)
      WHEN 'AC' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN cell('BJ',l);
        ELSE
          RETURN 0;
        END IF;



    -- V=SI($H22="";0;SI(ET($G22=1;$B22<>"D4DAC10000";$D22<>"Référentiel";$C22="Oui");$J22;0))
    WHEN c = 'V' AND v >= 1 THEN
      --SI(ET($G22=1;$B22<>"D4DAC10000";$D22<>"Référentiel";$C22="Oui");$J22;0)
      IF vh.taux_fc = 1 AND (NOT isD4DAC10000(vh.structure_code)) AND vh.volume_horaire_ref_id IS NULL AND vh.structure_code IS NOT NULL THEN
        RETURN cell('J', l);
      -- AE=IF(ISERROR([.J20]);1;[.J20])
      WHEN 'AE' THEN
        RETURN vh.taux_service_du;



      -- AF=IF(ISERROR([.K20]);1;[.K20])
      WHEN 'AF' THEN
        RETURN vh.taux_service_compl;



      -- AH=IF(AND([.$A20]<>"D4DAC10000";[.$B20]="Oui";[.$D20]<>"Oui";[.$H20]<>1;[.$I20]<>"Référentiel");[.$N20]*[.$AE20];0)
      WHEN 'AH' THEN
        IF vh.structure_code <> 'D4DAC10000' AND vh.structure_is_affectation AND NOT vh.structure_is_exterieur AND vh.taux_fc <> 1 AND vh.volume_horaire_ref_id IS NULL THEN
          RETURN vh.heures * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



    -- W=SI(V$52>0;V22/V$52;0)
    WHEN c = 'W' AND v >= 1 THEN
      IF cell('V52') > 0 THEN
        RETURN cell('V', l) / cell('V52');
      -- 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 0;
        END IF;



    -- X=V$53*W22
    WHEN c = 'X' AND v >= 1 THEN
      RETURN cell('V53') * cell('W', l);
      -- AJ=[.AI$16]*[.AI20]
      WHEN 'AJ' THEN
        RETURN cell('AI16') * cell('AI',l);



    -- Y=SI(ET(V$54=0;HC_autorisees="Oui");V22-X22;0)
    WHEN c = 'Y' AND v >= 1 THEN
      IF cell('V54') = 0 AND NOT i.depassement_service_du_sans_hc THEN
        RETURN cell('V', l) - cell('X', 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;



    -- AA=SI($H22="";0;SI(ET($B22="D4DAC10000";$D22<>"Référentiel";$C22="Oui");$J22;0))
    WHEN c = 'AA' AND v >= 1 THEN
      --SI(ET($B22="D4DAC10000";$D22<>"Référentiel";$C22="Oui");$J22;0)
      IF isD4DAC10000(vh.structure_code) AND vh.volume_horaire_ref_id IS NULL AND vh.structure_code IS NOT NULL THEN
        RETURN cell('J', l);
      -- 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 0;
        END IF;



    -- AB=SI(AA$52>0;AA22/AA$52;0)
    WHEN c = 'AB' AND v >= 1 THEN
      IF cell('AA52') > 0 THEN
        RETURN cell('AA', l) / cell('AA52');
      -- AN=IF(AND([.$A20]<>"D4DAC10000";[.$B20]<>"Oui";[.$D20]<>"Oui";[.$H20]<>1;[.$I20]<>"Référentiel");[.$N20]*[.$AE20];0)
      WHEN 'AN' THEN
        IF vh.structure_code <> 'D4DAC10000' AND NOT vh.structure_is_affectation AND NOT vh.structure_is_exterieur AND vh.taux_fc <> 1 AND vh.volume_horaire_ref_id IS NULL THEN
          RETURN vh.heures * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



    -- AC=AA$53*AB22
    WHEN c = 'AC' AND v >= 1 THEN
      RETURN cell('AA53') * cell('AB', l);
      -- AO15=SUM([.AN$1:.AN$1048576])
      WHEN 'AO15' THEN
        RETURN calcFnc('somme','AN');



    -- AD=SI(ET(AA$54=0;HC_autorisees="Oui");AA22-AC22;0)
    WHEN c = 'AD' AND v >= 1 THEN
      IF cell('AA54') = 0 AND NOT i.depassement_service_du_sans_hc THEN
        RETURN cell('AA', l) - cell('AC', l);
      ELSE
        RETURN 0;
      END IF;
      -- AO16=MIN([.AO15];[.AI17])
      WHEN 'AO16' THEN
        RETURN LEAST(cell('AO15'), cell('AI17'));



    -- AF=SI($H22="";0;SI(ET($D22="Référentiel");$J22;0))
    WHEN c = 'AF' AND v >= 1 THEN
      IF vh.volume_horaire_ref_id IS NOT NULL THEN
        RETURN cell('J', l);
      ELSE
        RETURN 0;
      END IF;
      -- AO17=[.AI17]-[.AO16]
      WHEN 'AO17' THEN
        RETURN cell('AI17') - cell('AO16');



    -- AG=SI(AF$52>0;AF22/AF$52;0)
    WHEN c = 'AG' AND v >= 1 THEN
      IF cell('AF52') > 0 THEN
        RETURN cell('AF', l) / cell('AF52');
      -- AO=IF([.AO$15]>0;[.AN20]/[.AO$15];0)
      WHEN 'AO' THEN
        IF cell('AO15') > 0 THEN
          RETURN cell('AN',l) / cell('AO15');
        ELSE
          RETURN 0;
        END IF;



    -- AH=AF$53*AG22
    WHEN c = 'AH' AND v >= 1 THEN
      RETURN cell('AF53') * cell('AG', l);
      -- AP=[.AO$16]*[.AO20]
      WHEN 'AP' THEN
        RETURN cell('AO16') * cell('AO',l);



    -- AI=SI(ET(AF$54=0;HC_autorisees="Oui");AF22-AH22;0)
    WHEN c = 'AI' AND v >= 1 THEN
      IF cell('AF54') = 0 AND NOT i.depassement_service_du_sans_hc THEN
        RETURN cell('AF', l) - cell('AH', l);
      -- AQ=IF([.AO$17]=0;([.AN20]-[.AP20])/[.$AE20];0)
      WHEN 'AQ' THEN
        IF cell('AO17') = 0 THEN
          RETURN (cell('AN',l) - cell('AP',l)) / cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



    -- AK=SI($H22="";0;SI(ET($D22<>"Référentiel";$C22<>"Oui");$J22;0))
    WHEN c = 'AK' AND v >= 1 THEN
      IF vh.volume_horaire_ref_id IS NULL AND vh.structure_code IS NULL THEN
        RETURN cell('J', l);
      -- AR=IF(i_depassement_service_du_sans_hc="Non";[.AQ20]*[.$AF20];0)
      WHEN 'AR' THEN
        IF NOT i.depassement_service_du_sans_hc THEN
          RETURN cell('AQ',l) * cell('AF',l);
        ELSE
          RETURN 0;
        END IF;



    -- AL=SI(AK$52>0;AK22/AK$52;0)
    WHEN c = 'AL' AND v >= 1 THEN
      IF cell('AK52') > 0 THEN
        RETURN cell('AK', l) / cell('AK52');
      -- AT=IF(AND([.$A20]<>"D4DAC10000";[.$D20]<>"Oui";[.$H20]=1;[.$I20]<>"Référentiel");[.$N20]*[.$AE20];0)
      WHEN 'AT' THEN
        IF vh.structure_code <> 'D4DAC10000' AND NOT vh.structure_is_exterieur AND vh.taux_fc = 1 AND vh.volume_horaire_ref_id IS NULL THEN
          RETURN vh.heures * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



    -- AM=AK$53*AL22
    WHEN c = 'AM' AND v >= 1 THEN
      RETURN cell('AK53') * cell('AL', l);
      -- AU15=SUM([.AT$1:.AT$1048576])
      WHEN 'AU15' THEN
        RETURN calcFnc('somme','AT');



    -- AN=SI(ET(AK$54=0;HC_autorisees="Oui");AK22-AM22;0)
    WHEN c = 'AN' AND v >= 1 THEN
      IF cell('AK54') = 0 AND NOT i.depassement_service_du_sans_hc THEN
        RETURN cell('AK', l) - cell('AM', l);
      -- AU16=MIN([.AU15];[.AO17])
      WHEN 'AU16' THEN
        RETURN LEAST(cell('AU15'), cell('AO17'));



      -- AU17=[.AO17]-[.AU16]
      WHEN 'AU17' THEN
        RETURN cell('AO17') - cell('AU16');



      -- AU=IF([.AU$15]>0;[.AT20]/[.AU$15];0)
      WHEN 'AU' THEN
        IF cell('AU15') > 0 THEN
          RETURN cell('AT',l) / cell('AU15');
        ELSE
          RETURN 0;
        END IF;



    -- AP=($N22+$S22+$AC22+$AM22)*SI(E22="";0;E22)
    WHEN c = 'AP' AND v >= 1 THEN
      RETURN (cell('N', l) + cell('S', l) + cell('AC', l) + cell('AM', l)) * vh.taux_fi;
      -- AV=[.AU$16]*[.AU20]
      WHEN 'AV' THEN
        RETURN cell('AU16') * cell('AU',l);



    -- AQ=($N22+$S22+$AC22+$AM22)*SI(F22="";0;F22)
    WHEN c = 'AQ' AND v >= 1 THEN
      RETURN (cell('N', l) + cell('S', l) + cell('AC', l) + cell('AM', l)) * vh.taux_fa;
      -- AW=IF([.AU$17]=0;([.AT20]-[.AV20])/[.$AE20];0)
      WHEN 'AW' THEN
        IF cell('AU17') = 0 THEN
          RETURN (cell('AT',l) - cell('AV',l)) / cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



    -- AR=($N22+$S22+$X22+$AC22+$AM22)*SI(G22="";0;G22)
    WHEN c = 'AR' AND v >= 1 THEN
      RETURN (cell('N', l) + cell('S', l) + cell('X', l) + cell('AC', l) + cell('AM', l)) * vh.taux_fc;
      -- AX=IF(i_depassement_service_du_sans_hc="Non";[.AW20]*[.$AF20];0)
      WHEN 'AX' THEN
        IF NOT i.depassement_service_du_sans_hc THEN
          RETURN cell('AW',l) * cell('AF',l);
        ELSE
          RETURN 0;
        END IF;



    -- AS=AH22
    WHEN c = 'AS' AND v >= 1 THEN
      RETURN cell('AH', l);
      -- AZ=IF(AND([.$A20]="D4DAC10000";[.$I20]<>"Référentiel");[.$N20]*[.$AE20];0)
      WHEN 'AZ' THEN
        IF vh.structure_code = 'D4DAC10000' AND vh.volume_horaire_ref_id IS NULL THEN
          RETURN vh.heures * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



    -- AT=($O22+$T22+$AD22+$AN22)*SI(E22="";0;E22)
    WHEN c = 'AT' AND v >= 1 THEN
      RETURN (cell('O', l) + cell('T', l) + cell('AD', l) + cell('AN', l)) * vh.taux_fi;
      -- BA15=SUM([.AZ$1:.AZ$1048576])
      WHEN 'BA15' THEN
        RETURN calcFnc('somme','AZ');



    -- AU=($O22+$T22+$AD22+$AN22)*SI(F22="";0;F22)
    WHEN c = 'AU' AND v >= 1 THEN
      RETURN (cell('O', l) + cell('T', l) + cell('AD', l) + cell('AN', l)) * vh.taux_fa;
      -- BA16=MIN([.BA15];[.AU17])
      WHEN 'BA16' THEN
        RETURN LEAST(cell('BA15'), cell('AU17'));



    -- AV=($O22+$T22+$Y22+$AD22+$AN22)*SI(G22="";0;G22)
    WHEN c = 'AV' AND v >= 1 THEN
      RETURN (cell('O', l) + cell('T', l) + cell('Y', l) + cell('AD', l) + cell('AN', l)) * vh.taux_fc;
      -- BA17=[.AU17]-[.BA16]
      WHEN 'BA17' THEN
        RETURN cell('AU17') - cell('BA16');



    -- AW=0
    WHEN c = 'AW' AND v >= 1 THEN
      -- BA=IF([.BA$15]>0;[.AZ20]/[.BA$15];0)
      WHEN 'BA' THEN
        IF cell('BA15') > 0 THEN
          RETURN cell('AZ',l) / cell('BA15');
        ELSE
          RETURN 0;
        END IF;



      -- BB=[.BA$16]*[.BA20]
      WHEN 'BB' THEN
        RETURN cell('BA16') * cell('BA',l);

    -- AX=AI22
    WHEN c = 'AX' AND v >= 1 THEN
      RETURN cell('AI', l);


      -- BC=IF([.BA$17]=0;([.AZ20]-[.BB20])/[.$AE20];0)
      WHEN 'BC' THEN
        IF cell('BA17') = 0 THEN
          RETURN (cell('AZ',l) - cell('BB',l)) / cell('AE',l);
        ELSE
          RETURN 0;
        END IF;

    -- L52=SOMME(L22:L51)
    WHEN c = 'L52' AND v >= 1 THEN
      RETURN calcFnc('total','L');


      -- BD=IF(i_depassement_service_du_sans_hc="Non";[.BC20]*[.$AF20];0)
      WHEN 'BD' THEN
        IF NOT i.depassement_service_du_sans_hc THEN
          RETURN cell('BC',l) * cell('AF',l);
        ELSE
          RETURN 0;
        END IF;

    -- L53=MIN(L52;service_du)
    WHEN c = 'L53' AND v >= 1 THEN
      RETURN LEAST(cell('L52'), i.service_du);


      -- BF=IF([.$I20]="Référentiel";[.$N20]*[.$AE20];0)
      WHEN 'BF' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN vh.heures * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;

    -- L54=service_du-L53
    WHEN c = 'L54' AND v >= 1 THEN
      RETURN i.service_du - cell('L53');


      -- BG15=SUM([.BF$1:.BF$1048576])
      WHEN 'BG15' THEN
        RETURN calcFnc('somme','BF');

    -- Q52=SOMME(Q22:Q51)
    WHEN c = 'Q52' AND v >= 1 THEN
      RETURN calcFnc('total','Q');


      -- BG16=MIN([.BG15];[.BA17])
      WHEN 'BG16' THEN
        RETURN LEAST(cell('BG15'), cell('BA17'));

    -- Q53=MIN(Q52;L54)
    WHEN c = 'Q53' AND v >= 1 THEN
      RETURN LEAST(cell('Q52'), cell('L54'));


      -- BG17=[.BA17]-[.BG16]
      WHEN 'BG17' THEN
        RETURN cell('BA17') - cell('BG16');

    -- Q54=L54-Q53
    WHEN c = 'Q54' AND v >= 1 THEN
      RETURN cell('L54') - cell('Q53');


      -- BG=IF([.BG$15]>0;[.BF20]/[.BG$15];0)
      WHEN 'BG' THEN
        IF cell('BG15') > 0 THEN
          RETURN cell('BF',l) / cell('BG15');
        ELSE
          RETURN 0;
        END IF;

    -- V52=SOMME(V22:V51)
    WHEN c = 'V52' AND v >= 1 THEN
      RETURN calcFnc('total','V');


      -- BH=[.BG$16]*[.BG20]
      WHEN 'BH' THEN
        RETURN cell('BG16') * cell('BG',l);

    -- V53=MIN(V52;Q54)
    WHEN c = 'V53' AND v >= 1 THEN
      RETURN LEAST(cell('V52'), cell('Q54'));


      -- BI=IF([.BG$17]=0;([.BF20]-[.BH20])/[.$AE20];0)
      WHEN 'BI' THEN
        IF cell('BG17') = 0 THEN
          RETURN (cell('BF',l) - cell('BH',l)) / cell('AE',l);
        ELSE
          RETURN 0;
        END IF;

    -- V54=Q54-V53
    WHEN c = 'V54' AND v >= 1 THEN
      RETURN cell('Q54') - cell('V53');


      -- BJ=IF(i_depassement_service_du_sans_hc="Non";[.BI20]*[.$AF20];0)
      WHEN 'BJ' THEN
        IF NOT i.depassement_service_du_sans_hc THEN
          RETURN cell('BI',l) * cell('AF',l);
        ELSE
          RETURN 0;
        END IF;

    -- AA52=SOMME(AA22:AA51)
    WHEN c = 'AA52' AND v >= 1 THEN
      RETURN calcFnc('total','AA');


      -- BL=IF(AND([.$D20]="Oui";[.$I20]<>"Référentiel");[.$N20]*[.$AE20];0)
      WHEN 'BL' THEN
        IF vh.structure_is_exterieur AND vh.volume_horaire_ref_id IS NULL THEN
          RETURN vh.heures * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;

    -- AA53=MIN(AA52;V54)
    WHEN c = 'AA53' AND v >= 1 THEN
      RETURN LEAST(cell('AA52'), cell('V54'));


      -- BM15=SUM([.BL$1:.BL$1048576])
      WHEN 'BM15' THEN
        RETURN calcFnc('somme','BL');

    -- AA54=V54-AA53
    WHEN c = 'AA54' AND v >= 1 THEN
      RETURN cell('V54') - cell('AA53');


      -- BM16=MIN([.BM15];[.BG17])
      WHEN 'BM16' THEN
        RETURN LEAST(cell('BM15'), cell('BG17'));

    -- AF52=SOMME(AF22:AF51)
    WHEN c = 'AF52' AND v >= 1 THEN
      RETURN calcFnc('total','AF');


      -- BM17=[.BG17]-[.BM16]
      WHEN 'BM17' THEN
        RETURN cell('BG17') - cell('BM16');

    -- AF53=MIN(AF52;AA54)
    WHEN c = 'AF53' AND v >= 1 THEN
      RETURN LEAST(cell('AF52'), cell('AA54'));


      -- BM=IF([.BM$15]>0;[.BL20]/[.BM$15];0)
      WHEN 'BM' THEN
        IF cell('BM15') > 0 THEN
          RETURN cell('BL',l) / cell('BM15');
        ELSE
          RETURN 0;
        END IF;

    -- AF54=AA54-AF53
    WHEN c = 'AF54' AND v >= 1 THEN
      RETURN cell('AA54') - cell('AF53');


      -- BN=[.BM$16]*[.BM20]
      WHEN 'BN' THEN
        RETURN cell('BM16') * cell('BM',l);

    -- AK52=SOMME(AK22:AK51)
    WHEN c = 'AK52' AND v >= 1 THEN
      RETURN calcFnc('total','AK');


      -- BO=IF([.BM$17]=0;([.BL20]-[.BN20])/[.$AE20];0)
      WHEN 'BO' THEN
        IF cell('BM17') = 0 THEN
          RETURN (cell('BL',l) - cell('BN',l)) / cell('AE',l);
        ELSE
          RETURN 0;
        END IF;

    -- AK53=MIN(AK52;AF54)
    WHEN c = 'AK53' AND v >= 1 THEN
      RETURN LEAST(cell('AK52'), cell('AF54'));


      -- BP=IF(i_depassement_service_du_sans_hc="Non";[.BO20]*[.$AF20];0)
      WHEN 'BP' THEN
        IF NOT i.depassement_service_du_sans_hc THEN
          RETURN cell('BO',l) * cell('AF',l);
        ELSE
          RETURN 0;
        END IF;

    -- AK54=AF54-AK53
    WHEN c = 'AK54' AND v >= 1 THEN
      RETURN cell('AF54') - cell('AK53');



    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;



@@ -554,17 +623,21 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_LYON2 AS
  BEGIN
    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;
    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', 'AP',l);
      ose_formule.volumes_horaires.items(l).service_fa               := mainCell('Service FA', 'AQ',l);
      ose_formule.volumes_horaires.items(l).service_fc               := mainCell('Service FC', 'AR',l);
      ose_formule.volumes_horaires.items(l).service_referentiel      := mainCell('Service référentiel', 'AS',l);
      ose_formule.volumes_horaires.items(l).heures_compl_fi          := mainCell('Heures compl. FI', 'AT',l);
      ose_formule.volumes_horaires.items(l).heures_compl_fa          := mainCell('Heures compl. FA', 'AU',l);
      ose_formule.volumes_horaires.items(l).heures_compl_fc          := mainCell('Heures compl. FC', 'AV',l);
      ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'AW',l);
      ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'AX',l);
      ose_formule.volumes_horaires.items(l).service_fi               := mainCell('Service FI', 'U',l);
      ose_formule.volumes_horaires.items(l).service_fa               := mainCell('Service FA', 'V',l);
      ose_formule.volumes_horaires.items(l).service_fc               := mainCell('Service FC', 'W',l);
      ose_formule.volumes_horaires.items(l).service_referentiel      := mainCell('Service référentiel', 'X',l);
      ose_formule.volumes_horaires.items(l).heures_compl_fi          := mainCell('Heures compl. FI', 'Y',l);
      ose_formule.volumes_horaires.items(l).heures_compl_fa          := mainCell('Heures compl. FA', 'Z',l);
      ose_formule.volumes_horaires.items(l).heures_compl_fc          := mainCell('Heures compl. FC', 'AA',l);
      ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'AB',l);
      ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'AC',l);
    END LOOP;
  END;

@@ -600,7 +673,8 @@ FUNCTION INTERVENANT_QUERY RETURN CLOB IS
    FROM
      V_FORMULE_VOLUME_HORAIRE fvh
    ORDER BY
      ordre';
      ordre
    ';
  END;

END FORMULE_LYON2;
 No newline at end of file