diff --git a/config/module.config.php b/config/module.config.php index 19d4566d112be45658f013cab4dc722311595d50..9b81d5c3245121b3fc8fe6c3c8f59f3fcf57b088 100755 --- a/config/module.config.php +++ b/config/module.config.php @@ -6,6 +6,8 @@ use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain; use Doctrine\ORM\Mapping\Driver\XmlDriver; use Octopus\Controller\OctopusController; use Octopus\Controller\OctopusControllerFactory; +use Octopus\Service\Fonction\FonctionService; +use Octopus\Service\Fonction\FonctionServiceFactory; use Octopus\Service\Geographie\GeographieService; use Octopus\Service\Geographie\GeographieServiceFactory; use Octopus\Service\Immobilier\ImmobilierService; @@ -76,6 +78,7 @@ return [ ImmobilierService::class => ImmobilierServiceFactory::class, IndividuService::class => IndividuServiceFactory::class, GeographieService::class => GeographieServiceFactory::class, + FonctionService::class => FonctionServiceFactory::class, ], ], 'controllers' => [ diff --git a/src/Octopus/Controller/OctopusController.php b/src/Octopus/Controller/OctopusController.php index eab95f1f084ab4baab87d76371c86e28f92a88ba..efe9c78cd7a790964fc982717ab922af754e0e1e 100644 --- a/src/Octopus/Controller/OctopusController.php +++ b/src/Octopus/Controller/OctopusController.php @@ -2,6 +2,7 @@ namespace Octopus\Controller; +use Octopus\Service\Fonction\FonctionServiceAwareTrait; use Octopus\Service\Geographie\GeographieServiceAwareTrait; use Octopus\Service\Immobilier\ImmobilierServiceAwareTrait; use Octopus\Service\Individu\IndividuServiceAwareTrait; @@ -10,6 +11,7 @@ use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class OctopusController extends AbstractActionController { + use FonctionServiceAwareTrait; use GeographieServiceAwareTrait; use ImmobilierServiceAwareTrait; use IndividuServiceAwareTrait; @@ -27,6 +29,10 @@ class OctopusController extends AbstractActionController { $individus = $this->getIndividuService()->getIndividus(); + $fonctions = $this->getFonctionService()->getFonctions(); + $fonctionsLibelles = $this->getFonctionService()->getFonctionsLibelles(); + $fonctionsTypes = $this->getFonctionService()->getFonctionsTypes(); + $pays = $this->getGeographieService()->getPays('libelleCourt'); return new ViewModel([ @@ -40,6 +46,10 @@ class OctopusController extends AbstractActionController { 'individus' => $individus, + 'fonctions' => $fonctions, + 'fonctionsLibelles' => $fonctionsLibelles, + 'fonctionsTypes' => $fonctionsTypes, + 'pays' => $pays, ]); } diff --git a/src/Octopus/Controller/OctopusControllerFactory.php b/src/Octopus/Controller/OctopusControllerFactory.php index f484724ff169e2838c5309c4b0a44740af5aeb0c..e8dd72fe6642cae62cd808446920fce354fdec61 100644 --- a/src/Octopus/Controller/OctopusControllerFactory.php +++ b/src/Octopus/Controller/OctopusControllerFactory.php @@ -2,6 +2,7 @@ namespace Octopus\Controller; +use Octopus\Service\Fonction\FonctionService; use Octopus\Service\Geographie\GeographieService; use Octopus\Service\Immobilier\ImmobilierService; use Octopus\Service\Individu\IndividuService; @@ -17,11 +18,13 @@ class OctopusControllerFactory { * @var ImmobilierService $immobilierService * @var IndividuService $individuService * @var GeographieService $geographieService + * @var FonctionService $fonctionService */ $structureService = $manager->getServiceLocator()->get(StructureService::class); $immobilierService = $manager->getServiceLocator()->get(ImmobilierService::class); $individuService = $manager->getServiceLocator()->get(IndividuService::class); $geographieService = $manager->getServiceLocator()->get(GeographieService::class); + $fonctionService = $manager->getServiceLocator()->get(FonctionService::class); /** @var OctopusController $controller */ $controller = new OctopusController(); @@ -29,6 +32,7 @@ class OctopusControllerFactory { $controller->setImmobiliserService($immobilierService); $controller->setIndividuService($individuService); $controller->setGeographieService($geographieService); + $controller->setFonctionService($fonctionService); return $controller; } } \ No newline at end of file diff --git a/src/Octopus/Entity/Db/Fonction.php b/src/Octopus/Entity/Db/Fonction.php new file mode 100644 index 0000000000000000000000000000000000000000..a630aeb241a0b678dd93f23b3648599015b6c41a --- /dev/null +++ b/src/Octopus/Entity/Db/Fonction.php @@ -0,0 +1,95 @@ +<?php + +namespace Octopus\Entity\Db; + +use Doctrine\Common\Collections\ArrayCollection; + +class Fonction { + /** @var integer */ + private $id; + /** @var Fonction */ + private $parent; + /** @var ArrayCollection */ + private $enfants; + /** @var FonctionType */ + private $type; + /** @var string */ + private $code; + /** @var string */ + private $codeSource; + /** @var integer */ + private $niveau; + /** @var ArrayCollection */ + private $libelles; + + public function __construct() + { + $this->enfants = new ArrayCollection(); + $this->libelles = new ArrayCollection(); + } + + /** + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * @return Fonction + */ + public function getParent() + { + return $this->parent; + } + + /** + * @return Fonction[] + */ + public function getEnfants() + { + return $this->enfants->toArray(); + } + + /** + * @return FonctionType + */ + public function getType() + { + return $this->type; + } + + /** + * @return string + */ + public function getCode() + { + return $this->code; + } + + /** + * @return string + */ + public function getCodeSource() + { + return $this->codeSource; + } + + /** + * @return int + */ + public function getNiveau() + { + return $this->niveau; + } + + /** + * @return FonctionLibelle[] + */ + public function getLibelles() + { + return $this->libelles->toArray(); + } + +} \ No newline at end of file diff --git a/src/Octopus/Entity/Db/FonctionLibelle.php b/src/Octopus/Entity/Db/FonctionLibelle.php new file mode 100644 index 0000000000000000000000000000000000000000..e6658fa50c31df99d956762e2d30bb75ade560c7 --- /dev/null +++ b/src/Octopus/Entity/Db/FonctionLibelle.php @@ -0,0 +1,58 @@ +<?php + +namespace Octopus\Entity\Db; + +class FonctionLibelle { + /** @var integer */ + private $id; + /** @var Fonction */ + private $fonction; + /** @var string */ + private $libelle; + /** @var string */ + private $genre; + /** @var string */ + private $default; + + /** + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * @return Fonction + */ + public function getFonction() + { + return $this->fonction; + } + + /** + * @return string + */ + public function getLibelle() + { + return $this->libelle; + } + + /** + * @return string + */ + public function getGenre() + { + return $this->genre; + } + + /** + * @return boolean + */ + public function getDefault() + { + return ($this->default === 'O'); + } + + +} \ No newline at end of file diff --git a/src/Octopus/Entity/Db/FonctionType.php b/src/Octopus/Entity/Db/FonctionType.php new file mode 100644 index 0000000000000000000000000000000000000000..0543efeff1be488e3a223f80142cd48e5047ca28 --- /dev/null +++ b/src/Octopus/Entity/Db/FonctionType.php @@ -0,0 +1,47 @@ +<?php + +namespace Octopus\Entity\Db; + +class FonctionType { + /** @var integer */ + private $id; + /** @var string */ + private $nom; + /** @var string */ + private $libelle; + /** @var string */ + private $description; + + /** + * @return int + */ + public function getId() + { + return $this->id; + } + + /** + * @return string + */ + public function getNom() + { + return $this->nom; + } + + /** + * @return string + */ + public function getLibelle() + { + return $this->libelle; + } + + /** + * @return string + */ + public function getDescription() + { + return $this->description; + } + +} \ No newline at end of file diff --git a/src/Octopus/Entity/Db/Mapping/Octopus.Entity.Db.Fonction.dcm.xml b/src/Octopus/Entity/Db/Mapping/Octopus.Entity.Db.Fonction.dcm.xml new file mode 100644 index 0000000000000000000000000000000000000000..5c8c4bc4d9afb0e9254245ddc5f3d284a82aab52 --- /dev/null +++ b/src/Octopus/Entity/Db/Mapping/Octopus.Entity.Db.Fonction.dcm.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> + <entity name="Octopus\Entity\Db\Fonction" table="FONCTION"> + + <id name="id" type="integer" column="ID"> + <generator strategy="IDENTITY"/> + </id> + + <many-to-one target-entity="Octopus\Entity\Db\Fonction" field="parent"> + <join-column name="PARENT_ID" referenced-column-name="ID" /> + </many-to-one> + + <one-to-many target-entity="Octopus\Entity\Db\Fonction" mapped-by="parent" field="enfants"/> + + <many-to-one target-entity="Octopus\Entity\Db\FonctionType" field="type"> + <join-column name="TYPE_ID" referenced-column-name="ID" /> + </many-to-one> + + <one-to-many target-entity="Octopus\Entity\Db\FonctionLibelle" mapped-by="fonction" field="libelles"/> + + <field name="code" type="string" length="20" column="CODE" nullable="false"/> + <field name="codeSource" type="string" length="4" column="CODE_SRC" nullable="false"/> + <field name="niveau" type="integer" column="NIVEAU" nullable="false"/> + + </entity> +</doctrine-mapping> \ No newline at end of file diff --git a/src/Octopus/Entity/Db/Mapping/Octopus.Entity.Db.FonctionLibelle.dcm.xml b/src/Octopus/Entity/Db/Mapping/Octopus.Entity.Db.FonctionLibelle.dcm.xml new file mode 100644 index 0000000000000000000000000000000000000000..3fc2a220ea04a2d28f270bf92a4ab194741c8e8e --- /dev/null +++ b/src/Octopus/Entity/Db/Mapping/Octopus.Entity.Db.FonctionLibelle.dcm.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> + <entity name="Octopus\Entity\Db\FonctionLibelle" table="FONCTION_LIBELLE"> + + <id name="id" type="integer" column="ID"> + <generator strategy="IDENTITY"/> + </id> + + <many-to-one target-entity="Octopus\Entity\Db\Fonction" field="fonction"> + <join-column name="FONCTION_ID" referenced-column-name="ID" /> + </many-to-one> + + <field name="libelle" type="string" length="255" column="LIBELLE" nullable="false"/> + <field name="genre" type="string" length="1" column="GENRE" nullable="false"/> + <field name="default" type="string" length="1" column="T_DEFAUT" nullable="false"/> + + </entity> +</doctrine-mapping> \ No newline at end of file diff --git a/src/Octopus/Entity/Db/Mapping/Octopus.Entity.Db.FonctionType.dcm.xml b/src/Octopus/Entity/Db/Mapping/Octopus.Entity.Db.FonctionType.dcm.xml new file mode 100644 index 0000000000000000000000000000000000000000..c149872a5f65cfae2549d4de5de1d1b637277304 --- /dev/null +++ b/src/Octopus/Entity/Db/Mapping/Octopus.Entity.Db.FonctionType.dcm.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> + <entity name="Octopus\Entity\Db\FonctionType" table="FONCTION_TYPE"> + + <id name="id" type="integer" column="ID"> + <generator strategy="IDENTITY"/> + </id> + + <field name="nom" type="string" length="20" column="NOM" nullable="false"/> + <field name="libelle" type="string" length="255" column="LIBELLE" nullable="false"/> + <field name="description" type="string" length="1024" column="DESCRIPTION" nullable="false"/> + + </entity> +</doctrine-mapping> \ No newline at end of file diff --git a/src/Octopus/Service/Fonction/FonctionService.php b/src/Octopus/Service/Fonction/FonctionService.php new file mode 100644 index 0000000000000000000000000000000000000000..e668b4a3a0d01fb7d6fa475b47c44a026d740da2 --- /dev/null +++ b/src/Octopus/Service/Fonction/FonctionService.php @@ -0,0 +1,185 @@ +<?php + +namespace Octopus\Service\Fonction; + +use Doctrine\ORM\NonUniqueResultException; +use Octopus\Entity\Db\Fonction; +use Octopus\Entity\Db\FonctionLibelle; +use Octopus\Entity\Db\FonctionType; +use UnicaenApp\Exception\RuntimeException; +use UnicaenApp\Service\EntityManagerAwareTrait; + +class FonctionService { + use EntityManagerAwareTrait; + + /** FONCTION ******************************************************************************************************/ + + /** + * @param string $order + * @return Fonction[] + */ + public function getFonctions($order = null) + { + $qb = $this->getEntityManager()->getRepository(Fonction::class)->createQueryBuilder('fonction') + ->addSelect('libelle')->join('fonction.libelles', 'libelle') + ->addSelect('type')->join('fonction.type', 'type') + ; + + if($order) $qb = $qb->orderBy('fonction.' . $order); + + $qb = $qb->setMaxResults(501); + + $result = $qb->getQuery()->getResult(); + return $result; + } + + /** + * @param integer $id + * @return Fonction + */ + public function getFonction($id) + { + $qb = $this->getEntityManager()->getRepository(Fonction::class)->createQueryBuilder('fonction') + ->addSelect('libelle')->join('fonction.libelles', 'libelle') + ->addSelect('type')->join('fonction.type', 'type') + ->andWhere('fonction.id = :id') + ->setParameter('id', $id) + ; + + try { + $result = $qb->getQuery()->getOneOrNullResult(); + } catch (NonUniqueResultException $e) { + throw new RuntimeException("Plusieurs Fonction partagent le même identifiant [".$id."]."); + } + return $result; + } + + /** + * @param string $term + * @return Fonction[] + */ + public function getFonctionsByTerm($term) + { + $qb = $this->getEntityManager()->getRepository(Fonction::class)->createQueryBuilder('fonction') + ->addSelect('libelle')->join('fonction.libelles', 'libelle') + ->addSelect('type')->join('fonction.type', 'type') + ->andWhere('libelle.libelle LIKE :search') + ->setParameter('search', '%'.$term.'%') + ->orderBy('fonction.libelle') + ; + + $result = $qb->getQuery()->getResult(); + return $result; + } + + /** FONCTION_LIBELLE **********************************************************************************************/ + + /** + * @param string $order + * @return Fonction[] + */ + public function getFonctionsLibelles($order = null) + { + $qb = $this->getEntityManager()->getRepository(FonctionLibelle::class)->createQueryBuilder('libelle') + ->addSelect('fonction')->join('libelle.fonction', 'fonction') + ; + + if($order) $qb = $qb->orderBy('libelle.' . $order); + + $qb = $qb->setMaxResults(501); + + $result = $qb->getQuery()->getResult(); + return $result; + } + + /** + * @param integer $id + * @return Fonction + */ + public function getFonctionLibelle($id) + { + $qb = $this->getEntityManager()->getRepository(FonctionLibelle::class)->createQueryBuilder('libelle') + ->addSelect('fonction')->join('libelle.fonction', 'fonction') + ->andWhere('libelle.id = :id') + ->setParameter('id', $id) + ; + + try { + $result = $qb->getQuery()->getOneOrNullResult(); + } catch (NonUniqueResultException $e) { + throw new RuntimeException("Plusieurs FonctionLibelle partagent le même identifiant [".$id."]."); + } + return $result; + } + + /** + * @param string $term + * @return Fonction[] + */ + public function getFonctionsLibellesByTerm($term) + { + $qb = $this->getEntityManager()->getRepository(FonctionLibelle::class)->createQueryBuilder('libelle') + ->addSelect('fonction')->join('libelle.fonction', 'fonction') + ->andWhere('libelle.libelle LIKE :search') + ->setParameter('search', '%'.$term.'%') + ->orderBy('libelle.libelle') + ; + + $result = $qb->getQuery()->getResult(); + return $result; + } + + /** FONCTION_TYPE *************************************************************************************************/ + + /** + * @param string $order + * @return Fonction[] + */ + public function getFonctionsTypes($order = null) + { + $qb = $this->getEntityManager()->getRepository(FonctionType::class)->createQueryBuilder('type') + ; + + if($order) $qb = $qb->orderBy('type.' . $order); + + $qb = $qb->setMaxResults(501); + + $result = $qb->getQuery()->getResult(); + return $result; + } + + /** + * @param integer $id + * @return Fonction + */ + public function getFonctionType($id) + { + $qb = $this->getEntityManager()->getRepository(FonctionType::class)->createQueryBuilder('type') + ->andWhere('type.id = :id') + ->setParameter('id', $id) + ; + + try { + $result = $qb->getQuery()->getOneOrNullResult(); + } catch (NonUniqueResultException $e) { + throw new RuntimeException("Plusieurs FonctionType partagent le même identifiant [".$id."]."); + } + return $result; + } + + /** + * @param string $term + * @return Fonction[] + */ + public function getFonctionsTypesByTerm($term) + { + $qb = $this->getEntityManager()->getRepository(FonctionType::class)->createQueryBuilder('type') + ->andWhere('type.libelle LIKE :search') + ->setParameter('search', '%'.$term.'%') + ->orderBy('type.libelle') + ; + + $result = $qb->getQuery()->getResult(); + return $result; + } +} \ No newline at end of file diff --git a/src/Octopus/Service/Fonction/FonctionServiceAwareTrait.php b/src/Octopus/Service/Fonction/FonctionServiceAwareTrait.php new file mode 100644 index 0000000000000000000000000000000000000000..87962c265e9da62ebdc149f14eddeb1243e4944c --- /dev/null +++ b/src/Octopus/Service/Fonction/FonctionServiceAwareTrait.php @@ -0,0 +1,29 @@ +<?php + +namespace Octopus\Service\Fonction; + +trait FonctionServiceAwareTrait { + + /** @var FonctionService */ + private $fonctionService; + + /** + * @return FonctionService + */ + public function getFonctionService() + { + return $this->fonctionService; + } + + /** + * @param FonctionService $fonctionService + * @return FonctionService + */ + public function setFonctionService($fonctionService) + { + $this->fonctionService = $fonctionService; + return $this->fonctionService; + } + + +} \ No newline at end of file diff --git a/src/Octopus/Service/Fonction/FonctionServiceFactory.php b/src/Octopus/Service/Fonction/FonctionServiceFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..e2f080aa77df96957818cb08f3e23ef8997f9a44 --- /dev/null +++ b/src/Octopus/Service/Fonction/FonctionServiceFactory.php @@ -0,0 +1,20 @@ +<?php + +namespace Octopus\Service\Fonction; + +use Doctrine\ORM\EntityManager; +use Zend\ServiceManager\ServiceLocatorInterface; + +class FonctionServiceFactory { + + public function __invoke(ServiceLocatorInterface $serviceLocator) + { + /** @var EntityManager $entityManager */ + $entityManager = $serviceLocator->get('doctrine.entitymanager.orm_octopus'); + + /** @var FonctionService $service */ + $service = new FonctionService(); + $service->setEntityManager($entityManager); + return $service; + } +} \ No newline at end of file diff --git a/src/Octopus/Service/Geographie/GeographieServiceAwareTrait.php b/src/Octopus/Service/Geographie/GeographieServiceAwareTrait.php index 829ee8f4c83ad2a23350dc4a9d24eba71a3e42a1..503673eb2795fa74da08ab6d252e46b10b1c8b9b 100644 --- a/src/Octopus/Service/Geographie/GeographieServiceAwareTrait.php +++ b/src/Octopus/Service/Geographie/GeographieServiceAwareTrait.php @@ -16,7 +16,7 @@ trait GeographieServiceAwareTrait { } /** - * @param GeopgraphieService $geographieService + * @param GeographieService $geographieService * @return GeographieService */ public function setGeographieService($geographieService) diff --git a/view/octopus/octopus/index.phtml b/view/octopus/octopus/index.phtml index c6c83f611f4a9f948217c8f56e40fddc6338330c..f211f738ef4a48ffdddf21a17738b5a5edd15b40 100644 --- a/view/octopus/octopus/index.phtml +++ b/view/octopus/octopus/index.phtml @@ -11,6 +11,10 @@ * * @var \Octopus\Entity\Db\Individu[] $individus * + * @var \Octopus\Entity\Db\Fonction[] $fonctions + * @var \Octopus\Entity\Db\FonctionLibelle[] $fonctionsLibelles + * @var \Octopus\Entity\Db\FonctionType[] $fonctionsTypes + * * @var \Octopus\Entity\Db\Pays[] $pays */ @@ -82,6 +86,117 @@ use UnicaenApp\Form\Element\SearchAndSelect; </table> </div> +<div class="main"> + <h2> FonctionService</h2> + + <h3> + Fonction + <span class="badge"> + <?php echo (count($fonctions) > 500)?"500+":count($fonctions); ?> + </span> + </h3> + + <table class="table table-condensed"> + <thead> + <tr> + <th> Code </th> + <th> Type </th> + <th> Niveau </th> + <th> Parent</th> + <th> Enfants</th> + <th> Libellés </th> + </tr> + </thead> + <tbody> + <?php foreach ($fonctions as $fonction) :?> + <tr> + <td> <?php echo $fonction->getCode(); ?></td> + <td> <?php echo $fonction->getType()->getLibelle(); ?></td> + <td> <?php echo $fonction->getNiveau(); ?></td> + <td> + <?php echo ($fonction->getParent())?$fonction->getParent()->getCode():"---"; ?> </td> + <td> + <ul> + <?php foreach ($fonction->getEnfants() as $enfant) : ?> + <li> <?php echo $enfant->getCode(); ?> </li> + <?php endforeach; ?> + </ul> + </td> + <td> + <ul> + <?php foreach ($fonction->getLibelles() as $libelle) : ?> + <li> + <span class="badge" style="width:2em;background-color: <?php echo ($libelle->getDefault())?"green":"stalegray"; ?>;"> + <?php echo $libelle->getGenre(); ?> + </span> + <?php echo $libelle->getLibelle(); ?> + </li> + <?php endforeach; ?> + </ul> + </td> + </tr> + <?php endforeach; ?> + </tbody> + + </table> + + <h3> + FonctionLibelle + <span class="badge"> + <?php echo (count($fonctionsLibelles) > 500)?"500+":count($fonctionsLibelles); ?> + </span> + </h3> + + <table class="table table-condensed"> + <thead> + <tr> + <th> Libelle </th> + <th> Fonction </th> + <th> Genre </th> + <th> Defaut</th> + </tr> + </thead> + <tbody> + <?php foreach ($fonctionsLibelles as $fonctionLibelle) :?> + <tr> + <td> <?php echo $fonctionLibelle->getLibelle(); ?></td> + <td> <?php echo $fonctionLibelle->getFonction()->getCode(); ?></td> + <td> <?php echo $fonctionLibelle->getGenre(); ?></td> + <td> <?php echo $fonctionLibelle->getDefault(); ?></td> + </tr> + <?php endforeach; ?> + </tbody> + + </table> + + <h3> + FonctionType + <span class="badge"> + <?php echo (count($fonctionsTypes) > 500)?"500+":count($fonctionsTypes); ?> + </span> + </h3> + + <table class="table table-condensed"> + <thead> + <tr> + <th> Nom </th> + <th> Libelle </th> + <th> Description </th> + </tr> + </thead> + <tbody> + <?php foreach ($fonctionsTypes as $fonctionType) :?> + <tr> + <td> <?php echo $fonctionType->getNom(); ?></td> + <td> <?php echo $fonctionType->getLibelle(); ?></td> + <td> <?php echo $fonctionType->getDescription(); ?></td> + </tr> + <?php endforeach; ?> + </tbody> + + </table> +</div> + <div class="main"> <h2> StructureService </h2>