diff --git a/CHANGELOG.md b/CHANGELOG.md
index 503a728f0e8b8fea5ee963332f35157ef4adaf8e..cd5a9560b61aab9395e649f6fe54c493a63c0d94 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,10 @@
Changelog
=========
+5.2.0
+-----
+- [FIX] Correction de divers bugs.
+
5.1.1
-----
- [FIX] Import : seules les données issues de la source concernée doivent être préalablement purgées, pas toute la table.
diff --git a/README.md b/README.md
index 6b3d7e1ffdfcc02b6485dc90e275dd0fff6587d5..fe5086e33fe824d0710362f187ace9456739fd44 100644
--- a/README.md
+++ b/README.md
@@ -399,13 +399,14 @@ return [
[
'name' => "IMPORT_SIMPLE",
'source' => [
- 'code' => 'UTILISATEUR_OCTOPUS',
+ 'code' => 'OCTOPUS', // DOIT correspondre à un `CODE` de la table `SOURCE`
+ 'name' => 'UTILISATEUR_OCTOPUS',
'table' => 'UTILISATEUR',
'connection' => 'orm_B',
'source_code_column' => 'CODE',
],
'destination' => [
- 'code' => 'TABLE UTILISATEUR LOCALE',
+ 'name' => 'TABLE UTILISATEUR LOCALE',
'table' => 'UTILISATEUR',
'connection' => 'orm_A',
'source_code_column' => 'CODE',
@@ -434,12 +435,13 @@ return [
'name' => "IMPORT_REGIONS_API",
'source' => [
'code' => 'geo_api', // DOIT correspondre à un `CODE` de la table `SOURCE`
+ 'name' => 'API Geo',
'select' => '/regions?fields=nom,code',
'connection' => 'geo',
'source_code_column' => 'code',
],
'destination' => [
- 'code' => 'Table REGION',
+ 'name' => 'Table REGION',
'table' => 'REGION',
'connection' => 'orm_A',
'source_code_column' => 'CODE',
@@ -471,13 +473,14 @@ return [
[
'name' => "SYNCHRO_LOCALE_ROLE",
'source' => [
- 'code' => 'app',
+ 'code' => 'APP', // DOIT correspondre à un `CODE` de la table `SOURCE`
+ 'name' => 'Roles',
'select' => 'SELECT CODE, LIBELLE, DESCRIPTION FROM SRC_ROLE',
'connection' => 'orm_A',
'source_code_column' => 'CODE',
],
'destination' => [
- 'code' => 'Table ROLE',
+ 'name' => 'Table ROLE',
'table' => 'ROLE',
'connection' => 'orm_A',
'source_code_column' => 'CODE',
@@ -515,13 +518,14 @@ return [
[
'name' => "SYNCHRO_BDD_EXTERNE",
'source' => [
- 'code' => 'UTILISATEUR_OCTOPUS',
+ 'code' => 'OCTOPUS', // DOIT correspondre à un `CODE` de la table `SOURCE`
+ 'name' => 'UTILISATEUR_OCTOPUS',
'select' => 'SELECT CODE, NOM, PRENOM, NAISSANCE FROM UTILISATEUR',
'connection' => 'orm_B',
'source_code_column' => 'CODE',
],
'destination' => [
- 'code' => 'Table UTILISATEUR',
+ 'name' => 'Table UTILISATEUR',
'table' => 'UTILISATEUR',
'connection' => 'orm_A',
'source_code_column' => 'CODE',
@@ -559,12 +563,13 @@ return [
'name' => "SYNCHRO_COMMUNES",
'source' => [
'code' => 'geo_api', // DOIT correspondre à un `CODE` de la table `SOURCE`
+ 'name' => 'geo_api',
'select' => '/departements/63/communes?fields=nom,code',
'connection' => 'geo',
'source_code_column' => 'code',
],
'destination' => [
- 'code' => 'Table locale',
+ 'name' => 'Table locale',
'table' => 'REGION',
'connection' => 'orm_A',
'source_code_column' => 'CODE',
@@ -619,13 +624,14 @@ return [
[
'name' => "IMPORT_PRÉALABLE", // Importation des données externes dans une table intermédiaire
'source' => [
- 'code' => 'FORMATION_FCA',
+ 'code' => 'FCA', // DOIT correspondre à un `CODE` de la table `SOURCE`
+ 'name' => 'FORMATION_FCA',
'select' => 'SELECT ID, CODE, NOM, COMPOSANTE_CODE FROM FORMATION',
'connection' => 'orm_B',
'source_code_column' => 'ID',
],
'destination' => [
- 'code' => 'Table TMP_FORMATION locale',
+ 'name' => 'Table TMP_FORMATION locale',
'table' => 'TMP_FORMATION',
'connection' => 'orm_A',
'source_code_column' => 'ID',
@@ -636,13 +642,14 @@ return [
[
'name' => "SYNCHRO_FINALE", // Synchro des données mise en forme vers la table finale
'source' => [
- 'code' => 'TABLE SRC_FORMATION DE MA BASE A UTILISANT TMP_FORMATION',
+ 'code' => 'APP', // DOIT correspondre à un `CODE` de la table `SOURCE`
+ 'name' => 'TABLE SRC_FORMATION DE MA BASE A UTILISANT TMP_FORMATION',
'select' => 'SELECT * FROM SRC_FORMATION',
'connection' => 'orm_A',
'source_code_column' => 'ID',
],
'destination' => [
- 'code' => 'TABLE FORMATION DE MA BASE A',
+ 'name' => 'TABLE FORMATION DE MA BASE A',
'table' => 'FORMATION',
'connection' => 'orm_A',
'source_code_column' => 'ID',
diff --git a/public/unicaen/db-import/js/unicaen-db-import.js b/public/unicaen/db-import/js/unicaen-db-import.js
index 02fa3400c3059aac81e9d9337141a61ca2fdc024..e2e7d34e59e6b498b1257f3b253bad46e328f154 100644
--- a/public/unicaen/db-import/js/unicaen-db-import.js
+++ b/public/unicaen/db-import/js/unicaen-db-import.js
@@ -58,6 +58,7 @@ function installLancementMultiple()
} else {
btn.addClass('disabled');
}
+ if(urlPattern === undefined){return;}
btn.prop("href", urlPattern.replace('__names__', generateNames($checkboxes)));
}
}
\ No newline at end of file
diff --git a/src/UnicaenDbImport/Controller/SynchroController.php b/src/UnicaenDbImport/Controller/SynchroController.php
index 3b65aaea144a38f32c437026d0297db9bb15c7fd..c4a540b88ae414809441e140767e340206e7236a 100644
--- a/src/UnicaenDbImport/Controller/SynchroController.php
+++ b/src/UnicaenDbImport/Controller/SynchroController.php
@@ -2,6 +2,7 @@
namespace UnicaenDbImport\Controller;
+use Exception;
use Laminas\Http\PhpEnvironment\Response;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\JsonModel;
@@ -42,7 +43,12 @@ class SynchroController extends AbstractActionController
foreach ($synchros as $synchro) {
$importLog = $this->importLogService->findLastLogForSynchro($synchro);
$importLogs[$synchro->getName()] = $importLog;
- $diffCounts[$synchro->getName()] = $this->synchroService->fetchSynchroDiffCount($synchro);
+ try{
+ $diffCounts[$synchro->getName()] = $this->synchroService->fetchSynchroDiffCount($synchro);
+ }
+ catch (Exception $e){
+ $this->flashMessenger()->addErrorMessage(sprintf("Erreur rencontrée lors du calcul des différences pour la syncho %s", $synchro));
+ }
}
return [
@@ -62,7 +68,12 @@ class SynchroController extends AbstractActionController
{
$name = $this->params('name');
$synchro = $this->synchroService->getSynchroByName($name);
- $diffCount = $this->synchroService->fetchSynchroDiffCount($synchro);
+ try{
+ $diffCount = $this->synchroService->fetchSynchroDiffCount($synchro);
+ }
+ catch (Exception $e){
+ $this->flashMessenger()->addErrorMessage(sprintf("Erreur rencontrée lors du calcul des différences pour la syncho %s", $synchro));
+ }
$importLog = $this->importLogService->findLastLogForSynchro($synchro);
return [
diff --git a/src/UnicaenDbImport/ORM/Event/Listeners/SourceListener.php b/src/UnicaenDbImport/ORM/Event/Listeners/SourceListener.php
index 36a99e6571f20ce825da369ea6862431a160f2ba..4d9f4e997a3228ef9d9b3dcb8741a59b1832ce30 100644
--- a/src/UnicaenDbImport/ORM/Event/Listeners/SourceListener.php
+++ b/src/UnicaenDbImport/ORM/Event/Listeners/SourceListener.php
@@ -76,7 +76,7 @@ class SourceListener implements EventSubscriber
* @param EntityManager $entityManager
* @return Source
*/
- private function fetchDefaultSource(EntityManager $entityManager)
+ private function fetchDefaultSource(EntityManager $entityManager): Source
{
if ($this->sourceEntityClass === null) {
throw new RuntimeException("La classe d'entité Source n'a pas été spécifiée");
diff --git a/src/UnicaenDbImport/Service/Database/DatabaseService.php b/src/UnicaenDbImport/Service/Database/DatabaseService.php
index eb76d9360f50177825d5bfd650a83513c51dd9f9..8df460c64717ccc7aad1a743fbc8a86bfec1c359 100644
--- a/src/UnicaenDbImport/Service/Database/DatabaseService.php
+++ b/src/UnicaenDbImport/Service/Database/DatabaseService.php
@@ -468,6 +468,9 @@ class DatabaseService
"les données doivent contenir une colonne SOURCE_ID ou source_id");
}
}
+ else{
+ $row['SOURCE_ID'] = $sourceCode;
+ }
return $row;
}
diff --git a/src/UnicaenDbImport/Service/Facade/SynchroFacadeService.php b/src/UnicaenDbImport/Service/Facade/SynchroFacadeService.php
index 8cfc7dc45368626593cdfb7034a2cba4d09c226e..66e397ab166f535d31eacd5be69653f290d69b61 100644
--- a/src/UnicaenDbImport/Service/Facade/SynchroFacadeService.php
+++ b/src/UnicaenDbImport/Service/Facade/SynchroFacadeService.php
@@ -64,9 +64,33 @@ class SynchroFacadeService extends AbstractFacadeService
*/
public function fetchSynchroDiff(): array
{
+ $intermediateTable = null;
+
+ if ($this->requiresIntermediateTable) {
+ $this->fetchSource();
+ $intermediateTable = $this->destination->getIntermediateTable();
+ if ($this->destination->getIntermediateTableAutoDrop()) {
+ $this->logger->info("Suppression de la table intermédiaire $intermediateTable");
+ $this->databaseService->dropIntermediateTable($intermediateTable);
+ } else {
+ $this->databaseService->checkIntermediateTableNotExists($intermediateTable);
+ }
+
+ $this->logger->info("Création de la table intermédiaire $intermediateTable");
+ $this->databaseService->createIntermediateTable($intermediateTable);
+ $this->logger->info("Peuplement de la table intermédiaire $intermediateTable");
+ $this->databaseService->populateTableFromSource($intermediateTable, false);
+ }
+
$this->recreateDiffView();
+ $result = $this->databaseService->fetchDiffView();
- return $this->databaseService->fetchDiffView();
+ if ($this->requiresIntermediateTable) {
+ $this->logger->info("Suppression de la table intermédiaire");
+ $this->databaseService->dropIntermediateTable($intermediateTable);
+ }
+
+ return $result;
}
/**
@@ -75,9 +99,32 @@ class SynchroFacadeService extends AbstractFacadeService
*/
public function fetchSynchroDiffCount(): int
{
+ $intermediateTable = null;
+
+ if ($this->requiresIntermediateTable) {
+ $this->fetchSource();
+ $intermediateTable = $this->destination->getIntermediateTable();
+ if ($this->destination->getIntermediateTableAutoDrop()) {
+ $this->logger->info("Suppression de la table intermédiaire $intermediateTable");
+ $this->databaseService->dropIntermediateTable($intermediateTable);
+ } else {
+ $this->databaseService->checkIntermediateTableNotExists($intermediateTable);
+ }
+
+ $this->logger->info("Création de la table intermédiaire $intermediateTable");
+ $this->databaseService->createIntermediateTable($intermediateTable);
+ $this->logger->info("Peuplement de la table intermédiaire $intermediateTable");
+ $this->databaseService->populateTableFromSource($intermediateTable, false);
+ }
+
$this->recreateDiffView();
+ $result = $this->databaseService->fetchDiffViewCount();
- return $this->databaseService->fetchDiffViewCount();
+ if ($this->requiresIntermediateTable) {
+ $this->logger->info("Suppression de la table intermédiaire");
+ $this->databaseService->dropIntermediateTable($intermediateTable);
+ }
+ return $result;
}
/**
diff --git a/view/unicaen-db-import/import/index.phtml b/view/unicaen-db-import/import/index.phtml
index 43fa49ea8a647fc63a132ea32445a7f0336ece77..8bb1395501e5042f26bd076f6b524456a79e565e 100644
--- a/view/unicaen-db-import/import/index.phtml
+++ b/view/unicaen-db-import/import/index.phtml
@@ -162,6 +162,9 @@ $lancable = $this->isAllowed(ImportPrivilege::getResourceId(ImportPrivilege::LAN
$(function() {
// `conn` est de type `WebSocket` (cf. https://developer.mozilla.org/fr/docs/Web/API/WebSocket)
let conn = $("#livelog-div").data('conn');
+ if (conn === undefined) {
+ return;
+ }
conn.addEventListener('open', function(e) {
$("#a-lancer-multiple").on('click', function(event) {
let trigger = $(this).addClass('disabled');
diff --git a/view/unicaen-db-import/import/voir.phtml b/view/unicaen-db-import/import/voir.phtml
index 4c4f5a82873e527e599159c148f3fdcb0df48c76..b553f4bf54ac4c3dbdcdb9df4a26b4db360553e9 100644
--- a/view/unicaen-db-import/import/voir.phtml
+++ b/view/unicaen-db-import/import/voir.phtml
@@ -72,6 +72,9 @@ $lancable = $this->isAllowed(ImportPrivilege::getResourceId(ImportPrivilege::LAN
$(function() {
// `conn` est de type `WebSocket` (cf. https://developer.mozilla.org/fr/docs/Web/API/WebSocket)
let conn = $("#livelog-div").data('conn');
+ if (conn === undefined) {
+ return;
+ }
conn.addEventListener('open', function(e) {
$("#lancer").on('click', function(event) {
let trigger = $(this).addClass('disabled');
diff --git a/view/unicaen-db-import/log/index.phtml b/view/unicaen-db-import/log/index.phtml
index 13d7e4134b427dbef7ff02b213799087eea87094..793c1a150e23c8756c3b97f2b6028a6c22a1a9c1 100644
--- a/view/unicaen-db-import/log/index.phtml
+++ b/view/unicaen-db-import/log/index.phtml
@@ -121,7 +121,7 @@ $synchroConsultable = $this->isAllowed(SynchroPrivilege::getResourceId(SynchroPr
<?php endif ?>
-<?php echo $paginationControl = $this->paginationControl($importLogs, 'sliding', 'paginator.phtml', ['route' => 'unicaen-db-import/log']) ?>
+<?php echo $paginationControl = $this->paginationControl($importLogs, 'sliding', 'unicaen-db-import/paginator', ['route' => 'unicaen-db-import/log']) ?>
<?php echo $this->partial('unicaen-db-import/paginator'); ?>
diff --git a/view/unicaen-db-import/synchro/index.phtml b/view/unicaen-db-import/synchro/index.phtml
index 3761577c2534c15c7b135003472d83c7bdb44810..3c13037490e029161876afddb814d56359e50f20 100644
--- a/view/unicaen-db-import/synchro/index.phtml
+++ b/view/unicaen-db-import/synchro/index.phtml
@@ -188,6 +188,9 @@ $lancable = $this->isAllowed(SynchroPrivilege::getResourceId(SynchroPrivilege::L
$(function() {
// `conn` est de type `WebSocket` (cf. https://developer.mozilla.org/fr/docs/Web/API/WebSocket)
let conn = $("#livelog-div").data('conn');
+ if (conn === undefined) {
+ return;
+ }
conn.addEventListener('open', function(e) {
$("#a-lancer-multiple").on('click', function(event) {
let trigger = $(this).addClass('disabled');
diff --git a/view/unicaen-db-import/synchro/voir.phtml b/view/unicaen-db-import/synchro/voir.phtml
index d5f3def4c6f3b57d432baf271a7124d084fe6258..435a42d11ed7360809c8b75f0f06597e2d888527 100644
--- a/view/unicaen-db-import/synchro/voir.phtml
+++ b/view/unicaen-db-import/synchro/voir.phtml
@@ -86,6 +86,9 @@ $lancable = $this->isAllowed(SynchroPrivilege::getResourceId(SynchroPrivilege::L
$(function() {
// `conn` est de type `WebSocket` (cf. https://developer.mozilla.org/fr/docs/Web/API/WebSocket)
let conn = $("#livelog-div").data('conn');
+ if (conn === undefined) {
+ return;
+ }
conn.addEventListener('open', function(e) {
$("#lancer").on('click', function(event) {
let trigger = $(this).addClass('disabled');