Commit f352b557 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

[FIX] Page Assistance : ne plante plus et affiche toutes les adresses...

[FIX] Page Assistance : ne plante plus et affiche toutes les adresses possibles en cas d'adresse établissement introuvable.
parent 9fbd2068
Loading
Loading
Loading
Loading
+1 −0
Changes for CHANGELOG.md: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ Journal des modifications
- [FIX] Module Formation : correction des routes des paginators.
- [FIX] Création/modification d'individu : erreur 'Adresse existante (Utilisateur)'.
- [FIX] Masquage du message abscons 'Cette personne ne pourra pas utiliser l'application...' sur la fiche Thèse.
- [FIX] Page Assistance : ne plante plus et affiche toutes les adresses possibles en cas d'adresse établissement introuvable.

5.2.4
-----
+10 −16
Changes for module/Application/src/Application/Controller/IndexController.php: 10 added lines, 16 removed lines.
Original line number Diff line number Diff line
@@ -8,7 +8,6 @@ use Application\Service\Variable\VariableServiceAwareTrait;
use Information\Service\InformationServiceAwareTrait;
use Laminas\Authentication\AuthenticationServiceInterface;
use Laminas\Http\Response;
use Laminas\Validator\EmailAddress as EmailAddressValidator;
use Laminas\View\Model\ViewModel;
use Structure\Entity\Db\Etablissement;
use Structure\Service\EcoleDoctorale\EcoleDoctoraleServiceAwareTrait;
@@ -193,27 +192,22 @@ EOS

        $etablissement = $this->findEtablissementUtilisateur($userWrapper);

        if ($etablissement !== null) {
        $repo = $this->variableService->getRepository();
            $variable = $repo->findByCodeAndEtab(Variable::CODE_EMAIL_ASSISTANCE, $etablissement);
            if ($variable === null) {
                throw new RuntimeException(
                    "Anomalie: aucune adresse d'assistance trouvée dans les Variables pour l'établissement '$etablissement'.");
        $variables = [];
        if ($etablissement !== null) {
            // recherche de l'adresse d'assistance associé à l'établissement en question
            if ($variable = $repo->findOneByCodeAndEtab(Variable::CODE_EMAIL_ASSISTANCE, $etablissement)) {
                $variables[] = $variable;
            }

            $contact = $variable->getValeur();

            $v = new EmailAddressValidator();
            $contactValide = $v->isValid($contact);
        } else {
            $contact = null;
            $contactValide = false;
        }
        // si aucune variable trouvée, recherche des toutes les adresses d'assistance possibles
        if (empty($variables)) {
            $variables = $repo->findByCode(Variable::CODE_EMAIL_ASSISTANCE);
        }

        return [
            'etablissement' => $etablissement,
            'contact' => $contact,
            'contactValide' => $contactValide,
            'variables' => $variables,
            'individu' => $this->userContextService->getIdentityIndividu(),
            'utilisateur' => $this->userContextService->getIdentityDb(),
            'role' => $this->userContextService->getSelectedIdentityRole(),
+56 −43
Changes for module/Application/src/Application/Entity/Db/Repository/VariableRepository.php: 56 added lines, 43 removed lines.
Original line number Diff line number Diff line
@@ -2,37 +2,36 @@

namespace Application\Entity\Db\Repository;

use Application\Constants;
use Application\Entity\Db\Variable;
use DateTime;
use Doctrine\ORM\NonUniqueResultException;
use Structure\Entity\Db\Etablissement;
use These\Entity\Db\These;
use Application\Entity\Db\Variable;
use UnicaenApp\Exception\RuntimeException;

class VariableRepository extends DefaultEntityRepository
{
    /**
     * @see VariableRepository::findByCodeAndEtab()
     * Recherche une variable par son code et pour l'établissement de rattachement d'une thèse.
     *
     * @param string|string[] $code
     * @param string $code
     * @param These $these
     * @return Variable|Variable[]|null
     * @return Variable|null
     *
     * @see VariableRepository::findOneByCodeAndEtab()
     */
    public function findByCodeAndThese($code, These $these)
    public function findOneByCodeAndThese(string $code, These $these): ?Variable
    {
        $dateObservation = $these->getDateSoutenance() ?: $these->getDatePrevisionSoutenance();

        return $this->findByCodeAndEtab(
        return $this->findOneByCodeAndEtab(
            $code,
            $these->getEtablissement(),
            $dateObservation ?: new \DateTime());
            $dateObservation ?: new DateTime());
    }

    /**
     * Recherche d'une ou plusieurs variables.
     *
     * Valeurs retournée :
     * - Si un seul code est spécifié: null ou Variable trouvée.
     * - Si pluieurs codes sont spécifiés: tableau [code => Variable].
     * Recherche une variable par son code et l'établissement concerné.
     *
     * Une variable possède une période de validité. Seules les variables dont la période de validité
     * contient la date d'observation spécifiée sont retenues.
@@ -40,54 +39,68 @@ class VariableRepository extends DefaultEntityRepository
     * Si plusieurs variables sont valides à la date d'observation spécifiée, c'est celle dont la date de
     * fin de validité est la plus tardive qui est retenue.
     *
     * @param string|string[] $code
     * @param string $code
     * @param Etablissement $etab
     * @param \DateTime|null $dateObservation
     * @return null|Variable|Variable[]
     * @return null|Variable
     */
    public function findByCodeAndEtab($code, Etablissement $etab, \DateTime $dateObservation = null)
    public function findOneByCodeAndEtab(string $code, Etablissement $etab, DateTime $dateObservation = null): ?Variable
    {
        $dateObservation = $dateObservation ?: date_create('now');
        $dateObservation = $dateObservation ?: date_create();

        $qb = $this->createQueryBuilder('v');
        $qb
            ->where($qb->expr()->in('v.code', (array) $code))
            ->andWhere('v.etablissement = :etab')
            ->andWhere(':dateObservation BETWEEN v.dateDebutValidite AND v.dateFinValidite')
            ->orderBy('v.dateFinValidite', 'ASC') // tri chronologique important!
            ->orderBy('v.dateFinValidite', 'desc') // tri important!
            ->setParameter('etab', $etab)
            ->setParameter('dateObservation', $dateObservation)
        ;

        /** @var Variable[] $results */
        $results = $qb->getQuery()->getResult();

        if (! is_array($code)) {
            $variable =  current($results) ?: null;
            if ($variable === null) {
                throw new RuntimeException(sprintf(
                    "La valeur de la variable '%s' est manquante pour l'établissement '%s' " .
                    "à la date d'observation %s.",
                    $code, $etab->getStructure()->getCode(), $dateObservation->format(Constants::DATE_FORMAT)
                ));
        /** @var Variable|null $variable */
        try {
            $variable = $qb->getQuery()->getOneOrNullResult();
        } catch (NonUniqueResultException $e) {
            throw new RuntimeException("Anomalie : plusieurs Variables trouvées");
        }

//        if ($variable === null) {
//            throw new RuntimeException(sprintf(
//                "La valeur de la variable '%s' est manquante pour l'établissement '%s' " .
//                "à la date d'observation %s.",
//                $code, $etab->getStructure()->getCode(), $dateObservation->format(Constants::DATE_FORMAT)
//            ));
//        }

        return $variable;
    }

        $variables = [];
        foreach ($results as $v) {
            $variables[$v->getCode()] = $v;
        }
        foreach ($code as $c) {
            if (!isset($variables[$c])) {
                throw new RuntimeException(sprintf(
                    "La valeur de la variable '%s' est manquante pour l'établissement '%s' " .
                    "à la date d'observation %s.",
                    $c, $etab->getStructure()->getCode(), $dateObservation->format(Constants::DATE_FORMAT)
                ));
            }
        }
    /**
     * Recherche de variables par le code, pour tous les établissements.
     *
     * Une variable possède une période de validité. Seules les variables dont la période de validité
     * contient la date d'observation spécifiée sont retenues.
     *
     * Si plusieurs variables sont valides à la date d'observation spécifiée, c'est celle dont la date de
     * fin de validité est la plus tardive qui est retenue.
     *
     * @param string $code
     * @param \DateTime|null $dateObservation
     * @return Variable[]
     */
    public function findByCode(string $code, DateTime $dateObservation = null): array
    {
        $dateObservation = $dateObservation ?: date_create();

        $qb = $this->createQueryBuilder('v');
        $qb
            ->where($qb->expr()->in('v.code', (array) $code))
            ->andWhere(':dateObservation BETWEEN v.dateDebutValidite AND v.dateFinValidite')
            ->orderBy('v.dateFinValidite', 'desc') // tri important!
            ->setParameter('dateObservation', $dateObservation)
        ;

        return $variables;
        return $qb->getQuery()->getResult();
    }
}
 No newline at end of file
+1 −1
Changes for module/Application/src/Application/Service/Email/EmailTheseService.php: 1 added line, 1 removed line.
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ class EmailTheseService
     */
    public function fetchEmailBdd(These $these) : string
    {
        $variable = $this->variableService->getRepository()->findByCodeAndThese(Variable::CODE_EMAIL_BDD, $these);
        $variable = $this->variableService->getRepository()->findOneByCodeAndThese(Variable::CODE_EMAIL_BDD, $these);
        return $variable->getValeur();

    }
+2 −2
Changes for module/Application/src/Application/Service/Notification/NotificationFactory.php: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -155,7 +155,7 @@ class NotificationFactory extends \Notification\Service\NotificationFactory
     */
    private function fetchEmailBdd(These $these)
    {
        $variable = $this->variableService->getRepository()->findByCodeAndThese(Variable::CODE_EMAIL_BDD, $these);
        $variable = $this->variableService->getRepository()->findOneByCodeAndThese(Variable::CODE_EMAIL_BDD, $these);

        return $variable->getValeur();
    }
@@ -166,7 +166,7 @@ class NotificationFactory extends \Notification\Service\NotificationFactory
     */
    private function fetchEmailBu(These $these)
    {
        $variable = $this->variableService->getRepository()->findByCodeAndThese(Variable::CODE_EMAIL_BU, $these);
        $variable = $this->variableService->getRepository()->findOneByCodeAndThese(Variable::CODE_EMAIL_BU, $these);

        return $variable->getValeur();
    }
Loading