From 81c543274c88b4b6605aadf5bd24de8ca8ba58b4 Mon Sep 17 00:00:00 2001
From: lecluse <lecluse@d57fa8bc-6af1-4de9-8b7d-78e900e231e7>
Date: Fri, 3 Nov 2017 13:27:27 +0000
Subject: [PATCH] #10705
---
code/test6.php | 15 ++-
.../config/offre-formation.config.php | 33 +++++-
.../config/type-intervention.config.php | 5 +
.../config/volume-horaire.config.php | 19 ++--
.../Assertion/OffreDeFormationAssertion.php | 53 +++++++++
.../ElementPedagogiqueController.php | 77 ++++++++++++-
.../OffreFormation/EtapeController.php | 2 +-
.../ElementPedagogiqueControllerFactory.php | 36 ++++++
.../Entity/Db/ElementPedagogique.php | 65 +++++++++++
...ation.Entity.Db.ElementPedagogique.dcm.xml | 5 +
...ication.Entity.Db.VolumeHoraireEns.dcm.xml | 1 +
.../Entity/Db/TypeIntervention.php | 15 ++-
.../Entity/Db/VolumeHoraireEns.php | 55 +++++++--
.../Application/Filter/FloatFromString.php | 4 +-
.../Factory/VolumeHoraireEnsFormFactory.php | 32 ++++++
.../Traits/VolumeHoraireEnsFormAwareTrait.php | 46 ++++++++
.../OffreFormation/VolumeHoraireEnsForm.php | 89 +++++++++++++++
.../Provider/Privilege/Privileges.php | 5 +
.../VolumeHoraireEnsServiceAwareTrait.php | 59 ++++++++++
.../Service/VolumeHoraireEnsService.php | 105 ++++++++++++++++++
.../view/application/intervenant/fiche.phtml | 2 -
.../element-pedagogique/voir.phtml | 22 +++-
.../element-pedagogique/volume-horaire.phtml | 60 ++++++++++
.../offre-formation/etape/voir.phtml | 7 --
24 files changed, 768 insertions(+), 44 deletions(-)
create mode 100644 module/Application/src/Application/Controller/OffreFormation/Factory/ElementPedagogiqueControllerFactory.php
create mode 100755 module/Application/src/Application/Form/OffreFormation/Factory/VolumeHoraireEnsFormFactory.php
create mode 100755 module/Application/src/Application/Form/OffreFormation/Traits/VolumeHoraireEnsFormAwareTrait.php
create mode 100755 module/Application/src/Application/Form/OffreFormation/VolumeHoraireEnsForm.php
create mode 100644 module/Application/src/Application/Service/Traits/VolumeHoraireEnsServiceAwareTrait.php
create mode 100644 module/Application/src/Application/Service/VolumeHoraireEnsService.php
create mode 100644 module/Application/view/application/offre-formation/element-pedagogique/volume-horaire.phtml
diff --git a/code/test6.php b/code/test6.php
index 4969b3b721..93a0c5bfeb 100644
--- a/code/test6.php
+++ b/code/test6.php
@@ -23,14 +23,13 @@ $sep->forcerTauxMixite($ep, 0.5, 0.5,0);
//var_dump($ep);
+$epid = 45788;
+/* @var \Application\Entity\Db\ElementPedagogique $ep */
+$ep = $sl->get('applicationElementPedagogique')->get($epid);
-$fn = '/home/laurent/test/test.txt';
-$data = 'salut';
+$tis = $ep->getTypesInterventionPossibles();
-mkdir( dirname($fn));
-chmod( dirname($fn), 0777);
-$r = file_put_contents($fn, $data);
-chmod($fn, 0777);
-
-var_dump(realpath($fn));
\ No newline at end of file
+foreach( $tis as $ti ){
+ var_dump($ti->getCode());
+}
\ No newline at end of file
diff --git a/module/Application/config/offre-formation.config.php b/module/Application/config/offre-formation.config.php
index 549305266b..0225b67ec4 100644
--- a/module/Application/config/offre-formation.config.php
+++ b/module/Application/config/offre-formation.config.php
@@ -91,6 +91,18 @@ return [
'defaults' => ['action' => 'getPeriode'],
],
],
+ 'volume-horaire' => [
+ 'type' => 'Segment',
+ 'options' => [
+ 'route' => '/volume-horaire/:elementPedagogique',
+ 'constraints' => [
+ 'elementPedagogique' => '[0-9]*',
+ ],
+ 'defaults' => [
+ 'action' => 'volume-horaire',
+ ],
+ ],
+ ],
],
],
'etape' => [
@@ -231,6 +243,14 @@ return [
Privileges::ODF_ELEMENT_VISUALISATION,
Privileges::ENSEIGNEMENT_EDITION,
],
+ ],
+ [
+ 'controller' => 'Application\Controller\OffreFormation\ElementPedagogique',
+ 'action' => ['volume-horaire'],
+ 'privileges' => [
+ Privileges::ODF_ELEMENT_VH_VISUALISATION,
+ Privileges::ODF_ELEMENT_VH_EDITION,
+ ],
],
[
@@ -264,6 +284,7 @@ return [
'Etape' => [],
'CentreCoutEp' => [],
'ElementModulateur' => [],
+ 'VolumeHoraireEns' => [],
],
],
'rule_providers' => [
@@ -294,6 +315,11 @@ return [
'resources' => ['Etape', 'Structure', 'ElementPedagogique'],
'assertion' => 'AssertionOffreDeFormation',
],
+ [
+ 'privileges' => Privileges::ODF_ELEMENT_VH_EDITION,
+ 'resources' => ['Etape', 'Structure', 'ElementPedagogique','VolumeHoraireEns','TypeIntervention'],
+ 'assertion' => 'AssertionOffreDeFormation',
+ ],
],
],
],
@@ -303,9 +329,11 @@ return [
'Application\Controller\OffreFormation' => Controller\OffreFormationController::class,
'Application\Controller\OffreFormation\Etape' => Controller\OffreFormation\EtapeController::class,
'Application\Controller\OffreFormation\Modulateur' => Controller\OffreFormation\ModulateurController::class,
- 'Application\Controller\OffreFormation\ElementPedagogique' => Controller\OffreFormation\ElementPedagogiqueController::class,
'Application\Controller\OffreFormation\EtapeCentreCout' => Controller\OffreFormation\EtapeCentreCoutController::class,
],
+ 'factories' => [
+ 'Application\Controller\OffreFormation\ElementPedagogique' => Controller\OffreFormation\Factory\ElementPedagogiqueControllerFactory::class,
+ ],
],
'service_manager' => [
'invokables' => [
@@ -335,6 +363,9 @@ return [
Form\OffreFormation\TauxMixite\TauxMixiteForm::class => Form\OffreFormation\TauxMixite\TauxMixiteForm::class,
Form\OffreFormation\TauxMixite\TauxMixiteFieldset::class => Form\OffreFormation\TauxMixite\TauxMixiteFieldset::class,
],
+ 'factories' => [
+ Form\OffreFormation\VolumeHoraireEns::class => Form\OffreFormation\Factory\VolumeHoraireEnsFormFactory::class,
+ ],
],
'view_helpers' => [
'invokables' => [
diff --git a/module/Application/config/type-intervention.config.php b/module/Application/config/type-intervention.config.php
index 17d7eebdf6..6e8f90bba0 100644
--- a/module/Application/config/type-intervention.config.php
+++ b/module/Application/config/type-intervention.config.php
@@ -111,6 +111,11 @@ return [
],
],
'bjyauthorize' => [
+ 'resource_providers' => [
+ 'BjyAuthorize\Provider\Resource\Config' => [
+ 'TypeIntervention' => [],
+ ],
+ ],
'guards' => [
PrivilegeController::class => [
[
diff --git a/module/Application/config/volume-horaire.config.php b/module/Application/config/volume-horaire.config.php
index 30289b7446..5f0a30db1b 100644
--- a/module/Application/config/volume-horaire.config.php
+++ b/module/Application/config/volume-horaire.config.php
@@ -8,7 +8,7 @@ use UnicaenAuth\Guard\PrivilegeController;
return [
'router' => [
'routes' => [
- 'volume-horaire' => [
+ 'volume-horaire' => [
'type' => 'Literal',
'options' => [
'route' => '/volume-horaire',
@@ -68,26 +68,27 @@ return [
],
'controllers' => [
'invokables' => [
- 'Application\Controller\VolumeHoraire' => Controller\VolumeHoraireController::class,
+ 'Application\Controller\VolumeHoraire' => Controller\VolumeHoraireController::class,
],
],
'service_manager' => [
'invokables' => [
- 'ApplicationVolumeHoraire' => Service\VolumeHoraire::class,
- 'ApplicationVolumeHoraireReferentiel' => Service\VolumeHoraireReferentiel::class,
- 'ApplicationTypeVolumeHoraire' => Service\TypeVolumeHoraire::class,
- 'ApplicationEtatVolumeHoraire' => Service\EtatVolumeHoraire::class,
+ 'ApplicationVolumeHoraire' => Service\VolumeHoraire::class,
+ 'ApplicationVolumeHoraireEns' => Service\VolumeHoraireEnsService::class,
+ 'ApplicationVolumeHoraireReferentiel' => Service\VolumeHoraireReferentiel::class,
+ 'ApplicationTypeVolumeHoraire' => Service\TypeVolumeHoraire::class,
+ 'ApplicationEtatVolumeHoraire' => Service\EtatVolumeHoraire::class,
],
],
'view_helpers' => [
'invokables' => [
- 'volumeHoraireListe' => View\Helper\VolumeHoraire\Liste::class,
+ 'volumeHoraireListe' => View\Helper\VolumeHoraire\Liste::class,
],
],
'form_elements' => [
'invokables' => [
- 'VolumeHoraireSaisie' => Form\VolumeHoraire\Saisie::class,
- 'VolumeHoraireSaisieMultipleFieldset' => Form\VolumeHoraire\SaisieMultipleFieldset::class, // Nécessite plusieurs instances
+ 'VolumeHoraireSaisie' => Form\VolumeHoraire\Saisie::class,
+ 'VolumeHoraireSaisieMultipleFieldset' => Form\VolumeHoraire\SaisieMultipleFieldset::class, // Nécessite plusieurs instances
],
],
];
diff --git a/module/Application/src/Application/Assertion/OffreDeFormationAssertion.php b/module/Application/src/Application/Assertion/OffreDeFormationAssertion.php
index c1d03e198e..0aa5f11d2b 100644
--- a/module/Application/src/Application/Assertion/OffreDeFormationAssertion.php
+++ b/module/Application/src/Application/Assertion/OffreDeFormationAssertion.php
@@ -2,6 +2,8 @@
namespace Application\Assertion;
+use Application\Entity\Db\TypeIntervention;
+use Application\Entity\Db\VolumeHoraireEns;
use Application\Provider\Privilege\Privileges;
use Application\Entity\Db\CentreCoutEp;
use Application\Entity\Db\ElementModulateur;
@@ -41,6 +43,8 @@ class OffreDeFormationAssertion extends AbstractAssertion
return $this->assertElementPedagogiqueSaisieModulateurs($role, $entity);
case Privileges::ODF_TAUX_MIXITE_EDITION:
return $this->assertElementPedagogiqueSaisieTauxMixite($role, $entity);
+ case Privileges::ODF_ELEMENT_VH_EDITION:
+ return $this->assertElementPedagogiqueSaisieVH($role, $entity);
}
break;
case $entity instanceof Etape:
@@ -53,6 +57,8 @@ class OffreDeFormationAssertion extends AbstractAssertion
return $this->assertEtapeSaisieModulateurs($role, $entity);
case Privileges::ODF_TAUX_MIXITE_EDITION:
return $this->assertEtapeSaisieTauxMixite($role, $entity);
+ case Privileges::ODF_ELEMENT_VH_EDITION:
+ return $this->assertEtapeSaisieVH($role, $entity);
}
break;
case $entity instanceof Structure:
@@ -62,6 +68,7 @@ class OffreDeFormationAssertion extends AbstractAssertion
case Privileges::ODF_CENTRES_COUT_EDITION:
case Privileges::ODF_MODULATEURS_EDITION:
case Privileges::ODF_TAUX_MIXITE_EDITION:
+ case Privileges::ODF_ELEMENT_VH_EDITION:
return $this->assertStructureSaisie($role, $entity);
}
break;
@@ -77,6 +84,18 @@ class OffreDeFormationAssertion extends AbstractAssertion
return $this->assertElementModulateurSaisieModulateurs($role, $entity);
}
break;
+ case $entity instanceof VolumeHoraireEns:
+ switch ($privilege) {
+ case Privileges::ODF_ELEMENT_VH_EDITION:
+ return $this->assertVolumeHoraireEnsSaisieVH($role, $entity);
+ }
+ break;
+ case $entity instanceof TypeIntervention:
+ switch ($privilege) {
+ case Privileges::ODF_ELEMENT_VH_EDITION:
+ return $this->assertTypeInterventionSaisieVH($role, $entity);
+ }
+ break;
}
return true;
@@ -150,6 +169,40 @@ class OffreDeFormationAssertion extends AbstractAssertion
+ /* ---- Volumes horaires d'enseigneement ---- */
+ protected function assertEtapeSaisieVH(Role $role, Etape $etape)
+ {
+ return $this->assertStructureSaisie($role, $etape->getStructure())
+ && $etape->getElementPedagogique()->count() > 0;
+ }
+
+
+
+ protected function assertElementPedagogiqueSaisieVH(Role $role, ElementPedagogique $elementPedagogique)
+ {
+ return $this->assertStructureSaisie($role, $elementPedagogique->getStructure());
+ }
+
+
+
+ protected function assertTypeInterventionSaisieVH(Role $role, TypeIntervention $typeIntervention)
+ {
+ return true;
+ }
+
+
+
+ protected function assertVolumeHoraireEnsSaisieVH(Role $role, VolumeHoraireEns $volumeHoraireEns)
+ {
+ return $this->asserts([
+ $volumeHoraireEns->getSource() ? $this->assertSourceSaisie($volumeHoraireEns->getSource()) : true,
+ $volumeHoraireEns->getElementPedagogique() ? $this->assertElementPedagogiqueSaisieVH($role, $volumeHoraireEns->getElementPedagogique()) : true,
+ $volumeHoraireEns->getTypeIntervention() ? $this->assertTypeInterventionSaisieVH($role, $volumeHoraireEns->getTypeIntervention()) : true,
+ ]);
+ }
+
+
+
/* ---- Modulateurs ---- */
protected function assertEtapeSaisieModulateurs(Role $role, Etape $etape)
{
diff --git a/module/Application/src/Application/Controller/OffreFormation/ElementPedagogiqueController.php b/module/Application/src/Application/Controller/OffreFormation/ElementPedagogiqueController.php
index 94e208cb02..56945f9426 100644
--- a/module/Application/src/Application/Controller/OffreFormation/ElementPedagogiqueController.php
+++ b/module/Application/src/Application/Controller/OffreFormation/ElementPedagogiqueController.php
@@ -3,10 +3,17 @@
namespace Application\Controller\OffreFormation;
use Application\Controller\AbstractController;
+use Application\Entity\Db\ElementPedagogique;
+use Application\Entity\Db\VolumeHoraireEns;
+use Application\Filter\FloatFromString;
use Application\Form\OffreFormation\Traits\ElementPedagogiqueSaisieAwareTrait;
use Application\Exception\DbException;
+use Application\Form\OffreFormation\Traits\VolumeHoraireEnsFormAwareTrait;
+use Application\Provider\Privilege\Privileges;
use Application\Service\Traits\ElementPedagogiqueAwareTrait;
use Application\Service\Traits\ContextAwareTrait;
+use Application\Service\Traits\VolumeHoraireEnsServiceAwareTrait;
+
/**
* Description of ElementPedagogiqueController
@@ -18,6 +25,8 @@ class ElementPedagogiqueController extends AbstractController
use ElementPedagogiqueAwareTrait;
use ContextAwareTrait;
use ElementPedagogiqueSaisieAwareTrait;
+ use VolumeHoraireEnsFormAwareTrait;
+ use VolumeHoraireEnsServiceAwareTrait;
@@ -28,7 +37,7 @@ class ElementPedagogiqueController extends AbstractController
\Application\Entity\Db\VolumeHoraire::class,
]);
$element = $this->getEvent()->getParam('elementPedagogique');
- $title = "Enseignement";
+ $title = $element->getLibelle() . ' (' . $element->getCode() . ')';
return compact('element', 'title');
}
@@ -75,8 +84,8 @@ class ElementPedagogiqueController extends AbstractController
throw new \RuntimeException('L\'identifiant n\'est pas bon ou n\'a pas été fourni');
}
- $title = "Suppression d'enseignement";
- $form = $this->makeFormSupprimer(function()use($element){
+ $title = "Suppression d'enseignement";
+ $form = $this->makeFormSupprimer(function () use ($element) {
$this->getServiceElementPedagogique()->delete($element);
});
@@ -143,7 +152,7 @@ class ElementPedagogiqueController extends AbstractController
if (!$etape) {
$extra .= sprintf('<span class="element-rech etape" title="%s">%s</span>', "Formation", $item['LIBELLE_ETAPE']);
}
- $extra .= "Année" !== $item['LIBELLE_PE'] ? sprintf('<span class="element-rech periode" title="%s">%s</span>', "Période", $item['LIBELLE_PE']) : null;
+ $extra .= "Année" !== $item['LIBELLE_PE'] ? sprintf('<span class="element-rech periode" title="%s">%s</span>', "Période", $item['LIBELLE_PE']) : null;
$template = sprintf('<span class="element-rech extra">{extra}</span><span class="element-rech element" title="%s">{label}</span>', "Enseignement");
$result[$item['ID']] = [
'id' => $item['ID'],
@@ -174,4 +183,64 @@ class ElementPedagogiqueController extends AbstractController
return new \Zend\View\Model\JsonModel($result);
}
+
+
+ public function volumeHoraireAction()
+ {
+ $this->em()->getFilters()->enable('historique')->init([
+ \Application\Entity\Db\VolumeHoraireEns::class,
+ ]);
+
+ $title = 'Volumes horaires';
+
+ /** @var ElementPedagogique $element */
+ $element = $this->getEvent()->getParam('elementPedagogique');
+
+ $ev = $element->getVolumeHoraireEns();
+ $existsVhes = [];
+ foreach ($ev as $vhe) {
+ $existsVhes[$vhe->getTypeIntervention()->getId()] = $vhe;
+ }
+
+ $saisie = $this->params()->fromPost('vhes');
+
+ $tis = $element->getTypesInterventionPossibles();
+ foreach ($tis as $typeIntervention) {
+ if (!isset($existsVhes[$typeIntervention->getId()])) {
+ $vhe = $this->getServiceVolumeHoraireEns()->newEntity($element, $typeIntervention);
+ } else {
+ $vhe = $existsVhes[$typeIntervention->getId()];
+ }
+
+ if ($this->isAllowed($vhe, Privileges::ODF_ELEMENT_VH_EDITION)) {
+ if (isset($saisie[$vhe->getTypeIntervention()->getId()]['heures'])) {
+ $heures = FloatFromString::run($saisie[$vhe->getTypeIntervention()->getId()]['heures']);
+ } else {
+ $heures = null;
+ }
+ if (isset($saisie[$vhe->getTypeIntervention()->getId()]['groupes'])) {
+ $groupes = FloatFromString::run($saisie[$vhe->getTypeIntervention()->getId()]['groupes']);
+ } else {
+ $groupes = null;
+ }
+ try {
+ $this->getServiceVolumeHoraireEns()->changeHeuresGroupes($vhe, $heures, $groupes);
+ } catch (\Exception $e) {
+ $this->flashMessenger()->addErrorMessage(DbException::translate($e)->getMessage());
+ }
+ }
+
+ if (!$vhe->estNonHistorise()){
+ $vhe = $this->getServiceVolumeHoraireEns()->newEntity($element, $typeIntervention);
+ }
+
+ $vhes[$typeIntervention->getId()] = $vhe;
+ }
+
+ $form = $this->getFormOffreFormationVolumeHoraireEns();
+ $form->setAttribute('action', $this->url()->fromRoute('of/element/volume-horaire', ['elementPedagogique' => $element->getId()]));
+ $form->build($vhes);
+
+ return compact('title', 'vhes', 'form');
+ }
}
diff --git a/module/Application/src/Application/Controller/OffreFormation/EtapeController.php b/module/Application/src/Application/Controller/OffreFormation/EtapeController.php
index 55e0df4013..6d5b52c5c2 100644
--- a/module/Application/src/Application/Controller/OffreFormation/EtapeController.php
+++ b/module/Application/src/Application/Controller/OffreFormation/EtapeController.php
@@ -95,7 +95,7 @@ class EtapeController extends AbstractController
ElementPedagogique::class,
]);
$etape = $this->getEvent()->getParam('etape');
- $title = 'Formation';
+ $title = $etape.' ('.$etape->getCode().')';
$serviceEtape = $this->getServiceEtape();
return compact('etape', 'title', 'serviceEtape');
diff --git a/module/Application/src/Application/Controller/OffreFormation/Factory/ElementPedagogiqueControllerFactory.php b/module/Application/src/Application/Controller/OffreFormation/Factory/ElementPedagogiqueControllerFactory.php
new file mode 100644
index 0000000000..4c64bf96ba
--- /dev/null
+++ b/module/Application/src/Application/Controller/OffreFormation/Factory/ElementPedagogiqueControllerFactory.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Application\Controller\OffreFormation\Factory;
+
+use Application\Form\OffreFormation\VolumeHoraireEnsForm;
+use Zend\Mvc\Controller\ControllerManager as ContainerInterface;
+use Application\Controller\OffreFormation\ElementPedagogiqueController;
+
+
+
+/**
+ * Description of ElementPedagogiqueControllerFactory
+ *
+ * @author LECLUSE Laurent <laurent.lecluse at unicaen.fr>
+ */
+class ElementPedagogiqueControllerFactory
+{
+
+ /**
+ * @param ContainerInterface $container
+ * @param string $requestedName
+ * @param array|null $options
+ *
+ * @return ElementPedagogiqueController
+ */
+ public function __invoke(ContainerInterface $container, $requestedName, $options = null)
+ {
+ $container = $container->getServiceLocator();
+
+ $controller = new ElementPedagogiqueController;
+ $controller->setServiceLocator($container);
+ $controller->setFormOffreFormationVolumeHoraireEns($container->get('FormElementManager')->get(VolumeHoraireEnsForm::class));
+
+ return $controller;
+ }
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/Entity/Db/ElementPedagogique.php b/module/Application/src/Application/Entity/Db/ElementPedagogique.php
index a07c895e3f..ce8d69677c 100644
--- a/module/Application/src/Application/Entity/Db/ElementPedagogique.php
+++ b/module/Application/src/Application/Entity/Db/ElementPedagogique.php
@@ -110,6 +110,11 @@ class ElementPedagogique implements HistoriqueAwareInterface, AnneeAwareInterfac
*/
protected $elementModulateur;
+ /**
+ * @var \Doctrine\Common\Collections\Collection
+ */
+ protected $volumeHoraireEns;
+
/**
* haschanged
*
@@ -576,6 +581,46 @@ class ElementPedagogique implements HistoriqueAwareInterface, AnneeAwareInterfac
+ /**
+ * Add volumeHoraireEns
+ *
+ * @param VolumeHoraireEns $volumeHoraireEns
+ *
+ * @return ElementPedagogique
+ */
+ public function addVolumeHoraireEns(VolumeHoraireEns $volumeHoraireEns)
+ {
+ $this->volumeHoraireEns[] = $volumeHoraireEns;
+
+ return $this;
+ }
+
+
+
+ /**
+ * Remove volumeHoraireEns
+ *
+ * @param VolumeHoraireEns $volumeHoraireEns
+ */
+ public function removeVolumeHoraireEns(VolumeHoraireEns $volumeHoraireEns)
+ {
+ $this->volumeHoraireEns->removeElement($volumeHoraireEns);
+ }
+
+
+
+ /**
+ * Get volumeHoraireEns
+ *
+ * @return \Doctrine\Common\Collections\Collection|VolumeHoraireEns[]
+ */
+ public function getVolumeHoraireEns()
+ {
+ return $this->volumeHoraireEns;
+ }
+
+
+
/**
* Add service
*
@@ -728,6 +773,26 @@ class ElementPedagogique implements HistoriqueAwareInterface, AnneeAwareInterfac
+ /**
+ * @return TypeIntervention[]
+ */
+ public function getTypesInterventionPossibles()
+ {
+ if (!$this->getId()) return [];
+
+ $sql = 'SELECT type_intervention_id FROM V_ELEMENT_TYPE_INTERV_POSSIBLE WHERE element_pedagogique_id = :element';
+ $res = $this->getEntityManager()->getConnection()->fetchAll($sql, ['element' => $this->getId()]);
+
+ $ids = [];
+ foreach( $res as $r ){
+ $ids[] = (int)$r['TYPE_INTERVENTION_ID'];
+ }
+
+ return $this->getEntityManager()->getRepository(TypeIntervention::class)->findBy(['id' => $ids], ['ordre' => 'ASC']);
+ }
+
+
+
/**
* Returns the string identifier of the Resource
*
diff --git a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.ElementPedagogique.dcm.xml b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.ElementPedagogique.dcm.xml
index 483fb0adff..50be9eaa5a 100644
--- a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.ElementPedagogique.dcm.xml
+++ b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.ElementPedagogique.dcm.xml
@@ -88,6 +88,11 @@
<cascade-all/>
</cascade>
</one-to-many>
+ <one-to-many field="volumeHoraireEns" target-entity="Application\Entity\Db\VolumeHoraireEns" mapped-by="elementPedagogique">
+ <cascade>
+ <cascade-all/>
+ </cascade>
+ </one-to-many>
<many-to-many field="typeIntervention" target-entity="Application\Entity\Db\TypeIntervention">
<join-table name="V_ELEMENT_TYPE_INTERVENTION">
<join-columns>
diff --git a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.VolumeHoraireEns.dcm.xml b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.VolumeHoraireEns.dcm.xml
index 998b7557be..922beb7db8 100644
--- a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.VolumeHoraireEns.dcm.xml
+++ b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.VolumeHoraireEns.dcm.xml
@@ -17,6 +17,7 @@
<generator strategy="SEQUENCE"/>
</id>
<field name="heures" type="float" column="HEURES" precision="126" scale="0" nullable="false"/>
+ <field name="groupes" type="float" column="GROUPES" precision="126" scale="0" nullable="true"/>
<field name="histoCreation" type="datetime" column="HISTO_CREATION" nullable="false"/>
<field name="histoDestruction" type="datetime" column="HISTO_DESTRUCTION" nullable="true"/>
<field name="histoModification" type="datetime" column="HISTO_MODIFICATION" nullable="false"/>
diff --git a/module/Application/src/Application/Entity/Db/TypeIntervention.php b/module/Application/src/Application/Entity/Db/TypeIntervention.php
index 0eedea3241..3ade5c78b7 100644
--- a/module/Application/src/Application/Entity/Db/TypeIntervention.php
+++ b/module/Application/src/Application/Entity/Db/TypeIntervention.php
@@ -4,11 +4,12 @@ namespace Application\Entity\Db;
use UnicaenApp\Entity\HistoriqueAwareInterface;
use UnicaenApp\Entity\HistoriqueAwareTrait;
+use Zend\Permissions\Acl\Resource\ResourceInterface;
/**
* TypeIntervention
*/
-class TypeIntervention implements HistoriqueAwareInterface
+class TypeIntervention implements HistoriqueAwareInterface, ResourceInterface
{
use HistoriqueAwareTrait;
@@ -396,4 +397,16 @@ class TypeIntervention implements HistoriqueAwareInterface
return $this;
}
+
+
+ /**
+ * Returns the string identifier of the Resource
+ *
+ * @return string
+ */
+ public function getResourceId()
+ {
+ return 'TypeIntervention';
+ }
+
}
diff --git a/module/Application/src/Application/Entity/Db/VolumeHoraireEns.php b/module/Application/src/Application/Entity/Db/VolumeHoraireEns.php
index 731b65c131..9887ad8de9 100644
--- a/module/Application/src/Application/Entity/Db/VolumeHoraireEns.php
+++ b/module/Application/src/Application/Entity/Db/VolumeHoraireEns.php
@@ -5,16 +5,16 @@ namespace Application\Entity\Db;
use Application\Entity\Db\Traits\ElementPedagogiqueAwareTrait;
use Application\Entity\Db\Traits\SourceAwareTrait;
use Application\Entity\Db\Traits\TypeInterventionAwareTrait;
-use Doctrine\ORM\Mapping as ORM;
use UnicaenApp\Entity\HistoriqueAwareInterface;
use UnicaenApp\Entity\HistoriqueAwareTrait;
use UnicaenImport\Entity\Db\Interfaces\ImportAwareInterface;
use UnicaenImport\Entity\Db\Traits\ImportAwareTrait;
+use Zend\Permissions\Acl\Resource\ResourceInterface;
/**
* VolumeHoraireEns
*/
-class VolumeHoraireEns implements HistoriqueAwareInterface, ImportAwareInterface
+class VolumeHoraireEns implements HistoriqueAwareInterface, ImportAwareInterface, ResourceInterface
{
use HistoriqueAwareTrait;
use ImportAwareTrait;
@@ -31,6 +31,11 @@ class VolumeHoraireEns implements HistoriqueAwareInterface, ImportAwareInterface
*/
protected $heures;
+ /**
+ * @var float
+ */
+ protected $groupes;
+
/**
@@ -45,6 +50,18 @@ class VolumeHoraireEns implements HistoriqueAwareInterface, ImportAwareInterface
+ /**
+ * Get heures
+ *
+ * @return float
+ */
+ public function getHeures()
+ {
+ return $this->heures;
+ }
+
+
+
/**
* Set heures
*
@@ -62,13 +79,37 @@ class VolumeHoraireEns implements HistoriqueAwareInterface, ImportAwareInterface
/**
- * Get heures
- *
* @return float
*/
- public function getHeures()
+ public function getGroupes()
{
- return $this->heures;
+ return $this->groupes;
+ }
+
+
+
+ /**
+ * @param float $groupes
+ *
+ * @return VolumeHoraireEns
+ */
+ public function setGroupes($groupes)
+ {
+ $this->groupes = $groupes;
+
+ return $this;
+ }
+
+
+
+ /**
+ * Returns the string identifier of the Resource
+ *
+ * @return string
+ */
+ public function getResourceId()
+ {
+ return 'VolumeHoraireEns';
}
-}
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/Filter/FloatFromString.php b/module/Application/src/Application/Filter/FloatFromString.php
index a1633d07c5..e231d4e2ac 100644
--- a/module/Application/src/Application/Filter/FloatFromString.php
+++ b/module/Application/src/Application/Filter/FloatFromString.php
@@ -11,6 +11,8 @@ class FloatFromString extends AbstractFilter
public function filter($value)
{
+ if ($value === '') return null;
+
$value = preg_replace("/[^0-9,\.-]/","",$value);
$value = str_replace(',','.',$value);
$value = floatval($value);
@@ -26,6 +28,6 @@ class FloatFromString extends AbstractFilter
self::$instance = new self;
}
- return self::$instance->filter($value);
+ return self::$instance->filter($value );
}
}
\ No newline at end of file
diff --git a/module/Application/src/Application/Form/OffreFormation/Factory/VolumeHoraireEnsFormFactory.php b/module/Application/src/Application/Form/OffreFormation/Factory/VolumeHoraireEnsFormFactory.php
new file mode 100755
index 0000000000..072769f87a
--- /dev/null
+++ b/module/Application/src/Application/Form/OffreFormation/Factory/VolumeHoraireEnsFormFactory.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Application\Form\OffreFormation\Factory;
+
+use Zend\ServiceManager\ServiceLocatorInterface as ContainerInterface;
+use Application\Form\OffreFormation\VolumeHoraireEnsForm;
+
+
+
+/**
+ * Description of VolumeHoraireEnsFormFactory
+ *
+ * @author LECLUSE Laurent <laurent.lecluse at unicaen.fr>
+ */
+class VolumeHoraireEnsFormFactory
+{
+
+ /**
+ * @param ContainerInterface $container
+ * @param string $requestedName
+ * @param array|null $options
+ *
+ * @return VolumeHoraireEnsForm
+ */
+ public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+ {
+ $formOffreFormationVolumeHoraireEns = new VolumeHoraireEnsForm;
+ /* Injectez vos dépendances ICI */
+
+ return $formOffreFormationVolumeHoraireEns;
+ }
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/Form/OffreFormation/Traits/VolumeHoraireEnsFormAwareTrait.php b/module/Application/src/Application/Form/OffreFormation/Traits/VolumeHoraireEnsFormAwareTrait.php
new file mode 100755
index 0000000000..c4610caab6
--- /dev/null
+++ b/module/Application/src/Application/Form/OffreFormation/Traits/VolumeHoraireEnsFormAwareTrait.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Application\Form\OffreFormation\Traits;
+
+use Application\Form\OffreFormation\VolumeHoraireEnsForm;
+use RuntimeException;
+
+/**
+ * Description of VolumeHoraireEnsFormAwareTrait
+ *
+ * @author UnicaenCode
+ */
+trait VolumeHoraireEnsFormAwareTrait
+{
+ /**
+ * @var VolumeHoraireEnsForm
+ */
+ protected $formOffreFormationVolumeHoraireEns;
+
+
+
+ /**
+ * @param VolumeHoraireEnsForm $formOffreFormationVolumeHoraireEns
+ *
+ * @return self
+ */
+ public function setFormOffreFormationVolumeHoraireEns( VolumeHoraireEnsForm $formOffreFormationVolumeHoraireEns )
+ {
+ $this->formOffreFormationVolumeHoraireEns = $formOffreFormationVolumeHoraireEns;
+
+ return $this;
+ }
+
+
+
+ /**
+ * Retourne un nouveau formulaire ou fieldset systématiquement, sauf si ce dernier a été fourni manuellement.
+ *
+ * @return VolumeHoraireEnsForm
+ * @throws RuntimeException
+ */
+ public function getFormOffreFormationVolumeHoraireEns()
+ {
+ return $this->formOffreFormationVolumeHoraireEns;
+ }
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/Form/OffreFormation/VolumeHoraireEnsForm.php b/module/Application/src/Application/Form/OffreFormation/VolumeHoraireEnsForm.php
new file mode 100755
index 0000000000..dae6fc2726
--- /dev/null
+++ b/module/Application/src/Application/Form/OffreFormation/VolumeHoraireEnsForm.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace Application\Form\OffreFormation;
+
+use Application\Entity\Db\VolumeHoraireEns;
+use Application\Filter\StringFromFloat;
+use Zend\Form\Form;
+use Zend\InputFilter\InputFilterProviderInterface;
+
+
+/**
+ * Description of VolumeHoraireEnsForm
+ *
+ * @author LECLUSE Laurent <laurent.lecluse at unicaen.fr>
+ */
+class VolumeHoraireEnsForm extends Form implements InputFilterProviderInterface
+{
+
+ public function init()
+ {
+
+ /* Ajoutez vos éléments de formulaire ici */
+
+ $this->add([
+ 'name' => 'submit',
+ 'type' => 'Submit',
+ 'attributes' => [
+ 'value' => 'Enregistrer',
+ 'class' => 'btn btn-primary',
+ ],
+ ]);
+ }
+
+
+
+ /**
+ * @param VolumeHoraireEns[] $vhes
+ */
+ public function build(array $vhes)
+ {
+ foreach ($vhes as $vhe) {
+ $this->add([
+ 'name' => $this->getElementName($vhe, 'heures'),
+ 'type' => 'Text',
+ 'attributes' => [
+ 'value' => StringFromFloat::run($vhe->getHeures(), false),
+ ],
+ ]);
+
+ $this->add([
+ 'name' => $this->getElementName($vhe, 'groupes'),
+ 'type' => 'Text',
+ 'attributes' => [
+ 'value' => StringFromFloat::run($vhe->getGroupes(), false),
+ ],
+ ]);
+ }
+ }
+
+
+
+ public function getElement( VolumeHoraireEns $volumeHoraireEns, $type)
+ {
+ return $this->get($this->getElementName($volumeHoraireEns, $type));
+ }
+
+
+
+ private function getElementName(VolumeHoraireEns $volumeHoraireEns, $type)
+ {
+ return 'vhes['.$volumeHoraireEns->getTypeIntervention()->getId().']['.$type.']';
+ }
+
+
+
+ /**
+ * Should return an array specification compatible with
+ * {@link Zend\InputFilter\Factory::createInputFilter()}.
+ *
+ * @return array
+ */
+ public function getInputFilterSpecification()
+ {
+ return [
+ /* Filtres et validateurs */
+ ];
+ }
+
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/Provider/Privilege/Privileges.php b/module/Application/src/Application/Provider/Privilege/Privileges.php
index a8f5c4128e..30df0a00d4 100755
--- a/module/Application/src/Application/Provider/Privilege/Privileges.php
+++ b/module/Application/src/Application/Provider/Privilege/Privileges.php
@@ -107,6 +107,8 @@ class Privileges extends \UnicaenAuth\Provider\Privilege\Privileges {
const MOTIF_NON_PAIEMENT_VISUALISATION = 'motif-non-paiement-visualisation';
const ODF_CENTRES_COUT_EDITION = 'odf-centres-cout-edition';
const ODF_ELEMENT_EDITION = 'odf-element-edition';
+ const ODF_ELEMENT_VH_EDITION = 'odf-element-vh-edition';
+ const ODF_ELEMENT_VH_VISUALISATION = 'odf-element-vh-visualisation';
const ODF_ELEMENT_VISUALISATION = 'odf-element-visualisation';
const ODF_ETAPE_EDITION = 'odf-etape-edition';
const ODF_ETAPE_VISUALISATION = 'odf-etape-visualisation';
@@ -137,6 +139,9 @@ class Privileges extends \UnicaenAuth\Provider\Privilege\Privileges {
const REFERENTIEL_VISUALISATION = 'referentiel-visualisation';
const TYPE_INTERVENTION_EDITION = 'type-intervention-edition';
const TYPE_INTERVENTION_VISUALISATION = 'type-intervention-visualisation';
+ const UNICAEN_TBL_ACTUALISATION = 'unicaen-tbl-actualisation';
+ const UNICAEN_TBL_ADMIN = 'unicaen-tbl-admin';
+ const UNICAEN_TBL_UPDATE_ACTUPROC = 'unicaen-tbl-update-actuproc';
const WORKFLOW_DEPENDANCES_EDITION = 'workflow-dependances-edition';
const WORKFLOW_DEPENDANCES_VISUALISATION = 'workflow-dependances-visualisation';
diff --git a/module/Application/src/Application/Service/Traits/VolumeHoraireEnsServiceAwareTrait.php b/module/Application/src/Application/Service/Traits/VolumeHoraireEnsServiceAwareTrait.php
new file mode 100644
index 0000000000..f6f6eec2bf
--- /dev/null
+++ b/module/Application/src/Application/Service/Traits/VolumeHoraireEnsServiceAwareTrait.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Application\Service\Traits;
+
+use Application\Service\VolumeHoraireEnsService;
+use Application\Module;
+use RuntimeException;
+
+/**
+ * Description of VolumeHoraireEnsAwareTrait
+ *
+ * @author UnicaenCode
+ */
+trait VolumeHoraireEnsServiceAwareTrait
+{
+ /**
+ * @var VolumeHoraireEnsService
+ */
+ private $serviceVolumeHoraireEns;
+
+
+
+
+
+ /**
+ * @param VolumeHoraireEnsService $serviceVolumeHoraireEns
+ * @return self
+ */
+ public function setServiceVolumeHoraireEns( VolumeHoraireEnsService $serviceVolumeHoraireEns )
+ {
+ $this->serviceVolumeHoraireEns = $serviceVolumeHoraireEns;
+ return $this;
+ }
+
+
+
+ /**
+ * @return VolumeHoraireEnsService
+ * @throws RuntimeException
+ */
+ public function getServiceVolumeHoraireEns()
+ {
+ if (empty($this->serviceVolumeHoraireEns)){
+ $serviceLocator = Module::$serviceLocator;
+ if (! $serviceLocator) {
+ if (!method_exists($this, 'getServiceLocator')) {
+ throw new RuntimeException('La classe ' . get_class($this) . ' n\'a pas accès au ServiceLocator.');
+ }
+
+ $serviceLocator = $this->getServiceLocator();
+ if (method_exists($serviceLocator, 'getServiceLocator')) {
+ $serviceLocator = $serviceLocator->getServiceLocator();
+ }
+ }
+ $this->serviceVolumeHoraireEns = $serviceLocator->get('ApplicationVolumeHoraireEns');
+ }
+ return $this->serviceVolumeHoraireEns;
+ }
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/Service/VolumeHoraireEnsService.php b/module/Application/src/Application/Service/VolumeHoraireEnsService.php
new file mode 100644
index 0000000000..dd45831fb5
--- /dev/null
+++ b/module/Application/src/Application/Service/VolumeHoraireEnsService.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Application\Service;
+
+use Application\Entity\Db\VolumeHoraireEns;
+use Application\Service\Traits\SourceAwareTrait;
+use Application\Entity\Db\ElementPedagogique as ElementPedagogiqueEntity;
+use Application\Entity\Db\TypeIntervention as TypeInterventionEntity;
+
+
+/**
+ * Description of VolumeHoraireEnsService
+ *
+ * @author Laurent LÉCLUSE <laurent.lecluse at unicaen.fr>
+ *
+ * @method VolumeHoraireEns get($id)
+ * @method VolumeHoraireEns[] getList(\Doctrine\ORM\QueryBuilder $qb = null, $alias = null)
+ */
+class VolumeHoraireEnsService extends AbstractEntityService
+{
+ use SourceAwareTrait;
+
+
+
+ /**
+ * retourne la classe des entités
+ *
+ * @return string
+ * @throws RuntimeException
+ */
+ public function getEntityClass()
+ {
+ return VolumeHoraireEns::class;
+ }
+
+
+
+ /**
+ * Retourne l'alias d'entité courante
+ *
+ * @return string
+ */
+ public function getAlias()
+ {
+ return 'vhe';
+ }
+
+
+
+ /**
+ * Retourne une nouvelle entité, initialisée avec les bons paramètres
+ *
+ * @return \Application\Entity\Db\VolumeHoraireEns
+ */
+ public function newEntity(ElementPedagogiqueEntity $elementPedagogique = null, TypeInterventionEntity $typeIntervention = null)
+ {
+ /** @var VolumeHoraireEns $entity */
+ $entity = parent::newEntity();
+
+ // toutes les entités créées ont OSE pour source!!
+ $entity->setSource($this->getServiceSource()->getOse());
+
+ if ($elementPedagogique) {
+ $entity->setElementPedagogique($elementPedagogique);
+ }
+
+ if ($typeIntervention) {
+ $entity->setTypeIntervention($typeIntervention);
+ }
+
+ return $entity;
+ }
+
+
+
+ public function changeHeuresGroupes(VolumeHoraireEns $volumeHoraireEns, $heures, $groupes)
+ {
+ $changed = false;
+ $toDelete = false;
+
+ if ($volumeHoraireEns->getHeures() !== $heures) {
+ if ($heures !== null) {
+ $volumeHoraireEns->setHeures($heures);
+ } else {
+ $toDelete = true;
+ }
+ $changed = true;
+ }
+
+ if ($volumeHoraireEns->getGroupes() !== $groupes) {
+ $volumeHoraireEns->setGroupes($groupes);
+ $changed = true;
+ }
+
+ if ($changed) {
+ if ($toDelete) {
+ $this->delete($volumeHoraireEns);
+ } else {
+ $this->save($volumeHoraireEns);
+ }
+ }
+
+ return $this;
+ }
+}
\ No newline at end of file
diff --git a/module/Application/view/application/intervenant/fiche.phtml b/module/Application/view/application/intervenant/fiche.phtml
index d7111bb557..a8ae25ca03 100644
--- a/module/Application/view/application/intervenant/fiche.phtml
+++ b/module/Application/view/application/intervenant/fiche.phtml
@@ -9,13 +9,11 @@ $urlRefresh = $this->url('workflow/feuille-de-route-refresh', ['intervenant' =>
?>
<script>
$(function () {
-
$('#feuille-de-route-refresh').popAjax({
change: function (event, popAjax) {
window.location.reload();
}
});
-
});
</script>
<hr/>
diff --git a/module/Application/view/application/offre-formation/element-pedagogique/voir.phtml b/module/Application/view/application/offre-formation/element-pedagogique/voir.phtml
index 822b4e2452..084faa52be 100644
--- a/module/Application/view/application/offre-formation/element-pedagogique/voir.phtml
+++ b/module/Application/view/application/offre-formation/element-pedagogique/voir.phtml
@@ -1,5 +1,21 @@
-<h3><?php echo $element ?> <small><?php echo $element->getCode() ?></small></h3>
+<?php
-<?php echo $this->elementPedagogique($element) ?>
+use Application\Provider\Privilege\Privileges;
-<br /><?php //foreach( $changements as $changement ) { echo $this->differentielLigne( $changement ); } ?>
+$tabs = [
+ [
+ 'id' => 'fiche',
+ 'label' => 'Fiche',
+ 'content' => (string)$this->elementPedagogique($element),
+ ],
+];
+
+if ($this->isAllowed(Privileges::getResourceId(Privileges::ODF_ELEMENT_VH_VISUALISATION))) {
+ $tabs[] = [
+ 'id' => 'volume-horaire-ens',
+ 'label' => '<span class="glyphicon glyphicon-time"></span> Volumes horaires',
+ 'url' => $this->url('of/element/volume-horaire', ['elementPedagogique' => $element->getId()]),
+ ];
+}
+
+echo $this->tabajax($tabs);
diff --git a/module/Application/view/application/offre-formation/element-pedagogique/volume-horaire.phtml b/module/Application/view/application/offre-formation/element-pedagogique/volume-horaire.phtml
new file mode 100644
index 0000000000..dd9f255838
--- /dev/null
+++ b/module/Application/view/application/offre-formation/element-pedagogique/volume-horaire.phtml
@@ -0,0 +1,60 @@
+<?php
+
+use Application\Entity\Db\VolumeHoraireEns;
+use Application\Filter\StringFromFloat;
+use Application\Form\OffreFormation\VolumeHoraireEnsForm;
+
+/**
+ * @var $this \Application\View\Renderer\PhpRenderer
+ * @var $vhes VolumeHoraireEns[]
+ * @var $form VolumeHoraireEnsForm
+ */
+
+?>
+<style>
+ .edition-volume-horaire-ens .source {
+ white-space: nowrap;
+ }
+
+ .edition-volume-horaire-ens td input {
+ width: 100%;
+ }
+
+</style>
+<?php echo $this->form()->openTag($form); ?>
+<table class="table table-bordered table-condensed table-hover edition-volume-horaire-ens" style="margin-top: 2px">
+ <thead>
+ <tr>
+ <th> </th>
+ <th>Heures</th>
+ <th>Groupes</th>
+ <th>Source</th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($vhes as $vhe):
+ $canEdit = $this->isAllowed($vhe, Application\Provider\Privilege\Privileges::ODF_ELEMENT_VH_EDITION);
+
+ if ($canEdit) {
+ $heures = $this->formText($form->getElement($vhe,'heures'));
+ $groupes = $this->formText($form->getElement($vhe, 'groupes'));
+ } else {
+ $heures = StringFromFloat::run($vhe->getHeures(), false);
+ $groupes = StringFromFloat::run($vhe->getGroupes(), false);
+ }
+
+ ?>
+ <tr>
+ <td><abbr title="<?php echo $vhe->getTypeIntervention()->getLibelle() ?>"><?php echo $vhe->getTypeIntervention() ?></abbr></td>
+ <td><?php echo $heures ?></td>
+ <td><?php echo $groupes ?></td>
+ <td class="source"><?php echo $vhe->getId() ? $vhe->getSource() : 'Non existant' ?></td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+</table>
+<?php if ($form): ?>
+ <?php echo $this->formSubmit($form->get('submit')); ?>
+<?php endif; ?>
+<?php echo $this->form()->closeTag() ?>
+<?php echo $this->messenger()->addCurrentMessagesFromFlashMessenger() ?>
diff --git a/module/Application/view/application/offre-formation/etape/voir.phtml b/module/Application/view/application/offre-formation/etape/voir.phtml
index 691a8f651b..14dd9408e8 100644
--- a/module/Application/view/application/offre-formation/etape/voir.phtml
+++ b/module/Application/view/application/offre-formation/etape/voir.phtml
@@ -2,13 +2,6 @@
use Application\Provider\Privilege\Privileges;
-?>
-<h3><?php echo $etape ?>
- <small><?php echo $etape->getCode() ?></small>
-</h3>
-
-<?php
-
/* @var $serviceEtape \Application\Service\Etape */
$tabs = [
--
GitLab