Commit 5678ac26 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Merge branches 'alc-pj-duree-vie' and 'master' of...

Merge branches 'alc-pj-duree-vie' and 'master' of https://git.unicaen.fr/open-source/OSE into alc-pj-duree-vie

 Conflicts:
	data/ddl.php
parents 0c6045c1 19694876
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -194,6 +194,7 @@ class ServiceAssertion extends AbstractAssertion
        if (!$intervenant) return true;

        $typeVolumehoraireCode = $this->getMvcEvent()->getRouteMatch()->getParam('type-volume-horaire-code');
        if (!$typeVolumehoraireCode) return true;
        $typeVolumeHoraire = $this->getServiceTypeVolumeHoraire()->getByCode($typeVolumehoraireCode);

        $wfEtape = $this->getWorkflowEtape($typeVolumeHoraire, 'saisie');
+26 −90
Original line number Diff line number Diff line
@@ -211,9 +211,6 @@ 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();

@@ -225,41 +222,13 @@ class OffreFormationController extends AbstractController
        $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 {
                $etapesReconduites = $this->getServiceEtape()->getEtapeReconduit($structure);
                $etapesReconduitesCc = [];
                if (isset($datas['etapes'])) {
                    foreach ($datas['etapes'] as $code) {
@@ -269,27 +238,28 @@ class OffreFormationController extends AbstractController
                    }
                }
                $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.");
                }

                $this->flashMessenger()->addSuccessMessage("Les centres de coûts des éléments pédagogiques des étapes sélectionnées ont bien été reconduit (<b>uniquement dans le cas où ils n'avaient pas encore de centre de coût paramétré pour l'année prochaine</b>). $result 
                élément(s) pédagogique(s) ont été mis à jour");


            } catch (\Exception $e) {
                $this->flashMessenger()->addErrorMessage($e->getMessage());
            }
            $fromPost = true;


        }

        if(empty($etapesReconduites) && !empty($structure))
        {
            $etapesReconduites = $this->getServiceEtape()->getEtapeReconduit($structure);
        }


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

@@ -298,54 +268,21 @@ class OffreFormationController extends AbstractController
    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.
            $etapesReconduites = $this->getServiceEtape()->getEtapeReconduit($structure);
            try {
                $etapesReconduitesCc = [];
                if (isset($datas['etapes'])) {
@@ -357,26 +294,25 @@ class OffreFormationController extends AbstractController
                    }
                }
                $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.");
                }

                    $this->flashMessenger()->addSuccessMessage("Les modulateurs des éléments pédagogiques des étapes sélectionnées ont bien été reconduit (<b>uniquement dans le cas où ils n'avaient pas encore de modulateur paramétré pour l'année prochaine</b>). $result 
                élément(s) pédagogique(s) ont été mis à jour");

            } catch (\Exception $e) {
                $this->flashMessenger()->addErrorMessage($e->getMessage());
            }
            $fromPost = true;
        }

        //Récupération de toutes les étapes éligibles à la reconduction des coûts
        if (empty($etapesReconduites) && !empty($structure)) {
            $etapesReconduites = $this->getServiceEtape()->getEtapeReconduit($structure);
        }


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

+100 −113
Original line number Diff line number Diff line
@@ -2,8 +2,7 @@

namespace Application\Processus;

use Application\Entity\Db\ElementPedagogique;
use Application\Entity\Db\Etape;
use Application\Connecteur\Bdd\BddConnecteurAwareTrait;
use Application\Service\Traits\AnneeServiceAwareTrait;
use Application\Service\Traits\CentreCoutEpServiceAwareTrait;
use Application\Service\Traits\CheminPedagogiqueServiceAwareTrait;
@@ -13,6 +12,8 @@ use Application\Service\Traits\ElementPedagogiqueServiceAwareTrait;
use Application\Service\Traits\EtapeServiceAwareTrait;
use Application\Service\Traits\SourceServiceAwareTrait;
use Application\Service\Traits\VolumeHoraireEnsServiceAwareTrait;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\ParameterType;

