Loading module/RapportActivite/config/module.config.php +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading module/RapportActivite/src/RapportActivite/Event/Avis/RapportActiviteAvisEventListener.php +26 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -18,7 +19,7 @@ use Webmozart\Assert\Assert; class RapportActiviteAvisEventListener extends RapportActiviteOperationAbstractEventListener { use RapportActiviteOperationServiceAwareTrait; use RapportActiviteAvisNotificationRuleAwareTrait; /** * @inheritDoc */ Loading @@ -42,6 +43,7 @@ class RapportActiviteAvisEventListener extends RapportActiviteOperationAbstractE $this->handleSuppressionValidationDoctorant(); $this->handleNotificationOperationAttendue(); $this->handleNotificationAvisRespEDNotification(); } public function onAvisModifie(RapportActiviteAvisEvent $event) Loading Loading @@ -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 module/RapportActivite/src/RapportActivite/Event/Avis/RapportActiviteAvisEventListenerFactory.php +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading module/RapportActivite/src/RapportActivite/Notification/RapportActiviteAvisNotification.php +4 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading module/RapportActivite/src/RapportActivite/Rule/Avis/Notification/RapportActiviteAvisNotificationRule.php 0 → 100644 +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
module/RapportActivite/config/module.config.php +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading
module/RapportActivite/src/RapportActivite/Event/Avis/RapportActiviteAvisEventListener.php +26 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -18,7 +19,7 @@ use Webmozart\Assert\Assert; class RapportActiviteAvisEventListener extends RapportActiviteOperationAbstractEventListener { use RapportActiviteOperationServiceAwareTrait; use RapportActiviteAvisNotificationRuleAwareTrait; /** * @inheritDoc */ Loading @@ -42,6 +43,7 @@ class RapportActiviteAvisEventListener extends RapportActiviteOperationAbstractE $this->handleSuppressionValidationDoctorant(); $this->handleNotificationOperationAttendue(); $this->handleNotificationAvisRespEDNotification(); } public function onAvisModifie(RapportActiviteAvisEvent $event) Loading Loading @@ -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
module/RapportActivite/src/RapportActivite/Event/Avis/RapportActiviteAvisEventListenerFactory.php +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading
module/RapportActivite/src/RapportActivite/Notification/RapportActiviteAvisNotification.php +4 −4 Original line number Diff line number Diff line Loading @@ -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; } Loading
module/RapportActivite/src/RapportActivite/Rule/Avis/Notification/RapportActiviteAvisNotificationRule.php 0 → 100644 +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