2011-09-06 20:45:06 +02:00
< ? php
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
$msg = " " ;
$ok = true ;
2014-08-22 22:34:13 +02: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' ;
$angelmode = 'location' ;
2012-12-10 09:49:23 +01:00
$length = '' ;
2013-09-10 14:27:31 +02:00
$change_hours = array ();
2014-08-22 22:34:13 +02:00
$name = " " ;
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-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-08-22 22:34:13 +02:00
if ( isset ( $_REQUEST [ 'preview' ]) || isset ( $_REQUEST [ 'back' ])) {
2012-12-10 09:49:23 +01:00
// Name/Bezeichnung der Schicht, darf leer sein
$name = strip_request_item ( 'name' );
2014-08-22 22:34:13 +02:00
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' ];
$msg .= error ( " Wähle bitte einen Raum aus. " , true );
}
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 ;
$msg .= error ( " Bitte gib einen Startzeitpunkt für die Schichten an. " , true );
}
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 ;
$msg .= error ( " Bitte gib einen Endzeitpunkt für die Schichten an. " , true );
}
2014-08-22 22:34:13 +02:00
2012-12-10 09:49:23 +01:00
if ( $start >= $end ) {
$ok = false ;
$msg .= error ( " Das Ende muss nach dem Startzeitpunkt liegen! " , true );
}
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 ;
$msg .= error ( " Bitte gib eine Schichtlänge in Minuten an. " , true );
}
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 ;
$msg .= error ( " Bitte gib die Schichtwechsel-Stunden kommagetrennt ein. " , true );
}
}
} else {
$ok = false ;
$msg .= error ( " Bitte wähle einen Modus. " , true );
}
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 ;
$msg .= error ( " Bitte überprüfe die Eingaben für die benötigten Engel des Typs " . $type [ 'name' ] . " . " , true );
}
}
if ( array_sum ( $needed_angel_types ) == 0 ) {
$ok = false ;
$msg .= error ( " Es werden 0 Engel benötigt. Bitte wähle benötigte Engel. " , true );
}
} else {
$ok = false ;
$msg .= error ( " Bitte Wähle einen Modus für die benötigten Engel. " , true );
}
} else {
$ok = false ;
$msg .= error ( " Bitte wähle benötigte Engel. " , true );
}
2014-08-22 22:34:13 +02: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-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 ,
'name' => $name
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-08-22 22:34:13 +02:00
2012-12-10 09:49:23 +01:00
if ( $shift_end > $end )
$shift_end = $end ;
if ( $shift_start >= $shift_end )
break ;
2014-08-22 22:34:13 +02:00
$shifts [] = array (
'start' => $shift_start ,
'end' => $shift_end ,
'RID' => $rid ,
'name' => $name
2012-12-10 09:49:23 +01:00
);
2014-08-22 22:34:13 +02: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-08-22 22:34:13 +02: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-08-22 22:34:13 +02: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-08-22 22:34:13 +02:00
$shifts [] = array (
'start' => $shift_start ,
'end' => $shift_end ,
'RID' => $rid ,
'name' => $name
2012-12-10 09:49:23 +01:00
);
2014-08-22 22:34:13 +02: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-08-22 22:34:13 +02:00
2012-12-10 09:49:23 +01:00
$shifts_table = " " ;
foreach ( $shifts as $shift ) {
2014-08-22 22:34:13 +02:00
$shifts_table .= '<tr><td><span class="glyphicon glyphicon-time"></span> ' . date ( " Y-m-d H:i " , $shift [ 'start' ]) . ' - ' . date ( " H:i " , $shift [ 'end' ]) . '<br /><span class="glyphicon glyphicon-map-marker"></span> ' . $room_array [ $shift [ 'RID' ]] . '</td>' ;
2012-12-10 09:49:23 +01:00
$shifts_table .= '<td>' . $shift [ 'name' ];
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 )
$shifts_table .= '<br /><span class="icon-icon_angel"></span> <b>' . $type [ 'name' ] . ':</b> ' . $needed_angel_types [ $type [ 'id' ]] . ' missing' ;
2012-12-10 09:49:23 +01:00
}
$shifts_table .= '</td></tr>' ;
}
2014-08-22 22:34:13 +02: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-08-22 22:34:13 +02:00
2012-12-10 09:49:23 +01:00
$hidden_types = " " ;
foreach ( $needed_angel_types as $type_id => $count )
$hidden_types .= '<input type="hidden" name="type_' . $type_id . '" value="' . $count . '" />' ;
2014-08-22 22:34:13 +02:00
return template_render ( '../templates/admin_shift_preview.html' , array (
'shifts_table' => $shifts_table ,
'name' => $name ,
'rid' => $rid ,
'start' => date ( " Y-m-d H:i " , $start ),
'end' => date ( " Y-m-d H:i " , $end ),
'mode' => $mode ,
'length' => $length ,
'change_hours' => implode ( ', ' , $change_hours ),
'angelmode' => $angelmode ,
'needed_angel_types' => $hidden_types
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-08-22 22:34:13 +02:00
2012-12-10 09:49:23 +01:00
foreach ( $_SESSION [ 'admin_shifts_shifts' ] as $shift ) {
sql_query ( " INSERT INTO `Shifts` SET `start`= " . sql_escape ( $shift [ 'start' ]) . " , `end`= " . sql_escape ( $shift [ 'end' ]) . " , `RID`= " . sql_escape ( $shift [ 'RID' ]) . " , `name`=' " . sql_escape ( $shift [ 'name' ]) . " ' " );
$shift_id = sql_id ();
2012-12-26 14:02:27 +01:00
engelsystem_log ( " Shift created: " . $shift [ 'name' ] . " from " . date ( " Y-m-d H:i " , $shift [ 'start' ]) . " to " . date ( " Y-m-d H:i " , $shift [ 'end' ]));
$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-08-22 22:34:13 +02:00
2012-12-26 14:02:27 +01:00
engelsystem_log ( " Shift needs following angel types: " . join ( " , " , $needed_angel_types_info ));
2012-12-10 09:49:23 +01:00
$msg = success ( " Schichten angelegt. " , true );
} 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-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' ]]);
return page_with_title ( admin_shifts_title (), array (
msg (),
$msg ,
form ( array (
form_text ( 'name' , _ ( " Name " ), $name ),
// TODO: form_textarea('description', _("Description"), ''),
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>' ,
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
?>