diff --git a/VERSIONS_WIP/140256 b/VERSIONS_WIP/140256 new file mode 100644 index 0000000000000000000000000000000000000000..2a166cba7138798d3ac1487a8f511394af320b69 --- /dev/null +++ b/VERSIONS_WIP/140256 @@ -0,0 +1 @@ + - ticket #140256 : Agenda externe : correction de la duplication des horaires à l'import \ No newline at end of file diff --git a/library/Class/ExternalAgenda.php b/library/Class/ExternalAgenda.php index 6780dc2a719f08a58249bdb832b546ec79eaeff3..ffa01cc69189a4a92d0ac263ff1eb80140742ab4 100644 --- a/library/Class/ExternalAgenda.php +++ b/library/Class/ExternalAgenda.php @@ -84,22 +84,40 @@ class Class_ExternalAgenda extends Storm_Model_Abstract { $created = $events->select('isNew'); $updated = $events->reject('isNew'); - // must be after updated detection - $created->eachDo(function($model) + $this + ->_saveCreatedEvents($created) + ->_saveUpdatedEvents($updated) + ->_deleteOrphanEvents($events); + + if ($after_import) + $after_import($created, $updated); + + return $this; + } + + + protected function _saveCreatedEvents($created) { + $created->eachDo(function($article) { - $model - ->setDateCreation(date('Y-m-d H:i:s', $this->getCurrentTime())) + $article + ->setDateCreation(date('Y-m-d H:i:s', + $this->getCurrentTime())) ->save(); }); + return $this; + } - if (!Class_AdminVar::get('AGENDA_KEEP_LOCAL_CONTENT')) - $updated->eachDo(function ($model) { $model->updateDateMaj()->save(); }); - if ($this->getDeleteOrphanEvents()) - $this->_deleteOrphanEvents($events); + protected function _saveUpdatedEvents($updated) { + if (Class_AdminVar::get('AGENDA_KEEP_LOCAL_CONTENT')) + return $this; - if ($after_import) - $after_import($created, $updated); + $updated->eachDo(function($article) + { + Class_Article_EventTiming::basicDeleteBy(['article_id' => $article->getId()]); + $article->updateDateMaj()->save(); + }); + return $this; } @@ -116,8 +134,9 @@ class Class_ExternalAgenda extends Storm_Model_Abstract { public function deduplicateEvent($event){ - if ($existing_event = $this->findEventByUID($event->getIdOrigine())) + if ($existing_event = $this->findEventByUID($event->getIdOrigine())) { $event->setId($existing_event->getId()); + } } @@ -132,12 +151,16 @@ class Class_ExternalAgenda extends Storm_Model_Abstract { protected function _deleteOrphanEvents($updated_events) { + if (!$this->getDeleteOrphanEvents()) + return $this; + $delete_params = ['repository_origine' => $this->getRepositoryKey()]; if (!$updated_events->isEmpty()) $delete_params['ID_ARTICLE not'] = $updated_events->collect('id')->getArrayCopy(); Class_Article::deleteBy($delete_params); + return $this; } diff --git a/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsOpenAgendaImportTest.php b/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsOpenAgendaImportTest.php index 9263b16681a3b32566f0ba70c672d472aab12b92..a815a5fea87cb2b605529d9db8eafa878263fcb9 100644 --- a/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsOpenAgendaImportTest.php +++ b/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsOpenAgendaImportTest.php @@ -72,10 +72,14 @@ class ArticlesMultipleTimingsOpenAgendaImportTest extends ExternalAgendasOpenAge } + protected function _dumpArticleTimings($id) { + return array_map(function($timing) { return $timing->getRawAttributes(); }, + Class_Article::find($id)->getEventTimings()); + } + + /** @test */ public function firstArticleShouldHaveThreeTimings() { - $timings = array_map(function($timing) { return $timing->getRawAttributes(); }, - Class_Article::find(1)->getEventTimings()); $this->assertEquals([ ['start' => '2019-11-25 09:30', 'end' => '2019-11-25 11:30', @@ -92,7 +96,31 @@ class ArticlesMultipleTimingsOpenAgendaImportTest extends ExternalAgendasOpenAge 'article_id' => 1, 'id' => 3]], - $timings); + $this->_dumpArticleTimings(1)); + + } + + + /** @test */ + public function onSecondImportArticleShouldStillHaveThreeTimings() { + Class_ExternalAgenda::find(12)->import(); + $this->assertEquals([ + ['start' => '2019-11-25 09:30', + 'end' => '2019-11-25 11:30', + 'article_id' => 1, + 'id' => 9], + + ['start' => '2019-11-29 09:00', + 'end' => '2019-11-29 11:00', + 'article_id' => 1, + 'id' => 10], + + ['start' => '2019-12-01 09:30', + 'end' => '2019-12-01 10:30', + 'article_id' => 1, + 'id' => 11]], + + $this->_dumpArticleTimings(1)); } @@ -105,8 +133,6 @@ class ArticlesMultipleTimingsOpenAgendaImportTest extends ExternalAgendasOpenAge /** @test */ public function articleTwoShouldHaveTimingsSameAsOrigine() { - $timings = array_map(function($timing) { return $timing->getRawAttributes(); }, - Class_Article::find(2)->getEventTimings()); $this->assertEquals([ ['start' => '2019-11-25 10:00', 'end' => '2019-11-25 10:30', @@ -117,7 +143,7 @@ class ArticlesMultipleTimingsOpenAgendaImportTest extends ExternalAgendasOpenAge 'article_id' => 2, 'id' => 5] ], - $timings); + $this->_dumpArticleTimings(2)); } }