setting an individual status to multiple timesheet via a action method like the Addressbook and the Inlolog status. Sponsored by Martin Frimmel

This commit is contained in:
Stefan Becker 2009-03-23 09:53:03 +00:00
parent 3ef43df5c8
commit 3818c671cc
12 changed files with 606 additions and 125 deletions

View File

@ -5,7 +5,7 @@
* @link http://www.egroupware.org
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @package timesheet
* @copyright (c) 2005-8 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @copyright (c) 2005-9 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$
*/
@ -99,8 +99,18 @@ class timesheet_bo extends so_sql
* @var array
*/
var $show_sums;
/**
* Array with custom fileds
*
* @var array
*/
var $customfields=array();
/**
* Array with status label
*
* @var array
*/
var $status_labels = array();
/**
* Name of the timesheet table storing custom fields
@ -114,6 +124,7 @@ class timesheet_bo extends so_sql
$this->config_data = config::read(TIMESHEET_APP);
$this->quantity_sum = $this->config_data['quantity_sum'] == 'true';
$this->customfields = config::get_customfields(TIMESHEET_APP);
if($this->config_data['status_labels']) $this->status_labels =& $this->config_data['status_labels'];
$this->tz_offset_s = $GLOBALS['egw']->datetime->tz_offset;
$this->now = time() + $this->tz_offset_s; // time() is server-time and we need a user-time
@ -488,6 +499,35 @@ class timesheet_bo extends so_sql
return $ret;
}
/**
* set a status for timesheet entry identified by $keys
*
* @param array $keys if given array with col => value pairs to characterise the rows to delete
* @param boolean $status
* @return int affected rows, should be 1 if ok, 0 if an error
*/
function set_status($keys=null,$status)
{
$ret = true;
if (!is_array($keys) && (int) $keys)
{
$keys = array('ts_id' => (int) $keys);
}
$ts_id = is_null($keys) ? $this->data['ts_id'] : $keys['ts_id'];
if (!$this->check_acl(EGW_ACL_EDIT,$ts_id))
{
return false;
}
$this->read($keys,true,false);
$this->data['ts_status'] = $status;
if ($this->save($ts_id)!=0) $ret = false;
return $ret;
}
/**
* changes the data from the db-format to your work-format
*

View File

@ -97,9 +97,9 @@ class timesheet_hooks
if ($GLOBALS['egw_info']['user']['apps']['preferences'] && $location != 'admin')
{
$file = array(
// 'Preferences' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uisettings.index&appname='.$appname),
'Grant Access' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uiaclprefs.index&acl_app='.$appname),
'Edit Categories' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uicategories.index&cats_app=' . $appname . '&cats_level=True&global_cats=True')
// 'Preferences' => egw::link('/index.php','menuaction=preferences.uisettings.index&appname='.$appname),
'Grant Access' => egw::link('/index.php','menuaction=preferences.uiaclprefs.index&acl_app='.$appname),
'Edit Categories' => egw::link('/index.php','menuaction=preferences.uicategories.index&cats_app=' . $appname . '&cats_level=True&global_cats=True')
);
if ($location == 'preferences')
{
@ -114,12 +114,13 @@ class timesheet_hooks
if ($GLOBALS['egw_info']['user']['apps']['admin'] && $location != 'preferences')
{
$file = Array(
'Site Configuration' => $GLOBALS['egw']->link('/index.php','menuaction=admin.uiconfig.index&appname=' . $appname),
'Custom fields' => $GLOBALS['egw']->link('/index.php','menuaction=admin.customfields.edit&appname='.$appname),
'Global Categories' => $GLOBALS['egw']->link('/index.php',array(
'Site Configuration' => egw::link('/index.php','menuaction=admin.uiconfig.index&appname=' . $appname),
'Custom fields' => egw::link('/index.php','menuaction=admin.customfields.edit&appname='.$appname),
'Global Categories' => egw::link('/index.php',array(
'menuaction' => 'admin.uicategories.index',
'appname' => $appname,
'global_cats'=> True)),
'Edit Status' => egw::link('/index.php','menuaction=timesheet.timesheet_ui.editstatus'),
);
if ($location == 'admin')
{

View File

@ -16,9 +16,10 @@
class timesheet_ui extends timesheet_bo
{
var $public_functions = array(
'view' => true,
'edit' => true,
'index' => true,
'view' => true,
'edit' => true,
'index' => true,
'editstatus' => true,
);
/**
* ProjectManager integration: 'none', 'full' or default null
@ -78,14 +79,14 @@ class timesheet_ui extends timesheet_bo
else // new entry
{
$this->data = array(
'ts_start' => $this->today,
'end_time' => $this->now - $this->today,
'ts_owner' => $GLOBALS['egw_info']['user']['account_id'],
'cat_id' => (int) $_REQUEST['cat_id'],
'ts_start' => $this->today,
'end_time' => $this->now - $this->today,
'ts_owner' => $GLOBALS['egw_info']['user']['account_id'],
'cat_id' => (int) $_REQUEST['cat_id'],
);
}
$referer = preg_match('/menuaction=([^&]+)/',$_SERVER['HTTP_REFERER'],$matches) ? $matches[1] :
(strpos($_SERVER['HTTP_REFERER'],'/infolog/index.php') !== false ? 'infolog.infolog_ui.index' : TIMESHEET_APP.'.timesheet_ui.index');
(strpos($_SERVER['HTTP_REFERER'],'/infolog/index.php') !== false ? 'infolog.infolog_ui.index' : TIMESHEET_APP.'.timesheet_ui.index');
}
else
{
@ -144,7 +145,7 @@ class timesheet_ui extends timesheet_bo
if (!$this->data['ts_title'])
{
$this->data['ts_title'] = $this->data['ts_title_blur'] ?
$this->data['ts_title_blur'] : $this->data['ts_project_blur'];
$this->data['ts_title_blur'] : $this->data['ts_project_blur'];
if (!$this->data['ts_title'])
{
@ -180,8 +181,8 @@ class timesheet_ui extends timesheet_bo
}
}
$js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',array(
'menuaction' => $referer,
'msg' => $msg,
'menuaction' => $referer,
'msg' => $msg,
))."';";
if ($button == 'apply') break;
if ($button == 'save_new')
@ -230,22 +231,22 @@ class timesheet_ui extends timesheet_bo
}
}
$preserv = $this->data + array(
'view' => $view,
'referer' => $referer,
'ts_title_blur' => $content['ts_title_blur'],
'view' => $view,
'referer' => $referer,
'ts_title_blur' => $content['ts_title_blur'],
);
$content = array_merge($this->data,array(
'msg' => $msg,
'view' => $view,
$tabs => $content[$tabs],
'link_to' => array(
'to_id' => $this->data['ts_id'] ? $this->data['ts_id'] : $content['link_to']['to_id'],
'to_app' => TIMESHEET_APP,
),
'js' => "<script>\n$js\n</script>\n",
'ts_quantity_blur' => $this->data['ts_duration'] ? round($this->data['ts_duration'] / 60.0,3) : '',
'start_time' => $this->datetime2time($this->data['ts_start']),
'pm_integration' => $this->pm_integration,
'msg' => $msg,
'view' => $view,
$tabs => $content[$tabs],
'link_to' => array(
'to_id' => $this->data['ts_id'] ? $this->data['ts_id'] : $content['link_to']['to_id'],
'to_app' => TIMESHEET_APP,
),
'js' => "<script>\n$js\n</script>\n",
'ts_quantity_blur' => $this->data['ts_duration'] ? round($this->data['ts_duration'] / 60.0,3) : '',
'start_time' => $this->datetime2time($this->data['ts_start']),
'pm_integration' => $this->pm_integration,
));
$links = array();
// create links specified in the REQUEST (URL)
@ -300,11 +301,11 @@ class timesheet_ui extends timesheet_bo
$content['ts_title_blur'] = $preserv['ts_title_blur'] ? $preserv['ts_title_blur'] : $preserv['ts_project_blur'];
$readonlys = array(
'button[delete]' => !$this->data['ts_id'] || !$this->check_acl(EGW_ACL_DELETE),
'button[edit]' => !$view || !$this->check_acl(EGW_ACL_EDIT),
'button[save]' => $view,
'button[save_new]' => $view,
'button[apply]' => $view,
'button[delete]' => !$this->data['ts_id'] || !$this->check_acl(EGW_ACL_DELETE),
'button[edit]' => !$view || !$this->check_acl(EGW_ACL_EDIT),
'button[save]' => $view,
'button[save_new]' => $view,
'button[apply]' => $view,
);
if ($view)
{
@ -320,7 +321,7 @@ class timesheet_ui extends timesheet_bo
$readonlys['ts_owner'] = true;
}
$GLOBALS['egw_info']['flags']['app_header'] = lang('timesheet').' - '.
($view ? lang('View') : ($this->data['ts_id'] ? lang('Edit') : lang('Add')));
($view ? lang('View') : ($this->data['ts_id'] ? lang('Edit') : lang('Add')));
// supress unknow widget 'projectmanager-*', if projectmanager is not installed or old
if (!@file_exists(EGW_INCLUDE_ROOT.'/projectmanager/inc/class.projectmanager_widget.inc.php'))
@ -336,7 +337,8 @@ class timesheet_ui extends timesheet_bo
if (!$this->customfields) $readonlys[$tabs]['customfields'] = true; // suppress tab if there are not customfields
return $etpl->exec(TIMESHEET_APP.'.timesheet_ui.edit',$content,array(
'ts_owner' => $edit_grants,
'ts_owner' => $edit_grants,
'ts_status' => $this->status_labels,
),$readonlys,$preserv,2);
}
@ -410,6 +412,7 @@ class timesheet_ui extends timesheet_bo
$GLOBALS['egw']->session->appsession('index',TIMESHEET_APP,$query_in);
$query = $query_in; // keep the original query
if($this->ts_viewtype == 'short') $query_in['options-selectcols'] = array('ts_quantity'=>false,'ts_unitprice'=>false,'ts_total'=>false);
if ($query['no_status']) $query_in['options-selectcols']['ts_status'] = false;
#_debug_array($query['col_filter']);
// PM project filter for the PM integration
if ((string)$query['col_filter']['pm_id'] != '')
@ -536,7 +539,7 @@ class timesheet_ui extends timesheet_bo
// query cf's for the displayed rows
if ($ids && $this->customfields &&
in_array('customfields',$cols_to_show=explode(',',$GLOBALS['egw_info']['user']['preferences'][TIMESHEET_APP]['nextmatch-timesheet.index.rows'])))
in_array('customfields',$cols_to_show=explode(',',$GLOBALS['egw_info']['user']['preferences'][TIMESHEET_APP]['nextmatch-timesheet.index.rows'])))
{
$cfs = $this->read_cfs($ids,$cols_to_show);
}
@ -554,18 +557,18 @@ class timesheet_ui extends timesheet_bo
switch($row['ts_id'])
{
case 0: // day-sum
$row['ts_title'] = lang('Sum %1:',lang(date('l',$row['ts_start'])).' '.$GLOBALS['egw']->common->show_date($row['ts_start'],
$GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],false));
break;
$row['ts_title'] = lang('Sum %1:',lang(date('l',$row['ts_start'])).' '.$GLOBALS['egw']->common->show_date($row['ts_start'],
$GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],false));
break;
case -1: // week-sum
$row['ts_title'] = lang('Sum %1:',lang('week').' '.substr($row['ts_week'],4).'/'.substr($row['ts_week'],0,4));
break;
$row['ts_title'] = lang('Sum %1:',lang('week').' '.substr($row['ts_week'],4).'/'.substr($row['ts_week'],0,4));
break;
case -2: // month-sum
$row['ts_title'] = lang('Sum %1:',lang(date('F',$row['ts_start'])).' '.substr($row['ts_month'],0,4));
break;
$row['ts_title'] = lang('Sum %1:',lang(date('F',$row['ts_start'])).' '.substr($row['ts_month'],0,4));
break;
case -3: // year-sum
$row['ts_title'] = lang('Sum %1:',$row['ts_year']);
break;
$row['ts_title'] = lang('Sum %1:',$row['ts_year']);
break;
}
$row['ts_start'] = $row['ts_unitprice'] = '';
if (!$this->quantity_sum) $row['ts_quantity'] = '';
@ -627,6 +630,7 @@ class timesheet_ui extends timesheet_bo
if (strpos($query['selectcols'],'ts_unitprice')===false) $rows['no_ts_unitprice'] = 1;
if (strpos($query['selectcols'],'ts_total')===false) $rows['no_ts_total'] = 1;
}
$rows['no_ts_status'] = $query['no_status'];
return $total;
}
@ -654,9 +658,31 @@ class timesheet_ui extends timesheet_bo
$msg = lang('Error deleting the entry!!!');
}
}
if ($content['action'] != '')
{
if (!count($content['nm']['rows']['checked']) && !$content['use_all'])
{
$msg = lang('You need to select some timesheets first');
}
else
{
if ($this->action($content['action'],$content['nm']['rows']['checked'],$content['use_all'],
$success,$failed,$action_msg,$content['action'],$msg))
{
$msg .= lang('%1 timesheets(s) %2',$success,$action_msg);
}
elseif(is_null($msg))
{
$msg .= lang('%1 timesheets(s) %2, %3 failed because of insufficent rights !!!',$success,$action_msg,$failed);
}
}
}
$content = array(
'nm' => $GLOBALS['egw']->session->appsession('index',TIMESHEET_APP),
'msg' => $msg,
'nm' => $GLOBALS['egw']->session->appsession('index',TIMESHEET_APP),
'msg' => $msg,
);
if (!is_array($content['nm']))
{
@ -668,25 +694,37 @@ class timesheet_ui extends timesheet_bo
$date_filters['custom'] = 'custom';
$content['nm'] = array(
'get_rows' => TIMESHEET_APP.'.timesheet_ui.get_rows',
'options-filter' => $date_filters,
'options-filter2' => array('No details','Details'),
'order' => 'ts_start',// IO name of the column to sort after (optional for the sortheaders)
'sort' => 'DESC',// IO direction of the sort: 'ASC' or 'DESC'
'header_left' => 'timesheet.index.dates',
'header_right' => 'timesheet.index.add',
'filter_onchange' => "set_style_by_class('table','custom_hide','visibility',this.value == 'custom' ? 'visible' : 'hidden'); if (this.value != 'custom') this.form.submit();",
'filter2' => (int)$GLOBALS['egw_info']['user']['preferences'][TIMESHEET_APP]['show_details'],
'get_rows' => TIMESHEET_APP.'.timesheet_ui.get_rows',
'options-filter' => $date_filters,
'options-filter2' => array('No details','Details'),
'order' => 'ts_start',// IO name of the column to sort after (optional for the sortheaders)
'sort' => 'DESC',// IO direction of the sort: 'ASC' or 'DESC'
'header_left' => 'timesheet.index.dates',
'header_right' => 'timesheet.index.add',
'filter_onchange' => "set_style_by_class('table','custom_hide','visibility',this.value == 'custom' ? 'visible' : 'hidden'); if (this.value != 'custom') this.form.submit();",
'filter2' => (int)$GLOBALS['egw_info']['user']['preferences'][TIMESHEET_APP]['show_details'],
);
}
$read_grants = $this->grant_list(EGW_ACL_READ);
$content['nm']['no_owner_col'] = count($read_grants) == 1;
$sel_options = array(
'ts_owner' => $read_grants,
'pm_id' => array(lang('No project')),
'cat_id' => array(lang('None')),
'ts_owner' => $read_grants,
'pm_id' => array(lang('No project')),
'cat_id' => array(lang('None')),
'ts_status' => $this->status_labels,
);
$content['nm']['no_status'] = !$sel_options['ts_status'];
$status =array();
$sel_options['action'] ['delete']= lang('Delete Timesheet');
foreach ($this->status_labels as $status_id => $label_status)
{
$status['to_status_'.$status_id] = $label_status;
}
$sel_options['action'][lang('Modify the Status of the Timesheet')] = $status;
unset($status);
if ($this->pm_integration != 'full')
{
$projects =& $this->query_list('ts_project');
@ -695,10 +733,154 @@ class timesheet_ui extends timesheet_bo
}
// dont show [Export] button if app is not availible to the user or we are on php4
$readonlys['export'] = !$GLOBALS['egw_info']['user']['apps']['importexport'] || (int) phpversion() < 5;
return $etpl->exec(TIMESHEET_APP.'.timesheet_ui.index',$content,$sel_options,$readonlys,$preserv);
}
/**
* apply an action to multiple timesheets
*
* @param string/int $action 'status_to',set status to timeshhets
* @param array $checked timesheet id's to use if !$use_all
* @param boolean $use_all if true use all timesheets of the current selection (in the session)
* @param int &$success number of succeded actions
* @param int &$failed number of failed actions (not enought permissions)
* @param string &$action_msg translated verb for the actions, to be used in a message like %1 timesheets 'deleted'
* @param string/array $session_name 'index' or 'email', or array with session-data depending if we are in the main list or the popup
* @return boolean true if all actions succeded, false otherwise
*/
function action($action,$checked,$use_all,&$success,&$failed,&$action_msg,$session_name,&$msg)
{
//echo "<p>uicontacts::action('$action',".print_r($checked,true).','.(int)$use_all.",...)</p>\n";
$success = $failed = 0;
if ($use_all)
{
// get the whole selection
$query = is_array($session_name) ? $session_name : $GLOBALS['egw']->session->appsession($session_name,'timesheet');
if ($use_all)
{
@set_time_limit(0); // switch off the execution time limit, as it's for big selections to small
$query['num_rows'] = -1; // all
$this->get_rows($query,$checked,$readonlys,true); // true = only return the id's
}
}
if (substr($action,0,9) == 'to_status')
{
$to_status = (int)substr($action,10);
$action = 'to_status';
}
switch($action)
{
case 'delete':
$action_msg = lang('deleted');
foreach((array)$checked as $n => $id)
{
if ($this->delete($id))
{
$success++;
}
else
{
$failed++;
}
}
break;
case 'to_status':
$action_msg =lang('changed status');
foreach((array)$checked as $n => $id)
{
if ($this->set_status($id,$to_status))
{
$success++;
}
else
{
$failed++;
}
}
break;
}
return !$failed;
}
/**
* function for setting individual Status
*
* @param conetnt
* @param view
*/
function editstatus($content = null,$msg='')
{
// this function requires admin rights
$GLOBALS['egw_info']['flags']['admin_only'] = true;
$GLOBALS['egw']->check_app_rights();
if (is_array($content))
{
list($button) = @each($content['button']);
switch($button)
{
case 'delete':
break;
case 'cancel':
$GLOBALS['egw']->redirect_link('/index.php',array(
'menuaction' => 'timesheet.timesheet_ui.index',
'msg' => $msg,
));
break;
case 'apply':
case 'save':
foreach($content['statis'] as $cat)
{
$id = $cat['id'];
if (($cat ['name'] !== $this->status_labels[$id]) && ($cat ['name'] !== ''))
{
$this->status_labels[$id] = $cat['name'];
$need_update = true;
}
}
if ($need_update)
{
config::save_value('status_labels',$this->status_labels,TIMESHEET_APP);
$msg .= lang('Status updated.');
}
}
}
if (isset($content['button'])) unset ($content['button']);
if (isset($content['statis']['delete']))
{
list($id) = each($content['statis']['delete']);
if (isset($this->status_labels[$id]))
{
unset($this->status_labels[$id]);
config::save_value('status_labels',$this->status_labels,TIMESHEET_APP);
unset($this->status_labels[$id]);
$msg .= lang('Status deleted.');
}
}
$i = 1;
unset($content['statis']);
foreach($this->status_labels as $id => $label)
{
$content['statis'][$i]['name']= $label;
$content['statis'][$i]['id']= $id;
$i++;
}
$content['statis'][$i]['name'] = '';
$content['statis'][$i]['id'] = ++$id;
$content['msg'] = $msg;
$preserv = $content;
$etpl = new etemplate('timesheet.editstatus');
$etpl->exec('timesheet.timesheet_ui.editstatus',$content,$sel_options,$readonlys,$preserv);
}
function js()
{
return '<script LANGUAGE="JavaScript">
@ -710,6 +892,15 @@ class timesheet_ui extends timesheet_bo
"Export",400,400);
return false;
}
function do_action(selbox)
{
if (selbox.value != "") {
selbox.form.submit();
selbox.value = "";
}
}
</script>';
}
}

