Commit 493f9066 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Connexion d'un utilisateur dont l'EPPN a un domaine établissement inconnu:...

Connexion d'un utilisateur dont l'EPPN a un domaine établissement inconnu: gestion des différents cas de figure.
parent 8bfbba68
Loading
Loading
Loading
Loading
+17 −0
Changes for module/Application/src/Application/Entity/Db/Repository/IndividuRepository.php: 17 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -2,8 +2,11 @@

namespace Application\Entity\Db\Repository;

use Application\Entity\Db\Etablissement;
use Application\Entity\Db\Individu;
use Application\Entity\Db\IndividuRole;
use Application\Entity\UserWrapper;
use Application\SourceCodeStringHelper;
use Doctrine\DBAL\DBALException;
use UnicaenApp\Exception\RuntimeException;
use UnicaenApp\Util;
@@ -33,6 +36,20 @@ class IndividuRepository extends DefaultEntityRepository
        return $i;
    }

    /**
     * @param UserWrapper   $userWrapper
     * @param Etablissement $etablissement
     * @return Individu
     */
    public function findOneByUserWrapperAndEtab(UserWrapper $userWrapper, Etablissement $etablissement)
    {
        $sourceCodeHelper = new SourceCodeStringHelper();
        $sourceCode = $sourceCodeHelper->addPrefixEtablissementTo($userWrapper->getSupannId(), $etablissement);

        return $this->findOneBySourceCode($sourceCode);

    }

    /**
     * Recherche d'individu, en SQL pure.
     *
+51 −14
Changes for module/Application/src/Application/Event/UserAuthenticatedEventListener.php: 51 added lines, 14 removed lines.
Original line number Diff line number Diff line
@@ -2,12 +2,13 @@

namespace Application\Event;

use Application\Entity\Db\Individu;
use Application\Entity\Db\Utilisateur;
use Application\Entity\UserWrapper;
use Application\Entity\UserWrapperFactory;
use Application\Service\Etablissement\EtablissementServiceAwareTrait;
use Application\Service\Individu\IndividuServiceAwareTrait;
use Application\Service\Utilisateur\UtilisateurServiceAwareTrait;
use Application\SourceCodeStringHelper;
use UnicaenAuth\Event\Listener\AuthenticatedUserSavedAbstractListener;
use UnicaenAuth\Event\UserAuthenticatedEvent;
use UnicaenAuth\Service\UserContext as UserContextService;
@@ -66,19 +67,7 @@ class UserAuthenticatedEventListener extends AuthenticatedUserSavedAbstractListe
        if ($userWrapper->getIndividu() !== null) {
            $individu = $userWrapper->getIndividu();
        } else {
            $domaineEtab = $userWrapper->getDomainFromEppn();
            $etablissement = $this->getEtablissementService()->getRepository()->findOneByDomaine($domaineEtab);

            // recherche de l'Individu correspondant à l'utilisateur
            $sourceCodeHelper = new SourceCodeStringHelper();
            $sourceCode = $sourceCodeHelper->addPrefixEtablissementTo($userWrapper->getSupannId(), $etablissement);
            $individu = $this->individuService->getRepository()->findOneBySourceCode($sourceCode);

            // création de l'Individu si inexistant
            if (null === $individu) {
                $createur = $this->utilisateurService->getRepository()->fetchAppPseudoUser();
                $individu = $this->individuService->createIndividuFromUserWrapperAndEtab($userWrapper, $etablissement, $createur);
            }
            $individu = $this->processIndividu($userWrapper);
        }

        // renseigne le lien utilisateur-->individu
@@ -86,4 +75,52 @@ class UserAuthenticatedEventListener extends AuthenticatedUserSavedAbstractListe
        $utilisateur = $e->getDbUser();
        $this->utilisateurService->setIndividuForUtilisateur($individu, $utilisateur);
    }

    /**
     * @param UserWrapper $userWrapper
     * @return Individu
     */
    private function processIndividu(UserWrapper $userWrapper)
    {
        $createIndividu = false;
        $etablissementInconnu = $this->etablissementService->getRepository()->fetchEtablissementInconnu();

        // recherche de l'établissement de connexion l'utilisateur : à partir du domaine de l'EPPN, ex: 'unicaen.fr'
        $domaineEtab = $userWrapper->getDomainFromEppn();
        $etablissement = $this->etablissementService->getRepository()->findOneByDomaine($domaineEtab);

        if ($etablissement === null) {
            // si aucun établissement ne correspond au domaine, on essaie l'établissement "inconnu"...

            // recherche de l'Individu correspondant à l'utilisateur, peut-être rattaché à l'établissement inconnu?
            $individu = $this->individuService->getRepository()->findOneByUserWrapperAndEtab($userWrapper, $etablissementInconnu);
            if ($individu === null) {
                // si l'individu n'est pas trouvé dans l'établissement inconnu, il y sera ajouté.
                $createIndividu = true;
                $etablissement = $etablissementInconnu;
            }
        } else {
            // recherche de l'Individu dans l'établissement de connexion existant
            $individu = $this->individuService->getRepository()->findOneByUserWrapperAndEtab($userWrapper, $etablissement);

            if ($individu === null) {
                // si l'individu n'est pas trouvé dans l'établissement de connexion, recherche dans l'établissement inconnu
                $individu = $this->individuService->getRepository()->findOneByUserWrapperAndEtab($userWrapper, $etablissementInconnu);
                if ($individu === null) {
                    // si l'individu n'est pas trouvé non plus dans l'établissement inconnu, il sera ajouté dans l'établissement de connexion.
                    $createIndividu = true;
                } else {
                    // s'il existe dans l'établissement inconnu, on le "déplace" dans l'établissement de connexion
                    $this->individuService->updateIndividuSourceCodeFromEtab($individu, $etablissement);
                }
            }
        }

        // création de l'Individu si besoin
        if ($createIndividu) {
            $individu = $this->individuService->createIndividuFromUserWrapperAndEtab($userWrapper, $etablissement);
        }

        return $individu;
    }
}
 No newline at end of file
