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

Calcul cohabitant avec l'inport des chaines hiearchiques

parent 511d3d52
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -4,6 +4,10 @@ namespace Application;

use Application\Controller\AgentHierarchieController;
use Application\Controller\AgentHierarchieControllerFactory;
use Application\Form\AgentHierarchieCalcul\AgentHierarchieCalculForm;
use Application\Form\AgentHierarchieCalcul\AgentHierarchieCalculFormFactory;
use Application\Form\AgentHierarchieCalcul\AgentHierarchieCalculHydrator;
use Application\Form\AgentHierarchieCalcul\AgentHierarchieCalculHydratorFactory;
use Application\Form\AgentHierarchieImportation\AgentHierarchieImportationForm;
use Application\Form\AgentHierarchieImportation\AgentHierarchieImportationFormFactory;
use Application\Form\AgentHierarchieImportation\AgentHierarchieImportationHydrator;
@@ -29,6 +33,7 @@ return [
                        'index',
                        'afficher',
                        'importer',
                        'calculer',
                    ],
                    'privileges' => [
                        AgentPrivileges::AGENT_INDEX, //todo "Faites mieux !!!"
@@ -78,6 +83,18 @@ return [
                                ],
                                'may_terminate' => true,
                            ],
                            'calculer' => [
                                'type'  => Literal::class,
                                'options' => [
                                    'route'    => '/calculer',
                                    'defaults' => [
                                        /** @see AgentHierarchieController::calculerAction() */
                                        'controller' => AgentHierarchieController::class,
                                        'action'     => 'calculer',
                                    ],
                                ],
                                'may_terminate' => true,
                            ],
                        ],
                    ],
                ],
@@ -98,11 +115,13 @@ return [
    ],
    'form_elements' => [
        'factories' => [
            AgentHierarchieCalculForm::class => AgentHierarchieCalculFormFactory::class,
            AgentHierarchieImportationForm::class => AgentHierarchieImportationFormFactory::class,
        ],
    ],
    'hydrators' => [
        'factories' => [
            AgentHierarchieCalculHydrator::class => AgentHierarchieCalculHydratorFactory::class,
            AgentHierarchieImportationHydrator::class => AgentHierarchieImportationHydratorFactory::class,
        ],
    ],
+75 −0
Original line number Diff line number Diff line
@@ -4,18 +4,22 @@ namespace Application\Controller;

use Application\Entity\Db\AgentAutorite;
use Application\Entity\Db\AgentSuperieur;
use Application\Form\AgentHierarchieCalcul\AgentHierarchieCalculFormAwareTrait;
use Application\Form\AgentHierarchieImportation\AgentHierarchieImportationFormAwareTrait;
use Application\Service\Agent\AgentServiceAwareTrait;
use Application\Service\AgentAutorite\AgentAutoriteServiceAwareTrait;
use Application\Service\AgentSuperieur\AgentSuperieurServiceAwareTrait;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Structure\Service\Structure\StructureServiceAwareTrait;

class AgentHierarchieController extends AbstractActionController
{
    use AgentServiceAwareTrait;
    use AgentAutoriteServiceAwareTrait;
    use AgentSuperieurServiceAwareTrait;
    use StructureServiceAwareTrait;
    use AgentHierarchieCalculFormAwareTrait;
    use AgentHierarchieImportationFormAwareTrait;

    public function indexAction() : ViewModel
@@ -124,4 +128,75 @@ class AgentHierarchieController extends AbstractActionController
        return $vm;
    }

    public function calculerAction() : ViewModel
    {
        $form = $this->getAgentHierarchieCalculForm();
        $form->setAttribute('action', $this->url()->fromRoute('agent/hierarchie/calculer', ['mode' => 'preview', 'structure' => null], [], true));

        $request = $this->getRequest();
        if ($request->isPost()) {
            $error = [];
            $data = $request->getPost();

            $mode = $data['mode'];
            $structureId = $data['structure'];

            $structure = $this->getStructureService()->getStructure($structureId);
            $structures = $this->getStructureService()->getStructuresFilles($structure, true);
            $agents = $this->getAgentService()->getAgentsByStructures($structures);

            $superieurs = [];
            $autorites = [];
            foreach ($agents as $agent) {
                $superieurs[$agent->getId()] = $this->getAgentService()->computeSuperieures($agent);
                $autorites[$agent->getId()] = $this->getAgentService()->computeAutorites($agent, $superieurs[$agent->getId()]);
            }

            if ($mode === 'compute' AND empty($error)) {
                $warning = [];
                foreach ($agents as $agent) {
                    $this->getAgentAutoriteService()->historiseAll($agent);
                    if (empty($autorites[$agent->getId()])) {
                        $warning[] = "Aucune autorité n'a pu être déterminée pour ".$agent->getDenomination();
                    } else {
                        foreach ($autorites[$agent->getId()] as $autorite) {
                            $this->getAgentAutoriteService()->createAgentAutorite($agent, $autorite);
                        }
                    }
                    $this->getAgentSuperieurService()->historiseAll($agent);
                    if (empty($superieurs[$agent->getId()])) {
                        $warning[] = "Aucun supérieur n'a pu être déterminée pour ".$agent->getDenomination();
                    } else {
                        foreach ($superieurs[$agent->getId()] as $superieur) {
                            $this->getAgentSuperieurService()->createAgentSuperieur($agent, $superieur);
                        }
                    }
                }
            }


            if ($mode !== 'compute') {
                $title = "Calcul de chaînes hiérarchiques (Prévisualisation)";
            }
            if ($mode === 'compute') {
                $title = "Calcul de chaînes hiérarchiques (Importation)";
            }
            return new ViewModel([
                'title' => $title,
                'form' => $form,
                'structure' => $structure,
                'agents' => $agents,
                'superieurs' => $superieurs,
                'autorites' => $autorites,
                'error' => $error,
                'warning' => $warning,
            ]);
        }

        return new ViewModel([
            'title' => "Calcul de chaînes hiérarchiques",
            'form' => $form,
        ]);
    }

}
 No newline at end of file