/**
 * Description of ReconductionProcessus
@@ -23,6 +24,7 @@ class ReconductionProcessus extends AbstractProcessus
{

    use EtapeServiceAwareTrait;
    use BddConnecteurAwareTrait;
    use ElementPedagogiqueServiceAwareTrait;
    use CheminPedagogiqueServiceAwareTrait;
    use VolumeHoraireEnsServiceAwareTrait;
@@ -47,7 +49,6 @@ class ReconductionProcessus extends AbstractProcessus
    protected $centreCoutEpService;



    public function __construct()
    {
        $this->etapeService              = $this->getServiceEtape();
@@ -187,136 +188,122 @@ class ReconductionProcessus extends AbstractProcessus
        return true;
    }

    /**
     * Reconduit les centres de coutq des élements pédagogiques d'une sélection d'étapes
     *
     * @param array $etapes
     *
     * @return integer
     */


    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)
        //Récupération des étapes dont il faut reconduire les cc
        $etapes_codes = array_keys($etapes);
        $sql = '
        SELECT 
            *            
        FROM 
            V_RECONDUCTION_CC_MODULATEUR
        WHERE
            annee_id = ?
        AND 
            etape_code IN (?)';
        $connection = $this->getEntityManager()->getConnection();
        $stmt = $connection->executeQuery($sql, [ $this->getServiceContext()->getAnnee()->getId(), $etapes_codes], [ParameterType::INTEGER, Connection::PARAM_STR_ARRAY]);
        $ccepN = $stmt->fetchAll();
        $listEp = [];
        $nbInsertedEp = 0;
        foreach ($ccepN as $key => $value) {
            if(empty($value['NEW_CENTRE_COUT_EP_ID']))
            {
                    //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))
                //Récupération de la dernière incrémentation ID CCEP
                $nextSequence = $this->getNextSequence('CENTRE_COUT_EP_ID_SEQ');
                try{
                    $stmt = $connection->insert('centre_cout_ep',
                        ['id' => $nextSequence,
                         'centre_cout_id' => $value['CENTRE_COUT_ID'],
                         'element_pedagogique_id' => $value['NEW_ELEMENT_PEDAGOGIQUE_ID'],
                         'type_heures_id' => $value['TYPE_HEURES_ID'],
                         'source_id'    => $this->getServiceSource()->getOse()->getId(),
                         'source_code'  => uniqid($value['CENTRE_COUT_ID'] . '_' . $value['TYPE_HEURES_ID'] . '_' . $value['NEW_ELEMENT_PEDAGOGIQUE_ID']),
                         'histo_createur_id' => $this->getServiceContext()->getUtilisateur()->getId(),
                         'histo_modificateur_id' => $this->getServiceContext()->getUtilisateur()->getId()
                        ]);

                    if(!in_array($value['NEW_ELEMENT_PEDAGOGIQUE_ID'], $listEp))
                    {
                    $elementsPedagogiqueN1ByCode[$epN1->getCode()] = $epN1;
                        $listEp[] = $value['NEW_ELEMENT_PEDAGOGIQUE_ID'];
                        $nbInsertedEp++;
                    }
            }

            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()) {
                }catch(\Exception $e)
                {
                    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;
        }
        return $nbInsertedEp;
    }



    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)
        //Récupération des étapes dont il faut reconduire les cc
        $etapes_codes = array_keys($etapes);
        $sql = '
        SELECT 
            *            
        FROM 
            V_RECONDUCTION_CC_MODULATEUR
        WHERE
            annee_id = ?
        AND 
            etape_code IN (?)';
        $connection = $this->getEntityManager()->getConnection();
        $stmt = $connection->executeQuery($sql, [ $this->getServiceContext()->getAnnee()->getId(), $etapes_codes], [ParameterType::INTEGER, Connection::PARAM_STR_ARRAY]);
        $mepN = $stmt->fetchAll();
        $listEp = [];
        $nbInsertedEp = 0;
        foreach ($mepN as $key => $value) {
            if(empty($value['NEW_ELEMENT_MODULATEUR_ID']))
            {
                    //Si il a des modulateurs alors je le stocke
                    $elementsPedagogiqueNByCode[$ep->getCode()] = $ep;
                }
                else{
                    $codesEpWithoutModulateur[] = $ep->getCode();
                }
                //Récupération de la dernière incrémentation ID CCEP
                $nextSequence = $this->getNextSequence('ELEMENT_MODULATEUR_ID_SEQ');
                try{
                    $stmt = $connection->insert('element_modulateur',
                        ['id' => $nextSequence,
                         'element_id' => $value['NEW_ELEMENT_PEDAGOGIQUE_ID'],
                         'modulateur_id'    => $value['MODULATEUR_ID'],
                         'histo_createur_id' => $this->getServiceContext()->getUtilisateur()->getId(),
                         'histo_modificateur_id' => $this->getServiceContext()->getUtilisateur()->getId()
                        ]);

                    if(!in_array($value['NEW_ELEMENT_PEDAGOGIQUE_ID'], $listEp))
                    {
                        $listEp[] = $value['NEW_ELEMENT_PEDAGOGIQUE_ID'];
                        $nbInsertedEp++;
                    }
            $etapeN1                     = $etape['N1']['etape'];
            $elementsPedagogiqueN1       = $etapeN1->getElementPedagogique();
            $elementsPedagogiqueN1ByCode = [];
            foreach ($elementsPedagogiqueN1 as $epN1) {
                if(!in_array($epN1->getCode(), $codesEpWithoutModulateur))
                }catch(\Exception $e)
                {
                    $elementsPedagogiqueN1ByCode[$epN1->getCode()] = $epN1;
                    continue;
                }
            }

            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 $nbInsertedEp;
    }

        return $nbEPN1;
    public function getNextSequence($sequenceName = '')
    {
        $connection = $this->getEntityManager()->getConnection();
        $stmt = $connection->executeQuery('SELECT ' . $sequenceName . '.NEXTVAL val FROM DUAL');
        $result = $stmt->fetch();

        return $result['VAL'];
    }


}
 No newline at end of file
