Commit b6c7ae32 authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Ajout d'une option "purge" à la synchronisation des organisations

parent e75f2a69
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -42,6 +42,11 @@ class OscarOrganizationsSyncCommand extends OscarCommandAbstract
                'b',
                InputOption::VALUE_NONE,
                'Ignore la reconstruction de l\'index de recherche après la mise à jour'
            )->addOption(
                'purge',
                'p',
                InputOption::VALUE_NONE,
                'Déclenche la des organisations qui sont retirées de la source'
            );
    }

@@ -66,6 +71,7 @@ class OscarOrganizationsSyncCommand extends OscarCommandAbstract
        $connectorService = $this->getServicemanager()->get(ConnectorService::class);

        $connector = $connectorService->getConnector("organization." . $connectorName);
        $connector->setOptionPurge($input->getOption('purge'));

        try {
            $repport = $connector->execute($force);
+1 −1
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ abstract class AbstractConnector implements IConnector
    }

    public function getOption($optionName, $defaultValue=null){
        if( array_key_exists($optionName, $this->options) ){
        if( $this->options && array_key_exists($optionName, $this->options) ){
            return $this->options[$optionName];
        }
        return $defaultValue;
+35 −11
Original line number Diff line number Diff line
@@ -68,7 +68,6 @@ class ConnectorOrganizationREST extends AbstractConnector
        return $this->getServicemanager();
    }


    /**
     * @param bool $force
     * @return ConnectorRepport
@@ -116,6 +115,7 @@ class ConnectorOrganizationREST extends AbstractConnector
        ////// Patch 2.7 "Lewis" GIT#286 ////
        try {
            $json = $this->getAccessStrategy()->getDataAll();
            $exist = $repository->getUidsConnector($this->getName());
            $jsonDatas = null;

            if( is_object($json) && property_exists($json, 'organizations') ){
@@ -132,6 +132,10 @@ class ConnectorOrganizationREST extends AbstractConnector
            foreach( $jsonDatas as $data ){
                $organisationId = $data->uid;

                if (($index = array_search($organisationId, $exist)) >= 0) {
                    array_splice($exist, $index, 1);
                }

                try {
                    /** @var Person $personOscar */
                    $organization = $repository->getObjectByConnectorID($this->getName(), $organisationId);
@@ -154,43 +158,63 @@ class ConnectorOrganizationREST extends AbstractConnector
                    if( property_exists($data, 'type') )
                        $organization->setTypeObj($repository->getTypeObjByLabel($data->type));

                    $organization->setDateUpdated(new \DateTime($dateupdated));
                    $repository->flush($organization);

                    if( $organization->hasUpdatedParentInCycle() ){
                        try {
                            $newParentCode = $organization->getUpdatedParentInCycle();
                            $this->getLogger()->debug("Mise à jour du parent");
                            if( $newParentCode ){
                                $this->getLogger()->debug(" > Nouveau parent");
                                $parent = $this->getOrganizationService()->getOrganizationRepository()->getOrganisationByCode($newParentCode)->getId();
                                $this->getOrganizationService()->saveSubStructure($parent, $organization->getId());
                            } else {
                                $this->getLogger()->debug(" > Suppression du parent");
                                $this->getOrganizationService()->removeSubStructure(null, $organization->getId());

                            }
                            $repository->flush($organization);
                        } catch (\Exception $e) {
                            $this->getLogger()->error("Erreur : " . $e->getMessage());
                        }
                    } else {
                        $this->getLogger()->debug("Parent : Aucun changement");
                    }

                    if( $action == 'add' ){
                        $this->getLogger()->debug("Organisation '$organisationId' ajoutée");
                        $this->getLogger()->info("Organisation '$organisationId' ajoutée");
                    } else {
                        $this->getLogger()->debug("Organisation '$organisationId' mise à jour");
                        $this->getLogger()->info("Organisation '$organisationId' mise à jour");
                    }
                }
            }

                } else {
                    $this->getLogger()->debug("Rien à faire pour '$organisationId'");
            $idsToDelete = [];

            foreach ($exist as $uid) {
                if (!$uid) {
                    continue;
                }
                try {
                    $organization = $repository->getObjectByConnectorID($this->getName(), $uid);
                    $this->getLogger()->info("'$organization' n'est plus présent dans les données du connecteur");

                    if ($this->getOptionPurge()) {
                        $idsToDelete[] = $organization->getId();
                    }
                } catch (\Exception $e) {
                    $this->getLogger()->error($e->getMessage());
                }
            }
            foreach ($idsToDelete as $id) {
                try {
                    $repository->removeOrganizationById($id);
                    $this->getLogger()->error("Supression de l'organisation '$id'");
                } catch (\Exception $e) {
                    $this->getLogger()->error("Impossible de supprimer l'organisation : " . $e->getMessage());
                    throw $e;
                }
            }
        } catch (\Exception $e ){
            $repport->adderror($e->getMessage());
            throw $e;
        }
        die();


        $repport->addnotice("FIN du traitement...");
+25 −0
Original line number Diff line number Diff line
@@ -25,6 +25,25 @@ class OrganizationRepository extends EntityRepository implements IConnectedRepos
        return $this->findOneBy(['id' => $organizationId]);
    }

    public function getUidsConnector(string $connectorName): array
    {
        $qb = $this->getEntityManager()->createQueryBuilder();
        $search = sprintf('s:%s:"%s";', strlen($connectorName), $connectorName);

        $qb->select('o.connectors')
            ->from(Organization::class, 'o')
            ->where('o.connectors LIKE :search')
            ->setParameter('search', "%$search%");

        $uids = [];
        foreach ($qb->getQuery()->getArrayResult() as $a) {
            if( array_key_exists('connectors', $a) && $a['connectors'][$connectorName]) {
                $uids[] = $a['connectors'][$connectorName];
            }
        }
        return $uids;
    }

    /**
     * Retourne les sous-organizations de l'organisation donnée.
     *
@@ -327,4 +346,10 @@ class OrganizationRepository extends EntityRepository implements IConnectedRepos
        }
        return $out;
    }

    public function removeOrganizationById(int $organizationId)
    {
        $this->getEntityManager()->remove($this->find($organizationId));
        $this->getEntityManager()->flush();
    }
}
 No newline at end of file
+2 −0
Original line number Diff line number Diff line
@@ -51,6 +51,8 @@ interface OscarFormatterConst
    //
    const FORMAT_IO_CSV = 'csv';

    const FORMAT_IO_EXCEL = 'excel';

    const FORMAT_IO_JSON = 'json';

    const FORMAT_IO_PDF = 'pdf';