2011-07-13 14:30:19 +02:00
< ? php
function user_shifts () {
2011-07-14 19:53:26 +02:00
global $user , $privileges ;
2011-10-11 18:29:26 +02:00
// Löschen einzelner Schicht-Einträge (Also Belegung einer Schicht von Engeln) durch Admins
2011-07-14 20:57:02 +02:00
if ( isset ( $_REQUEST [ 'entry_id' ]) && in_array ( 'user_shifts_admin' , $privileges )) {
if ( isset ( $_REQUEST [ 'entry_id' ]) && preg_match ( " /^[0-9]* $ / " , $_REQUEST [ 'entry_id' ]))
2011-09-12 18:32:45 +02:00
$entry_id = $_REQUEST [ 'entry_id' ];
2011-07-14 20:57:02 +02:00
else
header ( " Location: " . page_link_to ( 'user_shifts' ));
2011-07-14 19:53:26 +02:00
2011-09-12 18:32:45 +02:00
sql_query ( " DELETE FROM `ShiftEntry` WHERE `id`= " . sql_escape ( $entry_id ) . " LIMIT 1 " );
2011-12-21 23:18:57 +01:00
return success ( " Der Schicht-Eintrag wurde gelöscht.. " , true );
2011-07-14 20:57:02 +02:00
}
2011-10-11 18:29:26 +02:00
// Schicht bearbeiten
elseif ( isset ( $_REQUEST [ 'edit_shift' ]) && in_array ( 'admin_shifts' , $privileges )) {
$msg = " " ;
$ok = true ;
if ( isset ( $_REQUEST [ 'edit_shift' ]) && preg_match ( " /^[0-9]* $ / " , $_REQUEST [ 'edit_shift' ]))
$shift_id = $_REQUEST [ 'edit_shift' ];
else
header ( " Location: " . page_link_to ( 'user_shifts' ));
2011-10-11 18:55:26 +02:00
if ( sql_num_query ( " SELECT * FROM `ShiftEntry` WHERE `SID`= " . sql_escape ( $shift_id ) . " LIMIT 1 " ) > 0 )
2011-12-21 23:18:57 +01:00
return error ( " Du kannst nur Schichten bearbeiten, bei denen niemand eingetragen ist. " , true );
2011-10-11 18:55:26 +02:00
2011-10-11 18:29:26 +02:00
$shift = sql_select ( " SELECT * FROM `Shifts` JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) WHERE `SID`= " . sql_escape ( $shift_id ) . " LIMIT 1 " );
if ( count ( $shift ) == 0 )
header ( " Location: " . page_link_to ( 'user_shifts' ));
$shift = $shift [ 0 ];
// Locations laden
$rooms = sql_select ( " SELECT * FROM `Room` WHERE `show`='Y' ORDER BY `Name` " );
$room_array = array ();
foreach ( $rooms as $room )
$room_array [ $room [ 'RID' ]] = $room [ 'Name' ];
// Engeltypen laden
2011-12-26 20:51:08 +01:00
$types = sql_select ( " SELECT `AngelTypes`.*, `NeededAngelTypes`.`count` FROM `NeededAngelTypes` JOIN `AngelTypes` ON (`NeededAngelTypes`.`angel_type_id` = `AngelTypes`.`id`) WHERE `shift_id`= " . sql_escape ( $shift_id ) . " ORDER BY `AngelTypes`.`name` " );
2011-10-11 18:29:26 +02:00
$needed_angel_types = array ();
foreach ( $types as $type )
2011-12-26 20:51:08 +01:00
$needed_angel_types [ $type [ 'id' ]] = $type [ 'count' ];
2011-10-11 18:29:26 +02:00
$name = $shift [ 'name' ];
$rid = $shift [ 'RID' ];
$start = $shift [ 'start' ];
$end = $shift [ 'end' ];
2011-10-11 18:55:26 +02:00
if ( isset ( $_REQUEST [ 'submit' ])) {
// Name/Bezeichnung der Schicht, darf leer sein
$name = strip_request_item ( 'name' );
// Auswahl der sichtbaren Locations für die Schichten
if ( isset ( $_REQUEST [ 'rid' ]) && preg_match ( " /^[0-9]+ $ / " , $_REQUEST [ 'rid' ]) && isset ( $room_array [ $_REQUEST [ 'rid' ]]))
$rid = $_REQUEST [ 'rid' ];
else {
$ok = false ;
$rid = $rooms [ 0 ][ 'RID' ];
2011-12-21 23:18:57 +01:00
$msg .= error ( " Wähle bitte einen Raum aus. " , true );
2011-10-11 18:55:26 +02:00
}
if ( isset ( $_REQUEST [ 'start' ]) && $tmp = DateTime :: createFromFormat ( " Y-m-d H:i " , trim ( $_REQUEST [ 'start' ])))
$start = $tmp -> getTimestamp ();
else {
$ok = false ;
2011-12-21 23:18:57 +01:00
$msg .= error ( " Bitte gib einen Startzeitpunkt für die Schichten an. " , true );
2011-10-11 18:55:26 +02:00
}
if ( isset ( $_REQUEST [ 'end' ]) && $tmp = DateTime :: createFromFormat ( " Y-m-d H:i " , trim ( $_REQUEST [ 'end' ])))
$end = $tmp -> getTimestamp ();
else {
$ok = false ;
2011-12-21 23:18:57 +01:00
$msg .= error ( " Bitte gib einen Endzeitpunkt für die Schichten an. " , true );
2011-10-11 18:55:26 +02:00
}
if ( $start >= $end ) {
$ok = false ;
2011-12-21 23:18:57 +01:00
$msg .= error ( " Das Ende muss nach dem Startzeitpunkt liegen! " , true );
2011-10-11 18:55:26 +02:00
}
foreach ( $types as $type ) {
2011-12-21 23:05:05 +01:00
if ( isset ( $_REQUEST [ 'type_' . $type [ 'id' ]]) && preg_match ( " /^[0-9]+ $ / " , trim ( $_REQUEST [ 'type_' . $type [ 'id' ]]))) {
$needed_angel_types [ $type [ 'id' ]] = trim ( $_REQUEST [ 'type_' . $type [ 'id' ]]);
2011-10-11 18:55:26 +02:00
} else {
$ok = false ;
2011-12-21 23:18:57 +01:00
$msg .= error ( " Bitte überprüfe die Eingaben für die benötigten Engel des Typs " . $type [ 'name' ] . " . " , true );
2011-10-11 18:55:26 +02:00
}
}
if ( array_sum ( $needed_angel_types ) == 0 ) {
$ok = false ;
2011-12-21 23:18:57 +01:00
$msg .= error ( " Es werden 0 Engel benötigt. Bitte wähle benötigte Engel. " , true );
2011-10-11 18:55:26 +02:00
}
if ( $ok ) {
sql_query ( " UPDATE `Shifts` SET `start`= " . sql_escape ( $start ) . " , `end`= " . sql_escape ( $end ) . " , `RID`= " . sql_escape ( $rid ) . " , `name`=' " . sql_escape ( $name ) . " ' WHERE `SID`= " . sql_escape ( $shift_id ) . " LIMIT 1 " );
sql_query ( " DELETE FROM `NeededAngelTypes` WHERE `shift_id`= " . sql_escape ( $shift_id ));
foreach ( $needed_angel_types as $type_id => $count )
sql_query ( " INSERT INTO `NeededAngelTypes` SET `shift_id`= " . sql_escape ( $shift_id ) . " , `angel_type_id`= " . sql_escape ( $type_id ) . " , `count`= " . sql_escape ( $count ));
2011-12-21 23:18:57 +01:00
return success ( " Schicht gespeichert. " , true );
2011-10-11 18:55:26 +02:00
}
}
2011-12-26 15:55:17 +01:00
$room_select = html_select_key ( 'rid' , 'rid' , $room_array , $rid );
2011-10-11 18:29:26 +02:00
$angel_types = " " ;
foreach ( $types as $type ) {
$angel_types .= template_render ( '../templates/admin_shifts_angel_types.html' , array (
2011-12-26 20:51:08 +01:00
'id' => $type [ 'id' ],
2011-12-21 23:05:05 +01:00
'type' => $type [ 'name' ],
'value' => $needed_angel_types [ $type [ 'id' ]]
2011-10-11 18:29:26 +02:00
));
}
return template_render ( '../templates/user_shifts_edit.html' , array (
'msg' => $msg ,
'name' => $name ,
'room_select' => $room_select ,
'start' => date ( " Y-m-d H:i " , $start ),
'end' => date ( " Y-m-d H:i " , $end ),
'angel_types' => $angel_types
));
}
2011-09-12 18:32:45 +02:00
// Schicht komplett löschen (nur für admins/user mit user_shifts_admin privileg)
elseif ( isset ( $_REQUEST [ 'delete_shift' ]) && in_array ( 'user_shifts_admin' , $privileges )) {
if ( isset ( $_REQUEST [ 'delete_shift' ]) && preg_match ( " /^[0-9]* $ / " , $_REQUEST [ 'delete_shift' ]))
$shift_id = $_REQUEST [ 'delete_shift' ];
else
header ( " Location: " . page_link_to ( 'user_shifts' ));
$shift = sql_select ( " SELECT * FROM `Shifts` JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) WHERE `SID`= " . sql_escape ( $shift_id ) . " LIMIT 1 " );
if ( count ( $shift ) == 0 )
header ( " Location: " . page_link_to ( 'user_shifts' ));
$shift = $shift [ 0 ];
// Schicht löschen bestätigt
if ( isset ( $_REQUEST [ 'delete' ])) {
sql_query ( " DELETE FROM `ShiftEntry` WHERE `SID`= " . sql_escape ( $shift_id ));
sql_query ( " DELETE FROM `NeededAngelTypes` WHERE `shift_id`= " . sql_escape ( $shift_id ));
sql_query ( " DELETE FROM `Shifts` WHERE `SID`= " . sql_escape ( $shift_id ) . " LIMIT 1 " );
2011-12-21 23:18:57 +01:00
return success ( " Die Schicht wurde gelöscht. " , true );
2011-09-12 18:32:45 +02:00
}
return template_render ( '../templates/user_shifts_admin_delete.html' , array (
'name' => $shift [ 'name' ],
'start' => date ( " Y-m-d H:i " , $shift [ 'start' ]),
'end' => date ( " H:i " , $shift [ 'end' ]),
'id' => $shift_id
));
}
2011-07-14 20:57:02 +02:00
elseif ( isset ( $_REQUEST [ 'shift_id' ])) {
2011-07-13 15:55:27 +02:00
if ( isset ( $_REQUEST [ 'shift_id' ]) && preg_match ( " /^[0-9]* $ / " , $_REQUEST [ 'shift_id' ]))
$shift_id = $_REQUEST [ 'shift_id' ];
else
header ( " Location: " . page_link_to ( 'user_shifts' ));
2011-07-14 19:53:26 +02:00
$shift = sql_select ( " SELECT * FROM `Shifts` JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) WHERE `SID`= " . sql_escape ( $shift_id ) . " LIMIT 1 " );
2011-07-13 15:55:27 +02:00
if ( count ( $shift ) == 0 )
header ( " Location: " . page_link_to ( 'user_shifts' ));
$shift = $shift [ 0 ];
if ( isset ( $_REQUEST [ 'type_id' ]) && preg_match ( " /^[0-9]* $ / " , $_REQUEST [ 'type_id' ]))
$type_id = $_REQUEST [ 'type_id' ];
else
header ( " Location: " . page_link_to ( 'user_shifts' ));
2011-12-21 22:20:06 +01:00
$type = sql_select ( " SELECT * FROM `AngelTypes` WHERE `id`= " . sql_escape ( $type_id ) . " LIMIT 1 " );
2011-07-14 19:53:26 +02:00
if ( count ( $type ) == 0 )
header ( " Location: " . page_link_to ( 'user_shifts' ));
$type = $type [ 0 ];
if ( isset ( $_REQUEST [ 'submit' ])) {
2011-07-14 20:57:02 +02:00
if ( in_array ( 'user_shifts_admin' , $privileges )) {
if ( isset ( $_REQUEST [ 'user_id' ]) && preg_match ( " /^[0-9]* $ / " , $_REQUEST [ 'user_id' ]))
$user_id = $_REQUEST [ 'user_id' ];
else
$user_id = $user [ 'UID' ];
$user_test = sql_select ( " SELECT * FROM `User` WHERE `UID`= " . sql_escape ( $user_id ) . " LIMIT 1 " );
if ( count ( $user_test ) == 0 )
header ( " Location: " . page_link_to ( 'user_shifts' ));
} else
$user_id = $user [ 'UID' ];
2011-07-15 17:50:57 +02:00
// TODO: Kollisionserkennung, andere Schichten zur gleichen Uhrzeit darf der Engel auch nicht belegt haben...
2011-07-14 20:57:02 +02:00
$entries = sql_select ( " SELECT * FROM `ShiftEntry` WHERE `SID`= " . sql_escape ( $shift [ 'SID' ]));
foreach ( $entries as $entry )
if ( $entry [ 'UID' ] == $user_id )
2011-12-21 23:18:57 +01:00
return error ( " This angel does already have an entry for this shift. " , true );
2011-07-14 20:57:02 +02:00
2011-07-19 19:12:36 +02:00
$comment = strip_request_item_nl ( 'comment' );
sql_query ( " INSERT INTO `ShiftEntry` SET `Comment`=' " . sql_escape ( $comment ) . " ', `UID`= " . sql_escape ( $user_id ) . " , `TID`= " . sql_escape ( $type_id ) . " , `SID`= " . sql_escape ( $shift_id ));
2011-12-21 23:18:57 +01:00
return success ( " Du bist eingetragen. Danke! " , true ) . '<a href="' . page_link_to ( 'user_myshifts' ) . '">Meine Schichten »</a>' ;
2011-07-14 19:53:26 +02:00
}
2011-07-14 20:57:02 +02:00
if ( in_array ( 'user_shifts_admin' , $privileges )) {
$users = sql_select ( " SELECT * FROM `User` ORDER BY `Nick` " );
$users_select = array ();
foreach ( $users as $usr )
$users_select [ $usr [ 'UID' ]] = $usr [ 'Nick' ];
2011-12-26 15:55:17 +01:00
$user_text = html_select_key ( 'user_id' , 'user_id' , $users_select , $user [ 'UID' ]);
2011-07-14 20:57:02 +02:00
} else
$user_text = $user [ 'Nick' ];
2011-07-13 15:55:27 +02:00
return template_render ( '../templates/user_shifts_add.html' , array (
2011-09-29 14:38:23 +02:00
//'date' => date("Y-m-d H:i", $shift['start']) . ', ' . date("H:i", $shift['end'] - $shift['start']) . 'h',
'date' => date ( " Y-m-d H:i " , $shift [ 'start' ]) . ', ' . shift_length ( $shift ),
2011-07-14 19:53:26 +02:00
'title' => $shift [ 'name' ],
'location' => $shift [ 'Name' ],
2011-07-14 20:57:02 +02:00
'angel' => $user_text ,
2011-12-21 23:05:05 +01:00
'type' => $type [ 'name' ],
2011-07-19 19:56:15 +02:00
'comment' => " "
2011-07-13 15:55:27 +02:00
));
2011-07-13 15:17:15 +02:00
} else {
$shifts = sql_select ( " SELECT * FROM `Shifts` ORDER BY `start` " );
$days = array ();
2011-09-14 22:45:15 +02:00
$rooms = array ();
if ( count ( $shifts ) > 0 ) {
foreach ( $shifts as $shift )
$days [] = date ( " Y-m-d " , $shift [ 'start' ]);
$days = array_unique ( $days );
$day = $days [ 0 ];
if ( isset ( $_REQUEST [ 'day' ]))
$day = $_REQUEST [ 'day' ];
$rooms = sql_select ( " SELECT * FROM `Room` WHERE `show`='Y' ORDER BY `Name` " );
$id = 0 ;
if ( isset ( $_REQUEST [ 'room_id' ]) && preg_match ( " /^[0-9]* $ / " , $_REQUEST [ 'room_id' ]))
$id = $_REQUEST [ 'room_id' ];
$day_timestamp = DateTime :: createFromFormat ( " Y-m-d-Hi " , $day . " -0000 " ) -> getTimestamp ();
if ( $id == 0 )
$shifts = sql_select ( " SELECT * FROM `Shifts` JOIN `Room` ON (`Shifts`.`RID` = `Room`.`RID`) WHERE `start` > " . sql_escape ( time ()) . " ORDER BY `start` " );
else
$shifts = sql_select ( " SELECT * FROM `Shifts` WHERE `RID`= " . sql_escape ( $id ) . " AND `start` >= " . sql_escape ( $day_timestamp ) . " AND `start` < " . sql_escape ( $day_timestamp + 24 * 60 * 60 ) . " ORDER BY `start` " );
$shifts_table = " " ;
$row_count = 0 ;
foreach ( $shifts as $shift ) {
$shift_row = '<tr><td>' . date (( $id == 0 ? " Y-m-d " : " " ) . " H:i " , $shift [ 'start' ]) . ' - ' . date ( " H:i " , $shift [ 'end' ]) . ( $id == 0 ? " <br /> " . $shift [ 'Name' ] : " " ) . '</td><td>' . $shift [ 'name' ];
if ( in_array ( 'admin_shifts' , $privileges ))
2011-10-11 18:29:26 +02:00
$shift_row .= ' <a href="?p=user_shifts&edit_shift=' . $shift [ 'SID' ] . '">[edit]</a> <a href="?p=user_shifts&delete_shift=' . $shift [ 'SID' ] . '">[x]</a>' ;
2011-09-14 22:45:15 +02:00
$shift_row .= '<br />' ;
$show_shift = false ;
2011-12-21 22:20:06 +01:00
$angeltypes = sql_select ( " SELECT * FROM `NeededAngelTypes` JOIN `AngelTypes` ON (`NeededAngelTypes`.`angel_type_id` = `AngelTypes`.`id`) WHERE `shift_id`= " . sql_escape ( $shift [ 'SID' ]) . " AND `count` > 0 ORDER BY `AngelTypes`.`name` " );
2011-09-14 22:45:15 +02:00
if ( count ( $angeltypes ) == 0 )
2011-12-21 22:20:06 +01:00
$angeltypes = sql_select ( " SELECT * FROM `NeededAngelTypes` JOIN `AngelTypes` ON (`NeededAngelTypes`.`angel_type_id` = `AngelTypes`.`id`) WHERE `room_id`= " . sql_escape ( $shift [ 'RID' ]) . " AND `count` > 0 ORDER BY `AngelTypes`.`name` " );
2011-09-14 22:45:15 +02:00
if ( count ( $angeltypes ) > 0 ) {
$my_shift = sql_num_query ( " SELECT * FROM `ShiftEntry` WHERE `SID`= " . sql_escape ( $shift [ 'SID' ]) . " AND `UID`= " . sql_escape ( $user [ 'UID' ]) . " LIMIT 1 " ) > 0 ;
foreach ( $angeltypes as $angeltype ) {
2011-12-26 20:51:08 +01:00
$entries = sql_select ( " SELECT * FROM `ShiftEntry` JOIN `User` ON (`ShiftEntry`.`UID` = `User`.`UID`) WHERE `SID`= " . sql_escape ( $shift [ 'SID' ]) . " AND `TID`= " . sql_escape ( $angeltype [ 'id' ]) . " ORDER BY `Nick` " );
2011-09-14 22:45:15 +02:00
$entry_list = array ();
foreach ( $entries as $entry ) {
if ( in_array ( 'user_shifts_admin' , $privileges ))
2011-11-09 08:47:58 +01:00
$entry_list [] = '<a href="' . page_link_to ( 'user_myshifts' ) . '&id=' . $entry [ 'UID' ] . '">' . $entry [ 'Nick' ] . '</a> <a href="' . page_link_to ( 'user_shifts' ) . '&entry_id=' . $entry [ 'id' ] . '">[x]</a>' ;
2011-09-14 22:45:15 +02:00
else
$entry_list [] = $entry [ 'Nick' ];
}
if ( $angeltype [ 'count' ] - count ( $entries ) > 0 )
if ( ! $my_shift || in_array ( 'user_shifts_admin' , $privileges )) {
2011-12-26 20:51:08 +01:00
$entry_list [] = '<a href="' . page_link_to ( 'user_shifts' ) . '&shift_id=' . $shift [ 'SID' ] . '&type_id=' . $angeltype [ 'id' ] . '">' . ( $angeltype [ 'count' ] - count ( $entries )) . ' Helfer' . ( $angeltype [ 'count' ] - count ( $entries ) != 1 ? '' : '' ) . ' gebraucht »</a>' ;
2011-09-14 22:45:15 +02:00
$show_shift = true ;
} else
2011-09-14 23:05:43 +02:00
$entry_list [] = ( $angeltype [ 'count' ] - count ( $entries )) . ' Helfer gebraucht' ;
2011-09-14 22:45:15 +02:00
2011-12-21 23:05:05 +01:00
$shift_row .= '<b>' . $angeltype [ 'name' ] . ':</b> ' ;
2011-09-14 22:45:15 +02:00
$shift_row .= join ( " , " , $entry_list );
$shift_row .= '<br />' ;
2011-07-14 20:57:02 +02:00
}
2011-07-13 15:17:15 +02:00
}
2011-09-14 22:45:15 +02:00
if ( $id != 0 || ( $show_shift && $row_count ++ < 15 ))
$shifts_table .= $shift_row . '</td></tr>' ;
2011-07-13 15:01:17 +02:00
}
}
2011-07-13 14:30:19 +02:00
2011-07-13 15:17:15 +02:00
return template_render ( '../templates/user_shifts.html' , array (
'room_select' => make_room_select ( $rooms , $id , $day ),
'day_select' => make_day_select ( $days , $day , $id ),
'shifts_table' => $shifts_table
));
}
2011-07-13 14:30:19 +02:00
}
function make_day_select ( $days , $day , $id ) {
$html = array ();
foreach ( $days as $d ) {
2011-07-14 20:57:02 +02:00
if ( $day == $d && $id != 0 )
2011-07-13 14:30:19 +02:00
$html [] = '<b>' . $d . '</b>' ;
else
$html [] = '<a href="' . page_link_to ( 'user_shifts' ) . '&day=' . $d . '&room_id=' . $id . '">' . $d . '</a>' ;
}
return join ( ' | ' , $html );
}
function make_room_select ( $rooms , $id , $day ) {
$html = array ();
foreach ( $rooms as $room ) {
if ( $room [ 'RID' ] == $id )
$html [] = '<b>' . $room [ 'Name' ] . '</b>' ;
else
$html [] = '<a href="' . page_link_to ( 'user_shifts' ) . '&room_id=' . $room [ 'RID' ] . '&day=' . $day . '">' . $room [ 'Name' ] . '</a>' ;
}
2011-07-14 20:57:02 +02:00
if ( $id == 0 )
2011-09-14 23:05:43 +02:00
$html [] = '<b>Nächste freie Schichten</b>' ;
2011-07-14 20:57:02 +02:00
else
2011-09-14 23:05:43 +02:00
$html [] = '<a href="' . page_link_to ( 'user_shifts' ) . '&room_id=0">Nächste freie Schichten</a>' ;
2011-07-13 14:30:19 +02:00
return join ( ' | ' , $html );
}
2011-08-13 14:37:54 +02:00
?>