From 630159e2215ff8607e22bd324a3b154b0af3752a Mon Sep 17 00:00:00 2001
From: gauthierb <gauthierb@d57fa8bc-6af1-4de9-8b7d-78e900e231e7>
Date: Tue, 9 Sep 2014 11:41:16 +0000
Subject: [PATCH] =?UTF-8?q?Branche=20de=20Travail=20sur=20l'upload=20de=20?=
 =?UTF-8?q?pi=C3=A8ces=20justificatives?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 composer.json                                 |  1 +
 composer.lock                                 | 81 +++++++++++------
 config/application.config.php                 |  1 +
 .../Application/config/intervenant.config.php | 15 +++-
 .../Controller/AgrementController.php         |  1 +
 .../Controller/DossierController.php          | 86 +++++++++++++++++++
 .../NecessitePassageConseilRestreintRule.php  | 30 -------
 ...NecessitePassageConseilRestreintRule_1.php | 30 -------
 .../PeutSaisirModificationServiceDuRule.php   | 21 +++--
 .../Step/AgrementConseilRestreintStep.php     | 35 --------
 .../Service/Workflow/Step/AgrementStep.php    |  1 +
 .../Workflow/Step/EditionContratStep.php      |  1 +
 .../Workflow/Step/SaisieDossierStep.php       |  1 +
 .../Workflow/Step/SaisiePiecesJointesStep.php |  3 +-
 .../Workflow/Step/SaisieServiceStep.php       |  1 +
 .../Service/Workflow/Step/Step.php            |  8 +-
 .../Workflow/Step/ValidationDossierStep.php   |  1 +
 .../Workflow/Step/ValidationServiceStep.php   |  1 +
 .../application/agrement/ajouter-lot.phtml    |  2 +
 .../view/application/agrement/index.phtml     |  2 +
 .../view/application/agrement/lister.phtml    |  2 +
 .../view/application/contrat/creer.phtml      |  2 +
 .../view/application/contrat/index.phtml      |  1 -
 .../view/application/dossier/modifier.phtml   |  4 +-
 .../application/dossier/pieces-jointes.phtml  |  4 +-
 .../view/application/index/gestion.phtml      |  2 +
 .../view/application/index/index.phtml        |  3 +
 .../application/intervenant/choisir.phtml     |  4 +-
 .../view/application/intervenant/voir.phtml   |  2 +
 .../modification-service-du/saisir.phtml      |  4 +-
 .../application/offre-formation/index.phtml   |  2 +
 .../view/application/service/index.phtml      |  2 +
 .../view/application/service/resume.phtml     |  2 +
 .../view/application/validation/dossier.phtml |  2 +
 .../view/application/validation/service.phtml |  2 +
 35 files changed, 223 insertions(+), 137 deletions(-)
 delete mode 100644 module/Application/src/Application/Rule/Intervenant/NecessitePassageConseilRestreintRule.php
 delete mode 100644 module/Application/src/Application/Rule/Intervenant/NecessitePassageConseilRestreintRule_1.php
 delete mode 100644 module/Application/src/Application/Service/Workflow/Step/AgrementConseilRestreintStep.php
 delete mode 100644 module/Application/view/application/contrat/index.phtml

diff --git a/composer.json b/composer.json
index cb47101d2c..e85dc0d81d 100755
--- a/composer.json
+++ b/composer.json
@@ -11,6 +11,7 @@
         "unicaen/unicaen-app":                  "dev-trunk",
         "unicaen/unicaen-auth":                 "dev-trunk",
         "unicaen/unicaen-ldap":                 "dev-trunk",
+        "unicaen/unicaen-upload":               "dev-trunk",
         "zendframework/zend-code":              ">=2.3",
         "zf-commons/zfc-user":                  "0.1.3",
         "mpdf/mpdf":                            "v5.7.2"
diff --git a/composer.lock b/composer.lock
index 7f4f4730d5..bf6a0da3d9 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "3a4abe9eb3a2f23392513e99e429a1ef",
+    "hash": "b691393f43738916dc3251302722f7f5",
     "packages": [
         {
             "name": "bjyoungblood/bjy-authorize",
@@ -706,7 +706,7 @@
                 {
                     "name": "Johannes Schmitt",
                     "email": "schmittjoh@gmail.com",
-                    "homepage": "https://github.com/schmittjoh",
+                    "homepage": "http://jmsyst.com",
                     "role": "Developer of wrapped JMSSerializerBundle"
                 }
             ],
@@ -1012,17 +1012,17 @@
         },
         {
             "name": "symfony/console",
-            "version": "v2.5.3",
+            "version": "v2.5.4",
             "target-dir": "Symfony/Component/Console",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Console.git",
-                "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63"
+                "reference": "748beed2a1e73179c3f5154d33fe6ae100c1aeb1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Console/zipball/cd2d1e4bac2206b337326b0140ff475fe9ad5f63",
-                "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63",
+                "url": "https://api.github.com/repos/symfony/Console/zipball/748beed2a1e73179c3f5154d33fe6ae100c1aeb1",
+                "reference": "748beed2a1e73179c3f5154d33fe6ae100c1aeb1",
                 "shasum": ""
             },
             "require": {
@@ -1063,21 +1063,21 @@
             ],
             "description": "Symfony Console Component",
             "homepage": "http://symfony.com",
