/**
  * Fonction qui retourne un fichier texte contenant les évènements exportés d'après une période et les agendas concernés
  * @author Audrey Vassal <*****@*****.**>
  * @since 2006/08/17
  * @param array $pArEvents tableau d'évènements à exporter, classés par ordre croissant de début
  * @return string $content chaine de caractère représentant le contenu du fichier iCal exporté
  */
 public function getFileICal($pArEvents)
 {
     $serviceDate = new DateService();
     $content = 'BEGIN:VCALENDAR' . "\n";
     $content .= 'VERSION:2.0' . "\n";
     $content .= 'X-WR-TIMEZONE;VALUE=TEXT:' . CopixConfig::get('agenda|timeZone') . "\n";
     $content .= 'METHOD:PUBLISH' . "\n";
     foreach ((array) $pArEvents as $jour => $day) {
         if (!isset($day->events)) {
             continue;
         }
         foreach ($day->events as $event) {
             $content .= 'BEGIN:VEVENT' . "\n";
             $content .= 'SUMMARY:' . $event->title_event . "\n";
             if ($event->alldaylong_event == 1) {
                 //si l'évènement se déroule toute la journée
                 $dateCourante = $jour;
                 $content .= 'DTSTART;VALUE=DATE:' . $dateCourante . "\n";
                 $dateFin = $serviceDate->dateBddToDateFr($dateCourante);
                 $dateFin = $serviceDate->addToDate($dateFin, 1, 0, 0);
                 $dateFin = $serviceDate->dateFrToDateBdd($dateFin);
                 $content .= 'DTEND;VALUE=DATE:' . $dateFin . "\n";
             } else {
                 if ($event->endrepeatdate_event != null) {
                     //si c'est un évènement qui se répète
                     $content .= 'DTSTART;TZID=' . CopixConfig::get('agenda|timeZone') . ':' . $jour . 'T' . $serviceDate->heureWithSeparateurToheureWithoutSeparateur($event->heuredeb_event) . '00Z' . "\n";
                     $content .= 'DTEND;TZID=' . CopixConfig::get('agenda|timeZone') . ':' . $jour . 'T' . $serviceDate->heureWithSeparateurToheureWithoutSeparateur($event->heurefin_event) . '00Z' . "\n";
                 } else {
                     //cas d'un évènement classique
                     //var_dump($event);
                     $content .= 'DTSTART;TZID=' . CopixConfig::get('agenda|timeZone') . ':' . $event->datedeb_event . 'T' . $serviceDate->heureWithSeparateurToheureWithoutSeparateur($event->heuredeb_event) . '00Z' . "\n";
                     $content .= 'DTEND;TZID=' . CopixConfig::get('agenda|timeZone') . ':' . $event->datefin_event . 'T' . $serviceDate->heureWithSeparateurToheureWithoutSeparateur($event->heurefin_event) . '00Z' . "\n";
                 }
             }
             if ($event->desc_event != null) {
                 $content .= 'DESCRIPTION:' . $event->desc_event . "\n";
             }
             if ($event->place_event != null) {
                 $content .= 'LOCATION:' . $event->place_event . "\n";
             }
             $content .= 'END:VEVENT' . "\n";
         }
     }
     $content .= 'END:VCALENDAR';
     return $content;
 }
 /**
  * Retourne les travaux en classe pour un agenda et une période de date donnés
  *
  * @param int     $agendaId           Identifiant de l'agenda
  * @param string  $dateDebutSemaine   Date de début (YYYYmmdd)
  * @param string  $dateFinSemaine     Date de fin   (YYYYmmdd)
  * @param string  $nodeType           Type du node de l'agenda
  * @param int     $nodeId             Id du node de l'agenda
  * @param int     $agendaLevel        Level de l'utilisateur sur l'agenda
  *
  * @return array
  */
 public function findTravauxEnClasseByAgendaParJour($agendaId, $dateDebutSemaine, $dateFinSemaine, $nodeType, $nodeId, $agendaLevel)
 {
     $arTravauxParJour = array();
     $dateService = new DateService();
     $dateCourante = $dateDebutSemaine;
     while ($dateCourante <= $dateFinSemaine) {
         $arTravauxParJour[$dateCourante] = '';
         $dateCourante = $dateService->addToDate($dateService->dateBddToDateFr($dateCourante), 1, 0, 0, '/');
         $dateCourante = $dateService->dateFrToDateBdd($dateCourante);
     }
     // Eleve
     if ($agendaLevel == PROFILE_CCV_WRITE) {
         $sql = 'SELECT count(module_cahierdetextes_travail.id) as count, module_agenda_work.module_agenda_agenda_id_agenda as id_agenda, "' . $nodeType . '" as node_type, ' . $nodeId . ' as node_id, module_cahierdetextes_travail.date_creation as date_creation, module_cahierdetextes_domaine.nom' . ' FROM module_cahierdetextes_travail' . ' LEFT JOIN module_agenda_work ON (module_agenda_work.module_agenda_agenda_id_agenda = :agendaId)' . ' LEFT JOIN module_cahierdetextes_travail2eleve ON (module_cahierdetextes_travail.id = module_cahierdetextes_travail2eleve.module_cahierdetextes_travail_id)' . ' LEFT JOIN module_cahierdetextes_domaine ON (module_cahierdetextes_domaine.id = module_cahierdetextes_travail.module_cahierdetextes_domaine_id)' . ' WHERE module_agenda_work.module_cahierdetextes_travail_id = module_cahierdetextes_travail.id' . ' AND module_cahierdetextes_travail2eleve.kernel_bu_eleve_idEleve=:idEleve' . ' AND module_cahierdetextes_travail.supprime = 0' . ' AND module_cahierdetextes_travail.a_faire = ' . self::TYPE_EN_CLASSE . ' AND module_cahierdetextes_travail.date_creation >= :dateDebut' . ' AND module_cahierdetextes_travail.date_creation <= :dateFin' . ' GROUP BY module_cahierdetextes_travail.id';
         $results = _doQuery($sql, array('dateDebut' => $dateDebutSemaine, 'dateFin' => $dateFinSemaine, 'idEleve' => _currentUser()->getExtra('id'), 'agendaId' => $agendaId));
         foreach ($results as $result) {
             $arTravauxParJour[$result->date_creation][] = $result;
         }
     } elseif ($agendaLevel == PROFILE_CCV_NONE && _currentUser()->getExtra('type') == 'USER_RES') {
         $myNode = CopixSession::get('myNode');
         $eleveId = $myNode['type'] == "USER_ELE" ? $myNode['id'] : null;
         $sql = 'SELECT count(module_cahierdetextes_travail.id) as count, module_agenda_work.module_agenda_agenda_id_agenda as id_agenda, "' . $nodeType . '" as node_type, ' . $nodeId . ' as node_id, module_cahierdetextes_travail.date_creation as date_creation, module_cahierdetextes_domaine.nom' . ' FROM module_cahierdetextes_travail' . ' LEFT JOIN module_agenda_work ON (module_agenda_work.module_agenda_agenda_id_agenda = :agendaId)' . ' LEFT JOIN module_cahierdetextes_travail2eleve ON (module_cahierdetextes_travail.id = module_cahierdetextes_travail2eleve.module_cahierdetextes_travail_id)' . ' LEFT JOIN module_cahierdetextes_domaine ON (module_cahierdetextes_domaine.id = module_cahierdetextes_travail.module_cahierdetextes_domaine_id)' . ' WHERE module_agenda_work.module_cahierdetextes_travail_id = module_cahierdetextes_travail.id' . ' AND module_cahierdetextes_travail2eleve.kernel_bu_eleve_idEleve = :eleveId' . ' AND module_cahierdetextes_travail.supprime = 0' . ' AND module_cahierdetextes_travail.a_faire = ' . self::TYPE_EN_CLASSE . ' AND module_cahierdetextes_travail.date_creation >= :dateDebut' . ' AND module_cahierdetextes_travail.date_creation <= :dateFin' . ' GROUP BY module_cahierdetextes_travail.id';
         $results = _doQuery($sql, array('dateDebut' => $dateDebutSemaine, 'dateFin' => $dateFinSemaine, 'agendaId' => $agendaId, 'eleveId' => $eleveId));
         foreach ($results as $result) {
             $arTravauxParJour[$result->date_creation][] = $result;
         }
     } elseif ($agendaLevel == PROFILE_CCV_ADMIN) {
         $sql = 'SELECT count(module_cahierdetextes_travail.id) as count, module_agenda_work.module_agenda_agenda_id_agenda as id_agenda, "' . $nodeType . '" as node_type, ' . $nodeId . ' as node_id, module_cahierdetextes_travail.date_creation as date_creation, module_cahierdetextes_domaine.nom' . ' FROM module_cahierdetextes_travail' . ' LEFT JOIN module_agenda_work ON (module_agenda_work.module_agenda_agenda_id_agenda = :agendaId)' . ' LEFT JOIN module_cahierdetextes_domaine ON (module_cahierdetextes_domaine.id = module_cahierdetextes_travail.module_cahierdetextes_domaine_id)' . ' WHERE module_cahierdetextes_domaine.kernel_bu_ecole_classe_id=:nodeId' . ' AND module_agenda_work.module_cahierdetextes_travail_id = module_cahierdetextes_travail.id' . ' AND module_cahierdetextes_travail.supprime = 0' . ' AND module_cahierdetextes_travail.a_faire = ' . self::TYPE_EN_CLASSE . ' AND module_cahierdetextes_travail.date_creation >= :dateDebut' . ' AND module_cahierdetextes_travail.date_creation <= :dateFin' . ' GROUP BY module_cahierdetextes_travail.id';
         $results = _doQuery($sql, array('dateDebut' => $dateDebutSemaine, 'dateFin' => $dateFinSemaine, 'nodeId' => $nodeId, 'agendaId' => $agendaId));
         foreach ($results as $result) {
             $arTravauxParJour[$result->date_creation][] = $result;
         }
     }
     return $arTravauxParJour;
 }
 /**
  * Purge les évènements d'un agenda sur une période donnée
  *
  * @author Jérémy FOURNAISE <*****@*****.**>
  *
  * @param integer  $pIdAgenda    Identifiant de l'agenda à purger
  * @param string   $pDateDebut   Date de début de la période à purger (format Ymd)
  * @param string   $pDateFin     Date de fin de la période à purger (format Ymd)
  * @param string   $pHeureDebut  Heure pour la date de début de la période (format H:i)
  * @param string   $pHeureFin    Heure pour la date de fin de la période (format H:i)
  */
 public function purgeAgendaByDateInterval($pIdAgenda, $pDateDebut, $pDateFin, $pHeureDebut = '00:00', $pHeureFin = '00:00')
 {
     $dateServices = new DateService();
     $eventDAO = _ioDAO('agenda|event');
     $events = $eventDAO->findByAgendaAndDateInterval($pIdAgenda, $pDateDebut, $pDateFin);
     foreach ($events as $event) {
         // Cas d'un événement qui ne se répète pas
         if (is_null($event->endrepeatdate_event) || $event->endrepeatdate_event < $pDateFin || $event->endrepeatdate_event == $pDateFin && $event->heuredeb_event >= $pHeureFin) {
             if ($event->datefin_event > $pDateDebut && $event->datedeb_event < $pDateFin || $event->datedeb_event == $pDateDebut && $event->heuredeb_event >= $pHeureDebut || $event->datefin_event == $pDateFin && $event->heuredeb_event <= $pHeureFin || ($event->datefin_event == $pDateFin || $event->datedeb_event == $pDateDebut) && $event->alldaylong_event == 1) {
                 $eventDAO->delete($event->id_event);
             }
         } else {
             $duplicateEvent = clone $event;
             $mkDateDebEvent = mktime(0, 0, 0, substr($duplicateEvent->datedeb_event, 4, 2), substr($duplicateEvent->datedeb_event, 6, 2), substr($duplicateEvent->datedeb_event, 0, 4));
             $mkDateFin = mktime(0, 0, 0, substr($pDateFin, 4, 2), substr($pDateFin, 6, 2), substr($pDateFin, 0, 4));
             // Création d'un autre événement qui commence après la période concernée s'il se poursuivait après l'intervalle donné
             if ($duplicateEvent->endrepeatdate_event > $pDateFin || $duplicateEvent->endrepeatdate_event == $pDateFin && $duplicateEvent->heuredeb_event >= $pHeureFin) {
                 $record = _record('event');
                 // Evénement qui se répète tous les jours
                 if ($duplicateEvent->everyday_event == 1) {
                     if ($duplicateEvent->heuredeb_event < $pHeureFin || $duplicateEvent->alldaylong_event == 1) {
                         // La date de début devient la date de la fin de période + 1 jour
                         $record->datedeb_event = date('Ymd', mktime(0, 0, 0, substr($pDateFin, 4, 2), substr($pDateFin, 6, 2) + 1, substr($pDateFin, 0, 4)));
                     } else {
                         $record->datedeb_event = $pDateFin;
                     }
                 } elseif ($duplicateEvent->everyweek_event == 1) {
                     if (date('w', $mkDateDebEvent) == date('w', $mkDateFin)) {
                         if ($duplicateEvent->heuredeb_event < $pHeureFin || $duplicateEvent->alldaylong_event == 1) {
                             $record->datedeb_event = date('Ymd', mktime(0, 0, 0, substr($pDateFin, 4, 2), substr($pDateFin, 6, 2) + 7, substr($pDateFin, 0, 4)));
                         } else {
                             $record->datedeb_event = $pDateFin;
                         }
                     } else {
                         $record->datedeb_event = $dateServices->getDayOfWeekAfterDate($pDateFin, date('w', $dateServices->dateAndHoureBdToTimestamp($pDateFin, null)));
                     }
                 } elseif ($duplicateEvent->everymonth_event == 1) {
                     if (date('md', $mkDateDebEvent) == date('md', $mkDateFin)) {
                         if ($duplicateEvent->heuredeb_event < $pHeureFin || $duplicateEvent->alldaylong_event == 1) {
                             $record->datedeb_event = date('Ymd', mktime(0, 0, 0, substr($pDateFin, 4, 2) + 1, substr($pDateFin, 6, 2), substr($pDateFin, 0, 4)));
                         } else {
                             $record->datedeb_event = $pDateFin;
                         }
                     } else {
                         $record->datedeb_event = $dateServices->getDayOfMonthAfterDate($pDateFin, substr($duplicateEvent->datedeb_event, 6, 2));
                     }
                 } elseif ($duplicateEvent->everyyear_event == 1) {
                     if (date('Ymd', $mkDateDebEvent) == date('Ymd', $mkDateFin)) {
                         if ($duplicateEvent->heuredeb_event < $pHeureFin || $duplicateEvent->alldaylong_event == 1) {
                             $record->datedeb_event = date('Ymd', mktime(0, 0, 0, substr($pDateFin, 4, 2), substr($pDateFin, 6, 2), substr($pDateFin, 0, 4) + 1));
                         } else {
                             $record->datedeb_event = $pDateFin;
                         }
                     } else {
                         $record->datedeb_event = $dateServices->getDayOfYearAfterDate($pDateFin, substr($duplicateEvent->datedeb_event, 4, 4));
                     }
                 }
                 $nbJour = $dateServices->getNombreJoursEcoulesEntreDeuxDates($duplicateEvent->datefin_event, $duplicateEvent->datedeb_event);
                 $record->datefin_event = $dateServices->dateFrToDateBdd($dateServices->addToDate($dateServices->dateBddToDateFr($record->datedeb_event), $nbJour, 0, 0));
                 $record->id_agenda = $duplicateEvent->id_agenda;
                 $record->title_event = $duplicateEvent->title_event;
                 $record->desc_event = $duplicateEvent->desc_event;
                 $record->place_event = $duplicateEvent->place_event;
                 $record->heuredeb_event = $duplicateEvent->heuredeb_event;
                 $record->heurefin_event = $duplicateEvent->heurefin_event;
                 $record->alldaylong_event = $duplicateEvent->alldaylong_event;
                 $record->everyday_event = $duplicateEvent->everyday_event;
                 $record->everyweek_event = $duplicateEvent->everyweek_event;
                 $record->everymonth_event = $duplicateEvent->everymonth_event;
                 $record->everyyear_event = $duplicateEvent->everyyear_event;
                 $record->endrepeatdate_event = $duplicateEvent->endrepeatdate_event;
                 $eventDAO->insert($record);
                 // Modification de la date de fin de répétition de l'événement
                 if ($event->endrepeatdate_event >= $pDateFin) {
                     $event->endrepeatdate_event = $pDateDebut;
                 }
                 $eventDAO->update($event);
             }
         }
     }
 }