WIP timesheet timers: create a single working time timesheet per configured periode of day, week or month

This commit is contained in:
ralf 2022-10-14 10:11:56 +02:00
parent 2dc50f52cc
commit 664bb86b2a
7 changed files with 90 additions and 23 deletions

View File

@ -509,30 +509,32 @@ egw.extend('timer', egw.MODULE_GLOBAL, function()
// check if overall working time is not disabled // check if overall working time is not disabled
if (state.disable.indexOf('overall') === -1) if (state.disable.indexOf('overall') === -1)
{ {
// check if we should ask on login to start working time // we need to wait that all JS is loaded
this.preference('workingtime_session', 'timesheet', true).then(pref => window.egw_ready.then(() => { window.setTimeout(() =>
{ {
if (pref === 'no') return; // check if we should ask on login to start working time
this.preference('workingtime_session', 'timesheet', true).then(pref =>
{
if (pref === 'no') return;
// overall timer not running, ask to start // overall timer not running, ask to start
if (overall && !overall.start) if (overall && !overall.start)
{ {
Et2Dialog.show_dialog((button) => { Et2Dialog.show_dialog((button) => {
if (button === Et2Dialog.YES_BUTTON) if (button === Et2Dialog.YES_BUTTON)
{ {
timerAction('overall-start'); timerAction('overall-start');
} }
}, 'Do you want to start your working time?', 'Working time', {}, Et2Dialog.BUTTONS_YES_NO); }, 'Do you want to start your working time?', 'Working time', {}, Et2Dialog.BUTTONS_YES_NO);
} }
// overall timer running for more than 16 hours, ask to stop // overall timer running for more than 16 hours, ask to stop
else if (overall?.start && (((new Date()).valueOf() - overall.start.valueOf()) / 3600000) >= 16) else if (overall?.start && (((new Date()).valueOf() - overall.start.valueOf()) / 3600000) >= 16)
{ {
// gives a JS error, if called direct
window.setTimeout(() => {
timerDialog(state.disable, 'Forgot to switch off working time?'); timerDialog(state.disable, 'Forgot to switch off working time?');
}, 1000); }
} });
});
}, 2000)});
} }
}, },

View File

@ -1596,6 +1596,11 @@ class Db
{ {
$value = implode($glue,$value); $value = implode($glue,$value);
} }
// timestamp given das DateTime object stored in string column, e.g. in history-log
if (is_object($value) && ($value instanceof \DateTime))
{
$value = DateTime::user2server($value,'string');
}
// truncate to long strings for varchar(X) columns as PostgreSQL and newer MySQL/MariaDB given an error otherwise // truncate to long strings for varchar(X) columns as PostgreSQL and newer MySQL/MariaDB given an error otherwise
if (!is_null($length) && mb_strlen($value) > $length) if (!is_null($length) && mb_strlen($value) > $length)
{ {

View File

@ -181,6 +181,7 @@ class timesheet_bo extends Api\Storage
{ {
$GLOBALS['timesheet_bo'] =& $this; $GLOBALS['timesheet_bo'] =& $this;
} }
$this->user = (int)$GLOBALS['egw_info']['user']['account_id'];
$this->grants = $GLOBALS['egw']->acl->get_grants(TIMESHEET_APP); $this->grants = $GLOBALS['egw']->acl->get_grants(TIMESHEET_APP);
} }
@ -1044,4 +1045,47 @@ class timesheet_bo extends Api\Storage
} }
return parent::data2db($intern ? null : $data); // important to use null, if $intern! return parent::data2db($intern ? null : $data); // important to use null, if $intern!
} }
/**
* Find working time timesheet for given time and confibured period
*
* @param DateTime $time time to define the periode
* @param string &$periode on return "day", "week" or "month"
* @param Api\DateTime|null &$start on return start-time of periode
* @param Api\DateTime|null &$end on return end-time of periode
* @return array|null ts or null, if there is none yet
* @throws Api\Exception
*/
function periodeWorkingTimesheet(DateTime $time, string &$periode=null, Api\DateTime &$start=null, Api\DateTime &$end=null)
{
$start = new Api\DateTime($time, Api\DateTime::$user_timezone);
$start->setTime(0, 0, 0);
$end = new Api\DateTime($start);
switch($periode = $this->config_data['working_time_period'] ?? 'day')
{
case 'day':
$end->setDate($start->format('Y'), $start->format('m'), 1+$start->format('d'));
break;
case 'week':
$start->setWeekstart();
$end = new Api\DateTime($start);
$end->setDate($start->format('Y'), $start->format('m'), 7+$start->format('d'));
break;
case 'month':
$start->setDate($start->format('Y'), $start->format('m'), 1);
$end->setDate($start->format('Y'), 1+$start->format('m'), 1);
break;
}
foreach($this->search('', false, 'ts_id DESC', '', '', false, 'AND', [0, 1], [
'cat_id' => Events::workingTimeCat(),
'ts_owner' => $this->user,
'ts_start BETWEEN '.$this->db->quote($start, 'int').' AND '.$this->db->quote($end, 'int'),
]) ?? [] as $row)
{
return $row;
}
return null;
}
} }