-            "time": "2014-08-05 09:00:40"
+            "time": "2014-08-14 16:10:54"
         },
         {
             "name": "symfony/process",
-            "version": "v2.5.3",
+            "version": "v2.5.4",
             "target-dir": "Symfony/Component/Process",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Process.git",
-                "reference": "e0997d2a9a1a763484b34b989900b61322a9b056"
+                "reference": "136cf0bdaacea81f779583376d47dd8aef4fc6ba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Process/zipball/e0997d2a9a1a763484b34b989900b61322a9b056",
-                "reference": "e0997d2a9a1a763484b34b989900b61322a9b056",
+                "url": "https://api.github.com/repos/symfony/Process/zipball/136cf0bdaacea81f779583376d47dd8aef4fc6ba",
+                "reference": "136cf0bdaacea81f779583376d47dd8aef4fc6ba",
                 "shasum": ""
             },
             "require": {
@@ -1110,7 +1110,7 @@
             ],
             "description": "Symfony Process Component",
             "homepage": "http://symfony.com",
-            "time": "2014-08-05 09:00:40"
+            "time": "2014-08-31 03:22:04"
         },
         {
             "name": "unicaen/unicaen-app",
@@ -1214,6 +1214,38 @@
             },
             "description": "Module Ldap de l'UCBN"
         },
