Commit 65cfe399 authored by Thomas Hamel's avatar Thomas Hamel
Browse files

[Rapport activité] Envoi d'une notification aux GEST_ED lorsque le RESP_ED a donné son avis

parent 7a907b84
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -5,6 +5,8 @@ namespace RapportActivite;
use Application\Form\Factory\RapportAvisFormFactory;
use Application\Form\Rapport\RapportAvisForm;
use Application\Navigation\ApplicationNavigationFactory;
use RapportActivite\Rule\Avis\Notification\RapportActiviteAvisNotificationRule;
use RapportActivite\Rule\Avis\Notification\RapportActiviteAvisNotificationRuleFactory;
use UnicaenSearch\Controller\SearchControllerPluginFactory;
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
use Doctrine\ORM\Mapping\Driver\XmlDriver;
@@ -733,6 +735,7 @@ return [
            RapportActiviteValidationEventListener::class => RapportActiviteValidationEventListenerFactory::class,

            OperationAttendueNotificationRule::class => OperationAttendueNotificationRuleFactory::class,
            RapportActiviteAvisNotificationRule::class => RapportActiviteAvisNotificationRuleFactory::class,
            RapportActiviteCreationRule::class => RapportActiviteCreationRuleFactory::class,
            RapportActiviteOperationRule::class => RapportActiviteOperationRuleFactory::class,

+26 −1
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ use Laminas\EventManager\EventManagerInterface;
use RapportActivite\Entity\Db\RapportActiviteAvis;
use RapportActivite\Event\Operation\RapportActiviteOperationAbstractEventListener;
use RapportActivite\Event\RapportActiviteEvent;
use RapportActivite\Rule\Avis\Notification\RapportActiviteAvisNotificationRuleAwareTrait;
use RapportActivite\Service\Avis\RapportActiviteAvisService;
use RapportActivite\Service\Operation\RapportActiviteOperationServiceAwareTrait;
use Webmozart\Assert\Assert;
@@ -18,7 +19,7 @@ use Webmozart\Assert\Assert;
class RapportActiviteAvisEventListener extends RapportActiviteOperationAbstractEventListener
{
    use RapportActiviteOperationServiceAwareTrait;

    use RapportActiviteAvisNotificationRuleAwareTrait;
    /**
     * @inheritDoc
     */
@@ -42,6 +43,7 @@ class RapportActiviteAvisEventListener extends RapportActiviteOperationAbstractE

        $this->handleSuppressionValidationDoctorant();
        $this->handleNotificationOperationAttendue();
        $this->handleNotificationAvisRespEDNotification();
    }

    public function onAvisModifie(RapportActiviteAvisEvent $event)
@@ -108,4 +110,27 @@ class RapportActiviteAvisEventListener extends RapportActiviteOperationAbstractE
        $this->event->setMessages($messages);
        $this->event->addMessages($event->getMessages());
    }


    /**
     * Notification des personnes concernées suite au dépot de l'avis du responsable de l'ED.
     */
    protected function handleNotificationAvisRespEDNotification(): void
    {
        $rapportActiviteAvis = $this->operationRealisee;
        if ($rapportActiviteAvis->getAvis()->getAvisType()->getCode()
            !== RapportActiviteAvis::AVIS_TYPE__CODE__AVIS_RAPPORT_ACTIVITE_DIR_ED) return;

        $this->rapportActiviteAvisNotificationRule
            ->setRapportActiviteAvis($this->operationRealisee)
            ->execute();
        $notif = $this->rapportActiviteNotificationFactory->createNotificationAvisAjoute($rapportActiviteAvis);
        $this->rapportActiviteAvisNotificationRule->configureNotification($notif);

        $result = $this->notifierService->trigger($notif);

        $messages['info'] = ($result->getSuccessMessages()[0] ?? null);
        $messages['warning'] = ($result->getErrorMessages()[0] ?? null);
        $this->event->setMessages(array_filter($messages));
    }
}
 No newline at end of file
+5 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ namespace RapportActivite\Event\Avis;

use Notification\Service\NotifierService;
use Psr\Container\ContainerInterface;
use RapportActivite\Rule\Avis\Notification\RapportActiviteAvisNotificationRule;
use RapportActivite\Rule\Operation\Notification\OperationAttendueNotificationRule;
use RapportActivite\Rule\Operation\RapportActiviteOperationRule;
use RapportActivite\Service\Notification\RapportActiviteNotificationFactory;
@@ -35,6 +36,10 @@ class RapportActiviteAvisEventListenerFactory
        $rapportActiviteNotificationFactory = $container->get(RapportActiviteNotificationFactory::class);
        $listener->setRapportActiviteNotificationFactory($rapportActiviteNotificationFactory);

        /** @var RapportActiviteAvisNotificationRule $rapportActiviteAvisNotificationFactory */
        $rapportActiviteAvisNotificationFactory = $container->get(RapportActiviteAvisNotificationRule::class);
        $listener->setRapportActiviteAvisNotificationRule($rapportActiviteAvisNotificationFactory);

        /** @var \Notification\Service\NotifierService $notifierService */
        $notifierService = $container->get(NotifierService::class);
        $listener->setNotifierService($notifierService);