View File

@ -1,13 +1,30 @@
%1 timesheets(s) %2 timesheet de %1 Stundenzettel %2
%1 timesheets(s) %2, %3 failed because of insufficent rights !!! timesheet de %1 Stundenzettel %2, %3 wurde nicht durchgeführt wegen ungenügenden Rechten !!!
--> enter new name timesheet de -> neuer Name eingeben
2 month ago timesheet de Vor 2 Monaten
2 years ago timesheet de Vor 2 Jahren
3 years ago timesheet de Vor 3 Jahren
actions timesheet de Aktionen
all projects timesheet de Alle Projekte
all status timesheet de Alle Status
and its members timesheet de und die Mitglieder
applies the changes timesheet de Änderungen durchführen
apply the action on the whole query, not only the shown timesheets!!! timesheet de Wendet den Befehl auf die gesamte Abfrage an, NICHT nur die angezeigten Stundenzettel!!
both: allow to use projectmanager and free project-names admin de Beides: verwende Projektmanager und freie Projektnamen
by timesheet de von
changed status timesheet de Status geändert
check all timesheet de Alle selektieren
create new links timesheet de Neue Verknüpfung erstellen
creates a new field timesheet de neues Feld anlegen
creating new entry timesheet de neuen Eintrag anlegen
delete this entry timesheet de Diesen Eintrag löschen
delete this status timesheet de Diesen Status löschen
delete timesheet timesheet de Stundenzettel löschen
deleted timesheet de gelöscht
deletes this field timesheet de Dies Feld löschen
determines the order the fields are displayed timesheet de verändert die Reihenfolge der angezeigten Felder
each value is a line like <id>[=<label>] timesheet de jeder Wert ist eine Zeile in dem Format <id>[=|label>]
edit status timesheet de Status bearbeiten
edit this entry timesheet de diesen Eintrag bearbeiten
empty if identical to duration timesheet de leer lassen wenn gleich Dauer
end timesheet de Ende
@ -16,6 +33,10 @@ entry saved timesheet de Eintrag gespeichert
error deleting the entry!!! timesheet de Fehler beim Löschen des Eintrags!!!
error saving the entry!!! timesheet de Fehler beim Speichern des Eintrags!!!
existing links timesheet de Bestehende Verknüpfungen
export timesheet de Exportieren
export to openoffice spreadsheet timesheet de zu Open Office exortieren
exports entries from your timesheet into a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. timesheet de Exportiert die Einträge des Stundenzettels in eine CSV Datei. CSV bedeutet, Komma getrennte Werte. In dem options Tab können Sie andere Trennzeichen festlegen.
field must not be empty !!! timesheet de Dieses Feld darf nicht leer sein!!!
full: use only projectmanager admin de Komplett: verwende nur Projektmanager
general timesheet de Allgemein
last modified timesheet de Zuletzt geändert
@ -23,31 +44,54 @@ last month timesheet de Letzten Monat
last week timesheet de Letzte Woche
last year timesheet de Letztes Jahr
leave it empty for a full week timesheet de Leer lassen für eine volle Woche
leaves without saveing timesheet de beenden ohne speichern
length<br>rows timesheet de Länge<br>Reihe
links timesheet de Verknüpfungen
max length of the input [, length of the inputfield (optional)] timesheet de maximale Länge der Eingabe[,Länge des Eingabefeldes (optional)]
modify the status of the timesheet timesheet de Status des Stundenzettels verändern
no details timesheet de Keine Details
no project timesheet de Kein Projekt
none: use only free project-names admin de Keine: verwende nur freie Projektnamen
number of row for a multiline inputfield or line of a multi-select-box timesheet de Anzahl von Reihen für ein Mehrzeiliges Textfeld oder einer Mehrfachauswahlbox
or endtime timesheet de oder Endzeit
order timesheet de Reihenfolge
permission denied!!! timesheet de Zugriff verweigert!!!
price timesheet de Preis
projectmanager integration admin de Integration des Projektmanagers
quantity timesheet de Menge
save & new timesheet de Speichern & Neu
saves the changes made timesheet de Speichert die Änderungen
saves the changes made and leaves timesheet de Änderungen speidern und beenden
saves this entry and add a new one timesheet de Speichert diesen Eintrag und fügt einen neuen hinzu
select a price timesheet de Preis auswählen
select a project timesheet de Projekt auswählen
select a status of the timesheet timesheet de einen status auswählen
select an action or timesheet to modify timesheet de Eine Aktion auswählen
select an action or timesheet you want to modify... timesheet de Wählen Sie eine Aktion oder einen Stundenzettel aus, der geändert werden soll.
select multiple timeshhets for a further action timesheet de Wählen Sie mehrere Stundenzettel für einen weitere Aktion aus
show a quantity sum (eg. to sum up negative overtime) admin de Zeige eine Mengensumme (z.B. um negative Überstunden zu summieren)
start timesheet de Start
starttime timesheet de Startzeit
starttime has to be before endtime !!! timesheet de Startzeit muss vor der Endzeit liegen !!!
status deleted. timesheet de Status gelöscht
status updated. timesheet de Status geändert
sum %1: timesheet de Summe %1:
the name used internaly (<= 20 chars), changeing it makes existing data unavailible timesheet de Dieser Name wird nur intern benutzt (<= 20 Zeichen), Änderungen führen dazu, das bestehende Daten nicht mehr angezeigt werden können.
the text displayed to the user timesheet de der Text wird dem Benutzer angezeigt
this month timesheet de Diesen Monat
this week timesheet de Diese Woche
this year timesheet de Dieses Jahr
timesheet common de Stundenzettel
timesheet csv export timesheet de Export des Stundenzettels als CSV
timesheet openoffice export timesheet de Export des Stundenzettels als Open Office
timesheet status-%1 '%2' added. timesheet de Stundenzettel Status %1 '%2' hinzugefügt.
timesheet-%1 '%2' updated. timesheet de Stundenzettel Status %1 '%2' geändert
timesheet-%1 deleted. timesheet de Stundenzettel %1 gelöscht
unitprice timesheet de Preis pro Einheit
values for selectbox timesheet de Werte der Auswahlbox
view this entry timesheet de Diesen Eintrag anzeigen
week timesheet de Woche
whole query timesheet de gesamte Abfrage
yesterday timesheet de Gestern
you need to select some timesheets first timesheet de Sie müssen zuerst Datensätze auswählen
your database is not up to date (%1 vs. %2), please run %3setup%4 to update your database. timesheet de Ihre Datenbank ist NICHT aktuell (%1 statt %2), bitte rufen sie %3setup%4 auf um die Datenbank zu aktualisieren.

