Commit 9d29f32f authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Up : Lors de la synchroniation individuelle des personnes, l'option "Purge"...

Up : Lors de la synchroniation individuelle des personnes, l'option "Purge" est active. Elle permet de retirer les rôles qui ne sont plus effectifs côté connector.
parent 45fcff36
Loading
Loading
Loading
Loading
Loading
+95 −36
Original line number Diff line number Diff line
@@ -98,15 +98,23 @@ class ConnectorPersonHydrator
        return $this->repport;
    }

    public function setPurge( $boolean ){
    /**
     * @param $boolean
     * @return void
     */
    public function setPurge($boolean)
    {
        $this->purge = $boolean;
    }

    public function getPurge(){
    /**
     * @return mixed
     */
    public function getPurge()
    {
        return $this->purge;
    }


    /**
     * @return bool
     */
@@ -115,16 +123,29 @@ class ConnectorPersonHydrator
        return $this->repport != null && $this->repport->isSuspect();
    }

    protected function factory(){
    /**
     * @return mixed|JsonToPersonFactory
     */
    protected function factory()
    {
        static $factory;
        if( $factory === null )
        if ($factory === null) {
            $factory = new JsonToPersonFactory();
        }
        return $factory;
    }


    public function hydratePerson(Person $personOscar, $personData, $connectorName) {

    /**
     * @param Person $personOscar
     * @param $personData
     * @param $connectorName
     * @return Person
     * @throws OscarException
     * @throws \Doctrine\ORM\ORMException
     */
    public function hydratePerson(Person $personOscar, $personData, $connectorName)
    {
        $rolesOscar = $this->getRolesOscarByRoleId();
        $this->repport = new ConnectorRepport();

@@ -153,6 +174,7 @@ class ConnectorPersonHydrator
        }

        if (property_exists($personData, 'roles')) {
            var_dump($personData->roles);

            foreach ($personData->roles as $organizationCode => $roles) {
                try {
@@ -160,12 +182,14 @@ class ConnectorPersonHydrator
                    $organization = $this->getOrganisationByCode($organizationCode);

                    if ($organization) {

                        foreach ($roles as $roleId) {
                            if (array_key_exists($organizationCode, $syncRoles)) {
                                if (in_array($roleId, $syncRoles[$organizationCode])) {
                                    array_splice($syncRoles[$organizationCode], array_search($roleId, $syncRoles[$organizationCode]), 1);

                                    array_splice(
                                        $syncRoles[$organizationCode],
                                        array_search($roleId, $syncRoles[$organizationCode]),
                                        1
                                    );
                                }
                            }
                            if (array_key_exists($roleId, $rolesOscar)) {
@@ -177,23 +201,48 @@ class ConnectorPersonHydrator
                                        ->setOrigin($connectorName)
                                        ->setRoleObj($rolesOscar[$roleId]);
                                    $personOscar->getOrganizations()->add($roleOscar);
                                    $this->repport->addupdated(sprintf("Ajout du rôle '%s' dans '%s' pour '%s' ", $roleId, $organization, $personOscar));
                                    $this->repport->addupdated(
                                        sprintf(
                                            "Ajout du rôle '%s' dans '%s' pour '%s' ",
                                            $roleId,
                                            $organization,
                                            $personOscar
                                        )
                                    );
                                }
                            } else {
                                $this->repport->addwarning(sprintf("Le role '%s' n'a pas été ajouté à '%s' dans '%s' car il est absent de Oscar",
                                    $roleId, $personOscar, $organization));
                                $this->repport->addwarning(
                                    sprintf(
                                        "Le role '%s' n'a pas été ajouté à '%s' dans '%s' car il est absent de Oscar",
                                        $roleId,
                                        $personOscar,
                                        $organization
                                    )
                                );
                            }
                        }
                    } else {
                        $this->repport->addwarning(sprintf("L'organisation avec le code '%s' n'existe pas dans Oscar",
                            $organizationCode));
                        $this->repport->addwarning(
                            sprintf(
                                "L'organisation avec le code '%s' n'existe pas dans Oscar",
                                $organizationCode
                            )
                        );
                    }
                } catch (NoResultException $e) {
                    $this->repport->addwarning(sprintf("Impossible de charger l'organisation avec le code '%s'.",
                        $organizationCode));
                    $this->repport->addwarning(
                        sprintf(
                            "Impossible de charger l'organisation avec le code '%s'.",
                            $organizationCode
                        )
                    );
                } catch (NonUniqueResultException $e) {
                    $this->repport->addwarning(sprintf("L'organisation avec le code '%s' est présente plusieurs fois.",
                        $organizationCode));
                    $this->repport->addwarning(
                        sprintf(
                            "L'organisation avec le code '%s' est présente plusieurs fois.",
                            $organizationCode
                        )
                    );
                }
            }
        }
@@ -212,18 +261,28 @@ class ConnectorPersonHydrator
                    if (in_array($roleId, $syncRoles[$code])) {
                        if ($this->getPurge()) {
                            $this->entityManager->remove($organizationPerson);
                            $this->repport->addremoved(sprintf("Suppression du rôle %s pour %s dans %s.", $roleId, $personOscar, $organizationPerson->getOrganization()));
                            $this->repport->addremoved(
                                sprintf(
                                    "Suppression du rôle %s pour %s dans %s.",
                                    $roleId,
                                    $personOscar,
                                    $organizationPerson->getOrganization()
                                )
                            );
                        } else {
                            $this->repport->addwarning(sprintf("Suppression du rôle %s pour %s dans %s dans la source (activer la purge pour le supprimer).", $roleId, $personOscar, $organizationPerson->getOrganization()));
                            $this->repport->addwarning(
                                sprintf(
                                    "Suppression du rôle %s pour %s dans %s dans la source (activer la purge pour le supprimer).",
                                    $roleId,
                                    $personOscar,
                                    $organizationPerson->getOrganization()
                                )
                            );
                        }
                    }
                }
            }
        }


        return $personOscar;
    }


}
 No newline at end of file
