Commit e9d3c526 authored by Antony Le Courtes's avatar Antony Le Courtes
Browse files

Optimisation pour la reconduction modulateur (Utilisation d'une vue et insert...

Optimisation pour la reconduction modulateur (Utilisation d'une vue et insert sql au lieu de doctrine)
parent edaab5ca
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -35766,10 +35766,10 @@ FROM
  JOIN categorie_privilege cp ON cp.id = p.categorie_id
  LEFT JOIN statuts_roles sr ON sr.privilege_id = p.id',
    ),
    'V_RECONDUCTION_CENTRE_COUT' => 
    'V_RECONDUCTION_CC_MODULATEUR' => 
    array (
      'name' => 'V_RECONDUCTION_CENTRE_COUT',
      'definition' => 'CREATE OR REPLACE FORCE VIEW V_RECONDUCTION_CENTRE_COUT AS
      'name' => 'V_RECONDUCTION_CC_MODULATEUR',
      'definition' => 'CREATE OR REPLACE FORCE VIEW V_RECONDUCTION_CC_MODULATEUR AS
WITH t AS (
SELECT
  e.id                etape_id,
@@ -35777,6 +35777,7 @@ SELECT
  e.code              etape_code,
  ep.id               element_pedagogique_id,
  ccep.centre_cout_id centre_cout_id,
  em.MODULATEUR_ID    modulateur_id,
  ccep.type_heures_id type_heures_id,
  ep.annee_id         annee_id,
  ep.code             code
@@ -35785,17 +35786,20 @@ FROM
  JOIN source               s ON s.importable = 0
  JOIN element_pedagogique ep ON ep.etape_id = e.id AND ep.histo_destruction IS NULL
  LEFT JOIN centre_cout_ep    ccep ON ccep.element_pedagogique_id = ep.id AND ccep.histo_destruction IS NULL AND ccep.source_id = s.id
  LEFT JOIN ELEMENT_MODULATEUR em ON em.ELEMENT_ID = ep.ID
WHERE
  e.histo_destruction IS NULL
)
SELECT
  t."ETAPE_ID",t."ETAPE_LIBELLE", t."ETAPE_CODE", t."ELEMENT_PEDAGOGIQUE_ID",t."CENTRE_COUT_ID",t."TYPE_HEURES_ID",t."ANNEE_ID",t."CODE",
  t."ETAPE_ID",t."ETAPE_LIBELLE", t."ETAPE_CODE", t."ELEMENT_PEDAGOGIQUE_ID",t."CENTRE_COUT_ID", t.modulateur_id, t."TYPE_HEURES_ID",t."ANNEE_ID",t."CODE",
  ep.id new_element_pedagogique_id,
  ccep.id new_centre_cout_ep_id
  ccep.id new_centre_cout_ep_id,
  em.id new_element_modulateur_id
FROM
  t
  LEFT JOIN element_pedagogique ep ON ep.annee_id = t.annee_id + 1 AND ep.code = t.code AND ep.histo_destruction IS NULL
  LEFT JOIN centre_cout_ep ccep ON ccep.element_pedagogique_id = ep.id AND ccep.centre_cout_id = t.centre_cout_id AND ccep.type_heures_id = t.type_heures_id',
  LEFT JOIN centre_cout_ep ccep ON ccep.element_pedagogique_id = ep.id AND ccep.centre_cout_id = t.centre_cout_id AND ccep.type_heures_id = t.type_heures_id
  LEFT JOIN ELEMENT_MODULATEUR em ON em.ELEMENT_ID = ep.ID',
    ),
    'V_REF_INTERVENANT' => 
    array (
+11 −45
Original line number Diff line number Diff line
@@ -268,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'])) {
@@ -327,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,
        ];
    }

+42 −51
Original line number Diff line number Diff line
@@ -207,7 +207,7 @@ class ReconductionProcessus extends AbstractProcessus
        SELECT 
            *            
        FROM 
            V_RECONDUCTION_CENTRE_COUT 
            V_RECONDUCTION_CC_MODULATEUR
        WHERE
            annee_id = ?
        AND 