+8 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
namespace Application\Controller;

use Application\Entity\Db\AgentAutorite;
use Application\Form\AgentHierarchieCalcul\AgentHierarchieCalculForm;
use Application\Form\AgentHierarchieImportation\AgentHierarchieImportationForm;
use Application\Service\Agent\AgentService;
use Application\Service\AgentAutorite\AgentAutoriteService;
@@ -10,6 +11,7 @@ use Application\Service\AgentSuperieur\AgentSuperieurService;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
use Structure\Service\Structure\StructureService;

class AgentHierarchieControllerFactory
{
@@ -26,20 +28,26 @@ class AgentHierarchieControllerFactory
         * @var AgentService $agentService
         * @var AgentAutoriteService $agentAutoriteService
         * @var AgentSuperieurService $agentSuperieurService
         * @var StructureService $structureService
         */
        $agentService = $container->get(AgentService::class);
        $agentAutoriteService = $container->get(AgentAutoriteService::class);
        $agentSuperieurService = $container->get(AgentSuperieurService::class);
        $structureService = $container->get(StructureService::class);

        /**
         * @var AgentHierarchieImportationForm $importationForm
         * @var AgentHierarchieCalculForm $calculForm
         */
        $importationForm = $container->get('FormElementManager')->get(AgentHierarchieImportationForm::class);
        $calculForm = $container->get('FormElementManager')->get(AgentHierarchieCalculForm::class);

        $controller = new AgentHierarchieController();
        $controller->setAgentService($agentService);
        $controller->setAgentAutoriteService($agentAutoriteService);
        $controller->setAgentSuperieurService($agentSuperieurService);
        $controller->setStructureService($structureService);
        $controller->setAgentHierarchieCalculForm($calculForm);
        $controller->setAgentHierarchieImportationForm($importationForm);
        return $controller;
    }
+66 −0
Original line number Diff line number Diff line
<?php

namespace Application\Form\AgentHierarchieCalcul;

use Laminas\Form\Element\Button;
use Laminas\Form\Element\File;
use Laminas\Form\Element\Select;
use Laminas\Form\Form;
use Laminas\InputFilter\Factory;
use Structure\Service\Structure\StructureServiceAwareTrait;

class AgentHierarchieCalculForm extends Form {
    use StructureServiceAwareTrait;

    public function init()
    {
        $this->add([
            'type' => Select::class,
            'name' => 'structure',
            'options' => [
                'label' => 'Structure  <span class="icon icon-asterisque" title="Champ obligatoire"></span> :',
                'label_options' => [ 'disable_html_escape' => true, ],
                'value_options' => $this->getStructureService()->getStructuresAsOptions(),
            ],
            'attributes' => [
                'id' => 'structure',
                'class'             => 'bootstrap-selectpicker',
                'data-live-search' => 'true'
            ],
        ]);
        //mode
        $this->add([
            'type' => Select::class,
            'name' => 'mode',
            'options' => [
                'label' => 'Mode  <span class="icon icon-asterisque" title="Champ obligatoire"></span> :',
                'label_options' => [ 'disable_html_escape' => true, ],
                'value_options' => [
                    'preview' => "Prévisualisation",
                    'compute' => "Calcul",
                ]
            ],
            'attributes' => [
                'id' => 'mode',
            ],
        ]);
        //Submit
        $this->add([
            'type' => Button::class,
            'name' => 'creer',
            'options' => [
                'label' => 'Traiter le ficher',
                'label_options' => [ 'disable_html_escape' => true, ],
            ],
            'attributes' => [
                'type' => 'submit',
                'class' => 'btn btn-primary',
            ],
        ]);

        $this->setInputFilter((new Factory())->createInputFilter([
            'fichier' => [ 'required' => true,  ],
            'mode'  => ['required' => true, ],
        ]));
    }
}
 No newline at end of file
+19 −0
Original line number Diff line number Diff line
<?php

namespace Application\Form\AgentHierarchieCalcul;

trait AgentHierarchieCalculFormAwareTrait {

    private AgentHierarchieCalculForm $agentHierarchieCalculForm;

    public function getAgentHierarchieCalculForm(): AgentHierarchieCalculForm
    {
        return $this->agentHierarchieCalculForm;
    }

    public function setAgentHierarchieCalculForm(AgentHierarchieCalculForm $agentHierarchieCalculForm): void
    {
        $this->agentHierarchieCalculForm = $agentHierarchieCalculForm;
    }

}
 No newline at end of file
Loading