2005-12-19 05:23:14 +01:00
< ? php
2006-08-26 18:32:29 +02:00
/**
* TimeSheet - user interface
*
* @ link http :// www . egroupware . org
* @ author Ralf Becker < RalfBecker - AT - outdoor - training . de >
* @ package timesheet
2010-02-05 04:34:17 +01:00
* @ copyright ( c ) 2005 - 10 by Ralf Becker < RalfBecker - AT - outdoor - training . de >
2006-08-26 18:32:29 +02:00
* @ license http :// opensource . org / licenses / gpl - license . php GPL - GNU General Public License
2008-04-18 23:09:30 +02:00
* @ version $Id $
2006-08-26 18:32:29 +02:00
*/
2005-12-19 05:23:14 +01:00
/**
* User interface object of the TimeSheet
*/
2008-10-07 10:57:09 +02:00
class timesheet_ui extends timesheet_bo
2005-12-19 05:23:14 +01:00
{
var $public_functions = array (
2010-02-05 04:34:17 +01:00
'view' => true ,
'edit' => true ,
'index' => true ,
'editstatus' => true ,
2005-12-19 05:23:14 +01:00
);
2006-09-12 17:21:23 +02:00
/**
2007-03-08 12:22:57 +01:00
* ProjectManager integration : 'none' , 'full' or default null
2006-09-12 17:21:23 +02:00
*
* @ var string
*/
var $pm_integration ;
2005-12-19 05:23:14 +01:00
2007-03-08 12:22:57 +01:00
/**
* TimeSheet view type : 'short' or 'normal'
*
* @ var string
2008-04-18 23:09:30 +02:00
*/
2007-03-08 12:22:57 +01:00
var $ts_viewtype ;
2008-04-18 23:09:30 +02:00
2008-10-07 10:57:09 +02:00
/**
* Constructor
*
*/
function __construct ()
2005-12-19 05:23:14 +01:00
{
2008-10-07 10:57:09 +02:00
parent :: __construct ();
2008-04-18 23:09:30 +02:00
2008-03-09 08:33:42 +01:00
$this -> pm_integration = $this -> config_data [ 'pm_integration' ];
$this -> ts_viewtype = $this -> config_data [ 'ts_viewtype' ];
2007-03-08 12:22:57 +01:00
// our javascript
// to be moved in a seperate file if rewrite is over
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'java_script' ] .= $this -> js ();
2005-12-19 05:23:14 +01:00
}
function view ()
{
$this -> edit ( null , true );
}
2008-04-18 23:09:30 +02:00
2005-12-19 05:23:14 +01:00
function edit ( $content = null , $view = false )
{
2009-06-08 18:21:14 +02:00
$etpl = new etemplate ( 'timesheet.edit' );
2005-12-19 05:23:14 +01:00
if ( ! is_array ( $content ))
{
2010-02-05 04:34:17 +01:00
if ( $_GET [ 'msg' ]) $msg = strip_tags ( $_GET [ 'msg' ]);
2010-03-23 13:54:00 +01:00
2005-12-19 05:23:14 +01:00
if ( $view || ( int ) $_GET [ 'ts_id' ])
{
if ( ! $this -> read (( int ) $_GET [ 'ts_id' ]))
{
$GLOBALS [ 'egw' ] -> common -> egw_header ();
echo " <script>alert(' " . lang ( 'Permission denied!!!' ) . " '); window.close();</script> \n " ;
$GLOBALS [ 'egw' ] -> common -> egw_exit ();
}
if ( ! $view && ! $this -> check_acl ( EGW_ACL_EDIT ))
{
$view = true ;
}
}
else // new entry
{
$this -> data = array (
2009-05-06 09:04:29 +02:00
'ts_start' => $this -> today ,
2009-10-26 09:17:06 +01:00
'end_time' => egw_time :: to ( $this -> now , 'H:i' ),
2009-05-06 09:04:29 +02:00
'ts_owner' => $GLOBALS [ 'egw_info' ][ 'user' ][ 'account_id' ],
'cat_id' => ( int ) $_REQUEST [ 'cat_id' ],
2010-03-23 13:54:00 +01:00
'ts_status' => $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'timesheet' ][ 'predefined_status' ],
2005-12-19 05:23:14 +01:00
);
}
2008-04-18 23:09:30 +02:00
$referer = preg_match ( '/menuaction=([^&]+)/' , $_SERVER [ 'HTTP_REFERER' ], $matches ) ? $matches [ 1 ] :
2009-05-06 09:04:29 +02:00
( strpos ( $_SERVER [ 'HTTP_REFERER' ], '/infolog/index.php' ) !== false ? 'infolog.infolog_ui.index' : TIMESHEET_APP . '.timesheet_ui.index' );
2009-09-08 11:23:41 +02:00
if ( ! isset ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ][ 'admin' ]) && $this -> data [ 'ts_status' ])
{
if ( $this -> status_labels_config [ $this -> data [ 'ts_status' ]][ 'admin' ])
{
$view = true ; //only admin can edit with this status
$only_admin_edit = true ;
$msg = lang ( 'only Admin can edit this status' );
}
}
2005-12-19 05:23:14 +01:00
}
else
{
2007-06-25 19:00:41 +02:00
//echo "<p>ts_start=$content[ts_start], start_time=$content[start_time], end_time=$content[end_time], ts_duration=$content[ts_duration], ts_quantity=$content[ts_quantity]</p>\n";
2009-10-01 16:29:30 +02:00
if ( ! isset ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ][ 'admin' ]) && $content [ 'ts_status' ])
{
if ( $this -> status_labels_config [ $content [ 'ts_status' ]][ 'admin' ])
{
$view = true ; //only admin can edit with this status
$only_admin_edit = true ;
$msg = lang ( 'only Admin can edit this status' );
}
}
2009-11-04 14:02:05 +01:00
if ( $this -> ts_viewtype == 'short' )
{
$content [ 'start_time' ] = $content [ 'end_time' ] = '00:00' ;
2009-11-14 19:02:21 +01:00
}
2009-10-26 09:17:06 +01:00
// we only need 2 out of 3 values from start-, end-time or duration (the date in ts_start is always required!)
2009-12-14 17:25:12 +01:00
if ( isset ( $content [ 'start_time' ]) && $content [ 'start_time' ] != '00:00' ) // start-time specified
2009-10-26 09:17:06 +01:00
{
//$content['ts_start'] += $content['start_time'];
$start = new egw_time ( $content [ 'ts_start' ]);
$start_time = explode ( ':' , $content [ 'start_time' ]);
$start -> setTime ( $start_time [ 0 ], $start_time [ 1 ]);
$content [ 'ts_start' ] = $start -> format ( 'ts' );
}
2009-12-14 17:25:12 +01:00
if ( isset ( $content [ 'end_time' ]) && $content [ 'end_time' ] != '00:00' ) // end-time specified
2006-09-12 12:37:13 +02:00
{
2009-10-26 09:17:06 +01:00
$end = new egw_time ( $content [ 'ts_start' ]);
$end_time = explode ( ':' , $content [ 'end_time' ]);
$end -> setTime ( $end_time [ 0 ], $end_time [ 1 ]);
2006-09-12 12:37:13 +02:00
}
2009-10-26 09:17:06 +01:00
if ( $end && $start ) // start- & end-time --> calculate the duration
2006-09-12 12:37:13 +02:00
{
2009-10-26 09:17:06 +01:00
$content [ 'ts_duration' ] = ( $end -> format ( 'ts' ) - $start -> format ( 'ts' )) / 60 ;
//echo "<p>end_time=$content[end_time], start_time=$content[start_time] --> duration=$content[ts_duration]</p>\n";
2006-09-12 12:37:13 +02:00
}
2009-10-26 09:17:06 +01:00
elseif ( $content [ 'ts_duration' ] && $end ) // no start, calculate from end and duration
2006-09-12 12:37:13 +02:00
{
2009-10-26 09:17:06 +01:00
$content [ 'ts_start' ] = $end -> format ( 'ts' ) - 60 * $content [ 'ts_duration' ];
//echo "<p>end_time=$content[end_time], duration=$content[ts_duration] --> ts_start=$content[ts_start]=".egw_time::to($content['ts_start'])."</p>\n";
2006-09-12 12:37:13 +02:00
}
2006-10-19 20:52:18 +02:00
if ( $content [ 'ts_duration' ] > 0 ) unset ( $content [ 'end_time' ]);
2006-09-12 12:37:13 +02:00
// now we only deal with start (date+time) and duration
2006-01-11 06:17:15 +01:00
list ( $button ) = @ each ( $content [ 'button' ]);
2005-12-19 05:23:14 +01:00
$view = $content [ 'view' ];
$referer = $content [ 'referer' ];
$this -> data = $content ;
2009-09-24 14:42:54 +02:00
foreach ( array ( 'button' , 'view' , 'referer' , 'tabs' , 'start_time' ) as $key )
2005-12-19 05:23:14 +01:00
{
unset ( $this -> data [ $key ]);
}
switch ( $button )
{
case 'edit' :
2009-10-01 16:29:30 +02:00
if ( $this -> check_acl ( EGW_ACL_EDIT ) && ! $only_admin_edit ) $view = false ;
2005-12-19 05:23:14 +01:00
break ;
2008-04-18 23:09:30 +02:00
2005-12-19 05:23:14 +01:00
case 'save' :
case 'save_new' :
case 'apply' :
2010-06-28 15:35:10 +02:00
if (( ! $this -> data [ 'ts_quantity' ] || $this -> ts_viewtype == 'short' ) && $this -> data [ 'ts_duration' ]) // set the quantity (in h) from the duration (in min)
2005-12-19 05:23:14 +01:00
{
$this -> data [ 'ts_quantity' ] = $this -> data [ 'ts_duration' ] / 60.0 ;
}
2006-09-12 17:21:23 +02:00
if ( ! $this -> data [ 'ts_quantity' ])
{
$etpl -> set_validation_error ( 'ts_quantity' , lang ( 'Field must not be empty !!!' ));
}
2007-06-25 19:00:41 +02:00
if ( $this -> data [ 'ts_duration' ] < 0 ) // for layout purpose we show the error behind the quantity field
2006-10-19 20:52:18 +02:00
{
$etpl -> set_validation_error ( 'ts_quantity' , lang ( 'Starttime has to be before endtime !!!' ));
}
2007-06-25 19:00:41 +02:00
//echo "<p>ts_start=$content[ts_start], start_time=$content[start_time], end_time=$content[end_time], ts_duration=$content[ts_duration], ts_quantity=$content[ts_quantity]</p>\n";
2005-12-19 05:23:14 +01:00
if ( ! $this -> data [ 'ts_project' ]) $this -> data [ 'ts_project' ] = $this -> data [ 'ts_project_blur' ];
2008-04-18 23:09:30 +02:00
// set ts_title to ts_project if short viewtype (title is not editable)
if ( $this -> ts_viewtype == 'short' )
2007-05-25 10:31:05 +02:00
{
2008-04-18 23:09:30 +02:00
$this -> data [ 'ts_title' ] = $this -> data [ 'ts_project' ];
2007-05-25 10:31:05 +02:00
}
2006-09-12 17:21:23 +02:00
if ( ! $this -> data [ 'ts_title' ])
{
2008-04-18 23:09:30 +02:00
$this -> data [ 'ts_title' ] = $this -> data [ 'ts_title_blur' ] ?
2009-03-23 10:53:03 +01:00
$this -> data [ 'ts_title_blur' ] : $this -> data [ 'ts_project_blur' ];
2007-06-09 16:56:49 +02:00
if ( ! $this -> data [ 'ts_title' ])
{
$etpl -> set_validation_error ( 'ts_title' , lang ( 'Field must not be empty !!!' ));
}
2006-09-12 17:21:23 +02:00
}
if ( $etpl -> validation_errors ()) break ; // the user need to fix the error, before we can save the entry
2005-12-19 05:23:14 +01:00
if ( $this -> save () != 0 )
{
$msg = lang ( 'Error saving the entry!!!' );
$button = '' ;
}
else
{
$msg = lang ( 'Entry saved' );
2006-01-11 06:17:15 +01:00
if (( int ) $this -> data [ 'pm_id' ] != ( int ) $this -> data [ 'old_pm_id' ])
{
// update links accordingly
if ( $this -> data [ 'pm_id' ])
{
2008-03-09 08:33:42 +01:00
egw_link :: link ( TIMESHEET_APP , $content [ 'link_to' ][ 'to_id' ], 'projectmanager' , $this -> data [ 'pm_id' ]);
2006-01-11 06:17:15 +01:00
}
if ( $this -> data [ 'old_pm_id' ])
{
2008-03-09 08:33:42 +01:00
egw_link :: unlink2 ( 0 , TIMESHEET_APP , $content [ 'link_to' ][ 'to_id' ], 0 , 'projectmanager' , $this -> data [ 'old_pm_id' ]);
2006-01-11 06:17:15 +01:00
unset ( $this -> data [ 'old_pm_id' ]);
}
}
2005-12-19 05:23:14 +01:00
if ( is_array ( $content [ 'link_to' ][ 'to_id' ]) && count ( $content [ 'link_to' ][ 'to_id' ]))
{
2008-03-09 08:33:42 +01:00
egw_link :: link ( TIMESHEET_APP , $this -> data [ 'ts_id' ], $content [ 'link_to' ][ 'to_id' ]);
2005-12-19 05:23:14 +01:00
}
}
$js = " opener.location.href=' " . $GLOBALS [ 'egw' ] -> link ( '/index.php' , array (
2009-05-06 09:04:29 +02:00
'menuaction' => $referer ,
'msg' => $msg ,
2005-12-19 05:23:14 +01:00
)) . " '; " ;
if ( $button == 'apply' ) break ;
if ( $button == 'save_new' )
{
2006-09-12 12:37:13 +02:00
$msg .= ', ' . lang ( 'creating new entry' ); // giving some feedback to the user
if ( ! is_array ( $content [ 'link_to' ][ 'to_id' ])) // set links again, so new entry gets the same links as the existing one
{
$content [ 'link_to' ][ 'to_id' ] = 0 ;
2008-06-06 07:28:38 +02:00
foreach ( egw_link :: get_links ( TIMESHEET_APP , $this -> data [ 'ts_id' ], '!' . egw_link :: VFS_APPNAME ) as $link )
2006-09-12 12:37:13 +02:00
{
2008-03-09 08:33:42 +01:00
egw_link :: link ( TIMESHEET_APP , $content [ 'link_to' ][ 'to_id' ], $link [ 'app' ], $link [ 'id' ], $link [ 'remark' ]);
2006-09-12 12:37:13 +02:00
}
}
2005-12-19 05:23:14 +01:00
// create a new entry
$this -> data [ 'ts_start' ] += 60 * $this -> data [ 'ts_duration' ];
foreach ( array ( 'ts_id' , 'ts_title' , 'ts_description' , 'ts_duration' , 'ts_quantity' , 'ts_modified' , 'ts_modifier' ) as $name )
{
unset ( $this -> data [ $name ]);
}
2007-06-07 11:13:55 +02:00
// save the selected project, to delete the project-link, if the user changes the project
$this -> data [ 'old_pm_id' ] = $this -> data [ 'pm_id' ];
2005-12-19 05:23:14 +01:00
break ;
}
// fall-through for save
case 'delete' :
if ( $button == 'delete' )
{
2006-01-11 06:17:15 +01:00
if ( $this -> delete ())
{
$msg = lang ( 'Entry deleted' );
$js = " opener.location.href=opener.location.href+'&msg= $msg '; " ;
}
else
{
$msg = lang ( 'Error deleting the entry!!!' );
break ; // dont close window
}
2005-12-19 05:23:14 +01:00
}
2006-01-11 06:17:15 +01:00
// fall-through for save
2005-12-19 05:23:14 +01:00
case 'cancel' :
$js .= 'window.close();' ;
echo " <html> \n <body> \n <script> \n $js\n </script> \n </body> \n </html> \n " ;
$GLOBALS [ 'egw' ] -> common -> egw_exit ();
break ;
}
}
$preserv = $this -> data + array (
2009-05-06 09:04:29 +02:00
'view' => $view ,
'referer' => $referer ,
'ts_title_blur' => $content [ 'ts_title_blur' ],
2005-12-19 05:23:14 +01:00
);
2006-01-11 06:17:15 +01:00
$content = array_merge ( $this -> data , array (
2009-05-06 09:04:29 +02:00
'msg' => $msg ,
'view' => $view ,
2009-09-24 14:42:54 +02:00
'tabs' => $content [ 'tabs' ],
2009-05-06 09:04:29 +02:00
'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 ) : '' ,
2009-10-26 09:17:06 +01:00
'start_time' => egw_time :: to ( $this -> data [ 'ts_start' ], 'H:i' ),
2009-05-06 09:04:29 +02:00
'pm_integration' => $this -> pm_integration ,
2010-03-23 13:54:00 +01:00
'no_ts_status' => ! $this -> status_labels ,
2006-01-11 06:17:15 +01:00
));
2006-02-08 19:30:20 +01:00
$links = array ();
2006-03-21 14:52:49 +01:00
// create links specified in the REQUEST (URL)
if ( ! $this -> data [ 'ts_id' ] && isset ( $_REQUEST [ 'link_app' ]) && isset ( $_REQUEST [ 'link_id' ]) && ! is_array ( $content [ 'link_to' ][ 'to_id' ]))
2005-12-19 05:23:14 +01:00
{
2006-03-21 14:52:49 +01:00
$link_ids = is_array ( $_REQUEST [ 'link_id' ]) ? $_REQUEST [ 'link_id' ] : array ( $_REQUEST [ 'link_id' ]);
foreach ( is_array ( $_REQUEST [ 'link_app' ]) ? $_REQUEST [ 'link_app' ] : array ( $_REQUEST [ 'link_app' ]) as $n => $link_app )
2005-12-19 05:23:14 +01:00
{
2006-03-21 14:52:49 +01:00
$link_id = $link_ids [ $n ];
if ( preg_match ( '/^[a-z_0-9-]+:[:a-z_0-9-]+$/i' , $link_app . ':' . $link_id )) // gard against XSS
{
switch ( $link_app )
{
case 'projectmanager' :
$links [] = $link_id ;
break ;
case 'infolog' :
2007-06-07 11:13:55 +02:00
// a preserved title blur is only set for other (non-project) links, it stays with Save&New!
2008-03-09 08:33:42 +01:00
$preserv [ 'ts_title_blur' ] = egw_link :: title ( 'infolog' , $link_id );
2006-03-21 14:52:49 +01:00
break ;
2010-04-27 20:37:16 +02:00
case 'calendar' :
$calendar_bo = new calendar_bo ();
2010-04-30 17:41:45 +02:00
list ( $link_id , $recurrence ) = explode ( ':' , $link_id );
$event = $calendar_bo -> read ( $link_id , $recurrence );
$content [ 'ts_start' ] = $event [ 'start' ];
2010-05-04 17:16:18 +02:00
$content [ 'start_time' ] = egw_time :: to ( $event [ 'start' ], 'H:i' );
2010-04-30 17:41:45 +02:00
$content [ 'ts_title' ] = $calendar_bo -> link_title ( $event );
2010-04-27 20:37:16 +02:00
$content [ 'ts_description' ] = $event [ 'description' ];
$content [ 'ts_duration' ] = ( $event [ 'end' ] - $event [ 'start' ]) / 60 ;
$content [ 'ts_quantity' ] = ( $event [ 'end' ] - $event [ 'start' ]) / 3600 ;
unset ( $content [ 'end_time' ]);
2010-04-30 17:41:45 +02:00
break ;
2010-04-27 20:37:16 +02:00
default :
2010-06-28 14:51:52 +02:00
if ( ! $preserv [ 'ts_title_blur' ])
{
$preserv [ 'ts_title_blur' ] = egw_link :: title ( $link_app , $link_id );
}
2010-04-27 20:37:16 +02:00
break ;
2006-03-21 14:52:49 +01:00
}
2010-04-30 17:41:45 +02:00
egw_link :: link ( TIMESHEET_APP , $content [ 'link_to' ][ 'to_id' ], $link_app , $link_id );
2006-03-21 14:52:49 +01:00
}
2005-12-19 05:23:14 +01:00
}
}
elseif ( $this -> data [ 'ts_id' ])
{
2008-03-09 08:33:42 +01:00
$links = egw_link :: get_links ( TIMESHEET_APP , $this -> data [ 'ts_id' ], 'projectmanager' );
2005-12-19 05:23:14 +01:00
}
2007-01-12 02:27:37 +01:00
// make all linked projects availible for the pm-pricelist widget, to be able to choose prices from all
$content [ 'all_pm_ids' ] = array_values ( $links );
2008-04-18 23:09:30 +02:00
2007-05-25 10:31:05 +02:00
// set old id, pm selector (for later removal)
2008-04-18 23:09:30 +02:00
if ( count ( $links ) > 0 )
{
2007-05-25 10:31:05 +02:00
$preserv [ 'old_pm_id' ] = array_shift ( $links );
}
2008-04-18 23:09:30 +02:00
if ( ! isset ( $this -> data [ 'pm_id' ]) && $preserv [ 'old_pm_id' ])
2007-06-03 17:01:27 +02:00
{
2007-05-25 10:31:05 +02:00
$content [ 'pm_id' ] = $preserv [ 'old_pm_id' ];
}
2006-01-11 06:17:15 +01:00
if ( $content [ 'pm_id' ])
2005-12-19 05:23:14 +01:00
{
2008-03-09 08:33:42 +01:00
$preserv [ 'ts_project_blur' ] = $content [ 'ts_project_blur' ] = egw_link :: title ( 'projectmanager' , $content [ 'pm_id' ]);
2005-12-19 05:23:14 +01:00
}
2007-06-03 17:01:27 +02:00
if ( $this -> pm_integration == 'full' )
{
$preserv [ 'ts_project' ] = $preserv [ 'ts_project_blur' ];
}
2009-09-10 10:20:27 +02:00
$content [ 'history' ] = array (
'id' => $this -> data [ 'ts_id' ],
'app' => 'timesheet' ,
'status-widgets' => array (
2009-09-13 12:48:40 +02:00
'ts_status' => $this -> status_labels ,
'ts_modifier' => 'select-account' ,
'cat_id' => 'select-cat' ,
2009-09-10 10:20:27 +02:00
),
);
foreach ( $this -> field2history as $field => $status )
{
$sel_options [ 'status' ][ $status ] = $this -> field2label [ $field ];
}
2007-06-07 11:13:55 +02:00
// the actual title-blur is either the preserved title blur (if we are called from infolog entry),
// or the preserved project-blur comming from the current selected project
$content [ 'ts_title_blur' ] = $preserv [ 'ts_title_blur' ] ? $preserv [ 'ts_title_blur' ] : $preserv [ 'ts_project_blur' ];
2005-12-19 05:23:14 +01:00
$readonlys = array (
2009-05-06 09:04:29 +02:00
'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 ,
2005-12-19 05:23:14 +01:00
);
2009-09-10 10:20:27 +02:00
2005-12-19 05:23:14 +01:00
if ( $view )
{
2006-01-11 06:17:15 +01:00
foreach ( array_merge ( array_keys ( $this -> data ), array ( 'pm_id' , 'pl_id' , 'link_to' )) as $key )
2005-12-19 05:23:14 +01:00
{
$readonlys [ $key ] = true ;
}
2006-11-20 15:17:28 +01:00
$readonlys [ 'start_time' ] = $readonlys [ 'end_time' ] = true ;
2005-12-19 05:23:14 +01:00
}
$edit_grants = $this -> grant_list ( EGW_ACL_EDIT );
if ( count ( $edit_grants ) == 1 )
{
$readonlys [ 'ts_owner' ] = true ;
}
2009-09-10 10:20:27 +02:00
$sel_options [ 'ts_owner' ] = $edit_grants ;
$sel_options [ 'ts_status' ] = $this -> status_labels ;
2005-12-19 05:23:14 +01:00
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] = lang ( 'timesheet' ) . ' - ' .
2009-05-06 09:04:29 +02:00
( $view ? lang ( 'View' ) : ( $this -> data [ 'ts_id' ] ? lang ( 'Edit' ) : lang ( 'Add' )));
2008-04-18 23:09:30 +02:00
2006-01-11 06:17:15 +01:00
// supress unknow widget 'projectmanager-*', if projectmanager is not installed or old
if ( !@ file_exists ( EGW_INCLUDE_ROOT . '/projectmanager/inc/class.projectmanager_widget.inc.php' ))
{
$etpl -> set_cell_attribute ( 'pm_id' , 'disabled' , true );
$etpl -> set_cell_attribute ( 'pl_id' , 'disabled' , true );
2008-04-18 23:09:30 +02:00
}
2007-03-08 12:22:57 +01:00
2008-04-18 23:09:30 +02:00
if ( $this -> ts_viewtype == 'short' )
2007-06-03 17:01:27 +02:00
{
2009-09-24 14:42:54 +02:00
$content [ 'ts_viewtype' ] = $readonlys [ 'tabs' ][ 'notes' ] = true ;
2007-03-08 12:22:57 +01:00
}
2009-09-24 14:42:54 +02:00
if ( ! $this -> customfields ) $readonlys [ 'tabs' ][ 'customfields' ] = true ; // suppress tab if there are not customfields
if ( ! $this -> data [ 'ts_id' ]) $readonlys [ 'tabs' ][ 'history' ] = true ; //suppress history for the first loading without ID
2010-03-23 13:54:00 +01:00
2009-09-10 10:20:27 +02:00
return $etpl -> exec ( TIMESHEET_APP . '.timesheet_ui.edit' , $content , $sel_options , $readonlys , $preserv , 2 );
2005-12-19 05:23:14 +01:00
}
2008-04-18 23:09:30 +02:00
2006-09-12 12:37:13 +02:00
/**
* Calculate the time from a timestamp containing date & time
*
* @ param int $datetime
* @ return int
*/
function datetime2time ( $datetime )
{
if ( ! $datetime ) return 0 ;
return $datetime - mktime ( 0 , 0 , 0 , date ( 'm' , $datetime ), date ( 'd' , $datetime ), date ( 'Y' , $datetime ));
}
2005-12-19 05:23:14 +01:00
/**
* query projects for nextmatch in the projects - list
*
* reimplemented from so_sql to disable action - buttons based on the acl and make some modification on the data
*
2006-03-27 14:20:06 +02:00
* @ param array & $query
2005-12-19 05:23:14 +01:00
* @ param array & $rows returned rows / cups
* @ param array & $readonlys eg . to disable buttons based on acl
2007-03-08 12:22:57 +01:00
* @ param boolean $id_only = false if true only return ( via $rows ) an array of contact - ids , dont save state to session
* @ return int total number of contacts matching the selection
2005-12-19 05:23:14 +01:00
*/
2007-03-08 12:22:57 +01:00
function get_rows ( & $query_in , & $rows , & $readonlys , $id_only = false )
2005-12-19 05:23:14 +01:00
{
2006-03-27 14:20:06 +02:00
$this -> show_sums = false ;
if ( $query_in [ 'filter' ])
{
$date_filter = $this -> date_filter ( $query_in [ 'filter' ], $query_in [ 'startdate' ], $query_in [ 'enddate' ]);
2008-04-18 23:09:30 +02:00
2006-03-27 14:20:06 +02:00
$start = explode ( '-' , date ( 'Y-m-d' , $query_in [ 'startdate' ] + 12 * 60 * 60 ));
$end = explode ( '-' , date ( 'Y-m-d' , $query_in [ 'enddate' ] ? $query_in [ 'enddate' ] : $query_in [ 'startdate' ] + 7.5 * 24 * 60 * 60 ));
2008-04-18 23:09:30 +02:00
2006-04-05 18:23:44 +02:00
// show year-sums, if we are year-aligned (show full years)?
if (( int ) $start [ 2 ] == 1 && ( int ) $start [ 1 ] == 1 && ( int ) $end [ 2 ] == 31 && ( int ) $end [ 1 ] == 12 )
{
$this -> show_sums [] = 'year' ;
}
2006-03-27 14:20:06 +02:00
// show month-sums, if we are month-aligned (show full monthes)?
if (( int ) $start [ 2 ] == 1 && ( int ) $end [ 2 ] == ( int ) date ( 'd' , mktime ( 12 , 0 , 0 , $end [ 1 ] + 1 , 0 , $end [ 0 ])))
{
2006-04-05 18:23:44 +02:00
$this -> show_sums [] = 'month' ;
2006-03-27 14:20:06 +02:00
}
// show week-sums, if we are week-aligned (show full weeks)?
$week_start_day = $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'calendar' ][ 'weekdaystarts' ];
if ( ! $week_start_day ) $week_start_day = 'Sunday' ;
switch ( $week_start_day )
{
case 'Sunday' : $week_end_day = 'Saturday' ; break ;
case 'Monday' : $week_end_day = 'Sunday' ; break ;
case 'Saturday' : $week_end_day = 'Friday' ; break ;
}
$filter_start_day = date ( 'l' , $query_in [ 'startdate' ] + 12 * 60 * 60 );
$filter_end_day = $query_in [ 'enddate' ] ? date ( 'l' , $query_in [ 'enddate' ] + 12 * 60 * 60 ) : false ;
//echo "<p align=right>prefs: $week_start_day - $week_end_day, filter: $filter_start_day - $filter_end_day</p>\n";
if ( $filter_start_day == $week_start_day && ( ! $filter_end_day || $filter_end_day == $week_end_day ))
{
2006-04-05 18:23:44 +02:00
$this -> show_sums [] = 'week' ;
2006-03-27 14:20:06 +02:00
}
// show day-sums, if range <= 5 weeks
if ( ! $query_in [ 'enddate' ] || $query_in [ 'enddate' ] - $query_in [ 'startdate' ] < 36 * 24 * 60 * 60 )
{
2006-04-05 18:23:44 +02:00
$this -> show_sums [] = 'day' ;
2006-03-27 14:20:06 +02:00
}
}
//echo "<p align=right>show_sums=".print_r($this->show_sums,true)."</p>\n";
2009-03-24 12:28:17 +01:00
if ( ! $id_only ) $GLOBALS [ 'egw' ] -> session -> appsession ( 'index' , TIMESHEET_APP , $query_in );
2006-03-27 14:20:06 +02:00
$query = $query_in ; // keep the original query
2009-09-26 13:17:19 +02:00
2009-02-16 09:36:22 +01:00
if ( $this -> ts_viewtype == 'short' ) $query_in [ 'options-selectcols' ] = array ( 'ts_quantity' => false , 'ts_unitprice' => false , 'ts_total' => false );
2009-03-23 10:53:03 +01:00
if ( $query [ 'no_status' ]) $query_in [ 'options-selectcols' ][ 'ts_status' ] = false ;
2010-03-23 13:54:00 +01:00
2009-09-28 11:25:24 +02:00
//_debug_array($query['col_filter']);
//echo "PM Integration:".$this->pm_integration.'<br>';
2006-09-12 17:21:23 +02:00
// PM project filter for the PM integration
2009-09-28 11:25:24 +02:00
if ( $this -> pm_integration == 'full' )
{
unset ( $query [ 'col_filter' ][ 'ts_project' ]);
}
if (( string ) $query [ 'col_filter' ][ 'pm_id' ] != '' && ( string ) $query [ 'col_filter' ][ 'pm_id' ] != '0' )
2006-09-12 17:21:23 +02:00
{
2009-09-28 11:25:24 +02:00
//$query['col_filter']['ts_id'] = egw_link::get_links('projectmanager',$query['col_filter']['pm_id'],'timesheet');
2007-03-08 12:22:57 +01:00
$query [ 'col_filter' ][ 'ts_id' ] = $this -> get_ts_links ( $query [ 'col_filter' ][ 'pm_id' ]);
2009-10-01 16:29:30 +02:00
if ( empty ( $query [ 'col_filter' ][ 'ts_id' ])) $query [ 'col_filter' ][ 'ts_id' ] = - 1 ;
2006-11-20 15:17:28 +01:00
if ( ! $query [ 'col_filter' ][ 'ts_id' ]) $query [ 'col_filter' ][ 'ts_id' ] = 0 ;
2006-09-12 17:21:23 +02:00
}
2009-05-06 09:04:29 +02:00
if (( string ) $query [ 'col_filter' ][ 'pm_id' ] != '' && ( string ) $query [ 'col_filter' ][ 'pm_id' ] == '0' )
{
2009-01-27 16:51:04 +01:00
$query [ 'col_filter' ][ 'ts_project' ] = 0 ;
unset ( $query [ 'col_filter' ][ 'ts_id' ]);
}
2006-09-12 17:21:23 +02:00
unset ( $query [ 'col_filter' ][ 'pm_id' ]);
2008-04-18 23:09:30 +02:00
2009-09-26 13:17:19 +02:00
// handle linked filter (show only entries linked to a certain other entry)
if ( $query [ 'col_filter' ][ 'linked' ])
{
list ( $app , $id ) = explode ( ':' , $query [ 'col_filter' ][ 'linked' ]);
if ( ! ( $links = egw_link :: get_links ( $app , $id , 'timesheet' )))
{
$rows = array (); // no infologs linked to project --> no rows to return
return 0 ;
}
if ( ! $query [ 'col_filter' ][ 'ts_id' ])
{
$query [ 'col_filter' ][ 'ts_id' ] = array_values ( array_unique ( $links ));
}
// allow to combine with other filters using ts_id --> intersect ids
elseif ( ! ( $query [ 'col_filter' ][ 'ts_id' ] = array_intersect (( array ) $query [ 'col_filter' ][ 'ts_id' ], array_values ( array_unique ( $links )))))
{
$rows = array (); // no infologs linked to project --> no rows to return
return 0 ;
}
}
unset ( $query [ 'col_filter' ][ 'linked' ]);
2006-09-12 17:21:23 +02:00
// filter for no project
2009-05-06 09:04:29 +02:00
if (( string ) $query [ 'col_filter' ][ 'ts_project' ] == '0' )
{
2009-01-27 16:51:04 +01:00
$query [ 'col_filter' ][ 'ts_project' ] = null ;
}
2009-08-17 20:46:47 +02:00
// filter for no status
if (( string ) $query [ 'col_filter' ][ 'ts_status' ] == '0' )
{
$query [ 'col_filter' ][ 'ts_status' ] = null ;
}
2009-01-27 16:51:04 +01:00
#_debug_array($query['col_filter']);
2009-09-08 11:23:41 +02:00
if ( isset ( $this -> status_labels_substatus [ $query [ 'col_filter' ][ 'ts_status' ]]))
{
$query [ 'col_filter' ][ 'ts_status' ] = $this -> status_labels_substatus [ $query [ 'col_filter' ][ 'ts_status' ]];
foreach ( $query [ 'col_filter' ][ 'ts_status' ] as $status_id )
{
if ( isset ( $this -> status_labels_substatus [ '2level' ][ $status_id ]))
{
$query [ 'col_filter' ][ 'ts_status' ] = array_merge ( $query [ 'col_filter' ][ 'ts_status' ], $this -> status_labels_substatus [ $status_id ]);
}
}
}
2006-03-27 14:20:06 +02:00
if (( int ) $query [ 'filter2' ] != ( int ) $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ TIMESHEET_APP ][ 'show_details' ])
{
$GLOBALS [ 'egw' ] -> preferences -> add ( TIMESHEET_APP , 'show_details' ,( int ) $query [ 'filter2' ]);
$GLOBALS [ 'egw' ] -> preferences -> save_repository ( true );
}
2006-09-12 17:21:23 +02:00
// category filter: cat_id or ''=All cats or 0=No cat
2005-12-19 05:23:14 +01:00
if ( $query [ 'cat_id' ])
{
$cats = $GLOBALS [ 'egw' ] -> categories -> return_all_children (( int ) $query [ 'cat_id' ]);
$query [ 'col_filter' ][ 'cat_id' ] = count ( $cats ) > 1 ? $cats : $query [ 'cat_id' ];
}
2006-09-12 17:21:23 +02:00
elseif (( string ) $query [ 'cat_id' ] == '0' ) // no category
{
$query [ 'col_filter' ][ 'cat_id' ] = null ;
}
else // all cats --> no filter
{
unset ( $query [ 'col_filter' ][ 'cat_id' ]);
}
2006-03-21 23:18:29 +01:00
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] = lang ( 'timesheet' );
if ( $query [ 'col_filter' ][ 'ts_owner' ])
2005-12-19 05:23:14 +01:00
{
2006-03-21 23:18:29 +01:00
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] .= ': ' . $GLOBALS [ 'egw' ] -> common -> grab_owner_name ( $query [ 'col_filter' ][ 'ts_owner' ]);
2009-02-16 09:36:22 +01:00
#if ($GLOBALS['egw']->accounts->get_type($query['col_filter']['ts_owner']) == 'g') $GLOBALS['egw_info']['flags']['app_header'] .= ' '. lang("and its members");
#_debug_array($GLOBALS['egw']->accounts->members($query['col_filter']['ts_owner'],true));
2009-09-22 15:40:03 +02:00
if ( $query [ 'col_filter' ][ 'ts_owner' ] < 0 ) $query [ 'col_filter' ][ 'ts_owner' ] = array_merge ( array ( $query [ 'col_filter' ][ 'ts_owner' ]), $GLOBALS [ 'egw' ] -> accounts -> members ( $query [ 'col_filter' ][ 'ts_owner' ], true ));
2005-12-19 05:23:14 +01:00
}
2006-03-21 23:18:29 +01:00
else
{
unset ( $query [ 'col_filter' ][ 'ts_owner' ]);
}
if ( $query [ 'filter' ])
{
2006-03-27 14:20:06 +02:00
$query [ 'col_filter' ][ 0 ] = $date_filter ;
2008-04-18 23:09:30 +02:00
2006-03-27 14:20:06 +02:00
// generate a meaningful app-header / report title
if ( $this -> show_sums [ 'month' ])
2006-03-21 23:18:29 +01:00
{
2006-03-27 14:20:06 +02:00
if (( int ) $start [ 1 ] == 1 && ( int ) $end [ 1 ] == 12 ) // whole year(s)
2006-03-21 23:18:29 +01:00
{
2006-03-27 14:20:06 +02:00
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] .= ': ' . $start [ 0 ] . ( $start [ 0 ] != $end [ 0 ] ? ' - ' . $end [ 0 ] : '' );
2006-03-21 23:18:29 +01:00
}
2006-03-27 14:20:06 +02:00
else
2006-03-21 23:18:29 +01:00
{
2006-03-27 14:20:06 +02:00
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] .= ': ' . lang ( date ( 'F' , $query [ 'startdate' ] + 12 * 60 * 60 )) . ' ' . $start [ 0 ];
if ( $start [ 0 ] != $end [ 0 ] || $start [ 1 ] != $end [ 1 ])
{
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] .= ' - ' . lang ( date ( 'F' , $query [ 'enddate' ] + 12 * 60 * 60 )) . ' ' . $end [ 0 ];
}
}
}
elseif ( $this -> show_sums [ 'week' ])
{
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] .= ': ' . lang ( 'week' ) . ' ' . date ( 'W' , $query [ 'startdate' ] + 36 * 60 * 60 ) . '/' . $start [ 0 ];
if ( $query [ 'enddate' ] && $query [ 'enddate' ] - $query [ 'startdate' ] > 10 * 24 * 60 * 60 )
{
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] .= ' - ' . date ( 'W' , $query [ 'enddate' ] - 36 * 60 * 60 ) . '/' . $end [ 0 ];
2006-03-21 23:18:29 +01:00
}
}
else
{
2006-03-27 14:20:06 +02:00
$df = $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'dateformat' ];
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] .= ': ' . $GLOBALS [ 'egw' ] -> common -> show_date ( $query [ 'startdate' ] + 12 * 60 * 60 , $df , false );
if ( $start != $end )
{
$GLOBALS [ 'egw_info' ][ 'flags' ][ 'app_header' ] .= ' - ' . $GLOBALS [ 'egw' ] -> common -> show_date ( $query [ 'enddate' ] + 12 * 60 * 60 , $df , false );
}
}
2008-10-15 18:37:23 +02:00
if ( $query [ 'filter' ] == 'custom' ) // show the custom dates
2006-03-27 14:20:06 +02:00
{
2008-07-21 17:40:14 +02:00
$GLOBALS [ 'egw' ] -> js -> set_onload ( " set_style_by_class('table','custom_hide','visibility','visible'); " );
2006-03-21 23:18:29 +01:00
}
}
2005-12-19 05:23:14 +01:00
$total = parent :: get_rows ( $query , $rows , $readonlys );
2008-04-18 23:09:30 +02:00
2008-03-09 08:33:42 +01:00
$ids = array ();
foreach ( $rows as $row )
{
$ids [] = $row [ 'ts_id' ];
}
2007-03-08 12:22:57 +01:00
if ( $id_only )
{
2008-03-09 08:33:42 +01:00
$rows = $ids ;
2007-03-08 12:22:57 +01:00
return $this -> total ; // no need to set other fields or $readonlys
}
2009-01-27 16:51:04 +01:00
$links3 = egw_link :: get_links_multiple ( TIMESHEET_APP , $ids , true , 'projectmanager' ); // only check for pm links!
#_debug_array($links);
//as the full array is expected, we must supply the missing but needed (since expected further down) information
2009-05-06 09:04:29 +02:00
if ( is_array ( $links3 ))
{
foreach ( $links3 as $likey => $liarray )
{
2009-01-27 16:51:04 +01:00
#echo "$likey";_debug_array($liarray);echo"<br>";
2009-05-06 09:04:29 +02:00
if ( is_array ( $liarray ))
{
foreach ( $liarray as $li2key => $lival )
{
2009-01-27 16:51:04 +01:00
$links [ $likey ][ $li2key ][ 'id' ] = $lival ;
$links [ $likey ][ $li2key ][ 'app' ] = 'projectmanager' ;
}
}
}
if ( ! is_array ( $links )) $links = array ();
2009-05-06 09:04:29 +02:00
}
else
{
2009-01-27 16:51:04 +01:00
$links = array ();
}
#_debug_array($links);
2005-12-19 05:23:14 +01:00
unset ( $query [ 'col_filter' ][ 0 ]);
2008-04-18 23:09:30 +02:00
2005-12-19 05:23:14 +01:00
$readonlys = array ();
2006-09-20 15:31:41 +02:00
$have_cats = false ;
2008-03-09 08:33:42 +01:00
foreach ( $rows as & $row )
2005-12-19 05:23:14 +01:00
{
2006-09-20 15:31:41 +02:00
if ( $row [ 'cat_id' ]) $have_cats = true ;
2006-03-27 00:11:58 +02:00
$row [ 'class' ] = 'row' ;
if ( $row [ 'ts_id' ] <= 0 ) // sums
{
$readonlys [ " view[ $row[ts_id] ] " ] = $readonlys [ " edit[ $row[ts_id] ] " ] = $readonlys [ " delete[ $row[ts_id] ] " ] = true ;
2010-05-06 16:31:44 +02:00
$readonlys [ " checked[ { $row [ ts_id ] } ] " ] = true ;
2011-02-14 17:17:25 +01:00
$readonlys [ " document[ { $row [ ts_id ] } ] " ] = true ;
2006-03-27 00:11:58 +02:00
if ( $query [ 'sort' ] == 'ASC' ) $row [ 'ts_start' ] -= 7200 ; // fix for DSL change
switch ( $row [ 'ts_id' ])
{
case 0 : // day-sum
2009-05-06 09:04:29 +02:00
$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 ));
2010-05-06 16:31:44 +02:00
// For some reason day sum checkbox on the etemplate is checked[1] instead of checked[0]
$readonlys [ " checked[1] " ] = true ;
2009-05-06 09:04:29 +02:00
break ;
2006-03-27 00:11:58 +02:00
case - 1 : // week-sum
2009-05-06 09:04:29 +02:00
$row [ 'ts_title' ] = lang ( 'Sum %1:' , lang ( 'week' ) . ' ' . substr ( $row [ 'ts_week' ], 4 ) . '/' . substr ( $row [ 'ts_week' ], 0 , 4 ));
break ;
2006-03-27 00:11:58 +02:00
case - 2 : // month-sum
2009-05-06 09:04:29 +02:00
$row [ 'ts_title' ] = lang ( 'Sum %1:' , lang ( date ( 'F' , $row [ 'ts_start' ])) . ' ' . substr ( $row [ 'ts_month' ], 0 , 4 ));
break ;
2006-04-05 18:23:44 +02:00
case - 3 : // year-sum
2009-05-06 09:04:29 +02:00
$row [ 'ts_title' ] = lang ( 'Sum %1:' , $row [ 'ts_year' ]);
break ;
2008-04-18 23:09:30 +02:00
}
2007-07-10 09:34:30 +02:00
$row [ 'ts_start' ] = $row [ 'ts_unitprice' ] = '' ;
if ( ! $this -> quantity_sum ) $row [ 'ts_quantity' ] = '' ;
2006-03-27 00:11:58 +02:00
$row [ 'class' ] = 'th' ;
$row [ 'titleClass' ] = 'titleSum' ;
continue ;
}
2005-12-19 05:23:14 +01:00
if ( ! $this -> check_acl ( EGW_ACL_EDIT , $row ))
{
$readonlys [ " edit[ $row[ts_id] ] " ] = true ;
}
if ( ! $this -> check_acl ( EGW_ACL_DELETE , $row ))
{
$readonlys [ " delete[ $row[ts_id] ] " ] = true ;
}
if ( $query [ 'col_filter' ][ 'ts_project' ] || ! $query [ 'filter2' ])
{
unset ( $row [ 'ts_project' ]); // dont need or want to show it
}
2008-03-09 08:33:42 +01:00
elseif ( $links [ $row [ 'ts_id' ]])
2005-12-19 05:23:14 +01:00
{
2008-03-09 08:33:42 +01:00
foreach ( $links [ $row [ 'ts_id' ]] as $link )
2005-12-19 05:23:14 +01:00
{
2008-03-09 08:33:42 +01:00
if ( $link [ 'app' ] == 'projectmanager' )
{
$row [ 'ts_link' ] = $link ;
$row [ 'ts_link' ][ 'title' ] = $row [ 'ts_project' ];
break ;
}
2005-12-19 05:23:14 +01:00
}
}
2011-02-04 21:03:42 +01:00
$readonlys [ " document[ { $row [ 'ts_id' ] } ] " ] = ! $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'timesheet' ][ 'default_document' ];
2005-12-19 05:23:14 +01:00
if ( ! $query [ 'filter2' ])
{
unset ( $row [ 'ts_description' ]);
}
2006-03-27 00:11:58 +02:00
else
{
$row [ 'titleClass' ] = 'titleDetails' ;
}
2005-12-19 05:23:14 +01:00
}
2007-03-07 13:31:48 +01:00
if ( ! $have_cats || $query [ 'cat_id' ]) $rows [ 'no_cat_id' ] = true ;
2006-03-27 14:20:06 +02:00
if ( $query [ 'col_filter' ][ 'ts_owner' ]) $rows [ 'ownerClass' ] = 'noPrint' ;
2005-12-19 05:23:14 +01:00
$rows [ 'no_owner_col' ] = $query [ 'no_owner_col' ];
2009-04-20 16:06:13 +02:00
if ( ! $rows [ 'no_owner_col' ] && $query [ 'selectcols' ] && ! strpos ( $query [ 'selectcols' ], 'ts_owner' )) $rows [ 'no_owner_col' ] = 1 ;
2005-12-19 05:23:14 +01:00
if ( $query [ 'filter' ])
{
2007-07-10 09:34:30 +02:00
$rows += $this -> summary ;
2005-12-19 05:23:14 +01:00
}
2006-09-12 17:21:23 +02:00
$rows [ 'pm_integration' ] = $this -> pm_integration ;
2009-02-16 09:36:22 +01:00
$rows [ 'ts_viewtype' ] = $rows [ 'no_ts_quantity' ] = $rows [ 'no_ts_unitprice' ] = $rows [ 'no_ts_total' ] = $this -> ts_viewtype == 'short' ;
2009-05-06 09:04:29 +02:00
if ( ! $rows [ 'ts_viewtype' ])
{
2009-02-16 09:36:22 +01:00
#_debug_array($query['selectcols']);
#ts_quantity,ts_unitprice,ts_total
2009-04-20 16:06:13 +02:00
if ( $query [ 'selectcols' ] && strpos ( $query [ 'selectcols' ], 'ts_quantity' ) === false ) $rows [ 'no_ts_quantity' ] = 1 ;
if ( $query [ 'selectcols' ] && strpos ( $query [ 'selectcols' ], 'ts_unitprice' ) === false ) $rows [ 'no_ts_unitprice' ] = 1 ;
if ( $query [ 'selectcols' ] && strpos ( $query [ 'selectcols' ], 'ts_total' ) === false ) $rows [ 'no_ts_total' ] = 1 ;
2009-02-16 09:36:22 +01:00
}
2010-05-04 17:37:30 +02:00
$rows [ 'no_ts_status' ] = strpos ( $query [ 'selectcols' ], 'ts_status' ) === false || $query [ 'no_status' ];
2010-03-23 13:54:00 +01:00
2008-04-18 23:09:30 +02:00
return $total ;
2005-12-19 05:23:14 +01:00
}
/**
* List timesheet entries
*
* @ param array $content = null
2006-09-12 17:21:23 +02:00
* @ param string $msg = ''
2005-12-19 05:23:14 +01:00
*/
function index ( $content = null , $msg = '' )
{
2009-06-08 18:21:14 +02:00
$etpl = new etemplate ( 'timesheet.index' );
2008-04-18 23:09:30 +02:00
2005-12-19 05:23:14 +01:00
if ( $_GET [ 'msg' ]) $msg = $_GET [ 'msg' ];
2006-01-11 06:17:15 +01:00
if ( $content [ 'nm' ][ 'rows' ][ 'delete' ])
{
list ( $ts_id ) = each ( $content [ 'nm' ][ 'rows' ][ 'delete' ]);
if ( $this -> delete ( $ts_id ))
{
$msg = lang ( 'Entry deleted' );
}
else
{
$msg = lang ( 'Error deleting the entry!!!' );
}
}
2011-02-04 21:03:42 +01:00
if ( is_array ( $content ) && isset ( $content [ 'nm' ][ 'rows' ][ 'document' ])) // handle insert in default document button like an action
{
list ( $id ) = @ each ( $content [ 'nm' ][ 'rows' ][ 'document' ]);
$content [ 'action' ] = 'document' ;
$content [ 'nm' ][ 'rows' ][ 'checked' ] = array ( $id );
}
2009-03-23 10:53:03 +01:00
if ( $content [ 'action' ] != '' )
{
if ( ! count ( $content [ 'nm' ][ 'rows' ][ 'checked' ]) && ! $content [ 'use_all' ])
{
$msg = lang ( 'You need to select some timesheets first' );
}
else
{
2010-12-10 19:03:46 +01:00
// Action has a parameter - cat_id, percent, etc
$multi_action = $content [ 'action' ];
if ( in_array ( $multi_action , array ( 'cat' )))
{
if ( is_array ( $content [ $multi_action ]))
{
$content [ $multi_action ] = implode ( ',' , $content [ $multi_action ]);
}
$content [ 'action' ] .= '_' . $content [ $multi_action ];
}
2009-03-23 10:53:03 +01:00
if ( $this -> action ( $content [ 'action' ], $content [ 'nm' ][ 'rows' ][ 'checked' ], $content [ 'use_all' ],
2010-02-23 00:02:25 +01:00
$success , $failed , $action_msg , 'index' , $msg ))
2009-03-23 10:53:03 +01:00
{
$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 );
}
}
}
2005-12-19 05:23:14 +01:00
$content = array (
2009-05-06 09:04:29 +02:00
'nm' => $GLOBALS [ 'egw' ] -> session -> appsession ( 'index' , TIMESHEET_APP ),
'msg' => $msg ,
2008-04-18 23:09:30 +02:00
);
2005-12-19 05:23:14 +01:00
if ( ! is_array ( $content [ 'nm' ]))
{
$date_filters = array ( 'All' );
foreach ( $this -> date_filters as $name => $date )
{
$date_filters [ $name ] = $name ;
}
2006-03-21 23:18:29 +01:00
$date_filters [ 'custom' ] = 'custom' ;
2005-12-19 05:23:14 +01:00
$content [ 'nm' ] = array (
2009-05-06 09:04:29 +02:00
'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' ],
2005-12-19 05:23:14 +01:00
);
}
2010-03-23 13:54:00 +01:00
if ( $_GET [ 'search' ])
{
2009-12-09 00:19:06 +01:00
$content [ 'nm' ][ 'search' ] = $_GET [ 'search' ];
}
2005-12-19 05:23:14 +01:00
$read_grants = $this -> grant_list ( EGW_ACL_READ );
$content [ 'nm' ][ 'no_owner_col' ] = count ( $read_grants ) == 1 ;
2009-04-20 16:06:13 +02:00
if ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'timesheet' ][ 'nextmatch-timesheet.index.rows' ]) $content [ 'nm' ][ 'selectcols' ] = $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'timesheet' ][ 'nextmatch-timesheet.index.rows' ];
2006-09-14 20:31:46 +02:00
$sel_options = array (
2009-05-06 09:04:29 +02:00
'ts_owner' => $read_grants ,
'pm_id' => array ( lang ( 'No project' )),
'cat_id' => array ( lang ( 'None' )),
2009-08-17 20:46:47 +02:00
'ts_status' => $this -> status_labels + array ( lang ( 'No status' )),
2006-09-14 20:31:46 +02:00
);
2010-03-23 13:54:00 +01:00
$content [ 'nm' ][ 'no_status' ] = count ( $sel_options [ 'ts_status' ]) <= 1 ; // 1 because of 'No status'
2009-03-23 10:53:03 +01:00
$status = array ();
$sel_options [ 'action' ] [ 'delete' ] = lang ( 'Delete Timesheet' );
2010-12-10 19:03:46 +01:00
$sel_options [ 'action' ][ 'cat' ] = lang ( 'Change category' );
2009-03-23 10:53:03 +01:00
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 );
2011-02-04 21:03:42 +01:00
// Merge print
if ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'timesheet' ][ 'document_dir' ])
{
$sel_options [ 'action' ][ lang ( 'Insert in document' ) . ':' ] = timesheet_merge :: get_documents ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'timesheet' ][ 'document_dir' ]);
}
2009-03-23 10:53:03 +01:00
2006-09-14 20:31:46 +02:00
if ( $this -> pm_integration != 'full' )
{
$projects =& $this -> query_list ( 'ts_project' );
if ( ! is_array ( $projects )) $projects = array ();
$sel_options [ 'ts_project' ] = $projects + array ( lang ( 'No project' ));
}
2007-05-09 10:21:26 +02:00
// 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 ;
2008-10-07 10:57:09 +02:00
return $etpl -> exec ( TIMESHEET_APP . '.timesheet_ui.index' , $content , $sel_options , $readonlys , $preserv );
2005-12-19 05:23:14 +01:00
}
2007-03-08 12:22:57 +01:00
2009-03-23 10:53:03 +01:00
/**
* 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' ;
}
2010-12-10 19:03:46 +01:00
else
{
// Dialogs to get options
list ( $action , $settings ) = explode ( '_' , $action , 2 );
}
2009-03-23 10:53:03 +01:00
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 ;
2010-12-10 19:03:46 +01:00
case 'cat' :
$cat_name = categories :: id2name ( $settings );
$action_msg = lang ( 'changed category to %1' , $cat_name );
foreach (( array ) $checked as $n => $id ) {
$entry = $this -> read ( $id );
$entry [ 'cat_id' ] = $settings ;
if ( $this -> save ( $entry ) == 0 )
{
$success ++ ;
}
else
{
$failed ++ ;
}
}
break ;
2011-02-04 21:03:42 +01:00
case 'document' :
$msg = $this -> download_document ( $checked , $settings );
$failed = count ( $checked );
return false ;
2009-03-23 10:53:03 +01:00
}
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' ]);
2010-03-23 13:54:00 +01:00
unset ( $content [ 'button' ]);
2009-03-23 10:53:03 +01:00
switch ( $button )
{
case 'delete' :
break ;
case 'apply' :
case 'save' :
foreach ( $content [ 'statis' ] as $cat )
{
$id = $cat [ 'id' ];
2009-09-08 11:23:41 +02:00
if (( $cat [ 'name' ] !== $this -> status_labels_config [ $id ]) && ( $cat [ 'name' ] !== '' ) || ( $cat [ 'parent' ] !== $this -> status_labels_config [ $id ][ 'parent' ]) && ( $cat [ 'parent' ] !== '' ))
2009-03-23 10:53:03 +01:00
{
$this -> status_labels [ $id ] = $cat [ 'name' ];
2009-09-08 11:23:41 +02:00
$this -> status_labels_config [ $id ] = array (
'name' => $cat [ 'name' ],
'parent' => $cat [ 'parent' ],
'admin' => $cat [ 'admin' ]);
2009-03-23 10:53:03 +01:00
$need_update = true ;
}
}
if ( $need_update )
{
2009-09-08 11:23:41 +02:00
config :: save_value ( 'status_labels' , $this -> status_labels_config , TIMESHEET_APP );
2009-03-23 10:53:03 +01:00
$msg .= lang ( 'Status updated.' );
}
2010-03-23 13:54:00 +01:00
if ( $button == 'apply' ) break ;
// fall-through
case 'cancel' :
$GLOBALS [ 'egw' ] -> redirect_link ( '/index.php' , array (
'menuaction' => 'timesheet.timesheet_ui.index' ,
'msg' => $msg ,
));
break ;
2009-03-23 10:53:03 +01:00
}
}
if ( isset ( $content [ 'statis' ][ 'delete' ]))
{
list ( $id ) = each ( $content [ 'statis' ][ 'delete' ]);
2009-09-08 11:23:41 +02:00
if ( isset ( $this -> status_labels_config [ $id ]))
2009-03-23 10:53:03 +01:00
{
2009-09-08 11:23:41 +02:00
unset ( $this -> status_labels_config [ $id ]);
config :: save_value ( 'status_labels' , $this -> status_labels_config , TIMESHEET_APP );
2009-03-23 10:53:03 +01:00
unset ( $this -> status_labels [ $id ]);
$msg .= lang ( 'Status deleted.' );
}
}
$i = 1 ;
unset ( $content [ 'statis' ]);
2009-09-08 11:23:41 +02:00
foreach ( $this -> status_labels_config as $id => $label )
2009-03-23 10:53:03 +01:00
{
2009-09-08 11:23:41 +02:00
$content [ 'statis' ][ $i ][ 'name' ] = $label [ 'name' ];
2009-03-23 10:53:03 +01:00
$content [ 'statis' ][ $i ][ 'id' ] = $id ;
2009-09-08 11:23:41 +02:00
$content [ 'statis' ][ $i ][ 'parent' ] = $label [ 'parent' ];
$content [ 'statis' ][ $i ][ 'admin' ] = $label [ 'admin' ];
2009-03-23 10:53:03 +01:00
$i ++ ;
}
$content [ 'statis' ][ $i ][ 'name' ] = '' ;
2009-09-08 11:23:41 +02:00
$content [ 'statis' ][ $i ][ 'parent' ];
$content [ 'statis' ][ $i ][ 'admin' ] = '' ;
2009-03-23 10:53:03 +01:00
$content [ 'statis' ][ $i ][ 'id' ] = ++ $id ;
$content [ 'msg' ] = $msg ;
$preserv = $content ;
2009-09-08 11:23:41 +02:00
$sel_options [ 'parent' ] = $this -> status_labels ;
2009-03-23 10:53:03 +01:00
$etpl = new etemplate ( 'timesheet.editstatus' );
$etpl -> exec ( 'timesheet.timesheet_ui.editstatus' , $content , $sel_options , $readonlys , $preserv );
}
2007-03-08 12:22:57 +01:00
function js ()
{
return ' < script LANGUAGE = " JavaScript " >
function timesheet_export ()
{
egw_openWindowCentered (
" '. $GLOBALS['egw'] ->link('/index.php','menuaction=importexport.uiexport.export_dialog&appname=timesheet&selection=use_all') . ' " ,
" Export " , 400 , 400 );
return false ;
}
2009-03-23 10:53:03 +01:00
2010-12-10 19:03:46 +01:00
/**
* Javascript handling for multiple entry actions
*/
2009-03-23 10:53:03 +01:00
function do_action ( selbox )
{
2010-12-10 19:03:46 +01:00
if ( selbox . value == " " ) return ;
var prefix = selbox . id . substring ( 0 , selbox . id . indexOf ( " [ " ));
var popup = document . getElementById ( prefix + " [ " + selbox . value + " _popup] " );
if ( popup ) {
popup . style . display = " block " ;
return ;
2009-03-23 10:53:03 +01:00
}
2010-12-10 19:03:46 +01:00
selbox . form . submit ();
selbox . value = " " ;
2009-03-23 10:53:03 +01:00
}
2010-12-10 19:03:46 +01:00
/**
* Hide popup and clear values
*/
function hide_popup ( element , div_id ) {
var prefix = element . id . substring ( 0 , element . id . indexOf ( " [ " ));
var popup = document . getElementById ( prefix + " [ " + div_id + " ] " );
if ( popup ) {
popup . style . display = " none " ;
}
}
2007-03-08 12:22:57 +01:00
</ script > ' ;
}
2011-02-04 21:03:42 +01:00
/**
* Download a document with inserted entries
*
* @ param array $ids timesheet - ids
* @ param string $document vfs - path of document
* @ return string error - message or error , otherwise the function does NOT return !
*/
function download_document ( $ids , $document = '' )
{
if ( ! $document )
{
$document = $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'timesheet' ][ 'default_document' ];
}
else
{
$document = $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'timesheet' ][ 'document_dir' ] . '/' . $document ;
}
if ( !@ egw_vfs :: stat ( $document ))
{
return lang ( " Document '%1' does not exist or is not readable for you! " , $document );
}
require_once ( EGW_INCLUDE_ROOT . '/timesheet/inc/class.timesheet_merge.inc.php' );
$document_merge = new timesheet_merge ();
return $document_merge -> download ( $document , $ids );
}
2006-01-11 06:17:15 +01:00
}