Commit 8742eff6 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Fix : Problème de synchronisation des rôles de personnes sur les organisations...

Fix : Problème de synchronisation des rôles de personnes sur les organisations (ConnectorDB, Rest, HttpAuthBasic)
Ce patch régle : Les suppressions des rôles, le recalcule des notifications (si besoin)
parent 6d0236fb
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -317,7 +317,7 @@ class ConnectorPersonDB extends AbstractConnector
    {
        if ($this->personHydrator === null) {
            $this->personHydrator = new ConnectorPersonHydrator(
                $this->getServiceLocator()->get('Doctrine\ORM\EntityManager')
                $this->getServiceLocator()
            );
            $this->personHydrator->setPurge($this->getOptionPurge());
        }
+58 −23
Original line number Diff line number Diff line
@@ -8,8 +8,10 @@
namespace Oscar\Connector;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use Laminas\ServiceManager\ServiceManager;
use Oscar\Entity\Organization;
use Oscar\Entity\OrganizationPerson;
use Oscar\Entity\OrganizationRepository;
@@ -19,6 +21,7 @@ use Oscar\Entity\RoleRepository;
use Oscar\Exception\ConnectorException;
use Oscar\Exception\OscarException;
use Oscar\Factory\JsonToPersonFactory;
use Oscar\Service\PersonService;

/**
 * Cette classe centralise l'analyse des données d'un personne pour mettre à jour un objet Person avec.
@@ -28,12 +31,15 @@ use Oscar\Factory\JsonToPersonFactory;
 */
class ConnectorPersonHydrator
{

    private $serviceManager;

    /**
     * @return OrganizationRepository
     */
    public function getOrganizationRepository()
    {
        return $this->entityManager->getRepository(Organization::class);
        return $this->getEntityManager()->getRepository(Organization::class);
    }

    /**
@@ -41,15 +47,47 @@ class ConnectorPersonHydrator
     */
    public function getRoleRepository()
    {
        return $this->entityManager->getRepository(Role::class);
        return $this->getEntityManager()->getRepository(Role::class);
    }

    /**
     * @return ServiceManager
     */
    public function getServiceManager()
    {
        return $this->serviceManager;
    }

    /**
     * @return EntityRepository
     * @throws \Doctrine\ORM\Exception\NotSupported
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    public function getOrganizationPersonRepository() :EntityRepository
    {
        return $this->getEntityManager()->getRepository(OrganizationPerson::class);
    }


    /**
     * @return EntityManager
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    public function getEntityManager() :EntityManager
    {
        return $this->getServiceManager()->get('Doctrine\ORM\EntityManager');
    }

    /**
     * @return \Doctrine\ORM\EntityRepository
     * @return PersonService
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    public function getOrganizationPersonRepository()
    public function getPersonService() :PersonService
    {
        return $this->entityManager->getRepository(OrganizationPerson::class);
        return $this->getServiceManager()->get(PersonService::class);
    }

    private $repport;
@@ -85,9 +123,9 @@ class ConnectorPersonHydrator
     * ConnectorPersonHydrator constructor.
     * @param EntityManager $entityManager
     */
    public function __construct(EntityManager $entityManager)
    public function __construct(ServiceManager $serviceManager)
    {
        $this->entityManager = $entityManager;
        $this->serviceManager = $serviceManager;
    }

    /**
@@ -160,15 +198,15 @@ class ConnectorPersonHydrator
        ///////////////////////////////////
        /// Récupération des rôles synchronisés par organisation
        $syncRoles = [];
        /** @var OrganizationPerson $organizationperson */
        foreach ($personOscar->getOrganizations() as $organizationperson) {
            if ($organizationperson->getOrigin() == $connectorName) {
                $organizationCode = $organizationperson->getOrganization()->getCode();
        /** @var OrganizationPerson $organizationPerson */
        foreach ($personOscar->getOrganizations() as $organizationPerson) {
            if ($organizationPerson->getOrigin() == $connectorName) {
                $organizationCode = $organizationPerson->getOrganization()->getCode();
                if (!array_key_exists($organizationCode, $syncRoles)) {
                    $syncRoles[$organizationCode] = [];
                }
                if (!in_array($organizationperson->getRoleObj()->getRoleId(), $syncRoles[$organizationCode])) {
                    $syncRoles[$organizationCode][] = $organizationperson->getRoleObj()->getRoleId();
                if (!in_array($organizationPerson->getRoleObj()->getRoleId(), $syncRoles[$organizationCode])) {
                    $syncRoles[$organizationCode][] = $organizationPerson->getRoleObj()->getRoleId();
                }
            }
        }
@@ -184,6 +222,7 @@ class ConnectorPersonHydrator
                        foreach ($roles as $roleId) {
                            if (array_key_exists($organizationCode, $syncRoles)) {
                                if (in_array($roleId, $syncRoles[$organizationCode])) {
                                    // Rôle déjà synchronisé
                                    array_splice(
                                        $syncRoles[$organizationCode],
                                        array_search($roleId, $syncRoles[$organizationCode]),
@@ -193,13 +232,9 @@ class ConnectorPersonHydrator
                            }
                            if (array_key_exists($roleId, $rolesOscar)) {
                                if (!$organization->hasPerson($personOscar, $roleId)) {
                                    $roleOscar = new OrganizationPerson();
                                    $this->entityManager->persist($roleOscar);
                                    $roleOscar->setPerson($personOscar)
                                        ->setOrganization($organization)
                                        ->setOrigin($connectorName)
                                        ->setRoleObj($rolesOscar[$roleId]);
                                    $personOscar->getOrganizations()->add($roleOscar);

                                    $this->getPersonService()->personOrganizationAdd($organization, $personOscar, $rolesOscar[$roleId],null,null, $connectorName);

                                    $this->repport->addupdated(
                                        sprintf(
                                            "Ajout du rôle '%s' dans '%s' pour '%s' ",
@@ -249,18 +284,18 @@ class ConnectorPersonHydrator

        // Purge des rôles supprimés
        foreach ($syncRoles as $code => $roles) {
            if (count($syncRoles[$code]) < 0) {
            if (count($roles) <= 0) {
                continue;
            }

            /** @var OrganizationPerson $organizationPerson */
            foreach ($personOscar->getOrganizations() as $organizationPerson) {
                $roleId = $organizationPerson->getRole();
                $codeOrg = $organizationPerson->getOrganization()->getCode();

                if ($codeOrg == $code) {
                    if (in_array($roleId, $syncRoles[$code])) {
                        if ($this->getPurge()) {
                            $this->entityManager->remove($organizationPerson);
                            $this->getPersonService()->personOrganizationRemove($organizationPerson);
                            $this->repport->addremoved(
                                sprintf(
                                    "Suppression du rôle %s pour %s dans %s.",
+1 −1
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ class ConnectorPersonJsonHttpAuthBasic extends AbstractConnectorOscar
    {
        if( $this->personHydrator === null ){
            $this->personHydrator = new ConnectorPersonHydrator(
                $this->getEntityManager()
                $this->getServiceManager()
            );
            $this->personHydrator->setPurge($this->getOptionPurge());
        }
+2 −1
Original line number Diff line number Diff line
@@ -77,8 +77,9 @@ class ConnectorPersonREST extends AbstractConnector
        $connectorClass = $this->getHydratorClass();
        if ($this->personHydrator === null) {
            $this->personHydrator = new $connectorClass(
                $this->getServiceLocator()->get('Doctrine\ORM\EntityManager')
                $this->getServiceLocator()
            );

            $this->customizeHydrator($this->personHydrator);
            $this->personHydrator->setPurge($this->getOptionPurge());
        }
+6 −3
Original line number Diff line number Diff line
@@ -2527,7 +2527,8 @@ class PersonService implements UseOscarConfigurationService, UseEntityManager, U
        Person $person,
        Role $role,
        $dateStart = null,
        $dateEnd = null
        $dateEnd = null,
        ?string $connectorName = null
    ) {
        if (!$organization->hasPerson($person, $role)) {
            $message = sprintf(
@@ -2546,6 +2547,10 @@ class PersonService implements UseOscarConfigurationService, UseEntityManager, U
                ->setDateStart($dateStart)
                ->setDateEnd($dateEnd);

            if( $connectorName !== null ) {
                $op->setOrigin($connectorName);
            }

            $this->getEntityManager()->flush($op);

            if ($role->isPrincipal()) {
@@ -2557,7 +2562,6 @@ class PersonService implements UseOscarConfigurationService, UseEntityManager, U
                    }
                }
                foreach ($organization->getProjects() as $op) {
                    $this->getLoggerService()->info("Projet : " . $op->getProject());
                    if ($op->isPrincipal()) {
                        foreach ($op->getProject()->getActivities() as $a) {
                            $this->getNotificationService()->jobUpdateNotificationsActivity($a);
@@ -2583,7 +2587,6 @@ class PersonService implements UseOscarConfigurationService, UseEntityManager, U
        if ($organizationPerson->isPrincipal()) {
            /** @var OrganizationService $os */
            $os = $this->getOrganizationService();

            foreach (
                $os->getOrganizationActivititiesPrincipalActive(
                    $organizationPerson->getOrganization()