From f3ea9baff76d8244b8e7af3d22f6d0e05be292b7 Mon Sep 17 00:00:00 2001
From: Patrick Barroca <pbarroca@afi-sa.fr>
Date: Mon, 6 Sep 2021 15:41:50 +0200
Subject: [PATCH] hotline #140590 : fix timezone handling in articles timings

---
 VERSIONS_HOTLINE/140590                       |  1 +
 library/Class/ExternalAgenda/OpenAgenda.php   | 17 ++++---
 ...lesMultipleTimingsOpenAgendaImportTest.php | 44 +++++++++----------
 .../ExternalAgendasOpenAgendaTest.php         | 20 ++++-----
 4 files changed, 42 insertions(+), 40 deletions(-)
 create mode 100644 VERSIONS_HOTLINE/140590

diff --git a/VERSIONS_HOTLINE/140590 b/VERSIONS_HOTLINE/140590
new file mode 100644
index 00000000000..ba43eeb2e16
--- /dev/null
+++ b/VERSIONS_HOTLINE/140590
@@ -0,0 +1 @@
+ - ticket #140590 : Articles : correction de la prise en compte du fuseau horaire lors de l'import d'agenda OpenAgenda en mode horaires multiples
\ No newline at end of file
diff --git a/library/Class/ExternalAgenda/OpenAgenda.php b/library/Class/ExternalAgenda/OpenAgenda.php
index f4584f891f7..3bebd71e9d8 100644
--- a/library/Class/ExternalAgenda/OpenAgenda.php
+++ b/library/Class/ExternalAgenda/OpenAgenda.php
@@ -79,11 +79,16 @@ abstract class EventBuilder_Abstract {
                    .$event->getInfosTag()
                    .$event->getInscriptionsTag())
       ->setDescription($event->getImageTag().'<p>'.$event->getString('description').'</p>')
-      ->setDateMaj($event->getUpdatedAt())
+      ->setDateMaj($this->_localizeDateTime($event->getUpdatedAt()))
       ->setTags(implode(';', $event->getKeywords()))
       ->setLieu($event->getLocation())
       ->setIdOrigine($event->getUid());
   }
+
+
+  protected function _localizeDateTime($value) {
+    return date('Y-m-d H:i', strtotime($value));
+  }
 }
 
 
@@ -103,8 +108,8 @@ class Articles extends EventBuilder_Abstract {
   protected function _buildArticleForTiming($event, $timing, $open_agenda) {
     return $this->_buildArticle($event, $open_agenda)
                 ->setIdOrigine($event->getUid($timing['start']))
-                ->setEventsDebut(date('Y-m-d H:i', strtotime($timing['start'])))
-                ->setEventsFin(date('Y-m-d H:i', strtotime($timing['end'])));
+                ->setEventsDebut($this->_localizeDateTime($timing['start']))
+                ->setEventsFin($this->_localizeDateTime($timing['end']));
   }
 }
 
