2013-09-10 14:27:31 +02:00
< ? php
2016-11-23 22:31:11 +01:00
use Engelsystem\ShiftSignupState ;
2016-11-25 13:38:16 +01:00
2017-01-02 03:57:23 +01:00
function shift_link ( $shift )
{
return page_link_to ( 'shifts' ) . '&action=view&shift_id=' . $shift [ 'SID' ];
2014-12-19 22:41:55 +01:00
}
2017-01-02 03:57:23 +01:00
function shift_delete_link ( $shift )
{
return page_link_to ( 'user_shifts' ) . '&delete_shift=' . $shift [ 'SID' ];
2014-12-19 22:41:55 +01:00
}
2017-01-02 03:57:23 +01:00
function shift_edit_link ( $shift )
{
return page_link_to ( 'user_shifts' ) . '&edit_shift=' . $shift [ 'SID' ];
2014-12-19 22:41:55 +01:00
}
2016-10-02 21:19:03 +02:00
/**
* Edit a single shift .
*/
2017-01-02 03:57:23 +01:00
function shift_edit_controller ()
{
global $privileges ;
2016-10-02 21:19:03 +02:00
// Schicht bearbeiten
$msg = " " ;
2017-01-02 03:57:23 +01:00
$valid = true ;
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
if ( ! in_array ( 'admin_shifts' , $privileges )) {
redirect ( page_link_to ( 'user_shifts' ));
}
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
if ( ! isset ( $_REQUEST [ 'edit_shift' ]) || ! test_request_int ( 'edit_shift' )) {
redirect ( page_link_to ( 'user_shifts' ));
}
$shift_id = $_REQUEST [ 'edit_shift' ];
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
$shift = Shift ( $shift_id );
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
$room = select_array ( Rooms (), 'RID' , 'Name' );
$angeltypes = select_array ( AngelTypes (), 'id' , 'name' );
$shifttypes = select_array ( ShiftTypes (), 'id' , 'name' );
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
$needed_angel_types = select_array ( NeededAngelTypes_by_shift ( $shift_id ), 'id' , 'count' );
foreach ( array_keys ( $angeltypes ) as $angeltype_id ) {
if ( ! isset ( $needed_angel_types [ $angeltype_id ])) {
$needed_angel_types [ $angeltype_id ] = 0 ;
}
2016-10-02 21:19:03 +02:00
}
2017-01-02 03:57:23 +01:00
$shifttype_id = $shift [ 'shifttype_id' ];
$title = $shift [ 'title' ];
$rid = $shift [ 'RID' ];
$start = $shift [ 'start' ];
$end = $shift [ 'end' ];
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
if ( isset ( $_REQUEST [ 'submit' ])) {
// Name/Bezeichnung der Schicht, darf leer sein
2016-10-02 21:19:03 +02:00
$title = strip_request_item ( 'title' );
// Auswahl der sichtbaren Locations für die Schichten
2016-10-03 18:32:25 +02:00
if ( isset ( $_REQUEST [ 'rid' ]) && preg_match ( " /^[0-9]+ $ / " , $_REQUEST [ 'rid' ]) && isset ( $room [ $_REQUEST [ 'rid' ]])) {
2017-01-02 03:57:23 +01:00
$rid = $_REQUEST [ 'rid' ];
2016-10-02 21:19:03 +02:00
} else {
2017-01-02 03:57:23 +01:00
$valid = false ;
$msg .= error ( _ ( " Please select a room. " ), true );
2016-10-02 21:19:03 +02:00
}
2017-01-02 03:57:23 +01:00
if ( isset ( $_REQUEST [ 'shifttype_id' ]) && isset ( $shifttypes [ $_REQUEST [ 'shifttype_id' ]])) {
$shifttype_id = $_REQUEST [ 'shifttype_id' ];
} else {
$valid = false ;
$msg .= error ( _ ( 'Please select a shifttype.' ), true );
}
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
if ( isset ( $_REQUEST [ 'start' ]) && $tmp = parse_date ( " Y-m-d H:i " , $_REQUEST [ 'start' ])) {
$start = $tmp ;
} else {
$valid = false ;
$msg .= error ( _ ( " Please enter a valid starting time for the shifts. " ), true );
}
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
if ( isset ( $_REQUEST [ 'end' ]) && $tmp = parse_date ( " Y-m-d H:i " , $_REQUEST [ 'end' ])) {
$end = $tmp ;
} else {
$valid = false ;
$msg .= error ( _ ( " Please enter a valid ending time for the shifts. " ), true );
}
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
if ( $start >= $end ) {
$valid = false ;
$msg .= error ( _ ( " The ending time has to be after the starting time. " ), true );
}
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
foreach ( $needed_angel_types as $needed_angeltype_id => $needed_angeltype_name ) {
if ( isset ( $_REQUEST [ 'type_' . $needed_angeltype_id ]) && test_request_int ( 'type_' . $needed_angeltype_id )) {
$needed_angel_types [ $needed_angeltype_id ] = trim ( $_REQUEST [ 'type_' . $needed_angeltype_id ]);
} else {
$valid = false ;
$msg .= error ( sprintf ( _ ( " Please check your input for needed angels of type %s. " ), $needed_angeltype_name ), true );
}
}
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
if ( $valid ) {
$shift [ 'shifttype_id' ] = $shifttype_id ;
$shift [ 'title' ] = $title ;
$shift [ 'RID' ] = $rid ;
$shift [ 'start' ] = $start ;
$shift [ 'end' ] = $end ;
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
$result = Shift_update ( $shift );
if ( $result === false ) {
engelsystem_error ( 'Unable to update shift.' );
}
NeededAngelTypes_delete_by_shift ( $shift_id );
$needed_angel_types_info = [];
foreach ( $needed_angel_types as $type_id => $count ) {
NeededAngelType_add ( $shift_id , $type_id , null , $count );
$needed_angel_types_info [] = $angeltypes [ $type_id ] . " : " . $count ;
}
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
engelsystem_log ( " Updated shift ' " . $shifttypes [ $shifttype_id ] . " , " . $title . " ' from " . date ( " Y-m-d H:i " , $start ) . " to " . date ( " Y-m-d H:i " , $end ) . " with angel types " . join ( " , " , $needed_angel_types_info ));
success ( _ ( " Shift updated. " ));
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
redirect ( shift_link ([
'SID' => $shift_id
2016-10-02 21:19:03 +02:00
]));
2017-01-02 03:57:23 +01:00
}
2016-10-02 21:19:03 +02:00
}
2017-01-02 03:57:23 +01:00
$angel_types_spinner = " " ;
foreach ( $angeltypes as $angeltype_id => $angeltype_name ) {
$angel_types_spinner .= form_spinner ( 'type_' . $angeltype_id , $angeltype_name , $needed_angel_types [ $angeltype_id ]);
}
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
return page_with_title ( shifts_title (), [
2016-10-02 21:19:03 +02:00
msg (),
'<noscript>' . info ( _ ( " This page is much more comfortable with javascript. " ), true ) . '</noscript>' ,
form ([
form_select ( 'shifttype_id' , _ ( 'Shifttype' ), $shifttypes , $shifttype_id ),
form_text ( 'title' , _ ( " Title " ), $title ),
2016-10-03 18:32:25 +02:00
form_select ( 'rid' , _ ( " Room: " ), $room , $rid ),
2016-10-02 21:19:03 +02:00
form_text ( 'start' , _ ( " Start: " ), date ( " Y-m-d H:i " , $start )),
form_text ( 'end' , _ ( " End: " ), date ( " Y-m-d H:i " , $end )),
'<h2>' . _ ( " Needed angels " ) . '</h2>' ,
2016-10-03 18:32:25 +02:00
$angel_types_spinner ,
2017-01-02 03:57:23 +01:00
form_submit ( 'submit' , _ ( " Save " ))
])
2016-10-02 21:19:03 +02:00
]);
}
2017-01-02 03:57:23 +01:00
function shift_delete_controller ()
{
global $privileges ;
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
if ( ! in_array ( 'user_shifts_admin' , $privileges )) {
redirect ( page_link_to ( 'user_shifts' ));
}
2016-10-02 21:19:03 +02:00
// Schicht komplett löschen (nur für admins/user mit user_shifts_admin privileg)
if ( ! isset ( $_REQUEST [ 'delete_shift' ]) || ! preg_match ( " /^[0-9]* $ / " , $_REQUEST [ 'delete_shift' ])) {
2017-01-02 03:57:23 +01:00
redirect ( page_link_to ( 'user_shifts' ));
2016-10-02 21:19:03 +02:00
}
2017-01-02 03:57:23 +01:00
$shift_id = $_REQUEST [ 'delete_shift' ];
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
$shift = Shift ( $shift_id );
if ( $shift == null ) {
redirect ( page_link_to ( 'user_shifts' ));
}
2016-10-02 21:19:03 +02:00
// Schicht löschen bestätigt
if ( isset ( $_REQUEST [ 'delete' ])) {
2017-01-02 03:57:23 +01:00
Shift_delete ( $shift_id );
2016-10-02 21:19:03 +02:00
2017-01-02 03:57:23 +01:00
engelsystem_log ( " Deleted shift " . $shift [ 'name' ] . " from " . date ( " Y-m-d H:i " , $shift [ 'start' ]) . " to " . date ( " Y-m-d H:i " , $shift [ 'end' ]));
success ( _ ( " Shift deleted. " ));
redirect ( page_link_to ( 'user_shifts' ));
2016-10-02 21:19:03 +02:00
}
2017-01-02 03:57:23 +01:00
return page_with_title ( shifts_title (), [
2016-10-02 21:19:03 +02:00
error ( sprintf ( _ ( " Do you want to delete the shift %s from %s to %s? " ), $shift [ 'name' ], date ( " Y-m-d H:i " , $shift [ 'start' ]), date ( " H:i " , $shift [ 'end' ])), true ),
2017-01-02 03:57:23 +01:00
'<a class="button" href="?p=user_shifts&delete_shift=' . $shift_id . '&delete">' . _ ( " delete " ) . '</a>'
2016-10-02 21:19:03 +02:00
]);
}
2017-01-02 03:57:23 +01:00
function shift_controller ()
{
global $user , $privileges ;
2014-12-19 22:41:55 +01:00
2017-01-02 03:57:23 +01:00
if ( ! in_array ( 'user_shifts' , $privileges )) {
redirect ( page_link_to ( '?' ));
}
2014-12-19 22:41:55 +01:00
2017-01-02 03:57:23 +01:00
if ( ! isset ( $_REQUEST [ 'shift_id' ])) {
redirect ( page_link_to ( 'user_shifts' ));
}
2014-12-19 22:41:55 +01:00
2017-01-02 03:57:23 +01:00
$shift = Shift ( $_REQUEST [ 'shift_id' ]);
if ( $shift == null ) {
error ( _ ( " Shift could not be found. " ));
redirect ( page_link_to ( 'user_shifts' ));
}
2014-12-19 22:41:55 +01:00
2017-01-02 03:57:23 +01:00
$shifttype = ShiftType ( $shift [ 'shifttype_id' ]);
$room = Room ( $shift [ 'RID' ]);
$angeltypes = AngelTypes ();
$user_shifts = Shifts_by_user ( $user );
2014-12-25 22:23:18 +01:00
2017-01-02 03:57:23 +01:00
$shift_signup_state = new ShiftSignupState ( ShiftSignupState :: OCCUPIED , 0 );
foreach ( $angeltypes as & $angeltype ) {
$needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype ( $shift , $angeltype );
$shift_entries = ShiftEntries_by_shift_and_angeltype ( $shift [ 'SID' ], $angeltype [ 'id' ]);
2016-12-27 23:02:05 +01:00
2017-01-02 03:57:23 +01:00
$angeltype_signup_state = Shift_signup_allowed ( $user , $shift , $angeltype , null , $user_shifts , $needed_angeltype , $shift_entries );
if ( $shift_signup_state == null ) {
$shift_signup_state = $angeltype_signup_state ;
} else {
$shift_signup_state -> combineWith ( $angeltype_signup_state );
}
$angeltype [ 'shift_signup_state' ] = $angeltype_signup_state ;
2014-12-25 22:23:18 +01:00
}
2014-12-19 22:41:55 +01:00
2017-01-02 03:57:23 +01:00
return [
2014-12-19 22:41:55 +01:00
$shift [ 'name' ],
2017-01-02 03:57:23 +01:00
Shift_view ( $shift , $shifttype , $room , $angeltypes , $shift_signup_state )
2014-12-19 22:41:55 +01:00
];
}
2017-01-02 03:57:23 +01:00
function shifts_controller ()
{
if ( ! isset ( $_REQUEST [ 'action' ])) {
redirect ( page_link_to ( 'user_shifts' ));
}
2014-12-19 22:41:55 +01:00
2017-01-02 03:57:23 +01:00
switch ( $_REQUEST [ 'action' ]) {
2014-12-19 22:41:55 +01:00
default :
redirect ( page_link_to ( '?' ));
case 'view' :
return shift_controller ();
2014-12-19 22:59:18 +01:00
case 'next' :
return shift_next_controller ();
2014-12-19 22:41:55 +01:00
}
}
2014-12-19 22:59:18 +01:00
/**
* Redirects the user to his next shift .
*/
2017-01-02 03:57:23 +01:00
function shift_next_controller ()
{
global $user , $privileges ;
2014-12-19 22:59:18 +01:00
2017-01-02 03:57:23 +01:00
if ( ! in_array ( 'user_shifts' , $privileges )) {
redirect ( page_link_to ( '?' ));
}
2014-12-19 22:59:18 +01:00
2017-01-02 03:57:23 +01:00
$upcoming_shifts = ShiftEntries_upcoming_for_user ( $user );
if ( $upcoming_shifts === false ) {
return false ;
}
2014-12-19 22:59:18 +01:00
2017-01-02 03:57:23 +01:00
if ( count ( $upcoming_shifts ) > 0 ) {
redirect ( shift_link ( $upcoming_shifts [ 0 ]));
}
2014-12-19 22:59:18 +01:00
2017-01-02 03:57:23 +01:00
redirect ( page_link_to ( 'user_shifts' ));
2014-12-19 22:59:18 +01:00
}
2013-12-09 17:10:07 +01:00
/**
* Export all shifts using api - key .
*/
2017-01-02 03:57:23 +01:00
function shifts_json_export_all_controller ()
{
global $api_key ;
2013-12-09 17:10:07 +01:00
2017-01-02 03:57:23 +01:00
if ( $api_key == " " ) {
engelsystem_error ( " Config contains empty apikey. " );
}
2013-12-09 17:10:07 +01:00
2017-01-02 03:57:23 +01:00
if ( ! isset ( $_REQUEST [ 'api_key' ])) {
engelsystem_error ( " Missing parameter api_key. " );
}
2013-12-09 17:10:07 +01:00
2017-01-02 03:57:23 +01:00
if ( $_REQUEST [ 'api_key' ] != $api_key ) {
engelsystem_error ( " Invalid api_key. " );
}
2013-12-09 17:10:07 +01:00
2017-01-02 03:57:23 +01:00
$shifts_source = Shifts ();
if ( $shifts_source === false ) {
engelsystem_error ( " Unable to load shifts. " );
}
2013-12-09 17:10:07 +01:00
2017-01-02 03:57:23 +01:00
header ( " Content-Type: application/json; charset=utf-8 " );
raw_output ( json_encode ( $shifts_source ));
2013-12-09 17:10:07 +01:00
}
2013-09-10 14:27:31 +02:00
/**
2013-10-13 00:52:44 +02:00
* Export filtered shifts via JSON .
* ( Like iCal Export or shifts view )
2013-09-10 14:27:31 +02:00
*/
2017-01-02 03:57:23 +01:00
function shifts_json_export_controller ()
{
global $user ;
2013-12-09 17:10:07 +01:00
2017-01-02 03:57:23 +01:00
if ( ! isset ( $_REQUEST [ 'key' ]) || ! preg_match ( " /^[0-9a-f] { 32} $ / " , $_REQUEST [ 'key' ])) {
engelsystem_error ( " Missing key. " );
}
2013-12-09 17:10:07 +01:00
2017-01-02 03:57:23 +01:00
$key = $_REQUEST [ 'key' ];
2016-10-01 10:48:19 +02:00
2017-01-02 03:57:23 +01:00
$user = User_by_api_key ( $key );
if ( $user == null ) {
engelsystem_error ( " Key invalid. " );
}
if ( ! in_array ( 'shifts_json_export' , privileges_for_user ( $user [ 'UID' ]))) {
engelsystem_error ( " No privilege for shifts_json_export. " );
}
2016-08-22 19:03:18 +02:00
2017-01-02 03:57:23 +01:00
$shifts = load_ical_shifts ();
2016-08-22 19:03:18 +02:00
2017-01-02 03:57:23 +01:00
header ( " Content-Type: application/json; charset=utf-8 " );
raw_output ( json_encode ( $shifts ));
2016-08-22 19:03:18 +02:00
}
/**
2016-11-25 13:38:16 +01:00
* Returns users shifts to export .
2016-08-22 19:03:18 +02:00
*/
2017-01-02 03:57:23 +01:00
function load_ical_shifts ()
{
global $user ;
2013-12-09 17:10:07 +01:00
2017-01-02 03:57:23 +01:00
return Shifts_by_user ( $user );
2013-09-10 14:27:31 +02:00
}