View File

@ -1,13 +1,30 @@
%1 timesheets(s) %2 timesheet en %1 timesheets(s) %2
%1 timesheets(s) %2, %3 failed because of insufficent rights !!! timesheet en %1 timesheets(s) %2, %3 failed because of insufficent rights !!!
--> enter new name timesheet en --> enter new name
2 month ago timesheet en 2 month ago
2 years ago timesheet en 2 years ago
3 years ago timesheet en 3 years ago
actions timesheet en Actions
all projects timesheet en All projects
all status timesheet en All status
and its members timesheet en and its members
applies the changes timesheet en applies the changes
apply the action on the whole query, not only the shown timesheets!!! timesheet en Apply the action on the whole query, NOT only the shown timesheets!!!
both: allow to use projectmanager and free project-names admin en Both: allow to use ProjectManager and free project-names
by timesheet en by
changed status timesheet en changed status
check all timesheet en Check all
create new links timesheet en Create new links
creates a new field timesheet en creates a new field
creating new entry timesheet en creating new entry
delete this entry timesheet en Delete this entry
delete this status timesheet en Delete this status
delete timesheet timesheet en Delete Timesheet
deleted timesheet en deleted
deletes this field timesheet en deletes this field
determines the order the fields are displayed timesheet en determines the order the fields are displayed
each value is a line like <id>[=<label>] timesheet en each value is a line like <id>[=<label>]
edit status timesheet en Edit status
edit this entry timesheet en Edit this entry
empty if identical to duration timesheet en empty if identical to duration
end timesheet en End
@ -16,6 +33,7 @@ entry saved timesheet en Entry saved
error deleting the entry!!! timesheet en Error deleting the entry!!!
error saving the entry!!! timesheet en Error saving the entry!!!
existing links timesheet en Existing links
export timesheet en Export
export to openoffice spreadsheet timesheet en Export to OpenOffice Spreadsheet
exports entries from your timesheet into a csv file. csv means 'comma seperated values'. however in the options tab you can also choose other seperators. timesheet en Exports entries from your Timesheet into a CSV File. CSV means 'Comma Seperated Values'. However in the options Tab you can also choose other seperators.
field must not be empty !!! timesheet en Field must not be empty !!!
@ -26,33 +44,54 @@ last month timesheet en Last month
last week timesheet en Last week
last year timesheet en Last year
leave it empty for a full week timesheet en Leave it empty for a full week
leaves without saveing timesheet en leaves without saveing
length<br>rows timesheet en Length<br>Rows
links timesheet en Links
max length of the input [, length of the inputfield (optional)] timesheet en max length of the input [, length of the inputfield (optional)]
modify the status of the timesheet timesheet en Modify the Status of the Timesheet
no details timesheet en no details
no project timesheet en No project
none: use only free project-names admin en None: use only free project-names
number of row for a multiline inputfield or line of a multi-select-box timesheet en number of row for a multiline inputfield or line of a multi-select-box
or endtime timesheet en or Endtime
order timesheet en Order
permission denied!!! timesheet en Permission denied!!!
price timesheet en Price
projectmanager integration admin en ProjectManager integration
quantity timesheet en Quantity
save & new timesheet en Save & New
saves the changes made timesheet en Saves the changes made
saves the changes made and leaves timesheet en saves the changes made and leaves
saves this entry and add a new one timesheet en Saves this entry and add a new one
select a price timesheet en Select a price
select a project timesheet en Select a project
select a status of the timesheet timesheet en select a status of the timesheet
select an action or timesheet to modify timesheet en Select an action or timesheet to modify
select an action or timesheet you want to modify... timesheet en Select an action or timesheet you want to modify...
select multiple timeshhets for a further action timesheet en Select multiple timeshhets for a further action
show a quantity sum (eg. to sum up negative overtime) admin en Show a quantity sum (eg. to sum up negative overtime)
start timesheet en Start
starttime timesheet en Starttime
starttime has to be before endtime !!! timesheet en Starttime has to be before endtime !!!
status deleted. timesheet en Status deleted.
status updated. timesheet en Status updated.
sum %1: timesheet en Sum %1:
the name used internaly (<= 20 chars), changeing it makes existing data unavailible timesheet en the name used internaly (<= 20 chars), changeing it makes existing data unavailible
the text displayed to the user timesheet en the text displayed to the user
this month timesheet en This month
this week timesheet en This week
this year timesheet en This year
timesheet common en TimeSheet
timesheet csv export timesheet en Timesheet CSV export
timesheet openoffice export timesheet en Timesheet OpenOffice export
timesheet status-%1 '%2' added. timesheet en Timesheet Status-%1 '%2' added.
timesheet-%1 '%2' updated. timesheet en Timesheet-%1 '%2' updated.
timesheet-%1 deleted. timesheet en Timesheet-%1 deleted.
unitprice timesheet en Unitprice
values for selectbox timesheet en Values for selectbox
view this entry timesheet en View this entry
week timesheet en Week
whole query timesheet en whole query
yesterday timesheet en Yesterday
you need to select some timesheets first timesheet en You need to select some timesheets first
your database is not up to date (%1 vs. %2), please run %3setup%4 to update your database. timesheet en Your database is NOT up to date (%1 vs. %2), please run %3setup%4 to update your database.

