Skip to content
Snippets Groups Projects
Select Git revision
  • 18d1c3bcb1095aebe3a15e03ccad64465e447ac3
  • master default protected
  • update-min-openvox-version-07f8cb2
  • cleanup_fixtures
  • add-openvox
  • freebsd-14
  • remove-legacy-top-scope-syntax
  • rel430
  • tests
  • revert-363-augeas-module-cleanup
  • release-4.1.0
  • puppet8
  • relax-dependencies
  • rel400
  • mode
  • puppet7
  • release-3.1.0
  • freebsd13
  • freebsd11
  • stdlib
  • centos
  • v6.0.0
  • v5.1.0
  • v5.0.0
  • v4.5.0
  • v4.4.0
  • v4.3.0
  • v4.2.1
  • v4.2.0
  • v4.1.0
  • v4.0.0
  • v3.1.0
  • v3.0.0
  • v2.0.0
  • 1.12.0
  • 1.11.0
  • 1.10.0
  • 1.9.0
  • 1.8.0
  • 1.7.0
  • 1.6.0
41 results

mailman.pp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    SaisieController.php 10.86 KiB
    <?php
    
    namespace Mission\Controller;
    
    use Application\Controller\AbstractController;
    use Application\Entity\Db\Intervenant;
    use Application\Provider\Privilege\Privileges;
    use Application\Service\Traits\ContextServiceAwareTrait;
    use Application\Service\Traits\ValidationServiceAwareTrait;
    use Application\Service\Traits\WorkflowServiceAwareTrait;
    use Laminas\View\Model\JsonModel;
    use Laminas\View\Model\ViewModel;
    use Mission\Entity\Db\Mission;
    use Mission\Entity\Db\VolumeHoraireMission;
    use Mission\Form\MissionFormAwareTrait;
    use Mission\Form\MissionSuiviFormAwareTrait;
    use Mission\Service\MissionServiceAwareTrait;
    use Plafond\Processus\PlafondProcessusAwareTrait;
    use Service\Service\TypeVolumeHoraireServiceAwareTrait;
    use UnicaenVue\View\Model\AxiosModel;
    
    
    /**
     * Description of SaisieController
     *
     * @author Laurent Lécluse <laurent.lecluse at unicaen.fr>
     */
    class SaisieController extends AbstractController
    {
        use MissionServiceAwareTrait;
        use MissionFormAwareTrait;
        use ContextServiceAwareTrait;
        use ValidationServiceAwareTrait;
        use WorkflowServiceAwareTrait;
        use MissionSuiviFormAwareTrait;
        use TypeVolumeHoraireServiceAwareTrait;
        use PlafondProcessusAwareTrait;
    
        /**
         * Page d'index des missions
         *
         * @return array|\Laminas\View\Model\ViewModel
         */
        public function indexAction()
        {
            if ($this->params()->fromQuery('menu', false) !== false) { // pour gérer uniquement l'affichage du menu
                $menu = new ViewModel();
                $menu->setTemplate('application/intervenant/menu');
    
                return $menu;
            }
    
            /* @var $intervenant Intervenant */
            $intervenant = $this->getEvent()->getParam('intervenant');
    
            $canAddMission = $this->isAllowed(Privileges::getResourceId(Privileges::MISSION_EDITION));
    
            $typeVolumeHoraire = $this->getServiceTypeVolumeHoraire()->getPrevu();
    
            return compact('intervenant', 'canAddMission', 'typeVolumeHoraire');
        }
    
    
    
        /**
         * Retourne les données pour une mission
         *
         * @return JsonModel
         */
        public function getAction(?Mission $mission = null)
        {
            if (!$mission) {
                /** @var Mission $mission */
                $mission = $this->getEvent()->getParam('mission');
            }
    
            // Vidage du cache d'exécution Doctrine pour être sûr de bien filter les données de la mission
            $this->em()->clear();
    
            $model = $this->getServiceMission()->data(['mission' => $mission]);
            $model->returnFirstItem();
    
            return $model;
        }
    
    
    
        /**
         * Retourne la liste des missions
         *
         * @return JsonModel
         */
        public function listeAction()
        {
            /* @var $intervenant Intervenant */
            $intervenant = $this->getEvent()->getParam('intervenant');
    
            $model = $this->getServiceMission()->data(['intervenant' => $intervenant]);
    
            return $model;
        }
    
    
    
        /**
         * Ajoute une nouvelle mission (form)
         *
         * @return ViewModel
         */
        public function ajoutAction(): ViewModel
        {
            /** @var Intervenant $intervenant */
            $intervenant = $this->getEvent()->getParam('intervenant');
    
            $mission = $this->getServiceMission()->newEntity();
            $mission->setEntityManager($this->em());
            $mission->setIntervenant($intervenant);
    
            $canAutoValidate = $this->isAllowed($mission, Privileges::MISSION_AUTOVALIDATION);
    
            if ($canAutoValidate) $mission->setAutoValidation(true);
    
            return $this->saisieAction($mission);
        }
    
    
    
        /**
         * Modifie une mission (form)
         *
         * @param Mission|null $mission
         *
         * @return ViewModel
         */
        public function saisieAction(?Mission $mission = null): ViewModel
        {
            if (!$mission) {
                /** @var Mission $mission */
                $mission = $this->getEvent()->getParam('mission');
    
                $title = 'Modification d\'une mission';
            } else {
                $title = 'Ajout d\'une mission';
            }
    
            $form = $this->getFormMission();
    
            if ($mission->isValide()){
                $form->editValide();
            }
    
            if ($this->getServiceContext()->getStructure()) {
                $form->remove('structure');
                if (!$mission->getStructure()){
                    $mission->setStructure($this->getServiceContext()->getStructure());
                }
            }
    
            $hDeb = $mission->getHeures();
            $form->bindRequestSave($mission, $this->getRequest(), function ($mission) use($hDeb) {
                $typeVolumeHoraire = $this->getServiceTypeVolumeHoraire()->getPrevu();
                $this->getProcessusPlafond()->beginTransaction();
                try {
                    $this->getServiceMission()->save($mission);
                    $hFin = $mission->getHeures();
                    $this->updateTableauxBord($mission);
                    if (!$this->getProcessusPlafond()->endTransaction($mission, $typeVolumeHoraire, $hFin < $hDeb)) {
                        $this->updateTableauxBord($mission);
                    }else{
                        $this->flashMessenger()->addSuccessMessage('Mission bien enregistrée');
                    }
                } catch (\Exception $e) {
                    $this->flashMessenger()->addErrorMessage($this->translate($e));
                    $this->em()->rollback();
                }
            });
            // on passe le data-id pour pouvoir le récupérer dans la vue et mettre à jour la liste
            $form->setAttribute('data-id', $mission->getId());
    
            $vm = new ViewModel();
            $vm->setTemplate('mission/saisie/saisie');
            $vm->setVariables(compact('form', 'title', 'mission'));
    
            return $vm;
        }
    
    
    
        public function supprimerAction()
        {
            $typeVolumeHoraire = $this->getServiceTypeVolumeHoraire()->getPrevu();
    
            /** @var Mission $mission */
            $mission = $this->getEvent()->getParam('mission');
    
            if ($mission->canSupprimer()){
                $this->getProcessusPlafond()->beginTransaction();
                try {
                    $this->getServiceMission()->delete($mission);
                    //On historise les volumes horaires de la mission
                    $volumesHoraires = $mission->getVolumesHorairesPrevus();
                    foreach( $volumesHoraires as $volumesHoraire ){
                        $this->getServiceMission()->deleteVolumeHoraire($volumesHoraire);
                    }
                    $this->updateTableauxBord($mission);
                    $this->flashMessenger()->addSuccessMessage("Mission supprimée avec succès.");
                } catch (\Exception $e) {
                    $this->flashMessenger()->addErrorMessage($this->translate($e));
                }
                $this->getProcessusPlafond()->endTransaction($mission, $typeVolumeHoraire, true);
            }else{
                $this->flashMessenger()->addErrorMessage('Vous n\'avez pas la possibilité de supprimer cette mission : elle a déjà été validée ou a fait l\'objet d\'un contrat');
            }
    
            return new AxiosModel([]);
        }
    
    
    
        public function validerAction()
        {
            /** @var Mission $mission */
            $mission = $this->getEvent()->getParam('mission');
    
            if ($mission->isValide()) {
                $this->flashMessenger()->addInfoMessage('La mission est déjà validée');
            } else {
                $this->getServiceValidation()->validerMission($mission);
                $this->getServiceMission()->save($mission);
                $this->updateTableauxBord($mission);
                $this->flashMessenger()->addSuccessMessage('Mission validée');
            }
    
            return $this->getAction($mission);
        }
    
    
    
        public function devaliderAction()
        {
            /** @var Mission $mission */
            $mission = $this->getEvent()->getParam('mission');
    
            $validation = $mission->getValidation();
            if ($validation) {
                $mission->setAutoValidation(false);
                $mission->removeValidation($validation);
                $this->getServiceValidation()->delete($validation);
                $this->updateTableauxBord($mission);
                $this->flashMessenger()->addSuccessMessage("Validation de la mission <strong>retirée</strong> avec succès.");
            } else {
                $this->flashMessenger()->addInfoMessage("La mission n'était pas validée");
            }
    
    
            return $this->getAction($mission);
        }
    
    
    
        public function volumeHoraireSupprimerAction()
        {
            /** @var VolumeHoraireMission $volumeHoraireMission */
            $volumeHoraireMission = $this->getEvent()->getParam('volumeHoraireMission');
    
            $typeVolumeHoraire = $this->getServiceTypeVolumeHoraire()->getPrevu();
    
            $this->getProcessusPlafond()->beginTransaction();
            try {
                $this->getServiceMission()->deleteVolumeHoraire($volumeHoraireMission);
                $this->updateTableauxBord($volumeHoraireMission->getMission());
                $this->flashMessenger()->addSuccessMessage("Volume horaire supprimé avec succès.");
            } catch (\Exception $e) {
                $this->flashMessenger()->addErrorMessage($this->translate($e));
            }
            $this->getProcessusPlafond()->endTransaction($volumeHoraireMission, $typeVolumeHoraire, true);
    
            return $this->getAction($volumeHoraireMission->getMission());
        }
    
    
    
        public function volumeHoraireValiderAction()
        {
            /** @var VolumeHoraireMission $volumeHoraireMission */
            $volumeHoraireMission = $this->getEvent()->getParam('volumeHoraireMission');
    
            if ($volumeHoraireMission->isValide()) {
                $this->flashMessenger()->addInfoMessage('Ce volume horaire est déjà validé');
            } else {
                $this->getServiceValidation()->validerVolumeHoraireMission($volumeHoraireMission);
                $this->getServiceMission()->saveVolumeHoraire($volumeHoraireMission);
                $this->updateTableauxBord($volumeHoraireMission->getMission());
                $this->flashMessenger()->addSuccessMessage('Volume horaire validé');
            }
    
            return $this->getAction($volumeHoraireMission->getMission());
        }
    
    
    
        public function volumeHoraireDevaliderAction()
        {
            /** @var VolumeHoraireMission $volumeHoraireMission */
            $volumeHoraireMission = $this->getEvent()->getParam('volumeHoraireMission');
    
            $validation = $volumeHoraireMission->getValidation();
            if ($validation) {
                $volumeHoraireMission->setAutoValidation(false);
                $volumeHoraireMission->removeValidation($validation);
                $this->getServiceValidation()->delete($validation);
                $this->updateTableauxBord($volumeHoraireMission->getMission());
                $this->flashMessenger()->addSuccessMessage("Validation du volume horaire <strong>retirée</strong> avec succès.");
            } else {
                $this->flashMessenger()->addInfoMessage("Ce volume horaire n'était pas validé");
            }
    
            return $this->getAction($volumeHoraireMission->getMission());
        }
    
    
    
        private function updateTableauxBord(Mission $mission)
        {
            $this->getServiceWorkflow()->calculerTableauxBord([
                'mission',
                'contrat',
            ], $mission->getIntervenant());
        }
    }