+4 −4
Original line number Diff line number Diff line
@@ -3,18 +3,18 @@
namespace RapportActivite\Notification;

use Notification\Notification;
use RapportActivite\Entity\Db\RapportActiviteAvis;
use RapportActivite\Entity\RapportActiviteOperationInterface;

class RapportActiviteAvisNotification extends Notification
{
    protected ?string $templatePath = 'rapport-activite/notification/avis';
    private RapportActiviteAvis $rapportActiviteAvis;
    private RapportActiviteOperationInterface $rapportActiviteAvis;
    private array $messagesByAvisValeurBool = [];

    /**
     * @param \RapportActivite\Entity\Db\RapportActiviteAvis $rapportActiviteAvis
     * @param RapportActiviteOperationInterface $rapportActiviteAvis
     */
    public function setRapportActiviteAvis(RapportActiviteAvis $rapportActiviteAvis): void
    public function setRapportActiviteAvis(RapportActiviteOperationInterface $rapportActiviteAvis): void
    {
        $this->rapportActiviteAvis = $rapportActiviteAvis;
    }
+82 −0
Original line number Diff line number Diff line
<?php

namespace RapportActivite\Rule\Avis\Notification;

use Application\Entity\Db\Role;
use Application\Service\Email\EmailServiceAwareTrait;
use Application\Service\Role\ApplicationRoleServiceAwareTrait;
use Closure;
use Individu\Entity\Db\Individu;
use Notification\Exception\RuntimeException;
use RapportActivite\Entity\RapportActiviteOperationInterface;
use RapportActivite\Notification\RapportActiviteAvisNotification;
use Rule\RuleInterface;

/**
 * Règles métiers concernant la notification en cas d'opération attendue sur un rapport d'activité.
 */
class RapportActiviteAvisNotificationRule implements RuleInterface
{
    use ApplicationRoleServiceAwareTrait;
    use EmailServiceAwareTrait;

    private RapportActiviteOperationInterface $rapportActiviteAvis;
    private bool $notificationRequired;
    private array $to;
    private array $cc;
    private string $subject;

    private Closure $emailAddressExtractor;

    public function __construct()
    {
        $this->emailAddressExtractor = fn(Individu $i) => $i->getEmailContact() ?: $i->getEmailPro() ?: $i->getEmailUtilisateur();
    }

    public function setRapportActiviteAvis(RapportActiviteOperationInterface $rapportActiviteAvis): self
    {
        $this->rapportActiviteAvis = $rapportActiviteAvis;
        return $this;
    }

    public function execute(): void
    {
        $these = $this->rapportActiviteAvis->getRapportActivite()->getThese();

        $to = $this->extractEmailsFromRapportActiviteAvisRole();
        $cc = [];
        $this->notificationRequired = true;
        $this->to = $to;
        $this->cc = $to;
        $this->subject = sprintf("%s de %s",
            $this->rapportActiviteAvis->getRapportActivite(),
            $these->getDoctorant(),
        );
    }

    private function extractEmailsFromRapportActiviteAvisRole(): array
    {
        $these = $this->rapportActiviteAvis->getRapportActivite()->getThese();

        $ecoleDoctorale = $these->getEcoleDoctorale();
        $roleCode = Role::CODE_GEST_ED;
        // Recherche des individus ayant le rôle attendu.
        $individusRoles = $this->applicationRoleService->findIndividuRoleByStructure($ecoleDoctorale->getStructure(), $roleCode, $these->getEtablissement());
        $emails = $this->emailService->collectEmailsFromIndividuRoles($individusRoles);

        if (empty($emails)) {
            throw new RuntimeException("Aucune adresse mail trouvée pour l'école doctorale de la thèse {$these->getId()}");
        }

        return $emails;
    }

    public function configureNotification(RapportActiviteAvisNotification $notif): void
    {
        $notif->setTo($this->to);
        $notif->setCc($this->cc);
        $notif->setSubject($this->subject);

        $notif->setRapportActiviteAvis($this->rapportActiviteAvis);
    }
}
 No newline at end of file
Loading