static function mailUserDelayedResa($task)
 {
     global $DB, $CFG_GLPI;
     $res = 0;
     $config = new PluginReservationConfig();
     $week = $config->getConfigurationWeek();
     setlocale(LC_TIME, 'fr_FR.utf8', 'fra');
     $jour = strftime("%A");
     if (isset($week[$jour])) {
         $query = "SELECT * FROM `glpi_plugin_reservation_manageresa` WHERE `date_return` is NULL";
         if ($result = $DB->query($query)) {
             while ($row = $DB->fetch_assoc($result)) {
                 $task->log("envoie d'un mail pour la reservation du materiel depassée numero " . $row['resaid']);
                 $reservation = new Reservation();
                 $reservation->getFromDB($row['resaid']);
                 NotificationEvent::raiseEvent('plugin_reservation_expiration', $reservation);
                 $res++;
             }
         }
         return $res;
     } else {
         $task->log("jour sauté");
     }
 }
 /**
  * Fonction permettant d'afficher les reservations actuelles
  * 
  **/
 function showCurrentResa()
 {
     global $DB, $CFG_GLPI, $datesresa;
     $showentity = Session::isMultiEntitiesMode();
     $config = new PluginReservationConfig();
     $methode = $config->getConfigurationMethode();
     $begin = $datesresa["begin"];
     $end = $datesresa["end"];
     $left = "";
     $where = "";
     //tableau contenant un tableau des reservations par utilisateur
     // exemple : (salleman => ( 0=> (resaid => 1, debut => '12/12/2054', fin => '12/12/5464', comment => 'tralala', name => 'hobbit16'
     $ResaByUser = array();
     foreach ($CFG_GLPI["reservation_types"] as $itemtype) {
         if (!($item = getItemForItemtype($itemtype))) {
             continue;
         }
         $itemtable = getTableForItemType($itemtype);
         $otherserial = "'' AS otherserial";
         if ($item->isField('otherserial')) {
             $otherserial = "`{$itemtable}`.`otherserial`";
         }
         if (isset($begin) && isset($end)) {
             $left = "LEFT JOIN `glpi_reservations`\n\t  ON (`glpi_reservationitems`.`id` = `glpi_reservations`.`reservationitems_id`\n\t      AND '" . $begin . "' < `glpi_reservations`.`end`\n\t      AND '" . $end . "' > `glpi_reservations`.`begin`)";
             $where = " AND `glpi_reservations`.`id` IS NOT NULL ";
         }
         $query = "SELECT `glpi_reservationitems`.`id`,\n\t`glpi_reservationitems`.`comment`,\n\t`{$itemtable}`.`name` AS name,\n\t`{$itemtable}`.`entities_id` AS entities_id,\n\t{$otherserial},\n\t`glpi_reservations`.`id` AS resaid,\n\t`glpi_reservations`.`comment`,\n\t`glpi_reservations`.`begin`,\n\t`glpi_reservations`.`end`,\n\t`glpi_users`.`name` AS username,\n\t`glpi_reservationitems`.`items_id` AS items_id\n\t  FROM `glpi_reservationitems`\n\t  {$left}\n\t  INNER JOIN `{$itemtable}`\n\t  ON (`glpi_reservationitems`.`itemtype` = '{$itemtype}'\n\t      AND `glpi_reservationitems`.`items_id` = `{$itemtable}`.`id`)\n\t  LEFT JOIN `glpi_users` \n\t  ON (`glpi_reservations`.`users_id` = `glpi_users`.`id`)\n\t  WHERE `glpi_reservationitems`.`is_active` = '1'\n\t  AND `glpi_reservationitems`.`is_deleted` = '0'\n\t  AND `{$itemtable}`.`is_deleted` = '0'\n\t  {$where} " . getEntitiesRestrictRequest(" AND", $itemtable, '', $_SESSION['glpiactiveentities'], $item->maybeRecursive()) . "\n\t  ORDER BY username,\n\t`{$itemtable}`.`entities_id`,\n\t`{$itemtable}`.`name`";
         if ($result = $DB->query($query)) {
             // on regroupe toutes les reservations d'un meme user dans un tableau.
             while ($row = $DB->fetch_assoc($result)) {
                 if (!array_key_exists($row["username"], $ResaByUser)) {
                     $ResaByUser[$row["username"]] = array();
                 }
                 $tmp = array("resaid" => $row["resaid"], "name" => $row['name'], "debut" => $row["begin"], "fin" => $row["end"], "comment" => nl2br($row["comment"]));
                 $ResaByUser[$row["username"]][] = $tmp;
                 //on trie par date
                 usort($ResaByUser[$row["username"]], 'compare_date_by_user');
             }
         }
     }
     echo "<div class='center'>";
     echo "<table class='tab_cadre'>";
     echo "<thead>";
     echo "<tr><th colspan='" . ($showentity ? "11" : "10") . "'>" . "Matériels empruntés" . "</th></tr>\n";
     echo "<tr class='tab_bg_2'>";
     /*echo "<th><a href=\"#\" onclick=\"sortTable(this,0); return false;\">Utilisateur</a></th>";
       echo "<th><a href=\"#\" onclick=\"sortTable(this,1); return false;\">Materiel</a></th>";
       echo "<th><a href=\"#\" onclick=\"sortTable(this,2); return false;\">Debut</a></th>";
       echo "<th><a href=\"#\" onclick=\"sortTable(this,3); return false;\">Fin</a></th>";
       echo "<th><a href=\"#\" onclick=\"sortTable(this,4); return false;\">Commentaires</a></th>";
       echo "<th><a href=\"#\" onclick=\"sortTable(this,5); return false;\">Mouvement</a></th>";*/
     echo "<th>Utilisateur</a></th>";
     echo "<th>Materiel</a></th>";
     echo "<th>Debut</a></th>";
     echo "<th>Fin</a></th>";
     echo "<th>Commentaires</a></th>";
     echo "<th>Mouvement</a></th>";
     echo "<th>Acquitter</th>";
     echo "<th colspan='" . ($methode == "manual" ? 3 : 2) . "'>Actions</th>";
     echo "</tr></thead>";
     echo "<tbody>";
     //on parcourt le tableau pour construire la table à afficher
     foreach ($ResaByUser as $User => $arrayResa) {
         $nbLigne = 1;
         $limiteLigneNumber = count($arrayResa);
         $flag = 0;
         echo "<tr class='tab_bg_2'>";
         echo "<td rowspan=" . count($arrayResa) . ">" . $User . "</td>";
         foreach ($arrayResa as $Num => $resa) {
             $colorRed = "";
             $flagSurveille = 0;
             // on regarde si la reservation actuelle a été prolongée par le plugin
             $query = "SELECT `date_return`, `date_theorique`, `dernierMail` FROM `glpi_plugin_reservation_manageresa` WHERE `resaid` = " . $resa["resaid"];
             if ($result = $DB->query($query)) {
                 $dates = $DB->fetch_row($result);
             }
             if ($DB->numrows($result)) {
                 if ($dates[1] < date("Y-m-d H:i:s", time()) && $dates[0] == NULL) {
                     // on colore  en rouge seulement si la date de retour theorique est depassée et si le materiel n'est pas marqué comme rendu (avec une date de retour effectif)
                     $colorRed = "bgcolor=\"red\"";
                     $flagSurveille = 1;
                 }
             }
             // le nom du materiel
             echo "<td {$colorRed}>" . $resa['name'] . "</td>";
             if (!$flag) {
                 $i = $Num;
                 while ($i < count($arrayResa) - 1) {
                     if ($arrayResa[$i + 1]['debut'] == $resa['debut'] && $arrayResa[$Num + 1]['fin'] == $resa['fin']) {
                         $nbLigne++;
                     } else {
                         break;
                     }
                     $i++;
                 }
                 $limiteLigneNumber = $Num + $nbLigne - 1;
             }
             //date de debut de la resa
             if (!$flag) {
                 echo "<td rowspan=" . $nbLigne . " {$colorRed}>" . date("d-m-Y \\à H:i:s", strtotime($resa["debut"])) . "</td>";
                 // si c'est une reservation prolongée, on affiche la date theorique plutot que la date reelle (qui est prolongée jusqu'au retour du materiel)
                 if ($DB->numrows($result) && $dates[0] == NULL) {
                     echo "<td rowspan=" . $nbLigne . " {$colorRed}>" . date("d-m-Y \\à H:i:s", strtotime($dates[1])) . "</td>";
                 } else {
                     echo "<td rowspan=" . $nbLigne . " {$colorRed}>" . date("d-m-Y \\à H:i:s", strtotime($resa["fin"])) . "</td>";
                 }
                 //le commentaire
                 echo "<td rowspan=" . $nbLigne . " {$colorRed}>" . $resa["comment"] . "</td>";
                 // les fleches de mouvements
                 echo "<td rowspan=" . $nbLigne . " ><center>";
                 if (date("Y-m-d", strtotime($resa["debut"])) == date("Y-m-d", strtotime($begin))) {
                     echo "<img title=\"\" alt=\"\" src=\"../pics/up-icon.png\"></img>";
                 }
                 if (date("Y-m-d", strtotime($resa["fin"])) == date("Y-m-d", strtotime($end))) {
                     echo "<img title=\"\" alt=\"\" src=\"../pics/down-icon.png\"></img>";
                 }
                 echo "</center></td>";
             }
             if ($nbLigne > 1) {
                 $flag = 1;
             }
             if ($Num == $limiteLigneNumber) {
                 $flag = 0;
                 $nbLigne = 1;
             }
             // si la reservation est rendue, on affiche la date du retour, sinon le bouton pour acquitter le retour
             if ($dates[0] != NULL) {
                 echo "<td>" . date("d-m-Y \\à H:i:s", strtotime($dates[0])) . "</td>";
             } else {
                 echo "<td><center><a title=\"Marquer comme rendu\" href=\"reservation.php?resareturn=" . $resa['resaid'] . "\"><img title=\"\" alt=\"\" src=\"../pics/greenbutton.png\"></img></a></center></td>";
             }
             // boutons action
             $matDispo = getMatDispo();
             echo "<td>";
             echo "<ul>";
             echo "<li><span class=\"bouton\" id=\"bouton_add" . $resa['resaid'] . "\" onclick=\"javascript:afficher_cacher('add" . $resa['resaid'] . "');\">Ajouter un materiel</span>\n          <div id=\"add" . $resa['resaid'] . "\" style=\"display:none;\">\n          <form method='POST' name='form' action='" . Toolbox::getItemTypeSearchURL(__CLASS__) . "'>";
             echo '<select name="matDispoAdd">';
             foreach ($matDispo as $mat) {
                 echo "\t", '<option value="', key($mat), '">', current($mat), '</option>';
             }
             echo "<input type='hidden' name='AjouterMatToResa' value='" . $resa['resaid'] . "'>";
             echo "<input type='submit' class='submit' name='submit' value=Ajouter>";
             Html::closeForm();
             echo "</div></li>";
             echo "<li><span class=\"bouton\" id=\"bouton_replace" . $resa['resaid'] . "\" onclick=\"javascript:afficher_cacher('replace" . $resa['resaid'] . "');\">Remplacer le materiel</span>\n          <div id=\"replace" . $resa['resaid'] . "\" style=\"display:none;\">\n          <form method='post' name='form' action='" . Toolbox::getItemTypeSearchURL(__CLASS__) . "'>";
             echo '<select name="matDispoReplace">';
             foreach ($matDispo as $mat) {
                 echo "\t", '<option value="', key($mat), '">', current($mat), '</option>';
             }
             echo "<input type='hidden' name='ReplaceMatToResa' value='" . $resa['resaid'] . "'>";
             echo "<input type='submit' class='submit' name='submit' value=Remplacer>";
             Html::closeForm();
             echo "</div></li>";
             echo "</ul>";
             echo "</td>";
             echo "<td>";
             echo "<ul>";
             echo "<li><a class=\"bouton\" title=\"Editer la reservation\" href='../../../front/reservation.form.php?id=" . $resa['resaid'] . "'>Editer la reservation</a></li>";
             echo "</ul>";
             echo "</td>";
             if ($methode == "manual") {
                 echo "<td>";
                 echo "<ul>";
                 if ($flagSurveille) {
                     echo "<li><a class=\"bouton\" title=\"Envoyer un mail de rappel\" href=\"reservation.php?mailuser="******"\">Envoyer un mail de rappel</a></li>";
                     if (isset($dates[2])) {
                         echo "<li>Dernier mail envoyé le : </li>";
                         echo "<li>" . date("d-m-Y \\à H:i:s", strtotime($dates[2])) . "</li>";
                     }
                 }
                 echo "</ul>";
                 echo "</td>";
             }
             echo "</tr>";
             echo "<tr class='tab_bg_2'>";
         }
         echo "</tr>\n";
     }
     echo "</tbody>";
     echo "</table>\n";
     echo "</div>\n";
 }
