diff --git a/app/Http/Controllers/User/UserAttendancesController.php b/app/Http/Controllers/User/UserAttendancesController.php index 9ad92bc..93b24af 100644 --- a/app/Http/Controllers/User/UserAttendancesController.php +++ b/app/Http/Controllers/User/UserAttendancesController.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Exports\AttendanceExportView; use App\Exports\AttendanceGroupedExportView; +use Illuminate\Support\Facades\Validator; use Maatwebsite\Excel\Facades\Excel; use App\Subject; @@ -15,6 +16,26 @@ use App\Attendance; class UserAttendancesController extends Controller { + + protected function validator(array $data) + { + $messages = [ + 'student_id.required' => 'Numer indeksu jest wymagany.', + 'student_name.required' => 'Imię jest wymagane.', + 'student_surname.required' => 'Nazwisko jest wymagane.', + 'classes_id.required' => 'Wskazanie zajęć jest wymagane.', + 'classes_id.exists' => 'Niepoprawne zajęcia.', + ]; + + $rules = [ + 'classes_id' => ['required', 'exists:classes,id'], + 'student_id' => ['required'], + 'student_name' => ['required'], + 'student_surname' => ['required'], + ]; + return Validator::make($data, $rules, $messages); + } + public function index($groupBy='classes_id') { $user_id = Auth::id(); @@ -29,19 +50,32 @@ class UserAttendancesController extends Controller public function add_attendance(Request $request) { + $validator = $this->validator($request->all()); + if ($validator->fails()) { + return redirect()->back() + ->withErrors($validator) + ->withInput(); + } $classes_id = $request->input('classes_id'); $student_id_number = $request->input('student_id'); $student_name = $request->input('student_name'); $student_surname = $request->input('student_surname'); $seat_number = $request->input('seat_number'); $note = $request->input('note'); + $attendances = Attendance::where('classes_id', $classes_id)->get(); + $student_ids = $attendances->pluck('student_id_number')->toArray(); + + if (in_array($student_id_number, $student_ids)) { // if student attendance record already exists + return redirect()->back() + ->withErrors(['Ten numer indeksu został już wcześniej zapisany na te zajęcia.']); + } Attendance::create([ - 'classes_id' => $classes_id, - 'student_id_number' => $student_id_number, - 'student_name' => $student_name, - 'student_surname' => $student_surname, - 'seat_number' => $seat_number, - 'notes' => $note + 'classes_id' => $classes_id, + 'student_id_number' => $student_id_number, + 'student_name' => $student_name, + 'student_surname' => $student_surname, + 'seat_number' => $seat_number, + 'notes' => $note ]); return redirect()->back(); } diff --git a/app/Http/Controllers/User/UserClassesController.php b/app/Http/Controllers/User/UserClassesController.php index 0230cc7..c6779fe 100644 --- a/app/Http/Controllers/User/UserClassesController.php +++ b/app/Http/Controllers/User/UserClassesController.php @@ -12,9 +12,45 @@ use App\Classes; use App\Room; use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\Rule; class UserClassesController extends Controller { + + protected function validator(array $data) + { + $messages = [ + 'subject_id.required' => 'Wskazanie przedmiotu jest wymagane.', + 'subject_id.exists' => 'Wybrany przedmiot jest niepoprawny.', + 'date.required' => 'Data jest wymagana.', + 'date.date' => 'Niepoprawny format daty.', + 'mode.in' => 'Tryb zajęć jest niepoprawny.' + ]; + + $rules = [ + 'subject_id' => ['required', 'exists:subjects,id'], + 'date' => ['required', 'date'], + 'mode' => Rule::in([null, 'test', 'quick']) + ]; + return Validator::make($data, $rules, $messages); + } + + protected function student_validator(array $data) + { + $messages = [ + 'student_id_number.required' => 'Numer indeksu jest wymagany.', + 'student_name.required' => 'Imię jest wymagane.', + 'student_surname.required' => 'Nazwisko jest wymagane.', + ]; + + $rules = [ + 'student_id_number' => ['required'], + 'student_name' => ['required'], + 'student_surname' => ['required'], + ]; + return Validator::make($data, $rules, $messages); + } + public function index($groupBy = 'subject_id') { $user_id = Auth::id(); $subjects = Subject::where('user_id', $user_id)->get(); @@ -36,6 +72,12 @@ class UserClassesController extends Controller { } public function add_classes(Request $request) { + $validator = $this->validator($request->all()); + if ($validator->fails()) { + return redirect()->back() + ->withErrors($validator) + ->withInput(); + } $subject_id = $request->input('subject_id'); $date = $request->input('date'); $mode = $request->input('mode'); @@ -71,6 +113,12 @@ class UserClassesController extends Controller { } public function start_classes_verified(Request $request) { + $validator = $this->student_validator($request->all()); + if ($validator->fails()) { + return redirect()->back() + ->withErrors($validator) + ->withInput(); + } $student_id_number = $request->input('student_id_number'); $student_name = $request->input('student_name'); $student_surname = $request->input('student_surname'); diff --git a/app/Http/Controllers/User/UserSubjectsController.php b/app/Http/Controllers/User/UserSubjectsController.php index f5048c1..a79cf7e 100644 --- a/app/Http/Controllers/User/UserSubjectsController.php +++ b/app/Http/Controllers/User/UserSubjectsController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\User; use App\Http\Controllers\Controller; +use Illuminate\Support\Facades\Validator; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -11,6 +12,38 @@ use App\Room; class UserSubjectsController extends Controller { + protected function validator(array $data) + { + $messages = [ + 'name.required' => 'Nazwa przedmiotu jest wymagana.', + 'name.unique' => 'Podana nazwa przedmiotu już istnieje w systemie.', + 'room_id.required' => 'Sala jest wymagana.', + 'room_id.exists' => 'Niepoprawny numer sali.' + ]; + + $rules = [ + 'name' => ['required', 'unique:subjects,name'], + 'room_id' => ['required', 'exists:rooms,id'], + ]; + return Validator::make($data, $rules, $messages); + } + + protected function edited_validator(array $data) + { + $messages = [ + 'name_e.required' => 'Nazwa przedmiotu jest wymagana.', + 'name_e.unique' => 'Podana nazwa przedmiotu już istnieje w systemie.', + 'room_id_e.required' => 'Sala jest wymagana.', + 'room_id_e.exists' => 'Niepoprawny numer sali.' + ]; + + $rules = [ + 'name_e' => ['required', 'unique:subjects,name'], + 'room_id_e' => ['required', 'exists:rooms,id'], + ]; + return Validator::make($data, $rules, $messages); + } + public function index($groupBy = 'weekday') { $user_id = Auth::id(); $subjects = Subject::where('user_id', $user_id)->orderBy('name','ASC')->get(); @@ -27,19 +60,24 @@ class UserSubjectsController extends Controller } public function add_subject(Request $request) { + + $validator = $this->validator($request->all()); + if ($validator->fails()) { + return redirect()->back() + ->withErrors($validator) + ->withInput(); + } $name = $request->input('name'); -// $type = $request->input('type'); $weekday = $request->input('weekday'); $time = $request->input('time'); $room_id = $request->input('room_id'); - $user_id_n = Auth::id(); + $user_id = Auth::id(); Subject::create([ 'name' => $name, -// 'type' => $type, 'weekday'=> $weekday, 'time' => $time, 'room_id' => $room_id, - 'user_id' => $user_id_n + 'user_id' => $user_id ]); return redirect()->back(); } @@ -50,9 +88,25 @@ class UserSubjectsController extends Controller return redirect()->back(); } - public function edit_subject($subject_id) + public function edit_subject(Request $request) { - Subject::find($subject_id); + $subject_id = $request->input('subject_id'); + $subject = Subject::find($subject_id); + if($subject) { + $validator = $this->edited_validator($request->all()); + if ($validator->fails()) { + return redirect()->back() + ->withErrors($validator) + ->withInput() + ->with('subject_id_redirected', $subject_id); + } + $subject->name = $request->input('name_e'); + $subject->weekday = $request->input('weekday_e'); + $subject->time = $request->input('time_e'); + $subject->room_id = $request->input('room_id_e'); + $subject->save(); + $subject->refresh(); + } return redirect()->back(); } } diff --git a/app/Room.php b/app/Room.php index c6b0129..55bbc00 100644 --- a/app/Room.php +++ b/app/Room.php @@ -7,6 +7,6 @@ use Illuminate\Database\Eloquent\Model; class Room extends Model { protected $fillable = [ - 'name', 'capacity', 'type', 'arrangement' + 'name', 'capacity', 'arrangement' ]; } diff --git a/app/Subject.php b/app/Subject.php index 5e5b8c6..90b8d9d 100644 --- a/app/Subject.php +++ b/app/Subject.php @@ -7,6 +7,6 @@ use Illuminate\Database\Eloquent\Model; class Subject extends Model { protected $fillable = [ - 'name', 'type', 'weekday', 'time', 'room_id', 'user_id' + 'name', 'weekday', 'time', 'room_id', 'user_id' ]; } diff --git a/database/migrations/2019_11_26_232906_create_subjects_table.php b/database/migrations/2019_11_26_232906_create_subjects_table.php index 34a7d5b..a8ce4f0 100644 --- a/database/migrations/2019_11_26_232906_create_subjects_table.php +++ b/database/migrations/2019_11_26_232906_create_subjects_table.php @@ -15,8 +15,7 @@ class CreateSubjectsTable extends Migration { Schema::create('subjects', function (Blueprint $table) { $table->bigIncrements('id')->unique(); - $table->string('name'); -// $table->string('type')->nullable(); + $table->string('name')->unique(); $table->string('weekday')->nullable(); $table->string('time')->nullable(); $table->integer('room_id'); diff --git a/public/js/custom.js b/public/js/custom.js index 28dd446..0162f8c 100644 --- a/public/js/custom.js +++ b/public/js/custom.js @@ -3,7 +3,6 @@ $(document).ready(function(){ $('.card-reader').toggleClass('open'); }); - $('.add-subject-btn').on('click', function () { $('.add-subject').toggleClass('open'); if ($('.add-subject').first().hasClass('open')) { @@ -36,6 +35,26 @@ $(document).ready(function(){ $(this).find(`#note_content-${id}`).first().val(originalText); }); + $('.edit-subject-btn').on('click', function () { + $(this).parents('tr.editable').next().toggleClass('d-none'); + $(this).parents('tr.editable').toggleClass('d-none'); + }); + + $('.edit-subject-btn-cancel').on('click', function () { + $(this).parents('tr.edit-subject-tr').prev().toggleClass('d-none'); + $(this).parents('tr.edit-subject-tr').toggleClass('d-none'); + }); + + if($('body').find('.invalid-feedback-alert').length > 0) { + if($('.add-subject').find('.invalid-feedback').length > 0) { + $('.add-subject-btn').first().click(); + } + if($('.edit-subject-tr').find('.invalid-feedback').length > 0) { + let subject_id = $('#subject_id_redirected').val(); + $(`#tr-editable-${subject_id}`).find('.edit-subject-btn').first().click(); + } + } + $('#sort-select').on('change', function() { $(location).attr('href', $(this).val()) }); diff --git a/resources/views/map/start_map.blade.php b/resources/views/map/start_map.blade.php index 5084cbe..340a7d8 100644 --- a/resources/views/map/start_map.blade.php +++ b/resources/views/map/start_map.blade.php @@ -14,6 +14,15 @@

Kod: {{ $classes_code }}

Przyłóż legitymację do czytnika

+ @if ($errors->any()) +
+ +
+ @endif
diff --git a/resources/views/user/user_attendances.blade.php b/resources/views/user/user_attendances.blade.php index 11da3cf..60b5466 100644 --- a/resources/views/user/user_attendances.blade.php +++ b/resources/views/user/user_attendances.blade.php @@ -12,12 +12,19 @@
- + @if ($errors->any()) +
+ +
+ @endif
Dodaj obecność
@csrf -
@@ -31,9 +38,9 @@ @error('classes_id') - - {{ $message }} - + + {{ $message }} + @enderror
@@ -84,7 +91,7 @@
- + @error('seat_number') diff --git a/resources/views/user/user_classes.blade.php b/resources/views/user/user_classes.blade.php index 5c5b6a1..5d3cc09 100644 --- a/resources/views/user/user_classes.blade.php +++ b/resources/views/user/user_classes.blade.php @@ -8,10 +8,18 @@

Sprawdź obecność

+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif
@csrf -
@@ -23,9 +31,9 @@ @error('subject_id') - - {{ $message }} - + + {{ $message }} + @enderror
@@ -37,9 +45,9 @@ @error('date') - - {{ $message }} - + + {{ $message }} + @enderror
@@ -49,11 +57,11 @@
- +
- +
diff --git a/resources/views/user/user_subjects.blade.php b/resources/views/user/user_subjects.blade.php index 0770ee9..486f028 100644 --- a/resources/views/user/user_subjects.blade.php +++ b/resources/views/user/user_subjects.blade.php @@ -9,7 +9,16 @@

Moje przedmioty {{ $subjects->count() }}

- + @if ($errors->any()) +
+ +
+ + @endif
Dodaj nowy przedmiot
@@ -21,9 +30,9 @@ @error('name') - - {{ $message }} - + + {{ $message }} + @enderror
@@ -33,7 +42,7 @@
- @foreach ($weekdays as $weekday) @if ($weekday == $defaultWeekday) @@ -46,9 +55,9 @@ @error('weekday') - - {{ $message }} - + + {{ $message }} + @enderror
@@ -57,12 +66,12 @@
- + @error('time') - - {{ $message }} - + + {{ $message }} + @enderror
@@ -78,23 +87,9 @@ @error('room_id') - - {{ $message }} - - @enderror - - - -
- - -
- - - @error('user_id') - - {{ $message }} - + + {{ $message }} + @enderror
@@ -139,23 +134,90 @@ Nazwa Dzień tygodnia Godzina - Prowadzący Sala @foreach ($subjects_list as $subject) - - {{ $subject->name }} - {{ $subject->weekday }} - {{ $subject->time }} - {{ App\User::find($subject->user_id)->name }} {{ App\User::find($subject->user_id)->surname }} - {{ App\Room::find($subject->room_id)->name }} + + {{ $subject->name }} + {{ $subject->weekday }} + {{ $subject->time }} + {{ App\Room::find($subject->room_id)->name }} + + + - - Edytuj + + + + + @csrf + +
+ + + + + + + + + +
+ + @error('name_e') + + {{ $message }} + + @enderror + + + @error('weekday_e') + + {{ $message }} + + @enderror + + + @error('time_e') + + {{ $message }} + + @enderror + + + @error('room_id_e') + + {{ $message }} + + @enderror + + + + +
+
+ @include('user.delete_confirmation_subject', [$subject]) diff --git a/routes/web.php b/routes/web.php index e6aa08d..839bbc3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -18,66 +18,69 @@ Auth::routes(); Route::get('/home', 'HomeController@index')->name('home'); -Route::group(array('prefix' => 'admin', 'namespace' => 'Admin'), function() -{ - Route::get('/', 'AdminPanelController@index')->name('admin'); - Route::get('/users', 'AdminUsersController@index')->name('admin_users'); - Route::get('/subjects', 'AdminSubjectsController@index')->name('admin_subjects'); - Route::get('/rooms', 'AdminRoomsController@index')->name('admin_rooms'); - Route::get('/classes', 'AdminClassesController@index')->name('admin_classes'); - Route::get('/attendances', 'AdminAttendancesController@index')->name('admin_attendances'); - Route::get('/test', 'AdminPanelController@test_connection')->name('admin_test_connection'); +Route::group(['middleware' => 'auth'], function () { + Route::group(array('prefix' => 'admin', 'namespace' => 'Admin'), function() { + Route::get('/', 'AdminPanelController@index')->name('admin'); + Route::get('/users', 'AdminUsersController@index')->name('admin_users'); + Route::get('/subjects', 'AdminSubjectsController@index')->name('admin_subjects'); + Route::get('/rooms', 'AdminRoomsController@index')->name('admin_rooms'); + Route::get('/classes', 'AdminClassesController@index')->name('admin_classes'); + Route::get('/attendances', 'AdminAttendancesController@index')->name('admin_attendances'); + Route::get('/test', 'AdminPanelController@test_connection')->name('admin_test_connection'); - Route::group(array('prefix' => 'add'), function() { - Route::post('/user', 'AdminUsersController@add_user')->name('admin_add_user'); - Route::post('/subject', 'AdminSubjectsController@add_subject')->name('admin_add_subject'); - Route::post('/room', 'AdminRoomsController@add_room')->name('admin_add_room'); - Route::post('/classes', 'AdminClassesController@add_classes')->name('admin_add_classes'); - Route::post('/attendance', 'AdminAttendancesController@add_attendance')->name('admin_add_attendance'); + Route::group(array('prefix' => 'add'), function() { + Route::post('/user', 'AdminUsersController@add_user')->name('admin_add_user'); + Route::post('/subject', 'AdminSubjectsController@add_subject')->name('admin_add_subject'); + Route::post('/room', 'AdminRoomsController@add_room')->name('admin_add_room'); + Route::post('/classes', 'AdminClassesController@add_classes')->name('admin_add_classes'); + Route::post('/attendance', 'AdminAttendancesController@add_attendance')->name('admin_add_attendance'); + }); + Route::group(array('prefix' => 'delete'), function() { + Route::get('/user/{user_id}', 'AdminUsersController@delete_user')->name('admin_delete_user'); + Route::get('/subject/{subject_id}', 'AdminSubjectsController@delete_subject')->name('admin_delete_subject'); + Route::get('/room/{room_id}', 'AdminRoomsController@delete_room')->name('admin_delete_room'); + Route::get('/classes/{classes_id}', 'AdminClassesController@delete_classes')->name('admin_delete_classes'); + Route::get('/attendance/{attendance_id}', 'AdminAttendancesController@delete_attendance')->name('admin_delete_attendance'); + }); + Route::group(array('prefix' => 'edit'), function() { + Route::get('/user/{user_id}', 'AdminUsersController@edit_user')->name('admin_edit_user'); + Route::get('/subject/{subject_id}', 'AdminSubjectsController@edit_subject')->name('admin_edit_subject'); + Route::get('/room/{room_id}', 'AdminRoomsController@edit_room')->name('admin_edit_room'); + Route::get('/classes/{classes_id}', 'AdminClassesController@edit_classes')->name('admin_edit_classes'); + Route::get('/attendance/{attendance_id}', 'AdminAttendancesController@edit_attendance')->name('admin_edit_attendance'); + }); }); - Route::group(array('prefix' => 'delete'), function() { - Route::get('/user/{user_id}', 'AdminUsersController@delete_user')->name('admin_delete_user'); - Route::get('/subject/{subject_id}', 'AdminSubjectsController@delete_subject')->name('admin_delete_subject'); - Route::get('/room/{room_id}', 'AdminRoomsController@delete_room')->name('admin_delete_room'); - Route::get('/classes/{classes_id}', 'AdminClassesController@delete_classes')->name('admin_delete_classes'); - Route::get('/attendance/{attendance_id}', 'AdminAttendancesController@delete_attendance')->name('admin_delete_attendance'); - }); - Route::group(array('prefix' => 'edit'), function() { - Route::get('/user/{user_id}', 'AdminUsersController@edit_user')->name('admin_edit_user'); - Route::get('/subject/{subject_id}', 'AdminSubjectsController@edit_subject')->name('admin_edit_subject'); - Route::get('/room/{room_id}', 'AdminRoomsController@edit_room')->name('admin_edit_room'); - Route::get('/classes/{classes_id}', 'AdminClassesController@edit_classes')->name('admin_edit_classes'); - Route::get('/attendance/{attendance_id}', 'AdminAttendancesController@edit_attendance')->name('admin_edit_attendance'); + + Route::group(array('prefix' => 'user', 'namespace' => 'User'), function() { //TODO poprawic {user_id} + Route::get('/subjects/{groupBy?}', 'UserSubjectsController@index')->name('user_subjects'); + Route::get('/classes/{groupBy?}', 'UserClassesController@index')->name('user_classes'); + Route::get('/attendance/{groupBy?}', 'UserAttendancesController@index')->name('user_attendances'); + + Route::get('/classes/start/{classes_id}', 'UserClassesController@start_classes')->name('user_start_classes'); + Route::post('/classes/start', 'UserClassesController@start_classes_verified')->name('user_start_classes_verified')->middleware('classesCode'); + Route::post('/classes/save', 'UserClassesController@save_classes_data')->name('user_save_classes_data'); + Route::get('/classes/preview/{classes_id}/{orderBy?}/{orderDirection?}', 'UserClassesController@preview_classes')->name('user_preview_classes'); + + Route::group(array('prefix' => 'add'), function() { + Route::post('/subject', 'UserSubjectsController@add_subject')->name('user_add_subject'); + Route::post('/classes', 'UserClassesController@add_classes')->name('user_add_classes'); + Route::post('/attendance', 'UserAttendancesController@add_attendance')->name('user_add_attendance'); + Route::post('/attendance/note', 'UserAttendancesController@add_attendance_note')->name('user_add_attendance_note'); + }); + + Route::group(array('prefix' => 'delete'), function() { + Route::get('/subject/{subject_id}/{groupBy?}', 'UserSubjectsController@delete_subject')->name('user_delete_subject'); + Route::get('/classes/{classes_id}/{groupBy?}', 'UserClassesController@delete_classes')->name('user_delete_classes'); + Route::get('/attendance/{attendance_id}/{groupBy?}', 'UserAttendancesController@delete_attendance')->name('user_delete_attendance'); + }); + + Route::group(array('prefix' => 'edit'), function() { + Route::post('/subject', 'UserSubjectsController@edit_subject')->name('user_edit_subject'); +// Route::get('/attendance/{attendance_id}/{groupBy?}', 'UserAttendancesController@edit_attendance')->name('user_edit_attendance'); + }); + + Route::get('/export/attendances/{classes_id}', 'UserAttendancesController@export')->name('user_export'); + Route::get('/export/attendances/grouped/{groupBy}', 'UserAttendancesController@export_grouped')->name('user_export_grouped'); }); }); -Route::group(array('prefix' => 'user', 'namespace' => 'User'), function() { //TODO poprawic {user_id} - Route::get('/subjects/{groupBy?}', 'UserSubjectsController@index')->name('user_subjects'); - Route::get('/classes/{groupBy?}', 'UserClassesController@index')->name('user_classes'); - Route::get('/attendance/{groupBy?}', 'UserAttendancesController@index')->name('user_attendances'); - Route::get('/classes/start/{classes_id}', 'UserClassesController@start_classes')->name('user_start_classes'); - Route::post('/classes/start', 'UserClassesController@start_classes_verified')->name('user_start_classes_verified')->middleware('classesCode'); - Route::post('/classes/save', 'UserClassesController@save_classes_data')->name('user_save_classes_data'); - Route::get('/classes/preview/{classes_id}/{orderBy?}/{orderDirection?}', 'UserClassesController@preview_classes')->name('user_preview_classes'); - - Route::group(array('prefix' => 'add'), function() { - Route::post('/subject', 'UserSubjectsController@add_subject')->name('user_add_subject'); - Route::post('/classes', 'UserClassesController@add_classes')->name('user_add_classes'); - Route::post('/attendance', 'UserAttendancesController@add_attendance')->name('user_add_attendance'); - Route::post('/attendance/note', 'UserAttendancesController@add_attendance_note')->name('user_add_attendance_note'); - }); - - Route::group(array('prefix' => 'delete'), function() { - Route::get('/subject/{subject_id}/{groupBy?}', 'UserSubjectsController@delete_subject')->name('user_delete_subject'); - Route::get('/classes/{classes_id}/{groupBy?}', 'UserClassesController@delete_classes')->name('user_delete_classes'); - Route::get('/attendance/{attendance_id}/{groupBy?}', 'UserAttendancesController@delete_attendance')->name('user_delete_attendance'); - }); - - Route::group(array('prefix' => 'edit'), function() { - Route::get('/subject/{subject_id}/{groupBy?}', 'UserSubjectsController@edit_subject')->name('user_edit_subject'); - Route::get('/attendance/{attendance_id}/{groupBy?}', 'UserAttendancesController@edit_attendance')->name('user_edit_attendance'); - }); - - Route::get('/export/attendances/{classes_id}', 'UserAttendancesController@export')->name('user_export'); - Route::get('/export/attendances/grouped/{groupBy}', 'UserAttendancesController@export_grouped')->name('user_export_grouped'); -});