From 9945cbf2d79e95b8779ff0efecc2f284a6650189 Mon Sep 17 00:00:00 2001
From: Antony Le Courtes <antony.lecourtes@unicaen.fr>
Date: Fri, 25 Sep 2020 12:23:19 +0200
Subject: [PATCH] Merge Master in alc-dossier-form

---
 CHANGELOG.md                                  |  14 +-
 admin/actions/update-employeur.php            |   4 +
 admin/src/BddAdmin/Table.php                  |  12 +-
 data/privileges.php                           |  11 +-
 .../config/administration.config.php          |  57 +++++++--
 .../Application/config/employeur.config.php   |  26 +---
 module/Application/config/voirie.config.php   |  82 ++++++++++++
 .../Controller/AdministrationController.php   |   7 +
 .../Controller/VoirieController.php           |  68 ++++++++++
 .../Traits/VoirieSaisieFormAwareTrait.php     |  43 +++++++
 .../Form/Voirie/VoirieSaisieForm.php          | 120 ++++++++++++++++++
 .../Provider/Privilege/Privileges.php         |   4 +
 .../Application/Service/EmployeurService.php  |   1 +
 .../view/application/voirie/index.phtml       |  78 ++++++++++++
 .../view/application/voirie/saisie.phtml      |   7 +
 15 files changed, 495 insertions(+), 39 deletions(-)
 create mode 100755 module/Application/config/voirie.config.php
 create mode 100644 module/Application/src/Application/Controller/VoirieController.php
 create mode 100755 module/Application/src/Application/Form/Voirie/Traits/VoirieSaisieFormAwareTrait.php
 create mode 100755 module/Application/src/Application/Form/Voirie/VoirieSaisieForm.php
 create mode 100755 module/Application/view/application/voirie/index.phtml
 create mode 100755 module/Application/view/application/voirie/saisie.phtml

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 257dd38323..23d641a4f4 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,24 +35,34 @@ Si vous êtes sur une version antérieurs à la 14, merci de migrer en V14.x **A
 * La base de données ayant été remaniée, il vous faudra adapter vos connecteurs RH. En particulier ceux visant les tables INTERVERNANT et STRUCTURE.
 Une nouvelle documentation sur les connecteurs est disponible ici : [Import de données via les connecteurs](doc/Connecteurs%20Import/Connecteurs%20IMPORT.md).
 
+# OSE 14.10
 
+## Corrections de bugs
+
+* Lors de la modification du référentiel réalisé, l'horodatage (nom et date de modification) n'impacte plus le référentiel prévisionnel.
 
 # OSE 14.9
 
 ## Nouveautés
 
-* Intégration (en cours) de la formule de calcul de Poitiers.
+* Intégration de la formule de calcul de Poitiers.
 * Stockage de la date d'envoi par e-mail du contrat
 * Nouvel indicateur 361 permettant de suivre les retours de contrats envoyés par email
 * Possibilité de tranférer une fiche de service vers la page de test des formules de calcul
 * Possibilité d'exporter et d'importer sous forme de fichier un test de formule de calcul
-* Formule de calcul de l'Université de Poitiers
 * Piece justificative : forcer la durée de vie à 1 si la case "Uniquement en cas de changement de RIB" est cochée par l'utilisateur pour éviter les mauvais paramétrages des pièces jointes
 
 ## Corrections de bugs
 
 * Dans l'écran contrat du vacataire, l'action "envoyer par mail", n'envoyait pas le contrat par mail si l'intervenant n'avait pas d'email établissement.
 
+## Notes de mise à jour
+
+* Lors de la mise à jour, vous rencontrerez deux erreurs :
+  * lors de la modification de l'indicateur 361
+  * lors de l'ajout d'une contrainte sur la table NOEUD
+
+Il vous faudra éxécuter `./bin/ose update-bdd` juste après la MAJ pour corriger ces erreurs.
 
 
 # OSE 14.8