@@ -117,9 +122,9 @@ class Timings extends EventBuilder_Abstract {
                     ->setIdOrigine($event->getUid());
 
     foreach($event->get('timings') as $timing)
-      $article->addEventTiming((new Class_Article_EventTiming())
-                               ->setStart($timing['start'])
-                               ->setEnd($timing['end']));
+      $article->addEventTiming((new Class_Article_EventTiming)
+                               ->setStart($this->_localizeDateTime($timing['start']))
+                               ->setEnd($this->_localizeDateTime($timing['end'])));
 
     $open_agenda->appendEvent($article);
     return $this;
diff --git a/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsOpenAgendaImportTest.php b/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsOpenAgendaImportTest.php
index a815a5fea87..366cba091f2 100644
--- a/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsOpenAgendaImportTest.php
+++ b/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsOpenAgendaImportTest.php
@@ -61,11 +61,11 @@ class ArticlesMultipleTimingsOpenAgendaImportTest extends ExternalAgendasOpenAge
 
   /** @test */
   public function firstArticleUpdatedAtShouldBe20191126() {
-    $this->assertEquals('2019-11-26T14:12:06.000Z', Class_Article::find(1)->getDateMaj());
+    $this->assertEquals('2019-11-26 15:12', Class_Article::find(1)->getDateMaj());
   }
 
 
-    /** @test */
+  /** @test */
   public function firstArticleImageShouldContainsHTMLAndImage() {
     $this->assertEquals('<figure><img src="https://cibul.s3.amazonaws.com/9c3729cce33140c5a011056c8168ec5b.base.image.jpg" alt=""/><figcaption>Credits : moi</figcaption></figure><p>Voyons ça dans une session de coding dojo</p><p>Infos pratiques :</p><dl><dt>Conditions</dt><dd>être geek</dd><dt>Âge</dt><dd>de 6 à 99 ans</dd></dl><p>Pour s\'inscrire :</p><dl><dt>Courriel</dt><dd><a href="mailto:llaffont@afi-sa.fr">llaffont@afi-sa.fr</a></dd><dt>Téléphone</dt><dd><a href="tel:0123456789">0123456789</a></dd><dt>Site</dt><dd><a href="https://www.website.org">https://www.website.org</a></dd><dt>Lien</dt><dd><a href="https://registration.website.org/">https://registration.website.org/</a></dd></dl>',
                         Class_Article::find(1)->getContenu());
@@ -81,21 +81,20 @@ class ArticlesMultipleTimingsOpenAgendaImportTest extends ExternalAgendasOpenAge
   /** @test */
   public function firstArticleShouldHaveThreeTimings() {
     $this->assertEquals([
-                         ['start' => '2019-11-25 09:30',
-                          'end' => '2019-11-25 11:30',
+                         ['start' => '2019-11-25 10:30',
+                          'end' => '2019-11-25 12:30',
                           'article_id' => 1,
                           'id' => 1],
 
-                         ['start' => '2019-11-29 09:00',
-                          'end' => '2019-11-29 11:00',
+                         ['start' => '2019-11-29 10:00',
+                          'end' => '2019-11-29 12:00',
                           'article_id' => 1,
                           'id' => 2],
 
-                         ['start' => '2019-12-01 09:30',
-                          'end' => '2019-12-01 10:30',
+                         ['start' => '2019-12-01 10:30',
+                          'end' => '2019-12-01 11:30',
                           'article_id' => 1,
                           'id' => 3]],
-
                         $this->_dumpArticleTimings(1));
 
   }
@@ -105,23 +104,22 @@ class ArticlesMultipleTimingsOpenAgendaImportTest extends ExternalAgendasOpenAge
   public function onSecondImportArticleShouldStillHaveThreeTimings() {
     Class_ExternalAgenda::find(12)->import();
     $this->assertEquals([
-                         ['start' => '2019-11-25 09:30',
-                          'end' => '2019-11-25 11:30',
+                         ['start' => '2019-11-25 10:30',
+                          'end' => '2019-11-25 12:30',
                           'article_id' => 1,
                           'id' => 9],
 
-                         ['start' => '2019-11-29 09:00',
-                          'end' => '2019-11-29 11:00',
+                         ['start' => '2019-11-29 10:00',
+                          'end' => '2019-11-29 12:00',
                           'article_id' => 1,
                           'id' => 10],
 
-                         ['start' => '2019-12-01 09:30',
-                          'end' => '2019-12-01 10:30',
+                         ['start' => '2019-12-01 10:30',
+                          'end' => '2019-12-01 11:30',
                           'article_id' => 1,
-                          'id' => 11]],
-
+                          'id' => 11]
+                         ],
                         $this->_dumpArticleTimings(1));
-
   }
 
 
@@ -134,16 +132,16 @@ class ArticlesMultipleTimingsOpenAgendaImportTest extends ExternalAgendasOpenAge
   /** @test */
   public function articleTwoShouldHaveTimingsSameAsOrigine() {
     $this->assertEquals([
-                         ['start' => '2019-11-25 10:00',
-                          'end' => '2019-11-25 10:30',
+                         ['start' => '2019-11-25 11:00',
+                          'end' => '2019-11-25 11:30',
                           'article_id' => 2,
                           'id' => 4],
-                         ['start' => '2019-12-02 10:00',
-                          'end' => '2019-12-02 10:30',
+
+                         ['start' => '2019-12-02 11:00',
+                          'end' => '2019-12-02 11:30',
                           'article_id' => 2,
                           'id' => 5]
                          ],
                         $this->_dumpArticleTimings(2));
-
   }
 }
diff --git a/tests/scenarios/ExternalAgendas/ExternalAgendasOpenAgendaTest.php b/tests/scenarios/ExternalAgendas/ExternalAgendasOpenAgendaTest.php
index b4a9275cf64..df81548be02 100644
--- a/tests/scenarios/ExternalAgendas/ExternalAgendasOpenAgendaTest.php
+++ b/tests/scenarios/ExternalAgendas/ExternalAgendasOpenAgendaTest.php
@@ -76,12 +76,13 @@ class ExternalAgendasOpenAgendaImportTest extends ExternalAgendasOpenAgendaImpor
   public function setup() {
     parent::setup();
     Class_ExternalAgenda::find(12)->import();
+    Class_Article::clearCache();
   }
 
 
   /** @test */
-  public function countArticlesShouldBeSixteen() {
-    $this->assertCount(16, Class_Article::findAll());
+  public function countArticlesShouldBeEight() {
+    $this->assertCount(8, Class_Article::findAll());
   }
 
 
@@ -92,15 +93,15 @@ class ExternalAgendasOpenAgendaImportTest extends ExternalAgendasOpenAgendaImpor
 
 
   /** @test */
-  public function firstArticleDateMajShouldBeEmpty() {
-    $this->assertEquals('', Class_Article::find(1)->getDateMaj());
+  public function firstArticleDateMajShouldBe2019_11_26_15_12() {
+    $this->assertEquals('2019-11-26 15:12', Class_Article::find(1)->getDateMaj());
   }
 
 
   /** @test */
-  public function afterSecondImportCountArticlesShouldRemainsSixteen() {
+  public function afterSecondImportCountArticlesShouldRemainsEight() {
     Class_ExternalAgenda::find(12)->import();
-    $this->assertCount(16, Class_Article::findAll());
+    $this->assertCount(8, Class_Article::findAll());
   }
 
 
@@ -115,7 +116,7 @@ class ExternalAgendasOpenAgendaImportTest extends ExternalAgendasOpenAgendaImpor
                    ]
     );
     Class_ExternalAgenda::find(12)->import();
-    $this->assertCount(16, Class_Article::findAll());
+    $this->assertCount(8, Class_Article::findAll());
     $this->assertNull(Class_Article::find(234));
   }
 
@@ -132,7 +133,7 @@ class ExternalAgendasOpenAgendaImportTest extends ExternalAgendasOpenAgendaImpor
                    ]
     );
     Class_ExternalAgenda::find(12)->import();
-    $this->assertCount(17, Class_Article::findAll());
+    $this->assertCount(9, Class_Article::findAll());
     $this->assertNotNull(Class_Article::find(234));
   }
 
@@ -186,7 +187,6 @@ class ExternalAgendasOpenAgendaImportTest extends ExternalAgendasOpenAgendaImpor
   }
 
 
-
   /** @test */
   public function numberOfLocationsShouldBeTwo() {
     $this->assertCount(2, Class_Lieu::findAll());
@@ -210,7 +210,6 @@ class ExternalAgendasOpenAgendaImportTest extends ExternalAgendasOpenAgendaImpor
   }
 
 
-
   /** @test */
   public function secondLocationShouldBeAFIAnnecy() {
     $this->assertEquals(['id' => 2,
@@ -228,7 +227,6 @@ class ExternalAgendasOpenAgendaImportTest extends ExternalAgendasOpenAgendaImpor
   }
 
 
-
   /** @test */
   public function firstArticleImageShouldContainsHTMLAndImage() {
     $this->assertEquals('<figure><img src="https://cibul.s3.amazonaws.com/9c3729cce33140c5a011056c8168ec5b.base.image.jpg" alt=""/><figcaption>Credits : moi</figcaption></figure><p>Voyons ça dans une session de coding dojo</p><p>Infos pratiques :</p><dl><dt>Conditions</dt><dd>être geek</dd><dt>Âge</dt><dd>de 6 à 99 ans</dd></dl><p>Pour s\'inscrire :</p><dl><dt>Courriel</dt><dd><a href="mailto:llaffont@afi-sa.fr">llaffont@afi-sa.fr</a></dd><dt>Téléphone</dt><dd><a href="tel:0123456789">0123456789</a></dd><dt>Site</dt><dd><a href="https://www.website.org">https://www.website.org</a></dd><dt>Lien</dt><dd><a href="https://registration.website.org/">https://registration.website.org/</a></dd></dl>',
-- 
GitLab