Loading module/Application/src/Application/Service/Agent/AgentService.php +37 −0 Changes for module/Application/src/Application/Service/Agent/AgentService.php: 37 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -725,4 +725,41 @@ class AgentService { $result = $qb->getQuery()->getResult(); return $result; } /** ATTENTION PEUT-ÊTRE REDONDANT !!! */ /** * @param array $structures * @param DateTime|null $dateTime * @return array */ public function getAgentsByStructuresAndDate(array $structures, ?DateTime $date = null) : array { if ($date === null) $date = new DateTime(); //extractions de la liste des agents ... $qb = $this->getEntityManager()->getRepository(Agent::class)->createQueryBuilder('agent') ->join('agent.affectations', 'affectation') ->andWhere('affectation.dateFin IS NULL OR affectation.dateDebut <= :date') ->andWhere('affectation.dateFin IS NULL OR affectation.dateFin >= :date')->setParameter('date', $date) ->andWhere('affectation.structure in (:structures)')->setParameter('structures', $structures) ; $liste = $qb->getQuery()->getResult(); $ids = []; foreach ($liste as $item) { $ids[] = $item->getId(); } $qb = $this->getEntityManager()->getRepository(Agent::class)->createQueryBuilder('agent') ->join('agent.affectations', 'affectation')->addSelect('affectation') ->join('agent.grades', 'grade')->addSelect('grade') ->join('agent.statuts', 'statut')->addSelect('statut') ->andWhere('agent.id in (:ids)')->setParameter('ids',$ids) ->orderBy('agent.nomUsuel, agent.prenom', 'ASC') ; $agents = $qb->getQuery()->getResult(); return $agents; } } No newline at end of file module/EntretienProfessionnel/config/merged/campagne.config.php +21 −1 Changes for module/EntretienProfessionnel/config/merged/campagne.config.php: 21 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -11,6 +11,8 @@ use EntretienProfessionnel\Form\Campagne\CampagneHydratorFactory; use EntretienProfessionnel\Provider\Privilege\CampagnePrivileges; use EntretienProfessionnel\Service\Campagne\CampagneService; use EntretienProfessionnel\Service\Campagne\CampagneServiceFactory; use EntretienProfessionnel\View\Helper\CampagneAvancementViewHelper; use EntretienProfessionnel\View\Helper\CampagneInformationViewHelper; use UnicaenPrivilege\Guard\PrivilegeController; use Laminas\Router\Http\Literal; use Laminas\Router\Http\Segment; Loading @@ -24,6 +26,7 @@ return [ 'action' => [ 'index', 'afficher', 'structure', //todo vrai privilege et assertion ... ], 'privileges' => [ CampagnePrivileges::CAMPAGNE_AFFICHER, Loading Loading @@ -107,6 +110,17 @@ return [ ], ], ], 'structure' => [ 'type' => Segment::class, 'may_terminate' => true, 'options' => [ 'route' => '/structure/:campagne/:structure', 'defaults' => [ 'controller' => CampagneController::class, 'action' => 'structure', ], ], ], 'modifier' => [ 'type' => Segment::class, 'may_terminate' => true, Loading Loading @@ -177,6 +191,12 @@ return [ 'factories' => [ CampagneHydrator::class => CampagneHydratorFactory::class, ], ] ], 'view_helpers' => [ 'invokables' => [ 'campagneInformation' => CampagneInformationViewHelper::class, 'campagneAvancement' => CampagneAvancementViewHelper::class, ], ], ]; No newline at end of file module/EntretienProfessionnel/src/EntretienProfessionnel/Controller/CampagneController.php +71 −0 Changes for module/EntretienProfessionnel/src/EntretienProfessionnel/Controller/CampagneController.php: 71 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,10 +2,15 @@ namespace EntretienProfessionnel\Controller; use Application\Entity\Db\Agent; use Application\Service\Agent\AgentServiceAwareTrait; use DateInterval; use EntretienProfessionnel\Entity\Db\Campagne; use EntretienProfessionnel\Form\Campagne\CampagneFormAwareTrait; use EntretienProfessionnel\Provider\Etat\EntretienProfessionnelEtats; use EntretienProfessionnel\Service\Campagne\CampagneService; use EntretienProfessionnel\Service\Campagne\CampagneServiceAwareTrait; use EntretienProfessionnel\Service\EntretienProfessionnel\EntretienProfessionnelServiceAwareTrait; use EntretienProfessionnel\Service\Evenement\RappelCampagneAvancementServiceAwareTrait; use EntretienProfessionnel\Service\Notification\NotificationServiceAwareTrait; use Laminas\Http\Request; Loading @@ -13,13 +18,17 @@ use Laminas\Http\Response; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\Mvc\Plugin\FlashMessenger\FlashMessenger; use Laminas\View\Model\ViewModel; use Structure\Service\Structure\StructureServiceAwareTrait; /** @method FlashMessenger flashMessenger() */ class CampagneController extends AbstractActionController { use AgentServiceAwareTrait; use CampagneServiceAwareTrait; use EntretienProfessionnelServiceAwareTrait; use NotificationServiceAwareTrait; use RappelCampagneAvancementServiceAwareTrait; use StructureServiceAwareTrait; use CampagneFormAwareTrait; public function indexAction() : ViewModel Loading Loading @@ -141,4 +150,66 @@ class CampagneController extends AbstractActionController { } return $vm; } /** * Action affichant une campagne d'entretien professionnel pour une structure * <!> les agents doivent être complétement hydrater sinon les calculs d'affectations, de grades et d'obligation seront erronés */ public function structureAction() : ViewModel { $campagne = $this->getCampagneService()->getRequestedCampagne($this); $structure = $this->getStructureService()->getRequestedStructure($this); $structures = $this->getStructureService()->getStructuresFilles($structure, true); $agentsAll = $this->getAgentService()->getAgentsByStructuresAndDate($structures, $campagne->getDateDebut()); /** Filtrage des agents (seul les agents ayants le statut adminstratif lors de la camapgne sont éligibles) */ $agents = []; /** @var Agent $agent */ foreach ($agentsAll as $agent) { $isAdministratif = false; $statuts = $agent->getStatutsActifs($campagne->getDateDebut()); foreach ($statuts as $statut) { if ($statut->isAdministratif()) { $isAdministratif = true; break; } } if ($isAdministratif) $agents[] = $agent; } $obligatoires = []; $facultatifs = []; $dateMinEnPoste = $campagne->getDateFin()->sub(new DateInterval('P12M')); foreach ($agents as $agent) { if (!empty($agent->getAffectationsActifs($dateMinEnPoste))) $obligatoires[] = $agent; else $facultatifs[] = $agent; } $entretiens = $this->getEntretienProfessionnelService()->getEntretienProfessionnelByCampagneAndAgents($campagne, $agents); $finalises = []; $encours = []; foreach ($entretiens as $entretien) { if ($entretien->getEtat()->getCode() === EntretienProfessionnelEtats::ENTRETIEN_VALIDATION_AGENT) { $finalises[] = $entretien; } else { $encours[] = $entretien; } } return new ViewModel([ 'campagne' => $campagne, 'structure' => $structure, 'structures' => $structures, 'agents' => $agents, 'entretiens' => $entretiens, 'encours' => $encours, 'finalises' => $finalises, 'dateMinEnPoste' => $dateMinEnPoste, 'obligatoires' => $obligatoires, 'facultatifs' => $facultatifs, ]); } } No newline at end of file module/EntretienProfessionnel/src/EntretienProfessionnel/Controller/CampagneControllerFactory.php +16 −0 Changes for module/EntretienProfessionnel/src/EntretienProfessionnel/Controller/CampagneControllerFactory.php: 16 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,29 +2,42 @@ namespace EntretienProfessionnel\Controller; use Application\Service\Agent\AgentService; use EntretienProfessionnel\Form\Campagne\CampagneForm; use EntretienProfessionnel\Service\Campagne\CampagneService; use EntretienProfessionnel\Service\EntretienProfessionnel\EntretienProfessionnelService; use EntretienProfessionnel\Service\Evenement\RappelCampagneAvancementService; use EntretienProfessionnel\Service\Notification\NotificationService; use Interop\Container\ContainerInterface; use Laminas\Mvc\Controller\AbstractActionController; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; use Structure\Service\Structure\StructureService; class CampagneControllerFactory extends AbstractActionController { /** * @param ContainerInterface $container * @return CampagneController * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function __invoke(ContainerInterface $container) : CampagneController { /** * @var AgentService $agentService * @var CampagneService $campagneService * @var EntretienProfessionnelService $entretienProfessionnelService * @var NotificationService $notificationService * @var RappelCampagneAvancementService $rappelCampagneAvancementService * @var StructureService $structureService */ $agentService = $container->get(AgentService::class); $campagneService = $container->get(CampagneService::class); $entretienProfessionnelService = $container->get(EntretienProfessionnelService::class); $notificationService = $container->get(NotificationService::class); $rappelCampagneAvancementService = $container->get(RappelCampagneAvancementService::class); $structureService = $container->get(StructureService::class); /** * @var CampagneForm $campagneForm Loading @@ -32,9 +45,12 @@ class CampagneControllerFactory extends AbstractActionController $campagneForm = $container->get('FormElementManager')->get(CampagneForm::class); $controller = new CampagneController(); $controller->setAgentService($agentService); $controller->setCampagneService($campagneService); $controller->setEntretienProfessionnelService($entretienProfessionnelService); $controller->setNotificationService($notificationService); $controller->setRappelCampagneAvancementService($rappelCampagneAvancementService); $controller->setStructureService($structureService); $controller->setCampagneForm($campagneForm); return $controller; } Loading module/EntretienProfessionnel/src/EntretienProfessionnel/View/Helper/CampagneAvancementViewHelper.php 0 → 100644 +29 −0 Changes for module/EntretienProfessionnel/src/EntretienProfessionnel/View/Helper/CampagneAvancementViewHelper.php: 29 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace EntretienProfessionnel\View\Helper; use Application\Entity\Db\Agent; use EntretienProfessionnel\Entity\Db\EntretienProfessionnel; use Laminas\View\Helper\AbstractHelper; use Laminas\View\Helper\Partial; use Laminas\View\Renderer\PhpRenderer; use Laminas\View\Resolver\TemplatePathStack; class CampagneAvancementViewHelper extends AbstractHelper { /** * @param EntretienProfessionnel[] $entretiens * @param Agent[] $agents * @param array $options * @return string|Partial */ public function __invoke(array $entretiens, array $agents,array $options = []) { /** @var PhpRenderer $view */ $view = $this->getView(); $view->resolver()->attach(new TemplatePathStack(['script_paths' => [__DIR__ . "/partial"]])); return $view->partial('campagne-avancement', ['entretiens' => $entretiens, 'agents' => $agents, 'options' => $options]); } } No newline at end of file Loading
module/Application/src/Application/Service/Agent/AgentService.php +37 −0 Changes for module/Application/src/Application/Service/Agent/AgentService.php: 37 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -725,4 +725,41 @@ class AgentService { $result = $qb->getQuery()->getResult(); return $result; } /** ATTENTION PEUT-ÊTRE REDONDANT !!! */ /** * @param array $structures * @param DateTime|null $dateTime * @return array */ public function getAgentsByStructuresAndDate(array $structures, ?DateTime $date = null) : array { if ($date === null) $date = new DateTime(); //extractions de la liste des agents ... $qb = $this->getEntityManager()->getRepository(Agent::class)->createQueryBuilder('agent') ->join('agent.affectations', 'affectation') ->andWhere('affectation.dateFin IS NULL OR affectation.dateDebut <= :date') ->andWhere('affectation.dateFin IS NULL OR affectation.dateFin >= :date')->setParameter('date', $date) ->andWhere('affectation.structure in (:structures)')->setParameter('structures', $structures) ; $liste = $qb->getQuery()->getResult(); $ids = []; foreach ($liste as $item) { $ids[] = $item->getId(); } $qb = $this->getEntityManager()->getRepository(Agent::class)->createQueryBuilder('agent') ->join('agent.affectations', 'affectation')->addSelect('affectation') ->join('agent.grades', 'grade')->addSelect('grade') ->join('agent.statuts', 'statut')->addSelect('statut') ->andWhere('agent.id in (:ids)')->setParameter('ids',$ids) ->orderBy('agent.nomUsuel, agent.prenom', 'ASC') ; $agents = $qb->getQuery()->getResult(); return $agents; } } No newline at end of file
module/EntretienProfessionnel/config/merged/campagne.config.php +21 −1 Changes for module/EntretienProfessionnel/config/merged/campagne.config.php: 21 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -11,6 +11,8 @@ use EntretienProfessionnel\Form\Campagne\CampagneHydratorFactory; use EntretienProfessionnel\Provider\Privilege\CampagnePrivileges; use EntretienProfessionnel\Service\Campagne\CampagneService; use EntretienProfessionnel\Service\Campagne\CampagneServiceFactory; use EntretienProfessionnel\View\Helper\CampagneAvancementViewHelper; use EntretienProfessionnel\View\Helper\CampagneInformationViewHelper; use UnicaenPrivilege\Guard\PrivilegeController; use Laminas\Router\Http\Literal; use Laminas\Router\Http\Segment; Loading @@ -24,6 +26,7 @@ return [ 'action' => [ 'index', 'afficher', 'structure', //todo vrai privilege et assertion ... ], 'privileges' => [ CampagnePrivileges::CAMPAGNE_AFFICHER, Loading Loading @@ -107,6 +110,17 @@ return [ ], ], ], 'structure' => [ 'type' => Segment::class, 'may_terminate' => true, 'options' => [ 'route' => '/structure/:campagne/:structure', 'defaults' => [ 'controller' => CampagneController::class, 'action' => 'structure', ], ], ], 'modifier' => [ 'type' => Segment::class, 'may_terminate' => true, Loading Loading @@ -177,6 +191,12 @@ return [ 'factories' => [ CampagneHydrator::class => CampagneHydratorFactory::class, ], ] ], 'view_helpers' => [ 'invokables' => [ 'campagneInformation' => CampagneInformationViewHelper::class, 'campagneAvancement' => CampagneAvancementViewHelper::class, ], ], ]; No newline at end of file
module/EntretienProfessionnel/src/EntretienProfessionnel/Controller/CampagneController.php +71 −0 Changes for module/EntretienProfessionnel/src/EntretienProfessionnel/Controller/CampagneController.php: 71 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,10 +2,15 @@ namespace EntretienProfessionnel\Controller; use Application\Entity\Db\Agent; use Application\Service\Agent\AgentServiceAwareTrait; use DateInterval; use EntretienProfessionnel\Entity\Db\Campagne; use EntretienProfessionnel\Form\Campagne\CampagneFormAwareTrait; use EntretienProfessionnel\Provider\Etat\EntretienProfessionnelEtats; use EntretienProfessionnel\Service\Campagne\CampagneService; use EntretienProfessionnel\Service\Campagne\CampagneServiceAwareTrait; use EntretienProfessionnel\Service\EntretienProfessionnel\EntretienProfessionnelServiceAwareTrait; use EntretienProfessionnel\Service\Evenement\RappelCampagneAvancementServiceAwareTrait; use EntretienProfessionnel\Service\Notification\NotificationServiceAwareTrait; use Laminas\Http\Request; Loading @@ -13,13 +18,17 @@ use Laminas\Http\Response; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\Mvc\Plugin\FlashMessenger\FlashMessenger; use Laminas\View\Model\ViewModel; use Structure\Service\Structure\StructureServiceAwareTrait; /** @method FlashMessenger flashMessenger() */ class CampagneController extends AbstractActionController { use AgentServiceAwareTrait; use CampagneServiceAwareTrait; use EntretienProfessionnelServiceAwareTrait; use NotificationServiceAwareTrait; use RappelCampagneAvancementServiceAwareTrait; use StructureServiceAwareTrait; use CampagneFormAwareTrait; public function indexAction() : ViewModel Loading Loading @@ -141,4 +150,66 @@ class CampagneController extends AbstractActionController { } return $vm; } /** * Action affichant une campagne d'entretien professionnel pour une structure * <!> les agents doivent être complétement hydrater sinon les calculs d'affectations, de grades et d'obligation seront erronés */ public function structureAction() : ViewModel { $campagne = $this->getCampagneService()->getRequestedCampagne($this); $structure = $this->getStructureService()->getRequestedStructure($this); $structures = $this->getStructureService()->getStructuresFilles($structure, true); $agentsAll = $this->getAgentService()->getAgentsByStructuresAndDate($structures, $campagne->getDateDebut()); /** Filtrage des agents (seul les agents ayants le statut adminstratif lors de la camapgne sont éligibles) */ $agents = []; /** @var Agent $agent */ foreach ($agentsAll as $agent) { $isAdministratif = false; $statuts = $agent->getStatutsActifs($campagne->getDateDebut()); foreach ($statuts as $statut) { if ($statut->isAdministratif()) { $isAdministratif = true; break; } } if ($isAdministratif) $agents[] = $agent; } $obligatoires = []; $facultatifs = []; $dateMinEnPoste = $campagne->getDateFin()->sub(new DateInterval('P12M')); foreach ($agents as $agent) { if (!empty($agent->getAffectationsActifs($dateMinEnPoste))) $obligatoires[] = $agent; else $facultatifs[] = $agent; } $entretiens = $this->getEntretienProfessionnelService()->getEntretienProfessionnelByCampagneAndAgents($campagne, $agents); $finalises = []; $encours = []; foreach ($entretiens as $entretien) { if ($entretien->getEtat()->getCode() === EntretienProfessionnelEtats::ENTRETIEN_VALIDATION_AGENT) { $finalises[] = $entretien; } else { $encours[] = $entretien; } } return new ViewModel([ 'campagne' => $campagne, 'structure' => $structure, 'structures' => $structures, 'agents' => $agents, 'entretiens' => $entretiens, 'encours' => $encours, 'finalises' => $finalises, 'dateMinEnPoste' => $dateMinEnPoste, 'obligatoires' => $obligatoires, 'facultatifs' => $facultatifs, ]); } } No newline at end of file
module/EntretienProfessionnel/src/EntretienProfessionnel/Controller/CampagneControllerFactory.php +16 −0 Changes for module/EntretienProfessionnel/src/EntretienProfessionnel/Controller/CampagneControllerFactory.php: 16 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,29 +2,42 @@ namespace EntretienProfessionnel\Controller; use Application\Service\Agent\AgentService; use EntretienProfessionnel\Form\Campagne\CampagneForm; use EntretienProfessionnel\Service\Campagne\CampagneService; use EntretienProfessionnel\Service\EntretienProfessionnel\EntretienProfessionnelService; use EntretienProfessionnel\Service\Evenement\RappelCampagneAvancementService; use EntretienProfessionnel\Service\Notification\NotificationService; use Interop\Container\ContainerInterface; use Laminas\Mvc\Controller\AbstractActionController; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; use Structure\Service\Structure\StructureService; class CampagneControllerFactory extends AbstractActionController { /** * @param ContainerInterface $container * @return CampagneController * @throws ContainerExceptionInterface * @throws NotFoundExceptionInterface */ public function __invoke(ContainerInterface $container) : CampagneController { /** * @var AgentService $agentService * @var CampagneService $campagneService * @var EntretienProfessionnelService $entretienProfessionnelService * @var NotificationService $notificationService * @var RappelCampagneAvancementService $rappelCampagneAvancementService * @var StructureService $structureService */ $agentService = $container->get(AgentService::class); $campagneService = $container->get(CampagneService::class); $entretienProfessionnelService = $container->get(EntretienProfessionnelService::class); $notificationService = $container->get(NotificationService::class); $rappelCampagneAvancementService = $container->get(RappelCampagneAvancementService::class); $structureService = $container->get(StructureService::class); /** * @var CampagneForm $campagneForm Loading @@ -32,9 +45,12 @@ class CampagneControllerFactory extends AbstractActionController $campagneForm = $container->get('FormElementManager')->get(CampagneForm::class); $controller = new CampagneController(); $controller->setAgentService($agentService); $controller->setCampagneService($campagneService); $controller->setEntretienProfessionnelService($entretienProfessionnelService); $controller->setNotificationService($notificationService); $controller->setRappelCampagneAvancementService($rappelCampagneAvancementService); $controller->setStructureService($structureService); $controller->setCampagneForm($campagneForm); return $controller; } Loading
module/EntretienProfessionnel/src/EntretienProfessionnel/View/Helper/CampagneAvancementViewHelper.php 0 → 100644 +29 −0 Changes for module/EntretienProfessionnel/src/EntretienProfessionnel/View/Helper/CampagneAvancementViewHelper.php: 29 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace EntretienProfessionnel\View\Helper; use Application\Entity\Db\Agent; use EntretienProfessionnel\Entity\Db\EntretienProfessionnel; use Laminas\View\Helper\AbstractHelper; use Laminas\View\Helper\Partial; use Laminas\View\Renderer\PhpRenderer; use Laminas\View\Resolver\TemplatePathStack; class CampagneAvancementViewHelper extends AbstractHelper { /** * @param EntretienProfessionnel[] $entretiens * @param Agent[] $agents * @param array $options * @return string|Partial */ public function __invoke(array $entretiens, array $agents,array $options = []) { /** @var PhpRenderer $view */ $view = $this->getView(); $view->resolver()->attach(new TemplatePathStack(['script_paths' => [__DIR__ . "/partial"]])); return $view->partial('campagne-avancement', ['entretiens' => $entretiens, 'agents' => $agents, 'options' => $options]); } } No newline at end of file