@@ -221,7 +221,7 @@ class ReconductionProcessus extends AbstractProcessus
            if(empty($value['NEW_CENTRE_COUT_EP_ID']))
            {
                //Récupération de la dernière incrémentation ID CCEP
                $nextSequence = $this->getNextSequence();
                $nextSequence = $this->getNextSequence('CENTRE_COUT_EP_ID_SEQ');
                try{
                    $stmt = $connection->insert('centre_cout_ep',
                        ['id' => $nextSequence,
@@ -253,64 +253,55 @@ class ReconductionProcessus extends AbstractProcessus

    public function reconduireModulateurFormation($etapes)
    {
        $em     = $this->getEntityManager();
        $nbEPN1 = 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']))
            {
                //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()
                        ]);

        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)
                    if(!in_array($value['NEW_ELEMENT_PEDAGOGIQUE_ID'], $listEp))
                    {
                    //Si il a des modulateurs alors je le stocke
                    $elementsPedagogiqueNByCode[$ep->getCode()] = $ep;
                }
                else{
                    $codesEpWithoutModulateur[] = $ep->getCode();
                }
                        $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 $nbEPN1;
        return $nbInsertedEp;
    }

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

        return $result['VAL'];
+3 −2
Original line number Diff line number Diff line
@@ -78,9 +78,10 @@ class EtapeService extends AbstractEntityService
            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_centre_cout_ep_id) AS nb_cc_ep,
            count(DISTINCT new_element_modulateur_id) AS nb_m_ep
        FROM 
            V_RECONDUCTION_CENTRE_COUT 
            V_RECONDUCTION_CC_MODULATEUR 
        WHERE
            annee_id = :annee
        GROUP BY 
+35 −47
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ $this->headScript()->offsetSetFile(100, '/js/reconduction-modulateur.js');
echo $this->messenger()->addCurrentMessagesFromFlashMessenger();
?>
<?php if(empty($etapesReconduites)): ?>
    <table class="reconduction-modulateur table table-bordered table-condensed table-hover">
<table class="reconduction-centre-cout table table-bordered table-condensed table-hover">
    <thead>
    <tr>
        <th colspan="2">Code</th>
@@ -47,50 +47,39 @@ echo $this->messenger()->addCurrentMessagesFromFlashMessenger();
    <tbody>
    <tr>
        <td colspan="6" style="text-align: center;">
                Aucune formation reconduite pour l'année prochaine
            Aucune formation disponible
        </td>
    </tr>
    </tbody>
</table>
<?php else: ?>
    <?php if($fromPost): ?>
        <p> <a href="<?= $this->url('aof/reconduction-modulateur', [], ['query' => ['structure' => $structure->getId()]]) ?>" >< Retour à la liste des formations éligibles à la reconduction des modulateurs.</a></p>
<?php else: ?>
        <form action="<?= $this->url('aof/reconduction-modulateur', [], ['query' => ['structure' => $structure->getId()]]) ?>" method="POST" id="form-reconduction">

            <p style="text-align:right;"><strong>EP</strong> = Elément pédagogique / <strong>CC</strong> = Centre de coût</p>
            <table class="reconduction-offre table table-bordered table-condensed table-hover" >
                <thead>
                    <tr>
                        <th><input class="checkbox-element" type="checkbox" value="" id="check-all"></th>
                        <th>Code</th>
                        <th>Libellé</th>
                    <th colspan="2" style="text-align:center;">Année <?= $anneeN->getLibelle(); ?></th>
                    <th colspan="2" style="text-align:center;">Année <?= $anneeN1->getLibelle(); ?></th>
                </tr>
                <tr>
                    <th colspan="3"></th>
                    <th>EP</th>
                    <th>EP avec Modulateur</th>
                    <th>EP</th>
                    <th>EP avec Modulateur</th>
                        <th>Nb Elements pédagogiques</th>

                    </tr>

                </thead>
                <tbody>
                    <?php foreach ($etapesReconduites as $er): ?>
                    <tr>
                        <td>
                            <?php if($er['N1']['epWithModulateur'] > 0): ?>
                                <span style="color:#ae0000;font-size:16px;" class="glyphicon glyphicon-alert" aria-hidden="true" title="Attention des modulateurs sont déjà positionnés sur les éléments pédagogiques de la prochaine année universitaire, vous risquez des les écraser avec ceux de l'année courante."></span>
                            <?php if($er['NB_M_EP'] > 0): ?>
                            <span style="color:#ae0000;font-size:16px;" class="glyphicon glyphicon-alert" aria-hidden="true" title="Attention des centres de coût sont déjà positionnés sur les éléments pédagogiques de la prochaine année universitaire, ils ne seront pas écrasés par ceux de cette année."></span>
                            <?php endif; ?>
                            <input class="checkbox-element" type="checkbox" name="etapes[]" value="<?= $er['N']['etape']->getCode(); ?>">
                            <input class="checkbox-element" type="checkbox" name="etapes[]" value="<?= $er['ETAPE_CODE']; ?>">
                        </td>
                        <td><?= $er['N']['etape']->getCode(); ?></td>
                        <td><?= $er['N']['etape']->getLibelle(); ?></td>
                        <td><?= count($er['N']['etape']->getElementPedagogique()); ?></td>
                        <td style="text-align:center;"><?= $er['N']['epWithModulateur']; ?></td>
                        <td style="text-align:center;"><?= count($er['N1']['etape']->getElementPedagogique()); ?></td>
                        <td style="text-align:center;"><?= $er['N1']['epWithModulateur']; ?></td>
                        <td><?= $er['ETAPE_CODE']; ?></td>
                        <td><?=  $er['ETAPE_LIBELLE']; ?></td>
                        <td><?=  $er['NB_EP']; ?></td>
                    </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
@@ -104,4 +93,3 @@ echo $this->messenger()->addCurrentMessagesFromFlashMessenger();
                <button type='button' class='btn btn-primary' id='confirm-reconduction'>Oui</button></div>"><span class="glyphicon glyphicon-share"></span> Reconduire les modulateurs pour l'année suivante</button>
        </form>
    <?php endif; ?>
<?php endif; ?>