From 114edb2fc45dbecfb71411a1ea8c515df9d91abc Mon Sep 17 00:00:00 2001
From: Jean-Philippe Metivier <jean-philippe.metivier@unicaen.fr>
Date: Thu, 9 May 2019 16:30:04 +0200
Subject: [PATCH] =?UTF-8?q?derni=C3=A8re=20modification=20avant=20changeme?=
 =?UTF-8?q?nt=20import?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../config/merged/agent.config.php            |  3 +
 .../Application/config/merged/menu.config.php |  2 +-
 .../Controller/Agent/AgentController.php      | 11 ++++
 .../Controller/IndexController.php            |  2 +
 .../src/Application/Entity/Db/Agent.php       | 46 +++++++++++++++
 .../src/Application/Entity/Db/AgentStatut.php | 29 ++++++++--
 .../Application.Entity.Db.Agent.dcm.xml       |  3 +
 .../Application.Entity.Db.AgentStatut.dcm.xml | 58 +++++++++----------
 .../View/Helper/AgentStatutViewHelper.php     | 52 +++++++++++++++++
 .../View/Helper/AgentViewHelper.php           |  4 ++
 .../View/Helper/FicheTypeViewHelper.php       |  1 -
 11 files changed, 171 insertions(+), 40 deletions(-)
 create mode 100644 module/Application/src/Application/View/Helper/AgentStatutViewHelper.php

diff --git a/module/Application/config/merged/agent.config.php b/module/Application/config/merged/agent.config.php
index d72461752..76525d7f3 100644
--- a/module/Application/config/merged/agent.config.php
+++ b/module/Application/config/merged/agent.config.php
@@ -7,6 +7,7 @@ use Application\Controller\Agent\AgentControllerFactory;
 use Application\Controller\AgentFichier\AgentFichierController;
 use Application\Controller\AgentFichier\AgentFichierControllerFactory;
 use Application\Controller\EntretienProfessionnel\EntretienProfessionnelController;
+use Application\Entity\Db\AgentStatut;
 use Application\Form\Agent\AgentForm;
 use Application\Form\Agent\AgentFormFactory;
 use Application\Form\Agent\AgentHydrator;
@@ -16,6 +17,7 @@ use Application\Form\Agent\AgentImportFormFactory;
 use Application\Provider\Privilege\AgentPrivileges;
 use Application\Service\Agent\AgentService;
 use Application\Service\Agent\AgentServiceFactory;
+use Application\View\Helper\AgentStatutViewHelper;
 use Application\View\Helper\AgentViewHelper;
 use UnicaenAuth\Guard\PrivilegeController;
 use Zend\Mvc\Router\Http\Literal;