+30 −28
Original line number Diff line number Diff line
@@ -69,34 +69,36 @@ class EtapeService extends AbstractEntityService

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


        $qb1 = $this->getEntityManager()->createQueryBuilder();
        $qb2 = $this->getEntityManager()->createQueryBuilder();

        $etapeN1 = $qb1
            ->select('eN1.code')
            ->from(Etape::class, 'eN1')
            ->leftJoin(Structure::class, 'sN1', \Doctrine\ORM\Query\Expr\Join::WITH, 'eN1.structure = sN1.id')
            ->where('eN1.annee = :anneeN1')
            ->andWhere('sN1 = :structure');

        $qb2 = $this->finderByStructure($structure)
            ->where($qb2->expr()->in('etp.code', $etapeN1->getDQL()))
            ->andWhere($qb2->expr()->orX(
                $qb2->expr()->eq('etp.annee', ':anneeN'),
                $qb2->expr()->eq('etp.annee', ':anneeN1')
            ))
            ->setParameter('anneeN', $anneeN)
            ->setParameter('anneeN1', $anneeN1)
            ->setParameter('structure', $structure)
            ->orderBy('etp.annee', 'desc');

        $result = $qb2->getQuery()->getResult();

        return $result;
        $annee  = $this->getServiceContext()->getAnnee()->getId();


        $sql = '
                SELECT 
            etape_id,
            etape_libelle,
            etape_code,
            count(DISTINCT element_pedagogique_id) AS nb_ep,
            count(DISTINCT new_centre_cout_ep_id) AS nb_cc_ep,
            count(DISTINCT new_element_modulateur_id) AS nb_m_ep
        FROM 
            V_RECONDUCTION_CC_MODULATEUR 
        WHERE
            annee_id = :annee
        GROUP BY 
            etape_id,
            etape_libelle,
            etape_code';
        $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
        $stmt->bindParam(':annee', $annee);
        $stmt->execute();
        $result = $stmt->fetchAll();
        $etapes = [];
        foreach($result as $etape)
        {
            $etapes[$etape['ETAPE_CODE']] = $etape;
        }

        return $etapes;
    }


+60 −71

File changed.

Preview size limit exceeded, changes collapsed.

Loading