Exemple #1
0
 public function testParsingOfEndTimeWithTzidSetAndUntilSetUnderRRULE()
 {
     $ical = new SG_iCal();
     $timezone['tzid'] = 'America/New_York';
     $timezone['daylight'] = array('tzoffsetfrom' => '-0500', 'tzoffsetto' => '-0400', 'tzname' => 'EDT', 'dtstart' => '19700308T020000', 'rrule' => 'FREQ=YEARLY;BYMONTH=3;BYDAY=2SU');
     $timezone['standard'] = array('tzoffsetfrom' => '-0400', 'tzoffsetto' => '-0500', 'tzname' => 'EST', 'dtstart' => '19701101T020000', 'rrule' => 'FREQ=YEARLY;BYMONTH=11;BYDAY=1SU');
     $timezone2['tzid'] = 'Europe/Copenhagen';
     $timezone2['daylight'] = array('tzoffsetfrom' => '+0100', 'tzoffsetto' => '+0200', 'tzname' => 'CEST', 'dtstart' => '19700329T020000', 'rrule' => 'FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU');
     $timezone2['standard'] = array('tzoffsetfrom' => '+0200', 'tzoffsetto' => '+0100', 'tzname' => 'CET', 'dtstart' => '19701025T030000', 'rrule' => 'FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU');
     $ical->addTimeZone(new SG_iCal_VTimeZone($timezone));
     $ical->addtimeZone(new SG_iCal_VTimeZone($timezone2));
     $data['uid'] = new SG_iCal_Line('uid');
     //this takes place after Copenhagens change back to standard time
     $data['dtstart'] = new SG_iCal_Line('DTSTART;TZID=Europe/Copenhagen:20091027T100000');
     $data['rrule'] = new SG_iCal_Line('RRULE:FREQ=DAILY;UNTIL=20091030T130000Z');
     date_default_timezone_set('America/New_York');
     $event = new SG_iCal_VEvent($data, $ical);
     $this->assertEquals(strtotime('20091030T090000'), $event->getProperty('laststart'));
 }
 /**
  * Fonction qui insère en base de données les évènements du fichier iCal
  *
  * @param file $iCalFile   Fichier iCalendar contenant des événements à importer
  * @param int  $agendaId   Identifiant de l'agenda dans lequel doivent être insérés les évènements
  * @param bool $withPurge  Purge le calendrier de l'agenda sur la période concernée
  *
  * @return int Nombre d'insertions effectuées
  */
 public static function import($iCalFile, $agendaId, $withPurge = false)
 {
     $ical = new SG_iCal($iCalFile);
     $events = $ical->getEvents();
     $eventsCounter = 0;
     if (is_array($events) && !empty($events)) {
         // Récupération de la première et dernière date du calendrier importé
         foreach ($events as $event) {
             if (!isset($startDate) && !isset($endDate)) {
                 $startDate = $event->getStart();
                 $endDate = $event->getEnd();
             }
             $startDate = min($event->getStart(), $startDate);
             $endDate = max($event->getEnd(), $endDate);
         }
         // Si purge de l'agenda demandé...
         if ($withPurge) {
             try {
                 _classInclude('agenda|AgendaService');
                 AgendaService::purgeAgendaByDateInterval($agendaId, date('Ymd', $startDate), date('Ymd', $endDate), date('H:i', $startDate), date('H:i', $endDate));
             } catch (Exception $e) {
                 throw new Exception('Error during agenda purge.');
             }
         }
         $eventDAO = _ioDAO('event');
         foreach ($events as $event) {
             // Recherche si l'événement existe déjà en base
             $criteres = _daoSp();
             $criteres->addCondition('id_agenda', '=', $agendaId);
             $criteres->addCondition('title_event', '=', $event->getSummary());
             $criteres->addCondition('datedeb_event', '=', date('Ymd', $event->getStart()));
             $criteres->addCondition('datefin_event', '=', date('Ymd', $event->getEnd()));
             if ($event->isWholeDay()) {
                 $criteres->addCondition('alldaylong_event', '=', 1);
             } else {
                 $criteres->addCondition('heuredeb_event', '=', date('H:i', $event->getStart()));
             }
             $resultat = $eventDAO->findBy($criteres);
             // Si l'évenement n'est pas présent en base on le sauvegarde tel qu'elle
             if (count($resultat) < 1) {
                 $record = self::createEvent($agendaId, $event);
                 $eventDAO->insert($record);
                 $eventsCounter++;
             } else {
                 // Sinon, on applique un traitement spécifique aux événements récurrents
                 if ($event->getProperty('recurrence')) {
                     $findSame = false;
                     // On cherche la date de fin de récurrence
                     if ($event->getProperty('freq')) {
                         $endRepeatdateEvent = date('Ymd', $event->getProperty('freq')->lastOccurrence());
                     } else {
                         $endRepeatdateEvent = 99999999;
                     }
                     // Si dans les résultat, une date de fin de récurrence est trouvé, alors l'évenements est déjà en base
                     foreach ($resultat as $eventSame) {
                         if ($eventSame->endrepeatdate_event == $endRepeatdateEvent || $eventSame->endrepeatdate_event == date('Ymd', $endDate)) {
                             $findSame = true;
                         }
                     }
                     // Sinon, il a pus être purger, on vérifie donc si sa date de fin de récurrence est égale à la date de début de purge
                     if ($resultat[0]->endrepeatdate_event == date('Ymd', $startDate) && !$findSame) {
                         $record = self::createEvent($agendaId, $event);
                         // Dans se cas, la récurrence prendra fin à la date de fin de purge, car un nouvel événement est entré en base pour la suite
                         $record->endrepeatdate_event = date('Ymd', $endDate);
                         $eventDAO->insert($record);
                     }
                 }
             }
         }
     }
     return $eventsCounter;
 }
 /**
  * Calculates the timestamp from a DT line.
  * @param $line SG_iCal_Line
  * @return int
  */
 private function getTimestamp(SG_iCal_Line $line, SG_iCal $ical)
 {
     $ts = strtotime($line->getData());
     if (isset($line['tzid'])) {
         $tz = $ical->getTimeZoneInfo($line['tzid']);
         $offset = $tz->getOffset($ts);
         $ts = strtotime(date('D, d M Y H:i:s', $ts) . ' ' . $offset);
     }
     return $ts;
 }