@@ -222,6 +224,7 @@ return [
     'view_helpers' => [
         'invokables' => [
             'agent' => AgentViewHelper::class,
+            'agentStatut' => AgentStatutViewHelper::class,
         ],
     ],
 
diff --git a/module/Application/config/merged/menu.config.php b/module/Application/config/merged/menu.config.php
index ef20f69eb..77a1d7d35 100644
--- a/module/Application/config/merged/menu.config.php
+++ b/module/Application/config/merged/menu.config.php
@@ -199,7 +199,7 @@ return [
                                 'route' => 'activite',
                                 'privileges' => ActivitePrivileges::AFFICHER,
                                 'dropdown-header' => true,
-                                'icon' => 'fas fa-angle-right'
+                                'icon' => 'fas fa-angle-right',
                             ],
                             [
                                 'label' => 'Les agents',
diff --git a/module/Application/src/Application/Controller/Agent/AgentController.php b/module/Application/src/Application/Controller/Agent/AgentController.php
index ccf818b35..b36ba1ec5 100644
--- a/module/Application/src/Application/Controller/Agent/AgentController.php
+++ b/module/Application/src/Application/Controller/Agent/AgentController.php
@@ -106,6 +106,17 @@ class AgentController extends AbstractActionController
         return $this->redirect()->toRoute('agent', [], [], true);
     }
 
+    public function afficherStatutsAction()
+    {
+        $agent   = $this->getAgentService()->getRequestedAgent($this, 'agent');
+        $statuts = $agent->getStatuts();
+
+        return new ViewModel([
+            'title' => 'Statuts de l\'agent '.$agent->getDenomination(),
+            'status' => $statuts,
+        ]);
+    }
+
     public function importerAction()
     {
         $form = $this->getAgentImportForm();
diff --git a/module/Application/src/Application/Controller/IndexController.php b/module/Application/src/Application/Controller/IndexController.php
index 95e82e535..1a3869c78 100755
--- a/module/Application/src/Application/Controller/IndexController.php
+++ b/module/Application/src/Application/Controller/IndexController.php
@@ -41,6 +41,8 @@ class IndexController extends AbstractActionController
         }
 
         $identity = $this->getUserService()->getConnectedUser();
+        if ($identity) {
+        }
 
         // !TODO bouger cela pour faire plus propre ...
         $agent = $this->getAgentService()->getAgentByUser($identity);
diff --git a/module/Application/src/Application/Entity/Db/Agent.php b/module/Application/src/Application/Entity/Db/Agent.php
index b81f63846..3cce04995 100644
--- a/module/Application/src/Application/Entity/Db/Agent.php
+++ b/module/Application/src/Application/Entity/Db/Agent.php
@@ -29,6 +29,8 @@ class Agent {
     private $quotite;
     /** @var AgentStatus */
     private $status;
+    /** @var ArrayCollection (AgentStatut)*/
+    private $statuts;
     /** @var Correspondance */
     private $correspondance;
     /** @var Corps */
@@ -47,6 +49,7 @@ class Agent {
 
     public function __construct()
     {
+        $this->statuts  = new ArrayCollection();
         $this->fichiers = new ArrayCollection();
     }
     /**
@@ -170,6 +173,34 @@ class Agent {
         return $this;
     }
 
+    /**
+     * @return AgentStatut[]
+     */
+    public function getStatuts()
+    {
+        return $this->statuts->toArray();
+    }
+
+    /**
+     * @param AgentStatut $statut
+     * @return Agent
+     */
+    public function addStatut($statut)
+    {
+        $this->statuts->add($statut);
+        return $this;
+    }
+
+    /**
+     * @param AgentStatut $statut
+     * @return Agent
+     */
+    public function removeStatut($statut)
+    {
+        $this->statuts->removeElement($statut);
+        return $this;
+    }
+
     /**
      * @return Correspondance
      */
@@ -336,4 +367,19 @@ class Agent {
         }
         return $result;
     }
+
+    /**
+     * @return AgentStatut[]
+     */
+    public function getStatutsActifs()
+    {
+        $statutsActifs = [];
+        foreach ($this->statuts as $statut) {
+            if ($statut->isActif()) {
+                $statutsActifs[] = $statut;
+            }
+        }
+
+        return $statutsActifs;
+    }
 }
\ No newline at end of file
diff --git a/module/Application/src/Application/Entity/Db/AgentStatut.php b/module/Application/src/Application/Entity/Db/AgentStatut.php
index 7aeb723be..0462b31cd 100644
--- a/module/Application/src/Application/Entity/Db/AgentStatut.php
+++ b/module/Application/src/Application/Entity/Db/AgentStatut.php
@@ -3,6 +3,8 @@
 namespace Application\Entity\Db;
 
 use DateTime;
+use Exception;
+use UnicaenApp\Exception\RuntimeException;
 
 class AgentStatut {
     /** @var integer */
@@ -45,8 +47,8 @@ class AgentStatut {
     /** @var boolean */
     private $detacheIn;
     /** @var boolean */
-    private $detacheOut
-    /** @var boolean */;
+    private $detacheOut;
+    /** @var boolean */
     private $dispo;
     /** @var boolean */
     private $heberge;
@@ -416,15 +418,15 @@ class AgentStatut {
     }
 
     /**
-     * @return mixed
+     * @return boolean
      */
-    public function getDispo()
+    public function isDispo()
     {
         return $this->dispo;
     }
 
     /**
-     * @param mixed $dispo
+     * @param boolean $dispo
      * @return AgentStatut
      */
     public function setDispo($dispo)
@@ -487,5 +489,20 @@ class AgentStatut {
         return $this;
     }
 
-    
+    /**
+     * @return bool
+     */
+    public function isActif()
+    {
+        if ($this->fin === null) return true;
+
+        try {
+            $today = new DateTime();
+        } catch (Exception $e) {
+            throw new RuntimeException('Problème de récupération de la date');
+
+        }
+        return $today < $this->fin;
+    }
+
 }
\ No newline at end of file
diff --git a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.Agent.dcm.xml b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.Agent.dcm.xml
index ad1c91049..c1113ad50 100644
--- a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.Agent.dcm.xml
+++ b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.Agent.dcm.xml
@@ -17,6 +17,9 @@
         <many-to-one target-entity="Application\Entity\Db\AgentStatus" field="status">
             <join-column name="status" referenced-column-name="id" />
         </many-to-one>
+
+        <one-to-many target-entity="Application\Entity\Db\AgentStatut" mapped-by="agent" field="statuts"/>
+
         <many-to-one target-entity="Application\Entity\Db\Correspondance" field="correspondance">
             <join-column name="correspondance" referenced-column-name="id" />
         </many-to-one>
diff --git a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.AgentStatut.dcm.xml b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.AgentStatut.dcm.xml
index ad1c91049..312ed26aa 100644
--- a/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.AgentStatut.dcm.xml
+++ b/module/Application/src/Application/Entity/Db/Mapping/Application.Entity.Db.AgentStatut.dcm.xml
@@ -1,46 +1,40 @@
 <?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="Application\Entity\Db\Agent" table="agent">
+    <entity name="Application\Entity\Db\AgentStatut" table="agent_statut">
 
         <id name="id" type="integer" column="id">
             <generator strategy="IDENTITY"/>
         </id>
 
-        <field name="nom"               type="string" length="256"      column="nom_usuel"                nullable="false"/>
-        <field name="prenom"            type="string" length="256"      column="prenom"                   nullable="false"/>
-        <field name="dateDebut"         type="datetime"                 column="date_debut"               nullable="true"/>
-        <field name="dateFin"           type="datetime"                 column="date_fin"                 nullable="true"/>
-        <field name="quotite"           type="integer"                  column="quotite"                  nullable="true"/>
-        <field name="numeroPoste"       type="string" length="256"      column="numero_poste"             nullable="true"/>
-        <field name="missionsComplementaires"       type="string" length="2048"      column="missions_complementaires"             nullable="true"/>
+        <field name="sourceName"        type="string" length="64"       column="source_name"              nullable="true"/>
+        <field name="sourceId"          type="integer"                  column="source_id"                nullable="true"/>
 
-        <many-to-one target-entity="Application\Entity\Db\AgentStatus" field="status">
-            <join-column name="status" referenced-column-name="id" />
+        <field name="idOrigine"         type="string" length="256"      column="id_origine"               nullable="true"/>
+        <many-to-one target-entity="Application\Entity\Db\Agent"  field="agent">
+            <join-column name="agent_id" referenced-column-name="id"/>
         </many-to-one>
-        <many-to-one target-entity="Application\Entity\Db\Correspondance" field="correspondance">
-            <join-column name="correspondance" referenced-column-name="id" />
-        </many-to-one>
-        <many-to-one target-entity="Application\Entity\Db\Corps" field="corps">
-            <join-column name="corps" referenced-column-name="id" />
-        </many-to-one>
-        <many-to-one target-entity="Application\Entity\Db\Grade" field="grade">
-            <join-column name="grade" referenced-column-name="id" />
+        <many-to-one target-entity="Application\Entity\Db\Structure"  field="structure">
+            <join-column name="structure_id" referenced-column-name="id"/>
         </many-to-one>
+        <field name="debut"         type="datetime"                     column="debut"                   nullable="false"/>
+        <field name="fin"           type="datetime"                     column="fin"                     nullable="true"/>
 
-        <many-to-many field="fichiers" target-entity="Fichier\Entity\Db\Fichier" inversed-by="fichier" fetch="LAZY">
-            <join-table name="agent_fichier">
-                <join-columns>
-                    <join-column name="agent" referenced-column-name="id"/>
-                </join-columns>
-                <inverse-join-columns>
-                    <join-column name="fichier" referenced-column-name="id"/>
-                </inverse-join-columns>
-            </join-table>
-        </many-to-many>
-
-        <many-to-one target-entity="Utilisateur\Entity\Db\User" field="utilisateur">
-            <join-column name="utilisateur" referenced-column-name="id" />
-        </many-to-one>
+        <field name="titulaire"     type="boolean"                      column="titulaire"               nullable="true"/>
+        <field name="cdi"           type="boolean"                      column="cdi"                     nullable="true"/>
+        <field name="cdd"           type="boolean"                      column="cdd"                     nullable="true"/>
+        <field name="vacataire"     type="boolean"                      column="vacataire"               nullable="true"/>
+        <field name="enseignant"    type="boolean"                      column="enseignant"              nullable="true"/>
+        <field name="administratif" type="boolean"                      column="administratif"           nullable="true"/>
+        <field name="chercheur"     type="boolean"                      column="chercheur"               nullable="true"/>
+        <field name="etudiant"      type="boolean"                      column="etudiant"                nullable="true"/>
+        <field name="auditeurLibre" type="boolean"                      column="auditeur_libre"          nullable="true"/>
+        <field name="doctorant"     type="boolean"                      column="doctorant"               nullable="true"/>
+        <field name="detacheIn"     type="boolean"                      column="detache_in"              nullable="true"/>
+        <field name="detacheOut"    type="boolean"                      column="detache_out"             nullable="true"/>
+        <field name="dispo"         type="boolean"                      column="dispo"                   nullable="true"/>
+        <field name="heberge"       type="boolean"                      column="heberge"                 nullable="true"/>
+        <field name="emerite"       type="boolean"                      column="emerite"                 nullable="true"/>
+        <field name="retraite"      type="boolean"                      column="retraite"                nullable="true"/>
 
     </entity>
 </doctrine-mapping>
diff --git a/module/Application/src/Application/View/Helper/AgentStatutViewHelper.php b/module/Application/src/Application/View/Helper/AgentStatutViewHelper.php
new file mode 100644
index 000000000..92cd89907
--- /dev/null
+++ b/module/Application/src/Application/View/Helper/AgentStatutViewHelper.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Application\View\Helper;
+
+use Application\Entity\Db\AgentStatut;
+use Zend\View\Helper\AbstractHelper;
+
+class AgentStatutViewHelper extends AbstractHelper
+{
+
+    /**
+     * @param AgentStatut $statut
+     * @return string
+     */
+    public function render($statut, $args = [])
+    {
+        $texte  = '';
+
+        $texte .= '<div style="border: solid grey 1px; margin: 2px; padding: 2px; border-radius: 5px;">';
+
+        if (!isset($args['show_id']) || $args['show_id'] !== false) $texte .= '<span class="badge">'. $statut->getIdOrigine(). '</span> ';
+        if (!isset($args['show_agent']) || $args['show_agent'] !== false) $texte .= '<span class="badge">'. $statut->getAgent()->getDenomination(). '</span> ';
+        if (!isset($args['show_structure']) || $args['show_structure'] == true) $texte .= '<span class="badge">'. $statut->getStructure()->getLibelleLong(). '</span> ';
+        $texte .= ($statut->getDebut())?$statut->getDebut()->format('d/m/Y'):'---';
+        $texte .= '&rarr;';
+        $texte .= ($statut->getFin())?$statut->getFin()->format('d/m/Y'):'---';
+
+        $texte .= '<ul>';
+        if ($statut->isTitulaire())         $texte .='<li>Titulaire</li>';
+        if ($statut->isCdi())               $texte .='<li>C.D.I.</li>';
+        if ($statut->isCdd())               $texte .='<li>C.D.D.</li>';
+        if ($statut->isVacataire())         $texte .='<li>Vacataire</li>';
+        if ($statut->isEnseignant())        $texte .='<li>Enseignant</li>';
+        if ($statut->isAdministratif())     $texte .='<li>Administratif</li>';
+        if ($statut->isChercheur())         $texte .='<li>Chercheur</li>';
+        if ($statut->isEtudiant())          $texte .='<li>Etudiant</li>';
+        if ($statut->isAuditeurLibre())     $texte .='<li>Auditeur libre</li>';
+        if ($statut->isDoctorant())         $texte .='<li>Doctorant</li>';
+        if ($statut->isDetacheIn())         $texte .='<li>Détaché (in)</li>';
+        if ($statut->isDetacheOut())        $texte .='<li>Détaché (out)</li>';
+        if ($statut->isDispo())             $texte .='<li>Disponibilité</li>';
+        if ($statut->isHeberge())           $texte .='<li>Hébergé</li>';
+        if ($statut->isEmerite())           $texte .='<li>Émerite</li>';
+        if ($statut->isRetraite())          $texte .='<li>Retraité</li>';
+        $texte .= '</ul>';
+
+        $texte .= '</div>';
+
+        return $texte;
+
+    }
+}
\ No newline at end of file
diff --git a/module/Application/src/Application/View/Helper/AgentViewHelper.php b/module/Application/src/Application/View/Helper/AgentViewHelper.php
index 719087412..edaf50e3d 100644
--- a/module/Application/src/Application/View/Helper/AgentViewHelper.php
+++ b/module/Application/src/Application/View/Helper/AgentViewHelper.php
@@ -49,6 +49,10 @@ class AgentViewHelper extends AbstractHelper
         $texte .= '<dd>'. $agent->getQuotite().'% </dd>';
         $texte .= '<dt> Status </dt>';
         $texte .= '<dd> '. $agent->getStatus() .'</dd>';
+        $texte .= '<dt> Statuts </dt> <br/>';
+        foreach ($agent->getStatutsActifs() as $statut) {
+            $texte .= '<dd> '. $this->getView()->agentStatut()->render($statut, ['show_agent' => false]) .'</dd>';
+        }
         $texte .= '<dt> Correspondance </dt>';
         $texte .= '<dd> '. $agent->getCorrespondance() .'</dd>';
         $texte .= '<dt> Corps </dt>';
diff --git a/module/Application/src/Application/View/Helper/FicheTypeViewHelper.php b/module/Application/src/Application/View/Helper/FicheTypeViewHelper.php
index 05f104fdd..4d42f63bb 100644
--- a/module/Application/src/Application/View/Helper/FicheTypeViewHelper.php
+++ b/module/Application/src/Application/View/Helper/FicheTypeViewHelper.php
@@ -2,7 +2,6 @@
 
 namespace Application\View\Helper;
 
-use Application\Entity\Db\Application;
 use Application\Entity\Db\FicheMetierType;
 use Application\Entity\Db\FicheMetierTypeActivite;
 use Zend\View\Helper\AbstractHelper;
-- 
GitLab