Commit 24bb2fa5 authored by joriot221's avatar joriot221
Browse files

Merge remote-tracking branch 'origin/master'

parents 97c15384 2ad057e7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
* Budget/Liquidation : afficher le nombre de HETD uniquement des HCO et non les HETD des HCO + Heures de service
* Notes : Afficher le bon utilisateur pour la validation de service (#45413).
* Forcer l'activiation de l'étape pièces justificatives même si il n'y a pas de service prévisionnel de renseigné.
* Choix du bon modèle de contrat dans le cas de plusieurs modèles de contrat (par structure et/ou par statut) (#45520) 

# OSE 18.2 (15/06/2022)

+2 −2
Original line number Diff line number Diff line
@@ -90,7 +90,7 @@ switch ($action) {
                    if (str_starts_with($msg, 'ORA-24344')) {
                        $msg = 'ERREUR : Le package ne compile pas';
                    }
                    echo $msg ?>
                    echo nl2br($msg) ?>
                </div>
                <?php
            }
@@ -152,7 +152,7 @@ function affCreateData(\Application\Model\FormuleCalcul $fc)
        $pad = str_pad('', $kl - strlen($k), ' ');
        echo "\t'$k'$pad => '$v',\n";
    }
    echo "];";
    echo "],";
    echo '</pre>';

    if (!empty($params)) {
+5 −13
Original line number Diff line number Diff line
@@ -10,31 +10,23 @@

use UnicaenCode\Util;

$file = getcwd() . '/cache/OSE-calculHC-Rennes2-20211101.xlsx';
$file = getcwd() . '/cache/t.xlsx';

$fc = new \Application\Model\FormuleCalcul($file, 'TEST');


$f = 'IF(ISERROR([.J20]);1;[.J20])*IF(AND([.$A20]="ES3";i_structure_code<>"ES3";[.$AE$15]>=12);4/3;1)';
$cell = 'AN20';

$f = 'SUM([.AD$1:.AD$1048576])';
$formule = 'IF(AND([.$E20]="Oui";[.$I20]<>"Référentiel";[.$I20]<>"ETD";[.$G20]=1;OR([.$A20]="I2000";[.$A20]="I2300"));[.$N20]*[.$AE20];0)';

$f = 'IF([.AJ$15]>0;[.AI20]/[.AJ$15];0)';

//$f = 'IF(AND([.$D20]="Oui";[.$N20]<>"Oui";[.$A20]=i_structure_code;[.$O20]="Oui");IF([.$AG$16];[.$M20]*[.$AD20];0);0)';
$fc->testFormule($cell, $formule);

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

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

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

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

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

//Util::highlight($fc->makePackageBody(), 'plsql', true, ['show-line-numbers' => true]);


//xmlDump($fc->getSheet()->getNode());
+9 −23
Original line number Diff line number Diff line
<?php

use Unicaen\OpenDocument\Calc;

/**
 * @var $this       \Application\View\Renderer\PhpRenderer
 * @var $controller \Laminas\Mvc\Controller\AbstractController
@@ -8,29 +10,13 @@
 * @var $viewFile   string
 */

$file = getcwd() . '/cache/t.xlsx';

$file  = getcwd() . '/cache/Téléchargement/OSE-calculHC-Rennes2-20211101.xlsx';
$sheet = 1;
//$file  = getcwd() . '/cache/test.ods';
//$sheet = 0;
/*
$document = new \Unicaen\OpenDocument\Document();
$document->loadFromFile($file);

$s = $document->getCalc()->getSheet($sheet);
//xmlDump($document->getContent());
$c = $s->getCell('BG15');

$rc = array_keys($s->getRefCells($c));
var_dump($rc);
//echo $s->html();
  */

$formule = '[.AG15]>=[.AF16]';
$fc = new \Application\Model\FormuleCalcul($file, 'TEST');
$d  = $fc->getFormuleCells();

foreach ($formules as $f) {
    $formule = new \Unicaen\OpenDocument\Calc\Formule($f);
    $formule->analyse();
    $formule->displayTerms();
    $formule->displayExprs();
echo '<table class="table table-bordered">';
foreach ($d as $name => $cell) {
    echo '<tr><th>' . $name . '</th><td>' . htmlentities($cell->getFormule() ?? $cell->getValue()) . '</td></tr>';
}
echo '</table>';
+108 −83
Original line number Diff line number Diff line
CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR 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_COTE_AZUR 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_COTE_AZUR 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_COTE_AZUR 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,38 +112,22 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR 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
    IF l > 0 AND l <> 9999 THEN
      vh := ose_formule.volumes_horaires.items(l);
    END IF;
    CASE
    CASE c



    -- T=SI($H20="Référentiel";0;$AG20*E20)
    WHEN c = 'T' AND v >= 1 THEN
      -- T=IF([.$H20]="Référentiel";0;[.$AG20]*[.E20])
      WHEN 'T' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
@@ -162,8 +136,8 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR AS



    -- U=SI($H20="Référentiel";0;$AG20*F20)
    WHEN c = 'U' AND v >= 1 THEN
      -- U=IF([.$H20]="Référentiel";0;[.$AG20]*[.F20])
      WHEN 'U' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
@@ -172,8 +146,8 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR AS



    -- V=SI($H20="Référentiel";0;$AG20*G20)
    WHEN c = 'V' AND v >= 1 THEN
      -- V=IF([.$H20]="Référentiel";0;[.$AG20]*[.G20])
      WHEN 'V' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
@@ -182,8 +156,8 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR AS



    -- W=SI($H20="Référentiel";$AG20;0)
    WHEN c = 'W' AND v >= 1 THEN
      -- W=IF([.$H20]="Référentiel";[.$AG20];0)
      WHEN 'W' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN cell('AG',l);
        ELSE
@@ -192,60 +166,60 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR AS



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



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



    -- Z=SI($H20="Référentiel";0;$AK20*G20)
    WHEN c = 'Z' AND v >= 1 THEN
      -- Z=IF([.$H20]="Référentiel";0;([.$AK20]+[.$AN20])*[.G20])
      WHEN 'Z' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
          RETURN 0;
        ELSE
        RETURN cell('AK',l) * vh.taux_fc;
          RETURN (cell('AK',l) + cell('AN',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";$AK20;0)
    WHEN c = 'AB' AND v >= 1 THEN
      -- AB=IF([.$H20]="Référentiel";[.$AK20]+[.$AN20];0)
      WHEN 'AB' THEN
        IF vh.volume_horaire_ref_id IS NOT NULL THEN
        RETURN cell('AK',l);
          RETURN cell('AK',l) + cell('AN',l);
        ELSE
          RETURN 0;
        END IF;



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



    -- AE=SI($D20="Oui";$M20*$AD20;0)
    WHEN c = 'AE' AND v >= 1 THEN
      -- AE=IF([.$D20]="Oui";[.$M20]*[.$AD20];0)
      WHEN 'AE' THEN
        IF vh.service_statutaire THEN
          RETURN vh.heures * cell('AD',l);
        ELSE
@@ -254,11 +228,8 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR AS



    -- AF=SI(AF19+AE20>i_service_du;i_service_du;AF19+AE20)
    WHEN c = 'AF' AND v >= 1 THEN
      IF l < 1 THEN
        RETURN 0;
      END IF;
      -- AF=IF([.AF19]+[.AE20]>i_service_du;i_service_du;[.AF19]+[.AE20])
      WHEN 'AF' THEN
        IF cell('AF',l-1) + cell('AE',l) > i.service_du THEN
          RETURN i.service_du;
        ELSE
@@ -267,53 +238,102 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR AS



    -- AG=AF20-AF19
    WHEN c = 'AG' AND v >= 1 THEN
      -- AG=[.AF20]-[.AF19]
      WHEN 'AG' THEN
        RETURN cell('AF',l) - cell('AF',l-1);



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




    -- AI=SI(AF19+AE20<i_service_du;0;((AF19+AE20)-i_service_du)/AD20)
    WHEN c = 'AI' AND v >= 1 THEN
      -- AI=IF([.AF19]+[.AE20]<i_service_du;0;(([.AF19]+[.AE20])-i_service_du)/[.AD20])
      WHEN 'AI' THEN
        IF cell('AF',l-1) + cell('AE',l) < i.service_du THEN
          RETURN 0;
        ELSE
        RETURN (cell('AF',l-1) + cell('AE',l) - i.service_du) / cell('AD',l);
          RETURN ((cell('AF',l-1) + cell('AE',l)) - i.service_du) / cell('AD',l);
        END IF;



    -- AJ=SI(ESTERREUR(J20);1;J20)
    WHEN c = 'AJ' AND v >= 1 THEN
      -- AJ=IF(ISERROR([.J20]);1;[.J20])
      WHEN 'AJ' THEN
        RETURN vh.taux_service_compl;



    -- AK=SI(OU($AH$19<i_service_du;i_depassement_service_du_sans_hc="Oui");0;(AI20+SI(D20<>"Oui";M20;0))*AJ20)
    WHEN c = 'AK' AND v >= 1 THEN
      -- AK=IF(OR([.$AH$19]<i_service_du;i_depassement_service_du_sans_hc="Oui");0;[.AI20]*[.AJ20])
      WHEN 'AK' THEN
        IF cell('AH19') < i.service_du OR i.depassement_service_du_sans_hc THEN
          RETURN 0;
        ELSE
        IF NOT vh.service_statutaire THEN
          RETURN (cell('AI',l) + vh.heures) * cell('AJ',l);
          RETURN cell('AI',l) * cell('AJ',l);
        END IF;



      -- AL17=[.AH19]/5
      WHEN 'AL17' THEN
        RETURN cell('AH19') / 5;



      -- AL=IF(OR([.$AH$19]<i_service_du;i_depassement_service_du_sans_hc="Oui";[.$D20]="Oui");0;[.M20]*[.AJ20])
      WHEN 'AL' THEN
        IF cell('AH19') < i.service_du OR i.depassement_service_du_sans_hc OR vh.service_statutaire THEN
          RETURN 0;
        ELSE
          RETURN (cell('AI',l) + 0) * cell('AJ',l);
          RETURN vh.heures * cell('AJ',l);
        END IF;



      -- AM17=[.AH19]/5
      WHEN 'AM17' THEN
        RETURN cell('AH19') / 5;



      -- AM=IF([.AM19]+[.AL20]>[.$AL$17];[.$AL$17];[.AM19]+[.AL20])
      WHEN 'AM' THEN
        IF cell('AM',l-1) + cell('AL',l) > cell('AL17') THEN
          RETURN cell('AL17');
        ELSE
          RETURN cell('AM',l-1) + cell('AL',l);
        END IF;



      -- AN=[.AM20]-[.AM19]
      WHEN 'AN' THEN
        RETURN cell('AM',l) - cell('AM',l-1);



      -- AF19
      WHEN 'AF19' THEN
        RETURN 0;



      -- AM19
      WHEN 'AM19' 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; END;
  END CASE;
  raise_application_error( -20001, 'La colonne c=' || c || ', l=' || l || ' n''existe pas!');

  END;



@@ -321,6 +341,10 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR 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);
@@ -367,7 +391,8 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_COTE_AZUR AS
    FROM
      V_FORMULE_VOLUME_HORAIRE fvh
    ORDER BY
      ordre';
      ordre
    ';
  END;

END FORMULE_COTE_AZUR;
 No newline at end of file
Loading