2011-09-06 20:45:06 +02:00
< ? php
2014-12-07 17:34:29 +01:00
2017-01-02 03:57:23 +01:00
function admin_shifts_title ()
{
return _ ( " Create shifts " );
2013-11-25 21:04:58 +01:00
}
2011-09-06 20:45:06 +02:00
// Assistent zum Anlegen mehrerer neuer Schichten
2017-01-02 03:57:23 +01:00
function admin_shifts ()
{
$valid = true ;
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
$rid = 0 ;
$start = parse_date ( " Y-m-d H:i " , date ( " Y-m-d " ) . " 00:00 " );
$end = $start ;
$mode = 'single' ;
$angelmode = 'manually' ;
$length = '' ;
$change_hours = [];
$title = " " ;
$shifttype_id = null ;
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
// Locations laden (auch unsichtbare - fuer Erzengel ist das ok)
$rooms = sql_select ( " SELECT * FROM `Room` ORDER BY `Name` " );
2017-01-02 03:57:23 +01:00
$room_array = [];
foreach ( $rooms as $room ) {
$room_array [ $room [ 'RID' ]] = $room [ 'Name' ];
}
2016-09-29 10:53:17 +02:00
// Engeltypen laden
2012-12-10 09:49:23 +01:00
$types = sql_select ( " SELECT * FROM `AngelTypes` ORDER BY `name` " );
2017-01-02 03:57:23 +01:00
$needed_angel_types = [];
foreach ( $types as $type ) {
$needed_angel_types [ $type [ 'id' ]] = 0 ;
}
2016-09-29 10:53:17 +02:00
// Load shift types
2014-12-22 17:55:20 +01:00
$shifttypes_source = ShiftTypes ();
2017-01-02 03:57:23 +01:00
if ( $shifttypes_source === false ) {
engelsystem_error ( 'Unable to load shift types.' );
}
$shifttypes = [];
foreach ( $shifttypes_source as $shifttype ) {
$shifttypes [ $shifttype [ 'id' ]] = $shifttype [ 'name' ];
2014-12-22 17:55:20 +01:00
}
2017-01-02 03:57:23 +01:00
if ( isset ( $_REQUEST [ 'preview' ]) || isset ( $_REQUEST [ 'back' ])) {
if ( isset ( $_REQUEST [ 'shifttype_id' ])) {
$shifttype = ShiftType ( $_REQUEST [ 'shifttype_id' ]);
if ( $shifttype === false ) {
engelsystem_error ( 'Unable to load shift type.' );
}
if ( $shifttype == null ) {
$valid = false ;
error ( _ ( 'Please select a shift type.' ));
} else {
$shifttype_id = $_REQUEST [ 'shifttype_id' ];
}
} else {
$valid = false ;
error ( _ ( 'Please select a shift type.' ));
}
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
// Name/Bezeichnung der Schicht, darf leer sein
2014-12-22 17:55:20 +01:00
$title = strip_request_item ( 'title' );
2012-12-10 09:49:23 +01:00
// Auswahl der sichtbaren Locations für die Schichten
2016-09-29 10:53:17 +02:00
if ( isset ( $_REQUEST [ 'rid' ]) && preg_match ( " /^[0-9]+ $ / " , $_REQUEST [ 'rid' ]) && isset ( $room_array [ $_REQUEST [ 'rid' ]])) {
2017-01-02 03:57:23 +01:00
$rid = $_REQUEST [ 'rid' ];
2016-09-29 10:53:17 +02:00
} else {
2017-01-02 03:57:23 +01:00
$valid = false ;
$rid = $rooms [ 0 ][ 'RID' ];
error ( _ ( 'Please select a location.' ));
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01: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 ;
2012-12-10 09:49:23 +01:00
} else {
2017-01-02 03:57:23 +01:00
$valid = false ;
error ( _ ( 'Please select a start time.' ));
2012-12-10 09:49:23 +01: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 ;
2012-12-10 09:49:23 +01:00
} else {
2017-01-02 03:57:23 +01:00
$valid = false ;
error ( _ ( 'Please select an end time.' ));
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
if ( $start >= $end ) {
2016-09-29 12:08:12 +02:00
$valid = false ;
2017-01-02 03:57:23 +01:00
error ( _ ( 'The shifts end has to be after its start.' ));
2012-12-10 09:49:23 +01:00
}
2017-01-02 03:57:23 +01:00
if ( isset ( $_REQUEST [ 'mode' ])) {
if ( $_REQUEST [ 'mode' ] == 'single' ) {
$mode = 'single' ;
} elseif ( $_REQUEST [ 'mode' ] == 'multi' ) {
if ( isset ( $_REQUEST [ 'length' ]) && preg_match ( " /^[0-9]+ $ / " , trim ( $_REQUEST [ 'length' ]))) {
$mode = 'multi' ;
$length = trim ( $_REQUEST [ 'length' ]);
} else {
$valid = false ;
error ( _ ( 'Please enter a shift duration in minutes.' ));
}
} elseif ( $_REQUEST [ 'mode' ] == 'variable' ) {
if ( isset ( $_REQUEST [ 'change_hours' ]) && preg_match ( " /^([0-9] { 2}(,| $ ))/ " , trim ( str_replace ( " " , " " , $_REQUEST [ 'change_hours' ])))) {
$mode = 'variable' ;
$change_hours = array_map ( 'trim' , explode ( " , " , $_REQUEST [ 'change_hours' ]));
} else {
$valid = false ;
error ( _ ( 'Please split the shift-change hours by colons.' ));
}
}
} else {
$valid = false ;
error ( _ ( 'Please select a mode.' ));
}
if ( isset ( $_REQUEST [ 'angelmode' ])) {
if ( $_REQUEST [ 'angelmode' ] == 'location' ) {
$angelmode = 'location' ;
} elseif ( $_REQUEST [ 'angelmode' ] == 'manually' ) {
$angelmode = 'manually' ;
foreach ( $types as $type ) {
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' ]]);
} else {
$valid = false ;
error ( sprintf ( _ ( 'Please check the needed angels for team %s.' ), $type [ 'name' ]));
}
}
if ( array_sum ( $needed_angel_types ) == 0 ) {
$valid = false ;
error ( _ ( 'There are 0 angels needed. Please enter the amounts of needed angels.' ));
}
} else {
$valid = false ;
error ( _ ( 'Please select a mode for needed angels.' ));
}
} else {
$valid = false ;
error ( _ ( 'Please select needed angels.' ));
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
// Beim Zurück-Knopf das Formular zeigen
2016-09-29 10:53:17 +02:00
if ( isset ( $_REQUEST [ 'back' ])) {
2017-01-02 03:57:23 +01:00
$valid = false ;
2016-09-29 10:53:17 +02:00
}
// Alle Eingaben in Ordnung
2016-09-29 12:08:12 +02:00
if ( $valid ) {
2017-01-02 03:57:23 +01:00
if ( $angelmode == 'location' ) {
$needed_angel_types = [];
$needed_angel_types_location = sql_select ( " SELECT * FROM `NeededAngelTypes` WHERE `room_id`=' " . sql_escape ( $rid ) . " ' " );
foreach ( $needed_angel_types_location as $type ) {
$needed_angel_types [ $type [ 'angel_type_id' ]] = $type [ 'count' ];
}
2016-09-29 10:53:17 +02:00
}
2017-01-02 03:57:23 +01:00
$shifts = [];
if ( $mode == 'single' ) {
$shifts [] = [
2014-08-22 22:34:13 +02:00
'start' => $start ,
'end' => $end ,
'RID' => $rid ,
2014-12-22 17:55:20 +01:00
'title' => $title ,
2017-01-02 03:57:23 +01:00
'shifttype_id' => $shifttype_id
2016-09-29 10:53:17 +02:00
];
2017-01-02 03:57:23 +01:00
} elseif ( $mode == 'multi' ) {
$shift_start = $start ;
do {
$shift_end = $shift_start + $length * 60 ;
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
if ( $shift_end > $end ) {
$shift_end = $end ;
}
if ( $shift_start >= $shift_end ) {
break ;
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
$shifts [] = [
2014-08-22 22:34:13 +02:00
'start' => $shift_start ,
'end' => $shift_end ,
'RID' => $rid ,
2014-12-22 17:55:20 +01:00
'title' => $title ,
2017-01-02 03:57:23 +01:00
'shifttype_id' => $shifttype_id
2016-09-29 10:53:17 +02:00
];
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
$shift_start = $shift_end ;
} while ( $shift_end < $end );
} elseif ( $mode == 'variable' ) {
rsort ( $change_hours );
$day = parse_date ( " Y-m-d H:i " , date ( " Y-m-d " , $start ) . " 00:00 " );
$change_index = 0 ;
2012-12-10 09:49:23 +01:00
// Ersten/nächsten passenden Schichtwechsel suchen
foreach ( $change_hours as $i => $change_hour ) {
2017-01-02 03:57:23 +01:00
if ( $start < $day + $change_hour * 60 * 60 ) {
$change_index = $i ;
} elseif ( $start == $day + $change_hour * 60 * 60 ) {
// Start trifft Schichtwechsel
2014-08-22 22:34:13 +02:00
$change_index = ( $i + count ( $change_hours ) - 1 ) % count ( $change_hours );
2017-01-02 03:57:23 +01:00
break ;
} else {
break ;
}
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
$shift_start = $start ;
do {
$day = parse_date ( " Y-m-d H:i " , date ( " Y-m-d " , $shift_start ) . " 00:00 " );
$shift_end = $day + $change_hours [ $change_index ] * 60 * 60 ;
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
if ( $shift_end > $end ) {
$shift_end = $end ;
}
if ( $shift_start >= $shift_end ) {
$shift_end += 24 * 60 * 60 ;
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
$shifts [] = [
2014-08-22 22:34:13 +02:00
'start' => $shift_start ,
'end' => $shift_end ,
'RID' => $rid ,
2014-12-26 02:34:57 +01:00
'title' => $title ,
2017-01-02 03:57:23 +01:00
'shifttype_id' => $shifttype_id
2016-09-29 10:53:17 +02:00
];
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
$shift_start = $shift_end ;
$change_index = ( $change_index + count ( $change_hours ) - 1 ) % count ( $change_hours );
} while ( $shift_end < $end );
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
$shifts_table = [];
foreach ( $shifts as $shift ) {
$shifts_table_entry = [
2014-12-22 17:55:20 +01:00
'timeslot' => '<span class="glyphicon glyphicon-time"></span> ' . date ( " Y-m-d H:i " , $shift [ 'start' ]) . ' - ' . date ( " H:i " , $shift [ 'end' ]) . '<br />' . Room_name_render ( Room ( $shift [ 'RID' ])),
'title' => ShiftType_name_render ( ShiftType ( $shifttype_id )) . ( $shift [ 'title' ] ? '<br />' . $shift [ 'title' ] : '' ),
2017-01-02 03:57:23 +01:00
'needed_angels' => ''
2014-12-22 17:55:20 +01:00
];
2017-01-02 03:57:23 +01:00
foreach ( $types as $type ) {
if ( isset ( $needed_angel_types [ $type [ 'id' ]]) && $needed_angel_types [ $type [ 'id' ]] > 0 ) {
$shifts_table_entry [ 'needed_angels' ] .= '<b>' . AngelType_name_render ( $type ) . ':</b> ' . $needed_angel_types [ $type [ 'id' ]] . '<br />' ;
}
}
$shifts_table [] = $shifts_table_entry ;
2016-09-29 10:53:17 +02:00
}
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
// Fürs Anlegen zwischenspeichern:
$_SESSION [ 'admin_shifts_shifts' ] = $shifts ;
2017-01-02 03:57:23 +01:00
$_SESSION [ 'admin_shifts_types' ] = $needed_angel_types ;
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
$hidden_types = " " ;
foreach ( $needed_angel_types as $type_id => $count ) {
$hidden_types .= form_hidden ( 'type_' . $type_id , $count );
}
return page_with_title ( _ ( " Preview " ), [
2016-09-29 10:53:17 +02:00
form ([
2014-08-23 19:15:10 +02:00
$hidden_types ,
2014-12-22 17:55:20 +01:00
form_hidden ( 'shifttype_id' , $shifttype_id ),
form_hidden ( 'title' , $title ),
2014-08-23 19:15:10 +02:00
form_hidden ( 'rid' , $rid ),
form_hidden ( 'start' , date ( " Y-m-d H:i " , $start )),
form_hidden ( 'end' , date ( " Y-m-d H:i " , $end )),
form_hidden ( 'mode' , $mode ),
form_hidden ( 'length' , $length ),
form_hidden ( 'change_hours' , implode ( ', ' , $change_hours )),
form_hidden ( 'angelmode' , $angelmode ),
form_submit ( 'back' , _ ( " back " )),
2016-09-29 10:53:17 +02:00
table ([
2014-12-22 17:55:20 +01:00
'timeslot' => _ ( 'Time and location' ),
'title' => _ ( 'Type and title' ),
2017-01-02 03:57:23 +01:00
'needed_angels' => _ ( 'Needed angels' )
2016-09-29 10:53:17 +02:00
], $shifts_table ),
2017-01-02 03:57:23 +01:00
form_submit ( 'submit' , _ ( " Save " ))
])
2016-09-29 10:53:17 +02:00
]);
2012-12-10 09:49:23 +01:00
}
2017-01-02 03:57:23 +01:00
} elseif ( isset ( $_REQUEST [ 'submit' ])) {
if ( ! is_array ( $_SESSION [ 'admin_shifts_shifts' ]) || ! is_array ( $_SESSION [ 'admin_shifts_types' ])) {
redirect ( page_link_to ( 'admin_shifts' ));
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
foreach ( $_SESSION [ 'admin_shifts_shifts' ] as $shift ) {
$shift [ 'URL' ] = null ;
$shift [ 'PSID' ] = null ;
$shift_id = Shift_create ( $shift );
if ( $shift_id === false ) {
engelsystem_error ( 'Unable to create shift.' );
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
engelsystem_log ( " Shift created: " . $shifttypes [ $shift [ 'shifttype_id' ]] . " with title " . $shift [ 'title' ] . " from " . date ( " Y-m-d H:i " , $shift [ 'start' ]) . " to " . date ( " Y-m-d H:i " , $shift [ 'end' ]));
$needed_angel_types_info = [];
foreach ( $_SESSION [ 'admin_shifts_types' ] as $type_id => $count ) {
$angel_type_source = sql_select ( " SELECT * FROM `AngelTypes` WHERE `id`=' " . sql_escape ( $type_id ) . " ' LIMIT 1 " );
if ( count ( $angel_type_source ) > 0 ) {
sql_query ( " INSERT INTO `NeededAngelTypes` SET `shift_id`=' " . sql_escape ( $shift_id ) . " ', `angel_type_id`=' " . sql_escape ( $type_id ) . " ', `count`=' " . sql_escape ( $count ) . " ' " );
$needed_angel_types_info [] = $angel_type_source [ 0 ][ 'name' ] . " : " . $count ;
}
}
2012-12-26 14:02:27 +01:00
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
engelsystem_log ( " Shift needs following angel types: " . join ( " , " , $needed_angel_types_info ));
success ( " Schichten angelegt. " );
redirect ( page_link_to ( 'admin_shifts' ));
} else {
unset ( $_SESSION [ 'admin_shifts_shifts' ]);
unset ( $_SESSION [ 'admin_shifts_types' ]);
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
if ( ! isset ( $_REQUEST [ 'rid' ])) {
$_REQUEST [ 'rid' ] = null ;
}
$angel_types = " " ;
foreach ( $types as $type ) {
$angel_types .= '<div class="col-md-4">' . form_spinner ( 'type_' . $type [ 'id' ], $type [ 'name' ], $needed_angel_types [ $type [ 'id' ]]) . '</div>' ;
}
2014-12-22 17:55:20 +01:00
2017-01-02 03:57:23 +01:00
return page_with_title ( admin_shifts_title (), [
2014-08-22 22:34:13 +02:00
msg (),
2016-09-29 10:53:17 +02:00
form ([
2014-12-22 17:55:20 +01:00
form_select ( 'shifttype_id' , _ ( 'Shifttype' ), $shifttypes , $shifttype_id ),
form_text ( 'title' , _ ( " Title " ), $title ),
2014-08-22 22:34:13 +02:00
form_select ( 'rid' , _ ( " Room " ), $room_array , $_REQUEST [ 'rid' ]),
2016-09-29 10:53:17 +02:00
div ( 'row' , [
div ( 'col-md-6' , [
form_text ( 'start' , _ ( " Start " ), date ( " Y-m-d H:i " , $start )),
form_text ( 'end' , _ ( " End " ), date ( " Y-m-d H:i " , $end )),
form_info ( _ ( " Mode " ), '' ),
form_radio ( 'mode' , _ ( " Create one shift " ), $mode == 'single' , 'single' ),
form_radio ( 'mode' , _ ( " Create multiple shifts " ), $mode == 'multi' , 'multi' ),
form_text ( 'length' , _ ( " Length " ), ! empty ( $_REQUEST [ 'length' ]) ? $_REQUEST [ 'length' ] : '120' ),
form_radio ( 'mode' , _ ( " Create multiple shifts with variable length " ), $mode == 'variable' , 'variable' ),
2017-01-02 03:57:23 +01:00
form_text ( 'change_hours' , _ ( " Shift change hours " ), ! empty ( $_REQUEST [ 'change_hours' ]) ? $_REQUEST [ 'change_hours' ] : '00, 04, 08, 10, 12, 14, 16, 18, 20, 22' )
2016-09-29 10:53:17 +02:00
]),
div ( 'col-md-6' , [
form_info ( _ ( " Needed angels " ), '' ),
form_radio ( 'angelmode' , _ ( " Take needed angels from room settings " ), $angelmode == 'location' , 'location' ),
form_radio ( 'angelmode' , _ ( " The following angels are needed " ), $angelmode == 'manually' , 'manually' ),
div ( 'row' , [
2017-01-02 03:57:23 +01:00
$angel_types
])
])
2016-09-29 10:53:17 +02:00
]),
2017-01-02 03:57:23 +01:00
form_submit ( 'preview' , _ ( " Preview " ))
])
2016-09-29 10:53:17 +02:00
]);
2011-09-06 20:45:06 +02:00
}