Commit 0f783083 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Merge branches 'alc-reconduction-centrecout' and 'master' of https://git.unicaen.fr/open-source/OSE

parents 4954864a 093941b1
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -20,6 +20,9 @@ return [
            'types-diplome-visualisation'        => 'Types de diplômes (visualisation)',
            'types-diplome-edition'              => 'Types de diplômes (édition)',
            'reconduction-offre'                 => 'Prolongation de l\'offre l\'année suivante',
            'reconduction-centre-cout'           => 'Reconduction des centres de coûts de l\'offre de formation',
            'reconduction-modulateur'            => 'Reconduction des modualteurs de l\'offre de formation',

        ],
    ],

@@ -330,6 +333,7 @@ return [
        'privileges' => [
            'administration-visualisation' => 'Administration (visualisation)',
            'administration-edition'       => 'Administration (édition)',
            'administration-reconduction'  => 'Administration (reconduction)',
        ],
    ],

+87 −20
Original line number Diff line number Diff line
@@ -3,12 +3,53 @@
namespace Application;

use Application\Provider\Privilege\Privileges;
use Application\Service\OffreFormationService;
use UnicaenAuth\Guard\PrivilegeController;
use UnicaenAuth\Provider\Rule\PrivilegeRuleProvider;

return [
    'router'          => [
        'routes' => [
            'aof' => [
                'type'          => 'Literal',
                'options'       => [
                    'route'    => '/administration-offre',
                    'defaults' => [
                        'controller' => 'Application\Controller\OffreFormation',
                        'action'     => 'administrationOffre',
                    ],
                ],
                'may_terminate' => true,
                'child_routes'  => [
                    'reconduction'             => [
                        'type'    => 'Segment',
                        'options' => [
                            'route'    => '/reconduction',
                            'defaults' => [
                                'action' => 'reconduction',
                            ],
                        ],
                    ],
                    'reconduction-centre-cout' => [
                        'type'    => 'Segment',
                        'options' => [
                            'route'    => '/reconduction-centre-cout',
                            'defaults' => [
                                'action' => 'reconductionCentreCout',
                            ],
                        ],
                    ],
                    'reconduction-modulateur'  => [
                        'type'    => 'Segment',
                        'options' => [
                            'route'    => '/reconduction-modulateur',
                            'defaults' => [
                                'action' => 'reconductionModulateur',
                            ],
                        ],
                    ],
                ],
            ],
            'of'  => [
                'type'          => 'Literal',
                'options'       => [
@@ -33,15 +74,7 @@ return [
                            ],
                        ],
                    ],
                    'reconduction' => [
                        'type'    => 'Segment',
                        'options' => [
                            'route'    => '/reconduction',
                            'defaults' => [
                                'action' => 'reconduction',
                            ],
                        ],
                    ],

                    'element' => [
                        'type'          => 'Literal',
                        'options'       => [
@@ -210,12 +243,35 @@ return [
                    ],
                    'administration' => [
                        'pages' => [
                            'reconduction-offre' => [
                                'label'    => 'Reconduction de l\'offre de formation',
                            'offre-formation' => [
                                'label'          => 'Administration de l\'offre de formation',
                                'icon'           => 'glyphicon glyphicon - list-alt',
                                'route'    => 'of/reconduction',
                                'route'          => 'aof',
                                'resource'       => PrivilegeController::getResourceId('Application\Controller\OffreFormation', 'administrationOffre'),
                                'order'          => 0,
                                'border - color' => '#111',
                                'pages'          => [
                                    'reconduction-offre'       => [
                                        'label'    => 'Reconduction de l\'offre de formation complémentaire',
                                        'title'    => 'Reconduction de l\'offre de formation complémentaire',
                                        'route'    => 'aof/reconduction',
                                        'resource' => PrivilegeController::getResourceId('Application\Controller\OffreFormation', 'reconduction'),
                                    ],
                                    'reconduction-centre-cout' => [
                                        'label'    => 'Reconduction des centres de coûts de l\'offre de formation',
                                        'title'    => 'Reconduction des centres de coûts de l\'offre de formation',
                                        'route'    => 'aof/reconduction-centre-cout',
                                        'resource' => PrivilegeController::getResourceId('Application\Controller\OffreFormation', 'reconductionCentreCout'),
                                    ],
                                    'reconduction-modulateur'  => [
                                        'label'    => 'Reconduction des modulateurs de l\'offre de formation',
                                        'title'    => 'Reconduction des modulateurs de l\'offre de formation',
                                        'route'    => 'aof/reconduction-modulateur',
                                        'resource' => PrivilegeController::getResourceId('Application\Controller\OffreFormation', 'reconductionModulateur'),
                                    ],

                                ],
                            ],
                        ],
                    ],
                ],
@@ -228,7 +284,7 @@ return [
                /* Global */
                [
                    'controller' => 'Application\Controller\OffreFormation',
                    'action'     => ['index', 'search-structures', 'search-niveaux'],
                    'action'     => ['index', 'search-structures', 'search-niveaux', 'administrationOffre'],
                    'privileges' => Privileges::ODF_VISUALISATION,
                ],
                [
@@ -241,6 +297,17 @@ return [
                    'action'     => ['reconduction'],
                    'privileges' => Privileges::ODF_RECONDUCTION_OFFRE,
                ],
                [
                    'controller' => 'Application\Controller\OffreFormation',
                    'action'     => ['reconductionCentreCout'],
                    'privileges' => Privileges::ODF_RECONDUCTION_CENTRE_COUT,
                ],
                [
                    'controller' => 'Application\Controller\OffreFormation',
                    'action'     => ['reconductionModulateur'],
                    'privileges' => Privileges::ODF_RECONDUCTION_MODULATEUR,
                ],

                /* Etapes */
                [
                    'controller' => 'Application\Controller\OffreFormation\Etape',
@@ -370,8 +437,8 @@ return [
            Service\ElementModulateurService::class    => Service\ElementModulateurService::class,
            Service\TypeModulateurService::class       => Service\TypeModulateurService::class,
            Service\DomaineFonctionnelService::class   => Service\DomaineFonctionnelService::class,
            Assertion\OffreDeFormationAssertion::class => Assertion\OffreDeFormationAssertion::class,
            Service\OffreFormationService::class       => Service\OffreFormationService::class,
            Assertion\OffreDeFormationAssertion::class => Assertion\OffreDeFormationAssertion::class,
            Processus\ReconductionProcessus::class     => Processus\ReconductionProcessus::class,
        ],
        'factories'  => [
+183 −1
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ use Application\Service\Traits\OffreFormationServiceAwareTrait;
use Application\Service\Traits\StructureServiceAwareTrait;
use UnicaenApp\View\Model\CsvModel;
use Zend\Session\Container;
use Zend\View\Model\ViewModel;
use Zend\View\Renderer\PhpRenderer;


/**
@@ -142,6 +144,13 @@ class OffreFormationController extends AbstractController



    public function administrationOffreAction()
    {
        return [];
    }



    public function reconductionAction()
    {
        $this->initFilterHistorique();
@@ -166,7 +175,6 @@ class OffreFormationController extends AbstractController
        if ($request->isPost()) {
            $datas    = $request->getPost();
            $fromPost = true;

            //Ajout du mapping des EtapesN et EtapesN1 pour pouvoir reconduire un element pédagogique sur une etape déjà reconduite.
            $datas['mappingEtape'] = $mappingEtape;
            $reconductionProcessus = $this->getProcessusReconduction();
@@ -200,6 +208,180 @@ class OffreFormationController extends AbstractController



    public function reconductionCentreCoutAction()
    {
        $this->initFilterHistorique();
        $anneeN            = $this->getServiceContext()->getAnnee();
        $anneeN1           = $this->getServiceContext()->getAnneeSuivante();
        $fromPost          = false;
        $etapesReconduites = [];
        [$structure, $niveau, $etape] = $this->getParams();

        //Get role of user
        $role = $this->getServiceContext()->getSelectedIdentityRole();

        $qb = $this->getServiceStructure()->finderByHistorique();
        $this->getServiceStructure()->finderByEnseignement($qb);
        $this->getServiceStructure()->finderByRole($role, $qb);
        $structures = $this->getServiceStructure()->getList($qb);


        //Récupération de toutes les étapes éligibles à la reconduction des coûts
        if (!empty($structure)) {
            $etapesReconduitesResult = $this->getServiceEtape()->getEtapeReconduit($structure);
            $codesEtapesWithoutCC = [];
            if ($etapesReconduitesResult) {
                foreach ($etapesReconduitesResult as $etape) {
                    if ($etape->getAnnee()->getLibelle() == $this->getServiceContext()->getAnnee()->getLibelle()) {
                        $epWithCc = $this->getServiceElementPedagogique()->countEpWithCc($etape);
                        if(empty($epWithCc))
                        {
                            $codesEtapesWithoutCC[] = $etape->getCode();
                        }
                        $etapesReconduites[$etape->getCode()]['N']['etape']    = $etape;
                        $etapesReconduites[$etape->getCode()]['N']['epWithCc'] = $epWithCc;
                    } else {
                        $epWithCc = $this->getServiceElementPedagogique()->countEpWithCc($etape);
                        $etapesReconduites[$etape->getCode()]['N1']['etape']    = $etape;
                        $etapesReconduites[$etape->getCode()]['N1']['epWithCc'] = $epWithCc;
                    }
                }
                //Clean etapes sans aucun centre de coût
                foreach($codesEtapesWithoutCC as $code)
                {
                    unset($etapesReconduites[$code]);
                }
            }
        }

        $request = $this->getRequest();
        if ($request->isPost()) {
            $fromPost = true;
            $datas    = $request->getPost();
            //Reconduire les centres de coût des EP de l'étape.
            try {
                $etapesReconduitesCc = [];
                if (isset($datas['etapes'])) {
                    foreach ($datas['etapes'] as $code) {
                        if (array_key_exists($code, $etapesReconduites)) {
                            $etapesReconduitesCc[$code] = $etapesReconduites[$code];
                        }
                    }
                }
                $result = $this->getProcessusReconduction()->reconduireCCFormation($etapesReconduitesCc);
                if ($result > 0) {
                    $this->flashMessenger()->addSuccessMessage("Les centres de coût des éléments pédagogiques des étapes sélectionnées ont bien été reconduit pour la prochaine année universitaire ($result 
                élément(s) pédagogique(s) concerné(s))");
                } else {
                    $this->flashMessenger()->addWarningMessage("Aucun centre de cout n'a été reconduit car aucun élément
                pédagogique n'existe pour cette formation pour la prochaine année universitaire.");
                }
            } catch (\Exception $e) {
                $this->flashMessenger()->addErrorMessage($e->getMessage());
            }
            $fromPost = true;
        }


        return [
            'anneeN'            => $anneeN,
            'anneeN1'           => $anneeN1,
            'structures'        => $structures,
            'structure'         => $structure,
            'etapesReconduites' => $etapesReconduites,
            'fromPost'          => $fromPost,
        ];
    }



    public function reconductionModulateurAction()
    {
        $this->initFilterHistorique();
        $anneeN  = $this->getServiceContext()->getAnnee();
        $anneeN1 = $this->getServiceContext()->getAnneeSuivante();


        [$structure, $niveau, $etape] = $this->getParams();
        $etapesReconduites = [];
        $fromPost          = 0;
        $role              = $this->getServiceContext()->getSelectedIdentityRole();



        $qb = $this->getServiceStructure()->finderByHistorique();
        $this->getServiceStructure()->finderByEnseignement($qb);
        $this->getServiceStructure()->finderByRole($role, $qb);
        $structures = $this->getServiceStructure()->getList($qb);
        $codesEtapesWithoutModulateur = [];

        //Récupération de toutes les étapes éligibles à la reconduction des coûts
        if (!empty($structure)) {
            $etapesReconduitesResult = $this->getServiceEtape()->getEtapeReconduit($structure);
            if ($etapesReconduitesResult) {
                foreach ($etapesReconduitesResult as $etape) {
                    if ($etape->getAnnee()->getLibelle() == $this->getServiceContext()->getAnnee()->getLibelle()) {
                        $epWithModulateur = $this->getServiceElementPedagogique()->countEpWithModulateur($etape);
                        if(empty($epWithModulateur))
                        {
                            $codesEtapesWithoutModulateur[] = $etape->getCode();
                        }
                        $etapesReconduites[$etape->getCode()]['N']['etape']            = $etape;
                        $etapesReconduites[$etape->getCode()]['N']['epWithModulateur'] = $epWithModulateur;
                    } else {
                        $etapesReconduites[$etape->getCode()]['N1']['etape']            = $etape;
                        $etapesReconduites[$etape->getCode()]['N1']['epWithModulateur'] = $this->getServiceElementPedagogique()->countEpWithModulateur($etape);
                    }
                }
                //Clean etapes sans aucun centre de coût
                foreach($codesEtapesWithoutModulateur as $code)
                {
                    unset($etapesReconduites[$code]);
                }
            }
        }

        $request = $this->getRequest();
        if ($request->isPost()) {
            $fromPost = true;
            $datas    = $request->getPost();
            //Reconduire les modulateurs des EP de l'étape.
            try {
                $etapesReconduitesCc = [];
                if (isset($datas['etapes'])) {
                    foreach ($datas['etapes'] as $code) {

                        if (array_key_exists($code, $etapesReconduites)) {
                            $etapesReconduitesCc[$code] = $etapesReconduites[$code];
                        }
                    }
                }
                $result = $this->getProcessusReconduction()->reconduireModulateurFormation($etapesReconduitesCc);
                if ($result > 0) {
                    $this->flashMessenger()->addSuccessMessage("Les modulateurs des éléments pédagogiques des étapes sélectionnées ont bien été reconduit pour la prochaine année universitaire ($result 
                élément(s) pédagogique(s) concerné(s))");
                } else {
                    $this->flashMessenger()->addWarningMessage("Aucun modulateur n'a été reconduit car aucun élément
                pédagogique n'existe pour cette formation pour la prochaine année universitaire.");
                }
            } catch (\Exception $e) {
                $this->flashMessenger()->addErrorMessage($e->getMessage());
            }
            $fromPost = true;
        }

        return [
            'anneeN'            => $anneeN,
            'anneeN1'           => $anneeN1,
            'structures'        => $structures,
            'etapesReconduites' => $etapesReconduites,
            'structure'         => $structure,
            'fromPost'          => $fromPost,
        ];
    }



    protected function initFilters()
    {
        $this->initFilterAnnee();
+143 −3
Original line number Diff line number Diff line
@@ -2,14 +2,17 @@

namespace Application\Processus;

use Application\Entity\Db\ElementPedagogique;
use Application\Entity\Db\Etape;
use Application\Service\Traits\AnneeServiceAwareTrait;
use Application\Service\Traits\CentreCoutEpServiceAwareTrait;
use Application\Service\Traits\CheminPedagogiqueServiceAwareTrait;
use Application\Service\Traits\ContextServiceAwareTrait;
use Application\Service\Traits\ElementModulateurServiceAwareTrait;
use Application\Service\Traits\ElementPedagogiqueServiceAwareTrait;
use Application\Service\Traits\EtapeServiceAwareTrait;
use Application\Service\Traits\SourceServiceAwareTrait;
use Application\Service\Traits\VolumeHoraireEnsServiceAwareTrait;
use Zend\Stdlib\Parameters;

/**
 * Description of ReconductionProcessus
@@ -25,6 +28,8 @@ class ReconductionProcessus extends AbstractProcessus
    use VolumeHoraireEnsServiceAwareTrait;
    use AnneeServiceAwareTrait;
    use ContextServiceAwareTrait;
    use CentreCoutEpServiceAwareTrait;
    use ElementModulateurServiceAwareTrait;
    use SourceServiceAwareTrait;

    protected $etapeService;
@@ -39,6 +44,8 @@ class ReconductionProcessus extends AbstractProcessus

    protected $contextService;

    protected $centreCoutEpService;



    public function __construct()
@@ -49,11 +56,13 @@ class ReconductionProcessus extends AbstractProcessus
        $this->volumeHoraireEnsService   = $this->getServiceVolumeHoraireEns();
        $this->anneeService              = $this->getServiceAnnee();
        $this->contextService            = $this->getServiceContext();
        $this->centreCoutEpService       = $this->getServiceCentreCoutEp();
        $this->elementModulateurService  = $this->getServiceElementModulateur();
    }



    public function reconduction(Parameters $datas)
    public function reconduction($datas)
    {
        if (empty($datas['element']) && empty($datas['etape'])) {
            Throw new \Exception('Aucune donnée à reconduire');
@@ -143,7 +152,6 @@ class ReconductionProcessus extends AbstractProcessus
                        //Reconduction des chemins pédagogiques
                        $cheminsPedagogique = $elementEnCours->getCheminPedagogique();
                        foreach ($cheminsPedagogique as $chemin) {

                            $cheminReconduit = $this->cheminPedagogiqueService->newEntity();
                            $cheminReconduit->setElementPedagogique($elementReconduit);
                            $cheminReconduit->setEtape($etapeReconduit);
@@ -179,4 +187,136 @@ class ReconductionProcessus extends AbstractProcessus
        return true;
    }



    public function reconduireCCFormation($etapes)
    {
        $anneeN       = $this->getServiceContext()->getAnnee();
        $anneeN1      = $this->getServiceContext()->getAnneeSuivante();
        $serviceEtape = $this->getServiceEtape();
        $em           = $this->getEntityManager();
        $nbEPN1       = 0;

        foreach ($etapes as $code => $etape) {
            $etapeN                     = $etape['N']['etape'];
            $elementsPedagogiqueN       = $etapeN->getElementPedagogique();
            $elementsPedagogiqueNByCode = [];
            $codesEpWithoutCc = [];
            foreach ($elementsPedagogiqueN as $ep) {
                //Check si ep a un élément pédagoggique
                $ccep = $ep->getCentreCoutEp();
                if(count($ccep) > 0)
                {
                    //Si il a des centres de couts alors je le stocke
                    $elementsPedagogiqueNByCode[$ep->getCode()] = $ep;
                }
                else{
                    $codesEpWithoutCc[] = $ep->getCode();
                }
            }
            $etapeN1                     = $etape['N1']['etape'];
            $elementsPedagogiqueN1       = $etapeN1->getElementPedagogique();
            $elementsPedagogiqueN1ByCode = [];
            foreach ($elementsPedagogiqueN1 as $epN1) {
                //Si l'epN possède des CC alors je continuer
                if(!in_array($epN1->getCode(), $codesEpWithoutCc))
                {
                    $elementsPedagogiqueN1ByCode[$epN1->getCode()] = $epN1;
                }
            }

            foreach ($elementsPedagogiqueN as $ep) {
                //Cas d'un élément pédagogique historisé a ne pas reconduire
                if ($ep->estHistorise()) {
                    continue;
                }
                //Retrouver l'EP reconduite sur N1
                $epN1 = (array_key_exists($ep->getCode(), $elementsPedagogiqueN1ByCode)) ? $elementsPedagogiqueN1ByCode[$ep->getCode()] : false;
                if ($epN1) {
                    $nbEPN1++;
                    //Suppression CCEP de l'EPN1 avant la reconduction N -> N1
                    $centreCoutEpN1 = $epN1->getCentreCoutEp();
                    foreach ($centreCoutEpN1 as $ccepN1) {
                        $em->remove($ccepN1);
                    }
                    $em->flush();
                    $centreCoutEpN = $ep->getCentreCoutEp();
                    foreach ($centreCoutEpN as $ccep) {
                        //cas d'un centre de coût historisé.
                        if ($ccep->estHistorise()) {
                            continue;
                        }
                        $ccepN1 = $this->centreCoutEpService->newEntity();
                        $ccepN1->setTypeHeures($ccep->getTypeHeures());
                        $ccepN1->setCentreCout($ccep->getCentreCout());
                        $ccepN1->setElementPedagogique($epN1);
                        $this->centreCoutEpService->save($ccepN1);
                    }
                    $em->persist($epN1);
                }
            }
        }
        //Execution en BDD
        $em->flush();

        return $nbEPN1;
    }



    public function reconduireModulateurFormation($etapes)
    {
        $em     = $this->getEntityManager();
        $nbEPN1 = 0;


        foreach ($etapes as $code => $etape) {
            $etapeN                     = $etape['N']['etape'];
            $elementsPedagogiqueN       = $etapeN->getElementPedagogique();
            $elementsPedagogiqueNByCode = [];
            $codesEpWithoutModulateur = [];
            foreach ($elementsPedagogiqueN as $ep) {
                $mep = $ep->getElementModulateur();
                if(count($mep) > 0)
                {
                    //Si il a des modulateurs alors je le stocke
                    $elementsPedagogiqueNByCode[$ep->getCode()] = $ep;
                }
                else{
                    $codesEpWithoutModulateur[] = $ep->getCode();
                }
            }
            $etapeN1                     = $etape['N1']['etape'];
            $elementsPedagogiqueN1       = $etapeN1->getElementPedagogique();
            $elementsPedagogiqueN1ByCode = [];
            foreach ($elementsPedagogiqueN1 as $epN1) {
                if(!in_array($epN1->getCode(), $codesEpWithoutModulateur))
                {
                    $elementsPedagogiqueN1ByCode[$epN1->getCode()] = $epN1;
                }
            }

            foreach ($elementsPedagogiqueN as $ep) {
                $epN1 = (array_key_exists($ep->getCode(), $elementsPedagogiqueN1ByCode)) ? $elementsPedagogiqueN1ByCode[$ep->getCode()] : false;
                if ($epN1) {
                    $nbEPN1++;
                    $elementsModulateursN1 = $epN1->getElementModulateur();
                    foreach ($elementsModulateursN1 as $epmepN1) {
                        $em->remove($epmepN1);
                    }
                    $em->flush();
                    $elementsModulateurs = $ep->getElementModulateur();
                    foreach ($elementsModulateurs as $epm) {
                        $epmepN1 = $this->elementModulateurService->newEntity();
                        $epmepN1->setModulateur($epm->getModulateur());
                        $epmepN1->setElement($epN1);
                        $em->persist($epmepN1);
                    }
                }
            }
            $em->flush();
        }

        return $nbEPN1;
    }
}
 No newline at end of file
+5 −2

File changed.

Preview size limit exceeded, changes collapsed.

Loading