Commit e99e4c4c authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Formule de Rennes2

parent 16da967c
Loading
Loading
Loading
Loading
+3 −4
Changes for code/Créateur de formule.php: 3 added lines, 4 removed lines.
Original line number Diff line number Diff line
@@ -82,9 +82,7 @@ switch ($action) {
                $bdd->exec($def);
                $bdd->exec($body);
                echo '<div class="alert alert-success">Package de formule correctement implanté dans la BDD</div>';
                affCreateData($fc);
            } catch
            (\Exception $e) {
            } catch (\Exception $e) {
                ?>
                <div class="alert alert-danger">
                    <?php
@@ -96,9 +94,10 @@ switch ($action) {
                </div>
                <?php
            }
        }
        affCreateData($fc);

        echo '<h2>Code généré</h2>';
        }

        Util::highlight($def, 'plsql', true, ['show-line-numbers' => true]);
        Util::highlight($body, 'plsql', true, ['show-line-numbers' => true]);
+4 −1
Changes for code/test1.php: 4 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -26,7 +26,10 @@ $f = 'IF([.AJ$15]>0;[.AI20]/[.AJ$15];0)';

//xmlDump($fc->getSheet()->getNode());

$fc->testFormule($f);
//$fc->testFormule($f);

$c = $fc->getSheet()->getCell('AG16');
var_dump($c->getDeps());

//echo $fc->getSheet(1)->html();

