2011-07-13 14:30:19 +02:00
< ? php
2016-10-02 23:00:01 +02:00
use Engelsystem\ShiftsFilter ;
2016-11-07 20:55:37 +01:00
use Engelsystem\ShiftCalendarRenderer ;
2014-09-28 19:44:53 +02:00
2013-11-25 21:04:58 +01:00
function shifts_title () {
2014-09-24 15:03:41 +02:00
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 .
*/
2011-07-13 14:30:19 +02:00
function user_shifts () {
2016-10-04 16:16:00 +02:00
global $user ;
2016-09-29 10:53:17 +02:00
if ( User_is_freeloader ( $user )) {
2013-12-27 18:45:27 +01:00
redirect ( page_link_to ( 'user_myshifts' ));
2016-09-29 10:53:17 +02:00
}
// Löschen einzelner Schicht-Einträge (Also Belegung einer Schicht von Engeln) durch Admins
2016-10-02 21:19:03 +02:00
if ( isset ( $_REQUEST [ 'entry_id' ])) {
return shift_entry_delete_controller ();
} elseif ( isset ( $_REQUEST [ 'edit_shift' ])) {
return shift_edit_controller ();
} elseif ( isset ( $_REQUEST [ 'delete_shift' ])) {
return shift_delete_controller ();
2013-11-25 21:56:56 +01:00
} elseif ( isset ( $_REQUEST [ 'shift_id' ])) {
2016-10-02 21:19:03 +02:00
return shift_entry_add_controller ();
2012-05-19 16:41:00 +02:00
}
2016-10-02 21:19:03 +02: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 () .
*
* @ param ShiftsFilter $shiftsFilter
* The shiftfilter to update .
*/
2016-10-04 18:52:52 +02:00
function update_ShiftsFilter_timerange ( ShiftsFilter $shiftsFilter , $days ) {
2016-11-15 22:00:17 +01:00
$start_time = $shiftsFilter -> getStartTime ();
if ( $start_time == null ) {
$start_time = time ();
}
$end_time = $shiftsFilter -> getEndTime ();
if ( $end_time == null ) {
$end_time = $start_time + 24 * 60 * 60 ;
}
$shiftsFilter -> setStartTime ( check_request_datetime ( 'start_day' , 'start_time' , $days , $start_time ));
$shiftsFilter -> setEndTime ( check_request_datetime ( 'end_day' , 'end_time' , $days , $end_time ));
2016-10-04 18:36:57 +02:00
2016-10-04 18:52:52 +02: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
* @ param boolean $user_shifts_admin
* Has the user user_shift_admin privilege ?
* @ param string [] $days
* An array of available filter days
2016-10-02 23:00:01 +02:00
*/
function update_ShiftsFilter ( ShiftsFilter $shiftsFilter , $user_shifts_admin , $days ) {
$shiftsFilter -> setUserShiftsAdmin ( $user_shifts_admin );
2016-11-15 22:00:17 +01:00
$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
}
2016-10-04 18:36:57 +02:00
function load_rooms () {
$rooms = sql_select ( " SELECT `RID` AS `id`, `Name` AS `name` FROM `Room` WHERE `show`='Y' ORDER BY `Name` " );
if ( count ( $rooms ) == 0 ) {
error ( _ ( " The administration has not configured any rooms yet. " ));
redirect ( '?' );
}
return $rooms ;
}
function load_days () {
2014-12-17 17:22:35 +01:00
$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` " );
2014-03-26 18:51:34 +01:00
if ( count ( $days ) == 0 ) {
error ( _ ( " The administration has not configured any shifts yet. " ));
redirect ( '?' );
}
2016-10-04 18:36:57 +02:00
return $days ;
}
function load_types () {
global $user ;
2016-09-29 10:53:17 +02:00
2016-10-04 18:36:57 +02: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. " ));
2014-03-12 17:36:55 +01:00
redirect ( '?' );
}
2016-10-04 18:36:57 +02: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` " );
2016-09-29 10:53:17 +02:00
if ( empty ( $types )) {
2016-10-04 18:36:57 +02:00
return sql_select ( " SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0 " );
2016-09-29 10:53:17 +02:00
}
2016-10-04 18:36:57 +02:00
return $types ;
}
function view_user_shifts () {
global $user , $privileges ;
global $ical_shifts ;
2016-09-29 10:53:17 +02:00
2016-10-04 18:36:57 +02:00
$ical_shifts = [];
$days = load_days ();
$rooms = load_rooms ();
$types = load_types ();
2016-09-29 10:53:17 +02:00
2016-10-02 23:00:01 +02:00
if ( ! isset ( $_SESSION [ 'ShiftsFilter' ])) {
$room_ids = array_map ( 'get_ids_from_array' , $rooms );
$type_ids = array_map ( 'get_ids_from_array' , $types );
$_SESSION [ 'ShiftsFilter' ] = new ShiftsFilter ( in_array ( 'user_shifts_admin' , $privileges ), $room_ids , $type_ids );
2016-09-29 10:53:17 +02:00
}
2016-10-02 23:32:10 +02:00
update_ShiftsFilter ( $_SESSION [ 'ShiftsFilter' ], in_array ( 'user_shifts_admin' , $privileges ), $days );
2016-10-02 23:00:01 +02:00
$shiftsFilter = $_SESSION [ 'ShiftsFilter' ];
2016-09-29 10:53:17 +02:00
2016-10-02 23:00:01 +02:00
$shifts = Shifts_by_ShiftsFilter ( $shiftsFilter , $user );
2016-09-29 10:53:17 +02:00
2014-12-17 17:22:35 +01:00
$ownshifts_source = sql_select ( "
2015-08-26 15:03:53 +02:00
SELECT `ShiftTypes` . `name` , `Shifts` .*
FROM `Shifts`
2014-12-17 17:22:35 +01:00
INNER JOIN `ShiftTypes` ON ( `ShiftTypes` . `id` = `Shifts` . `shifttype_id` )
INNER JOIN `ShiftEntry` ON ( `Shifts` . `SID` = `ShiftEntry` . `SID` AND `ShiftEntry` . `UID` = '" . sql_escape($user[' UID ']) . "' )
2016-10-02 23:00:01 +02:00
WHERE `Shifts` . `RID` IN ( " . implode(',', $shiftsFilter->getRooms ()) . " )
AND `start` BETWEEN " . $shiftsFilter->getStartTime () . " AND " . $shiftsFilter->getEndTime ());
2016-09-29 10:53:17 +02:00
$ownshifts = [];
foreach ( $ownshifts_source as $ownshift ) {
2012-12-30 12:09:48 +01:00
$ownshifts [ $ownshift [ 'SID' ]] = $ownshift ;
2016-09-29 10:53:17 +02:00
}
2012-12-30 12:09:48 +01:00
unset ( $ownshifts_source );
2016-09-29 10:53:17 +02:00
if ( $user [ 'api_key' ] == " " ) {
2014-12-16 00:54:50 +01:00
User_reset_api_key ( $user , false );
2016-09-29 10:53:17 +02:00
}
2016-10-02 23:00:01 +02:00
$filled = [
[
'id' => '1' ,
'name' => _ ( " occupied " )
],
[
'id' => '0' ,
'name' => _ ( " free " )
]
];
$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 ());
2016-11-07 20:55:37 +01:00
$shiftCalendarRenderer = new ShiftCalendarRenderer ( $shifts , $shiftsFilter );
2016-09-29 10:53:17 +02:00
return page ([
div ( 'col-md-12' , [
msg (),
template_render ( '../templates/user_shifts.html' , [
'title' => shifts_title (),
2016-10-02 23:00:01 +02:00
'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! " ) . " <a href= \" " . page_link_to ( 'angeltypes' ) . '&action=about' . " \" > " . _ ( " Description of the jobs. " ) . " </a> " ,
2016-11-07 20:55:37 +01:00
'shifts_table' => msg () . $shiftCalendarRenderer -> render (),
2016-09-29 10:53:17 +02:00
'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
}
2011-12-27 22:13:17 +01:00
function get_ids_from_array ( $array ) {
2012-05-19 16:41:00 +02:00
return $array [ " id " ];
2011-07-13 14:30:19 +02:00
}
2011-12-27 22:13:17 +01:00
function make_select ( $items , $selected , $name , $title = null ) {
2016-09-29 10:53:17 +02:00
$html_items = [];
if ( isset ( $title )) {
2014-08-22 22:34:13 +02:00
$html_items [] = '<h4>' . $title . '</h4>' . " \n " ;
2016-09-29 10:53:17 +02:00
}
foreach ( $items as $i ) {
2014-12-06 18:16:18 +01:00
$html_items [] = '<div class="checkbox"><label><input type="checkbox" name="' . $name . '[]" value="' . $i [ 'id' ] . '"' . ( in_array ( $i [ 'id' ], $selected ) ? ' checked="checked"' : '' ) . '> ' . $i [ 'name' ] . '</label>' . ( ! isset ( $i [ 'enabled' ]) || $i [ 'enabled' ] ? '' : glyph ( " lock " )) . '</div><br />' ;
2016-09-29 10:53:17 +02:00
}
2014-08-22 22:34:13 +02:00
$html = '<div id="selection_' . $name . '" class="selection ' . $name . '">' . " \n " ;
2012-05-19 16:41:00 +02:00
$html .= implode ( " \n " , $html_items );
2016-09-29 10:53:17 +02:00
$html .= buttons ([
2016-08-21 20:14:09 +02:00
button ( " javascript: checkAll('selection_ " . $name . " ', true) " , _ ( " All " ), " " ),
2016-09-29 10:53:17 +02:00
button ( " javascript: checkAll('selection_ " . $name . " ', false) " , _ ( " None " ), " " )
]);
2012-05-19 16:41:00 +02:00
$html .= '</div>' . " \n " ;
return $html ;
2011-07-13 14:30:19 +02:00
}
2011-08-13 14:37:54 +02:00
?>