Loading CHANGELOG.md +1 −0 Changes for CHANGELOG.md: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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 ----- Loading module/Application/src/Application/Controller/IndexController.php +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 Loading @@ -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; Loading Loading @@ -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(), Loading module/Application/src/Application/Entity/Db/Repository/VariableRepository.php +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 Loading @@ -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. Loading @@ -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 module/Application/src/Application/Service/Email/EmailTheseService.php +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 Loading @@ -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(); } Loading module/Application/src/Application/Service/Notification/NotificationFactory.php +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 Loading @@ -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(); } Loading @@ -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 Loading
CHANGELOG.md +1 −0 Changes for CHANGELOG.md: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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 ----- Loading
module/Application/src/Application/Controller/IndexController.php +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 Loading @@ -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; Loading Loading @@ -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(), Loading
module/Application/src/Application/Entity/Db/Repository/VariableRepository.php +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 Loading @@ -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. Loading @@ -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
module/Application/src/Application/Service/Email/EmailTheseService.php +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 Loading @@ -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(); } Loading
module/Application/src/Application/Service/Notification/NotificationFactory.php +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 Loading @@ -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(); } Loading @@ -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