+309 −99
Changes for data/ddl/package/FORMULE_RENNES2/body.sql: 309 added lines, 99 removed lines.
Original line number Diff line number Diff line
CREATE OR REPLACE PACKAGE BODY FORMULE_RENNES2 AS
  decalageLigne NUMERIC DEFAULT 20;

  decalageLigne NUMERIC DEFAULT 19;

  /* Stockage des valeurs intermédiaires */
  TYPE t_cell IS RECORD (
@@ -16,24 +15,11 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_RENNES2 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
@@ -94,7 +80,7 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_RENNES2 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,130 +108,120 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_RENNES2 AS
  END;


  FUNCTION calcVersion RETURN NUMERIC IS
  BEGIN
    RETURN 1;
  END;



  FUNCTION notInStructs( v VARCHAR2 DEFAULT NULL ) RETURN BOOLEAN IS
  BEGIN
    RETURN COALESCE(v,' ') NOT IN ('KE8','UP10');
  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
      vh := ose_formule.volumes_horaires.items(l);
    END IF;
    CASE
    CASE c



    -- T=SI($H20="Référentiel";0;$AI20*E20)
    WHEN c = 'T' AND v >= 1 THEN
      -- T=IF([.$H20]="Référentiel";0;([.$AK20]+[.$AQ20]+[.$AW20]+[.$BC20])*[.E20])
      WHEN 'T' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
        RETURN cell('AI',l) * vh.taux_fi;
          RETURN (cell('AK',l) + cell('AQ',l) + cell('AW',l) + cell('BC',l)) * vh.taux_fi;
        END IF;



    -- U=SI($H20="Référentiel";0;$AI20*F20)
    WHEN c = 'U' AND v >= 1 THEN
      -- U=IF([.$H20]="Référentiel";0;([.$AK20]+[.$AQ20]+[.$AW20]+[.$BC20])*[.F20])
      WHEN 'U' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
        RETURN cell('AI',l) * vh.taux_fa;
          RETURN (cell('AK',l) + cell('AQ',l) + cell('AW',l) + cell('BC',l)) * vh.taux_fa;
        END IF;



    -- V=SI($H20="Référentiel";0;$AI20*G20)
    WHEN c = 'V' AND v >= 1 THEN
      -- V=IF([.$H20]="Référentiel";0;([.$AK20]+[.$AQ20]+[.$AW20]+[.$BC20])*[.G20])
      WHEN 'V' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
        RETURN cell('AI',l) * vh.taux_fc;
          RETURN (cell('AK',l) + cell('AQ',l) + cell('AW',l) + cell('BC',l)) * vh.taux_fc;
        END IF;



    -- W=SI($H20="Référentiel";$AI20;0)
    WHEN c = 'W' AND v >= 1 THEN
      -- W=IF([.$H20]="Référentiel";[.$AK20]+[.$AQ20]+[.$AW20]+[.$BC20];0)
      WHEN 'W' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
        RETURN cell('AI',l);
          RETURN cell('AK',l) + cell('AQ',l) + cell('AW',l) + cell('BC',l);
        ELSE
          RETURN 0;
        END IF;



    -- X=SI($H20="Référentiel";0;$AN20*E20)
    WHEN c = 'X' AND v >= 1 THEN
      -- X=IF([.$H20]="Référentiel";0;([.$AM20]+[.$AS20]+[.$AY20]+[.$BE20])*[.E20])
      WHEN 'X' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
        RETURN cell('AN',l) * vh.taux_fi;
          RETURN (cell('AM',l) + cell('AS',l) + cell('AY',l) + cell('BE',l)) * vh.taux_fi;
        END IF;



    -- Y=SI($H20="Référentiel";0;$AN20*F20)
    WHEN c = 'Y' AND v >= 1 THEN
      -- Y=IF([.$H20]="Référentiel";0;([.$AM20]+[.$AS20]+[.$AY20]+[.$BE20])*[.F20])
      WHEN 'Y' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
        RETURN cell('AN',l) * vh.taux_fa;
          RETURN (cell('AM',l) + cell('AS',l) + cell('AY',l) + cell('BE',l)) * vh.taux_fa;
        END IF;



    -- Z=SI($H20="Référentiel";0;$AN20*G20)
    WHEN c = 'Z' AND v >= 1 THEN
      -- Z=IF([.$H20]="Référentiel";0;([.$AM20]+[.$AS20]+[.$AY20]+[.$BE20])*[.G20])
      WHEN 'Z' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
        RETURN cell('AN',l) * vh.taux_fc;
          RETURN (cell('AM',l) + cell('AS',l) + cell('AY',l) + cell('BE',l)) * vh.taux_fc;
        END IF;



      -- AA=0
    WHEN c = 'AA' AND v >= 1 THEN
      WHEN 'AA' THEN
        RETURN 0;



    -- AB=SI($H20="Référentiel";$AN20;0)
    WHEN c = 'AB' AND v >= 1 THEN
      -- AB=IF([.$H20]="Référentiel";[.$AM20]+[.$AS20]+[.$AY20]+[.$BE20];0)
      WHEN 'AB' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
        RETURN cell('AN',l);
          RETURN cell('AM',l) + cell('AS',l) + cell('AY',l) + cell('BE',l);
        ELSE
          RETURN 0;
        END IF;



    -- AD=SI(ESTERREUR(I20);1;I20*K20)
    WHEN c = 'AD' AND v >= 1 THEN
      RETURN vh.taux_service_du * vh.ponderation_service_du;
      -- AD=IF(ISERROR([.I20]);1;[.I20])
      WHEN 'AD' THEN
        RETURN vh.taux_service_du;



    -- AE=SI(ET($D20="Oui";$H20<>"Référentiel");$M20*$AD20;0)
    WHEN c = 'AE' AND v >= 1 THEN
      -- AE=IF(ISERROR([.J20]);1;[.J20])
      WHEN 'AE' THEN
        RETURN vh.taux_service_compl;



      -- AF=IF(AND([.$D20]="Oui";[.$H20]<>"Référentiel");[.$M20]*[.$AD20];0)
      WHEN 'AF' THEN
        IF vh.service_statutaire AND vh.volume_horaire_ref_id IS NULL THEN
          RETURN vh.heures * cell('AD',l);
        ELSE
@@ -254,81 +230,307 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_RENNES2 AS



    -- AF19=SOMME(AE:AE)
    WHEN c = 'AF19' AND v >= 1 THEN
      RETURN calcFnc('total', 'AE');
      -- AG15=SUM([.AF$1:.AF$1048576])
      WHEN 'AG15' THEN
        RETURN calcFnc('somme','AF');



    -- AG=SI(ET($D20="Oui";OU($H20<>"Référentiel";$AF$19>=64));$M20*$AD20;0)
    WHEN c = 'AG' AND v >= 1 THEN
      IF vh.service_statutaire AND (vh.volume_horaire_ref_id IS NULL OR cell('AF19') >= 64) THEN
      -- AG16=[.AG15]>=[.AF16]
      WHEN 'AG16' THEN
        IF cell('AG15') >= cell('AF16') THEN
          RETURN 1;
        ELSE
          RETURN 0;
        END IF;



      -- AI=IF(AND([.$D20]="Oui";[.$N20]<>"Oui";[.$A20]=i_structure_code;[.$O20]="Oui");IF([.$AG$16];[.$M20]*[.$AD20];0);0)
      WHEN 'AI' THEN
        IF vh.service_statutaire AND vh.param_1 <> 'Oui' AND vh.structure_is_affectation AND vh.param_2 = 'Oui' THEN
          IF cell('AG16') = 1 THEN
            RETURN vh.heures * cell('AD',l);
          ELSE
            RETURN 0;
          END IF;
        ELSE
          RETURN 0;
        END IF;



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



      -- AJ16=MIN([.AJ15];i_service_du)
      WHEN 'AJ16' THEN
        RETURN LEAST(cell('AJ15'), i.service_du);



      -- AJ17=i_service_du-[.AJ16]
      WHEN 'AJ17' THEN
        RETURN i.service_du - cell('AJ16');



      -- AJ=IF([.AJ$15]>0;[.AI20]/[.AJ$15];0)
      WHEN 'AJ' THEN
        IF cell('AJ15') > 0 THEN
          RETURN cell('AI',l) / cell('AJ15');
        ELSE
          RETURN 0;
        END IF;



      -- AK=[.AJ$16]*[.AJ20]
      WHEN 'AK' THEN
        RETURN cell('AJ16') * cell('AJ',l);



      -- AL=IF([.AJ$17]=0;([.AI20]-[.AK20])/[.$AD20];0)
      WHEN 'AL' THEN
        IF cell('AJ17') = 0 THEN
          RETURN (cell('AI',l) - cell('AK',l)) / cell('AD',l);
        ELSE
          RETURN 0;
        END IF;



      -- AM=IF(i_depassement_service_du_sans_hc="Non";[.AL20]*[.$AE20];0)
      WHEN 'AM' THEN
        IF NOT i.depassement_service_du_sans_hc THEN
          RETURN cell('AL',l) * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



    -- AH=SI(AH19+AG20>i_service_du;i_service_du;AH19+AG20)
    WHEN c = 'AH' AND v >= 1 THEN
      IF l < 1 THEN
      -- AO=IF(AND([.$D20]="Oui";[.$N20]<>"Oui";[.$A20]<>i_structure_code;[.$O20]="Oui");IF([.$AG$16];[.$M20]*[.$AD20];0);0)
      WHEN 'AO' THEN
        IF vh.service_statutaire AND vh.param_1 <> 'Oui' AND NOT vh.structure_is_affectation AND vh.param_2 = 'Oui' THEN
          IF cell('AG16') = 1 THEN
            RETURN vh.heures * cell('AD',l);
          ELSE
            RETURN 0;
          END IF;
      IF cell('AH',l-1) + cell('AG',l) > i.service_du THEN
        RETURN i.service_du;
        ELSE
        RETURN cell('AH',l-1) + cell('AG',l);
          RETURN 0;
        END IF;



    -- AI=AH20-AH19
    WHEN c = 'AI' AND v >= 1 THEN
      RETURN cell('AH',l) - cell('AH',l-1);
      -- AP15=SUM([.AO$1:.AO$1048576])
      WHEN 'AP15' THEN
        RETURN calcFnc('somme','AO');



      -- AP16=MIN([.AP15];[.AJ17])
      WHEN 'AP16' THEN
        RETURN LEAST(cell('AP15'), cell('AJ17'));


    -- AJ19=SOMME(AI:AI)
    WHEN c = 'AJ19' AND v >= 1 THEN
      RETURN calcFnc('total', 'AI');

      -- AP17=[.AJ17]-[.AP16]
      WHEN 'AP17' THEN
        RETURN cell('AJ17') - cell('AP16');


    -- AL=SI(AH19+AG20<i_service_du;0;((AH19+AG20)-i_service_du)/AD20)
    WHEN c = 'AL' AND v >= 1 THEN
      IF cell('AH',l-1) + cell('AG',l) < i.service_du THEN

      -- AP=IF([.AP$15]>0;[.AO20]/[.AP$15];0)
      WHEN 'AP' THEN
        IF cell('AP15') > 0 THEN
          RETURN cell('AO',l) / cell('AP15');
        ELSE
          RETURN 0;
        END IF;



      -- AQ=[.AP$16]*[.AP20]
      WHEN 'AQ' THEN
        RETURN cell('AP16') * cell('AP',l);



      -- AR=IF([.AP$17]=0;([.AO20]-[.AQ20])/[.$AD20];0)
      WHEN 'AR' THEN
        IF cell('AP17') = 0 THEN
          RETURN (cell('AO',l) - cell('AQ',l)) / cell('AD',l);
        ELSE
        RETURN ((cell('AH',l-1)+ cell('AG',l))-i.service_du) / cell('AD',l);
          RETURN 0;
        END IF;



    -- AM=SI(ESTERREUR(J20);1;J20*L20)
    WHEN c = 'AM' AND v >= 1 THEN
      RETURN vh.taux_service_compl * vh.ponderation_service_compl;
      -- AS=IF(i_depassement_service_du_sans_hc="Non";[.AR20]*[.$AE20];0)
      WHEN 'AS' THEN
        IF NOT i.depassement_service_du_sans_hc THEN
          RETURN cell('AR',l) * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



    -- AN=SI(OU($AJ$19<i_service_du;i_depassement_service_du_sans_hc="Oui");0;(AL20+SI(D20<>"Oui";M20;0))*AM20)
    WHEN c = 'AN' AND v >= 1 THEN
      IF cell('AJ19') < i.service_du OR i.depassement_service_du_sans_hc THEN
      -- AU=IF(AND([.$D20]="Oui";[.$N20]<>"Oui";[.$O20]<>"Oui");IF([.$AG$16];[.$M20]*[.$AD20];0);0)
      WHEN 'AU' THEN
        IF vh.service_statutaire AND vh.param_1 <> 'Oui' AND vh.param_2 <> 'Oui' THEN
          IF cell('AG16') = 1 THEN
            RETURN vh.heures * cell('AD',l);
          ELSE
            RETURN 0;
          END IF;
        ELSE
        -- (AL20+SI(D20<>"Oui";M20;0))*AM20
        IF NOT vh.service_statutaire THEN
          RETURN (cell('AL',l) + vh.heures) * cell('AM', l);
          RETURN 0;
        END IF;



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



      -- AV16=MIN([.AV15];[.AP17])
      WHEN 'AV16' THEN
        RETURN LEAST(cell('AV15'), cell('AP17'));



      -- AV17=[.AP17]-[.AV16]
      WHEN 'AV17' THEN
        RETURN cell('AP17') - cell('AV16');



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



      -- AW=[.AV$16]*[.AV20]
      WHEN 'AW' THEN
        RETURN cell('AV16') * cell('AV',l);



      -- AX=IF([.AV$17]=0;([.AU20]-[.AW20])/[.$AD20];0)
      WHEN 'AX' THEN
        IF cell('AV17') = 0 THEN
          RETURN (cell('AU',l) - cell('AW',l)) / cell('AD',l);
        ELSE
          RETURN (cell('AL',l) + 0) * cell('AM', l);
          RETURN 0;
        END IF;



      -- AY=IF(i_depassement_service_du_sans_hc="Non";[.AX20]*[.$AE20];0)
      WHEN 'AY' THEN
        IF NOT i.depassement_service_du_sans_hc THEN
          RETURN cell('AX',l) * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



      -- BA=IF(AND([.$D20]="Oui";[.$N20]="Oui");IF([.$AG$16];[.$M20]*[.$AD20];0);0)
      WHEN 'BA' THEN
        IF vh.service_statutaire AND vh.param_1 = 'Oui' THEN
          IF cell('AG16') = 1 THEN
            RETURN vh.heures * cell('AD',l);
          ELSE
            RETURN 0;
          END IF;
        ELSE
          RETURN 0;
        END IF;



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



      -- BB16=MIN([.BB15];[.AV17])
      WHEN 'BB16' THEN
        RETURN LEAST(cell('BB15'), cell('AV17'));



      -- BB17=[.AV17]-[.BB16]
      WHEN 'BB17' THEN
        RETURN cell('AV17') - cell('BB16');



      -- BB=IF([.BB$15]>0;[.BA20]/[.BB$15];0)
      WHEN 'BB' THEN
        IF cell('BB15') > 0 THEN
          RETURN cell('BA',l) / cell('BB15');
        ELSE
          RETURN 0;
        END IF;



      -- BC=[.BB$16]*[.BB20]
      WHEN 'BC' THEN
        RETURN cell('BB16') * cell('BB',l);



      -- BD=IF([.BB$17]=0;([.BA20]-[.BC20])/[.$AD20];0)
      WHEN 'BD' THEN
        IF cell('BB17') = 0 THEN
          RETURN (cell('BA',l) - cell('BC',l)) / cell('AD',l);
        ELSE
          RETURN 0;
        END IF;



      -- BE=IF(i_depassement_service_du_sans_hc="Non";[.BD20]*[.$AE20];0)
      WHEN 'BE' THEN
        IF NOT i.depassement_service_du_sans_hc THEN
          RETURN cell('BD',l) * cell('AE',l);
        ELSE
          RETURN 0;
        END IF;



      -- AF16
      WHEN 'AF16' THEN
        RETURN 64;




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



@@ -336,6 +538,10 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_RENNES2 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', 'T',l);
@@ -374,15 +580,19 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_RENNES2 AS
    RETURN '
    SELECT
      fvh.*,
      NULL param_1,
      NULL param_2,
      CASE WHEN fvh.structure_is_exterieur = 1 THEN ''Oui'' ELSE ''Non'' END param_1,
      CASE WHEN src.id IS NOT NULL THEN ''Oui'' ELSE ''Non'' END param_2,
      NULL param_3,
      NULL param_4,
      NULL param_5
    FROM
      V_FORMULE_VOLUME_HORAIRE fvh
      LEFT JOIN service s ON s.id = fvh.service_id
      LEFT JOIN element_pedagogique ep ON ep.id = s.element_pedagogique_id
      LEFT JOIN source src ON src.id = ep.source_id AND LOWER(src.code) = ''apogee''
    ORDER BY
      ordre';
      ordre
    ';
  END;

END FORMULE_RENNES2;
 No newline at end of file
+2 −0
Changes for data/formules.php: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ return [
    10 => [
        'LIBELLE'            => 'Université Rennes 2',
        'PACKAGE_NAME'       => 'FORMULE_RENNES2',
        'VH_PARAM_1_LIBELLE' => 'Autre établissement',
        'VH_PARAM_2_LIBELLE' => 'Maquettes Apogée',
    ],
    11 => [
        'LIBELLE'      => 'INSA de Lyon',