From cea33e35a518acee2b5a9f8ff68b42976d197cb4 Mon Sep 17 00:00:00 2001 From: Antony Le Courtes <antony.lecourtes@unicaen.fr> Date: Mon, 3 Jul 2023 16:48:40 +0200 Subject: [PATCH] Synchronisation du source code de l'intervenant lors d'une PEC/REN Siham (#50845) --- config/autoload/export-rh.global.php | 7 +- doc/Export-Rh/configuration.md | 1 + doc/Export-Rh/fonctionnalite.md | 50 ++- .../src/Service/IntervenantService.php | 323 ++++++++++-------- .../src/Controller/ExportRhController.php | 90 ++--- .../ExportRh/src/Service/ExportRhService.php | 97 ++++-- 6 files changed, 328 insertions(+), 240 deletions(-) diff --git a/config/autoload/export-rh.global.php b/config/autoload/export-rh.global.php index 12a2f1e7d3..48f6ecd626 100644 --- a/config/autoload/export-rh.global.php +++ b/config/autoload/export-rh.global.php @@ -3,9 +3,10 @@ return [ 'export-rh' => [ - 'actif' => AppConfig::get('export-rh', 'actif') ? AppConfig::get('export-rh', 'actif') : false, - 'connecteur' => AppConfig::get('export-rh', 'connecteur') ? AppConfig::get('export-rh', 'connecteur') : '', - 'sync-code' => AppConfig::get('export-rh', 'sync-code') ? AppConfig::get('export-rh', 'sync-code') : false, + 'actif' => AppConfig::get('export-rh', 'actif') ? AppConfig::get('export-rh', 'actif') : false, + 'connecteur' => AppConfig::get('export-rh', 'connecteur') ? AppConfig::get('export-rh', 'connecteur') : '', + 'sync-code' => AppConfig::get('export-rh', 'sync-code') ? AppConfig::get('export-rh', 'sync-code') : false, + 'sync-source' => AppConfig::get('export-rh', 'sync-source') ? AppConfig::get('export-rh', 'sync-source') : '', ], ]; \ No newline at end of file diff --git a/doc/Export-Rh/configuration.md b/doc/Export-Rh/configuration.md index c4ba392e45..ce0d84f548 100644 --- a/doc/Export-Rh/configuration.md +++ b/doc/Export-Rh/configuration.md @@ -23,6 +23,7 @@ suivantes : 'actif' => true,//False pour désactiver l'export RH 'connecteur' => 'siham',//Le nom du connecteur dont vous avez besoin, pour le moment seul le connecteur SIHAM a été développé. 'sync-code' => false,//Permet de venir forcer le code de l'intervenant avec le matricule siham en retour d'un renouvellement ou d'une prise en charge + 'sync-source' => '',//Code de la source à remplacer après la synchronisation ], ``` diff --git a/doc/Export-Rh/fonctionnalite.md b/doc/Export-Rh/fonctionnalite.md index 5d59166b86..5168e0f402 100644 --- a/doc/Export-Rh/fonctionnalite.md +++ b/doc/Export-Rh/fonctionnalite.md @@ -2,9 +2,11 @@ # Principe -Le module ExportRh de OSE permet de rendre une disponible au sein de l'applicatif une fonctionnalité d'export des données intervenants dans le SI RH. Pour le moment, seul SIHAM est pris en charge par ce module. +Le module ExportRh de OSE permet de rendre une disponible au sein de l'applicatif une fonctionnalité d'export des données intervenants dans le SI RH. Pour le +moment, seul SIHAM est pris en charge par ce module. -Si vous activez le module export et que vous avez SIHAM, vous pourrez pour un intervenant, vacataire et uniquement pour l'année universitaire en cours, lancer une prise en charge ou un renouvellement directement dans SIHAM à partir de OSE. +Si vous activez le module export et que vous avez SIHAM, vous pourrez pour un intervenant, vacataire et uniquement pour l'année universitaire en cours, lancer +une prise en charge ou un renouvellement directement dans SIHAM à partir de OSE. A noter que le renouvellement, ou la prise en charge SIHAM n'est possible que si le contrat OSE a une date de retour signée. @@ -12,7 +14,8 @@ A noter que le renouvellement, ou la prise en charge SIHAM n'est possible que si ## Privilège et accès à l'export -Pour accéder aux écrans d'export RH, il faut vous rendre au niveau de la fiche de l'intervenant, si vous avez le privilège associé, vous verrez un nouvel onglet Export RH : +Pour accéder aux écrans d'export RH, il faut vous rendre au niveau de la fiche de l'intervenant, si vous avez le privilège associé, vous verrez un nouvel onglet +Export RH :  @@ -24,53 +27,68 @@ Voici le nouveau privilège à donner aux rôles : On appelle prise en charge (PEC), le fait d'exporter vers SIHAM un intervenant inconnu du SI RH. Un matricule va être créé et attribué à cet intervenant. -Pour une PEC, les données personnelles sont injectées dans SIHAM pour la première fois, on parle bien des données issues du dossier de l'intervenant et non pas celles de la fiche intervenant : +Pour une PEC, les données personnelles sont injectées dans SIHAM pour la première fois, on parle bien des données issues du dossier de l'intervenant et non pas +celles de la fiche intervenant :  -Lors d'une prise en charge, OSE va créer un nouvelle affectation pour l'année universitaire en cours, et créer le statut, le type d'emploi, la position administrative et le service dans SIHAM, le tout en auto validé dans SIHAM. +Lors d'une prise en charge, OSE va créer un nouvelle affectation pour l'année universitaire en cours, et créer le statut, le type d'emploi, la position +administrative et le service dans SIHAM, le tout en auto validé dans SIHAM. Toutes ces informations sont paramétrables à l'aide du formulaire personnalisé SIHAM :  -Si vous avez activé le paramètre 'sync-code', la prise en charge va venir remplacer le code de l'intervenant par le matricule SIHAM. Ce paramètre est utile surtout dans le cas où vous proposez des comptes locaux à ose pour vos vacataires. (Attention, dans ce cas le connecteur MV_INTERVENANT.sql qui -alimente OSE avec les intervenants doit bien évidement utiliser le matricule SIHAM comme CODE intervenant afin que la synchronisationne ne produise pas de doublon) +Si vous avez activé le paramètre 'sync-code', la prise en charge va venir remplacer le code de l'intervenant par le matricule SIHAM. Ce paramètre est utile +surtout dans le cas où vous proposez des comptes locaux à ose pour vos vacataires. (Attention, dans ce cas le connecteur MV_INTERVENANT.sql qui +alimente OSE avec les intervenants doit bien évidement utiliser le matricule SIHAM comme CODE intervenant afin que la synchronisationne ne produise pas de +doublon) + +Idem pour le paramètre 'sync-source',forcera la source de l'intervenant avec le code source correspondant. ## Renouvellement d'un intervenant (REN) On appelle renouvellement (REN), le fait d'exporter vers SIHAM un intervenant déjà connu du SI RH. -Le renouvellement va d'abord mettre à jour certaines données personnelles de l'intervenant, à noter que vous pourrez désactiver la synchronisation de certaines données en décochant les lignes : +Le renouvellement va d'abord mettre à jour certaines données personnelles de l'intervenant, à noter que vous pourrez désactiver la synchronisation de certaines +données en décochant les lignes :  -**Attention, les WS SIHAM de l'AMUE sont buggés pour la mise à jour des coordonnées bancaires lors d'un renouvellement, il faudra donc les mettre à jour manuellement si nécessaire. Une demande d'assistance est en cours (mettre le lien ici)** +**Attention, les WS SIHAM de l'AMUE sont buggés pour la mise à jour des coordonnées bancaires lors d'un renouvellement, il faudra donc les mettre à jour +manuellement si nécessaire. Une demande d'assistance est en cours (mettre le lien ici)** -De la même façon, OSE va créer un nouvelle affectation pour l'année universitaire en cours, et mettre à jour le statut, le type d'emploi, la position administrative et le service dans SIHAM, le tout en auto validé dans SIHAM. +De la même façon, OSE va créer un nouvelle affectation pour l'année universitaire en cours, et mettre à jour le statut, le type d'emploi, la position +administrative et le service dans SIHAM, le tout en auto validé dans SIHAM.  -Si vous avez activé le paramètre 'sync-code', le renouvellement va venir remplacer le code de l'intervenant par le matricule SIHAM. Ce paramètre est utile surtout dans le cas où vous proposez des comptes locaux ose pour vos vacataires. (Attention, dans ce cas le connecteur MV_INTERVENANT.sql qui -alimente OSE avec les intervenants doit bien évidement utiliser le matricule SIHAM comme CODE intervenant afin que la synchronisationne ne produise pas de doublon) +Si vous avez activé le paramètre 'sync-code', le renouvellement va venir remplacer le code de l'intervenant par le matricule SIHAM. Ce paramètre est utile +surtout dans le cas où vous proposez des comptes locaux ose pour vos vacataires. (Attention, dans ce cas le connecteur MV_INTERVENANT.sql qui +alimente OSE avec les intervenants doit bien évidement utiliser le matricule SIHAM comme CODE intervenant afin que la synchronisationne ne produise pas de +doublon) ## Suite à la PEC ou au REN -Une fois la prise en charge ou le renouvellement effectué via OSE, vous retrouverez le dossier de l'agent à jour, il ne vous restera plus qu'à le contractualiser manuellement dans SIHAM. +Une fois la prise en charge ou le renouvellement effectué via OSE, vous retrouverez le dossier de l'agent à jour, il ne vous restera plus qu'à le +contractualiser manuellement dans SIHAM.  ## Synchronisation -Si l'intervenant possède déjà une affectation sur l'année en cours, vous ne pourrez donc pas lancer une PEC ou un REN, mais vous aurez quand même la possiblité de synchroniser les quelques données personnelles de OSE vers SIHAM. +Si l'intervenant possède déjà une affectation sur l'année en cours, vous ne pourrez donc pas lancer une PEC ou un REN, mais vous aurez quand même la possiblité +de synchroniser les quelques données personnelles de OSE vers SIHAM. -**Attention, les WS SIHAM de l'AMUE sont buggés pour la mise à jour des coordonnées bancaires lors d'une synchronisation, il faudra donc les mettre à jour manuellement si nécessaire. Une demande d'assistance est en cours (mettre le lien ici)** +**Attention, les WS SIHAM de l'AMUE sont buggés pour la mise à jour des coordonnées bancaires lors d'une synchronisation, il faudra donc les mettre à jour +manuellement si nécessaire. Une demande d'assistance est en cours (mettre le lien ici)** ## Indicateur Un nouvel indicateur situé dans la rubrique contrat des indicateurs (indicateur N°380), vous donne la liste des vacataires à prendre en charge ou à renouveller. -Il n'est utilisable que sur l'année universitaire en cours, car comme dit précédement, seul les vacataires de l'année universitaire en cours sont concernés par le module ExporRh. +Il n'est utilisable que sur l'année universitaire en cours, car comme dit précédement, seul les vacataires de l'année universitaire en cours sont concernés par +le module ExporRh.  diff --git a/module/Application/src/Service/IntervenantService.php b/module/Application/src/Service/IntervenantService.php index b232646995..3eca9df534 100755 --- a/module/Application/src/Service/IntervenantService.php +++ b/module/Application/src/Service/IntervenantService.php @@ -17,6 +17,7 @@ use Laminas\Hydrator\ClassMethodsHydrator; use Paiement\Service\MiseEnPaiementIntervenantStructureServiceAwareTrait; use Paiement\Service\MiseEnPaiementServiceAwareTrait; use RuntimeException; +use UnicaenCode\Service\Traits\ConfigServiceAwareTrait; /** @@ -43,7 +44,7 @@ class IntervenantService extends AbstractEntityService * @return string * @throws RuntimeException */ - public function getEntityClass() + public function getEntityClass () { return Intervenant::class; } @@ -59,7 +60,7 @@ class IntervenantService extends AbstractEntityService * * @return Intervenant|null */ - public function getByRouteParam(string $routeParam): ?Intervenant + public function getByRouteParam (string $routeParam): ?Intervenant { $code = null; $anneeId = $this->getServiceContext()->getAnnee()->getId(); @@ -90,84 +91,36 @@ class IntervenantService extends AbstractEntityService /** - * Retourne l'intervenant de l'année précédente - * - * @param Intervenant $intervenant - * @param int $anneeDiff - * - * @return Intervenant|null - */ - public function getPrecedent(Intervenant $intervenant, int $anneeDiff = -1): ?Intervenant - { - $code = $intervenant->getCode(); - $anneeId = $this->getServiceContext()->getAnnee()->getId() + $anneeDiff; - $statutId = $intervenant->getStatut() ? $intervenant->getStatut()->getId() : null; - $structureId = $intervenant->getStructure() ? $intervenant->getStructure()->getId() : null; - - $bones = $this->getBones(['CODE' => $code, 'ANNEE_ID' => $anneeId]); - - return $this->bestIntervenantByBones($bones, $code, $anneeId, $statutId, $structureId); - } - - - - public function getByCode(string $code): ?Intervenant - { - $anneeId = $this->getServiceContext()->getAnnee()->getId(); - $statutId = null; - $structureId = $this->getServiceContext()->getStructure(); - if ($structureId) $structureId = $structureId->getId(); - - $bones = $this->getBones(['CODE' => $code, 'ANNEE_ID' => $anneeId]); - - return $this->bestIntervenantByBones($bones, $code, $anneeId, $statutId, $structureId); - } - - - - public function getByCodeRh(string $codeRh): ?Intervenant - { - $anneeId = $this->getServiceContext()->getAnnee()->getId(); - $statutId = null; - $structureId = $this->getServiceContext()->getStructure(); - if ($structureId) $structureId = $structureId->getId(); - - $bones = $this->getBones(['CODE_RH' => $codeRh, 'ANNEE_ID' => $anneeId]); - - return $this->bestIntervenantByBones($bones, $codeRh, $anneeId, null, null); - } - - - - /** + * Retourne les identifiants des données concernés * - * @param string $sourceCode - * @param Annee $annee + * @param string|string[]|null $sourceCode + * @param integer|null $anneeId * - * @return Intervenant|null + * @return integer[]|null */ - public function getByUtilisateurCode(string $utilisateurCode): ?Intervenant + protected function getId ($column, $value, $anneeId = null) { - $anneeId = $this->getServiceContext()->getAnnee()->getId(); - $statutId = null; - $structureId = $this->getServiceContext()->getStructure(); - if ($structureId) $structureId = $structureId->getId(); + if (empty($sourceCode)) return null; - $bones = $this->getBones(['UTILISATEUR_CODE' => $utilisateurCode, 'ANNEE_ID' => $anneeId]); - $code = null; - foreach ($bones as $bone) { - if (!$code) $code = $bone['CODE']; - if ($code != $bone['CODE']) { - throw new \Exception('Intervenants différents retournés'); - } + $sql = 'SELECT ID FROM INTERVENANT WHERE ' . $column . ' IN (:value)'; + if ($anneeId) { + $sql .= ' AND ANNEE_ID = ' . (string)(int)$anneeId; + } + $stmt = $this->getEntityManager()->getConnection()->executeQuery( + $sql, + ['value' => (array)$value], + ['value' => \Doctrine\DBAL\Connection::PARAM_INT_ARRAY] + ); + if ($r = $stmt->fetch()) { + return (int)$r['ID']; + } else { + return null; } - - return $this->bestIntervenantByBones($bones, $code, $anneeId, $statutId, $structureId); } - private function getBones(array $params): array + private function getBones (array $params): array { $psql = ''; foreach ($params as $param => $val) { @@ -193,7 +146,7 @@ class IntervenantService extends AbstractEntityService - private function bestIntervenantByBones(array $bones, ?string $code, ?int $anneeId, ?int $statutId, ?int $structureId): ?Intervenant + private function bestIntervenantByBones (array $bones, ?string $code, ?int $anneeId, ?int $statutId, ?int $structureId): ?Intervenant { $count = count($bones); if (0 == $count) { @@ -231,33 +184,97 @@ class IntervenantService extends AbstractEntityService - public function isImportable(Intervenant $intervenant): bool + private function getIntervenantIdParDefaut (string $code, int $anneeId): ?int { - $connection = $this->getEntityManager()->getConnection(); + if (!$code || !$anneeId) return null; - $sqlEnabled = "SELECT sync_enabled FROM import_tables WHERE table_name = 'INTERVENANT'"; - $res = $connection->fetchAssociative($sqlEnabled); - if (false === $res || '0' == $res['SYNC_ENABLED']) return false; + $sql = "SELECT intervenant_id FROM intervenant_par_defaut WHERE intervenant_code = :code AND annee_id = :annee"; + $iDef = $this->getEntityManager()->getConnection()->fetchAllAssociative($sql, ['code' => $code, 'annee' => $anneeId]); + if (isset($iDef[0]['INTERVENANT_ID'])) { + return (int)$iDef[0]['INTERVENANT_ID']; + } - $sql = "SELECT code FROM src_intervenant WHERE code = :code AND annee_id = :annee"; - $res = $connection->fetchAssociative($sql, ['code' => $intervenant->getCode(), 'annee' => $intervenant->getAnnee()->getId()]); + return null; + } - return ($res !== false) && isset($res['CODE']) && ($intervenant->getCode() == $res['CODE']); + + + /** + * Retourne l'intervenant de l'année précédente + * + * @param Intervenant $intervenant + * @param int $anneeDiff + * + * @return Intervenant|null + */ + public function getPrecedent (Intervenant $intervenant, int $anneeDiff = -1): ?Intervenant + { + $code = $intervenant->getCode(); + $anneeId = $this->getServiceContext()->getAnnee()->getId() + $anneeDiff; + $statutId = $intervenant->getStatut() ? $intervenant->getStatut()->getId() : null; + $structureId = $intervenant->getStructure() ? $intervenant->getStructure()->getId() : null; + + $bones = $this->getBones(['CODE' => $code, 'ANNEE_ID' => $anneeId]); + + return $this->bestIntervenantByBones($bones, $code, $anneeId, $statutId, $structureId); } - private function getIntervenantIdParDefaut(string $code, int $anneeId): ?int + public function getByCodeRh (string $codeRh): ?Intervenant { - if (!$code || !$anneeId) return null; + $anneeId = $this->getServiceContext()->getAnnee()->getId(); + $statutId = null; + $structureId = $this->getServiceContext()->getStructure(); + if ($structureId) $structureId = $structureId->getId(); - $sql = "SELECT intervenant_id FROM intervenant_par_defaut WHERE intervenant_code = :code AND annee_id = :annee"; - $iDef = $this->getEntityManager()->getConnection()->fetchAllAssociative($sql, ['code' => $code, 'annee' => $anneeId]); - if (isset($iDef[0]['INTERVENANT_ID'])) { - return (int)$iDef[0]['INTERVENANT_ID']; + $bones = $this->getBones(['CODE_RH' => $codeRh, 'ANNEE_ID' => $anneeId]); + + return $this->bestIntervenantByBones($bones, $codeRh, $anneeId, null, null); + } + + + + /** + * + * @param string $sourceCode + * @param Annee $annee + * + * @return Intervenant|null + */ + public function getByUtilisateurCode (string $utilisateurCode): ?Intervenant + { + $anneeId = $this->getServiceContext()->getAnnee()->getId(); + $statutId = null; + $structureId = $this->getServiceContext()->getStructure(); + if ($structureId) $structureId = $structureId->getId(); + + $bones = $this->getBones(['UTILISATEUR_CODE' => $utilisateurCode, 'ANNEE_ID' => $anneeId]); + $code = null; + foreach ($bones as $bone) { + if (!$code) $code = $bone['CODE']; + if ($code != $bone['CODE']) { + throw new \Exception('Intervenants différents retournés'); + } } - return null; + return $this->bestIntervenantByBones($bones, $code, $anneeId, $statutId, $structureId); + } + + + + public function isImportable (Intervenant $intervenant): bool + { + $connection = $this->getEntityManager()->getConnection(); + + $sqlEnabled = "SELECT sync_enabled FROM import_tables WHERE table_name = 'INTERVENANT'"; + $res = $connection->fetchAssociative($sqlEnabled); + if (false === $res || '0' == $res['SYNC_ENABLED']) return false; + + $sql = "SELECT code FROM src_intervenant WHERE code = :code AND annee_id = :annee"; + $res = $connection->fetchAssociative($sql, ['code' => $intervenant->getCode(), 'annee' => $intervenant->getAnnee()->getId()]); + + return ($res !== false) && isset($res['CODE']) && ($intervenant->getCode() == $res['CODE']); } @@ -270,7 +287,7 @@ class IntervenantService extends AbstractEntityService * * @throws \Doctrine\DBAL\DBALException */ - public function definirParDefaut(Intervenant $intervenant, bool $definir = true) + public function definirParDefaut (Intervenant $intervenant, bool $definir = true) { if ($definir) { $idParDefaut = $this->getIntervenantIdParDefaut($intervenant->getCode(), $intervenant->getAnnee()->getId()); @@ -302,49 +319,19 @@ class IntervenantService extends AbstractEntityService * * @return bool */ - public function estDefiniParDefaut(Intervenant $intervenant): bool + public function estDefiniParDefaut (Intervenant $intervenant): bool { return $this->getIntervenantIdParDefaut($intervenant->getCode(), $intervenant->getAnnee()->getId()) === $intervenant->getId(); } - /** - * Retourne les identifiants des données concernés - * - * @param string|string[]|null $sourceCode - * @param integer|null $anneeId - * - * @return integer[]|null - */ - protected function getId($column, $value, $anneeId = null) - { - if (empty($sourceCode)) return null; - - $sql = 'SELECT ID FROM INTERVENANT WHERE ' . $column . ' IN (:value)'; - if ($anneeId) { - $sql .= ' AND ANNEE_ID = ' . (string)(int)$anneeId; - } - $stmt = $this->getEntityManager()->getConnection()->executeQuery( - $sql, - ['value' => (array)$value], - ['value' => \Doctrine\DBAL\Connection::PARAM_INT_ARRAY] - ); - if ($r = $stmt->fetch()) { - return (int)$r['ID']; - } else { - return null; - } - } - - - /** * @param $intervenant Intervenant * * @return Intervenant[] */ - public function getIntervenants(Intervenant $intervenant): array + public function getIntervenants (Intervenant $intervenant): array { $findParams = ['code' => $intervenant->getCode(), 'annee' => $intervenant->getAnnee()]; $repo = $this->getRepo(); @@ -361,14 +348,14 @@ class IntervenantService extends AbstractEntityService * * @return string */ - public function getAlias() + public function getAlias () { return 'int'; } - public function finderByMiseEnPaiement(Structure $structure = null, Periode $periode = null, QueryBuilder $qb = null, $alias = null) + public function finderByMiseEnPaiement (Structure $structure = null, Periode $periode = null, QueryBuilder $qb = null, $alias = null) { $serviceMIS = $this->getServiceMiseEnPaiementIntervenantStructure(); @@ -392,7 +379,7 @@ class IntervenantService extends AbstractEntityService /** * @return Intervenant */ - public function newEntity(): Intervenant + public function newEntity (): Intervenant { $intervenant = parent::newEntity(); $intervenant->setStructure($this->getServiceContext()->getStructure()); @@ -407,34 +394,12 @@ class IntervenantService extends AbstractEntityService - /** - * Sauvegarde une entité - * - * @param Intervenant $entity - * - * @return Intervenant - * @throws \RuntimeException - */ - public function save($entity) - { - if (!$entity->getSource()) { - $entity->setSource($this->getServiceSource()->getOse()); - } - if (!$entity->getAnnee()) { - $entity->setAnnee($this->getServiceContext()->getAnnee()); - } - - return parent::save($entity); - } - - - /** * * @param QueryBuilder|null $qb * @param string|null $alias */ - public function orderBy(QueryBuilder $qb = null, $alias = null) + public function orderBy (QueryBuilder $qb = null, $alias = null) { [$qb, $alias] = $this->initQuery($qb, $alias); @@ -454,7 +419,7 @@ class IntervenantService extends AbstractEntityService * * @return QueryBuilder */ - public function finderByType(TypeIntervenant $typeIntervenant, QueryBuilder $qb = null, $alias = null) + public function finderByType (TypeIntervenant $typeIntervenant, QueryBuilder $qb = null, $alias = null) { [$qb, $alias] = $this->initQuery($qb, $alias); $sStatut = $this->getServiceStatut(); @@ -475,7 +440,7 @@ class IntervenantService extends AbstractEntityService * * @return self */ - public function delete($entity, $softDelete = true) + public function delete ($entity, $softDelete = true) { if (!$softDelete) { $id = (int)$entity->getId(); @@ -531,7 +496,7 @@ class IntervenantService extends AbstractEntityService - public function getSystemeInformationUrl(Intervenant $intervenant): ?string + public function getSystemeInformationUrl (Intervenant $intervenant): ?string { if (!$intervenant->getSource()->getImportable()) return null; @@ -564,7 +529,7 @@ class IntervenantService extends AbstractEntityService * * @return Intervenant */ - public function creerIntervenant(string $nom, string $prenom, \DateTime $dateNaissance, array $params = []): Intervenant + public function creerIntervenant (string $nom, string $prenom, \DateTime $dateNaissance, array $params = []): Intervenant { if (!isset($params['code']) || empty($params['code'])) { $params['code'] = uniqid('OSE'); @@ -603,7 +568,43 @@ class IntervenantService extends AbstractEntityService - public function updateExportDate(Intervenant $intervenant): Intervenant + public function getByCode (string $code): ?Intervenant + { + $anneeId = $this->getServiceContext()->getAnnee()->getId(); + $statutId = null; + $structureId = $this->getServiceContext()->getStructure(); + if ($structureId) $structureId = $structureId->getId(); + + $bones = $this->getBones(['CODE' => $code, 'ANNEE_ID' => $anneeId]); + + return $this->bestIntervenantByBones($bones, $code, $anneeId, $statutId, $structureId); + } + + + + /** + * Sauvegarde une entité + * + * @param Intervenant $entity + * + * @return Intervenant + * @throws \RuntimeException + */ + public function save ($entity) + { + if (!$entity->getSource()) { + $entity->setSource($this->getServiceSource()->getOse()); + } + if (!$entity->getAnnee()) { + $entity->setAnnee($this->getServiceContext()->getAnnee()); + } + + return parent::save($entity); + } + + + + public function updateExportDate (Intervenant $intervenant): Intervenant { $date = new \DateTime(); $intervenant->setExportDate($date); @@ -615,7 +616,7 @@ class IntervenantService extends AbstractEntityService - public function updateCode(Intervenant $intervenant, $code): Intervenant + public function updateCode (Intervenant $intervenant, $code): Intervenant { if (!empty($code)) { $intervenant->setCode($code); @@ -628,4 +629,24 @@ class IntervenantService extends AbstractEntityService return $intervenant; } + + + public function updateSource (Intervenant $intervenant): Intervenant + { + $config = \AppConfig::get('export-rh'); + if (!empty($config['sync-source'])) { + //On regarde si le code fourni correspond bien à une source valide + $source = $this->getServiceSource()->getByCode($config['sync-source']); + if (!empty($source)) { + $intervenant->setSource($source); + $this->getEntityManager()->persist($intervenant); + $this->getEntityManager()->flush(); + //On recalcul les tablaeux de bords de l'intervenant + $this->getServiceWorkflow()->calculerTableauxBord([], $intervenant); + } + } + + return $intervenant; + } + } diff --git a/module/ExportRh/src/Controller/ExportRhController.php b/module/ExportRh/src/Controller/ExportRhController.php index a7368ebf3a..17865b01b1 100644 --- a/module/ExportRh/src/Controller/ExportRhController.php +++ b/module/ExportRh/src/Controller/ExportRhController.php @@ -37,21 +37,21 @@ class ExportRhController extends AbstractController - public function __construct(ExportRhService $exportRhService) + public function __construct (ExportRhService $exportRhService) { $this->exportRhService = $exportRhService; } - public function indexAction() + public function indexAction () { return []; } - public function chercherIntervenantRhAction(): array + public function chercherIntervenantRhAction (): array { $connecteurRh = $this->getServiceExportRh(); @@ -80,12 +80,50 @@ class ExportRhController extends AbstractController - public function exporterAction() + public function priseEnChargeAction () + { + try { + if ($this->getRequest()->isPost()) { + $intervenant = $this->getEvent()->getParam('intervenant'); + + if (!$intervenant) { + throw new \LogicException('Intervenant non précisé ou inexistant'); + } + + $posts = $this->getRequest()->getPost(); + $result = $this->exportRhService->priseEnChargeIntrervenantRh($intervenant, $posts); + if ($result !== false) { + // $this->exportRhService->cloreDossier($intervenant); + $this->flashMessenger()->addSuccessMessage('La prise en charge s\'est déroulée avec succés et le dossier a été cloturé'); + $this->getServiceIntervenant()->updateExportDate($intervenant); + //On met à jour le code intervenant si l'option est activée + if ($this->exportRhService->haveToSyncCode()) { + $this->getServiceIntervenant()->updateCode($intervenant, $result); + } + //On met à jour le source code lors de la synchronisauot + if ($this->exportRhService->haveToSyncSource()) { + $this->getServiceIntervenant()->updateSource($intervenant); + } + } else { + $this->flashMessenger()->addErrorMessage('Probleme prise en charge'); + } + } + } catch (\Exception $e) { + + $this->flashMessenger()->addErrorMessage($e->getMessage()); + } + + return $this->exporterAction(); + } + + + + public function exporterAction () { /* Initialisation */ $role = $this->getServiceContext()->getSelectedIdentityRole(); - $intervenant = $role->getIntervenant() ?: $this->getEvent()->getParam('intervenant'); + $intervenant = $role->getIntervenant() ? : $this->getEvent()->getParam('intervenant'); $intervenantRh = ''; $form = ''; $nameConnecteur = ''; @@ -184,42 +222,7 @@ class ExportRhController extends AbstractController - public function priseEnChargeAction() - { - try { - if ($this->getRequest()->isPost()) { - $intervenant = $this->getEvent()->getParam('intervenant'); - - if (!$intervenant) { - throw new \LogicException('Intervenant non précisé ou inexistant'); - } - - $posts = $this->getRequest()->getPost(); - $result = $this->exportRhService->priseEnChargeIntrervenantRh($intervenant, $posts); - - if ($result !== false) { - $this->exportRhService->cloreDossier($intervenant); - $this->flashMessenger()->addSuccessMessage('La prise en charge s\'est déroulée avec succés et le dossier a été cloturé'); - $this->getServiceIntervenant()->updateExportDate($intervenant); - //On met à jour le code intervenant si l'option est activée - if ($this->exportRhService->haveToSyncCode()) { - $this->getServiceIntervenant()->updateCode($intervenant, $result); - } - } else { - $this->flashMessenger()->addErrorMessage('Probleme prise en charge'); - } - } - } catch (\Exception $e) { - - $this->flashMessenger()->addErrorMessage($e->getMessage()); - } - - return $this->exporterAction(); - } - - - - public function renouvellementAction() + public function renouvellementAction () { try { @@ -247,6 +250,9 @@ class ExportRhController extends AbstractController if ($this->exportRhService->haveToSyncCode()) { $this->getServiceIntervenant()->updateCode($intervenant, $result); } + if ($this->exportRhService->haveToSyncSource()) { + $this->getServiceIntervenant()->updateSource($intervenant); + } } else { $this->flashMessenger()->addErrorMessage('Un problème est survenu lors de la tentative de renouvellement de l\'intervenant'); } @@ -261,7 +267,7 @@ class ExportRhController extends AbstractController - public function synchroniserAction() + public function synchroniserAction () { try { if ($this->getRequest()->isPost()) { diff --git a/module/ExportRh/src/Service/ExportRhService.php b/module/ExportRh/src/Service/ExportRhService.php index bc372739a7..4e0ae6fdec 100644 --- a/module/ExportRh/src/Service/ExportRhService.php +++ b/module/ExportRh/src/Service/ExportRhService.php @@ -8,6 +8,7 @@ use Application\Service\AbstractService; use Application\Service\Traits\AnneeServiceAwareTrait; use Application\Service\Traits\IntervenantServiceAwareTrait; use Application\Service\Traits\ParametresServiceAwareTrait; +use Application\Service\Traits\SourceServiceAwareTrait; use ExportRh\Entity\IntervenantRHExportParams; use phpDocumentor\Reflection\Types\Array_; use Laminas\Form\Fieldset; @@ -23,28 +24,31 @@ class ExportRhService extends AbstractService use IntervenantServiceAwareTrait; use ParametresServiceAwareTrait; use AnneeServiceAwareTrait; + use SourceServiceAwareTrait; + + protected $connecteur; + + protected $config; /** * @var IntervenantRHExportParams */ private $intervenantEportParams; - protected $connecteur; - - protected $config; - public function __construct($connecteur, $config) + public function __construct ($connecteur, $config) { $this->connecteur = $connecteur; - $this->config = $config; + $this->config = $config; } - public function getListIntervenantRh($nomUsuel, $prenom, $insee) + + public function getListIntervenantRh ($nomUsuel, $prenom, $insee) { - $listIntervenantRh = $this->connecteur->rechercherIntervenantRH($nomUsuel, $prenom, $insee); + $listIntervenantRh = $this->connecteur->rechercherIntervenantRH($nomUsuel, $prenom, $insee); $intervenantService = $this->getServiceIntervenant(); if (!empty($listIntervenantRh)) { foreach ($listIntervenantRh as $key => $intervenantRh) { @@ -60,7 +64,8 @@ class ExportRhService extends AbstractService } - public function getIntervenantRh($intervenant) + + public function getIntervenantRh ($intervenant) { $intervenantRh = $this->connecteur->recupererIntervenantRh($intervenant); @@ -68,7 +73,8 @@ class ExportRhService extends AbstractService } - public function getDonneesAdministrativeIntervenantRh($intervenant) + + public function getDonneesAdministrativeIntervenantRh ($intervenant) { $donneesAdministratives = $this->connecteur->recupererDonneesAdministrativesIntervenantRh($intervenant); @@ -76,7 +82,8 @@ class ExportRhService extends AbstractService } - public function getAffectationEnCoursIntervenantRh($intervenant) + + public function getAffectationEnCoursIntervenantRh ($intervenant) { $affectation = $this->connecteur->recupererAffectationEnCoursIntervenantRh($intervenant); @@ -85,7 +92,8 @@ class ExportRhService extends AbstractService } - public function getContratEnCoursIntervenantRh($intervenant) + + public function getContratEnCoursIntervenantRh ($intervenant) { $contrat = $this->connecteur->recupererContratEnCoursIntervenantRh($intervenant); @@ -93,85 +101,99 @@ class ExportRhService extends AbstractService } - public function getListeUO() + + public function getListeUO () { return $this->connecteur->recupererListeUO(); } - public function getListePositions() + + public function getListePositions () { return $this->connecteur->recupererListePositions(); } - public function getListeEmplois() + + public function getListeEmplois () { return $this->connecteur->recupererListeEmplois(); } - public function getListeStatuts() + + public function getListeStatuts () { return $this->connecteur->recupererListeStatuts(); } - public function getListeModalites() + + public function getListeModalites () { return $this->connecteur->recupererListeModalites(); } - public function getListContrats() + + public function getListContrats () { return $this->connecteur->recupererListeContrats(); } - public function priseEnChargeIntrervenantRh(Intervenant $intervenant, $datas) + + public function priseEnChargeIntrervenantRh (Intervenant $intervenant, $datas) { return $this->connecteur->prendreEnChargeIntervenantRh($intervenant, $datas); } - public function renouvellementIntervenantRh(Intervenant $intervenant, $datas) + + public function renouvellementIntervenantRh (Intervenant $intervenant, $datas) { return $this->connecteur->renouvellerIntervenantRH($intervenant, $datas); } - public function synchroniserDonneesPersonnellesIntervenantRh(Intervenant $intervenant, $datas) + + public function synchroniserDonneesPersonnellesIntervenantRh (Intervenant $intervenant, $datas) { return $this->connecteur->synchroniserDonneesPersonnellesIntervenantRh($intervenant, $datas); } - public function cloreDossier(Intervenant $intervenant) + + public function cloreDossier (Intervenant $intervenant) { return $this->connecteur->cloreDossier($intervenant); } - public function getFieldsetConnecteur(): Fieldset + + public function getFieldsetConnecteur (): Fieldset { return $this->connecteur->recupererFormulairePriseEnCharge(); } - public function getConnecteurName(): string + + public function getConnecteurName (): string { return $this->connecteur->getConnecteurName(); } - public function getConnecteur() + + public function getConnecteur () { return $this->connecteur; } - public function getAnneeUniversitaireEnCours(): ?Annee + + public function getAnneeUniversitaireEnCours (): ?Annee { $annee = $this->getServiceParametres()->get('annee'); @@ -179,9 +201,10 @@ class ExportRhService extends AbstractService } - public function getExcludeStatutOse(): array + + public function getExcludeStatutOse (): array { - $config = $this->config; + $config = $this->config; $configUnicaenSiham = $config['unicaen-siham']; if (array_key_exists('exclude-statut-ose', $configUnicaenSiham)) { return $configUnicaenSiham['exclude-statut-ose']; @@ -190,7 +213,9 @@ class ExportRhService extends AbstractService return []; } - public function haveToSyncCode(): bool + + + public function haveToSyncCode (): bool { $config = $this->config; if ($config['export-rh']['sync-code'] === true) { @@ -198,7 +223,23 @@ class ExportRhService extends AbstractService } return false; + } + + + + public function haveToSyncSource (): bool + { + $config = $this->config; + if (!empty($config['export-rh']['sync-source'])) { + //On regarde si le code fourni correspond bien à une source valide + $source = $this->getServiceSource()->getByCode($config['export-rh']['sync-source']); + if (!empty($source)) { + return true; + } + } + + return false; } } \ No newline at end of file -- GitLab