<?php

// Définition de la variable GLPI_ROOT obligatoire pour l'instanciation des class
define('GLPI_ROOT', getAbsolutePath());
// Récupération du fichier includes de GLPI, permet l'accès au cœur
include GLPI_ROOT . "inc/includes.php";
$plugin = new Plugin();
if ($plugin->isActivated("reservation")) {
    $PluginReservationConfig = new PluginReservationConfig();
    Session::checkRight("config", array(CREATE, UPDATE, DELETE));
    if (isset($_POST["week"])) {
        $PluginReservationConfig->setConfigurationWeek($_POST["week"]);
        //Html::back();
    }
    if (isset($_POST["methode"])) {
        $PluginReservationConfig->setConfigurationMethode($_POST["methode"]);
        //Html::back();
    }
    Html::header(PluginReservationReservation::getTypeName(2), '', "plugins", "Reservation");
    $PluginReservationConfig->showForm();
    Html::footer();
} else {
    Html::header(__('Setup'), '', "config", "plugins");
    echo "<div class='center'><br><br>" . "<img src=\"" . $CFG_GLPI["root_doc"] . "/pics/warning.png\" alt='warning'><br><br>";
    echo "<b>" . __('Please activate the plugin', 'Reservation') . "</b></div>";
    Html::footer();
}
function getAbsolutePath()
{
    return str_replace("plugins/reservation/front/config.form.php", "", $_SERVER['SCRIPT_FILENAME']);
}