+        {
+            "name": "unicaen/unicaen-upload",
+            "version": "dev-trunk",
+            "source": {
+                "type": "svn",
+                "url": "https://svn.unicaen.fr/svn/UnicaenUpload",
+                "reference": "/trunk/@10"
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "rwoverdijk/assetmanager": ">=1.3",
+                "zendframework/zend-i18n": ">=2.2",
+                "zendframework/zend-mvc": ">=2.2",
+                "zendframework/zend-navigation": ">=2.2",
+                "zendframework/zend-servicemanager": ">=2.2",
+                "zendframework/zend-version": ">=2.2",
+                "zendframework/zend-view": ">=2.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": ">=3.7"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "UnicaenUpload\\": "src/"
+                },
+                "classmap": [
+                    "./Module.php"
+                ]
+            },
+            "description": "Module ZF2 facilitant l'upload de fichiers"
+        },
         {
             "name": "zendframework/zend-authentication",
             "version": "2.3.1",
@@ -3177,23 +3209,23 @@
     "packages-dev": [
         {
             "name": "phpunit/php-code-coverage",
-            "version": "1.2.17",
+            "version": "1.2.18",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "6ef2bf3a1c47eca07ea95f0d8a902a6340390b34"
+                "reference": "fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6ef2bf3a1c47eca07ea95f0d8a902a6340390b34",
-                "reference": "6ef2bf3a1c47eca07ea95f0d8a902a6340390b34",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b",
+                "reference": "fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3",
                 "phpunit/php-file-iterator": ">=1.3.0@stable",
                 "phpunit/php-text-template": ">=1.2.0@stable",
-                "phpunit/php-token-stream": ">=1.1.3@stable"
+                "phpunit/php-token-stream": ">=1.1.3,<1.3.0"
             },
             "require-dev": {
                 "phpunit/phpunit": "3.7.*@dev"
@@ -3234,7 +3266,7 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2014-03-28 10:53:45"
+            "time": "2014-09-02 10:13:14"
         },
         {
             "name": "phpunit/php-file-iterator",
@@ -3543,17 +3575,17 @@
         },
         {
             "name": "symfony/yaml",
-            "version": "v2.5.3",
+            "version": "v2.5.4",
             "target-dir": "Symfony/Component/Yaml",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Yaml.git",
-                "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f"
+                "reference": "01a7695bcfb013d0a15c6757e15aae120342986f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f",
-                "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f",
+                "url": "https://api.github.com/repos/symfony/Yaml/zipball/01a7695bcfb013d0a15c6757e15aae120342986f",
+                "reference": "01a7695bcfb013d0a15c6757e15aae120342986f",
                 "shasum": ""
             },
             "require": {
@@ -3586,7 +3618,7 @@
             ],
             "description": "Symfony Yaml Component",
             "homepage": "http://symfony.com",
-            "time": "2014-08-05 09:00:40"
+            "time": "2014-08-31 03:22:04"
         },
         {
             "name": "zendframework/zend-dom",
@@ -3693,7 +3725,8 @@
     "stability-flags": {
         "unicaen/unicaen-app": 20,
         "unicaen/unicaen-auth": 20,
-        "unicaen/unicaen-ldap": 20
+        "unicaen/unicaen-ldap": 20,
+        "unicaen/unicaen-upload": 20
     },
     "prefer-stable": false,
     "platform": [
diff --git a/config/application.config.php b/config/application.config.php
index 525d568e9f..f8a7d556ae 100755
--- a/config/application.config.php
+++ b/config/application.config.php
@@ -7,6 +7,7 @@ $modules = array(
     'UnicaenApp', //'AssetManager',
     'UnicaenAuth',
     'UnicaenLdap',
+    'UnicaenUpload',
     'Common',
     'Import',
     'Application'
diff --git a/module/Application/config/intervenant.config.php b/module/Application/config/intervenant.config.php
index e5ce064d8f..62fc17de86 100644
--- a/module/Application/config/intervenant.config.php
+++ b/module/Application/config/intervenant.config.php
@@ -137,6 +137,19 @@ return array(
                             ),
                         ),
                     ),
+                    'joindre' => array(
+                        'type'    => 'Segment',
+                        'options' => array(
+                            'route'    => '/:intervenant/joindre[/:action]',
+                            'constraints' => array(
+                                'intervenant' => '[0-9]*',
+                            ),
+                            'defaults' => array(
+                                'controller' => 'Dossier',
+                                'action' => 'joindre',
+                            ),
+                        ),
+                    ),
                     'validation-dossier' => array(
                         'type'    => 'Segment',
                         'options' => array(
@@ -351,7 +364,7 @@ return array(
                 ),
                 array(
                     'controller' => 'Application\Controller\Dossier',
-                    'action'     => array('voir', 'modifier', 'pieces-jointes'),
+                    'action'     => array('voir', 'modifier', 'pieces-jointes', 'joindre', 'upload', 'download'),
                     'roles'      => array(IntervenantExterieurRole::ROLE_ID, ComposanteRole::ROLE_ID,'Administrateur'),
                 ),
                 array(
diff --git a/module/Application/src/Application/Controller/AgrementController.php b/module/Application/src/Application/Controller/AgrementController.php
index 80297ede29..20d7b9b2f0 100644
--- a/module/Application/src/Application/Controller/AgrementController.php
+++ b/module/Application/src/Application/Controller/AgrementController.php
@@ -415,6 +415,7 @@ implements ContextProviderAwareInterface,
         
         $this->view = new ViewModel(array(
             'intervenants' => $intervenants,
+            'typeAgrement' => $this->typeAgrement,
             'title'        => $this->title,
             'form'         => $this->formSaisie,
             'role'         => $this->role,
diff --git a/module/Application/src/Application/Controller/DossierController.php b/module/Application/src/Application/Controller/DossierController.php
index 4a9d0082df..15ed5a5dbe 100644
--- a/module/Application/src/Application/Controller/DossierController.php
+++ b/module/Application/src/Application/Controller/DossierController.php
@@ -280,6 +280,92 @@ class DossierController extends AbstractActionController implements ContextProvi
             'role'               => $role,
         ));
     }
+
+    public function joindreAction()
+    {
+        $form     = $this->getFormJoindre();
+
+        $request = $this->getRequest();
+        if ($request->isPost()) {
+            // Make certain to merge the files info!
+            $post = array_merge_recursive(
+                $request->getPost()->toArray(),
+                $request->getFiles()->toArray()
+            );
+            
+            var_dump($post);
+            
+            $form->setData($post);
+            if ($form->isValid()) {
+                $data = $form->getData();var_dump('valid');
+                // Form is valid, save the form!
+                return $this->redirect()->toRoute('upload-form/success');
+            }
+        }
+        
+        $viewModel = new \Zend\View\Model\ViewModel();
+        $viewModel//->setTemplate('closer-module/ligne/joindre')
+                ->setVariables(array(
+                    'form'      => $form,
+                    'terminal'  => $this->getRequest()->isXmlHttpRequest(),
+                    'uploadUrl' => $this->url()->fromRoute(null, ['action' => 'download'], [], true),
+                ));
+
+        return $viewModel;
+    }
+    
+    public function uploadAction()
+    {
+        error_reporting(E_ALL | E_STRICT);
+        $this->uploader()
+//                ->setUploadDir($this->getUploadDir($ligne))
+                ->setUploadUrl($this->getUploadUrl() . '/')
+                ->setDownloadUrl($this->getDownloadUrl())
+                ->handle();
+        exit;
+    }
+    
+    public function downloadAction()
+    {
+        error_reporting(E_ALL | E_STRICT);
+        $this->uploader()
+//                ->setUploadDir($this->getUploadDir($ligne))
+                ->setUploadUrl($this->getUploadUrl() . '/')
+                ->setDownloadUrl($this->getDownloadUrl())
+                ->handle();
+        exit;
+    }
+
+    protected $formJoindre;
+    
+    protected function getFormJoindre()
+    {
+        if (null === $this->formJoindre) {
+            $this->formJoindre = new \Application\Form\Joindre();
+            $this->formJoindre//->setHydrator(HydratorFactory::getHydrator($ligne))
+                    //->bind($ligne)
+                    ->setAttribute('action', $this->url()->fromRoute(null, [], [], true));
+        }
+        return $this->formJoindre;
+    }
+    
+    protected function getDownloadUrl()
+    {
+        return $this->url()->fromRoute(null, ['action' => 'download'], [], true);
+    }
+    
+    protected function getUploadUrl()
+    {
+        return $this->url()->fromRoute(null, ['action' => 'upload'], [], true);
+    }
+    
+//    protected function getUploadDir(Ligne $ligne)
+//    {
+//        $options = $this->getServiceLocator()->get('closer-module_options'); /* @var $options \CloserModule\Options\ModuleOptions */
+//        return sprintf($options->getUploadDir() . '/acteur-%s/ligne-%s/', 
+//                $ligne->getActeur()->getIdInterne(), 
+//                $ligne->getId());
+//    }
     
     /**
      * @return array
diff --git a/module/Application/src/Application/Rule/Intervenant/NecessitePassageConseilRestreintRule.php b/module/Application/src/Application/Rule/Intervenant/NecessitePassageConseilRestreintRule.php
deleted file mode 100644
index 1c354ef223..0000000000
--- a/module/Application/src/Application/Rule/Intervenant/NecessitePassageConseilRestreintRule.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace Application\Rule\Intervenant;
-
-/**
- * Description of NecessitePassageConseilRestreintRule
- *
- * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
- */
-class NecessitePassageConseilRestreintRule extends IntervenantRule
-{
-    public function execute()
-    {
-        $statut = $this->getIntervenant()->getStatut();
-        
-        if (!$statut->estVacataire()) {
-            $this->setMessage("Le passage en Conseil Restreint de la composante n'est requis que pour les vacataires (BIATSS inclus).");
-            return false;
-        }
-
-        $this->setMessage(sprintf("Le statut de l'intervenant (%s) nécessite le passage en Conseil Restreint de la composante.", $statut));
-            
-        return true;
-    }
-    
-    public function isRelevant()
-    {
-        return true;
-    }
-}
diff --git a/module/Application/src/Application/Rule/Intervenant/NecessitePassageConseilRestreintRule_1.php b/module/Application/src/Application/Rule/Intervenant/NecessitePassageConseilRestreintRule_1.php
deleted file mode 100644
index 1c354ef223..0000000000
--- a/module/Application/src/Application/Rule/Intervenant/NecessitePassageConseilRestreintRule_1.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace Application\Rule\Intervenant;
-
-/**
- * Description of NecessitePassageConseilRestreintRule
- *
- * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
- */
-class NecessitePassageConseilRestreintRule extends IntervenantRule
-{
-    public function execute()
-    {
-        $statut = $this->getIntervenant()->getStatut();
-        
-        if (!$statut->estVacataire()) {
-            $this->setMessage("Le passage en Conseil Restreint de la composante n'est requis que pour les vacataires (BIATSS inclus).");
-            return false;
-        }
-
-        $this->setMessage(sprintf("Le statut de l'intervenant (%s) nécessite le passage en Conseil Restreint de la composante.", $statut));
-            
-        return true;
-    }
-    
-    public function isRelevant()
-    {
-        return true;
-    }
-}
diff --git a/module/Application/src/Application/Rule/Intervenant/PeutSaisirModificationServiceDuRule.php b/module/Application/src/Application/Rule/Intervenant/PeutSaisirModificationServiceDuRule.php
index 90544311cc..7e47e229eb 100644
--- a/module/Application/src/Application/Rule/Intervenant/PeutSaisirModificationServiceDuRule.php
+++ b/module/Application/src/Application/Rule/Intervenant/PeutSaisirModificationServiceDuRule.php
@@ -2,6 +2,7 @@
 
 namespace Application\Rule\Intervenant;
 
+use Zend\Permissions\Acl\Role\RoleInterface;
 use Application\Entity\Db\Intervenant;
 use Application\Acl\ComposanteDbRole;
 
@@ -15,10 +16,10 @@ class PeutSaisirModificationServiceDuRule extends IntervenantRule
     /**
      * Constructeur.
      * 
-     * @param Intervenant      $intervenant Intervenant dont on modifie le service dû
-     * @param ComposanteDbRole $role        Role auteur de la modification
+     * @param Intervenant   $intervenant Intervenant dont on modifie le service dû
+     * @param RoleInterface $role        Role auteur de la modification
      */
-    public function __construct(Intervenant $intervenant, ComposanteDbRole $role)
+    public function __construct(Intervenant $intervenant, RoleInterface $role)
     {
         parent::__construct($intervenant);
         $this->role = $role;
@@ -32,10 +33,12 @@ class PeutSaisirModificationServiceDuRule extends IntervenantRule
             return false;
         }
         
-        $estAffecte = new EstAffecteRule($this->getIntervenant(), $this->getRole()->getStructure());
-        if (!$estAffecte->execute()) {
-            $this->setMessage(sprintf("%s %s étant votre structure de responsabilité.", $estAffecte->getMessage(), $this->getRole()->getStructure()));
-            return false;
+        if ($this->getRole() instanceof ComposanteDbRole) {
+            $estAffecte = new EstAffecteRule($this->getIntervenant(), $this->getRole()->getStructure());
+            if (!$estAffecte->execute()) {
+                $this->setMessage(sprintf("%s %s étant votre structure de responsabilité.", $estAffecte->getMessage(), $this->getRole()->getStructure()));
+                return false;
+            }
         }
         
         return true;
@@ -47,11 +50,11 @@ class PeutSaisirModificationServiceDuRule extends IntervenantRule
     }
     
     /**
-     * @var \Application\Acl\ComposanteDbRole
+     * @var RoleInterface
      */
     protected $role;
     /**
-     * @return \Application\Acl\ComposanteDbRole
+     * @return RoleInterface
      */
     public function getRole()
     {
diff --git a/module/Application/src/Application/Service/Workflow/Step/AgrementConseilRestreintStep.php b/module/Application/src/Application/Service/Workflow/Step/AgrementConseilRestreintStep.php
deleted file mode 100644
index b28fe57111..0000000000
--- a/module/Application/src/Application/Service/Workflow/Step/AgrementConseilRestreintStep.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-namespace Application\Service\Workflow\Step;
-
-use Application\Acl\IntervenantPermanentRole;
-use Application\Acl\IntervenantExterieurRole;
-use Application\Acl\ComposanteRole;
-
-/**
- * Description of AgrementConseilRestreintStep
- *
- * @author Bertrand GAUTHIER <bertrand.gauthier at unicaen.fr>
- */
-class AgrementConseilRestreintStep extends Step
-{
-    public function __construct()
-    {
-        $labels = array(
-            IntervenantPermanentRole::ROLE_ID => "Je visualise l'agrément par le Conseil Restreint de chaque composante d'enseignement",
-            IntervenantExterieurRole::ROLE_ID => "Je visualise l'agrément par le Conseil Restreint de chaque composante d'enseignement",
-            ComposanteRole::ROLE_ID           => "Je visualise l'agrément par le Conseil Restreint de chaque composante d'enseignement de l'intervenant",
-        );
-        $descriptions = array(
-            IntervenantPermanentRole::ROLE_ID => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
-            IntervenantExterieurRole::ROLE_ID => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
-            ComposanteRole::ROLE_ID           => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
-        );
-        
-        $this
-                
-                ->setLabels($labels)
-                ->setDescriptions($descriptions)
-                ->setRoute('intervenant/agrement');
-    }
-}
\ No newline at end of file
diff --git a/module/Application/src/Application/Service/Workflow/Step/AgrementStep.php b/module/Application/src/Application/Service/Workflow/Step/AgrementStep.php
index d9bf680767..db5acaab2e 100644
--- a/module/Application/src/Application/Service/Workflow/Step/AgrementStep.php
+++ b/module/Application/src/Application/Service/Workflow/Step/AgrementStep.php
@@ -29,6 +29,7 @@ class AgrementStep extends Step
             IntervenantPermanentRole::ROLE_ID => sprintf("Je visualise l'agrément &laquo; %s &raquo;", $this->typeAgrement),
             IntervenantExterieurRole::ROLE_ID => sprintf("Je visualise l'agrément &laquo; %s &raquo;", $this->typeAgrement),
             ComposanteRole::ROLE_ID           => sprintf("Je visualise l'agrément &laquo; %s &raquo; de l'intervenant", $this->typeAgrement),
+            'default'                         => sprintf("Je visualise l'agrément &laquo; %s &raquo; de l'intervenant", $this->typeAgrement),
         );
         $descriptions = array(
             IntervenantPermanentRole::ROLE_ID => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
diff --git a/module/Application/src/Application/Service/Workflow/Step/EditionContratStep.php b/module/Application/src/Application/Service/Workflow/Step/EditionContratStep.php
index e18c3280e3..bb794a27e6 100644
--- a/module/Application/src/Application/Service/Workflow/Step/EditionContratStep.php
+++ b/module/Application/src/Application/Service/Workflow/Step/EditionContratStep.php
@@ -19,6 +19,7 @@ class EditionContratStep extends Step
             IntervenantPermanentRole::ROLE_ID => "Je visualise mes contrat/avenants",
             IntervenantExterieurRole::ROLE_ID => "Je visualise mes contrat/avenants",
             ComposanteRole::ROLE_ID           => "Je visualise les contrat/avenants de l'intervenant",
+            'default'                         => "Je visualise les contrat/avenants de l'intervenant",
         );
         $descriptions = array(
             IntervenantPermanentRole::ROLE_ID => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
diff --git a/module/Application/src/Application/Service/Workflow/Step/SaisieDossierStep.php b/module/Application/src/Application/Service/Workflow/Step/SaisieDossierStep.php
index e1acd151c4..bba27bcb93 100644
--- a/module/Application/src/Application/Service/Workflow/Step/SaisieDossierStep.php
+++ b/module/Application/src/Application/Service/Workflow/Step/SaisieDossierStep.php
@@ -19,6 +19,7 @@ class SaisieDossierStep extends Step
             IntervenantPermanentRole::ROLE_ID => "Je saisis mes données personnelles",
             IntervenantExterieurRole::ROLE_ID => "Je saisis mes données personnelles",
             ComposanteRole::ROLE_ID           => "J'accède aux données personnelles de l'intervenant",
+            'default'                         => "J'accède aux données personnelles de l'intervenant",
         );
         $descriptions = array(
             IntervenantPermanentRole::ROLE_ID => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
diff --git a/module/Application/src/Application/Service/Workflow/Step/SaisiePiecesJointesStep.php b/module/Application/src/Application/Service/Workflow/Step/SaisiePiecesJointesStep.php
index fbb9c50068..c5ea993303 100644
--- a/module/Application/src/Application/Service/Workflow/Step/SaisiePiecesJointesStep.php
+++ b/module/Application/src/Application/Service/Workflow/Step/SaisiePiecesJointesStep.php
@@ -18,7 +18,8 @@ class SaisiePiecesJointesStep extends Step
         $labels = array(
             IntervenantPermanentRole::ROLE_ID => "Je visualise la liste des pièces justificatives à fournir",
             IntervenantExterieurRole::ROLE_ID => "Je visualise la liste des pièces justificatives à fournir",
-            ComposanteRole::ROLE_ID           => "Liste des pièces justificatives à fournir",
+            ComposanteRole::ROLE_ID           => "Liste des pièces justificatives à fournir par l'intervenant",
+            'default'                         => "Liste des pièces justificatives à fournir par l'intervenant",
         );
         $descriptions = array(
             IntervenantPermanentRole::ROLE_ID => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
diff --git a/module/Application/src/Application/Service/Workflow/Step/SaisieServiceStep.php b/module/Application/src/Application/Service/Workflow/Step/SaisieServiceStep.php
index 134d666592..e7a4b5b57b 100644
--- a/module/Application/src/Application/Service/Workflow/Step/SaisieServiceStep.php
+++ b/module/Application/src/Application/Service/Workflow/Step/SaisieServiceStep.php
@@ -19,6 +19,7 @@ class SaisieServiceStep extends Step
             IntervenantPermanentRole::ROLE_ID => "Je saisis mes services prévisionnels",
             IntervenantExterieurRole::ROLE_ID => "Je saisis mes enseignements",
             ComposanteRole::ROLE_ID           => "J'accède aux services prévisionnels de l'intervenant",
+            'default'                         => "J'accède aux services prévisionnels de l'intervenant",
         );
         $descriptions = array(
             IntervenantPermanentRole::ROLE_ID => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
diff --git a/module/Application/src/Application/Service/Workflow/Step/Step.php b/module/Application/src/Application/Service/Workflow/Step/Step.php
index 5e8368d4b8..9255bf0a8c 100644
--- a/module/Application/src/Application/Service/Workflow/Step/Step.php
+++ b/module/Application/src/Application/Service/Workflow/Step/Step.php
@@ -47,7 +47,10 @@ abstract class Step
             $roleId = \Application\Acl\ComposanteRole::ROLE_ID;
         }
         if (!isset($this->labels[$roleId])) {
-            throw new \Common\Exception\LogicException("Label not set for role '$roleId'!");
+            if (!isset($this->labels['default'])) {
+                throw new \Common\Exception\LogicException("Aucun label par défaut n'a été spécifié pour l'étape '" . get_class() . "'.");
+            }
+            return $this->labels['default'];
         }
         return $this->labels[$roleId];
     }
@@ -86,7 +89,8 @@ EOS;
             $roleId = \Application\Acl\ComposanteRole::ROLE_ID;
         }
         if (!isset($this->descriptions[$roleId])) {
-            throw new \Common\Exception\LogicException("Label not set for role '$roleId'!");
+//            throw new \Common\Exception\LogicException("Description not set for role '$roleId'!");
+            return "";
         }
         return $this->descriptions[$roleId];
     }
diff --git a/module/Application/src/Application/Service/Workflow/Step/ValidationDossierStep.php b/module/Application/src/Application/Service/Workflow/Step/ValidationDossierStep.php
index f460c3e007..a9e65f4508 100644
--- a/module/Application/src/Application/Service/Workflow/Step/ValidationDossierStep.php
+++ b/module/Application/src/Application/Service/Workflow/Step/ValidationDossierStep.php
@@ -19,6 +19,7 @@ class ValidationDossierStep extends Step
             IntervenantPermanentRole::ROLE_ID => "Je visualise la validation de mes données personnelles par la composante",
             IntervenantExterieurRole::ROLE_ID => "Je visualise la validation de mes données personnelles par la composante",
             ComposanteRole::ROLE_ID           => "Je visualise la validation des données personnelles de l'intervenant",
+            'default'                         => "Je visualise la validation des données personnelles de l'intervenant",
         );
         $descriptions = array(
             IntervenantPermanentRole::ROLE_ID => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
diff --git a/module/Application/src/Application/Service/Workflow/Step/ValidationServiceStep.php b/module/Application/src/Application/Service/Workflow/Step/ValidationServiceStep.php
index a774c7989d..b0deb4a0d1 100644
--- a/module/Application/src/Application/Service/Workflow/Step/ValidationServiceStep.php
+++ b/module/Application/src/Application/Service/Workflow/Step/ValidationServiceStep.php
@@ -19,6 +19,7 @@ class ValidationServiceStep extends Step
             IntervenantPermanentRole::ROLE_ID => "Je visualise la validation de mes services par la composante",
             IntervenantExterieurRole::ROLE_ID => "Je visualise la validation de mes enseignements par la composante",
             ComposanteRole::ROLE_ID           => "Je visualise la validation des services de l'intervenant",
+            'default'                         => "Je visualise la validation des services de l'intervenant",
         );
         $descriptions = array(
             IntervenantPermanentRole::ROLE_ID => "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis sed sem libero. Nam urna magna, fringilla et blandit aliquam, condimentum a velit. Vivamus sollicitudin blandit augue ut dapibus. Vivamus faucibus quis massa id tempus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis auctor suscipit mauris, in suscipit quam lacinia ut. Nam ac mollis enim, quis tincidunt sem.",
diff --git a/module/Application/view/application/agrement/ajouter-lot.phtml b/module/Application/view/application/agrement/ajouter-lot.phtml
index 919a6088d0..a7431628bf 100644
--- a/module/Application/view/application/agrement/ajouter-lot.phtml
+++ b/module/Application/view/application/agrement/ajouter-lot.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append("Agrément $typeAgrement par lots") ?>
+
 <h1 class="page-header"><?php echo $this->title ?></h1>
 
 <?php echo $this->messenger(true)->addMessages($messages) ?>
diff --git a/module/Application/view/application/agrement/index.phtml b/module/Application/view/application/agrement/index.phtml
index 517837eac6..0be60894f4 100644
--- a/module/Application/view/application/agrement/index.phtml
+++ b/module/Application/view/application/agrement/index.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append("Agrément") ?>
+
 <h1 class="page-header"><?php echo $title ?></h1>
 
 Sélectionnez dans le menu de gauche le type d'agrément qui vous intéresse...
\ No newline at end of file
diff --git a/module/Application/view/application/agrement/lister.phtml b/module/Application/view/application/agrement/lister.phtml
index 32eb303ef3..81c955a862 100644
--- a/module/Application/view/application/agrement/lister.phtml
+++ b/module/Application/view/application/agrement/lister.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append($intervenant->getNomUsuel())->append("Agrément $typeAgrement") ?>
+
 <h1 class="page-header"><?php echo $title ?></h1>
 
 <?php echo $this->messenger(true)->addMessages($messages) ?>
diff --git a/module/Application/view/application/contrat/creer.phtml b/module/Application/view/application/contrat/creer.phtml
index a8a590a12d..9c6954ba4e 100644
--- a/module/Application/view/application/contrat/creer.phtml
+++ b/module/Application/view/application/contrat/creer.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append($intervenant->getNomUsuel())->append("Contrat/avenant") ?>
+
 <h1 class="page-header"><?php echo $title ?></h1>
 
 <?php echo $this->messenger(true)->addMessages($messages) ?>
diff --git a/module/Application/view/application/contrat/index.phtml b/module/Application/view/application/contrat/index.phtml
deleted file mode 100644
index 8e7dbb2406..0000000000
--- a/module/Application/view/application/contrat/index.phtml
+++ /dev/null
@@ -1 +0,0 @@
-<h2 class="page-header">Contrat</small></h2>
\ No newline at end of file
diff --git a/module/Application/view/application/dossier/modifier.phtml b/module/Application/view/application/dossier/modifier.phtml
index ee22d197b1..b465590a8a 100644
--- a/module/Application/view/application/dossier/modifier.phtml
+++ b/module/Application/view/application/dossier/modifier.phtml
@@ -1,4 +1,6 @@
-<h2 class="page-header">Données personnelles <small><?php echo $intervenant ?></small></h2>
+<?php $this->headTitle()->append($intervenant->getNomUsuel())->append("Données personnelles") ?>
+
+<h1 class="page-header">Données personnelles <small><?php echo $intervenant ?></small></h1>
 
 <?php
 if ($validation) {
diff --git a/module/Application/view/application/dossier/pieces-jointes.phtml b/module/Application/view/application/dossier/pieces-jointes.phtml
index c7132e7a65..94870b70e6 100644
--- a/module/Application/view/application/dossier/pieces-jointes.phtml
+++ b/module/Application/view/application/dossier/pieces-jointes.phtml
@@ -1,4 +1,6 @@
-<h2 class="page-header"><?php echo $title ?></h2>
+<?php $this->headTitle()->append($intervenant->getNomUsuel())->append("Pièces justificatives") ?>
+
+<h1 class="page-header"><?php echo $title ?></h1>
 
 <?php
 $messenger = $this->messenger(true);
diff --git a/module/Application/view/application/index/gestion.phtml b/module/Application/view/application/index/gestion.phtml
index 0c3044cfeb..acb9da6fb4 100755
--- a/module/Application/view/application/index/gestion.phtml
+++ b/module/Application/view/application/index/gestion.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append("Gestion") ?>
+
 <h1 class="page-header"><?php echo $title ?></h1>
 
 Sélectionnez dans le menu de gauche l'opération qui vous intéresse...
\ No newline at end of file
diff --git a/module/Application/view/application/index/index.phtml b/module/Application/view/application/index/index.phtml
index 67298ba202..bc468b59e5 100755
--- a/module/Application/view/application/index/index.phtml
+++ b/module/Application/view/application/index/index.phtml
@@ -1,4 +1,7 @@
+<?php $this->headTitle("Accueil") ?>
+
 <?php echo $this->messenger(true) ?>
+
 <div class="jumbotron">
     <h1>OSE <small>Organisation des Services d'Enseignement</small></h1>
     <p class="lead">Bienvenue dans l'application de saisie des enseignements de l'université de Caen.</p>
diff --git a/module/Application/view/application/intervenant/choisir.phtml b/module/Application/view/application/intervenant/choisir.phtml
index 5b0f64fd3f..4c033a0dc5 100644
--- a/module/Application/view/application/intervenant/choisir.phtml
+++ b/module/Application/view/application/intervenant/choisir.phtml
@@ -1,4 +1,6 @@
-<h2><?php echo $this->title ?></h2>
+<?php $this->headTitle($this->title) ?>
+
+<h1 class="page-header"><?php echo $this->title ?></h1>
 
 <?php echo $this->messenger(true) ?>
 
diff --git a/module/Application/view/application/intervenant/voir.phtml b/module/Application/view/application/intervenant/voir.phtml
index a7c0c95a38..bd431d2cf0 100644
--- a/module/Application/view/application/intervenant/voir.phtml
+++ b/module/Application/view/application/intervenant/voir.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append($intervenant->getNomUsuel())->append("Fiche") ?>
+
 <h1 class="page-header"><?php echo $intervenant ?> <small><?php echo $intervenant->getType() ?></small></h1>
 
 <?php echo $this->intervenantDl($intervenant, true) ?>
diff --git a/module/Application/view/application/modification-service-du/saisir.phtml b/module/Application/view/application/modification-service-du/saisir.phtml
index 56a6430494..fd15572b92 100644
--- a/module/Application/view/application/modification-service-du/saisir.phtml
+++ b/module/Application/view/application/modification-service-du/saisir.phtml
@@ -1,4 +1,6 @@
-<h1><?php echo $title ?></h1>
+<?php $this->headTitle()->append($intervenant->getNomUsuel())->append("Modification de service dû") ?>
+
+<h1 class="page-header"><?php echo $title ?></h1>
 
 <?php echo $this->messenger(true) ?>
 
diff --git a/module/Application/view/application/offre-formation/index.phtml b/module/Application/view/application/offre-formation/index.phtml
index 17e98d45ef..6aed83ea88 100755
--- a/module/Application/view/application/offre-formation/index.phtml
+++ b/module/Application/view/application/offre-formation/index.phtml
@@ -24,6 +24,8 @@ $mc->setUlClass('navigation navigation-etape pull-right');
     div.element-rech div.panel-body input.form-control { width: 75% }
 </style>
 
+<?php $this->headTitle()->append((string)$structure)->append("Offre de formation") ?>
+
 <h1 class="page-header">Offre de formation <?php echo $structure ? '<small>' . $structure . '</small>' : null ?></h1>
 
 <div class="row">
diff --git a/module/Application/view/application/service/index.phtml b/module/Application/view/application/service/index.phtml
index 026bdfbe30..dd1a20af86 100644
--- a/module/Application/view/application/service/index.phtml
+++ b/module/Application/view/application/service/index.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append($intervenant->getNomUsuel())->append("Enseignements") ?>
+
 <h1 class="page-header"><?php echo $title; ?></h1>
 
 <?php echo $this->messenger(true) ?>
diff --git a/module/Application/view/application/service/resume.phtml b/module/Application/view/application/service/resume.phtml
index 55244271cb..aa825d3200 100644
--- a/module/Application/view/application/service/resume.phtml
+++ b/module/Application/view/application/service/resume.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append("Enseignements $annee") ?>
+
 <h1 class="page-header">Enseignements <small>Année universitaire <?php echo $annee; ?></small></h1>
 
 <?php
diff --git a/module/Application/view/application/validation/dossier.phtml b/module/Application/view/application/validation/dossier.phtml
index e4b2dbdf45..01b5b8c10d 100755
--- a/module/Application/view/application/validation/dossier.phtml
+++ b/module/Application/view/application/validation/dossier.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append($intervenant->getNomUsuel())->append("Validation des données personnelles") ?>
+
 <h1 class="page-header"><?php echo $title ?></h1>
 
 <?php
diff --git a/module/Application/view/application/validation/service.phtml b/module/Application/view/application/validation/service.phtml
index 94769d3436..671d9045df 100755
--- a/module/Application/view/application/validation/service.phtml
+++ b/module/Application/view/application/validation/service.phtml
@@ -1,3 +1,5 @@
+<?php $this->headTitle()->append($intervenant->getNomUsuel())->append("Validation des enseignements") ?>
+
 <h1 class="page-header"><?php echo $title ?></small></h1>
 
 <?php echo $this->messenger(true)->addMessages($messages) ?>
-- 
GitLab