Loading composer.lock +11 −12 Changes for composer.lock: 11 added lines, 12 removed lines. Original line number Diff line number Diff line Loading @@ -124,16 +124,16 @@ }, { "name": "aws/aws-sdk-php", "version": "3.271.7", "version": "3.271.8", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", "reference": "d0fe1af38ef521e419004e5f990ceb8e0b2b001d" "reference": "46250f9947768c102052a6650a0a09405e77ee0a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d0fe1af38ef521e419004e5f990ceb8e0b2b001d", "reference": "d0fe1af38ef521e419004e5f990ceb8e0b2b001d", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/46250f9947768c102052a6650a0a09405e77ee0a", "reference": "46250f9947768c102052a6650a0a09405e77ee0a", "shasum": "" }, "require": { Loading Loading @@ -213,9 +213,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", "source": "https://github.com/aws/aws-sdk-php/tree/3.271.7" "source": "https://github.com/aws/aws-sdk-php/tree/3.271.8" }, "time": "2023-06-02T18:21:03+00:00" "time": "2023-06-05T18:20:21+00:00" }, { "name": "beberlei/assert", Loading Loading @@ -11708,14 +11708,13 @@ }, { "name": "unicaen/renderer", "version": "6.0.1", "version": "6.0.2", "source": { "type": "git", "url": "https://git.unicaen.fr/lib/unicaen/renderer.git", "reference": "c7805a624a9bff468d583e8149ac606c80286c56" "reference": "0d8df7a457798bcfbbd0568afa8271fd8d1ff9ba" }, "require": { "laminas/laminas-dependency-plugin": "^2.1", "php": "^8.0", "unicaen/privilege": "^6.0" }, Loading @@ -11726,7 +11725,7 @@ ] }, "description": "Module de rendu de texte avec templates et macros", "time": "2023-03-31T09:50:13+00:00" "time": "2023-06-05T13:04:17+00:00" }, { "name": "unicaen/shell", Loading Loading @@ -11764,7 +11763,7 @@ "source": { "type": "git", "url": "https://git.unicaen.fr/open-source/sygal-api.git", "reference": "1bfb243da26aee9f07327632ba93b78e01c1c1d5" "reference": "38707831f6c4455db5b5e1ea90a9df813cc59740" }, "require": { "guzzlehttp/guzzle": "^7.0", Loading @@ -11789,7 +11788,7 @@ ] }, "description": "API SyGAL", "time": "2023-06-02T13:20:45+00:00" "time": "2023-06-06T07:54:32+00:00" }, { "name": "unicaen/zfc-user", Loading module/SygalApiImpl/config/versions/v1.config.php +14 −1 Changes for module/SygalApiImpl/config/versions/v1.config.php: 14 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -16,11 +16,17 @@ return [ 'SygalApi\\V1\\Rest\\InscriptionAdministrative\\Controller' => [ 'listener' => \SygalApiImpl\V1\Rest\InscriptionAdministrative\InscriptionAdministrativeResource::class, ], 'SygalApi\\V1\\Rest\\Doctorant\\Controller' => [ 'listener' => \SygalApiImpl\V1\Rest\Doctorant\DoctorantResource::class, ], ], 'service_manager' => [ 'factories' => [ \SygalApiImpl\V1\Rest\InscriptionAdministrative\InscriptionAdministrativeResource::class => \SygalApiImpl\V1\Rest\InscriptionAdministrative\InscriptionAdministrativeResourceFactory::class, \SygalApiImpl\V1\Rest\InscriptionAdministrative\Service\ImportFacade::class => \SygalApiImpl\V1\Rest\InscriptionAdministrative\Service\ImportFacadeFactory::class \SygalApiImpl\V1\Rest\InscriptionAdministrative\Facade\ImportFacade::class => \SygalApiImpl\V1\Rest\InscriptionAdministrative\Facade\ImportFacadeFactory::class, \SygalApiImpl\V1\Rest\Doctorant\DoctorantResource::class => \SygalApiImpl\V1\Rest\Doctorant\DoctorantResourceFactory::class, \SygalApiImpl\V1\Rest\Doctorant\Facade\ImportFacade::class => \SygalApiImpl\V1\Rest\Doctorant\Facade\ImportFacadeFactory::class, ], ], 'bjyauthorize' => [ Loading @@ -44,6 +50,13 @@ return [ 'controller' => 'SygalApi\\V1\\Rest\\InscriptionAdministrative\\Controller', // 'action' => [ // 'index', // ], 'roles' => [], ], [ 'controller' => 'SygalApi\\V1\\Rest\\Doctorant\\Controller', // 'action' => [ // 'index', // ], 'roles' => [], ], Loading module/SygalApiImpl/doc/pegase_sygal.md +53 −3 Changes for module/SygalApiImpl/doc/pegase_sygal.md: 53 added lines, 3 removed lines. Original line number Diff line number Diff line Communication Pégase - SyGAL ============================ Flux "inscription_administrative" Pégase => SyGAL ------------------------------------------------- Extrait exemple du JSON envoyé : ```json { "id": "APPREN65497_ETAB5_FORMATION6548_PERIODE123", "id": "APPREN65497_ETAB5_FORMATION6548_PERIODE123", // <<< id forgé non immuable ! "instancePegase": "PEGASE_INSA", "apprenant": { "code": "APPREN65497", "INE": "551541446" "code": "APPREN65497", // <<< le code apprenant peut changer suite à une "fusion apprenant" ! "INE": "551541446" // <<< l'INE aussi peut changer (INE provisoire => définitif) ! }, "inscription": { "statutInscription": "valide", Loading @@ -17,3 +23,47 @@ Communication Pégase - SyGAL } } ``` L'id reçu pour l'inscription n'est pas un id technique immuable (ex : UUID ou séquence), il est forgé à partir de : - l'établissement - l'apprenant - la formation - la période Conséquences : - Une inscription en 2022 et une inscription en 2023 = 2 inscriptions. - Si le code apprenant change : l'id change ! Si l'id change, l'inscription dont l'id était forgé avec l'ancien code apprenant perdure dans SyGAL sans moyen de savoir qu'il faut la supprimer ! Le code apprenant peut changer suite à une "fusion apprenant". - Si l'INE de l'apprenant changent (INE = source_code utilisé par SyGAL), SyGAL pensera que c'est une inscription concernant un autre doctorant ! Comment retrouver la trace du doctorant dont l'INE a changé ?? Problème de la fusion apprenant ------------------------------- Sylvie, le 01/06/23 : "Avant de pouvoir commencer une inscription, l'apprenant doit avoir un INE confirmé (via le WS INES). Le dédoublonnage dans Pégase se fait via le n° INE. Il peut arriver que l'apprenant existe déjà avec des inscriptions validées sur un autre n° INE (mauvaise reprise RDD, INE trop ancien,non reconnu par INES,...) ce qui fait qu'on ne le reconnaît pas comme un réinscrit mais comme un nouvel apprenant (avec un nouveau code). L'établissement souhaite alors fusionner les deux apprenants pour avoir un dossier complet le concernant. La plupart du temps, le gestionnaire ne s'aperçoit du doublon qu'une fois que l'inscription avec le nouveau code apprenant a été validée et vous a donc été envoyée. L'unicité de l'apprenant se faisant avec son code apprenant dans Sygal, la question se pose de savoir comment faire pour que vous compreniez qu'il s'agit d'un changement de code. Est-ce qu'on peut vous envoyer une annulation de l'inscription avec le mauvais code et une création avec le nouveau code ? est-ce qu'il faut prévoir quelque chose d'autre ?" Discussion à ce propos : https://confluence.pc-scol.fr/pages/viewpage.action?pageId=73881459 Améliorations possibles ----------------------- - Comme le code apprenant (notamment) peut changer suite à une fusion apprenant, envoyer un id technique immuable (clé primaire de type UUID ou séquentiel) partout où c'est possible. A minima doctorant et inscription. Ce qui permet côté SyGAL de savoir quelles inscriptions et quels doctorants sont déjà connus et ne nécessitent qu'une mise à jour. - Un changement de code apprenant ou d'INE est un événement qui concerne le doctorant (pas l'inscription). Un flux supplémentaire "doctorant" dédié permettrait d'envoyer les doctorants et leurs modifications au fil du temps (à condition d'avoir un id technique immuable). No newline at end of file module/SygalApiImpl/src/V1/Facade/AbstractImportFacade.php 0 → 100644 +55 −0 Changes for module/SygalApiImpl/src/V1/Facade/AbstractImportFacade.php: 55 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace SygalApiImpl\V1\Facade; use Doctrine\DBAL\Connection; use UnicaenDbImport\Domain\Import; use UnicaenDbImport\Domain\Synchro; use UnicaenDbImport\Service\ImportService; use UnicaenDbImport\Service\SynchroService; abstract class AbstractImportFacade implements ImportFacadeInterface { protected Connection $destinationConnection; protected ImportService $importService; protected SynchroService $synchroService; public function setImportService(ImportService $importService): void { $this->importService = $importService; } public function setSynchroService(SynchroService $synchroService): void { $this->synchroService = $synchroService; } public function setDestinationConnection(Connection $destinationConnection): void { $this->destinationConnection = $destinationConnection; } /** * @throws \Exception */ protected function runImport(Import $import) { $result = $this->importService->runImport($import); if ($exception = $result->getFailureException()) { throw $exception; } } /** * @throws \Exception */ protected function runSynchro(Synchro $synchro) { $result = $this->synchroService->runSynchro($synchro); if ($exception = $result->getFailureException()) { throw $exception; } } } No newline at end of file module/SygalApiImpl/src/V1/Rest/InscriptionAdministrative/Service/ImportFacadeAwareTrait.php→module/SygalApiImpl/src/V1/Facade/ImportFacadeAwareTrait.php +3 −3 Changes for module/SygalApiImpl/src/V1/Facade/ImportFacadeAwareTrait.php: 3 added lines, 3 removed lines. Original line number Diff line number Diff line <?php namespace SygalApiImpl\V1\Rest\InscriptionAdministrative\Service; namespace SygalApiImpl\V1\Facade; trait ImportFacadeAwareTrait { protected ImportFacade $importFacade; protected ImportFacadeInterface $importFacade; public function setImportFacade(ImportFacade $importFacade): void public function setImportFacade(ImportFacadeInterface $importFacade): void { $this->importFacade = $importFacade; } Loading Loading
composer.lock +11 −12 Changes for composer.lock: 11 added lines, 12 removed lines. Original line number Diff line number Diff line Loading @@ -124,16 +124,16 @@ }, { "name": "aws/aws-sdk-php", "version": "3.271.7", "version": "3.271.8", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", "reference": "d0fe1af38ef521e419004e5f990ceb8e0b2b001d" "reference": "46250f9947768c102052a6650a0a09405e77ee0a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d0fe1af38ef521e419004e5f990ceb8e0b2b001d", "reference": "d0fe1af38ef521e419004e5f990ceb8e0b2b001d", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/46250f9947768c102052a6650a0a09405e77ee0a", "reference": "46250f9947768c102052a6650a0a09405e77ee0a", "shasum": "" }, "require": { Loading Loading @@ -213,9 +213,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", "source": "https://github.com/aws/aws-sdk-php/tree/3.271.7" "source": "https://github.com/aws/aws-sdk-php/tree/3.271.8" }, "time": "2023-06-02T18:21:03+00:00" "time": "2023-06-05T18:20:21+00:00" }, { "name": "beberlei/assert", Loading Loading @@ -11708,14 +11708,13 @@ }, { "name": "unicaen/renderer", "version": "6.0.1", "version": "6.0.2", "source": { "type": "git", "url": "https://git.unicaen.fr/lib/unicaen/renderer.git", "reference": "c7805a624a9bff468d583e8149ac606c80286c56" "reference": "0d8df7a457798bcfbbd0568afa8271fd8d1ff9ba" }, "require": { "laminas/laminas-dependency-plugin": "^2.1", "php": "^8.0", "unicaen/privilege": "^6.0" }, Loading @@ -11726,7 +11725,7 @@ ] }, "description": "Module de rendu de texte avec templates et macros", "time": "2023-03-31T09:50:13+00:00" "time": "2023-06-05T13:04:17+00:00" }, { "name": "unicaen/shell", Loading Loading @@ -11764,7 +11763,7 @@ "source": { "type": "git", "url": "https://git.unicaen.fr/open-source/sygal-api.git", "reference": "1bfb243da26aee9f07327632ba93b78e01c1c1d5" "reference": "38707831f6c4455db5b5e1ea90a9df813cc59740" }, "require": { "guzzlehttp/guzzle": "^7.0", Loading @@ -11789,7 +11788,7 @@ ] }, "description": "API SyGAL", "time": "2023-06-02T13:20:45+00:00" "time": "2023-06-06T07:54:32+00:00" }, { "name": "unicaen/zfc-user", Loading
module/SygalApiImpl/config/versions/v1.config.php +14 −1 Changes for module/SygalApiImpl/config/versions/v1.config.php: 14 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -16,11 +16,17 @@ return [ 'SygalApi\\V1\\Rest\\InscriptionAdministrative\\Controller' => [ 'listener' => \SygalApiImpl\V1\Rest\InscriptionAdministrative\InscriptionAdministrativeResource::class, ], 'SygalApi\\V1\\Rest\\Doctorant\\Controller' => [ 'listener' => \SygalApiImpl\V1\Rest\Doctorant\DoctorantResource::class, ], ], 'service_manager' => [ 'factories' => [ \SygalApiImpl\V1\Rest\InscriptionAdministrative\InscriptionAdministrativeResource::class => \SygalApiImpl\V1\Rest\InscriptionAdministrative\InscriptionAdministrativeResourceFactory::class, \SygalApiImpl\V1\Rest\InscriptionAdministrative\Service\ImportFacade::class => \SygalApiImpl\V1\Rest\InscriptionAdministrative\Service\ImportFacadeFactory::class \SygalApiImpl\V1\Rest\InscriptionAdministrative\Facade\ImportFacade::class => \SygalApiImpl\V1\Rest\InscriptionAdministrative\Facade\ImportFacadeFactory::class, \SygalApiImpl\V1\Rest\Doctorant\DoctorantResource::class => \SygalApiImpl\V1\Rest\Doctorant\DoctorantResourceFactory::class, \SygalApiImpl\V1\Rest\Doctorant\Facade\ImportFacade::class => \SygalApiImpl\V1\Rest\Doctorant\Facade\ImportFacadeFactory::class, ], ], 'bjyauthorize' => [ Loading @@ -44,6 +50,13 @@ return [ 'controller' => 'SygalApi\\V1\\Rest\\InscriptionAdministrative\\Controller', // 'action' => [ // 'index', // ], 'roles' => [], ], [ 'controller' => 'SygalApi\\V1\\Rest\\Doctorant\\Controller', // 'action' => [ // 'index', // ], 'roles' => [], ], Loading
module/SygalApiImpl/doc/pegase_sygal.md +53 −3 Changes for module/SygalApiImpl/doc/pegase_sygal.md: 53 added lines, 3 removed lines. Original line number Diff line number Diff line Communication Pégase - SyGAL ============================ Flux "inscription_administrative" Pégase => SyGAL ------------------------------------------------- Extrait exemple du JSON envoyé : ```json { "id": "APPREN65497_ETAB5_FORMATION6548_PERIODE123", "id": "APPREN65497_ETAB5_FORMATION6548_PERIODE123", // <<< id forgé non immuable ! "instancePegase": "PEGASE_INSA", "apprenant": { "code": "APPREN65497", "INE": "551541446" "code": "APPREN65497", // <<< le code apprenant peut changer suite à une "fusion apprenant" ! "INE": "551541446" // <<< l'INE aussi peut changer (INE provisoire => définitif) ! }, "inscription": { "statutInscription": "valide", Loading @@ -17,3 +23,47 @@ Communication Pégase - SyGAL } } ``` L'id reçu pour l'inscription n'est pas un id technique immuable (ex : UUID ou séquence), il est forgé à partir de : - l'établissement - l'apprenant - la formation - la période Conséquences : - Une inscription en 2022 et une inscription en 2023 = 2 inscriptions. - Si le code apprenant change : l'id change ! Si l'id change, l'inscription dont l'id était forgé avec l'ancien code apprenant perdure dans SyGAL sans moyen de savoir qu'il faut la supprimer ! Le code apprenant peut changer suite à une "fusion apprenant". - Si l'INE de l'apprenant changent (INE = source_code utilisé par SyGAL), SyGAL pensera que c'est une inscription concernant un autre doctorant ! Comment retrouver la trace du doctorant dont l'INE a changé ?? Problème de la fusion apprenant ------------------------------- Sylvie, le 01/06/23 : "Avant de pouvoir commencer une inscription, l'apprenant doit avoir un INE confirmé (via le WS INES). Le dédoublonnage dans Pégase se fait via le n° INE. Il peut arriver que l'apprenant existe déjà avec des inscriptions validées sur un autre n° INE (mauvaise reprise RDD, INE trop ancien,non reconnu par INES,...) ce qui fait qu'on ne le reconnaît pas comme un réinscrit mais comme un nouvel apprenant (avec un nouveau code). L'établissement souhaite alors fusionner les deux apprenants pour avoir un dossier complet le concernant. La plupart du temps, le gestionnaire ne s'aperçoit du doublon qu'une fois que l'inscription avec le nouveau code apprenant a été validée et vous a donc été envoyée. L'unicité de l'apprenant se faisant avec son code apprenant dans Sygal, la question se pose de savoir comment faire pour que vous compreniez qu'il s'agit d'un changement de code. Est-ce qu'on peut vous envoyer une annulation de l'inscription avec le mauvais code et une création avec le nouveau code ? est-ce qu'il faut prévoir quelque chose d'autre ?" Discussion à ce propos : https://confluence.pc-scol.fr/pages/viewpage.action?pageId=73881459 Améliorations possibles ----------------------- - Comme le code apprenant (notamment) peut changer suite à une fusion apprenant, envoyer un id technique immuable (clé primaire de type UUID ou séquentiel) partout où c'est possible. A minima doctorant et inscription. Ce qui permet côté SyGAL de savoir quelles inscriptions et quels doctorants sont déjà connus et ne nécessitent qu'une mise à jour. - Un changement de code apprenant ou d'INE est un événement qui concerne le doctorant (pas l'inscription). Un flux supplémentaire "doctorant" dédié permettrait d'envoyer les doctorants et leurs modifications au fil du temps (à condition d'avoir un id technique immuable). No newline at end of file
module/SygalApiImpl/src/V1/Facade/AbstractImportFacade.php 0 → 100644 +55 −0 Changes for module/SygalApiImpl/src/V1/Facade/AbstractImportFacade.php: 55 added lines, 0 removed lines. Original line number Diff line number Diff line <?php namespace SygalApiImpl\V1\Facade; use Doctrine\DBAL\Connection; use UnicaenDbImport\Domain\Import; use UnicaenDbImport\Domain\Synchro; use UnicaenDbImport\Service\ImportService; use UnicaenDbImport\Service\SynchroService; abstract class AbstractImportFacade implements ImportFacadeInterface { protected Connection $destinationConnection; protected ImportService $importService; protected SynchroService $synchroService; public function setImportService(ImportService $importService): void { $this->importService = $importService; } public function setSynchroService(SynchroService $synchroService): void { $this->synchroService = $synchroService; } public function setDestinationConnection(Connection $destinationConnection): void { $this->destinationConnection = $destinationConnection; } /** * @throws \Exception */ protected function runImport(Import $import) { $result = $this->importService->runImport($import); if ($exception = $result->getFailureException()) { throw $exception; } } /** * @throws \Exception */ protected function runSynchro(Synchro $synchro) { $result = $this->synchroService->runSynchro($synchro); if ($exception = $result->getFailureException()) { throw $exception; } } } No newline at end of file
module/SygalApiImpl/src/V1/Rest/InscriptionAdministrative/Service/ImportFacadeAwareTrait.php→module/SygalApiImpl/src/V1/Facade/ImportFacadeAwareTrait.php +3 −3 Changes for module/SygalApiImpl/src/V1/Facade/ImportFacadeAwareTrait.php: 3 added lines, 3 removed lines. Original line number Diff line number Diff line <?php namespace SygalApiImpl\V1\Rest\InscriptionAdministrative\Service; namespace SygalApiImpl\V1\Facade; trait ImportFacadeAwareTrait { protected ImportFacade $importFacade; protected ImportFacadeInterface $importFacade; public function setImportFacade(ImportFacade $importFacade): void public function setImportFacade(ImportFacadeInterface $importFacade): void { $this->importFacade = $importFacade; } Loading