+30 −16
Original line number Diff line number Diff line
@@ -25,13 +25,13 @@ use UnicaenCode\Controller\Controller;
use Zend\Http\Request;
use UnicaenApp\ServiceManager\ServiceLocatorAwareInterface;

class ConnectorController extends AbstractOscarController implements UseOscarUserContextService, UsePersonService, UseServiceContainer
class ConnectorController extends AbstractOscarController implements UseOscarUserContextService, UsePersonService,
                                                                     UseServiceContainer
{
    use UseOscarConfigurationServiceTrait, UsePersonServiceTrait, UseServiceContainerTrait;

    public function personAction()
    {

        $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_CONNECTOR_ACCESS);
        /** @var Request $request */
        $request = $this->getRequest();
@@ -39,7 +39,9 @@ class ConnectorController extends AbstractOscarController implements UseOscarUse
        $connectorName = $request->getQuery('c');
        $personId = $request->getQuery('v');

        $connectorsAvailabled = array_keys($this->getOscarConfigurationService()->getConfiguration('connectors.person'));
        $connectorsAvailabled = array_keys(
            $this->getOscarConfigurationService()->getConfiguration('connectors.person')
        );

        if (!in_array($connectorName, $connectorsAvailabled)) {
            return $this->getResponseBadRequest('Connecteur indisponible');
@@ -49,8 +51,13 @@ class ConnectorController extends AbstractOscarController implements UseOscarUse

            if (count($persons) == 1) {
                $person = $persons[0];
                $class = $this->getOscarConfigurationService()->getConfiguration('connectors.person')[$connectorName]['class'];
                $connector = $this->getServiceContainer()->get(ConnectorService::class)->getConnector('person.' . $connectorName);
                $class = $this->getOscarConfigurationService()->getConfiguration(
                    'connectors.person'
                )[$connectorName]['class'];
                $connector = $this->getServiceContainer()->get(ConnectorService::class)->getConnector(
                    'person.' . $connectorName
                );
                $connector->setOptionPurge(true);
                $connector->syncPerson($person);
                $this->getEntityManager()->flush();
                return $this->redirect()->toRoute('person/show', ['id' => $person->getId()]);
@@ -59,7 +66,9 @@ class ConnectorController extends AbstractOscarController implements UseOscarUse
                foreach ($persons as $p) {
                    $match[] = (string)$p;
                }
                throw new OscarException("Plusieurs personne partage le connecteur ID '$personId' : " . implode(',', $match));
                throw new OscarException(
                    "Plusieurs personne partage le connecteur ID '$personId' : " . implode(',', $match)
                );
            }
        }
        return $this->getResponseNotImplemented('Synchronisation des personnes non implantée');
@@ -79,7 +88,9 @@ class ConnectorController extends AbstractOscarController implements UseOscarUse
        $connectorName = $request->getQuery('c');
        $organizationId = $request->getQuery('v');

        $connectorsAvailabled = array_keys($this->getOscarConfigurationService()->getConfiguration('connectors.organization'));
        $connectorsAvailabled = array_keys(
            $this->getOscarConfigurationService()->getConfiguration('connectors.organization')
        );

        if (!in_array($connectorName, $connectorsAvailabled)) {
            return $this->getResponseBadRequest('Connecteur indisponible');
@@ -93,11 +104,14 @@ class ConnectorController extends AbstractOscarController implements UseOscarUse
            $organization = $organizationRepository->getObjectByConnectorID($connectorName, $organizationId);

            if ($organization) {

                $class = $this->getOscarConfigurationService()->getConfiguration('connectors.organization')[$connectorName]['class'];
                $class = $this->getOscarConfigurationService()->getConfiguration(
                    'connectors.organization'
                )[$connectorName]['class'];

                /** @var ConnectorOrganizationREST $connector */
                $connector = $this->getServiceContainer()->get(ConnectorService::class)->getConnector('organization.' . $connectorName);
                $connector = $this->getServiceContainer()->get(ConnectorService::class)->getConnector(
                    'organization.' . $connectorName
                );
                $connector->syncOrganization($organization);
                $this->getEntityManager()->flush();
                return $this->redirect()->toRoute('organization/show', ['id' => $organization->getId()]);