Commit 5d13f498 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

[FIX] Notification d'ouverture des inscriptions à une session de formation :...

[FIX] Notification d'ouverture des inscriptions à une session de formation : correction pour le cas où la structure valide est de type établissement.
parent e35f524f
Loading
Loading
Loading
Loading
+1 −0
Changes for CHANGELOG.md: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ infobulle d'explication en cas de contrainte non respectée (ex: nb d'émérites
- [FIX] Point médian dans un label du formulaire de création/modification d'une qualité de membre du jury.
- [FIX] Proposition de soutenance : bouton 'Valider la proposition de soutenance' visible à tort pour le doctorant.
- [FIX] Saisie du titre d'accès d'une thèse : exclusion des établissements historisés dans la liste déroulante.
- [FIX] Notification d'ouverture des inscriptions à une session de formation : correction pour le cas où la structure valide est de type établissement.

9.1.1
-----
+4 −2
Changes for module/Application/src/Application/Service/ListeDiffusion/ListeDiffusionService.php: 4 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -107,11 +107,13 @@ class ListeDiffusionService extends BaseService
    }

    /**
     * Fetche toutes les listes de diffusion sous la forme d'un tableau dont les clés sont les adresse mail.
     *
     * @return ListeDiffusion[]
     */
    public function fetchListesDiffusionActives()
    public function fetchListesDiffusionActives(): array
    {
        return $this->getRepository()->findAll();
        return $this->getRepository()->createQueryBuilder('ld')->indexBy('ld', 'ld.adresse')->getQuery()->getResult();
    }

    /**
+22 −15
Changes for module/Formation/src/Formation/Controller/SessionController.php: 22 added lines, 15 removed lines.
Original line number Diff line number Diff line
@@ -255,7 +255,7 @@ class SessionController extends AbstractController
                        $structuresValides = $session->getStructuresValides();

                        if ($formationSpecifique) {
                            if ($structuresValides instanceof PersistentCollection && !$structuresValides->isEmpty()) {
                            if (!$structuresValides->isEmpty()) {
                                $this->triggerNotificationFormationSpecifiqueAjoutee($session);
                                break;
                            } else {
@@ -300,15 +300,23 @@ class SessionController extends AbstractController
        }
    }

    private function triggerNotificationFormationSpecifiqueAjoutee(Session $session)
    private function triggerNotificationFormationSpecifiqueAjoutee(Session $session): void
    {
        $destinataires = [];
        $notifs = [];
        $errorMessages = [];
        /** @var SessionStructureValide $structureValide */
        foreach ($session->getStructuresValides() as $structureValide) {
            //on notifie les doctorants des structures non historisées
            if(!$structureValide->estHistorise()){
            try {
                    $notif = $this->formationNotificationFactory->createNotificationFormationSpecifiqueAjoutee($session->getFormation(), $structureValide);
                $notifs[] = $this->formationNotificationFactory->createNotificationFormationSpecifiqueAjoutee($session->getFormation(), $structureValide);
            } catch (NotificationRuntimeException $e) {
                $errorMessages[] = $e->getMessage();
            }
        }

        // NB : aucun envoi si un pb a été rencontré à la création/init de la notif (ex : liste de diff non active)
        $destinataires = [];
        if (count($errorMessages) === 0) {
            foreach ($notifs as $notif) {
                $result = $this->notifierService->trigger($notif);
                if (!empty($result->getErrorMessages())) {
                    $this->flashMessenger()->addErrorMessage($result->getErrorMessages()[0] . " (" . $structureValide->getStructure()->getEcoleDoctorale() . ").");
@@ -316,15 +324,12 @@ class SessionController extends AbstractController
                    //Si il n'y a pas d'erreurs, on informe l'utilisateur des destinataires notifiés
                    $destinataires[] = $notif->getTo();
                }
                } catch (RuntimeException $e) {
                    $errorMessages[] = $e->getMessage();
                }
            }
            }

        if (!empty($errorMessages)) {
            $errorMessage = implode(", ", $errorMessages);
            $this->flashMessenger()->addErrorMessage("Les doctorants de(s) ED <b>".$errorMessage."</b> n'ont pas reçu de mail, puisqu'aucune liste de diffusion n'a été trouvée");
        } else {
            $errorMessage = implode("<br>", $errorMessages);
            $this->flashMessenger()->addErrorMessage(
                "La notification par mail (de l'ouverture des inscriptions) des doctorants n'a pas pu être effectuée. " . $errorMessage
            );
        }

        //Si il y a au moins un destinataire qui a pu recevoir un mail
