Loading module/Oscar/src/Oscar/Command/OscarOrganizationsSyncCommand.php +6 −0 Original line number Diff line number Diff line Loading @@ -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' ); } Loading @@ -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); Loading module/Oscar/src/Oscar/Connector/AbstractConnector.php +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading module/Oscar/src/Oscar/Connector/ConnectorOrganizationREST.php +35 −11 Original line number Diff line number Diff line Loading @@ -68,7 +68,6 @@ class ConnectorOrganizationREST extends AbstractConnector return $this->getServicemanager(); } /** * @param bool $force * @return ConnectorRepport Loading Loading @@ -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') ){ Loading @@ -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); Loading @@ -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..."); Loading module/Oscar/src/Oscar/Entity/OrganizationRepository.php +25 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading Loading @@ -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 module/Oscar/src/Oscar/Formatter/OscarFormatterConst.php +2 −0 Original line number Diff line number Diff line Loading @@ -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'; Loading Loading
module/Oscar/src/Oscar/Command/OscarOrganizationsSyncCommand.php +6 −0 Original line number Diff line number Diff line Loading @@ -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' ); } Loading @@ -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); Loading
module/Oscar/src/Oscar/Connector/AbstractConnector.php +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
module/Oscar/src/Oscar/Connector/ConnectorOrganizationREST.php +35 −11 Original line number Diff line number Diff line Loading @@ -68,7 +68,6 @@ class ConnectorOrganizationREST extends AbstractConnector return $this->getServicemanager(); } /** * @param bool $force * @return ConnectorRepport Loading Loading @@ -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') ){ Loading @@ -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); Loading @@ -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..."); Loading
module/Oscar/src/Oscar/Entity/OrganizationRepository.php +25 −0 Original line number Diff line number Diff line Loading @@ -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. * Loading Loading @@ -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
module/Oscar/src/Oscar/Formatter/OscarFormatterConst.php +2 −0 Original line number Diff line number Diff line Loading @@ -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'; Loading