Commit 07b434db authored by Jean-Philippe Metivier's avatar Jean-Philippe Metivier
Browse files

Nouvelle page de gestion des entrtiens d'une campagne

parent ab2d7e53
Loading
Loading
Loading
Loading
+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
@@ -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
+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
@@ -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;
@@ -24,6 +26,7 @@ return [
                    'action' => [
                        'index',
                        'afficher',
                        'structure', //todo vrai privilege et assertion ...
                    ],
                    'privileges' => [
                        CampagnePrivileges::CAMPAGNE_AFFICHER,
@@ -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,
@@ -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
+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
@@ -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;
@@ -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
@@ -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
+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
@@ -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
@@ -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;
    }
+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