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>