diff --git a/CHANGELOG.md b/CHANGELOG.md index 78622d2f90cfcd28370cf085f86763387d32f4ff..b507ad87d55755a91e2462996e7ad733b17ab287 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,25 @@ title: "Changements intervenus sur OSE" author: Laurent Lécluse - DSI - Unicaen --- +# OSE 9.0.2-zf2 et 9.0.2-zf3 + +## Correction de bugs + +* Un bug modifiant les paramètres globaux qui avaient été configurés a été résolu +* La duplication de statuts refonctionne +* Lors de la création d'un nouveau statut, l'octroi de privilèges ne plante plus +* La suppression de rôle fonctionne de nouveau correctement + +## Nouveautés + +* Intégration de vues métérialisées pour extraction BO + +# OSE 9.0.1-zf2 et 9.0.1-zf3 + +## Correction de bugs + +* Un bug empêchant d'avoir accès aux indicateurs si on est connecté en tant que composante a été résolu + # OSE 9.0-zf2 et 9.0-zf3 ## Correction de bugs diff --git a/INSTALL.md b/INSTALL.md index 1f796d163a0a60b6ca91404e71d75e7d054ee78e..f6766f0c19607eb366f0bfe1575002da31117316 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -273,7 +273,7 @@ docker build \ git clone https://git.unicaen.fr/open-source/OSE dev cd dev docker-compose build --no-cache -docker-compose up +docker-compose up -d docker exec ose-dev ose install ``` Enfin, ajouter à votre fichier /etc/hosts la ligne suivante : diff --git a/admin/actions/bdd-make-update-diff.php b/admin/actions/bdd-make-update-diff.php new file mode 100644 index 0000000000000000000000000000000000000000..833eb4c59d7d90aee855a4d33d6e02a37d8d0c41 --- /dev/null +++ b/admin/actions/bdd-make-update-diff.php @@ -0,0 +1,33 @@ +<?php + +if (!$oa->bddIsOk($msg)) { + $c->printDie("Impossible d'accéder à la base de données : $msg!" + . "\nVeuillez contrôler vos paramètres de configuration s'il vous plaît, avant de refaire une tentative de MAJ de la base de données (./bin/ose update-bdd)."); +} + +$bdd = $oa->getBdd(); +$schema = new \BddAdmin\Schema($bdd); + +$fichier = $oa->getOseDir().'cache/bdd-update-diff.sql'; + +$c->println("\nConstruction d'un script de mise à jour de la base de données ...", $c::COLOR_LIGHT_CYAN); +$c->println("Attention : par rapport à update-bdd, seules les définitions des objets sont concernées. Les requêtes de mise à jour des données ne sont pas générées."); + +/* Récupération du schéma de référence */ +$ref = $schema->loadFromFile($oa->getOseDir() . 'data/ddl.php'); + + +/* Construction de la config de DDL pour filtrer */ +$ddlConfig = require $oa->getOseDir() . 'data/ddl_config.php'; +foreach ($ref as $ddlClass => $objects) { + foreach ($objects as $object => $objectDdl) { + $ddlConfig[$ddlClass]['includes'][] = $object; + } +} + +/* Mise à jour de la BDD */ +$queries = $schema->diff($ref, false, $ddlConfig); +$sqlDdl = $schema->queriesToSql($queries); +file_put_contents($fichier, $sqlDdl); + +$c->println("Script différentiel créé et enregistré dans le fichier $fichier"); \ No newline at end of file diff --git a/admin/actions/help.php b/admin/actions/help.php index 3a6eec5525d0846cda090cef68d8fd6bf5ccdce2..445a2357a50852f7c0928970f052755d30c52c44 100644 --- a/admin/actions/help.php +++ b/admin/actions/help.php @@ -12,12 +12,28 @@ $actions = [ "maj-public-links" => "Mise à jour des liens vers les répertoires publics des dépendances", "clear-cache" => "Vidage du cache de l'application", "test-bdd" => "Test d'accès à la base de données", + "update-bdd" => "Mise à jour de la base de données de l'application (sans les fichiers)", ]; +$actionsDev = [ + "update-ddl" => "Mise à jour du fichier de définition de la base de données à partir de cette dernière", + "update-bdd-privileges" => "Mise à jour des privilèges de la base de données", +]; + +if ((getenv('APPLICATION_ENV') ?: 'dev') == 'dev'){ + $actions = array_merge($actions, $actionsDev); +} + + $c->printMainTitle("OSE", 15); $c->println('Actions possibles :'); +$maxLength = 0; +foreach ($actions as $a => $l) { + if (strlen($a) > $maxLength) $maxLength = strlen($a); +} foreach ($actions as $a => $l) { $c->print($a, $c::COLOR_BLACK, $c::BG_LIGHT_GRAY); + $c->print(str_pad('', $maxLength - strlen($a), ' ')); $c->println(" : " . $l); } \ No newline at end of file diff --git a/admin/actions/test.php b/admin/actions/test.php index 84a2613d3e23b4e4fcf050e5035eaeb9df6f6e79..8b207acea144b37998be0df7807888e8f4abb752 100644 --- a/admin/actions/test.php +++ b/admin/actions/test.php @@ -1,19 +1,3 @@ <?php -$bdd = new \BddAdmin\Bdd(Config::get('bdds', 'deploy-local')); -$oa->setBdd($bdd); -$bdd->debug = true; -/* Insertion des données */ -$dataGen = new DataGen($oa); - -$table = null; -$table = 'PRIVILEGE'; - -//$bdd->getTable($table)->delete(); - -$dataGen->install($table); - -if ($table) { - $r = $oa->getBdd()->getTable($table)->select(); - var_dump(count($r)); -} \ No newline at end of file +//include $oa->getOseDir().'public/index.php'; \ No newline at end of file diff --git a/admin/actions/update-bdd-privileges.php b/admin/actions/update-bdd-privileges.php new file mode 100644 index 0000000000000000000000000000000000000000..6c5e0a4eece8bcaf5fdddb2fedfdacc17e628134 --- /dev/null +++ b/admin/actions/update-bdd-privileges.php @@ -0,0 +1,14 @@ +<?php + +if (!$oa->bddIsOk($msg)) { + $c->printDie("Impossible d'accéder à la base de données : $msg!" + . "\nVeuillez contrôler vos paramètres de configuration s'il vous plaît, avant de refaire une tentative de MAJ de la base de données (./bin/ose update-bdd)."); +} + +$bdd = $oa->getBdd(); +$schema = new \BddAdmin\Schema($bdd); + +$c->println("\nMise à jour des privilèges dans la base de données", $c::COLOR_LIGHT_CYAN); + +$dataGen = new DataGen($oa); +$dataGen->updatePrivileges(); \ No newline at end of file diff --git a/admin/actions/update-ddl.php b/admin/actions/update-ddl.php new file mode 100644 index 0000000000000000000000000000000000000000..3411dcbb9f793084ee9b029b17792308bb61bc3b --- /dev/null +++ b/admin/actions/update-ddl.php @@ -0,0 +1,27 @@ +<?php + +$bdd = $oa->getBdd(); +$schema = new \BddAdmin\Schema($bdd); + +$filename = $oa->getOseDir().'data/ddl.php'; + +$ddlConfig = [ + 'table' => ['excludes' => 'UNICAEN_%'], + 'sequence' => ['excludes' => 'UNICAEN_%'], + 'primary-constraint' => ['excludes' => 'UNICAEN_%'], + 'index' => ['excludes' => 'UNICAEN_%'], + 'view' => ['excludes' => ['SRC_%', 'V_DIFF_%', 'V_SYMPA_%', 'V_UNICAEN_%']], + 'materialized-view' => ['includes' => [ + 'MV_EXT_SERVICE', + 'MV_EXT_DOTATION_LIQUIDATION', + 'MV_EXT_ETAT_PAIEMENT', + 'TBL_NOEUD' + ]], + 'package' => ['excludes' => ['UCBN_LDAP', 'UNICAEN_IMPORT_AUTOGEN_PROCS__']], +]; + +$c->println('Génération de la DDL à partir de la base de données ...'); +$ddl = $schema->getDdl($ddlConfig); +$schema->saveToFile($ddl, $filename); + +$c->println('Fichier de DDL '.$filename.' Mis à jour'); \ No newline at end of file diff --git a/admin/src/BddAdmin/Schema.php b/admin/src/BddAdmin/Schema.php index b6c1d42c0753fd47ab75b39a529a032c6054b325..22a12cd370da01986439528a9a3d1d7b3eb7734d 100644 --- a/admin/src/BddAdmin/Schema.php +++ b/admin/src/BddAdmin/Schema.php @@ -363,6 +363,88 @@ class Schema + public function diff( array $ddl, bool $inverse=false, array $ddlConfig = []): array + { + $ddl = $this->ddlFilter($ddl, $ddlConfig); + $bdd = $this->getDdl($ddlConfig); + + if (!$inverse){ + $old = $bdd; + $new = $ddl; + }else{ + $old = $ddl; + $new = $bdd; + } + + $res = []; + foreach ($this->changements as $changement => $params) { + list($class, $action, $precision) = explode('.', $changement); + $noGet = isset($ddlConfig[$class]) ? ($ddlConfig[$class] === false) : false; + if (!$noGet) { + $ddlObject = $this->getDdlObject($class, true); + + $options = $this->ddlConfigGet($ddlConfig, $class, 'options'); + if ($options) { + $ddlObject->addOptions((array)$options); + } + + $kold = isset($old[$class]) ? $old[$class] : []; + $knew = isset($new[$class]) ? $new[$class] : []; + + $renames = $this->checkRenames($ddlObject, $kold, $knew); + foreach ($renames as $koldName => $knewData) { + unset($kold[$koldName]); + unset($knew[$knewData['name']]); + } + switch ($action) { + case 'rename': + $names = $renames; + break; + case 'create': + $names = array_diff(array_keys($knew), array_keys($kold)); + break; + case 'alter': + $names = array_intersect(array_keys($kold), array_keys($knew)); + break; + case 'drop': + $names = array_diff(array_keys($kold), array_keys($knew)); + break; + } + + if ($precision) { + $precisions = explode('|', $precision); + foreach ($precisions as $precision) { + $ddlObject->addOption($precision); + } + } + foreach ($names as $oldName => $name) { + switch ($action) { + case 'rename': + $ddlObject->rename($oldName, $name); + break; + case 'drop': + if (!(isset($options['noDrop']) && $options['noDrop'])) { + $ddlObject->drop($name); + } + break; + case 'alter': + $ddlObject->alter($kold[$name], $knew[$name]); + break; + case 'create': + $ddlObject->create($knew[$name]); + break; + } + } + if ($ddlObject->getQueries()) { + $res[$changement] = $ddlObject->getQueries($this->logger); + } + } + } + return $res; + } + + + private function change(string $mode, $ddl, array $ddlConfig = [], $autoExecute = true): array { if ($ddl instanceof self) { @@ -588,6 +670,7 @@ class Schema $sql .= '-- ' . $label . "\n"; $sql .= '--------------------------------------------------' . "\n\n"; foreach ($qs as $qr => $description) { + $qr = str_replace( "\t", " ", $qr); if ($onlyFirstLine && false !== strpos($qr, "\n")) { $qr = substr($qr, 0, strpos($qr, "\n")); } diff --git a/admin/src/DataGen.php b/admin/src/DataGen.php index 8392e92885c8cd73246386f94ae0d2549a3cfc08..1c2e1fde60621fdc8683e8f18c151caa304dad0f 100644 --- a/admin/src/DataGen.php +++ b/admin/src/DataGen.php @@ -96,12 +96,12 @@ class DataGen ], [ 'table' => 'CATEGORIE_PRIVILEGE', - 'context' => ['install', 'update'], + 'context' => ['install', 'update', 'privileges'], 'key' => 'CODE', ], [ 'table' => 'PRIVILEGE', - 'context' => ['install', 'update'], + 'context' => ['install', 'update', 'privileges'], 'key' => ['CATEGORIE_ID', 'CODE'], 'options' => ['columns' => ['CATEGORIE_ID' => ['transformer' => 'SELECT id FROM categorie_privilege WHERE code = %s']]], ], @@ -133,6 +133,7 @@ class DataGen 'table' => 'PERIODE', 'context' => ['install', 'update'], 'key' => 'CODE', + 'options' => ['delete' => false], ], [ 'table' => 'TAUX_HORAIRE_HETD', @@ -328,7 +329,7 @@ class DataGen 'table' => 'PARAMETRE', 'context' => ['install', 'update'], 'key' => 'NOM', - //'options' => ['update-ignore-cols' => ['VALEUR']], + 'options' => ['update-ignore-cols' => ['VALEUR']], ], ]; @@ -355,6 +356,13 @@ class DataGen + public function updatePrivileges() + { + return $this->action('privileges'); + } + + + private function action(string $action, string $table = null) { $this->nomenclature = require $this->oseAdmin->getOseDir() . 'data/nomenclatures.php'; diff --git a/bin/ose b/bin/ose index 9ada312f428e693746851a0cd27c0f6ef19ab4fb..8d1ff36ad698d4ac52d9d6922888750c2dc2404c 100755 --- a/bin/ose +++ b/bin/ose @@ -5,7 +5,9 @@ spl_autoload_register(function ($class) { $dir = dirname(__DIR__) . '/admin/src/'; $class = $dir . str_replace('\\', '/', $class) . '.php'; - require_once $class; + if (file_exists($class)) { + require_once $class; + } }); $c = new Console(); diff --git a/code/test1.php b/code/test1.php index 8443aef099d237cdb43cdaf5b269f49da5c0193b..4ea874d4fec32542f8d7371ec5874d0160391553 100755 --- a/code/test1.php +++ b/code/test1.php @@ -6,3 +6,223 @@ * @var $viewName string * @var $sl \Zend\ServiceManager\ServiceLocatorInterface */ + +spl_autoload_register(function ($class) { + if (0 === strpos($class, 'BddAdmin')) { + $dir = dirname(__DIR__) . '/admin/src/'; + $class = $dir . str_replace('\\', '/', $class) . '.php'; + + require_once $class; + } +}); + +$bdd = new \BddAdmin\Bdd([ + 'host' => AppConfig::get('bdd', 'host'), + 'port' => AppConfig::get('bdd', 'port'), + 'dbname' => AppConfig::get('bdd', 'dbname'), + 'username' => AppConfig::get('bdd', 'username'), + 'password' => AppConfig::get('bdd', 'password'), +]); +$schema = new \BddAdmin\Schema($bdd); + +/*$tables = [ + [ + 'key' => "Corps", + 'fields' => [ + ['name' => "field1", 'info' => "", 'color' => "#F7B84B", 'figure' => "Ellipse"], + ['name' => "field2", 'info' => "the second one", 'color' => "#F25022", 'figure' => "Ellipse"], + ['name' => "fieldThree", 'info' => "3rd", 'color' => "#00BCF2"], + ], + 'loc' => "0 0", + ], + [ + 'key' => "Grade", + 'fields' => [ + ['name' => "fieldA", 'info' => "", 'color' => "#FFB900", 'figure' => "Diamond"], + ['name' => "fieldB", 'info' => "", 'color' => "#F25022", 'figure' => "Rectangle"], + ['name' => "fieldC", 'info' => "", 'color' => "#7FBA00", 'figure' => "Diamond"], + ['name' => "fieldD", 'info' => "fourth", 'color' => "#00BCF2", 'figure' => "Rectangle"], + ], + 'loc' => "280 50", + ], +];*/ + +$list = [ +'ANNEE', 'INTERVENANT', 'CORPS', 'GRADE', 'GROUPE_TYPE_FORMATION', 'TYPE_FORMATION', 'ETAPE', 'ELEMENT_PEDAGOGIQUE', +'CHEMIN_PEDAGOGIQUE', 'VOLUME_HORAIRE_ENS', 'TYPE_INTERVENTION' +]; + +$tables = []; +$tbls = $schema->getDdlObject(\BddAdmin\Ddl\DdlTable::class)->get($list); +foreach ($tbls as $tbl) { + $table = [ + 'key' => $tbl['name'], + 'fields' => [], + 'loc' => '0 0', + ]; + foreach ($tbl['columns'] as $col) { + $type = $col['type']; + if ($col['length']) { + $type .= ' (' . $col['length'] . ')'; + } + $column = [ + 'name' => $col['name'], + 'type' => $type, + ]; + $table['fields'][] = $column; + } + + $tables[] = $table; +} + +$cles = []; +$cls = $schema->getDdlObject(\BddAdmin\Ddl\DdlRefConstraint::class)->get(); +foreach ($cls as $cl) { + foreach ($cl['columns'] as $col => $rcol) { + $cle = [ + 'from' => $cl['table'], + 'fromCol' => $col, + 'to' => $cl['rtable'], + 'toCol' => $rcol, + ]; + $cles[] = $cle; + } +} + + +?> +<div id="sample"> + <div id="myDiagramDiv" style="border: solid 1px black; width:100%; height:1000px"></div> + + + <p>For a variation on this sample with selectable fields in the record nodes, see the <a href="selectableFields.html">selectable + fields</a> sample.</p> + <div> + Diagram Model saved in JSON format, automatically updated after each change or undo or redo: + <textarea id="mySavedModel" style="width:100%;height:250px"></textarea> + <div style="display: none; position: absolute; width: 0px; height: 0px; margin-top: -1px;"></div> + </div> +</div> +<script> + + + $(function () { + + WidgetInitializer.includeJs(Url('vendor/go.js')); + + var $ = go.GraphObject.make; + + myDiagram = + $(go.Diagram, "myDiagramDiv", + { + layout: $(go.LayeredDigraphLayout, { direction: 0 }), + + validCycle: go.Diagram.CycleNotDirected, // don't allow loops + // For this sample, automatically show the state of the diagram's model on the page + "ModelChanged": function (e) { + if (e.isTransactionFinished) showModel(); + }, + "undoManager.isEnabled": true + }); + + var columnTemplate = + $(go.Panel, "TableRow", // this Panel is a row in the containing Table + new go.Binding("portId", "name"), // this Panel is a "port" + { + background: "transparent", // so this port's background can be picked by the mouse + fromSpot: go.Spot.Right, // links only go from the right side to the left side + toSpot: go.Spot.Left, + // allow drawing links from or to this port: + fromLinkable: false, toLinkable: false + }, + $(go.TextBlock, + { + margin: new go.Margin(0, 0), column: 1, font: "normal 10px sans-serif", + alignment: go.Spot.Left, + // and disallow drawing links from or to this text: + fromLinkable: false, toLinkable: false + }, + new go.Binding("text", "name")), + $(go.TextBlock, + {margin: new go.Margin(0, 5), column: 2,stroke: "#ef9b0b",font: "normal 9px sans-serif", alignment: go.Spot.Left}, + new go.Binding("text", "type")) + ); + + // This template represents a whole "record". + myDiagram.nodeTemplate = + $(go.Node, "Auto", + {copyable: false, deletable: false}, + //new go.Binding("location"), + //new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify), + // this rectangular shape surrounds the content of the node + $(go.Shape, + { stroke: "#efd47e", strokeWidth: 2, fill: "#fff4eb" }), + // the content consists of a header and a list of items + $(go.Panel, "Vertical", + // this is the header for the whole node + $(go.Panel, "Auto", + {stretch: go.GraphObject.Horizontal}, // as wide as the whole node + $(go.Shape, + {fill: "#ffe6cf", stroke: null}), + $(go.TextBlock, + { + alignment: go.Spot.Center, + margin: 1, + stroke: "black", + textAlign: "center", + font: "bold 10pt sans-serif" + }, + new go.Binding("text", "key"))), + // this Panel holds a Panel for each item object in the itemArray; + // each item Panel is defined by the itemTemplate to be a TableRow in this Table + $(go.Panel, "Table", + { + padding: 2, + minSize: new go.Size(100, 10), + defaultStretch: go.GraphObject.Horizontal, + itemTemplate: columnTemplate + }, + new go.Binding("itemArray", "fields") + ) // end Table Panel of items + ) // end Vertical Panel + ); // end Node + + myDiagram.linkTemplate = + $(go.Link, // the whole link panel + { relinkableFrom: false, relinkableTo: false, reshapable: true, resegmentable: true }, + { + //routing: go.Link.AvoidsNodes, // but this is changed to go.Link.Orthgonal when the Link is reshaped + adjusting: go.Link.End, + curve: go.Link.JumpOver, + corner: 1, + toShortLength: 4 + }, + new go.Binding("points").makeTwoWay(), + // remember the Link.routing too + new go.Binding("routing", "routing", go.Binding.parseEnum(go.Link, go.Link.AvoidsNodes)) + .makeTwoWay(go.Binding.toString), + $(go.Shape, // the link path shape + { isPanelMain: true, strokeWidth: 1 }), + $(go.Shape, // the arrowhead + { toArrow: "Standard", stroke: null }) + ); + + myDiagram.model = + $(go.GraphLinksModel, + { + copiesArrays: true, + copiesArrayObjects: true, + linkFromPortIdProperty: "fromCol", + linkToPortIdProperty: "toCol", + nodeDataArray: <?php echo json_encode($tables) ?>, + linkDataArray: <?php echo json_encode($cles) ?>, + }); + + showModel(); // show the diagram's initial model + + function showModel() + { + document.getElementById("mySavedModel").textContent = myDiagram.model.toJson(); + } + }); +</script> \ No newline at end of file diff --git a/connecteurs/Connecteurs OSE.sql b/connecteurs/Connecteurs OSE.sql index fc2f77840fd8dedffd6fb87a7c92102d8cafbabc..23d00aa13cfada37fdcffa0c6b9de5cecf56242a 100755 --- a/connecteurs/Connecteurs OSE.sql +++ b/connecteurs/Connecteurs OSE.sql @@ -127,11 +127,13 @@ i AS ( WHEN ct.c_type_contrat_trav IN ('AT') THEN 'ATER' WHEN ct.c_type_contrat_trav IN ('AX') THEN 'ATER_MI_TPS' WHEN ct.c_type_contrat_trav IN ('DO') THEN 'DOCTOR' - WHEN ct.c_type_contrat_trav IN ('GI','PN','ED') THEN 'ENS_CONTRACT' + WHEN ct.c_type_contrat_trav IN ('GD','PN') THEN 'ENS_CONTRACT_CDD' + WHEN ct.c_type_contrat_trav IN ('ED') THEN 'ENS_CH_CONTRAT' + WHEN ct.c_type_contrat_trav IN ('GI','EI') THEN 'ENS_CONTRACT_CDI' WHEN ct.c_type_contrat_trav IN ('LT','LB') THEN 'LECTEUR' WHEN ct.c_type_contrat_trav IN ('MB','MP') THEN 'MAITRE_LANG' WHEN ct.c_type_contrat_trav IN ('PT') THEN 'HOSPITALO_UNIV' - WHEN ct.c_type_contrat_trav IN ('C3','CA','CB','CD','CS','HA','HD','HS','MA','S3','SX','SW','SY','SZ','VA') THEN 'BIATSS' + WHEN ct.c_type_contrat_trav IN ('C3','CA','CB','CD','CS','DD','HA','HD','HS','MA','S3','SX','SW','SY','SZ','VA') THEN 'BIATSS' WHEN ct.c_type_contrat_trav IN ('CU','AH','CG','MM','PM','IN','DN','ET') THEN 'NON_AUTORISE' ELSE 'AUTRES' END statut, @@ -171,8 +173,8 @@ i AS ( FROM affectation@harpprod a LEFT JOIN carriere@harpprod c ON c.no_dossier_pers = a.no_dossier_pers AND c.no_seq_carriere = a.no_seq_carriere - LEFT JOIN periodes_sp_cnu@harpprod psc ON psc.no_dossier_pers = a.no_dossier_pers AND psc.no_seq_carriere = a.no_seq_carriere AND COALESCE(a.d_fin_affectation,SYSDATE) BETWEEN COALESCE(psc.d_deb,SYSDATE) AND COALESCE(psc.d_fin,SYSDATE) - LEFT JOIN periodes_sp_sd_deg@harpprod pss ON pss.no_dossier_pers = a.no_dossier_pers AND pss.no_seq_carriere = a.no_seq_carriere AND COALESCE(a.d_fin_affectation,SYSDATE) BETWEEN COALESCE(pss.d_deb,SYSDATE) AND COALESCE(pss.d_fin,SYSDATE) + LEFT JOIN periodes_sp_cnu@harpprod psc ON psc.no_dossier_pers = a.no_dossier_pers AND psc.no_seq_carriere = a.no_seq_carriere AND COALESCE(a.d_fin_affectation,SYSDATE) BETWEEN COALESCE(psc.d_deb,a.d_fin_affectation,SYSDATE) AND COALESCE(psc.d_fin,a.d_fin_affectation,SYSDATE) + LEFT JOIN periodes_sp_sd_deg@harpprod pss ON pss.no_dossier_pers = a.no_dossier_pers AND pss.no_seq_carriere = a.no_seq_carriere AND COALESCE(a.d_fin_affectation,SYSDATE) BETWEEN COALESCE(pss.d_deb,a.d_fin_affectation,SYSDATE) AND COALESCE(pss.d_fin,a.d_fin_affectation,SYSDATE) WHERE -- on sélectionne les données même 6 mois avant et 6 mois après SYSDATE BETWEEN a.d_deb_affectation-184 AND COALESCE(a.d_fin_affectation,SYSDATE)+184 @@ -234,7 +236,7 @@ SELECT ELSE INDIVIDU_E_MAIL.NO_E_MAIL END email, - i.statut z_statut_id, + CASE WHEN liste_noire.code IS NULL THEN i.statut ELSE 'NON_AUTORISE' END z_statut_id, sc.c_structure_n2 z_structure_id, ltrim(TO_CHAR(individu.no_individu,'99999999')) source_code, code_insee.no_insee numero_insee, @@ -252,6 +254,7 @@ SELECT FROM i JOIN individu@harpprod individu ON individu.no_individu = i.code + LEFT JOIN liste_noire ON liste_noire.code = i.code LEFT JOIN MV_UNICAEN_STRUCTURE_CODES sc ON sc.c_structure = pbs_divers__cicg.c_structure_globale@harpprod(individu.no_individu, COALESCE(i.date_fin,SYSDATE) ) LEFT JOIN commune@harpprod commune ON individu.c_commune_naissance = commune.c_commune LEFT JOIN individu_e_mail@harpprod individu_e_mail ON individu_e_mail.no_individu = i.code diff --git a/data/ddl.php b/data/ddl.php index 3a3736cf8556002f04d3afb1428d247079a4ef94..72511c0cc22c04981c88bedc6b6854950b4c410f 100644 --- a/data/ddl.php +++ b/data/ddl.php @@ -85,6 +85,10 @@ array ( 'name' => 'DOTATION_ID_SEQ', ), + 'EFFECTIFS_ETAPE_ID_SEQ' => + array ( + 'name' => 'EFFECTIFS_ETAPE_ID_SEQ', + ), 'EFFECTIFS_ID_SEQ' => array ( 'name' => 'EFFECTIFS_ID_SEQ', @@ -3865,6 +3869,160 @@ ), ), ), + 'EFFECTIFS_ETAPE' => + array ( + 'name' => 'EFFECTIFS_ETAPE', + 'temporary' => false, + 'logging' => true, + 'commentaire' => NULL, + 'sequence' => 'EFFECTIFS_ETAPE_ID_SEQ', + 'columns' => + array ( + 'ID' => + array ( + 'name' => 'ID', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => NULL, + 'nullable' => false, + 'default' => NULL, + 'commentaire' => NULL, + ), + 'ETAPE_ID' => + array ( + 'name' => 'ETAPE_ID', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => NULL, + 'nullable' => false, + 'default' => NULL, + 'commentaire' => NULL, + ), + 'FI' => + array ( + 'name' => 'FI', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => NULL, + 'nullable' => false, + 'default' => '0', + 'commentaire' => NULL, + ), + 'FC' => + array ( + 'name' => 'FC', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => NULL, + 'nullable' => false, + 'default' => '0', + 'commentaire' => NULL, + ), + 'FA' => + array ( + 'name' => 'FA', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => NULL, + 'nullable' => false, + 'default' => '0', + 'commentaire' => NULL, + ), + 'SOURCE_ID' => + array ( + 'name' => 'SOURCE_ID', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => NULL, + 'nullable' => false, + 'default' => NULL, + 'commentaire' => NULL, + ), + 'SOURCE_CODE' => + array ( + 'name' => 'SOURCE_CODE', + 'type' => 'VARCHAR2', + 'length' => 100, + 'scale' => NULL, + 'precision' => NULL, + 'nullable' => false, + 'default' => NULL, + 'commentaire' => NULL, + ), + 'HISTO_CREATION' => + array ( + 'name' => 'HISTO_CREATION', + 'type' => 'DATE', + 'length' => 0, + 'scale' => NULL, + 'precision' => NULL, + 'nullable' => false, + 'default' => 'SYSDATE', + 'commentaire' => NULL, + ), + 'HISTO_CREATEUR_ID' => + array ( + 'name' => 'HISTO_CREATEUR_ID', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => NULL, + 'nullable' => false, + 'default' => NULL, + 'commentaire' => NULL, + ), + 'HISTO_MODIFICATION' => + array ( + 'name' => 'HISTO_MODIFICATION', + 'type' => 'DATE', + 'length' => 0, + 'scale' => NULL, + 'precision' => NULL, + 'nullable' => false, + 'default' => 'SYSDATE', + 'commentaire' => NULL, + ), + 'HISTO_MODIFICATEUR_ID' => + array ( + 'name' => 'HISTO_MODIFICATEUR_ID', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => NULL, + 'nullable' => false, + 'default' => NULL, + 'commentaire' => NULL, + ), + 'HISTO_DESTRUCTION' => + array ( + 'name' => 'HISTO_DESTRUCTION', + 'type' => 'DATE', + 'length' => 0, + 'scale' => NULL, + 'precision' => NULL, + 'nullable' => true, + 'default' => NULL, + 'commentaire' => NULL, + ), + 'HISTO_DESTRUCTEUR_ID' => + array ( + 'name' => 'HISTO_DESTRUCTEUR_ID', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => NULL, + 'nullable' => true, + 'default' => NULL, + 'commentaire' => NULL, + ), + ), + ), 'ELEMENT_MODULATEUR' => array ( 'name' => 'ELEMENT_MODULATEUR', @@ -12652,6 +12810,28 @@ 'default' => '9999', 'commentaire' => NULL, ), + 'TITULAIRE' => + array ( + 'name' => 'TITULAIRE', + 'type' => 'NUMBER', + 'length' => 0, + 'scale' => '0', + 'precision' => 1, + 'nullable' => false, + 'default' => '0', + 'commentaire' => NULL, + ), + 'CHARGES_PATRONALES' => + array ( + 'name' => 'CHARGES_PATRONALES', + 'type' => 'FLOAT', + 'length' => 0, + 'scale' => NULL, + 'precision' => 126, + 'nullable' => false, + 'default' => '1', + 'commentaire' => NULL, + ), ), ), 'STATUT_PRIVILEGE' => @@ -13132,7 +13312,7 @@ 'name' => 'TBL_AGREMENT', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Gestion des agréments', 'sequence' => 'TBL_AGREMENT_ID_SEQ', 'columns' => array ( @@ -13231,7 +13411,7 @@ 'name' => 'TBL_CHARGENS', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Charges d\'enseignement', 'sequence' => 'TBL_CHARGENS_ID_SEQ', 'columns' => array ( @@ -13462,7 +13642,7 @@ 'name' => 'TBL_CHARGENS_SEUILS_DEF', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Pré-calculs des seuils par défaut', 'sequence' => 'TBL_CHARGENS_SEUILS_DEF_ID_SEQ', 'columns' => array ( @@ -13561,7 +13741,7 @@ 'name' => 'TBL_CLOTURE_REALISE', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Clôture de saisie du service réalisé par les intervenants', 'sequence' => 'TBL_CLOTURE_REALISE_ID_SEQ', 'columns' => array ( @@ -13638,7 +13818,7 @@ 'name' => 'TBL_CONTRAT', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Contrats de travail', 'sequence' => 'TBL_CONTRAT_ID_SEQ', 'columns' => array ( @@ -13902,7 +14082,7 @@ 'name' => 'TBL_DMEP_LIQUIDATION', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Gestion budgétaire (enveloppes)', 'sequence' => 'TBL_DMEP_LIQUIDATION_ID_SEQ', 'columns' => array ( @@ -13979,7 +14159,7 @@ 'name' => 'TBL_DOSSIER', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Données personnelles', 'sequence' => 'TBL_DOSSIER_ID_SEQ', 'columns' => array ( @@ -14067,7 +14247,7 @@ 'name' => 'TBL_LIEN', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Liens (pour les charges d\'enseignement)', 'sequence' => 'TBL_LIEN_ID_SEQ', 'columns' => array ( @@ -14243,7 +14423,7 @@ 'name' => 'TBL_PAIEMENT', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Données liées aux paiements et demandes de mises en paiement', 'sequence' => 'TBL_PAIEMENT_ID_SEQ', 'columns' => array ( @@ -14419,7 +14599,7 @@ 'name' => 'TBL_PIECE_JOINTE', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Pièces justificatives', 'sequence' => 'TBL_PIECE_JOINTE_ID_SEQ', 'columns' => array ( @@ -14529,7 +14709,7 @@ 'name' => 'TBL_PIECE_JOINTE_DEMANDE', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Pièces justificatives (demandes)', 'sequence' => 'TBL_PIECE_JOINTE_DEMAND_ID_SEQ', 'columns' => array ( @@ -14606,7 +14786,7 @@ 'name' => 'TBL_PIECE_JOINTE_FOURNIE', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Pièces justificatives fournies', 'sequence' => 'TBL_PIECE_JOINTE_FOURNI_ID_SEQ', 'columns' => array ( @@ -14705,7 +14885,7 @@ 'name' => 'TBL_SERVICE', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Services d\'ensiegnement', 'sequence' => 'TBL_SERVICE_ID_SEQ', 'columns' => array ( @@ -14947,7 +15127,7 @@ 'name' => 'TBL_SERVICE_REFERENTIEL', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Référentiel', 'sequence' => 'TBL_SERVICE_REFERENTIEL_ID_SEQ', 'columns' => array ( @@ -15057,7 +15237,7 @@ 'name' => 'TBL_SERVICE_SAISIE', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Service (pour alimenter le Workflow)', 'sequence' => 'TBL_SERVICE_SAISIE_ID_SEQ', 'columns' => array ( @@ -15178,7 +15358,7 @@ 'name' => 'TBL_VALIDATION_ENSEIGNEMENT', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Suivi des validations de services', 'sequence' => 'TBL_VALIDATION_ENSEIGNE_ID_SEQ', 'columns' => array ( @@ -15299,7 +15479,7 @@ 'name' => 'TBL_VALIDATION_REFERENTIEL', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Suivi des validations du référentiel', 'sequence' => 'TBL_VALIDATION_REFERENT_ID_SEQ', 'columns' => array ( @@ -15420,7 +15600,7 @@ 'name' => 'TBL_WORKFLOW', 'temporary' => false, 'logging' => false, - 'commentaire' => NULL, + 'commentaire' => 'Workflow (feuilles de routes : avancement par étape par intervenant et le cas échéant par composante)', 'sequence' => 'TBL_WORKFLOW_ID_SEQ', 'columns' => array ( @@ -16484,7 +16664,7 @@ array ( 'name' => 'CODE', 'type' => 'VARCHAR2', - 'length' => 10, + 'length' => 15, 'scale' => NULL, 'precision' => NULL, 'nullable' => false, @@ -17063,39 +17243,6 @@ 'default' => NULL, 'commentaire' => NULL, ), - 'PUBLIQUE' => - array ( - 'name' => 'PUBLIQUE', - 'type' => 'NUMBER', - 'length' => 0, - 'scale' => '0', - 'precision' => 1, - 'nullable' => false, - 'default' => NULL, - 'commentaire' => NULL, - ), - 'OBLIGATOIRE' => - array ( - 'name' => 'OBLIGATOIRE', - 'type' => 'NUMBER', - 'length' => 0, - 'scale' => '0', - 'precision' => 1, - 'nullable' => false, - 'default' => NULL, - 'commentaire' => NULL, - ), - 'SAISIE_PAR_ENSEIGNANT' => - array ( - 'name' => 'SAISIE_PAR_ENSEIGNANT', - 'type' => 'NUMBER', - 'length' => 0, - 'scale' => '0', - 'precision' => 1, - 'nullable' => false, - 'default' => NULL, - 'commentaire' => NULL, - ), 'HISTO_CREATION' => array ( 'name' => 'HISTO_CREATION', @@ -23500,7 +23647,11 @@ END FORMULE_UBO;', -- us=SI($I$13="Oui";SOMME(I182:AU182);0) WHEN c = \'us\' AND v >= 1 THEN - RETURN cell(\'t131\',l) + cell(\'t132\',l); + IF NOT ose_formule.intervenant.depassement_service_du_sans_hc THEN + RETURN cell(\'t131\',l) + cell(\'t132\',l); + ELSE + RETURN 0; + END IF; @@ -23561,7 +23712,7 @@ END FORMULE_UBO;', feuille.delete; IF ose_formule.intervenant.depassement_service_du_sans_hc -- HC traitées comme du service - OR ose_formule.intervenant.heures_decharge < 0 -- s\'il y a une décharge => aucune HC + OR ose_formule.intervenant.heures_decharge > 0 -- s\'il y a une décharge => aucune HC THEN ose_formule.intervenant.service_du := ose_formule.intervenant.heures_service_statutaire; END IF; @@ -35967,6 +36118,60 @@ WHERE ), 'BddAdmin\\Ddl\\DdlMaterializedView' => array ( + 'MV_EXT_DOTATION_LIQUIDATION' => + array ( + 'name' => 'MV_EXT_DOTATION_LIQUIDATION', + 'definition' => 'SELECT + COALESCE(HEURE_DOT.ANNEE_ID,HEURE_LIQUID.ANNEE_ID) ANNEE_ID, + COALESCE(HEURE_DOT.TYPE_RESSOURCE_ID, HEURE_LIQUID.TYPE_RESSOURCE_ID) TYPE_RESSOURCE_ID, + COALESCE(HEURE_DOT.STRUCTURE_ID, HEURE_LIQUID.STRUCTURE_ID) STRUCTURE_ID, + SUM(HEURE_DOT.HEURES) HEURES_D, + SUM(HEURE_LIQUID.HEURES) HEURES_L +FROM + ( + SELECT + DOTATION.ANNEE_ID, + DOTATION.TYPE_RESSOURCE_ID, + DOTATION.STRUCTURE_ID, + SUM( + CASE + WHEN DOTATION.HISTO_DESTRUCTION IS NULL THEN DOTATION.HEURES + ELSE 0.0 + END + ) HEURES + FROM + DOTATION + GROUP BY + DOTATION.ANNEE_ID, + DOTATION.TYPE_RESSOURCE_ID, + DOTATION.STRUCTURE_ID + ) HEURE_DOT + FULL OUTER JOIN ( + SELECT + V_TBL_DMEP_LIQUIDATION.ANNEE_ID, + V_TBL_DMEP_LIQUIDATION.TYPE_RESSOURCE_ID, + V_TBL_DMEP_LIQUIDATION.STRUCTURE_ID, + SUM(V_TBL_DMEP_LIQUIDATION.HEURES) HEURES + FROM + V_TBL_DMEP_LIQUIDATION + GROUP BY + V_TBL_DMEP_LIQUIDATION.ANNEE_ID, + V_TBL_DMEP_LIQUIDATION.TYPE_RESSOURCE_ID, + V_TBL_DMEP_LIQUIDATION.STRUCTURE_ID + ) HEURE_LIQUID + ON HEURE_DOT.ANNEE_ID = HEURE_LIQUID.ANNEE_ID + AND HEURE_DOT.TYPE_RESSOURCE_ID = HEURE_LIQUID.TYPE_RESSOURCE_ID + AND HEURE_DOT.STRUCTURE_ID = HEURE_LIQUID.STRUCTURE_ID +GROUP BY + COALESCE(HEURE_DOT.ANNEE_ID,HEURE_LIQUID.ANNEE_ID), + COALESCE(HEURE_DOT.TYPE_RESSOURCE_ID, HEURE_LIQUID.TYPE_RESSOURCE_ID), + COALESCE(HEURE_DOT.STRUCTURE_ID, HEURE_LIQUID.STRUCTURE_ID)', + ), + 'MV_EXT_ETAT_PAIEMENT' => + array ( + 'name' => 'MV_EXT_ETAT_PAIEMENT', + 'definition' => 'SELECT * FROM v_etat_paiement', + ), 'MV_EXT_SERVICE' => array ( 'name' => 'MV_EXT_SERVICE', @@ -37210,6 +37415,66 @@ WHERE 'ELEMENT_PEDAGOGIQUE_ID' => 'ID', ), ), + 'EFFECTIFS_ETAPE_ETAPE_FK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_ETAPE_FK', + 'table' => 'EFFECTIFS_ETAPE', + 'rtable' => 'ETAPE', + 'delete_rule' => NULL, + 'index' => NULL, + 'columns' => + array ( + 'ETAPE_ID' => 'ID', + ), + ), + 'EFFECTIFS_ETAPE_HCFK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_HCFK', + 'table' => 'EFFECTIFS_ETAPE', + 'rtable' => 'UTILISATEUR', + 'delete_rule' => NULL, + 'index' => NULL, + 'columns' => + array ( + 'HISTO_CREATEUR_ID' => 'ID', + ), + ), + 'EFFECTIFS_ETAPE_HDFK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_HDFK', + 'table' => 'EFFECTIFS_ETAPE', + 'rtable' => 'UTILISATEUR', + 'delete_rule' => NULL, + 'index' => NULL, + 'columns' => + array ( + 'HISTO_DESTRUCTEUR_ID' => 'ID', + ), + ), + 'EFFECTIFS_ETAPE_HMFK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_HMFK', + 'table' => 'EFFECTIFS_ETAPE', + 'rtable' => 'UTILISATEUR', + 'delete_rule' => NULL, + 'index' => NULL, + 'columns' => + array ( + 'HISTO_MODIFICATEUR_ID' => 'ID', + ), + ), + 'EFFECTIFS_ETAPE_SOURCE_FK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_SOURCE_FK', + 'table' => 'EFFECTIFS_ETAPE', + 'rtable' => 'SOURCE', + 'delete_rule' => NULL, + 'index' => NULL, + 'columns' => + array ( + 'SOURCE_ID' => 'ID', + ), + ), 'EFFECTIFS_FK' => array ( 'name' => 'EFFECTIFS_FK', @@ -42791,6 +43056,17 @@ WHERE 5 => 'HISTO_DESTRUCTION', ), ), + 'EFFECTIFS_ETAPE_SOURCE_UN' => + array ( + 'name' => 'EFFECTIFS_ETAPE_SOURCE_UN', + 'table' => 'EFFECTIFS_ETAPE', + 'index' => 'EFFECTIFS_ETAPE_SOURCE_UN', + 'columns' => + array ( + 0 => 'SOURCE_CODE', + 1 => 'HISTO_DESTRUCTION', + ), + ), 'EFFECTIFS_SOURCE_UN' => array ( 'name' => 'EFFECTIFS_SOURCE_UN', @@ -46637,6 +46913,67 @@ END;', 0 => 'ELEMENT_PEDAGOGIQUE_ID', ), ), + 'EFFECTIFS_ETAPE_ETAPE_FK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_ETAPE_FK', + 'unique' => false, + 'table' => 'EFFECTIFS_ETAPE', + 'columns' => + array ( + 0 => 'ETAPE_ID', + ), + ), + 'EFFECTIFS_ETAPE_HCFK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_HCFK', + 'unique' => false, + 'table' => 'EFFECTIFS_ETAPE', + 'columns' => + array ( + 0 => 'HISTO_CREATEUR_ID', + ), + ), + 'EFFECTIFS_ETAPE_HDFK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_HDFK', + 'unique' => false, + 'table' => 'EFFECTIFS_ETAPE', + 'columns' => + array ( + 0 => 'HISTO_DESTRUCTEUR_ID', + ), + ), + 'EFFECTIFS_ETAPE_HMFK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_HMFK', + 'unique' => false, + 'table' => 'EFFECTIFS_ETAPE', + 'columns' => + array ( + 0 => 'HISTO_MODIFICATEUR_ID', + ), + ), + 'EFFECTIFS_ETAPE_SOURCE_FK' => + array ( + 'name' => 'EFFECTIFS_ETAPE_SOURCE_FK', + 'unique' => false, + 'table' => 'EFFECTIFS_ETAPE', + 'columns' => + array ( + 0 => 'SOURCE_ID', + ), + ), + 'EFFECTIFS_ETAPE_SOURCE_UN' => + array ( + 'name' => 'EFFECTIFS_ETAPE_SOURCE_UN', + 'unique' => true, + 'table' => 'EFFECTIFS_ETAPE', + 'columns' => + array ( + 0 => 'SOURCE_CODE', + 1 => 'HISTO_DESTRUCTION', + ), + ), 'EFFECTIFS_FK' => array ( 'name' => 'EFFECTIFS_FK', diff --git a/doc/export-pilotage.md b/doc/export-pilotage.md index b5bd2007d138f22b028542211b9b8094c25b39f4..ad4783d6a2345fc8278bb5750d467b97d2ca0090 100644 --- a/doc/export-pilotage.md +++ b/doc/export-pilotage.md @@ -206,7 +206,6 @@ Contrats de travail |SIGNE |Nombre de volumes horaires signés | - ## Table TBL_DMEP_LIQUIDATION Gestion budgétaire (enveloppes) @@ -218,7 +217,6 @@ Gestion budgétaire (enveloppes) |TYPE_RESSOURCE_ID|==> TYPE_RESSOURCE.ID| |STRUCTURE_ID |==> STRUCTURE.ID | |HEURES | | -|TO_DELETE | | ## Table TBL_DOSSIER @@ -233,7 +231,6 @@ Données personnelles |PEUT_SAISIR_DOSSIER|1 Si l'intervenant a un dossier, 0 sinon| |DOSSIER_ID |==> DOSSIER.ID | |VALIDATION_ID |==> VALIDATION.ID | -|TO_DELETE | | ## Table TBL_LIEN @@ -255,7 +252,6 @@ Liens (pour les charges d'enseignement) |CHOIX_MAXIMUM |Choix maximum | |NB_CHOIX |Nombre de choix | |TOTAL_POIDS |Total de poids des fils | -|TO_DELETE | | |MAX_POIDS |Poids maximum pour les fils| @@ -271,7 +267,6 @@ Données liées aux paiements et demandes de mises en paiement |STRUCTURE_ID |==> STRUCTURE.ID | |MISE_EN_PAIEMENT_ID |==> MISE_EN_PAIEMENT.ID | |PERIODE_PAIEMENT_ID |==> PERIODE.ID | -|TO_DELETE | | |HEURES_A_PAYER |HETD à payer | |HEURES_A_PAYER_POND |HETD à payer (en %) | |HEURES_DEMANDEES |HETD demandées | @@ -295,7 +290,6 @@ Pièces justificatives |DEMANDEE |Témoin (1 si la PJ est demandée) | |FOURNIE |Témoin (1 si la PJ est fournie) | |VALIDEE |Témoin (1 si la PJ est validée) | -|TO_DELETE | | |HEURES_POUR_SEUIL |NB d'heures de seuil pour la demande| @@ -309,7 +303,6 @@ Pièces justificatives (demandes) |ANNEE_ID |==> ANNEE.ID | |TYPE_PIECE_JOINTE_ID|==> TYPE_PIECE_JOINTE.ID| |INTERVENANT_ID |==> INTERVENANT.ID | -|TO_DELETE | | |HEURES_POUR_SEUIL | | @@ -325,7 +318,6 @@ Pièces justificatives fournies |INTERVENANT_ID |==> INTERVENANT.ID | |VALIDATION_ID |==> VALIDATION.ID | |FICHIER_ID |==> FICHIER.ID | -|TO_DELETE | | |PIECE_JOINTE_ID |==> PIECE_JOINTE.ID | @@ -343,7 +335,6 @@ Services d'ensiegnement |STRUCTURE_ID |==> STRUCTURE.ID | |NBVH |Nombre de volumes horaires saisis | |VALIDE |Nombre de volumes horaires validés | -|TO_DELETE | | |ELEMENT_PEDAGOGIQUE_ID |==> ELEMENT_PEDAGOGIQUE.ID | |ELEMENT_PEDAGOGIQUE_PERIODE_ID|==> PERIODE.ID | |ETAPE_ID |==> ETAPE.ID | @@ -372,7 +363,6 @@ Référentiel |STRUCTURE_ID |==> STRUCTURE.ID | |NBVH |Nombre de volumes horaires | |VALIDE |Nombre de volumes horaires validés | -|TO_DELETE | | ## Table TBL_SERVICE_SAISIE @@ -390,7 +380,6 @@ Service (pour alimenter le Workflow) |HEURES_REFERENTIEL_PREV|NB d'heures de référentiel prévisionnel| |HEURES_SERVICE_REAL |NB d'heures de service réalisé | |HEURES_REFERENTIEL_REAL|NB d'heures de référentiel réalisé | -|TO_DELETE | | ## Table TBL_VALIDATION_ENSEIGNEMENT @@ -406,7 +395,6 @@ Suivi des validations de services |TYPE_VOLUME_HORAIRE_ID|==> TYPE_VOLUME_HORAIRE.ID | |SERVICE_ID |==> SERVICE.ID | |VALIDATION_ID |==> VALIDATION.ID (Si validé)| -|TO_DELETE | | |VOLUME_HORAIRE_ID |==> VOLUME_HORAIRE.ID | |AUTO_VALIDATION |Témoin (0 ou 1) | @@ -424,7 +412,6 @@ Suivi des validations du référentiel |TYPE_VOLUME_HORAIRE_ID|==> TYPE_VOLUME_HORAIRE.ID | |SERVICE_REFERENTIEL_ID|==> SERVICE_REFERENTIEL.ID | |VALIDATION_ID |==> VALIDATION.ID (Si validé)| -|TO_DELETE | | |VOLUME_HORAIRE_REF_ID |==> VOLUME_HORAIRE_REF.ID | |AUTO_VALIDATION |Témoin (0 ou 1) | @@ -440,13 +427,10 @@ Workflow (feuilles de routes : avancement par étape par intervenant et le cas |ETAPE_ID |==> WF_ETAPE.ID (Identifiant de l'étape concernée) | |STRUCTURE_ID |==> STRUCTURE.ID (Eventuelle structure concernée) | |ATTEIGNABLE |Témoin indiquant si l'étape est atteignable ou non | -|TO_DELETE | | |REALISATION |Pourcentage de réalisation de l'étape de Workflow (entre 0 et 1)| |OBJECTIF |Objectif de réalisation de l'étape de Workflow (entre 0 et 1) | |ANNEE_ID |==> ANNEE.ID | |TYPE_INTERVENANT_ID |==> TYPE_INTERVENANT.ID | |TYPE_INTERVENANT_CODE|Code du type d'intevention (CM / TD / TP, etc) | |ETAPE_CODE |Code de l'étape du workflow concernée | -|STATUT_INTERVENANT_ID|==> STATUT_INTERVENANT.ID | - - +|STATUT_INTERVENANT_ID|==> STATUT_INTERVENANT.ID | \ No newline at end of file diff --git a/module/Application/src/Application/Controller/DroitsController.php b/module/Application/src/Application/Controller/DroitsController.php index 35d4e3ad6c9a25429b520d474a05b42b9f9d47c7..c2be42c76253a727c356932a45176313e994f3ed 100755 --- a/module/Application/src/Application/Controller/DroitsController.php +++ b/module/Application/src/Application/Controller/DroitsController.php @@ -106,6 +106,9 @@ class DroitsController extends AbstractController $title = "Suppression du rôle"; $form = $this->makeFormSupprimer( function() use ($role){ $this->getServiceRole()->delete($role); + $this->getCacheFilesystem()->delete(RoleProvider::class.'/affectations'); + $cc = $this->getCacheContainer(PrivilegeService::class); + unset($cc->privilegesRoles); } ); return compact('role', 'title', 'form'); diff --git a/module/Application/src/Application/Controller/StatutIntervenantController.php b/module/Application/src/Application/Controller/StatutIntervenantController.php index f239477ecced17c707cae78691484d55fd8a9cf0..594b84ff2c9999abe4e128141c065097f4b3d63a 100755 --- a/module/Application/src/Application/Controller/StatutIntervenantController.php +++ b/module/Application/src/Application/Controller/StatutIntervenantController.php @@ -2,18 +2,22 @@ namespace Application\Controller; +use Application\Cache\Traits\CacheContainerTrait; use Application\Entity\Db\StatutIntervenant; use Application\Provider\Privilege\Privileges; use Application\Form\StatutIntervenant\Traits\StatutIntervenantSaisieFormAwareTrait; +use Application\Provider\Role\RoleProvider; use Application\Service\Traits\StatutIntervenantServiceAwareTrait; use UnicaenApp\View\Model\MessengerViewModel; use Application\Service\Traits\TypeIntervenantServiceAwareTrait; +use Zend\View\Model\ViewModel; class StatutIntervenantController extends AbstractController { use StatutIntervenantServiceAwareTrait; use StatutIntervenantSaisieFormAwareTrait; use TypeIntervenantServiceAwareTrait; + use CacheContainerTrait; @@ -53,6 +57,7 @@ class StatutIntervenantController extends AbstractController $form->bindRequestSave($statutIntervenant, $this->getRequest(), function (StatutIntervenant $si) { try { $this->getServiceStatutIntervenant()->save($si); + unset($this->getCacheContainer(RoleProvider::class)->statutsInfo); $this->flashMessenger()->addSuccessMessage('Enregistrement effectué'); } catch (\Exception $e) { $this->flashMessenger()->addErrorMessage($this->translate($e)); @@ -69,6 +74,34 @@ class StatutIntervenantController extends AbstractController + public function cloneAction() + { + /* @var $statutIntervenant StatutIntervenant */ + $statutIntervenant = $this->getEvent()->getParam('statutIntervenant'); + $newStatutIntervenant = $statutIntervenant->dupliquer(); + $newStatutIntervenant->setOrdre($this->getServiceStatutIntervenant()->fetchMaxOrdre() + 1); + $form = $this->getFormStatutIntervenantSaisie(); + $title = 'Duplication d\'un statut d\'intervenant'; + + $form->bindRequestSave($newStatutIntervenant, $this->getRequest(), function (StatutIntervenant $si) { + try { + $this->getServiceStatutIntervenant()->save($si); + unset($this->getCacheContainer(RoleProvider::class)->statutsInfo); + $this->flashMessenger()->addSuccessMessage('Duplication effectuée'); + } catch (\Exception $e) { + $this->flashMessenger()->addErrorMessage($this->translate($e)); + } + }); + + $viewModel = new ViewModel(); + $viewModel->setVariables(compact('form', 'title')); + $viewModel->setTemplate('application/statut-intervenant/saisie'); + + return $viewModel; + } + + + public function deleteAction() { $statutIntervenant = $this->getEvent()->getParam('statutIntervenant'); @@ -83,6 +116,7 @@ class StatutIntervenantController extends AbstractController } else { try { $this->getServiceStatutIntervenant()->delete($statutIntervenant); + unset($this->getCacheContainer(RoleProvider::class)->statutsInfo); $this->flashMessenger()->addSuccessMessage("Statut d'Intervenant supprimé avec succès."); } catch (\Exception $e) { $this->flashMessenger()->addErrorMessage($this->translate($e)); @@ -114,34 +148,5 @@ class StatutIntervenantController extends AbstractController return new JsonModel(['msg' => 'Tri des champs effectué']); } - - - public function cloneAction() - { - /* @var $statutIntervenant StatutIntervenant */ - $statutIntervenant = $this->getEvent()->getParam('statutIntervenant'); - $form = $this->getFormStatutIntervenantSaisie(); - - $title = 'Duplication d\'un statut d\'intervenant'; - $newStatutIntervenant = $statutIntervenant->dupliquer(); - $newStatutIntervenant->setOrdre($this->getServiceStatutIntervenant()->fetchMaxOrdre() + 1); - //$statutIntervenantNew->setOrdre($this->getServiceStatutIntervenant()->fetchMaxOrdre()+1); - $form->bind($newStatutIntervenant); - $request = $this->getRequest(); - if ($request->isPost()) { - $form->setData($request->getPost()); - if ($form->isValid()) { - try { - $this->getServiceStatutIntervenant()->save($newStatutIntervenant); - $form->get('id')->setValue($newStatutIntervenant->getId()); // transmet le nouvel ID - $this->flashMessenger()->addSuccessMessage('Enregistrement effectué'); - } catch (\Exception $e) { - $errors[] = $this->translate($e); - } - } - } - - return compact('form', 'title'); - } } diff --git a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.TypeModulateur.dcm.xml b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.TypeModulateur.dcm.xml index d1a24b36c0e8c5044d17b4fadbd5af5a8fb1f456..949ebfff6f53a154329526bdd3b7b78da596213d 100755 --- a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.TypeModulateur.dcm.xml +++ b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.TypeModulateur.dcm.xml @@ -14,9 +14,6 @@ <field name="histoDestruction" type="datetime" column="HISTO_DESTRUCTION" nullable="true"/> <field name="histoModification" type="datetime" column="HISTO_MODIFICATION" nullable="false"/> <field name="libelle" type="string" column="LIBELLE" length="30" nullable="false"/> - <field name="obligatoire" type="boolean" column="OBLIGATOIRE" nullable="false"/> - <field name="publique" type="boolean" column="PUBLIQUE" nullable="false"/> - <field name="saisieParEnseignant" type="boolean" column="SAISIE_PAR_ENSEIGNANT" nullable="false"/> <many-to-one field="histoModificateur" target-entity="Application\Entity\Db\Utilisateur"> <join-columns> <join-column name="HISTO_MODIFICATEUR_ID" referenced-column-name="ID"/> diff --git a/module/Application/src/Application/Entity/Db/TypeModulateur.php b/module/Application/src/Application/Entity/Db/TypeModulateur.php index 70b8ddfe37bec966c2b28f475c452654d7423d31..9c7ce798a984affaa490d2650e63e2733c3dae49 100755 --- a/module/Application/src/Application/Entity/Db/TypeModulateur.php +++ b/module/Application/src/Application/Entity/Db/TypeModulateur.php @@ -1,6 +1,7 @@ <?php namespace Application\Entity\Db; + use UnicaenApp\Entity\HistoriqueAwareInterface; use UnicaenApp\Entity\HistoriqueAwareTrait; use Zend\Permissions\Acl\Resource\ResourceInterface; @@ -26,21 +27,6 @@ class TypeModulateur implements HistoriqueAwareInterface, ResourceInterface */ protected $libelle; - /** - * @var boolean - */ - protected $obligatoire; - - /** - * @var boolean - */ - protected $publique; - - /** - * @var boolean - */ - protected $saisieParEnseignant; - /** * @var integer */ @@ -141,90 +127,6 @@ class TypeModulateur implements HistoriqueAwareInterface, ResourceInterface - /** - * Set obligatoire - * - * @param boolean $obligatoire - * - * @return TypeModulateur - */ - public function setObligatoire($obligatoire) - { - $this->obligatoire = $obligatoire; - - return $this; - } - - - - /** - * Get obligatoire - * - * @return boolean - */ - public function getObligatoire() - { - return $this->obligatoire; - } - - - - /** - * Set publique - * - * @param boolean $publique - * - * @return TypeModulateur - */ - public function setPublique($publique) - { - $this->publique = $publique; - - return $this; - } - - - - /** - * Get publique - * - * @return boolean - */ - public function getPublique() - { - return $this->publique; - } - - - - /** - * Set saisieParEnseignant - * - * @param boolean $saisieParEnseignant - * - * @return TypeModulateur - */ - public function setSaisieParEnseignant($saisieParEnseignant) - { - $this->saisieParEnseignant = $saisieParEnseignant; - - return $this; - } - - - - /** - * Get saisieParEnseignant - * - * @return boolean - */ - public function getSaisieParEnseignant() - { - return $this->saisieParEnseignant; - } - - - /** * Get id * @@ -311,10 +213,11 @@ class TypeModulateur implements HistoriqueAwareInterface, ResourceInterface return $this->structure; } + + public function getResourceId() { return "TypeModulateur"; } - } diff --git a/module/Application/src/Application/Form/Modulateur/TypeModulateurSaisieForm.php b/module/Application/src/Application/Form/Modulateur/TypeModulateurSaisieForm.php index 44859e1eb9fb6ba9314bcbc0795f17b92e2e1084..701e03dda6ed10c19af993513fd45739be4adeaa 100644 --- a/module/Application/src/Application/Form/Modulateur/TypeModulateurSaisieForm.php +++ b/module/Application/src/Application/Form/Modulateur/TypeModulateurSaisieForm.php @@ -46,27 +46,6 @@ class typeModulateurSaisieForm extends AbstractForm ], 'type' => 'Text', ]); - $this->add([ - 'name' => 'publique', - 'options' => [ - 'label' => 'Publique ?', - ], - 'type' => 'Checkbox', - ]); - $this->add([ - 'name' => 'obligatoire', - 'options' => [ - 'label' => 'Obligatoire ?', - ], - 'type' => 'Checkbox', - ]); - $this->add([ - 'name' => 'saisie-par-enseignant', - 'options' => [ - 'label' => 'Saisie par l\'enseignant ?', - ], - 'type' => 'Checkbox', - ]); $this->add(new Csrf('security')); $this->add([ 'name' => 'submit', @@ -124,9 +103,6 @@ class typeModulateurHydrator implements HydratorInterface { $object->setCode($data['code']); $object->setLibelle($data['libelle']); - $object->setPublique($data['publique']); - $object->setObligatoire($data['obligatoire']); - $object->setSaisieParEnseignant($data['saisie-par-enseignant']); return $object; } @@ -146,9 +122,6 @@ class typeModulateurHydrator implements HydratorInterface 'id' => $object->getId(), 'code' => $object->getCode(), 'libelle' => $object->getLibelle(), - 'publique' => $object->getPublique(), - 'obligatoire' => $object->getObligatoire(), - 'saisie-par-enseignant' => $object->getSaisieParEnseignant(), ]; return $data; diff --git a/module/Application/src/Application/Provider/Identity/IdentityProvider.php b/module/Application/src/Application/Provider/Identity/IdentityProvider.php index 9cd4a6958909927b9b00e27e3b89dd9a21dedc20..04937ce00997a27970ca88089bf2fba18e6921e8 100755 --- a/module/Application/src/Application/Provider/Identity/IdentityProvider.php +++ b/module/Application/src/Application/Provider/Identity/IdentityProvider.php @@ -60,11 +60,18 @@ class IdentityProvider implements ChainableProvider, IdentityProviderInterface if ($utilisateur = $this->getServiceContext()->getUtilisateur()) { foreach ($utilisateur->getAffectation() as $affectation) { /* @var $affectation Affectation */ - $roleId = $affectation->getRole()->getCode(); - if ($structure = $affectation->getStructure()) { - $roleId .= '-' . $structure->getSourceCode(); + $role = $affectation->getRole(); + try { + $roleId = $role->getCode(); + if ($role->estNonHistorise()) { + if ($structure = $affectation->getStructure()) { + $roleId .= '-' . $structure->getSourceCode(); + } + $this->identityRoles[] = $roleId; + } + }catch(\Exception $e){ + // on ignore les affectations dont les rôles ont été supprimés } - $this->identityRoles[] = $roleId; } } diff --git a/module/Application/src/Application/Provider/Role/RoleProvider.php b/module/Application/src/Application/Provider/Role/RoleProvider.php index d1eeb9dd50d32d5a317949e040c3b45cd16024e8..c04653773d7dc3812f05a4c3788af38876627e80 100755 --- a/module/Application/src/Application/Provider/Role/RoleProvider.php +++ b/module/Application/src/Application/Provider/Role/RoleProvider.php @@ -2,6 +2,7 @@ namespace Application\Provider\Role; +use Application\Cache\Traits\CacheContainerTrait; use Application\Entity\Db\Affectation; use Application\Entity\Db\Structure; use Application\Service\Traits\ContextServiceAwareTrait; @@ -29,6 +30,7 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface use IntervenantServiceAwareTrait; use PrivilegeProviderAwareTrait; use ContextServiceAwareTrait; + use CacheContainerTrait; /** * @var array @@ -153,7 +155,7 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface /* @var $affectation Affectation */ if ($structure = $affectation->getStructure()) { $affRoleId = $roleId . '-' . $structure->getSourceCode(); - if (!isset($roles[$affRoleId])) { + if (!isset($roles[$affRoleId]) && $dbRole->estNonHistorise()) { $affRoleLibelle = $dbRole->getLibelle() . ' (' . $structure->getLibelleCourt() . ')'; $affRole = new \Application\Acl\Role($affRoleId, $roleId, $affRoleLibelle); if (isset($rolesPrivileges[$roleId])) { @@ -192,8 +194,8 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface public function getStatutsInfo() { - $session = $this->getSessionContainer(); - if (!isset($session->statutsInfo)) { + $cc = $this->getCacheContainer(self::class); + if (!isset($cc->statutsInfo)) { $si = []; $statuts = $this->getServiceStatutIntervenant()->getList(); foreach ($statuts as $statut) { @@ -203,10 +205,10 @@ class RoleProvider implements ProviderInterface, EntityManagerAwareInterface 'role-name' => $statut->getTypeIntervenant()->getLibelle(), ]; } - $session->statutsInfo = $si; + $cc->statutsInfo = $si; } - return $session->statutsInfo; + return $cc->statutsInfo; } diff --git a/module/Application/view/application/modulateur/index.phtml b/module/Application/view/application/modulateur/index.phtml index b8de7496482ff0982fe6629a51d314dc7592b689..fa93867c1ab80712eb2312a6389b80e9d0d23ff5 100755 --- a/module/Application/view/application/modulateur/index.phtml +++ b/module/Application/view/application/modulateur/index.phtml @@ -9,12 +9,6 @@ use Application\Provider\Privilege\Privileges; use UnicaenApp\Util; -function affBooleen($flg) -{ - // affiche booléen avec des glypheIcon - return ($flg ? '<span class="glyphicon glyphicon-ok text-success"></span>' : '<span class="glyphicon glyphicon-remove text-danger refuse"></span>'); -} - $this->headTitle()->append("Modulateurs des taux horaires"); $canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::MODULATEUR_EDITION)); @@ -59,18 +53,6 @@ foreach ($typeModulateurs as $tm) { <div class="panel-body"> <div class="row"> <div class="col-md-3"> - <div class="row"> - <div class="col-md-9">Publique :</div> - <div class="col-md-3"><?= affBooleen($tm->getPublique()) ?></div> - </div> - <div class="row"> - <div class="col-md-9">Obligatoire :</div> - <div class="col-md-3"><?= affBooleen($tm->getObligatoire()) ?></div> - </div> - <div class="row"> - <div class="col-md-9">Saisie par ens:</div> - <div class="col-md-3"><?= affBooleen($tm->getSaisieParEnseignant()) ?></div> - </div> <table class="table table-bordered table-condensed table-extra-condensed" style="margin-top:0.5em; margin-bottom:1px;"> <?php foreach ($typeModulateurStructures as $tms) { ?> diff --git a/module/Application/view/application/statut-intervenant/clone.phtml b/module/Application/view/application/statut-intervenant/clone.phtml deleted file mode 100755 index 3263834d8e9cb7d53962f4a0d242c5f4aeee6d43..0000000000000000000000000000000000000000 --- a/module/Application/view/application/statut-intervenant/clone.phtml +++ /dev/null @@ -1,100 +0,0 @@ -<?php - -use Application\Provider\Privilege\Privileges; - -/** - * @var $this \Application\View\Renderer\PhpRenderer - * @var $form \Application\Form\StatutIntervenant\StatutIntervenantSaisieForm - */ - -$canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::INTERVENANT_STATUT_EDITION)); -echo $this->form()->openTag($form); ?> - -<style> - .temoins { - margin-left: 0px; - } - - .temoins .form-group { - margin-bottom: 1px; - } - - .temoins .form-group .checkbox { - margin-top: 1px; - margin-bottom: 1px; - } - - .atvb { - margin-top: 20px; - } - - .hetd { - background-color: white; - vertical-align: bottom; - border-width: 0; - } - -</style> -<div class="panel panel-default"> - <div class="panel-body"> - <div class="row"> - <div class="col-md-9"> - <div class="row"> - <div class="col-md-4"> - <?= $this->formControlGroup($form->get('type-intervenant')); ?> - </div> - <div class="col-md-8"> - <?= $this->formControlGroup($form->get('libelle')); ?> - </div> - </div> - <div class="row"> - <div class="col-md-4"> - <?= $this->formControlGroup($form->get('code')); ?> - </div> - <div class="col-md-2 atvb"> - <?= $this->formControlGroup($form->get('TEM-ATV')); ?> - </div> - <div class="col-md-4 atvb"> - <?= $this->formControlGroup($form->get('TEM-BIATSS')); ?> - </div> - </div> - <div class="row temoins"> - <?= $this->formControlGroup($form->get('non-autorise')); ?> - <?= $this->formControlGroup($form->get('depassement')); ?> - <?= $this->formControlGroup($form->get('peut-saisir-referentiel')); ?> - <?= $this->formControlGroup($form->get('peut-saisir-service')); ?> - <?= $this->formControlGroup($form->get('peut-choisir-dans-dossier')); ?> - <?= $this->formControlGroup($form->get('peut-avoir-contrat')); ?> - <?= $this->formControlGroup($form->get('peut-saisir-dossier')); ?> - <?= $this->formControlGroup($form->get('peut-saisir-motif-non-paiement')); ?> - <?= $this->formControlGroup($form->get('peut-cloturer-saisie')); ?> - <?= $this->formControlGroup($form->get('peut-saisir-service-ext')); ?> - <?= $this->formControlGroup($form->get('depassement-sdshc')); ?> - <br/> - <?= $this->formControlGroup($form->get('security')); ?> - <?= $this->formSubmit($form->get('submit')); ?> - </div> - </div> - <div class="col-md-3"> - <?= $this->formControlGroup($form->get('service-statutaire')); ?> - <?= $this->formControlGroup($form->get('plafond-referentiel')); ?> - <?= $this->formControlGroup($form->get('maximum-HETD')); ?> - <?= $this->formControlGroup($form->get('plafond-h-h-c')); ?> - <?= $this->formControlGroup($form->get('plafond-h-c')); ?> - </div> - </div> - </div> - - - <?php - echo $this->form()->closeTag(); - echo $this->messenger()->addCurrentMessagesFromFlashMessenger(); - ?> - <script type="text/javascript"> - $(function () { - $("body").on("statut-intervenant-clone", function (event, data) { - console.log('toto'); - window.location.reload(); - }); - }); - </script>