2011-07-13 14:30:19 +02:00
< ? php
2016-10-02 23:00:01 +02:00
use Engelsystem\ShiftsFilter ;
2014-09-28 19:44:53 +02:00
2017-01-03 03:22:48 +01:00
/**
* @ return string
*/
2017-01-02 03:57:23 +01:00
function shifts_title ()
{
return _ ( " Shifts " );
2013-11-25 21:04:58 +01:00
}
2016-10-02 21:19:03 +02:00
/**
* Start different controllers for deleting shifts and shift_entries , edit shifts and add shift entries .
2016-11-17 14:35:04 +01:00
* FIXME :
* Transform into shift controller and shift entry controller .
* Split actions into shift edit , shift delete , shift entry edit , shift entry delete
* Introduce simpler and beautiful actions for shift entry join / leave for users
2017-01-03 03:22:48 +01:00
*
* @ return string
2016-10-02 21:19:03 +02:00
*/
2017-01-02 03:57:23 +01:00
function user_shifts ()
{
global $user ;
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
if ( User_is_freeloader ( $user )) {
redirect ( page_link_to ( 'user_myshifts' ));
}
2017-01-02 15:43:36 +01:00
// Löschen einzelner Schicht-Einträge (Also Belegung einer Schicht von Engeln) durch Admins
if ( isset ( $_REQUEST [ 'entry_id' ])) {
2017-01-03 03:22:48 +01:00
shift_entry_delete_controller ();
return '' ;
2017-01-02 15:43:36 +01:00
} elseif ( isset ( $_REQUEST [ 'edit_shift' ])) {
return shift_edit_controller ();
} elseif ( isset ( $_REQUEST [ 'delete_shift' ])) {
return shift_delete_controller ();
} elseif ( isset ( $_REQUEST [ 'shift_id' ])) {
return shift_entry_add_controller ();
}
2017-01-02 03:57:23 +01:00
return view_user_shifts ();
2011-12-28 14:45:49 +01:00
}
2011-12-27 22:13:17 +01:00
2016-10-04 18:36:57 +02:00
/**
* Helper function that updates the start and end time from request data .
* Use update_ShiftsFilter () .
*
2017-01-03 03:22:48 +01:00
* @ param ShiftsFilter $shiftsFilter The shiftfilter to update .
* @ param string [] $days
2016-10-04 18:36:57 +02:00
*/
2017-01-02 03:57:23 +01:00
function update_ShiftsFilter_timerange ( ShiftsFilter $shiftsFilter , $days )
{
$start_time = $shiftsFilter -> getStartTime ();
if ( $start_time == null ) {
$start_time = time ();
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$end_time = $shiftsFilter -> getEndTime ();
if ( $end_time == null ) {
$end_time = $start_time + 24 * 60 * 60 ;
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$shiftsFilter -> setStartTime ( check_request_datetime ( 'start_day' , 'start_time' , $days , $start_time ));
$shiftsFilter -> setEndTime ( check_request_datetime ( 'end_day' , 'end_time' , $days , $end_time ));
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
if ( $shiftsFilter -> getStartTime () > $shiftsFilter -> getEndTime ()) {
$shiftsFilter -> setEndTime ( $shiftsFilter -> getStartTime () + 24 * 60 * 60 );
}
2016-10-04 18:36:57 +02:00
}
2016-10-02 23:00:01 +02:00
/**
* Update given ShiftsFilter with filter params from user input
*
2016-10-04 18:36:57 +02:00
* @ param ShiftsFilter $shiftsFilter
* The shifts filter to update from request data
2017-01-02 15:43:36 +01:00
* @ param boolean $user_shifts_admin
2016-10-04 18:36:57 +02:00
* Has the user user_shift_admin privilege ?
2017-01-02 15:43:36 +01:00
* @ param string [] $days
2016-10-04 18:36:57 +02:00
* An array of available filter days
2016-10-02 23:00:01 +02:00
*/
2017-01-02 03:57:23 +01:00
function update_ShiftsFilter ( ShiftsFilter $shiftsFilter , $user_shifts_admin , $days )
{
$shiftsFilter -> setUserShiftsAdmin ( $user_shifts_admin );
$shiftsFilter -> setFilled ( check_request_int_array ( 'filled' , $shiftsFilter -> getFilled ()));
$shiftsFilter -> setRooms ( check_request_int_array ( 'rooms' , $shiftsFilter -> getRooms ()));
$shiftsFilter -> setTypes ( check_request_int_array ( 'types' , $shiftsFilter -> getTypes ()));
update_ShiftsFilter_timerange ( $shiftsFilter , $days );
2016-10-02 23:00:01 +02:00
}
2017-01-03 03:22:48 +01:00
/**
* @ return array
*/
2017-01-02 03:57:23 +01:00
function load_rooms ()
{
$rooms = sql_select ( " SELECT `RID` AS `id`, `Name` AS `name` FROM `Room` WHERE `show`='Y' ORDER BY `Name` " );
2017-01-03 03:22:48 +01:00
if ( ! $rooms || count ( $rooms ) == 0 ) {
2017-01-02 03:57:23 +01:00
error ( _ ( " The administration has not configured any rooms yet. " ));
redirect ( '?' );
}
return $rooms ;
2016-10-04 18:36:57 +02:00
}
2017-01-03 03:22:48 +01:00
/**
* @ return array
*/
2017-01-02 03:57:23 +01:00
function load_days ()
{
$days = sql_select_single_col ( "
2015-08-26 15:03:53 +02:00
SELECT DISTINCT DATE ( FROM_UNIXTIME ( `start` )) AS `id` , DATE ( FROM_UNIXTIME ( `start` )) AS `name`
FROM `Shifts`
2014-12-17 17:22:35 +01:00
ORDER BY `start` " );
2017-01-02 03:57:23 +01:00
if ( count ( $days ) == 0 ) {
error ( _ ( " The administration has not configured any shifts yet. " ));
redirect ( '?' );
}
return $days ;
2016-10-04 18:36:57 +02:00
}
2017-01-03 03:22:48 +01:00
/**
* @ return array | false
*/
2017-01-02 03:57:23 +01:00
function load_types ()
{
global $user ;
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
if ( sql_num_query ( " SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0 " ) == 0 ) {
error ( _ ( " The administration has not configured any angeltypes yet - or you are not subscribed to any angeltype. " ));
redirect ( '?' );
}
2017-01-02 15:43:36 +01:00
$types = sql_select ( "
SELECT
`AngelTypes` . `id` ,
`AngelTypes` . `name` ,
(
`AngelTypes` . `restricted` = 0
OR (
NOT `UserAngelTypes` . `confirm_user_id` IS NULL
OR `UserAngelTypes` . `id` IS NULL
)
) AS `enabled`
FROM `AngelTypes`
LEFT JOIN `UserAngelTypes`
ON (
`UserAngelTypes` . `angeltype_id` = `AngelTypes` . `id`
AND `UserAngelTypes` . `user_id` = '" . sql_escape($user[' UID ']) . "'
)
ORDER BY `AngelTypes` . `name`
" );
2017-01-02 03:57:23 +01:00
if ( empty ( $types )) {
return sql_select ( " SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0 " );
}
return $types ;
2016-10-04 18:36:57 +02:00
}
2017-01-03 03:22:48 +01:00
/**
* @ return string
*/
2017-01-02 03:57:23 +01:00
function view_user_shifts ()
{
2017-01-03 03:22:48 +01:00
global $user , $privileges , $ical_shifts ;
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$ical_shifts = [];
$days = load_days ();
$rooms = load_rooms ();
$types = load_types ();
2017-01-02 15:43:36 +01:00
if ( ! isset ( $_SESSION [ 'ShiftsFilter' ])) {
2017-01-02 03:57:23 +01:00
$room_ids = [
2017-01-02 15:43:36 +01:00
$rooms [ 0 ][ 'id' ]
];
2017-01-02 03:57:23 +01:00
$type_ids = array_map ( 'get_ids_from_array' , $types );
$_SESSION [ 'ShiftsFilter' ] = new ShiftsFilter ( in_array ( 'user_shifts_admin' , $privileges ), $room_ids , $type_ids );
}
update_ShiftsFilter ( $_SESSION [ 'ShiftsFilter' ], in_array ( 'user_shifts_admin' , $privileges ), $days );
$shiftsFilter = $_SESSION [ 'ShiftsFilter' ];
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$shiftCalendarRenderer = shiftCalendarRendererByShiftFilter ( $shiftsFilter );
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
if ( $user [ 'api_key' ] == " " ) {
User_reset_api_key ( $user , false );
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$filled = [
2017-01-02 15:43:36 +01:00
[
'id' => '1' ,
'name' => _ ( " occupied " )
],
[
'id' => '0' ,
'name' => _ ( " free " )
]
];
2017-01-02 03:57:23 +01:00
$start_day = date ( " Y-m-d " , $shiftsFilter -> getStartTime ());
$start_time = date ( " H:i " , $shiftsFilter -> getStartTime ());
$end_day = date ( " Y-m-d " , $shiftsFilter -> getEndTime ());
$end_time = date ( " H:i " , $shiftsFilter -> getEndTime ());
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return page ([
2017-01-02 15:43:36 +01:00
div ( 'col-md-12' , [
msg (),
template_render ( __DIR__ . '/../../templates/user_shifts.html' , [
'title' => shifts_title (),
'room_select' => make_select ( $rooms , $shiftsFilter -> getRooms (), " rooms " , _ ( " Rooms " )),
'start_select' => html_select_key ( " start_day " , " start_day " , array_combine ( $days , $days ), $start_day ),
'start_time' => $start_time ,
'end_select' => html_select_key ( " end_day " , " end_day " , array_combine ( $days , $days ), $end_day ),
'end_time' => $end_time ,
'type_select' => make_select (
$types ,
$shiftsFilter -> getTypes (),
" types " ,
_ ( " Angeltypes " ) . '<sup>1</sup>'
),
'filled_select' => make_select ( $filled , $shiftsFilter -> getFilled (), " filled " , _ ( " Occupancy " )),
'task_notice' =>
'<sup>1</sup>'
. _ ( " The tasks shown here are influenced by the angeltypes you joined already! " )
2017-01-03 03:22:48 +01:00
. ' <a href="' . page_link_to ( 'angeltypes' ) . '&action=about' . '">'
2017-01-02 15:43:36 +01:00
. _ ( " Description of the jobs. " )
2017-01-03 03:22:48 +01:00
. '</a>' ,
2017-01-02 15:43:36 +01:00
'shifts_table' => msg () . $shiftCalendarRenderer -> render (),
'ical_text' => '<h2>' . _ ( " iCal export " ) . '</h2><p>' . sprintf (
_ ( " Export of shown shifts. <a href= \" %s \" >iCal format</a> or <a href= \" %s \" >JSON format</a> available (please keep secret, otherwise <a href= \" %s \" >reset the api key</a>). " ),
page_link_to_absolute ( 'ical' ) . '&key=' . $user [ 'api_key' ],
page_link_to_absolute ( 'shifts_json_export' ) . '&key=' . $user [ 'api_key' ],
page_link_to ( 'user_myshifts' ) . '&reset'
) . '</p>' ,
'filter' => _ ( " Filter " )
])
])
]);
2011-12-28 14:45:49 +01:00
}
2017-01-03 03:22:48 +01:00
/**
* @ param array $array
* @ return array
*/
2017-01-02 03:57:23 +01:00
function get_ids_from_array ( $array )
{
return $array [ " id " ];
2011-07-13 14:30:19 +02:00
}
2017-01-02 03:57:23 +01:00
function make_select ( $items , $selected , $name , $title = null )
{
$html_items = [];
if ( isset ( $title )) {
$html_items [] = '<h4>' . $title . '</h4>' . " \n " ;
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
foreach ( $items as $i ) {
2017-01-02 15:43:36 +01:00
$html_items [] = '<div class="checkbox">'
2017-01-03 03:22:48 +01:00
. '<label><input type="checkbox" name="' . $name . '[]" value="' . $i [ 'id' ] . '" '
2017-01-02 15:43:36 +01:00
. ( in_array ( $i [ 'id' ], $selected ) ? ' checked="checked"' : '' )
2017-01-03 03:22:48 +01:00
. ' > ' . $i [ 'name' ] . '</label>'
2017-01-02 15:43:36 +01:00
. ( ! isset ( $i [ 'enabled' ]) || $i [ 'enabled' ] ? '' : glyph ( " lock " ))
. '</div><br />' ;
2017-01-02 03:57:23 +01:00
}
$html = '<div id="selection_' . $name . '" class="selection ' . $name . '">' . " \n " ;
$html .= implode ( " \n " , $html_items );
$html .= buttons ([
2017-01-02 15:43:36 +01:00
button ( " javascript: checkAll('selection_ " . $name . " ', true) " , _ ( " All " ), " " ),
button ( " javascript: checkAll('selection_ " . $name . " ', false) " , _ ( " None " ), " " )
]);
2017-01-02 03:57:23 +01:00
$html .= '</div>' . " \n " ;
return $html ;
2011-07-13 14:30:19 +02:00
}