File diff suppressed because one or more lines are too long

View File

@ -17,9 +17,9 @@ if (!defined('TIMESHEET_APP'))
}
$setup_info[TIMESHEET_APP]['name'] = TIMESHEET_APP;
$setup_info[TIMESHEET_APP]['version'] = '1.6';
$setup_info[TIMESHEET_APP]['version'] = '1.007';
$setup_info[TIMESHEET_APP]['app_order'] = 5;
$setup_info[TIMESHEET_APP]['tables'] = array('egw_timesheet', 'egw_timesheet_extra');
$setup_info[TIMESHEET_APP]['tables'] = array('egw_timesheet','egw_timesheet_extra');
$setup_info[TIMESHEET_APP]['enable'] = 1;
$setup_info[TIMESHEET_APP]['author'] =

View File

@ -6,42 +6,43 @@
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @package timesheet
* @subpackage setup
* @copyright (c) 2005 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @copyright (c) 2005-9 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$
* @version $Id$
*/
$phpgw_baseline = array(
'egw_timesheet' => array(
'fd' => array(
'ts_id' => array('type' => 'auto','nullable' => False),
'ts_project' => array('type' => 'varchar','precision' => '80'),
'ts_title' => array('type' => 'varchar','precision' => '80','nullable' => False),
'ts_description' => array('type' => 'text'),
'ts_start' => array('type' => 'int','precision' => '8','nullable' => False),
'ts_duration' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
'ts_quantity' => array('type' => 'float','precision' => '8','nullable' => False),
'ts_unitprice' => array('type' => 'float','precision' => '4'),
'cat_id' => array('type' => 'int','precision' => '4','default' => '0'),
'ts_owner' => array('type' => 'int','precision' => '4','nullable' => False),
'ts_modified' => array('type' => 'int','precision' => '8','nullable' => False),
'ts_modifier' => array('type' => 'int','precision' => '4','nullable' => False),
'pl_id' => array('type' => 'int','precision' => '4','default' => '0')
),
'pk' => array('ts_id'),
'fk' => array(),
'ix' => array('ts_project','ts_owner'),
'uc' => array()
$phpgw_baseline = array(
'egw_timesheet' => array(
'fd' => array(
'ts_id' => array('type' => 'auto','nullable' => False),
'ts_project' => array('type' => 'varchar','precision' => '80'),
'ts_title' => array('type' => 'varchar','precision' => '80','nullable' => False),
'ts_description' => array('type' => 'text'),
'ts_start' => array('type' => 'int','precision' => '8','nullable' => False),
'ts_duration' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'),
'ts_quantity' => array('type' => 'float','precision' => '8','nullable' => False),
'ts_unitprice' => array('type' => 'float','precision' => '4'),
'cat_id' => array('type' => 'int','precision' => '4','default' => '0'),
'ts_owner' => array('type' => 'int','precision' => '4','nullable' => False),
'ts_modified' => array('type' => 'int','precision' => '8','nullable' => False),
'ts_modifier' => array('type' => 'int','precision' => '4','nullable' => False),
'pl_id' => array('type' => 'int','precision' => '4','default' => '0'),
'ts_status' => array('type' => 'int','precision' => '4')
),
'egw_timesheet_extra' => array(
'fd' => array(
'ts_id' => array('type' => 'int','precision' => '4','nullable' => False),
'ts_extra_name' => array('type' => 'varchar','precision' => '32','nullable' => False),
'ts_extra_value' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '')
),
'pk' => array('ts_id','ts_extra_name'),
'fk' => array(),
'ix' => array(),
'uc' => array()
)
);
'pk' => array('ts_id'),
'fk' => array(),
'ix' => array('ts_project','ts_owner','ts_status'),
'uc' => array()
),
'egw_timesheet_extra' => array(
'fd' => array(
'ts_id' => array('type' => 'int','precision' => '4','nullable' => False),
'ts_extra_name' => array('type' => 'varchar','precision' => '32','nullable' => False),
'ts_extra_value' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '')
),
'pk' => array('ts_id','ts_extra_name'),
'fk' => array(),
'ix' => array(),
'uc' => array()
)
);

