Loading config/autoload/global.php +40 −0 Changes for config/autoload/global.php: 40 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -32,6 +32,46 @@ return [ // Valeurs possibles: '30s', '1m', etc. (cf. "man timeout"). 'timeout' => '20s', ], 'liste-diffusion' => [ 'listes' => [ 'sygal.role.admin_tech@normandie-univ.fr', 'ed591.doctorants.insa@normandie-univ.fr', 'ed591.doctorants.ucn@normandie-univ.fr', 'ed591.doctorants.ulhn@normandie-univ.fr', 'ed591.doctorants.urn@normandie-univ.fr', 'ed591.doctorants@normandie-univ.fr', 'ed591.dirtheses@normandie-univ.fr', 'ed497.doctorants.insa@normandie-univ.fr', 'ed497.doctorants.ucn@normandie-univ.fr', 'ed497.doctorants.ulhn@normandie-univ.fr', 'ed497.doctorants.urn@normandie-univ.fr', 'ed497.doctorants@normandie-univ.fr', 'ed497.dirtheses@normandie-univ.fr', 'ed508.doctorants.insa@normandie-univ.fr', 'ed508.doctorants.ucn@normandie-univ.fr', 'ed508.doctorants.ulhn@normandie-univ.fr', 'ed508.doctorants.urn@normandie-univ.fr', 'ed508.doctorants@normandie-univ.fr', 'ed591.dirtheses@normandie-univ.fr', 'ed556.doctorants.insa@normandie-univ.fr', 'ed556.doctorants.ucn@normandie-univ.fr', 'ed556.doctorants.ulhn@normandie-univ.fr', 'ed556.doctorants.urn@normandie-univ.fr', 'ed556.doctorants@normandie-univ.fr', 'ed556.dirtheses@normandie-univ.fr', 'ed558.doctorants.insa@normandie-univ.fr', 'ed558.doctorants.ucn@normandie-univ.fr', 'ed558.doctorants.ulhn@normandie-univ.fr', 'ed558.doctorants.urn@normandie-univ.fr', 'ed558.doctorants@normandie-univ.fr', 'ed558.dirtheses@normandie-univ.fr', ], ], ], // Options pour le service de notification par mail 'notification' => [ Loading module/Application/config/others/liste-diffusion.config.php 0 → 100755 +103 −0 Changes for module/Application/config/others/liste-diffusion.config.php: 103 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace Application; use Application\Controller\Factory\ListeDiffusionControllerFactory; use Application\Controller\ListeDiffusionController; use Application\Service\ListeDiffusion\ListeDiffusionService; use Application\Service\ListeDiffusion\ListeDiffusionServiceFactory; use Application\Service\ListeDiffusion\Plugin\ListeDiffusionRolePlugin; use Application\Service\ListeDiffusion\ListeDiffusionRoleServiceFactory; use Application\Service\ListeDiffusion\Plugin\ListeDiffusionRolePluginFactory; use Application\Service\ListeDiffusion\Plugin\ListeDiffusionStructurePlugin; use Application\Service\ListeDiffusion\ListeDiffusionStructureServiceFactory; use Application\Service\ListeDiffusion\Plugin\ListeDiffusionStructurePluginFactory; use UnicaenAuth\Guard\PrivilegeController; use Zend\Mvc\Router\Http\Literal; use Zend\Mvc\Router\Http\Segment; return [ 'bjyauthorize' => [ 'guards' => [ PrivilegeController::class => [ [ 'controller' => ListeDiffusionController::class, 'action' => [ 'index', 'consulter', 'generate-member-include', 'generate-owner-include', ], 'roles' => [], ], ], ], ], 'router' => [ 'routes' => [ 'liste-diffusion' => [ 'type' => Literal::class, 'options' => [ 'route' => '/liste-diffusion', 'defaults' => [ 'controller' => ListeDiffusionController::class, 'action' => 'index', ], ], 'may_terminate' => true, 'child_routes' => [ 'liste' => [ 'type' => Segment::class, 'options' => [ 'route' => '/:liste', // exemple: /consulter/ed591.doctorants.ucn@normandie-univ.fr // exemple: /consulter/ed591.doctorants@normandie-univ.fr 'constraints' => [ 'liste' => '[a-zA-Z0-9-_.@]+', ], 'defaults' => [ /** @see ListeDiffusionController::consulterAction() */ 'action' => 'consulter', ], ], 'may_terminate' => true, 'child_routes' => [ 'generate-member-include' => [ 'type' => Literal::class, 'options' => [ 'route' => '/generate-member-include', 'defaults' => [ /** @see ListeDiffusionController::generateMemberIncludeAction() */ 'action' => 'generate-member-include', ], ], ], 'generate-owner-include' => [ 'type' => Literal::class, 'options' => [ 'route' => '/generate-owner-include', 'defaults' => [ /** @see ListeDiffusionController::generateOwnerIncludeAction() */ 'action' => 'generate-owner-include', ], ], ], ], ], ], ], ], ], 'service_manager' => [ 'factories' => [ ListeDiffusionService::class => ListeDiffusionServiceFactory::class, ListeDiffusionStructurePlugin::class => ListeDiffusionStructurePluginFactory::class, ListeDiffusionRolePlugin::class => ListeDiffusionRolePluginFactory::class, ], ], 'controllers' => [ 'factories' => [ ListeDiffusionController::class => ListeDiffusionControllerFactory::class, ], ], ]; module/Application/src/Application/Controller/Factory/ListeDiffusionControllerFactory.php 0 → 100644 +46 −0 Changes for module/Application/src/Application/Controller/Factory/ListeDiffusionControllerFactory.php: 46 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace Application\Controller\Factory; use Application\Controller\ListeDiffusionController; use Application\Service\File\FileService; use Application\Service\Individu\IndividuService; use Application\Service\ListeDiffusion\ListeDiffusionService; use Application\Service\Notification\NotifierService; use Zend\ServiceManager\ServiceLocatorInterface as ContainerInterface; class ListeDiffusionControllerFactory { public function __invoke(ContainerInterface $container) { $container = $container->getServiceLocator(); $controller = new ListeDiffusionController(); /** * @var ListeDiffusionService $individuService */ $individuService = $container->get(ListeDiffusionService::class); $controller->setListeDiffusionService($individuService); /** * @var IndividuService $individuService */ $individuService = $container->get('IndividuService'); $controller->setIndividuService($individuService); /** * @var FileService $fileService */ $fileService = $container->get(FileService::class); $controller->setFileService($fileService); /** * @var NotifierService $notifierService */ $notifierService = $container->get(NotifierService::class); $controller->setNotifierService($notifierService); return $controller; } } No newline at end of file module/Application/src/Application/Controller/ListeDiffusionController.php 0 → 100644 +167 −0 Changes for module/Application/src/Application/Controller/ListeDiffusionController.php: 167 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace Application\Controller; use Application\Entity\Db\Individu; use Application\Entity\Db\Role; use Application\Service\File\FileServiceAwareTrait; use Application\Service\Individu\IndividuServiceAwareTrait; use Application\Service\ListeDiffusion\ListeDiffusionServiceAwareTrait; use Application\Service\Notification\NotifierServiceAwareTrait; use Webmozart\Assert\Assert; use Zend\View\Model\ViewModel; class ListeDiffusionController extends AbstractController { use ListeDiffusionServiceAwareTrait; use IndividuServiceAwareTrait; use FileServiceAwareTrait; use NotifierServiceAwareTrait; /** * Adresse complète de la liste de diffusion, ex : * - ed591.doctorants.insa@normandie-univ.fr * - ed591.doctorants@normandie-univ.fr * - ed591.dirtheses@normandie-univ.fr * * Où : * - '591' est le numéro national de l'école doctorale ; * - 'doctorants' (ou 'dirtheses') est la "cible" ; * - 'insa' est le source_code unique de l'établissement en minuscules. * * @var string */ protected $liste; /** * @return array|ViewModel */ public function indexAction() { $listes = $this->listeDiffusionService->fetchListesDiffusion(); return new ViewModel([ 'listes' => $listes, ]); } /** * @return ViewModel */ public function consulterAction() { $this->loadRequestParams(); $listesDeclarees = $this->listeDiffusionService->fetchListesDiffusion(); Assert::inArray($this->liste, $listesDeclarees, "Liste spécifiée non déclarée."); $this->listeDiffusionService->setListe($this->liste); $this->listeDiffusionService->init(); $this->listeDiffusionService->createMemberIncludeFileContent(); $memberIndividusAvecAdresse = $this->listeDiffusionService->getIndividusAvecAdresse(); $memberIndividusSansAdresse = $this->listeDiffusionService->getIndividusSansAdresse(); $this->listeDiffusionService->createOwnerIncludeFileContent(); $ownerIndividusAvecAdresse = $this->listeDiffusionService->getIndividusAvecAdresse(); $ownerIndividusSansAdresse = $this->listeDiffusionService->getIndividusSansAdresse(); return new ViewModel([ 'liste' => $this->liste, 'memberIndividusAvecAdresse' => $memberIndividusAvecAdresse, 'memberIndividusSansAdresse' => $memberIndividusSansAdresse, 'ownerIndividusAvecAdresse' => $ownerIndividusAvecAdresse, 'ownerIndividusSansAdresse' => $ownerIndividusSansAdresse, ]); } /** * Dépouillage des paramètres de la requête. * * Les paramètres de routage acceptés sont les suivants : * - `liste` (OBLIGATOIRE) : cf. {@see $liste}. */ private function loadRequestParams() { $this->liste = $this->getRequestedListe(); // ex: 'ed591.doctorants.insa@normandie-univ.fr' } /** * Génération du fichier attendu par Sympa pour obtenir les ABONNÉS d'une liste de diffusion. * * Le fichier retourné contient une adresse électronique par ligne. */ public function generateMemberIncludeAction() { $this->loadRequestParams(); $this->listeDiffusionService->setListe($this->liste); $this->listeDiffusionService->init(); $content = $this->listeDiffusionService->createMemberIncludeFileContent(); $this->handleMemberIncludeNotFoundEmails(); $filename = $this->listeDiffusionService->generateResultFileName('member'); $this->fileService->downloadFileFromContent($content, $filename); } /** * Génération du fichier attendu par Sympa pour obtenir les PROPRIÉTAIRES d'une liste de diffusion. * * Le fichier retourné contient une adresse électronique par ligne. */ public function generateOwnerIncludeAction() { $this->loadRequestParams(); $this->listeDiffusionService->setListe($this->liste); $this->listeDiffusionService->init(); $content = $this->listeDiffusionService->createOwnerIncludeFileContent(); $this->handleOwnerIncludeNotFoundEmails(); $filename = $this->listeDiffusionService->generateResultFileName('owner'); $this->fileService->downloadFileFromContent($content, $filename); } /** * Gestion des ABONNÉS sans adresse mail. */ private function handleMemberIncludeNotFoundEmails() { $individusSansAdresse = $this->listeDiffusionService->getIndividusSansAdresse(); // Solution retenue : Envoi d'une notif aux propriétaires de la liste. $ownerEmails = $this->fetchAdminTechEmails(); $this->notifierService->triggerAbonnesListeDiffusionSansAdresse($ownerEmails, $this->liste, $individusSansAdresse); } /** * Gestion des PROPRÉTAIRES sans adresse mail. */ private function handleOwnerIncludeNotFoundEmails() { } /** * @return string */ private function getRequestedListe() { $liste = $this->params()->fromRoute('liste'); Assert::notNull($liste, "Aucune liste spécifiée."); return $liste; } /** * @return string[] */ private function fetchAdminTechEmails() { $individus = $this->individuService->getRepository()->findByRole(Role::CODE_ADMIN_TECH); return array_map(function(Individu $i) { return $i->getEmailUtilisateur(); }, $individus); } } No newline at end of file module/Application/src/Application/Entity/Db/Acteur.php +3 −2 Changes for module/Application/src/Application/Entity/Db/Acteur.php: 3 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ namespace Application\Entity\Db; use Application\Entity\Db\Interfaces\IndividuAwareInterface; use UnicaenApp\Entity\HistoriqueAwareInterface; use UnicaenApp\Entity\HistoriqueAwareTrait; use UnicaenImport\Entity\Db\Traits\SourceAwareTrait; Loading @@ -20,7 +21,7 @@ use Zend\Permissions\Acl\Resource\ResourceInterface; * @var string $etalissement l'étabilissement d'attachement de l'acteur (p.e. Université de Caen Normandie, * ...) */ class Acteur implements HistoriqueAwareInterface, ResourceInterface class Acteur implements HistoriqueAwareInterface, ResourceInterface, IndividuAwareInterface { use HistoriqueAwareTrait; use SourceAwareTrait; Loading Loading @@ -223,7 +224,7 @@ class Acteur implements HistoriqueAwareInterface, ResourceInterface * @param Individu $individu * @return self */ public function setIndividu($individu) public function setIndividu(Individu $individu = null) { $this->individu = $individu; Loading Loading
config/autoload/global.php +40 −0 Changes for config/autoload/global.php: 40 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -32,6 +32,46 @@ return [ // Valeurs possibles: '30s', '1m', etc. (cf. "man timeout"). 'timeout' => '20s', ], 'liste-diffusion' => [ 'listes' => [ 'sygal.role.admin_tech@normandie-univ.fr', 'ed591.doctorants.insa@normandie-univ.fr', 'ed591.doctorants.ucn@normandie-univ.fr', 'ed591.doctorants.ulhn@normandie-univ.fr', 'ed591.doctorants.urn@normandie-univ.fr', 'ed591.doctorants@normandie-univ.fr', 'ed591.dirtheses@normandie-univ.fr', 'ed497.doctorants.insa@normandie-univ.fr', 'ed497.doctorants.ucn@normandie-univ.fr', 'ed497.doctorants.ulhn@normandie-univ.fr', 'ed497.doctorants.urn@normandie-univ.fr', 'ed497.doctorants@normandie-univ.fr', 'ed497.dirtheses@normandie-univ.fr', 'ed508.doctorants.insa@normandie-univ.fr', 'ed508.doctorants.ucn@normandie-univ.fr', 'ed508.doctorants.ulhn@normandie-univ.fr', 'ed508.doctorants.urn@normandie-univ.fr', 'ed508.doctorants@normandie-univ.fr', 'ed591.dirtheses@normandie-univ.fr', 'ed556.doctorants.insa@normandie-univ.fr', 'ed556.doctorants.ucn@normandie-univ.fr', 'ed556.doctorants.ulhn@normandie-univ.fr', 'ed556.doctorants.urn@normandie-univ.fr', 'ed556.doctorants@normandie-univ.fr', 'ed556.dirtheses@normandie-univ.fr', 'ed558.doctorants.insa@normandie-univ.fr', 'ed558.doctorants.ucn@normandie-univ.fr', 'ed558.doctorants.ulhn@normandie-univ.fr', 'ed558.doctorants.urn@normandie-univ.fr', 'ed558.doctorants@normandie-univ.fr', 'ed558.dirtheses@normandie-univ.fr', ], ], ], // Options pour le service de notification par mail 'notification' => [ Loading
module/Application/config/others/liste-diffusion.config.php 0 → 100755 +103 −0 Changes for module/Application/config/others/liste-diffusion.config.php: 103 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace Application; use Application\Controller\Factory\ListeDiffusionControllerFactory; use Application\Controller\ListeDiffusionController; use Application\Service\ListeDiffusion\ListeDiffusionService; use Application\Service\ListeDiffusion\ListeDiffusionServiceFactory; use Application\Service\ListeDiffusion\Plugin\ListeDiffusionRolePlugin; use Application\Service\ListeDiffusion\ListeDiffusionRoleServiceFactory; use Application\Service\ListeDiffusion\Plugin\ListeDiffusionRolePluginFactory; use Application\Service\ListeDiffusion\Plugin\ListeDiffusionStructurePlugin; use Application\Service\ListeDiffusion\ListeDiffusionStructureServiceFactory; use Application\Service\ListeDiffusion\Plugin\ListeDiffusionStructurePluginFactory; use UnicaenAuth\Guard\PrivilegeController; use Zend\Mvc\Router\Http\Literal; use Zend\Mvc\Router\Http\Segment; return [ 'bjyauthorize' => [ 'guards' => [ PrivilegeController::class => [ [ 'controller' => ListeDiffusionController::class, 'action' => [ 'index', 'consulter', 'generate-member-include', 'generate-owner-include', ], 'roles' => [], ], ], ], ], 'router' => [ 'routes' => [ 'liste-diffusion' => [ 'type' => Literal::class, 'options' => [ 'route' => '/liste-diffusion', 'defaults' => [ 'controller' => ListeDiffusionController::class, 'action' => 'index', ], ], 'may_terminate' => true, 'child_routes' => [ 'liste' => [ 'type' => Segment::class, 'options' => [ 'route' => '/:liste', // exemple: /consulter/ed591.doctorants.ucn@normandie-univ.fr // exemple: /consulter/ed591.doctorants@normandie-univ.fr 'constraints' => [ 'liste' => '[a-zA-Z0-9-_.@]+', ], 'defaults' => [ /** @see ListeDiffusionController::consulterAction() */ 'action' => 'consulter', ], ], 'may_terminate' => true, 'child_routes' => [ 'generate-member-include' => [ 'type' => Literal::class, 'options' => [ 'route' => '/generate-member-include', 'defaults' => [ /** @see ListeDiffusionController::generateMemberIncludeAction() */ 'action' => 'generate-member-include', ], ], ], 'generate-owner-include' => [ 'type' => Literal::class, 'options' => [ 'route' => '/generate-owner-include', 'defaults' => [ /** @see ListeDiffusionController::generateOwnerIncludeAction() */ 'action' => 'generate-owner-include', ], ], ], ], ], ], ], ], ], 'service_manager' => [ 'factories' => [ ListeDiffusionService::class => ListeDiffusionServiceFactory::class, ListeDiffusionStructurePlugin::class => ListeDiffusionStructurePluginFactory::class, ListeDiffusionRolePlugin::class => ListeDiffusionRolePluginFactory::class, ], ], 'controllers' => [ 'factories' => [ ListeDiffusionController::class => ListeDiffusionControllerFactory::class, ], ], ];
module/Application/src/Application/Controller/Factory/ListeDiffusionControllerFactory.php 0 → 100644 +46 −0 Changes for module/Application/src/Application/Controller/Factory/ListeDiffusionControllerFactory.php: 46 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace Application\Controller\Factory; use Application\Controller\ListeDiffusionController; use Application\Service\File\FileService; use Application\Service\Individu\IndividuService; use Application\Service\ListeDiffusion\ListeDiffusionService; use Application\Service\Notification\NotifierService; use Zend\ServiceManager\ServiceLocatorInterface as ContainerInterface; class ListeDiffusionControllerFactory { public function __invoke(ContainerInterface $container) { $container = $container->getServiceLocator(); $controller = new ListeDiffusionController(); /** * @var ListeDiffusionService $individuService */ $individuService = $container->get(ListeDiffusionService::class); $controller->setListeDiffusionService($individuService); /** * @var IndividuService $individuService */ $individuService = $container->get('IndividuService'); $controller->setIndividuService($individuService); /** * @var FileService $fileService */ $fileService = $container->get(FileService::class); $controller->setFileService($fileService); /** * @var NotifierService $notifierService */ $notifierService = $container->get(NotifierService::class); $controller->setNotifierService($notifierService); return $controller; } } No newline at end of file
module/Application/src/Application/Controller/ListeDiffusionController.php 0 → 100644 +167 −0 Changes for module/Application/src/Application/Controller/ListeDiffusionController.php: 167 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace Application\Controller; use Application\Entity\Db\Individu; use Application\Entity\Db\Role; use Application\Service\File\FileServiceAwareTrait; use Application\Service\Individu\IndividuServiceAwareTrait; use Application\Service\ListeDiffusion\ListeDiffusionServiceAwareTrait; use Application\Service\Notification\NotifierServiceAwareTrait; use Webmozart\Assert\Assert; use Zend\View\Model\ViewModel; class ListeDiffusionController extends AbstractController { use ListeDiffusionServiceAwareTrait; use IndividuServiceAwareTrait; use FileServiceAwareTrait; use NotifierServiceAwareTrait; /** * Adresse complète de la liste de diffusion, ex : * - ed591.doctorants.insa@normandie-univ.fr * - ed591.doctorants@normandie-univ.fr * - ed591.dirtheses@normandie-univ.fr * * Où : * - '591' est le numéro national de l'école doctorale ; * - 'doctorants' (ou 'dirtheses') est la "cible" ; * - 'insa' est le source_code unique de l'établissement en minuscules. * * @var string */ protected $liste; /** * @return array|ViewModel */ public function indexAction() { $listes = $this->listeDiffusionService->fetchListesDiffusion(); return new ViewModel([ 'listes' => $listes, ]); } /** * @return ViewModel */ public function consulterAction() { $this->loadRequestParams(); $listesDeclarees = $this->listeDiffusionService->fetchListesDiffusion(); Assert::inArray($this->liste, $listesDeclarees, "Liste spécifiée non déclarée."); $this->listeDiffusionService->setListe($this->liste); $this->listeDiffusionService->init(); $this->listeDiffusionService->createMemberIncludeFileContent(); $memberIndividusAvecAdresse = $this->listeDiffusionService->getIndividusAvecAdresse(); $memberIndividusSansAdresse = $this->listeDiffusionService->getIndividusSansAdresse(); $this->listeDiffusionService->createOwnerIncludeFileContent(); $ownerIndividusAvecAdresse = $this->listeDiffusionService->getIndividusAvecAdresse(); $ownerIndividusSansAdresse = $this->listeDiffusionService->getIndividusSansAdresse(); return new ViewModel([ 'liste' => $this->liste, 'memberIndividusAvecAdresse' => $memberIndividusAvecAdresse, 'memberIndividusSansAdresse' => $memberIndividusSansAdresse, 'ownerIndividusAvecAdresse' => $ownerIndividusAvecAdresse, 'ownerIndividusSansAdresse' => $ownerIndividusSansAdresse, ]); } /** * Dépouillage des paramètres de la requête. * * Les paramètres de routage acceptés sont les suivants : * - `liste` (OBLIGATOIRE) : cf. {@see $liste}. */ private function loadRequestParams() { $this->liste = $this->getRequestedListe(); // ex: 'ed591.doctorants.insa@normandie-univ.fr' } /** * Génération du fichier attendu par Sympa pour obtenir les ABONNÉS d'une liste de diffusion. * * Le fichier retourné contient une adresse électronique par ligne. */ public function generateMemberIncludeAction() { $this->loadRequestParams(); $this->listeDiffusionService->setListe($this->liste); $this->listeDiffusionService->init(); $content = $this->listeDiffusionService->createMemberIncludeFileContent(); $this->handleMemberIncludeNotFoundEmails(); $filename = $this->listeDiffusionService->generateResultFileName('member'); $this->fileService->downloadFileFromContent($content, $filename); } /** * Génération du fichier attendu par Sympa pour obtenir les PROPRIÉTAIRES d'une liste de diffusion. * * Le fichier retourné contient une adresse électronique par ligne. */ public function generateOwnerIncludeAction() { $this->loadRequestParams(); $this->listeDiffusionService->setListe($this->liste); $this->listeDiffusionService->init(); $content = $this->listeDiffusionService->createOwnerIncludeFileContent(); $this->handleOwnerIncludeNotFoundEmails(); $filename = $this->listeDiffusionService->generateResultFileName('owner'); $this->fileService->downloadFileFromContent($content, $filename); } /** * Gestion des ABONNÉS sans adresse mail. */ private function handleMemberIncludeNotFoundEmails() { $individusSansAdresse = $this->listeDiffusionService->getIndividusSansAdresse(); // Solution retenue : Envoi d'une notif aux propriétaires de la liste. $ownerEmails = $this->fetchAdminTechEmails(); $this->notifierService->triggerAbonnesListeDiffusionSansAdresse($ownerEmails, $this->liste, $individusSansAdresse); } /** * Gestion des PROPRÉTAIRES sans adresse mail. */ private function handleOwnerIncludeNotFoundEmails() { } /** * @return string */ private function getRequestedListe() { $liste = $this->params()->fromRoute('liste'); Assert::notNull($liste, "Aucune liste spécifiée."); return $liste; } /** * @return string[] */ private function fetchAdminTechEmails() { $individus = $this->individuService->getRepository()->findByRole(Role::CODE_ADMIN_TECH); return array_map(function(Individu $i) { return $i->getEmailUtilisateur(); }, $individus); } } No newline at end of file
module/Application/src/Application/Entity/Db/Acteur.php +3 −2 Changes for module/Application/src/Application/Entity/Db/Acteur.php: 3 added lines, 2 removed lines. Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ namespace Application\Entity\Db; use Application\Entity\Db\Interfaces\IndividuAwareInterface; use UnicaenApp\Entity\HistoriqueAwareInterface; use UnicaenApp\Entity\HistoriqueAwareTrait; use UnicaenImport\Entity\Db\Traits\SourceAwareTrait; Loading @@ -20,7 +21,7 @@ use Zend\Permissions\Acl\Resource\ResourceInterface; * @var string $etalissement l'étabilissement d'attachement de l'acteur (p.e. Université de Caen Normandie, * ...) */ class Acteur implements HistoriqueAwareInterface, ResourceInterface class Acteur implements HistoriqueAwareInterface, ResourceInterface, IndividuAwareInterface { use HistoriqueAwareTrait; use SourceAwareTrait; Loading Loading @@ -223,7 +224,7 @@ class Acteur implements HistoriqueAwareInterface, ResourceInterface * @param Individu $individu * @return self */ public function setIndividu($individu) public function setIndividu(Individu $individu = null) { $this->individu = $individu; Loading