422 lines
13 KiB
PHP
422 lines
13 KiB
PHP
<?php
|
|
|
|
/**
|
|
* FusionInventory
|
|
*
|
|
* Copyright (C) 2010-2016 by the FusionInventory Development Team.
|
|
*
|
|
* http://www.fusioninventory.org/
|
|
* https://github.com/fusioninventory/fusioninventory-for-glpi
|
|
* http://forge.fusioninventory.org/
|
|
*
|
|
* ------------------------------------------------------------------------
|
|
*
|
|
* LICENSE
|
|
*
|
|
* This file is part of FusionInventory project.
|
|
*
|
|
* FusionInventory is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* FusionInventory is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with FusionInventory. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* ------------------------------------------------------------------------
|
|
*
|
|
* This file is used to manage the hours in the timeslot.
|
|
*
|
|
* ------------------------------------------------------------------------
|
|
*
|
|
* @package FusionInventory
|
|
* @author David Durieux
|
|
* @copyright Copyright (c) 2010-2016 FusionInventory team
|
|
* @license AGPL License 3.0 or (at your option) any later version
|
|
* http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
|
* @link http://www.fusioninventory.org/
|
|
* @link https://github.com/fusioninventory/fusioninventory-for-glpi
|
|
*
|
|
*/
|
|
|
|
if (!defined('GLPI_ROOT')) {
|
|
die("Sorry. You can't access directly to this file");
|
|
}
|
|
|
|
/**
|
|
* Manage the hours in the timeslot.
|
|
*/
|
|
class PluginFusioninventoryTimeslotEntry extends CommonDBTM {
|
|
|
|
/**
|
|
* We activate the history.
|
|
*
|
|
* @var boolean
|
|
*/
|
|
public $dohistory = true;
|
|
|
|
/**
|
|
* The right name for this class
|
|
*
|
|
* @var string
|
|
*/
|
|
static $rightname = 'plugin_fusioninventory_task';
|
|
|
|
|
|
/**
|
|
* Get name of this type by language of the user connected
|
|
*
|
|
* @param integer $nb number of elements
|
|
* @return string name of this type
|
|
*/
|
|
static function getTypeName($nb = 0) {
|
|
return __('Time slot entry', 'fusioninventory');
|
|
}
|
|
|
|
|
|
/**
|
|
* Get search function for the class
|
|
*
|
|
* @return array
|
|
*/
|
|
function rawSearchOptions() {
|
|
|
|
$tab = [];
|
|
|
|
$tab[] = [
|
|
'id' => 'common',
|
|
'name' => __('Time slot', 'fusioninventory')
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '1',
|
|
'table' => $this->getTable(),
|
|
'field' => 'name',
|
|
'name' => __('Name'),
|
|
'datatype' => 'itemlink',
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '2',
|
|
'table' => 'glpi_entities',
|
|
'field' => 'completename',
|
|
'name' => Entity::getTypeName(1),
|
|
'datatype' => 'dropdown',
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '3',
|
|
'table' => $this->getTable(),
|
|
'field' => 'is_recursive',
|
|
'name' => __('Child entities'),
|
|
'datatype' => 'bool',
|
|
];
|
|
|
|
$tab[] = [
|
|
'id' => '4',
|
|
'table' => $this->getTable(),
|
|
'field' => 'name',
|
|
'name' => __('Name'),
|
|
'datatype' => 'string',
|
|
];
|
|
|
|
return $tab;
|
|
}
|
|
|
|
|
|
/**
|
|
* Display form to add a new time entry in timeslot
|
|
*
|
|
* @param integer $timeslots_id
|
|
*/
|
|
function formEntry($timeslots_id) {
|
|
$ID = 0;
|
|
$options = [];
|
|
$this->initForm($ID, $options);
|
|
$this->showFormHeader($options);
|
|
|
|
echo "<tr class='tab_bg_1'>";
|
|
echo "<td>";
|
|
echo __('Start time', 'fusioninventory');
|
|
echo "</td>";
|
|
echo "<td>";
|
|
$days = [
|
|
'1' => __('Monday'),
|
|
'2' => __('Tuesday'),
|
|
'3' => __('Wednesday'),
|
|
'4' => __('Thursday'),
|
|
'5' => __('Friday'),
|
|
'6' => __('Saturday'),
|
|
'7' => __('Sunday')
|
|
];
|
|
echo '<div id="beginday">';
|
|
Dropdown::showFromArray('beginday', $days);
|
|
echo '</div>';
|
|
$hours = [];
|
|
$dec = 15 * 60;
|
|
for ($timestamp = 0; $timestamp < (24 * 3600); $timestamp += $dec) {
|
|
$hours[$timestamp] = date('H:i', $timestamp);
|
|
}
|
|
PluginFusioninventoryToolbox::showHours('beginhours', ['step' => 15]);
|
|
echo "</td>";
|
|
echo "</tr>";
|
|
|
|
echo "<tr class='tab_bg_1'>";
|
|
echo "<td>";
|
|
echo __('End time', 'fusioninventory');
|
|
echo "</td>";
|
|
echo "<td>";
|
|
echo '<div id="beginday">';
|
|
Dropdown::showFromArray('lastday', $days);
|
|
echo '</div>';
|
|
PluginFusioninventoryToolbox::showHours('lasthours', ['step' => 15]);
|
|
echo Html::hidden('timeslots_id', ['value' => $timeslots_id]);
|
|
echo "</td>";
|
|
echo "</tr>";
|
|
$this->showFormButtons($options);
|
|
|
|
$this->formDeleteEntry($timeslots_id);
|
|
|
|
$this->showTimeSlot($timeslots_id);
|
|
}
|
|
|
|
|
|
/**
|
|
* Display delete form
|
|
*
|
|
* @todo rename this method in showTimeslots() since it's not only used to delete but also to
|
|
* show the list of Timeslot Entries. -- Kevin 'kiniou' Roy
|
|
*
|
|
* @param integer $timeslots_id
|
|
*/
|
|
function formDeleteEntry($timeslots_id) {
|
|
|
|
$dbentries = getAllDataFromTable(
|
|
'glpi_plugin_fusioninventory_timeslotentries', [
|
|
'WHERE' => ['plugin_fusioninventory_timeslots_id' => $timeslots_id],
|
|
'ORDER' => ['day', 'begin ASC']
|
|
]
|
|
);
|
|
|
|
$options = [];
|
|
$ID = key($dbentries);
|
|
$canedit = $this->getFromDB($ID)
|
|
&& $this->can($ID, READ);
|
|
$this->showFormHeader($options);
|
|
|
|
foreach ($dbentries as $dbentry) {
|
|
|
|
echo "<tr class='tab_bg_3'>";
|
|
echo "<td>";
|
|
$daysofweek = Toolbox::getDaysOfWeekArray();
|
|
$daysofweek[7] = $daysofweek[0];
|
|
unset($daysofweek[0]);
|
|
echo $daysofweek[$dbentry['day']];
|
|
echo "</td>";
|
|
echo "<td>";
|
|
echo PluginFusioninventoryToolbox::getHourMinute($dbentry['begin']);
|
|
echo " - ";
|
|
echo PluginFusioninventoryToolbox::getHourMinute($dbentry['end']);
|
|
echo "</td>";
|
|
echo "<td colspan='2'>";
|
|
if ($canedit) {
|
|
echo "<input type='submit' class='submit' name='purge-".$dbentry['id']."' value='delete' />";
|
|
}
|
|
echo "</td>";
|
|
echo "</tr>";
|
|
}
|
|
$this->showFormButtons(['canedit' => false]);
|
|
}
|
|
|
|
|
|
/**
|
|
* Display timeslot graph
|
|
*
|
|
* @todo This must be moved in Timeslot class since a Task class is linked to a Timeslot and not
|
|
* directly to a TimeslotEntry. The Timeslot class must be the entry point of any other class.
|
|
* -- Kevin 'kiniou' Roy
|
|
*
|
|
* @param integer $timeslots_id
|
|
*/
|
|
function showTimeSlot($timeslots_id) {
|
|
echo "<div id='chart'></div>";
|
|
echo "<div id='startperiod'></div>";
|
|
echo "<div id='stopperiod'></div>";
|
|
|
|
$daysofweek = Toolbox::getDaysOfWeekArray();
|
|
$daysofweek[7] = $daysofweek[0];
|
|
unset($daysofweek[0]);
|
|
$dates = [
|
|
$daysofweek[1] => [],
|
|
$daysofweek[2] => [],
|
|
$daysofweek[3] => [],
|
|
$daysofweek[4] => [],
|
|
$daysofweek[5] => [],
|
|
$daysofweek[6] => [],
|
|
$daysofweek[7] => [],
|
|
];
|
|
|
|
for ($day=1; $day <= 7; $day++) {
|
|
$dbentries = getAllDataFromTable(
|
|
'glpi_plugin_fusioninventory_timeslotentries', [
|
|
'WHERE' => [
|
|
'plugin_fusioninventory_timeslots_id' => $timeslots_id,
|
|
'day' => $day,
|
|
],
|
|
'ORDER' => 'begin ASC'
|
|
]
|
|
);
|
|
foreach ($dbentries as $entries) {
|
|
$dates[$daysofweek[$day]][] = [
|
|
'start' => $entries['begin'],
|
|
'end' => $entries['end']
|
|
];
|
|
}
|
|
}
|
|
echo '<script>timeslot(\''.json_encode($dates).'\')</script>';
|
|
}
|
|
|
|
|
|
/**
|
|
* Add a new entry
|
|
*
|
|
* @param array $data
|
|
*/
|
|
function addEntry($data) {
|
|
if ($data['lastday'] < $data['beginday']) {
|
|
return;
|
|
} else if ($data['lastday'] == $data['beginday']
|
|
&& $data['lasthours'] <= $data['beginhours']) {
|
|
return;
|
|
}
|
|
// else ok, we can update DB
|
|
for ($day=$data['beginday']; $day <= $data['lastday']; $day++) {
|
|
$range = [];
|
|
|
|
$range['beginhours'] = $data['beginhours'];
|
|
$range['lasthours'] = $data['lasthours'];
|
|
if ($data['beginday'] < $day) {
|
|
$range['beginhours'] = 0;
|
|
}
|
|
if ($data['lastday'] > $day) {
|
|
$range['lasthours'] = (24 * 3600);
|
|
}
|
|
|
|
// now get from DB
|
|
$dbentries = getAllDataFromTable(
|
|
'glpi_plugin_fusioninventory_timeslotentries', [
|
|
'WHERE' => [
|
|
'plugin_fusioninventory_timeslots_id' => $data['timeslots_id'],
|
|
'day' => $day,
|
|
],
|
|
'ORDER' => 'begin ASC'
|
|
]
|
|
);
|
|
|
|
$inThePeriod = false;
|
|
$afterPeriod = false;
|
|
$updateEntries = [];
|
|
$deleteEntries = [];
|
|
$addEntries = [];
|
|
|
|
foreach ($dbentries as $entries) {
|
|
if ($afterPeriod) {
|
|
continue;
|
|
}
|
|
|
|
if ($inThePeriod) {
|
|
// So we need manage the end
|
|
if ($range['lasthours'] < $entries['begin']) {
|
|
$addEntries[] = [
|
|
'plugin_fusioninventory_timeslots_id' => $data['timeslots_id'],
|
|
'day' => $day,
|
|
'begin' => $range['beginhours'],
|
|
'end' => $range['lasthours']
|
|
];
|
|
$inThePeriod = false;
|
|
$afterPeriod = true;
|
|
continue;
|
|
} else if ($range['lasthours'] > $entries['end']) {
|
|
$deleteEntries[] = $entries;
|
|
continue;
|
|
} else {
|
|
$entries['begin'] = $range['beginhours'];
|
|
$updateEntries[] = $entries;
|
|
$inThePeriod = false;
|
|
$afterPeriod = true;
|
|
continue;
|
|
}
|
|
} else if (($range['lasthours'] < $entries['begin'])) {
|
|
// We add
|
|
$this->add([
|
|
'plugin_fusioninventory_timeslots_id' => $data['timeslots_id'],
|
|
'day' => $day,
|
|
'begin' => $range['beginhours'],
|
|
'end' => $range['lasthours']
|
|
]);
|
|
continue 2;
|
|
} else if ($range['beginhours'] > $entries['end']) {
|
|
// Not manage, hop to next entry
|
|
continue;
|
|
}
|
|
|
|
if ($range['beginhours'] < $entries['begin']) {
|
|
$inThePeriod = true;
|
|
|
|
if ($range['lasthours'] <= $entries['end']) {
|
|
$entries['begin'] = $range['beginhours'];
|
|
$updateEntries[] = $entries;
|
|
$inThePeriod = false;
|
|
$afterPeriod = true;
|
|
} else {
|
|
$deleteEntries[] = $entries;
|
|
}
|
|
} else if ($range['beginhours'] < $entries['end']) {
|
|
$inThePeriod = true;
|
|
$range['beginhours'] = $entries['begin'];
|
|
|
|
if ($range['lasthours'] <= $entries['end']) {
|
|
$entries['begin'] = $range['beginhours'];
|
|
$updateEntries[] = $entries;
|
|
$inThePeriod = false;
|
|
$afterPeriod = true;
|
|
} else {
|
|
$deleteEntries[] = $entries;
|
|
}
|
|
}
|
|
}
|
|
if (count($dbentries) == 0) {
|
|
$addEntries[] = [
|
|
'plugin_fusioninventory_timeslots_id' => $data['timeslots_id'],
|
|
'day' => $day,
|
|
'begin' => $range['beginhours'],
|
|
'end' => $range['lasthours']
|
|
];
|
|
} else if ($inThePeriod || (count($updateEntries) == 0 && count($deleteEntries) == 0 & count($addEntries) == 0)) {
|
|
$addEntries[] = [
|
|
'plugin_fusioninventory_timeslots_id' => $data['timeslots_id'],
|
|
'day' => $day,
|
|
'begin' => $range['beginhours'],
|
|
'end' => $range['lasthours']
|
|
];
|
|
}
|
|
|
|
foreach ($updateEntries as $entry) {
|
|
$this->update($entry);
|
|
}
|
|
foreach ($deleteEntries as $entry) {
|
|
$this->delete(['id' => $entry['id']]);
|
|
}
|
|
foreach ($addEntries as $entry) {
|
|
$this->add($entry);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|