View File

@ -6,7 +6,7 @@
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @package timesheet
* @subpackage setup
* @copyright (c) 2005-8 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @copyright (c) 2005-9 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$
*/
@ -54,3 +54,16 @@ function timesheet_upgrade1_4()
return $GLOBALS['setup_info']['timesheet']['currentver'] = '1.6';
}
function timesheet_upgrade1_6()
{
$GLOBALS['egw_setup']->oProc->AddColumn('egw_timesheet','ts_status',array(
'type' => 'int',
'precision' => '4'
));
$GLOBALS['egw_setup']->oProc->CreateIndex('egw_timesheet','ts_status');
return $GLOBALS['setup_info']['timesheet']['currentver'] = '1.7.001';
}

View File

@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="timesheet.edit.general" template="" lang="" group="0" version="1.5.001">
<template id="timesheet.edit.general" template="" lang="" group="0" version="1.7.001">
<grid width="100%" height="150">
<columns>
<column width="95"/>
@ -44,6 +44,14 @@
<description options=",,,ts_quantity" value="Quantity"/>
<textbox type="float" id="ts_quantity" statustext="empty if identical to duration" blur="@ts_quantity_blur" precision="3" span="all"/>
</row>
<row>
<description value="Status"/>
<menulist>
<menupopup id="ts_status" statustext="select a status of the timesheet" options="please select"/>
</menulist>
<description/>
<description/>
</row>
</rows>
</grid>
</template>
@ -93,7 +101,7 @@
</rows>
</grid>
</template>
<template id="timesheet.edit" template="" lang="" group="0" version="1.5.001">
<template id="timesheet.edit" template="" lang="" group="0" version="1.7.001">
<grid width="100%">
<columns>
<column width="100"/>
@ -142,7 +150,7 @@
</grid>
</row>
<row>
<tabbox span="all">
<tabbox id="general|notes|links|customfields" span="all">
<tabs>
<tab label="General" statustext=""/>
<tab label="Notes" statustext=""/>

