2011-07-13 14:30:19 +02:00
< ? php
2017-01-21 13:58:53 +01:00
use Engelsystem\Database\DB ;
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 ()
{
2017-01-03 14:12:17 +01: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 .
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-07-18 21:38:53 +02:00
$request = request ();
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
2017-12-20 00:42:58 +01:00
if ( $request -> has ( 'edit_shift' )) {
2017-01-02 15:43:36 +01:00
return shift_edit_controller ();
2017-07-18 21:38:53 +02:00
} elseif ( $request -> has ( 'delete_shift' )) {
2017-01-02 15:43:36 +01:00
return shift_delete_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 ();
2018-01-14 17:47:26 +01:00
if ( is_null ( $start_time )) {
2017-01-02 03:57:23 +01:00
$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-12-25 23:12:52 +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
*
2017-01-21 13:58:53 +01: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
*/
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 ()
{
2017-01-21 13:58:53 +01:00
$rooms = DB :: select (
2017-12-10 15:02:37 +01:00
'SELECT `RID` AS `id`, `Name` AS `name` FROM `Room` ORDER BY `Name`'
2017-01-21 13:58:53 +01:00
);
if ( empty ( $rooms )) {
2017-01-03 14:12:17 +01:00
error ( _ ( 'The administration has not configured any rooms yet.' ));
2017-11-19 10:45:08 +01:00
redirect ( page_link_to ( '/' ));
2017-01-02 03:57:23 +01:00
}
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 ()
{
2017-01-21 13:58:53 +01:00
$days = DB :: select ( '
2015-08-26 15:03:53 +02:00
SELECT DISTINCT DATE ( FROM_UNIXTIME ( `start` )) AS `id` , DATE ( FROM_UNIXTIME ( `start` )) AS `name`
FROM `Shifts`
2017-09-25 19:51:45 +02:00
ORDER BY `id` , `name`
2017-01-03 14:12:17 +01:00
' );
2017-01-21 13:58:53 +01:00
$days = array_map ( 'array_shift' , $days );
if ( empty ( $days )) {
2017-01-03 14:12:17 +01:00
error ( _ ( 'The administration has not configured any shifts yet.' ));
2017-11-19 10:45:08 +01:00
redirect ( page_link_to ( '/' ));
2017-01-02 03:57:23 +01:00
}
return $days ;
2016-10-04 18:36:57 +02:00
}
2017-01-03 03:22:48 +01:00
/**
2017-12-25 23:12:52 +01:00
* @ return array [] | false
2017-01-03 03:22:48 +01:00
*/
2017-01-02 03:57:23 +01:00
function load_types ()
{
global $user ;
2017-01-02 15:43:36 +01:00
2017-01-21 13:58:53 +01:00
if ( ! count ( DB :: select ( 'SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0' ))) {
2017-01-03 14:12:17 +01:00
error ( _ ( 'The administration has not configured any angeltypes yet - or you are not subscribed to any angeltype.' ));
2017-11-19 10:45:08 +01:00
redirect ( page_link_to ( '/' ));
2017-01-02 03:57:23 +01:00
}
2017-01-21 13:58:53 +01:00
$types = DB :: 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` = ?
2017-01-02 15:43:36 +01:00
)
2017-01-21 13:58:53 +01:00
ORDER BY `AngelTypes` . `name`
' ,
[
$user [ 'UID' ],
]
);
2017-01-02 03:57:23 +01:00
if ( empty ( $types )) {
2017-01-21 13:58:53 +01:00
return DB :: select ( 'SELECT `id`, `name` FROM `AngelTypes` WHERE `restricted` = 0' );
2017-01-02 03:57:23 +01:00
}
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-08-30 19:57:01 +02:00
$session = session ();
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
2018-08-07 02:38:41 +02:00
if ( ! $session -> has ( 'shifts-filter' )) {
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 );
2017-08-30 19:57:01 +02:00
$shiftsFilter = new ShiftsFilter ( in_array ( 'user_shifts_admin' , $privileges ), $room_ids , $type_ids );
2018-08-07 02:38:41 +02:00
$session -> set ( 'shifts-filter' , $shiftsFilter -> sessionExport ());
2017-01-02 03:57:23 +01:00
}
2017-08-30 19:57:01 +02:00
2018-08-07 02:38:41 +02:00
$shiftsFilter = new ShiftsFilter ();
$shiftsFilter -> sessionImport ( $session -> get ( 'shifts-filter' ));
2017-08-30 19:57:01 +02:00
update_ShiftsFilter ( $shiftsFilter , in_array ( 'user_shifts_admin' , $privileges ), $days );
2018-08-07 02:38:41 +02:00
$session -> set ( 'shifts-filter' , $shiftsFilter -> sessionExport ());
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-03 14:12:17 +01:00
if ( $user [ 'api_key' ] == '' ) {
2017-01-02 03:57:23 +01:00
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' ,
2017-01-03 14:12:17 +01:00
'name' => _ ( 'occupied' )
2017-01-02 15:43:36 +01:00
],
[
'id' => '0' ,
2017-01-03 14:12:17 +01:00
'name' => _ ( 'free' )
2017-01-02 15:43:36 +01:00
]
];
2017-01-03 14:12:17 +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-08-31 12:25:06 +02:00
if ( config ( 'signup_requires_arrival' ) && ! $user [ 'Gekommen' ]) {
2017-12-20 23:12:17 +01:00
info ( render_user_arrived_hint ());
2017-08-31 12:25:06 +02:00
}
2017-12-27 13:36:38 +01:00
$ownTypes = [];
foreach ( UserAngelTypes_by_User ( $user ) as $type ) {
$ownTypes [] = ( int ) $type [ 'angeltype_id' ];
}
2017-01-02 03:57:23 +01:00
return page ([
2017-01-02 15:43:36 +01:00
div ( 'col-md-12' , [
msg (),
2017-07-20 02:22:18 +02:00
view ( __DIR__ . '/../../templates/user_shifts.html' , [
2017-01-02 15:43:36 +01:00
'title' => shifts_title (),
2017-01-03 14:12:17 +01:00
'room_select' => make_select ( $rooms , $shiftsFilter -> getRooms (), 'rooms' , _ ( 'Rooms' )),
2017-12-25 23:12:52 +01:00
'start_select' => html_select_key (
'start_day' ,
'start_day' ,
array_combine ( $days , $days ),
$start_day
),
2017-01-02 15:43:36 +01:00
'start_time' => $start_time ,
2017-12-25 23:12:52 +01:00
'end_select' => html_select_key (
'end_day' ,
'end_day' ,
array_combine ( $days , $days ),
$end_day
),
2017-01-02 15:43:36 +01:00
'end_time' => $end_time ,
'type_select' => make_select (
$types ,
$shiftsFilter -> getTypes (),
2017-01-03 14:12:17 +01:00
'types' ,
2017-12-27 13:36:38 +01:00
_ ( 'Angeltypes' ) . '<sup>1</sup>' ,
[
button (
'javascript: checkOwnTypes(\'selection_types\', ' . json_encode ( $ownTypes ) . ')' ,
_ ( 'Own' )
),
]
2017-01-02 15:43:36 +01:00
),
2017-01-03 14:12:17 +01:00
'filled_select' => make_select ( $filled , $shiftsFilter -> getFilled (), 'filled' , _ ( 'Occupancy' )),
2017-01-02 15:43:36 +01:00
'task_notice' =>
'<sup>1</sup>'
2017-01-03 14:12:17 +01:00
. _ ( 'The tasks shown here are influenced by the angeltypes you joined already!' )
2017-08-28 16:21:10 +02:00
. ' <a href="' . page_link_to ( 'angeltypes' , [ 'action' => 'about' ]) . '">'
2017-01-03 14:12:17 +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 (),
2017-12-26 20:41:35 +01:00
'ical_text' => ical_hint (),
2017-11-29 13:23:38 +01:00
'filter' => _ ( 'Filter' ),
'set_yesterday' => _ ( 'Yesterday' ),
'set_today' => _ ( 'Today' ),
'set_tomorrow' => _ ( 'Tomorrow' ),
'set_last_8h' => _ ( 'last 8h' ),
'set_last_4h' => _ ( 'last 4h' ),
'set_next_4h' => _ ( 'next 4h' ),
'set_next_8h' => _ ( 'next 8h' ),
2017-12-25 23:12:52 +01:00
'buttons' => button (
public_dashboard_link (),
glyph ( 'dashboard' ) . _ ( 'Public Dashboard' )
)
2017-01-02 15:43:36 +01:00
])
])
]);
2011-12-28 14:45:49 +01:00
}
2017-12-26 20:41:35 +01:00
/**
* Returns a hint for the user how the ical feature works .
*/
2017-12-27 13:36:38 +01:00
function ical_hint ()
{
2017-12-26 20:41:35 +01:00
global $user ;
2017-12-27 15:06:39 +01:00
return heading ( _ ( 'iCal export' ), 2 )
. '<p>' . sprintf (
_ ( 'Export your own 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>).' ),
2017-12-26 20:41:35 +01:00
page_link_to ( 'ical' , [ 'key' => $user [ 'api_key' ]]),
page_link_to ( 'shifts_json_export' , [ 'key' => $user [ 'api_key' ]]),
page_link_to ( 'user_myshifts' , [ 'reset' => 1 ])
) . '</p>' ;
}
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 )
{
2017-01-03 14:12:17 +01:00
return $array [ 'id' ];
2011-07-13 14:30:19 +02:00
}
2017-12-27 13:36:38 +01:00
/**
* @ param array $items
* @ param array $selected
* @ param string $name
* @ param string $title
* @ param array $additionalButtons
* @ return string
*/
function make_select ( $items , $selected , $name , $title = null , $additionalButtons = [])
2017-01-02 03:57:23 +01:00
{
2017-12-29 16:20:30 +01:00
$html = '' ;
2017-12-27 13:36:38 +01:00
$htmlItems = [];
2017-01-02 03:57:23 +01:00
if ( isset ( $title )) {
2017-12-29 16:20:30 +01:00
$html .= '<h4>' . $title . '</h4>' . " \n " ;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-12-29 16:20:30 +01:00
$buttons = [];
$buttons [] = button ( 'javascript: checkAll(\'selection_' . $name . '\', true)' , _ ( 'All' ));
$buttons [] = button ( 'javascript: checkAll(\'selection_' . $name . '\', false)' , _ ( 'None' ));
$buttons = array_merge ( $buttons , $additionalButtons );
$html .= buttons ( $buttons );
2017-01-02 03:57:23 +01:00
foreach ( $items as $i ) {
2017-12-27 13:36:38 +01:00
$htmlItems [] = '<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-03 14:12:17 +01:00
. ( ! isset ( $i [ 'enabled' ]) || $i [ 'enabled' ] ? '' : glyph ( 'lock' ))
2017-01-02 15:43:36 +01:00
. '</div><br />' ;
2017-01-02 03:57:23 +01:00
}
2017-12-29 16:20:30 +01:00
$html .= '<div id="selection_' . $name . '" class="selection ' . $name . '">' . " \n " ;
2017-12-27 13:36:38 +01:00
$html .= implode ( " \n " , $htmlItems );
$html .= buttons ( $buttons );
2017-01-02 03:57:23 +01:00
$html .= '</div>' . " \n " ;
return $html ;
2011-07-13 14:30:19 +02:00
}