+31 −3
Changes for module/Application/src/Application/Service/Individu/IndividuService.php: 31 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -2,18 +2,22 @@

namespace Application\Service\Individu;

use Application\Entity\Db\AppPseudoUtilisateurAwareTrait;
use Application\Entity\Db\Etablissement;
use Application\Entity\Db\Individu;
use Application\Entity\Db\Repository\IndividuRepository;
use Application\Entity\Db\Utilisateur;
use Application\Entity\UserWrapper;
use Application\Service\BaseService;
use Application\SourceCodeStringHelper;
use Doctrine\ORM\OptimisticLockException;
use UnicaenApp\Exception\RuntimeException;
use UnicaenLdap\Entity\People;

class IndividuService extends BaseService
{
    use AppPseudoUtilisateurAwareTrait;

    /**
     * @return IndividuRepository
     */
@@ -77,7 +81,7 @@ class IndividuService extends BaseService
        $entity->setCivilite($userWrapper->getCivilite());
        $entity->setEmail($userWrapper->getEmail());
        $entity->setSourceCode($sourceCode);
        $entity->setHistoCreateur($utilisateur);
        $entity->setHistoCreateur($utilisateur ?: $this->appPseudoUtilisateur);

        $this->getEntityManager()->persist($entity);
        try {
@@ -96,7 +100,7 @@ class IndividuService extends BaseService
     */
    public function updateIndividuFromUserWrapper(Individu $entity,
                                                  UserWrapper $userWrapper,
                                                  Utilisateur $utilisateur)
                                                  Utilisateur $utilisateur = null)
    {
        $entity->setSupannId($userWrapper->getSupannId());
        $entity->setNomUsuel($userWrapper->getNom() ?: "X"); // NB: le nom est obligatoire mais quid si indisponible ?
@@ -104,7 +108,31 @@ class IndividuService extends BaseService
        $entity->setPrenom($userWrapper->getPrenom());
        $entity->setCivilite($userWrapper->getCivilite());
        $entity->setEmail($userWrapper->getEmail());
        $entity->setHistoModificateur($utilisateur);
        $entity->setHistoModificateur($utilisateur ?: $this->appPseudoUtilisateur);

        try {
            $this->getEntityManager()->flush($entity);
        } catch (OptimisticLockException $e) {
            throw new RuntimeException("Impossible d'enregistrer l'Individu", null, $e);
        }
    }

    /**
     * Met à jour le SOURCE_CODE d'un individu à partir de l'établissement spécifié.
     *
     * @param Individu      $entity
     * @param Etablissement $etablissement
     * @param Utilisateur   $modificateur
     */
    public function updateIndividuSourceCodeFromEtab(Individu $entity,
                                                     Etablissement $etablissement,
                                                     Utilisateur $modificateur = null)
    {
        $sourceCodeHelper = new SourceCodeStringHelper();
        $sourceCode = $sourceCodeHelper->addPrefixEtablissementTo($entity->getSupannId(), $etablissement);

        $entity->setSourceCode($sourceCode);
        $entity->setHistoModificateur($modificateur ?: $this->appPseudoUtilisateur);

        try {
            $this->getEntityManager()->flush($entity);
+6 −0
Changes for module/Application/src/Application/Service/Individu/IndividuServiceFactory.php: 6 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -2,13 +2,19 @@

namespace Application\Service\Individu;

use Application\Service\Utilisateur\UtilisateurService;
use Zend\ServiceManager\ServiceLocatorInterface;

class IndividuServiceFactory
{
    public function __invoke(ServiceLocatorInterface $sl)
    {
        /** @var UtilisateurService $utilisateurService */
        $utilisateurService = $sl->get('UtilisateurService');
        $utilisateur = $utilisateurService->getRepository()->fetchAppPseudoUtilisateur();

        $service = new IndividuService();
        $service->setAppPseudoUtilisateur($utilisateur);

        return $service;
    }