View File

@ -0,0 +1,67 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="timesheet.editstatus" template="" lang="" group="0" version="1.7.001">
<grid width="100%" height="450" overflow="auto">
<columns>
<column width="100"/>
<column/>
<column/>
<column width="30%"/>
</columns>
<rows>
<row disabled="!@msg">
<description id="msg" span="all" class="redItalic" align="center"/>
<description/>
<description/>
<description/>
</row>
<row>
<groupbox rows="1" cols="1">
<grid width="100%" height="300" overflow="auto">
<columns>
<column width="100"/>
<column/>
<column/>
<column width="30%"/>
</columns>
<rows>
<row class="row" valign="top">
<description value="Status"/>
<grid width="100%" height="280" overflow="auto" id="statis">
<columns>
<column/>
<column width="5%"/>
</columns>
<rows>
<row class="th">
<description value="Name"/>
<description value="Actions"/>
</row>
<row class="row">
<textbox size="80" maxlength="150" blur="--&gt; enter new name" id="${row}[name]"/>
<button image="delete" label="Delete" align="center" id="delete[$row_cont[id]]" statustext="Delete this status" onclick="return confirm('Delete this status');"/>
</row>
</rows>
</grid>
</row>
</rows>
</grid>
</groupbox>
<description/>
<description/>
<description/>
</row>
<row>
<hbox span="2">
<button label="Save" id="button[save]"/>
<button id="button[apply]" label="Apply"/>
<button label="Cancel" id="button[cancel]"/>
</hbox>
<description/>
<description/>
</row>
</rows>
</grid>
</template>
</overlay>