diff --git a/admin/actions/update-employeur.php b/admin/actions/update-employeur.php
index e3c1047f33..c8181817d7 100644
--- a/admin/actions/update-employeur.php
+++ b/admin/actions/update-employeur.php
@@ -96,10 +96,14 @@ foreach ($listFiles as $file) {
         $data['NOM_COMMERCIAL']          = $nomCommercial;
         $data['SOURCE_ID']               = $oseSource;
         $data['IDENTIFIANT_ASSOCIATION'] = $identifiantAssociation;
+        $data['HISTO_DESTRUCTEUR_ID']    = null;
+        $data['HISTO_DESTRUCTION']       = null;
+        $data['IDENTIFIANT_ASSOCIATION'] = $identifiantAssociation;
         $data['CRITERE_RECHERCHE']       = reduce($raisonSociale . ' ' . $nomCommercial . ' ' . $siren);
         $datas[]                         = $data;
         $options['histo-user-id']        = $oseId;
         $options['where']                = 'SIREN LIKE \'' . $num . '%\'';
+        $options['soft-delete']          = true;
     }
     $i++;
 
diff --git a/admin/src/BddAdmin/Table.php b/admin/src/BddAdmin/Table.php
index 84de6cfa9e..aac7796ccc 100644
--- a/admin/src/BddAdmin/Table.php
+++ b/admin/src/BddAdmin/Table.php
@@ -377,13 +377,14 @@ class Table
 
     public function merge(array $data, $key, array $options = []): array
     {
-        $result = ['insert' => 0, 'update' => 0, 'delete' => 0];
+        $result = ['insert' => 0, 'update' => 0, 'delete' => 0, 'soft-delete' => 0];
 
         /* Initialisation */
         $defaultOptions = [
             'where'              => null,
             'key'                => $key,
             'delete'             => true,
+            'soft-delete'        => false,
             'insert'             => true,
             'update'             => true,
             'update-cols'        => [],
@@ -437,7 +438,14 @@ class Table
                     $this->insert($new, $traitementOptions);
                     $result['insert']++;
                 }
-            } elseif (empty($new)) { // DELETE
+            } elseif (empty($new) && $options['soft-delete'] && !empty($options['histo-user-id'])) { // SOFT DELETE
+                //On ne delete pas mais on historise
+                $new                         = $old;
+                $new['HISTO_DESTRUCTEUR_ID'] = $traitementOptions['histo-user-id'];
+                $new['HISTO_DESTRUCTION']    = new \DateTime();
+                $this->update($new, $this->makeKeyArray($old, $key), $traitementOptions);
+                $result['soft-delete']++;
+            } elseif (empty($new) && !$options['soft-delete']) { // DELETE
                 if ($options['delete']) {
                     $this->delete($this->makeKeyArray($old, $key));
                     $result['delete']++;
diff --git a/data/privileges.php b/data/privileges.php
index d7f66287a3..721e62daaf 100644
--- a/data/privileges.php
+++ b/data/privileges.php
@@ -388,16 +388,19 @@ return [
         ],
     ],
 
-    'formule'   => [
+    'formule'            => [
         'libelle'    => 'Formule de calcul',
         'privileges' => [
             'tests' => 'Tests',
         ],
     ],
-    'employeur' => [
-        'libelle'    => 'Employeurs',
+    'referentiel-commun' => [
+        'libelle'    => 'Référentiels communs',
         'privileges' => [
-            'gestion' => 'Gestion des employeurs',
+            'voirie-visualisation'    => 'Visualisation voiries',
+            'voirie-edition'          => 'Édition voiries',
+            'employeur-visualisation' => 'Visualisation employeurs',
+            'employeur-edition'       => 'Édition employeurs',
         ],
     ],
 
diff --git a/module/Application/config/administration.config.php b/module/Application/config/administration.config.php
index a4e1a56c8b..4594f09240 100755
--- a/module/Application/config/administration.config.php
+++ b/module/Application/config/administration.config.php
@@ -8,7 +8,7 @@ use UnicaenAuth\Guard\PrivilegeController;
 return [
     'router' => [
         'routes' => [
-            'administration'             => [
+            'administration'                    => [
                 'type'          => 'Literal',
                 'options'       => [
                     'route'    => '/administration',
@@ -19,7 +19,7 @@ return [
                 ],
                 'may_terminate' => true,
             ],
-            'administration-type'        => [
+            'administration-type'               => [
                 'type'          => 'Literal',
                 'options'       => [
                     'route'    => '/administration-type',
@@ -30,7 +30,18 @@ return [
                 ],
                 'may_terminate' => true,
             ],
-            'administration-financiere'  => [
+            'administration-referentiel-commun' => [
+                'type'          => 'Literal',
+                'options'       => [
+                    'route'    => '/administration-referentiel-commun',
+                    'defaults' => [
+                        'controller' => 'Application\Controller\Administration',
+                        'action'     => 'administration-referentiel-commun',
+                    ],
+                ],
+                'may_terminate' => true,
+            ],
+            'administration-financiere'         => [
                 'type'          => 'Literal',
                 'options'       => [
                     'route'    => '/administration-financiere',
@@ -41,7 +52,7 @@ return [
                 ],
                 'may_terminate' => true,
             ],
-            'administration-intervenant' => [
+            'administration-intervenant'        => [
                 'type'          => 'Literal',
                 'options'       => [
                     'route'    => '/administration-intervenant',
@@ -55,7 +66,7 @@ return [
         ],
     ],
 
-    'navigation'   => [
+    'navigation' => [
         'default' => [
             'home' => [
                 'pages' => [
@@ -65,7 +76,34 @@ return [
                         'resource' => PrivilegeController::getResourceId('Application\Controller\Administration', 'index'),
                         'order'    => 7,
                         'pages'    => [
-                            'gestion-intervenant'       => [
+                            'gestion-referentiel-commun' => [
+                                'label'          => 'Gestion référentiels communs',
+                                'icon'           => 'glyphicon glyphicon - list-alt',
+                                'route'          => 'administration-referentiel-commun',
+                                'resource'       => PrivilegeController::getResourceId('Application\Controller\Administration', 'administration-referentiel-commun'),
+                                'order'          => 80,
+                                'border - color' => '#111',
+                                'pages'          => [
+                                    'voirie'     => [
+                                        'label'        => 'Gestion des voiries',
+                                        'icon'         => 'fa fa-graduation-cap',
+                                        'route'        => 'voirie',
+                                        'resource'     => PrivilegeController::getResourceId('Application\Controller\Voirie', 'index'),
+                                        'order'        => 800,
+                                        'border-color' => '#BBCF55',
+                                    ],
+                                    'Employeurs' => [
+                                        'border-color' => '#9F491F',
+                                        'icon'         => 'glyphicon glyphicon-list-alt',
+                                        'label'        => "Gestion des employeurs",
+                                        'title'        => "Gestion des employeurs",
+                                        'route'        => 'employeur',
+                                        'resource'     => PrivilegeController::getResourceId('Application\Controller\Employeur', 'index'),
+                                        'order'        => 70,
+                                    ],
+                                ],
+                            ],
+                            'gestion-intervenant'        => [
                                 'label'          => 'Gestion intervenants (Statuts, PJ,  etc...)',
                                 'icon'           => 'glyphicon glyphicon - list-alt',
                                 'route'          => 'administration-intervenant',
@@ -104,7 +142,7 @@ return [
                                     ],
                                 ],
                             ],
-                            'administration-financiere' => [
+                            'administration-financiere'  => [
                                 'label'          => 'Données financières',
                                 'icon'           => 'glyphicon glyphicon - list-alt',
                                 'route'          => 'administration-financiere',
@@ -137,12 +175,13 @@ return [
             ],
         ],
     ],
+
     'bjyauthorize' => [
         'guards' => [
             PrivilegeController::class => [
                 [
                     'controller' => 'Application\Controller\Administration',
-                    'action'     => ['index', 'administration-types', 'administration-financiere', 'administration-intervenant'],
+                    'action'     => ['index', 'administration-types', 'administration-financiere', 'administration-intervenant', 'administration-referentiel-commun'],
                     'privileges' => [
                         Privileges::IMPORT_ECARTS,
                         Privileges::IMPORT_MAJ,
@@ -157,6 +196,8 @@ return [
                         Privileges::DROIT_AFFECTATION_VISUALISATION,
                         Privileges::PARAMETRES_GENERAL_VISUALISATION,
                         Privileges::REFERENTIEL_ADMIN_VISUALISATION,
+                        Privileges::REFERENTIEL_COMMUN_VOIRIE_VISUALISATION,
+                        Privileges::REFERENTIEL_COMMUN_EMPLOYEUR_VISUALISATION,
                         Privileges::TYPE_INTERVENTION_VISUALISATION,
                         Privileges::TYPE_RESSOURCE_VISUALISATION,
                         Privileges::PIECE_JUSTIFICATIVE_GESTION_VISUALISATION,
diff --git a/module/Application/config/employeur.config.php b/module/Application/config/employeur.config.php
index 8cf3bd5103..06c32be626 100644
--- a/module/Application/config/employeur.config.php
+++ b/module/Application/config/employeur.config.php
@@ -46,27 +46,7 @@ return [
 
         ],
     ],
-    'navigation' => [
-        'default' => [
-            'home' => [
-                'pages' => [
-                    'administration' => [
-                        'pages' => [
-                            'Employeurs' => [
-                                'border-color' => '#9F491F',
-                                'icon'         => 'glyphicon glyphicon-list-alt',
-                                'label'        => "Employeurs",
-                                'title'        => "Gestion des employeurs",
-                                'route'        => 'employeur',
-                                'resource'     => PrivilegeController::getResourceId('Application\Controller\Discipline', 'index'),//creer un priviege employeur
-                                'order'        => 70,
-                            ],
-                        ],
-                    ],
-                ],
-            ],
-        ],
-    ],
+
 
     'console' => [
         'router' => [
@@ -99,7 +79,7 @@ return [
                 [
                     'controller' => 'Application\Controller\Employeur',
                     'action'     => ['index', 'recherche-json'],
-                    'privileges' => Privileges::EMPLOYEUR_GESTION,
+                    'privileges' => Privileges::REFERENTIEL_COMMUN_EMPLOYEUR_VISUALISATION,
                 ],
             ],
             'BjyAuthorize\Guard\Controller' => [
@@ -118,7 +98,7 @@ return [
                 'allow' => [
                     [
                         'privileges' => [
-                            Privileges::EMPLOYEUR_GESTION,
+                            Privileges::REFERENTIEL_COMMUN_EMPLOYEUR_VISUALISATION,
                         ],
                         'resources'  => 'Contrat',
                     ],
diff --git a/module/Application/config/voirie.config.php b/module/Application/config/voirie.config.php
new file mode 100755
index 0000000000..f40be28da3
--- /dev/null
+++ b/module/Application/config/voirie.config.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace Application;
+
+
+use Application\Provider\Privilege\Privileges;
+use UnicaenAuth\Guard\PrivilegeController;
+
+return [
+    'router' => [
+        'routes' => [
+            'voirie' => [
+                'type'          => 'Literal',
+                'options'       => [
+                    'route'    => '/voirie',
+                    'defaults' => [
+                        'controller' => 'Application\Controller\Voirie',
+                        'action'     => 'index',
+                    ],
+                ],
+                'may_terminate' => true,
+                'child_routes'  => [
+                    'saisie' => [
+                        'type'          => 'Segment',
+                        'options'       => [
+                            'route'       => '/saisie[/:voirie]',
+                            'constraints' => [
+                                'voirie' => '[0-9]*',
+                            ],
+                            'defaults'    => [
+                                'action' => 'saisie',
+                            ],
+                        ],
+                        'may_terminate' => true,
+                    ],
+                    'delete' => [
+                        'type'          => 'Segment',
+                        'options'       => [
+                            'route'       => '/delete/:voirie',
+                            'constraints' => [
+                                'voirie' => '[0-9]*',
+                            ],
+                            'defaults'    => [
+                                'action' => 'delete',
+                            ],
+                        ],
+                        'may_terminate' => true,
+                    ],
+                ],
+            ],
+        ],
+    ],
+
+    'bjyauthorize'  => [
+        'guards' => [
+            PrivilegeController::class => [
+                [
+                    'controller' => 'Application\Controller\Voirie',
+                    'action'     => ['index'],
+                    'privileges' => [Privileges::REFERENTIEL_COMMUN_VOIRIE_VISUALISATION],
+                ],
+                [
+                    'controller' => 'Application\Controller\Voirie',
+                    'action'     => ['saisie', 'delete'],
+                    'privileges' => [Privileges::REFERENTIEL_COMMUN_VOIRIE_EDITION],
+                ],
+
+
+            ],
+        ],
+    ],
+    'controllers'   => [
+        'invokables' => [
+            'Application\Controller\Voirie' => Controller\VoirieController::class,
+        ],
+    ],
+    'form_elements' => [
+        'invokables' => [
+            Form\Voirie\VoirieSaisieForm::class => Form\Voirie\VoirieSaisieForm::class,
+        ],
+    ],
+];
diff --git a/module/Application/src/Application/Controller/AdministrationController.php b/module/Application/src/Application/Controller/AdministrationController.php
index 9f04d00bcb..1e188714ec 100755
--- a/module/Application/src/Application/Controller/AdministrationController.php
+++ b/module/Application/src/Application/Controller/AdministrationController.php
@@ -38,4 +38,11 @@ class AdministrationController extends AbstractController
         return [];
     }
 
+
+
+    public function administrationReferentielCommunAction()
+    {
+        return [];
+    }
+
 }
\ No newline at end of file
diff --git a/module/Application/src/Application/Controller/VoirieController.php b/module/Application/src/Application/Controller/VoirieController.php
new file mode 100644
index 0000000000..ec74ca674a
--- /dev/null
+++ b/module/Application/src/Application/Controller/VoirieController.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Application\Controller;
+
+use Application\Entity\Db\Voirie;
+use Application\Form\Voirie\Traits\VoirieSaisieFormAwareTrait;
+use Application\Service\Traits\VoirieServiceAwareTrait;
+use UnicaenApp\View\Model\MessengerViewModel;
+
+class VoirieController extends AbstractController
+{
+
+    use VoirieServiceAwareTrait;
+    use VoirieSaisieFormAwareTrait;
+
+    public function indexAction()
+    {
+        $this->em()->getFilters()->enable('historique')->init([
+            Voirie::class,
+        ]);
+
+        $voiries = $this->getServiceVoirie()->getList();
+
+        return compact('voiries');
+    }
+
+
+
+    public function saisieAction()
+    {
+        $voirie = $this->getEvent()->getParam('voirie');
+
+        $form = $this->getFormVoirieSaisie();
+
+        if (empty($voirie)) {
+            $title  = "Création d'une nouvelle voirie";
+            $voirie = $this->getServiceVoirie()->newEntity();
+        } else {
+            $title = "Edition d'une voirie";
+        }
+
+        $form->bindRequestSave($voirie, $this->getRequest(), function (Voirie $v) {
+            try {
+                $this->getServiceVoirie()->save($v);
+                $this->flashMessenger()->addSuccessMessage('Enregistrement effectué');
+            } catch (Exception $e) {
+                $this->flashMessenger()->addErrorMessage($this->translate($e));
+            }
+        });
+
+        return compact('form', 'title');
+    }
+
+
+
+    public function deleteAction()
+    {
+        $voirie = $this->getEvent()->getParam('voirie');
+        try {
+            $this->getServiceVoirie()->delete($voirie);
+            $this->flashMessenger()->addSuccessMessage("Voirie supprimée avec succés");
+        } catch (\Exception $e) {
+            $this->flasheMessenger()->addErrorMessage($this->translate($e));
+        }
+
+        return new MessengerViewModel(compact('voirie'));
+    }
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/Form/Voirie/Traits/VoirieSaisieFormAwareTrait.php b/module/Application/src/Application/Form/Voirie/Traits/VoirieSaisieFormAwareTrait.php
new file mode 100755
index 0000000000..3094351efa
--- /dev/null
+++ b/module/Application/src/Application/Form/Voirie/Traits/VoirieSaisieFormAwareTrait.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Application\Form\Voirie\Traits;
+
+
+use Application\Form\Voirie\VoirieSaisieForm;
+
+/**
+ * Description of VoirieSaisieFormAwareTrait
+ */
+trait VoirieSaisieFormAwareTrait
+{
+    /**
+     * @var VoirieSaisieForm
+     */
+    private $formVoirieSaisie;
+
+
+
+    /**
+     * @param VoirieSaisieForm $formVoirieSaisie
+     *
+     * @return self
+     */
+    public function setFormVoirieSaisie(VoirieSaisieForm $formVoirieSaisie)
+    {
+        $this->formVoirieSaisie = $formVoirieSaisie;
+
+        return $this;
+    }
+
+
+
+    public function getFormVoirieSaisie()
+    {
+        if (!empty($this->formVoirieSaisie)) {
+            return $this->formVoirieSaisie;
+        }
+
+        return \Application::$container->get('FormElementManager')->get(VoirieSaisieForm::class);
+    }
+}
+
diff --git a/module/Application/src/Application/Form/Voirie/VoirieSaisieForm.php b/module/Application/src/Application/Form/Voirie/VoirieSaisieForm.php
new file mode 100755
index 0000000000..5d82d767c1
--- /dev/null
+++ b/module/Application/src/Application/Form/Voirie/VoirieSaisieForm.php
@@ -0,0 +1,120 @@
+<?php
+
+namespace Application\Form\Voirie;
+
+
+use Application\Form\AbstractForm;
+use Application\Hydrator\GenericHydrator;
+use Application\Service\Traits\SourceServiceAwareTrait;
+use UnicaenApp\Util;
+use UnicaenImport\Entity\Db\Source;
+use Zend\Form\Element\Csrf;
+
+/**
+ * Description of VoirieForm
+ */
+class VoirieSaisieForm extends AbstractForm
+{
+    use SourceServiceAwareTrait;
+
+
+    protected $hydratorElements = [
+        'id'         => ['type' => 'int'],
+        'libelle'    => ['type' => 'string'],
+        'code'       => ['type' => 'string'],
+        'source'     => ['type' => Source::class],
+        'sourceCode' => ['type' => 'string'],
+    ];
+
+
+
+    public function init()
+    {
+        $hydrator = new GenericHydrator($this->getServiceSource()->getEntityManager(), $this->hydratorElements);
+        $this->setHydrator($hydrator);
+
+        $this->setAttribute('action', $this->getCurrentUrl());
+
+        $this->add([
+            'name'       => 'libelle',
+            'options'    => [
+                'label' => 'Libellé',
+            ],
+            'attributes' => [
+
+            ],
+            'type'       => 'Text',
+        ]);
+
+        $this->add([
+            'name'       => 'code',
+            'options'    => [
+                'label' => "Code",
+            ],
+            'attributes' => [
+                'id' => uniqid('code'),
+            ],
+            'type'       => 'Text',
+        ]);
+
+        $this->add([
+            'name'    => 'source',
+            'type'    => 'Select',
+            'options' => [
+                'label'         => 'Source des données',
+                'value_options' => Util::collectionAsOptions($this->getServiceSource()->getList()),
+            ],
+        ]);
+
+        $this->add([
+            'name'    => 'sourceCode',
+            'type'    => 'Text',
+            'options' => [
+                'label' => 'Code source',
+            ],
+        ]);
+
+
+        $this->add(new Csrf('security'));
+        $this->add([
+            'name'       => 'submit',
+            'type'       => 'Submit',
+            'attributes' => [
+                'value' => "Enregistrer",
+                'class' => 'btn btn-primary',
+            ],
+        ]);
+
+        $this->add([
+            'name' => 'id',
+            'type' => 'Hidden',
+        ]);
+
+
+        return $this;
+    }
+
+
+
+    /**
+     * Should return an array specification compatible with
+     * {@link Zend\InputFilter\Factory::createInputFilter()}.
+     *
+     * @return array
+     */
+    public function getInputFilterSpecification()
+    {
+        return [
+            'libelle' => [
+                'required' => false,
+            ],
+            'code'    => [
+                'required' => false,
+            ],
+        ];
+    }
+
+}
+
+
+
diff --git a/module/Application/src/Application/Provider/Privilege/Privileges.php b/module/Application/src/Application/Provider/Privilege/Privileges.php
index 8cdf53cbe2..d529aaced0 100755
--- a/module/Application/src/Application/Provider/Privilege/Privileges.php
+++ b/module/Application/src/Application/Provider/Privilege/Privileges.php
@@ -196,6 +196,10 @@ class Privileges extends \UnicaenAuth\Provider\Privilege\Privileges
     const PLAFONDS_GESTION_VISUALISATION                      = 'plafonds-gestion-visualisation';
     const REFERENTIEL_ADMIN_EDITION                           = 'referentiel-admin-edition';
     const REFERENTIEL_ADMIN_VISUALISATION                     = 'referentiel-admin-visualisation';
+    const REFERENTIEL_COMMUN_VOIRIE_EDITION                   = 'referentiel-commun-voirie-edition';
+    const REFERENTIEL_COMMUN_VOIRIE_VISUALISATION             = 'referentiel-commun-voirie-visualisation';
+    const REFERENTIEL_COMMUN_EMPLOYEUR_EDITION                = 'referentiel-commun-employeur-edition';
+    const REFERENTIEL_COMMUN_EMPLOYEUR_VISUALISATION          = 'referentiel-commun-employeur-visualisation';
     const REFERENTIEL_DEVALIDATION                            = 'referentiel-devalidation';
     const REFERENTIEL_EDITION                                 = 'referentiel-edition';
     const REFERENTIEL_VALIDATION                              = 'referentiel-validation';
diff --git a/module/Application/src/Application/Service/EmployeurService.php b/module/Application/src/Application/Service/EmployeurService.php
index 5eeef1c1de..50e35ee5d0 100644
--- a/module/Application/src/Application/Service/EmployeurService.php
+++ b/module/Application/src/Application/Service/EmployeurService.php
@@ -74,6 +74,7 @@ class EmployeurService extends AbstractEntityService
             FROM 
                 EMPLOYEUR e 
             WHERE rownum <= $limit
+            AND HISTO_DESTRUCTION IS NULL
         ";
 
         if (!empty($criteria)) {
diff --git a/module/Application/view/application/voirie/index.phtml b/module/Application/view/application/voirie/index.phtml
new file mode 100755
index 0000000000..84c142aa9e
--- /dev/null
+++ b/module/Application/view/application/voirie/index.phtml
@@ -0,0 +1,78 @@
+<?php
+/**
+ * @var $this                  \Application\View\Renderer\PhpRenderer
+ */
+
+use Application\Provider\Privilege\Privileges;
+
+$this->headTitle()->append("Gestion des voiries");
+
+$canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::REFERENTIEL_COMMUN_VOIRIE_EDITION));
+
+?>
+<h1 class="page-header">Gestion des voiries</h1>
+
+<table class="table table-bordered table-sort">
+    <thead>
+    <th>Code</th>
+    <th>Libelle</th>
+    <th>Source</th>
+    <?php if ($canEdit) echo '<th>Actions</th>' ?>
+    </thead>
+    <tbody>
+    <?php
+    /**
+     * @var \Application\Entity\Db\Voirie $voirie
+     */
+    ?>
+    <?php foreach ($voiries as $voirie): ?>
+        <tr>
+            <td><?= $voirie->getCode() ?></td>
+            <td data-order="<?= $voirie->getLibelle() ?>">
+                <?= $voirie->getLibelle() ?>
+            </td>
+            <td><?= $voirie->getSource()->getLibelle() ?></td>
+
+            <?php if ($canEdit): ?>
+                <td style="text-align:center;width:1px;white-space: nowrap">
+                    <?php if (!$voirie->getSource()->getImportable()): ?>
+                        <a class="disabled ajax-modal" data-event="voirie-saisie"
+                           href="<?= $this->url('voirie/saisie', ['voirie' => $voirie->getId()]) ?>"
+                           title="Modifier la voirie">
+                            <span class="glyphicon glyphicon-edit"></span></a>
+                        <a class="pop-ajax"
+                           href="<?= $this->url('voirie/delete', ['voirie' => $voirie->getId()]) ?>"
+                           title="Supprimer la voirie"
+                           data-content="<p class='lead text-danger'><strong>Attention!</strong> Confirmez-vous cette suppression ?</p>"
+                           data-confirm="true"
+                           data-confirm-button="Oui"
+                           data-cancel-button="Non"
+                           data-submit-reload="true"
+                        >
+                            <span class="glyphicon glyphicon-remove"></span>
+                        </a>
+                    <?php else: ?>
+                        Non modifiable
+                    <?php endif; ?>
+                </td>
+            <?php endif; ?>
+        </tr>
+    <?php endforeach; ?>
+    </tbody>
+</table>
+<?php if ($canEdit): ?>
+    <a class="btn btn-primary ajax-modal" data-event="voirie-saisie"
+       href="<?= $this->url('voirie/saisie') ?>"
+       title="Ajouter une voirie">
+        <span class="glyphicon glyphicon-edit"></span>
+        Ajouter une voirie</a>
+
+    <script type="text/javascript">
+        $(function () {
+            $("body").on("voirie-saisie", function (event, data) {
+                window.location.reload();
+            });
+        });
+    </script>
+<?php endif ?>
+
diff --git a/module/Application/view/application/voirie/saisie.phtml b/module/Application/view/application/voirie/saisie.phtml
new file mode 100755
index 0000000000..ac28762d2c
--- /dev/null
+++ b/module/Application/view/application/voirie/saisie.phtml
@@ -0,0 +1,7 @@
+<?php
+/**
+ * @var $this  \Application\View\Renderer\PhpRenderer
+ */
+
+echo $this->messenger()->addCurrentMessagesFromFlashMessenger();
+echo $this->form($form);
-- 
GitLab