2011-09-06 20:45:06 +02:00
< ? php
2014-12-07 17:34:29 +01:00
2013-11-25 21:04:58 +01:00
function admin_shifts_title () {
return _ ( " Create shifts " );
}
2011-09-06 20:45:06 +02:00
// Assistent zum Anlegen mehrerer neuer Schichten
function admin_shifts () {
2012-12-10 09:49:23 +01:00
$ok = true ;
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
$rid = 0 ;
2014-08-22 22:34:13 +02:00
$start = DateTime :: createFromFormat ( " Y-m-d H:i " , date ( " Y-m-d " ) . " 00:00 " ) -> getTimestamp ();
$end = $start + 24 * 60 * 60 ;
$mode = 'single' ;
2014-12-12 22:41:35 +01:00
$angelmode = 'manually' ;
2012-12-10 09:49:23 +01:00
$length = '' ;
2013-09-10 14:27:31 +02:00
$change_hours = array ();
2014-12-22 17:55:20 +01:00
$title = " " ;
$shifttype_id = null ;
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` " );
2014-08-22 22:34:13 +02:00
$room_array = array ();
2012-12-10 09:49:23 +01:00
foreach ( $rooms as $room )
$room_array [ $room [ 'RID' ]] = $room [ 'Name' ];
2014-12-22 17:55:20 +01:00
2014-08-22 22:34:13 +02:00
// Engeltypen laden
2012-12-10 09:49:23 +01:00
$types = sql_select ( " SELECT * FROM `AngelTypes` ORDER BY `name` " );
2014-08-22 22:34:13 +02:00
$needed_angel_types = array ();
2012-12-10 09:49:23 +01:00
foreach ( $types as $type )
$needed_angel_types [ $type [ 'id' ]] = 0 ;
2014-12-22 17:55:20 +01:00
// Load shift types
$shifttypes_source = ShiftTypes ();
if ( $shifttypes_source === false )
engelsystem_error ( 'Unable to load shift types.' );
$shifttypes = [];
foreach ( $shifttypes_source as $shifttype )
$shifttypes [ $shifttype [ 'id' ]] = $shifttype [ 'name' ];
2014-08-22 22:34:13 +02:00
if ( isset ( $_REQUEST [ 'preview' ]) || isset ( $_REQUEST [ 'back' ])) {
2014-12-22 17:55:20 +01:00
if ( isset ( $_REQUEST [ 'shifttype_id' ])) {
$shifttype = ShiftType ( $_REQUEST [ 'shifttype_id' ]);
if ( $shifttype === false )
engelsystem_error ( 'Unable to load shift type.' );
if ( $shifttype == null ) {
$ok = false ;
error ( _ ( 'Please select a shift type.' ));
} else
$shifttype_id = $_REQUEST [ 'shifttype_id' ];
} else {
$ok = false ;
error ( _ ( 'Please select a shift type.' ));
}
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
2014-08-22 22:34:13 +02:00
if ( isset ( $_REQUEST [ 'rid' ]) && preg_match ( " /^[0-9]+ $ / " , $_REQUEST [ 'rid' ]) && isset ( $room_array [ $_REQUEST [ 'rid' ]]))
2012-12-10 09:49:23 +01:00
$rid = $_REQUEST [ 'rid' ];
else {
$ok = false ;
$rid = $rooms [ 0 ][ 'RID' ];
2014-12-22 17:55:20 +01:00
error ( _ ( 'Please select a location.' ));
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01:00
2014-08-22 22:34:13 +02:00
if ( isset ( $_REQUEST [ 'start' ]) && $tmp = DateTime :: createFromFormat ( " Y-m-d H:i " , trim ( $_REQUEST [ 'start' ])))
2012-12-10 09:49:23 +01:00
$start = $tmp -> getTimestamp ();
else {
$ok = false ;
2014-12-22 17:55:20 +01:00
error ( _ ( 'Please select a start time.' ));
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01:00
2014-08-22 22:34:13 +02:00
if ( isset ( $_REQUEST [ 'end' ]) && $tmp = DateTime :: createFromFormat ( " Y-m-d H:i " , trim ( $_REQUEST [ 'end' ])))
2012-12-10 09:49:23 +01:00
$end = $tmp -> getTimestamp ();
else {
$ok = false ;
2014-12-22 17:55:20 +01:00
error ( _ ( 'Please select an end time.' ));
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
if ( $start >= $end ) {
$ok = false ;
2014-12-22 17:55:20 +01:00
error ( _ ( 'The shifts end has to be after its start.' ));
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01:00
2014-08-22 22:34:13 +02:00
if ( isset ( $_REQUEST [ 'mode' ])) {
2012-12-10 09:49:23 +01:00
if ( $_REQUEST [ 'mode' ] == 'single' ) {
$mode = 'single' ;
2014-08-22 22:34:13 +02:00
} elseif ( $_REQUEST [ 'mode' ] == 'multi' ) {
if ( isset ( $_REQUEST [ 'length' ]) && preg_match ( " /^[0-9]+ $ / " , trim ( $_REQUEST [ 'length' ]))) {
2012-12-10 09:49:23 +01:00
$mode = 'multi' ;
$length = trim ( $_REQUEST [ 'length' ]);
} else {
$ok = false ;
2014-12-22 17:55:20 +01:00
error ( _ ( 'Please enter a shift duration in minutes.' ));
2012-12-10 09:49:23 +01:00
}
2014-08-22 22:34:13 +02:00
} elseif ( $_REQUEST [ 'mode' ] == 'variable' ) {
if ( isset ( $_REQUEST [ 'change_hours' ]) && preg_match ( " /^([0-9] { 2}(,| $ ))/ " , trim ( str_replace ( " " , " " , $_REQUEST [ 'change_hours' ])))) {
2012-12-10 09:49:23 +01:00
$mode = 'variable' ;
2012-12-30 15:20:44 +01:00
$change_hours = array_map ( 'trim' , explode ( " , " , $_REQUEST [ 'change_hours' ]));
2012-12-10 09:49:23 +01:00
} else {
$ok = false ;
2014-12-22 17:55:20 +01:00
error ( _ ( 'Please split the shift-change hours by colons.' ));
2012-12-10 09:49:23 +01:00
}
}
} else {
$ok = false ;
2014-12-22 17:55:20 +01:00
error ( _ ( 'Please select a mode.' ));
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01:00
2014-08-22 22:34:13 +02:00
if ( isset ( $_REQUEST [ 'angelmode' ])) {
2012-12-10 09:49:23 +01:00
if ( $_REQUEST [ 'angelmode' ] == 'location' ) {
$angelmode = 'location' ;
2014-08-22 22:34:13 +02:00
} elseif ( $_REQUEST [ 'angelmode' ] == 'manually' ) {
2012-12-10 09:49:23 +01:00
$angelmode = 'manually' ;
foreach ( $types as $type ) {
2014-08-22 22:34:13 +02:00
if ( isset ( $_REQUEST [ 'type_' . $type [ 'id' ]]) && preg_match ( " /^[0-9]+ $ / " , trim ( $_REQUEST [ 'type_' . $type [ 'id' ]]))) {
2012-12-10 09:49:23 +01:00
$needed_angel_types [ $type [ 'id' ]] = trim ( $_REQUEST [ 'type_' . $type [ 'id' ]]);
} else {
$ok = false ;
2014-12-22 17:55:20 +01:00
error ( sprintf ( _ ( 'Please check the needed angels for team %s.' ), $type [ 'name' ]));
2012-12-10 09:49:23 +01:00
}
}
if ( array_sum ( $needed_angel_types ) == 0 ) {
$ok = false ;
2014-12-22 17:55:20 +01:00
error ( _ ( 'There are 0 angels needed. Please enter the amounts of needed angels.' ));
2012-12-10 09:49:23 +01:00
}
} else {
$ok = false ;
2014-12-22 17:55:20 +01:00
error ( _ ( 'Please select a mode for needed angels.' ));
2012-12-10 09:49:23 +01:00
}
} else {
$ok = false ;
2014-12-22 17:55:20 +01:00
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
2014-08-22 22:34:13 +02:00
if ( isset ( $_REQUEST [ 'back' ]))
2012-12-10 09:49:23 +01:00
$ok = false ;
2014-12-22 17:55:20 +01:00
2014-08-22 22:34:13 +02:00
// Alle Eingaben in Ordnung
2012-12-10 09:49:23 +01:00
if ( $ok ) {
if ( $angelmode == 'location' ) {
2014-08-22 22:34:13 +02:00
$needed_angel_types = array ();
2012-12-10 09:49:23 +01:00
$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' ];
}
2014-08-22 22:34:13 +02:00
$shifts = array ();
2012-12-10 09:49:23 +01:00
if ( $mode == 'single' ) {
2014-08-22 22:34:13 +02:00
$shifts [] = array (
'start' => $start ,
'end' => $end ,
'RID' => $rid ,
2014-12-22 17:55:20 +01:00
'title' => $title ,
'shifttype_id' => $shifttype_id
2012-12-10 09:49:23 +01:00
);
2014-08-22 22:34:13 +02:00
} elseif ( $mode == 'multi' ) {
2012-12-10 09:49:23 +01:00
$shift_start = $start ;
do {
$shift_end = $shift_start + $length * 60 ;
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
if ( $shift_end > $end )
$shift_end = $end ;
if ( $shift_start >= $shift_end )
break ;
2014-12-22 17:55:20 +01:00
2014-08-22 22:34:13 +02:00
$shifts [] = array (
'start' => $shift_start ,
'end' => $shift_end ,
'RID' => $rid ,
2014-12-22 17:55:20 +01:00
'title' => $title ,
'shifttype_id' => $shifttype_id
2012-12-10 09:49:23 +01:00
);
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
$shift_start = $shift_end ;
} while ( $shift_end < $end );
2014-08-22 22:34:13 +02:00
} elseif ( $mode == 'variable' ) {
2012-12-10 09:49:23 +01:00
rsort ( $change_hours );
2014-08-22 22:34:13 +02:00
$day = DateTime :: createFromFormat ( " Y-m-d H:i " , date ( " Y-m-d " , $start ) . " 00:00 " ) -> getTimestamp ();
2012-12-10 09:49:23 +01:00
$change_index = 0 ;
// Ersten/nächsten passenden Schichtwechsel suchen
foreach ( $change_hours as $i => $change_hour ) {
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 );
2012-12-10 09:49:23 +01:00
break ;
} else
break ;
}
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
$shift_start = $start ;
do {
2014-08-22 22:34:13 +02:00
$day = DateTime :: createFromFormat ( " Y-m-d H:i " , date ( " Y-m-d " , $shift_start ) . " 00:00 " ) -> getTimestamp ();
2012-12-10 09:49:23 +01:00
$shift_end = $day + $change_hours [ $change_index ] * 60 * 60 ;
2014-12-22 17:55:20 +01:00
2012-12-10 09:49: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
2014-08-22 22:34:13 +02:00
$shifts [] = array (
'start' => $shift_start ,
'end' => $shift_end ,
'RID' => $rid ,
2014-12-26 02:34:57 +01:00
'title' => $title ,
2014-12-22 17:55:20 +01:00
'shifttype_id' => $shifttype_id
2012-12-10 09:49:23 +01:00
);
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
$shift_start = $shift_end ;
2014-08-22 22:34:13 +02:00
$change_index = ( $change_index + count ( $change_hours ) - 1 ) % count ( $change_hours );
2012-12-10 09:49:23 +01:00
} while ( $shift_end < $end );
}
2014-12-22 17:55:20 +01:00
2014-08-23 19:15:10 +02:00
$shifts_table = array ();
2012-12-10 09:49:23 +01:00
foreach ( $shifts as $shift ) {
2014-12-22 17:55:20 +01:00
$shifts_table_entry = [
'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' ] : '' ),
'needed_angels' => ''
];
foreach ( $types as $type )
2014-08-22 22:34:13 +02:00
if ( isset ( $needed_angel_types [ $type [ 'id' ]]) && $needed_angel_types [ $type [ 'id' ]] > 0 )
2014-12-22 17:55:20 +01:00
$shifts_table_entry [ 'needed_angels' ] .= '<b>' . AngelType_name_render ( $type ) . ':</b> ' . $needed_angel_types [ $type [ 'id' ]] . '<br />' ;
2014-08-23 19:15:10 +02:00
$shifts_table [] = $shifts_table_entry ;
2012-12-10 09:49:23 +01: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 ;
$_SESSION [ 'admin_shifts_types' ] = $needed_angel_types ;
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
$hidden_types = " " ;
foreach ( $needed_angel_types as $type_id => $count )
2014-08-23 19:15:10 +02:00
$hidden_types .= form_hidden ( 'type_' . $type_id , $count );
return page_with_title ( _ ( " Preview " ), array (
form ( array (
$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 " )),
table ( array (
2014-12-22 17:55:20 +01:00
'timeslot' => _ ( 'Time and location' ),
'title' => _ ( 'Type and title' ),
'needed_angels' => _ ( 'Needed angels' )
2014-08-23 19:15:10 +02:00
), $shifts_table ),
2014-12-22 17:55:20 +01:00
form_submit ( 'submit' , _ ( " Save " ))
))
2012-12-10 09:49:23 +01:00
));
}
2014-08-22 22:34:13 +02:00
} elseif ( isset ( $_REQUEST [ 'submit' ])) {
if ( ! is_array ( $_SESSION [ 'admin_shifts_shifts' ]) || ! is_array ( $_SESSION [ 'admin_shifts_types' ]))
2012-12-30 18:27:45 +01:00
redirect ( page_link_to ( 'admin_shifts' ));
2014-12-22 17:55:20 +01:00
2012-12-10 09:49:23 +01:00
foreach ( $_SESSION [ 'admin_shifts_shifts' ] as $shift ) {
2014-12-07 17:34:29 +01:00
$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
2014-12-26 02:34:57 +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' ]));
2012-12-26 14:02:27 +01:00
$needed_angel_types_info = array ();
2012-12-10 09:49:23 +01:00
foreach ( $_SESSION [ 'admin_shifts_types' ] as $type_id => $count ) {
2012-12-26 14:02:27 +01:00
$angel_type_source = sql_select ( " SELECT * FROM `AngelTypes` WHERE `id`= " . sql_escape ( $type_id ) . " LIMIT 1 " );
2014-08-22 22:34:13 +02:00
if ( count ( $angel_type_source ) > 0 ) {
2012-12-26 14:02:27 +01:00
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-10 09:49:23 +01:00
}
}
2014-12-22 17:55:20 +01:00
2012-12-26 14:02:27 +01:00
engelsystem_log ( " Shift needs following angel types: " . join ( " , " , $needed_angel_types_info ));
2014-12-22 17:55:20 +01:00
success ( " Schichten angelegt. " );
redirect ( page_link_to ( 'admin_shifts' ));
2012-12-10 09:49:23 +01:00
} else {
2014-08-22 22:34:13 +02:00
unset ( $_SESSION [ 'admin_shifts_shifts' ]);
unset ( $_SESSION [ 'admin_shifts_types' ]);
2012-12-10 09:49:23 +01:00
}
2014-12-22 17:55:20 +01:00
2014-08-22 22:34:13 +02:00
if ( ! isset ( $_REQUEST [ 'rid' ]))
$_REQUEST [ 'rid' ] = null ;
2012-12-10 09:49:23 +01:00
$room_select = html_select_key ( 'rid' , 'rid' , $room_array , $_REQUEST [ 'rid' ]);
$angel_types = " " ;
2014-08-22 22:34:13 +02:00
foreach ( $types as $type )
$angel_types .= form_spinner ( 'type_' . $type [ 'id' ], $type [ 'name' ], $needed_angel_types [ $type [ 'id' ]]);
2014-12-22 17:55:20 +01:00
2014-08-22 22:34:13 +02:00
return page_with_title ( admin_shifts_title (), array (
msg (),
form ( array (
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' ]),
'<div class="row">' ,
'<div class="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' ),
form_text ( 'change_hours' , _ ( " Shift change hours " ), ! empty ( $_REQUEST [ 'change_hours' ]) ? $_REQUEST [ 'change_hours' ] : '00, 04, 08, 10, 12, 14, 16, 18, 20, 22' ),
'</div>' ,
'<div class="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' ),
$angel_types ,
'</div>' ,
'</div>' ,
2014-12-22 17:55:20 +01:00
form_submit ( 'preview' , _ ( " Preview " ))
))
2012-12-10 09:49:23 +01:00
));
2011-09-06 20:45:06 +02:00
}
2011-09-16 12:22:03 +02:00
?>