View File

@ -15,24 +15,25 @@
<template id="timesheet.index.add" template="" lang="" group="0" version="1.3.001">
<button label="Add" id="add" onclick="window.open(egw::link('/index.php','menuaction=timesheet.timesheet_ui.edit'),'_blank','dependent=yes,width=600,height=400,scrollbars=yes,status=yes'); return false;"/>
</template>
<template id="timesheet.index.rows" template="" lang="" group="0" version="1.5.002">
<template id="timesheet.index.rows" template="" lang="" group="0" version="1.7.001">
<grid width="100%">
<columns>
<column width="15%"/>
<column width="50%"/>
<column/>
<column/>
<column disabled="@ts_viewtype"/>
<column disabled="@ts_viewtype"/>
<column disabled="@ts_viewtype"/>
<column disabled="@no_ts_quantity"/>
<column disabled="@no_ts_unitprice"/>
<column disabled="@no_ts_total"/>
<column disabled="@no_owner_col"/>
<column disabled="@no_ts_status"/>
<column/>
<column/>
</columns>
<rows>
<row class="th">
<nextmatch-sortheader label="Date" id="ts_start"/>
<grid spacing="1" padding="1">
<grid spacing="0" padding="0">
<columns>
<column/>
</columns>
@ -63,12 +64,16 @@
<textbox type="float" id="price" readonly="true" precision="2"/>
</vbox>
<nextmatch-filterheader id="ts_owner" options="User" no_lang="1" class="$cont[ownerClass]"/>
<nextmatch-filterheader id="ts_status" onchange="1" options="All status"/>
<nextmatch-customfields id="customfields" readonly="true"/>
<description value="Actions" class="noPrint"/>
<hbox class="noPrint">
<description value="Actions" class="noPrint" align="right"/>
<button label="Check all" image="check" id="check_all" needed="1" statustext="Check all" onclick="toggle_all(this.form,form::name('checked[]')); return false;"/>
</hbox>
</row>
<row class="$row_cont[class]">
<date-time id="${row}[ts_start]" readonly="true" options=",8"/>
<vbox>
<vbox options="0,0">
<link id="${row}[ts_link]" no_lang="1"/>
<description id="${row}[ts_title]" no_lang="1" class="$row_cont[titleClass]"/>
<description id="${row}[ts_description]" no_lang="1"/>
@ -83,39 +88,54 @@
<menulist class="$cont[ownerClass]">
<menupopup type="select-account" id="${row}[ts_owner]" readonly="true"/>
</menulist>
<menulist>
<menupopup id="${row}[ts_status]" readonly="true"/>
</menulist>
<customfields-list id="$row" readonly="true"/>
<hbox class="noPrint">
<hbox class="noPrint" align="right">
<button image="view" label="View" id="view[$row_cont[ts_id]]" onclick="window.open(egw::link('/index.php','menuaction=timesheet.timesheet_ui.view&amp;ts_id=$row_cont[ts_id]'),'_blank','dependent=yes,width=600,height=400,scrollbars=yes,status=yes'); return false;" statustext="View this entry"/>
<button image="edit" label="Edit" id="edit[$row_cont[ts_id]]" statustext="Edit this entry" onclick="window.open(egw::link('/index.php','menuaction=timesheet.timesheet_ui.edit&amp;ts_id=$row_cont[ts_id]'),'_blank','dependent=yes,width=600,height=400,scrollbars=yes,status=yes'); return false;"/>
<button image="delete" label="Delete" id="delete[$row_cont[ts_id]]" statustext="Delete this entry" onclick="return confirm('Delete this entry');"/>
<checkbox options="$row_cont[ts_id]" id="checked[]" statustext="Select multiple contacts for a further action"/>
</hbox>
</row>
</rows>
</grid>
</template>
<template id="timesheet.index" template="" lang="" group="0" version="1.5.002">
<template id="timesheet.index" template="" lang="" group="0" version="1.7.001">
<grid width="100%">
<columns>
<column/>
<column/>
</columns>
<rows>
<row disabled="!@msg">
<description span="all" class="redItalic" no_lang="1" id="msg" align="center"/>
<description/>
</row>
<row disabled="1">
<hbox>
<template id="timesheet.index.dates"/>
<template id="timesheet.index.add" align="right"/>
<template id="dates"/>
<template id="add" align="right"/>
</hbox>
<description/>
</row>
<row>
<nextmatch id="nm" options="timesheet.index.rows"/>
<nextmatch id="nm" options="timesheet.index.rows" span="all"/>
</row>
<row class="noPrint">
<button label="Add" id="add" onclick="window.open(egw::link('/index.php','menuaction=timesheet.timesheet_ui.edit'),'_blank','dependent=yes,width=600,height=400,scrollbars=yes,status=yes'); return false;"/>
<hbox align="right">
<checkbox id="use_all" label="whole query" onchange="if (this.checked==true &amp;&amp; !confirm('Apply the action on the whole query, NOT only the shown contacts!!!')) this.checked=false;" statustext="Apply the action on the whole query, NOT only the shown contacts!!!"/>
<menulist>
<menupopup onchange="do_action(this);" options="Select an action or timesheet you want to modify..." no_lang="1" id="action" statustext="Select an action or timesheet to modify"/>
</menulist>
<button image="arrow_ltr" label="Check all" id="check_all" statustext="Check all" onclick="toggle_all(this.form,form::name('nm[rows][checked][]')); return false;" needed="1" class="checkAllArrow"/>
</hbox>
</row>
<row disabled="1">
<button label="Export" onclick="timesheet_export(); return false;" id="export"/>
<description/>
</row>
</rows>
</grid>