View File

@ -19,6 +19,7 @@ changed status timesheet de Status geändert
check all timesheet de Alle selektieren check all timesheet de Alle selektieren
choose 'creator' of imported data timesheet de Wählen Sie den 'Ersteller' der Importierten Daten. choose 'creator' of imported data timesheet de Wählen Sie den 'Ersteller' der Importierten Daten.
comment by %1 at %2: timesheet de Übertragen von %1 am %2 comment by %1 at %2: timesheet de Übertragen von %1 am %2
create a single 'working time' timesheet per timesheet de Erstelle einen einzigen 'Arbeitszeit' Stundenzettel pro
create new links timesheet de Neue Verknüpfung erstellen create new links timesheet de Neue Verknüpfung erstellen
creates a new field timesheet de neues Feld anlegen creates a new field timesheet de neues Feld anlegen
creating new entry timesheet de neuen Eintrag anlegen creating new entry timesheet de neuen Eintrag anlegen

View File

@ -19,6 +19,7 @@ changed status timesheet en Changed status.
check all timesheet en Check all check all timesheet en Check all
choose 'creator' of imported data timesheet en Choose 'creator' of imported data choose 'creator' of imported data timesheet en Choose 'creator' of imported data
comment by %1 at %2: timesheet en Comment by %1 at %2: comment by %1 at %2: timesheet en Comment by %1 at %2:
create a single 'working time' timesheet per timesheet en Create a single 'Working time' timesheet per
create new links timesheet en Create new links create new links timesheet en Create new links
creates a new field timesheet en Creates a new field creates a new field timesheet en Creates a new field
creating new entry timesheet en Creating new entry creating new entry timesheet en Creating new entry

View File

@ -163,6 +163,13 @@ class Events extends Api\Storage\Base
throw new Api\Exception\AssertionFailed("No pending overall events!"); throw new Api\Exception\AssertionFailed("No pending overall events!");
} }
$ids = array_keys($events); $ids = array_keys($events);
$bo = new \timesheet_bo();
// check if we already have a timesheet for the current periode
if (($period_ts = $bo->periodeWorkingTimesheet(reset($events)['tse_time'])))
{
$events = array_merge(self::get(['ts_id' => $period_ts['ts_id']], $period_total), $events);
$time += $period_total;
}
$start = array_shift($events)['tse_time']; $start = array_shift($events)['tse_time'];
$timespan = Api\DateTime::to($start, true); $timespan = Api\DateTime::to($start, true);
$last = array_pop($events); $last = array_pop($events);
@ -171,8 +178,7 @@ class Events extends Api\Storage\Base
$timespan .= ' - '.$end; $timespan .= ' - '.$end;
} }
$title = lang('Working time from %1', $timespan); $title = lang('Working time from %1', $timespan);
$bo = new \timesheet_bo(); $bo->init($period_ts);
$bo->init();
$bo->save([ $bo->save([
'ts_title' => $title, 'ts_title' => $title,
'cat_id' => self::workingTimeCat(), 'cat_id' => self::workingTimeCat(),

View File

@ -53,6 +53,14 @@
<option value="overwrite">Overwriting start or stop time</option> <option value="overwrite">Overwriting start or stop time</option>
</select> </select>
</row> </row>
<row>
<description value="Create a single 'Working time' timesheet per"/>
<select id="newsettings[working_time_period]">
<option value="day">Day</option>
<option value="week">Week</option>
<option value="month">Month</option>
</select>
</row>
<row> <row>
<description value="Category for 'Working time'"/> <description value="Category for 'Working time'"/>
<select-cat empty_label="Will be created when saving ..." id="newsettings[working_time_cat]"/> <select-cat empty_label="Will be created when saving ..." id="newsettings[working_time_cat]"/>