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

Merge branch 'master' of https://git.unicaen.fr/lib/unicaen/indicateur into HEAD

parents 8e4df338 fe3681ac
Loading
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ return [
                    'action' => [
                        'afficher',
                        'rafraichir',
                        'rafraichir-tous-les-indicateurs',
                        'exporter',
                        'regenerer',
                    ],
@@ -110,6 +111,17 @@ return [
                        ],
                        'may_terminate' => true,
                    ],
                    'rafraichir-tous-les-indicateurs' => [
                        'type'  => Literal::class,
                        'options' => [
                            'route'    => '/rafraichir-tous-les-indicateurs',
                            'defaults' => [
                                /** @see IndicateurController::rafraichirTousLesIndicateursAction() */
                                'action'     => 'rafraichir-tous-les-indicateurs',
                            ],
                        ],
                        'may_terminate' => true,
                    ],
                    'regenerer' => [
                        'type'  => Segment::class,
                        'options' => [
+4 −1
Original line number Diff line number Diff line
@@ -8,17 +8,20 @@ use UnicaenIndicateur\Entity\Db\Abonnement;
use UnicaenIndicateur\Entity\Db\Indicateur;
use UnicaenIndicateur\Service\Abonnement\AbonnementServiceAwareTrait;
use UnicaenIndicateur\Service\Indicateur\IndicateurServiceAwareTrait;
use UnicaenIndicateur\Service\Perimetre\PerimetreServiceAwareTrait;
use UnicaenUtilisateur\Service\User\UserServiceAwareTrait;

class IndexController extends AbstractActionController {
    use AbonnementServiceAwareTrait;
    use IndicateurServiceAwareTrait;
    use PerimetreServiceAwareTrait;
    use UserServiceAwareTrait;

    public function indexAction() : ViewModel
    {
        $user = $this->getUserService()->getConnectedUser();
        $role = $this->getUserService()->getConnectedRole();
        $perimetres = $this->getPerimetreService()->getPerimetres($user, $role);

        $abonnements = $this->getAbonnementService()->getAbonnementsByUser($user);
        $abonnements = array_filter($abonnements, function (Abonnement $abonnement) use ($role) {
@@ -30,7 +33,7 @@ class IndexController extends AbstractActionController {
        $result = [];
        foreach ($abonnements as $abonnement) {
            $indicateur = $abonnement->getIndicateur();
            $data = $this->getIndicateurService()->getIndicateurData($indicateur);
            $data = $this->getIndicateurService()->getIndicateurData($indicateur, $perimetres);
            $result[$indicateur->getId()] = count($data[1]);
        }

+8 −1
Original line number Diff line number Diff line
@@ -2,11 +2,12 @@

namespace UnicaenIndicateur\Controller;

use Interop\Container\ContainerInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
use UnicaenIndicateur\Service\Abonnement\AbonnementService;
use UnicaenIndicateur\Service\Indicateur\IndicateurService;
use UnicaenIndicateur\Service\Perimetre\PerimetreServiceInterface;
use UnicaenUtilisateur\Service\User\UserService;

class IndexControllerFactory {
@@ -19,6 +20,11 @@ class IndexControllerFactory {
     */
    public function __invoke(ContainerInterface $container) : IndexController
    {
        $config = $container->get('config');
        $perimetreServiceKey = $container->get($config['unicaen-indicateur']['perimetreService']);
        /** @var PerimetreServiceInterface $perimetreService */
        $perimetreService = $container->get($perimetreServiceKey::class);

        /**
         * @var AbonnementService $abonnementService
         * @var IndicateurService $indicateurService
@@ -31,6 +37,7 @@ class IndexControllerFactory {
        $controller  = new IndexController();
        $controller->setAbonnementService($abonnementService);
        $controller->setIndicateurService($indicateurService);
        $controller->setPerimetreService($perimetreService);
        $controller->setUserService($userService);
        return $controller;
    }
+24 −11
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
namespace UnicaenIndicateur\Controller;

use DateTime;
use Exception;
use Laminas\Http\Response;
use UnicaenIndicateur\Entity\Db\Indicateur;
use UnicaenIndicateur\Entity\Db\Categorie;
@@ -70,9 +71,18 @@ class IndicateurController extends AbstractActionController {
        $role = $this->getUserService()->getConnectedRole();
        $perimetres = $this->getPerimetreService()->getPerimetres($user, $role);


        try {
            $exists = $this->getIndicateurService()->verifierExistanceMaterializedView($indicateur->getViewId());
            if ($exists !== true) {
                $this->getIndicateurService()->createView($indicateur);
            } else {
                $result = $this->getIndicateurService()->getIndicateurData($indicateur, $perimetres);
            }
        } catch (Exception $e) {
            $this->getIndicateurService()->refresh($indicateur);
            $exists = $this->getIndicateurService()->verifierExistanceMaterializedView($indicateur->getViewId());
            if ($exists === true) $result = $this->getIndicateurService()->getIndicateurData($indicateur, $perimetres);
        }

        return new ViewModel([
            'indicateur' => $indicateur,
@@ -83,6 +93,17 @@ class IndicateurController extends AbstractActionController {
        ]);
    }

    public function rafraichirTousLesIndicateursAction() : Response
    {
        $indicateurs = $this->getIndicateurService()->getIndicateurs();

        foreach ($indicateurs as $indicateur) {
            $this->getIndicateurService()->refresh($indicateur);
        }
        /** @see IndicateurController::indexAction()  */
        return $this->redirect()->toRoute('indicateurs', [], [], true);
    }

    public function rafraichirAction() : Response
    {
        $indicateur = $this->getIndicateurService()->getRequestedIndicateur($this);
@@ -227,12 +248,4 @@ class IndicateurController extends AbstractActionController {
        return $CSV;
    }

    public function rafraichirTousAction() : void
    {
        $indicateurs = $this->getIndicateurService()->getIndicateurs();
        foreach ($indicateurs as $indicateur) {
            $this->getIndicateurService()->refresh($indicateur);
        }
    }

}
 No newline at end of file
+17 −6
Original line number Diff line number Diff line
@@ -79,11 +79,9 @@ class IndicateurService
     */
    public function fetch(Indicateur $indicateur, ?array $userPerimetre = null): ?array
    {

        $exist = $this->verifierExistanceMaterializedView($indicateur->getViewId());
        if ($exist === false) return null;


        $sql = "SELECT * FROM " . $indicateur->getViewId() . " WHERE 1=1";

        if ($indicateur->getPerimetre() !== null and $indicateur->getPerimetre() !== "aucun") {
@@ -111,8 +109,15 @@ class IndicateurService
            $res = $this->getObjectManager()->getConnection()->executeQuery($sql, [], []);
            $tmp = $res->fetchAllAssociative();
        } catch (DBA_Driver_Exception $e) {
            try {
                $this->refresh($indicateur);
                $this->getObjectManager()->getConnection()->prepare($sql);
                $res = $this->getObjectManager()->getConnection()->executeQuery($sql, [], []);
                $tmp = $res->fetchAllAssociative();
            } catch(Exception $e) {
                throw new RuntimeException("Un problème est survenu lors de la récupération de des données de l'indicateur.", 0, $e);
            }
        }
        return $tmp;
    }

@@ -132,12 +137,17 @@ class IndicateurService
    }

    /**
     * Note : il vaut mieux détruire et reconstruire car si il y a un écart en les données et la requête alors le
     * refresh ne fait pas le nécessaire
     *
     * @param Indicateur $indicateur
     */
    public function refresh(Indicateur $indicateur): void
    {
        $sql = "REFRESH MATERIALIZED VIEW " . $indicateur->getViewId();
        $this->manipulateDatabaseView($sql);
        //$sql = "REFRESH MATERIALIZED VIEW " . $indicateur->getViewId();
        //$this->manipulateDatabaseView($sql);
        $this->dropView($indicateur);
        $this->createView($indicateur);
        $indicateur->setDernierRafraichissement(new DateTime());
        $count = $this->getCount($indicateur);
        $indicateur->setNbElements($count);
@@ -346,8 +356,9 @@ class IndicateurService
        $exist = $this->verifierExistanceMaterializedView($indicateur->getViewId());
        if (!$exist) return null;

        $userPerimetre = $this->extractPerimetres($perimetres);
        $userPerimetre = $perimetres?$this->extractPerimetres($perimetres):null;
        $rawdata = $this->fetch($indicateur, $userPerimetre);
        $rawdata = $this->fetch($indicateur);
        return count($rawdata);
    }

Loading