Commit fce37c58 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

WIP liste diff gest et resp ed

parent 6f2c1935
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -84,6 +84,8 @@ class ListeDiffusionController extends AbstractController
        $codesRolesAvecTemoinsED = [
            Role::CODE_DOCTORANT => true,
            Role::CODE_DIRECTEUR_THESE => true,
            Role::CODE_GEST_ED => true,
            Role::CODE_RESP_ED => true,
            Role::CODE_BU => false,
            Role::CODE_BDD => false,
            Role::CODE_ADMIN_TECH => false, // NB: pas de structure liée
@@ -96,7 +98,8 @@ class ListeDiffusionController extends AbstractController
        $roles = array_filter($roles, function(Role $role) use ($etablissementsAsStructures) {
            return
                $role->getStructure() === null || // ex: Admin tech
                in_array($role->getStructure(), $etablissementsAsStructures);
                $role->getStructure()->getTypeStructure()->isEcoleDoctorale() ||
                $role->getStructure()->getTypeStructure()->isEtablissement() && in_array($role->getStructure(), $etablissementsAsStructures);
        });
        $this->prepareDataForView($etablissements, $ecolesDoctorales, $roles, $codesRolesAvecTemoinsED);
        $this->loadListesDiffusionActives();
@@ -221,9 +224,6 @@ class ListeDiffusionController extends AbstractController
            }
            $dataByEtablissement->attach($etablissement, $dataByRole);
        }
        $rolesAvecTemoinsED = array_filter($roles, function (Role $r) use ($codesRolesAvecTemoinsED) {
            return $codesRolesAvecTemoinsED[$r->getCode()] === true;
        });

        if (count($etablissements) > 1) {
            //
@@ -232,6 +232,9 @@ class ListeDiffusionController extends AbstractController
            /** @var Role $rolePrec */
            $rolePrec = null;
            $dataByRole = new SplObjectStorage();
            $rolesAvecTemoinsED = array_filter($roles, function (Role $r) use ($codesRolesAvecTemoinsED) {
                return $codesRolesAvecTemoinsED[$r->getCode()] === true;
            });
            foreach ($rolesAvecTemoinsED as $role) {
                if ($rolePrec && ($isSameRoleAgain = $rolePrec->getCode() === $role->getCode())) {
                    continue; // on ne retient qu'un rôle pour tous les établissements confondus
+3 −3
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ class EmailTheseService
    public function fetchEmailEcoleDoctorale(These $these) : array
    {
        /** @var IndividuRole[] $individuRoles */
        $individuRoles = $this->roleService->getIndividuRoleByStructure($these->getEcoleDoctorale()->getStructure());
        $individuRoles = $this->roleService->findIndividuRolesByStructure($these->getEcoleDoctorale()->getStructure());
        return $this->fetchEmailsByEtablissement($individuRoles, $these);
    }

@@ -95,7 +95,7 @@ class EmailTheseService
    public function fetchEmailUniteRecherche(These $these) : array
    {
        /** @var IndividuRole[] $individuRoles */
        $individuRoles = $this->roleService->getIndividuRoleByStructure($these->getUniteRecherche()->getStructure());
        $individuRoles = $this->roleService->findIndividuRolesByStructure($these->getUniteRecherche()->getStructure());
        return $this->fetchEmailsByEtablissement($individuRoles, $these);
    }

@@ -106,7 +106,7 @@ class EmailTheseService
    public function fetchEmailMaisonDuDoctorat(These $these) : array
    {
        /** @var IndividuRole[] $individuRoles */
        $individuRoles = $this->roleService->getIndividuRoleByStructure($these->getEtablissement()->getStructure());
        $individuRoles = $this->roleService->findIndividuRolesByStructure($these->getEtablissement()->getStructure());
        $individuRoles = array_filter($individuRoles, function (IndividuRole $ir) { return $ir->getRole()->getCode() === Role::CODE_BDD;});
        return $this->fetchEmailsByEtablissement($individuRoles, $these);
    }
+9 −2
Original line number Diff line number Diff line
@@ -10,10 +10,17 @@ use Webmozart\Assert\Assert;

class ListeDiffusionAddressGenerator
{
    const CODE_ROLE_ALIAS_DOCTORANT = 'doctorants';
    const CODE_ROLE_ALIAS_DIRECTEUR_THESE = 'dirtheses';
    const CODE_ROLE_ALIAS_GEST_ED = 'gest-ed';
    const CODE_ROLE_ALIAS_RESP_ED = 'resp-ed';

    const SEPARATOR = '.';
    const CODES_ROLES_ALIASES = [
        Role::CODE_DOCTORANT => 'doctorants',
        Role::CODE_DIRECTEUR_THESE => 'dirtheses',
        Role::CODE_DOCTORANT => self::CODE_ROLE_ALIAS_DOCTORANT,
        Role::CODE_DIRECTEUR_THESE => self::CODE_ROLE_ALIAS_DIRECTEUR_THESE,
        Role::CODE_GEST_ED => self::CODE_ROLE_ALIAS_GEST_ED,
        Role::CODE_RESP_ED => self::CODE_ROLE_ALIAS_RESP_ED,
    ];

    /**
+11 −11
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
    /**
     * @var string[]
     */
    protected $config = [];
    protected array $config = [];

    /**
     * @var ListeDiffusionAddressParser
@@ -49,12 +49,12 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
    /**
     * @var Individu[]
     */
    protected $individusAvecAdresse = [];
    protected array $individusAvecAdresse = [];

    /**
     * @var Individu[]
     */
    protected $individusSansAdresse = [];
    protected array $individusSansAdresse = [];

    /**
     * ListeDiffusionAbstractPlugin constructor.
@@ -76,7 +76,7 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
     * @param ListeDiffusion $listeDiffusion
     * @return self
     */
    public function setListeDiffusion(ListeDiffusion $listeDiffusion)
    public function setListeDiffusion(ListeDiffusion $listeDiffusion): self
    {
        $this->listeDiffusion = $listeDiffusion;
        $this->parserResult = null;
@@ -100,7 +100,7 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
    /**
     * @return string[] [mail => nom individu]
     */
    public function getIndividusAvecAdresse()
    public function getIndividusAvecAdresse(): array
    {
        return $this->individusAvecAdresse;
    }
@@ -108,7 +108,7 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
    /**
     * @return string[] [id individu => nom individu]
     */
    public function getIndividusSansAdresse()
    public function getIndividusSansAdresse(): array
    {
        return $this->individusSansAdresse;
    }
@@ -116,7 +116,7 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
    /**
     * @return Individu[]|string[]
     */
    public function fetchProprietaires()
    public function fetchProprietaires(): array
    {
        //return $this->individuService->getRepository()->findByRole(Role::CODE_ADMIN_TECH);
        return (array) $this->config['proprietaires'] ?? [];
@@ -125,7 +125,7 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
    /**
     * @return string
     */
    protected function createFileContent()
    protected function createFileContent(): string
    {
        $lines = [];
        foreach ($this->individusAvecAdresse as $adresse => $nom) {
@@ -143,7 +143,7 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
     *
     * @return string
     */
    abstract public function createMemberIncludeFileContent();
    abstract public function createMemberIncludeFileContent(): string;

    /**
     * Génération du contenu du fichier attendu par Sympa pour obtenir les PROPRIÉTAIRES d'une liste de diffusion.
@@ -152,7 +152,7 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
     *
     * @return string
     */
    public function createOwnerIncludeFileContent()
    public function createOwnerIncludeFileContent(): string
    {
        $entities = $this->fetchProprietaires();
        $this->extractEmailsFromEntities($entities);
@@ -206,5 +206,5 @@ abstract class ListeDiffusionAbstractHandler implements ListeDiffusionHandlerInt
     * @param string $prefix
     * @return string
     */
    abstract public function generateResultFileName(string $prefix);
    abstract public function generateResultFileName(string $prefix): string;
}
 No newline at end of file
+76 −11
Original line number Diff line number Diff line
@@ -3,12 +3,16 @@
namespace Application\Service\ListeDiffusion\Handler;

use Application\Entity\Db\Acteur;
use Application\Service\ListeDiffusion\Address\ListeDiffusionAddressGenerator;
use Doctorant\Entity\Db\Doctorant;
use Individu\Entity\Db\IndividuRole;
use Structure\Entity\Db\EcoleDoctorale;
use Structure\Entity\Db\Etablissement;
use Individu\Entity\Db\Individu;
use Application\Entity\Db\Role;
use Application\Service\Acteur\ActeurServiceAwareTrait;
use Doctorant\Service\DoctorantServiceAwareTrait;
use Structure\Service\EcoleDoctorale\EcoleDoctoraleServiceAwareTrait;
use Structure\Service\Etablissement\EtablissementServiceAwareTrait;
use Application\Service\ListeDiffusion\Address\ListeDiffusionAddressParserResult;
use Application\Service\ListeDiffusion\Address\ListeDiffusionAddressParserResultWithED;
@@ -20,6 +24,7 @@ class ListeDiffusionHandler extends ListeDiffusionAbstractHandler
{
    use StructureServiceAwareTrait;
    use EtablissementServiceAwareTrait;
    use EcoleDoctoraleServiceAwareTrait;
    use ActeurServiceAwareTrait;
    use DoctorantServiceAwareTrait;
    use RoleServiceAwareTrait;
@@ -57,7 +62,7 @@ class ListeDiffusionHandler extends ListeDiffusionAbstractHandler
    /**
     * @inheritDoc
     */
    public function canHandleListeDiffusion()
    public function canHandleListeDiffusion(): bool
    {
        $this->parseAdresse();

@@ -79,7 +84,7 @@ class ListeDiffusionHandler extends ListeDiffusionAbstractHandler
     *
     * @return string
     */
    public function createMemberIncludeFileContent()
    public function createMemberIncludeFileContent(): string
    {
        $entities = $this->fetchMembers();
        $this->extractEmailsFromEntities($entities);
@@ -90,28 +95,32 @@ class ListeDiffusionHandler extends ListeDiffusionAbstractHandler
    /**
     * @return Individu[]
     */
    protected function fetchMembers()
    protected function fetchMembers(): array
    {
        switch ($this->role) {
            case 'dirtheses':
            case ListeDiffusionAddressGenerator::CODE_ROLE_ALIAS_DIRECTEUR_THESE:
                $acteurs = $this->fetchActeursDirecteursTheses();
                return array_map(function(Acteur $acteur) {
                    return $acteur->getIndividu();
                }, $acteurs);
            case 'doctorants':
            case ListeDiffusionAddressGenerator::CODE_ROLE_ALIAS_DOCTORANT:
                $acteurs = $this->fetchDoctorants();
                return array_map(function(Doctorant $doctorant) {
                    return $doctorant->getIndividu();
                }, $acteurs);
            case ListeDiffusionAddressGenerator::CODE_ROLE_ALIAS_GEST_ED:
                return $this->fetchGestionnairesED();
            case ListeDiffusionAddressGenerator::CODE_ROLE_ALIAS_RESP_ED:
                return $this->fetchResponsablesED();
            default:
                return $this->fetchIndividusWithRole();
                return $this->fetchIndividusWithRoleOnEtablissement();
        }
    }

    /**
     * @return Acteur[]
     */
    protected function fetchActeursDirecteursTheses()
    protected function fetchActeursDirecteursTheses(): array
    {
        $critereEd = $this->computeCritereED();

@@ -125,7 +134,7 @@ class ListeDiffusionHandler extends ListeDiffusionAbstractHandler
    /**
     * @return Doctorant[]
     */
    protected function fetchDoctorants()
    protected function fetchDoctorants(): array
    {
        $critereEd = $this->computeCritereED();

@@ -135,10 +144,66 @@ class ListeDiffusionHandler extends ListeDiffusionAbstractHandler
        );
    }

    /**
     * @return Individu[]
     */
    protected function fetchGestionnairesED(): array
    {
        $code = Role::CODE_GEST_ED;
        $ed = $this->fetchED();

        if ($ed === null) {
            $individuRoles = $this->roleService->findIndividuRolesByCodeRole($code);
        } else {
            $individuRoles = $this->roleService->findIndividuRolesByStructure($ed->getStructure(), $code);
        }

        return array_unique(array_map(
            function (IndividuRole $ir) {
                return $ir->getIndividu();
            },
            $individuRoles
        ));
    }

    /**
     * @return Individu[]
     */
    protected function fetchResponsablesED(): array
    {
        $code = Role::CODE_RESP_ED;
        $ed = $this->fetchED();

        if ($ed === null) {
            $individuRoles = $this->roleService->findIndividuRolesByCodeRole($code);
        } else {
            $individuRoles = $this->roleService->findIndividuRolesByStructure($ed->getStructure(), $code);
        }

        return array_unique(array_map(
            function (IndividuRole $ir) {
                return $ir->getIndividu();
            },
            $individuRoles
        ));
    }

    protected function fetchED(): ?EcoleDoctorale
    {
        if ($this->parserResult instanceof ListeDiffusionAddressParserResultWithED) {
            $sigleSansEspace = $this->parserResult->getEcoleDoctorale();
            return $this->ecoleDoctoraleService->getRepository()->findOneBySigleSansEspace($sigleSansEspace);
        } elseif ($this->parserResult instanceof ListeDiffusionAddressParserResult) {
            return null;
        } else {
            throw new BadMethodCallException("Cas imprévu");
        }
    }

    /**
     * @return array|null
     */
    protected function computeCritereED()
    protected function computeCritereED(): ?array
    {
        if ($this->parserResult instanceof ListeDiffusionAddressParserResultWithED) {
            $sigleSansEspace = $this->parserResult->getEcoleDoctorale();
@@ -153,7 +218,7 @@ class ListeDiffusionHandler extends ListeDiffusionAbstractHandler
    /**
     * @return Individu[]
     */
    protected function fetchIndividusWithRole()
    protected function fetchIndividusWithRoleOnEtablissement(): array
    {
        $code = strtoupper($this->role);
        $structure = $this->etablissement->getStructure();
@@ -167,7 +232,7 @@ class ListeDiffusionHandler extends ListeDiffusionAbstractHandler
     * @param string $prefix
     * @return string
     */
    public function generateResultFileName(string $prefix)
    public function generateResultFileName(string $prefix): string
    {
        return sprintf('%sinclude_%s.inc',
            $prefix,
Loading