@@ -335,7 +340,9 @@ class SessionController extends AbstractController
            }, []);
            $destinataires = implode(', ', $destinataires);

            $this->flashMessenger()->addInfoMessage("Une notification par mail (de l'ouverture des inscriptions) a été envoyée aux doctorants appartenant à la liste de diffusion suivante : " . $destinataires);
            $this->flashMessenger()->addInfoMessage(
                "Une notification par mail (de l'ouverture des inscriptions) a été envoyée aux doctorants appartenant aux listes de diffusion suivantes : " . $destinataires
            );
        }
    }

+5 −1
Changes for module/Formation/src/Formation/Entity/Db/Session.php: 5 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ use Formation\Entity\Db\Traits\HasTypeTrait;
use Individu\Entity\Db\Individu;
use JetBrains\PhpStorm\Pure;
use Laminas\Permissions\Acl\Resource\ResourceInterface;
use Structure\Entity\Db\Structure;
use UnicaenUtilisateur\Entity\Db\HistoriqueAwareInterface;
use UnicaenUtilisateur\Entity\Db\HistoriqueAwareTrait;

@@ -104,9 +105,12 @@ class Session implements HistoriqueAwareInterface,
        $this->etat = $etat;
    }

    /**
     * Retourne les structures valides non historisées.
     */
    public function getStructuresValides(): Collection
    {
        return $this->structuresValides;
        return $this->structuresValides->filter(fn(SessionStructureValide $ssv) => $ssv->getStructure()->estNonHistorise());
    }

    public function getSeances() : Collection
+11 −12
Changes for module/Formation/src/Formation/Service/Notification/FormationNotificationFactory.php: 11 added lines, 12 removed lines.
Original line number Diff line number Diff line
@@ -308,9 +308,14 @@ class FormationNotificationFactory extends NotificationFactory
    /** FORMATIONS ******************************************************************************************************/
    public function createNotificationFormationSpecifiqueAjoutee(Formation $formation, SessionStructureValide $structureValide): Notification
    {
        $ed = $structureValide->getStructure()->getEcoleDoctorale();
        $role = $this->applicationRoleService->getRepository()->findOneBy(["code" => Role::CODE_DOCTORANT]);
        $ng = $this->listeDiffusionService->createNameGenerator($ed, $role, null);
        $ed = $structureValide->getStructure()->getEcoleDoctorale(); // NB: est null si la structure n'est pas une ED
        $role = $this->applicationRoleService->getRepository()->findByCode(Role::CODE_DOCTORANT);
        $etablissement = null;
        if ($structureValide->getStructure()->getTypeStructure()->isEtablissement()) {
            $etablissement = $structureValide->getStructure();
        }

        $ng = $this->listeDiffusionService->createNameGenerator($ed, $role, $etablissement);
        $domain = $this->listeDiffusionService->getEmailDomain();
        $ng->setDomain($domain);

@@ -321,15 +326,9 @@ class FormationNotificationFactory extends NotificationFactory
        $rendu = $this->getRenduService()->generateRenduByTemplateCode(MailTemplates::FORMATION_SPECIFIQUE_AJOUTEE, $vars);
        $mail = $ng->generateName();

        $listesDiffusionActives = $this->listeDiffusionService->fetchListesDiffusionActives();
        foreach ($listesDiffusionActives as $listeDiffusion) {
            $listesDiffusionActivess[$listeDiffusion->getAdresse()] = $listeDiffusion;
        }
        $adressesListesActives = array_keys($listesDiffusionActivess);

        //si une liste a été récupérée et qu'elle n'est pas active
        if(!$mail || !in_array($mail, $adressesListesActives)){
            throw new RuntimeException($ed);
        // si la liste de diff ne fait pas partie de celles activées, stop
        if (!array_key_exists($mail, $this->listeDiffusionService->fetchListesDiffusionActives())) {
            throw new RuntimeException("L'adresse de destination $mail ne fait pas partie des listes de diffusion actives.");
        }

        $notif = new Notification();