'view']; if (isset($shift['shift_id']) || isset($shift['id'])) { $parameters['shift_id'] = $shift['shift_id'] ?? $shift['id']; } return url('/shifts', $parameters); } /** * @param Shift $shift * @return string */ function shift_edit_link(Shift $shift) { return url('/user-shifts', ['edit_shift' => $shift->id]); } /** * Edit a single shift. * * @return string */ function shift_edit_controller() { $valid = true; $request = request(); if (!auth()->can('admin_shifts')) { throw_redirect(url('/user-shifts')); } if (!$request->has('edit_shift') || !test_request_int('edit_shift')) { throw_redirect(url('/user-shifts')); } $shift_id = $request->input('edit_shift'); $shift = Shift::findOrFail($shift_id); if (ScheduleShift::whereShiftId($shift->id)->first()) { warning(__( 'This shift was imported from a schedule so some changes will be overwritten with the next import.' )); } $locations = []; foreach (Location::orderBy('name')->get() as $location) { $locations[$location->id] = $location->name; } $angeltypes = AngelType::all()->pluck('name', 'id')->toArray(); $shifttypes = ShiftType::all()->pluck('name', 'id')->toArray(); $needed_angel_types = collect(NeededAngelTypes_by_shift($shift))->pluck('count', 'angel_type_id')->toArray(); foreach (array_keys($angeltypes) as $angeltype_id) { if (!isset($needed_angel_types[$angeltype_id])) { $needed_angel_types[$angeltype_id] = 0; } } $shifttype_id = $shift->shift_type_id; $title = $shift->title; $description = $shift->description; $rid = $shift->location_id; $start = $shift->start; $end = $shift->end; if ($request->hasPostData('submit')) { // Name/Bezeichnung der Schicht, darf leer sein $title = strip_request_item('title'); $description = strip_request_item_nl('description'); // Auswahl der sichtbaren Locations für die Schichten if ( $request->has('rid') && preg_match('/^\d+$/', $request->input('rid')) && isset($locations[$request->input('rid')]) ) { $rid = $request->input('rid'); } else { $valid = false; error(__('Please select a location.')); } if ($request->has('shifttype_id') && isset($shifttypes[$request->input('shifttype_id')])) { $shifttype_id = $request->input('shifttype_id'); } else { $valid = false; error(__('Please select a shifttype.')); } if ($request->has('start') && $tmp = DateTime::createFromFormat('Y-m-d H:i', $request->input('start'))) { $start = $tmp; } else { $valid = false; error(__('Please enter a valid starting time for the shifts.')); } if ($request->has('end') && $tmp = DateTime::createFromFormat('Y-m-d H:i', $request->input('end'))) { $end = $tmp; } else { $valid = false; error(__('Please enter a valid ending time for the shifts.')); } if ($start >= $end) { $valid = false; error(__('The ending time has to be after the starting time.')); } foreach ($needed_angel_types as $needed_angeltype_id => $count) { $needed_angel_types[$needed_angeltype_id] = 0; $queryKey = 'angeltype_count_' . $needed_angeltype_id; if ($request->has($queryKey)) { if (test_request_int($queryKey)) { $needed_angel_types[$needed_angeltype_id] = trim($request->input($queryKey)); } else { $valid = false; error(sprintf( __('Please check your input for needed angels of type %s.'), $angeltypes[$needed_angeltype_id] )); } } } if ($valid) { $oldShift = Shift::find($shift->id); $shift->shift_type_id = $shifttype_id; $shift->title = $title; $shift->description = $description; $shift->location_id = $rid; $shift->start = $start; $shift->end = $end; $shift->updatedBy()->associate(auth()->user()); $shift->save(); event('shift.updating', [ 'shift' => $shift, 'oldShift' => $oldShift, ]); NeededAngelType::whereShiftId($shift_id)->delete(); $needed_angel_types_info = []; foreach ($needed_angel_types as $type_id => $count) { $angeltype = AngelType::find($type_id); if (!empty($angeltype) && $count > 0) { $neededAngelType = new NeededAngelType(); $neededAngelType->shift()->associate($shift); $neededAngelType->angel_type_id = $type_id; $neededAngelType->count = $count; $neededAngelType->save(); $needed_angel_types_info[] = $angeltypes[$type_id] . ': ' . $count; } } engelsystem_log( 'Updated shift \'' . $shifttypes[$shifttype_id] . ', ' . $title . '\' from ' . $start->format('Y-m-d H:i') . ' to ' . $end->format('Y-m-d H:i') . ' with angel types ' . join(', ', $needed_angel_types_info) . ' and description ' . $description ); success(__('Shift updated.')); throw_redirect(shift_link($shift)); } } $angel_types_spinner = ''; foreach ($angeltypes as $angeltype_id => $angeltype_name) { $angel_types_spinner .= form_spinner( 'angeltype_count_' . $angeltype_id, htmlspecialchars($angeltype_name), $needed_angel_types[$angeltype_id], [], (bool) ScheduleShift::whereShiftId($shift->id)->first(), ); } $link = button(url('/shifts', ['action' => 'view', 'shift_id' => $shift_id]), icon('chevron-left'), 'btn-sm', '', __('general.back')); return page_with_title( $link . ' ' . shifts_title(), [ msg(), '', form([ form_select('shifttype_id', __('Shifttype'), $shifttypes, $shifttype_id), form_text('title', __('title.title'), $title), form_select('rid', __('Location:'), $locations, $rid), form_text('start', __('Start:'), $start->format('Y-m-d H:i')), form_text('end', __('End:'), $end->format('Y-m-d H:i')), form_textarea('description', __('Additional description'), $description), form_info( '', __('This description is for single shifts, otherwise please use the description in shift type.') ), '