diff --git a/app/Http/Controllers/GradeController.php b/app/Http/Controllers/GradeController.php index 13f4f72..542e934 100644 --- a/app/Http/Controllers/GradeController.php +++ b/app/Http/Controllers/GradeController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers; use App\Http\Requests\GradePostRequest; use App\Models\Grade; +use App\Services\FileService; +use App\Services\GradeService; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; @@ -12,14 +14,14 @@ class GradeController extends Controller /** * Display a listing of the resource. */ - public function index(): View + public function index(GradeService $service): View { if(request()->user()->cannot('viewAny', Grade::class)) { abort(403); } return view('grades.index', [ - 'grades' => Grade::filter()->paginate(5)->withQueryString(), + 'grades' => $service->getGrades(), ]); } @@ -96,9 +98,13 @@ class GradeController extends Controller if(request()->user()->cannot('delete', Grade::class)) { abort(403); } - $grade->delete(); return redirect()->route('grades.index'); } + + public function listStudents(Grade $grade, FileService $fileService) + { + return $fileService->exportStudents($grade); + } } diff --git a/app/Http/Controllers/LessonController.php b/app/Http/Controllers/LessonController.php index 3d109c3..0591b6a 100644 --- a/app/Http/Controllers/LessonController.php +++ b/app/Http/Controllers/LessonController.php @@ -7,6 +7,7 @@ use App\Enums\TypeLesson; use App\Http\Requests\LessonPostRequest; use App\Models\Grade; use App\Models\Lesson; +use App\Services\LessonService; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; @@ -22,14 +23,14 @@ class LessonController extends Controller /** * Display a listing of the resource. */ - public function index(Grade $grade): View + public function index(Grade $grade, LessonService $service): View { if(request()->user()->cannot('viewAny', $grade)) { abort(403); } return view('grade-lesson.index', [ - 'lessons' => $grade->lessons()->filter()->get(), + 'lessons' => $service->getLessons($grade), 'grade' => $grade, 'subjects' => $grade->subjects, ]); diff --git a/app/Http/Middleware/TeacherAction.php b/app/Http/Middleware/TeacherAction.php index d3581cf..eb62975 100644 --- a/app/Http/Middleware/TeacherAction.php +++ b/app/Http/Middleware/TeacherAction.php @@ -2,7 +2,7 @@ namespace App\Http\Middleware; -use App\Models\Student; +use App\Models\Teacher; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -17,7 +17,7 @@ class TeacherAction */ public function handle(Request $request, Closure $next): Response { - if (Auth::user()->userable_type != Student::class) { + if (Auth::user()->userable_type != Teacher::class) { abort(403); } diff --git a/app/Http/Requests/StudentPostRequest.php b/app/Http/Requests/StudentPostRequest.php index 132c34d..c726119 100644 --- a/app/Http/Requests/StudentPostRequest.php +++ b/app/Http/Requests/StudentPostRequest.php @@ -2,7 +2,9 @@ namespace App\Http\Requests; +use App\Models\User; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; class StudentPostRequest extends FormRequest { @@ -27,7 +29,7 @@ class StudentPostRequest extends FormRequest 'middle_name' => 'required|max:255', 'birthday' => 'required|date', 'grade_id' => 'required|exists:grades,id', - 'email' => 'required|max:255|lowercase|unique:users,email', + 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', Rule::unique(User::class)->ignore($this->route('student')?->user->id)], 'password' => 'required|max:255', ]; } diff --git a/app/Http/Requests/TeacherPostRequest.php b/app/Http/Requests/TeacherPostRequest.php index e3aea8a..062dde2 100644 --- a/app/Http/Requests/TeacherPostRequest.php +++ b/app/Http/Requests/TeacherPostRequest.php @@ -2,7 +2,9 @@ namespace App\Http\Requests; +use App\Models\User; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rule; class TeacherPostRequest extends FormRequest { @@ -26,7 +28,7 @@ class TeacherPostRequest extends FormRequest 'last_name' => 'required|max:255', 'middle_name' => 'required|max:255', 'birthday' => 'required|date', - 'email' => 'required|max:255|lowercase|unique:users,email', + 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', Rule::unique(User::class)->ignore($this->route('teacher')?->user->id)], 'password' => 'required|max:255', ]; } diff --git a/app/Policies/GradePolicy.php b/app/Policies/GradePolicy.php index 8c63ca2..6343761 100644 --- a/app/Policies/GradePolicy.php +++ b/app/Policies/GradePolicy.php @@ -5,6 +5,7 @@ namespace App\Policies; use App\Models\Admin; use App\Models\Grade; use App\Models\Student; +use App\Models\Teacher; use App\Models\User; class GradePolicy @@ -48,4 +49,14 @@ class GradePolicy { return $user->userable_type == Admin::class; } + + public function journal(User $user) + { + return $user->userable_type == Teacher::class; + } + + public function list(User $user) + { + return $user->userable_type == Teacher::class; + } } diff --git a/app/Policies/LessonPolicy.php b/app/Policies/LessonPolicy.php index 14d8503..75d12a7 100644 --- a/app/Policies/LessonPolicy.php +++ b/app/Policies/LessonPolicy.php @@ -31,7 +31,7 @@ class LessonPolicy */ public function create(User $user): bool { - return $user->userable_type == Admin::class; + return $user->userable_type != Student::class; } /** @@ -39,7 +39,7 @@ class LessonPolicy */ public function update(User $user, Lesson $lesson): bool { - return $user->userable_type == Admin::class; + return $user->userable_type != Student::class; } /** @@ -47,6 +47,6 @@ class LessonPolicy */ public function delete(User $user, Lesson $lesson): bool { - return $user->userable_type == Admin::class; + return $user->userable_type != Student::class; } } diff --git a/app/Policies/StudentPolicy.php b/app/Policies/StudentPolicy.php index b30c231..f5a70c9 100644 --- a/app/Policies/StudentPolicy.php +++ b/app/Policies/StudentPolicy.php @@ -21,7 +21,7 @@ class StudentPolicy */ public function view(User $user, Student $student): bool { - return $user->userable_type != Student::class; + return $user->userable_type == Admin::class; } /** @@ -29,7 +29,7 @@ class StudentPolicy */ public function create(User $user): bool { - return $user->userable_type != Admin::class; + return $user->userable_type == Admin::class; } /** @@ -37,7 +37,7 @@ class StudentPolicy */ public function update(User $user, Student $student): bool { - return $user->userable_type != Admin::class; + return $user->userable_type == Admin::class; } /** @@ -45,6 +45,11 @@ class StudentPolicy */ public function delete(User $user, Student $student): bool { - return $user->userable_type != Admin::class; + return $user->userable_type == Admin::class; + } + + public function debts(User $user): bool + { + return $user->userable_type == Student::class; } } diff --git a/app/Policies/SubjectPolicy.php b/app/Policies/SubjectPolicy.php index d62acbb..425db37 100644 --- a/app/Policies/SubjectPolicy.php +++ b/app/Policies/SubjectPolicy.php @@ -3,11 +3,17 @@ namespace App\Policies; use App\Models\Admin; +use App\Models\Student; use App\Models\Subject; +use App\Models\Teacher; use App\Models\User; class SubjectPolicy { + public function viewAny(User $user): bool + { + return $user->userable_type != Teacher::class; + } /** * Determine whether the user can create models. */ @@ -31,4 +37,9 @@ class SubjectPolicy { return $user->userable_type == Admin::class; } + + public function scores(User $user, Subject $subject): bool + { + return $user->userable_type == Student::class; + } } diff --git a/app/Policies/TeacherPolicy.php b/app/Policies/TeacherPolicy.php index 209a5d4..cfe16d9 100644 --- a/app/Policies/TeacherPolicy.php +++ b/app/Policies/TeacherPolicy.php @@ -48,4 +48,9 @@ class TeacherPolicy { return $user->userable_type == Admin::class; } + + public function teacherSubjects(User $user, Teacher $teacher): bool + { + return $user->userable_type == Student::class; + } } diff --git a/app/Services/FileService.php b/app/Services/FileService.php index 46bd75d..beaa2d0 100644 --- a/app/Services/FileService.php +++ b/app/Services/FileService.php @@ -2,6 +2,7 @@ namespace App\Services; +use App\Models\Grade; use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Support\Facades\Auth; @@ -24,4 +25,23 @@ class FileService return Pdf::loadView('subjects.pdf', ['subjects' => $listSubjects])->download('Предметы.pdf'); } + + public function exportStudents(Grade $grade) + { + $excellentStudents = $this->getMinScore($grade, 5); + $goodStudents = $this->getMinScore($grade, 4); + + return Pdf::loadView('grades.list-students', [ + 'excellentStudents' => $excellentStudents, + 'goodStudents' => $goodStudents, + ])->download('Студенты.pdf'); + } + + public function getMinScore(Grade $grade, $minScore) + { + return $grade->students->filter(function ($student) use ($minScore) { + return $student->lessons->min('pivot.score') == $minScore; + }); + } + } diff --git a/app/Services/GradeService.php b/app/Services/GradeService.php new file mode 100644 index 0000000..78d969f --- /dev/null +++ b/app/Services/GradeService.php @@ -0,0 +1,23 @@ +userable_type == Teacher::class) { + return Grade::join('grade_teacher', 'grade_teacher.grade_id', '=', 'grades.id') + ->where('grade_teacher.teacher_id', Auth::user()->userable_id) + ->filter() + ->paginate(5) + ->withQueryString(); + } + + return Grade::filter()->paginate(5)->withQueryString(); + } +} diff --git a/app/Services/LessonService.php b/app/Services/LessonService.php new file mode 100644 index 0000000..940faa5 --- /dev/null +++ b/app/Services/LessonService.php @@ -0,0 +1,23 @@ +userable_type == Teacher::class) { + return $grade + ->lessons() + ->where('teacher_id', Auth::user()->userable_id) + ->filter() + ->get(); + } + + return $grade->lessons()->filter()->get(); + } +} diff --git a/resources/views/grade-lesson/form.blade.php b/resources/views/grade-lesson/form.blade.php index 73d4340..55261b4 100644 --- a/resources/views/grade-lesson/form.blade.php +++ b/resources/views/grade-lesson/form.blade.php @@ -14,7 +14,7 @@
- +
diff --git a/resources/views/grade-lesson/index.blade.php b/resources/views/grade-lesson/index.blade.php index bddb287..a34964b 100644 --- a/resources/views/grade-lesson/index.blade.php +++ b/resources/views/grade-lesson/index.blade.php @@ -1,4 +1,4 @@ -`@extends('layouts.application') +@extends('layouts.application') @section('content')
@@ -53,5 +53,3 @@
@endsection - -` diff --git a/resources/views/grades/index.blade.php b/resources/views/grades/index.blade.php index 23861b6..43440e4 100644 --- a/resources/views/grades/index.blade.php +++ b/resources/views/grades/index.blade.php @@ -41,19 +41,30 @@ Занятия - -
- Редактировать -
- - -
- @csrf - @method('DELETE') - -
- + @can('list', \App\Models\Grade::class) + +
+ Списки учеников +
+ + @endcan + @can('update', $grade) + +
+ Редактировать +
+ + @endcan + @can('delete', $grade) + +
+ @csrf + @method('DELETE') + +
+ + @endcan @endforeach @@ -62,9 +73,11 @@

Классы отсутствуют

@endif - + @can('create', \App\Models\Grade::class) + + @endcan diff --git a/resources/views/grades/list-students.blade.php b/resources/views/grades/list-students.blade.php new file mode 100644 index 0000000..782020b --- /dev/null +++ b/resources/views/grades/list-students.blade.php @@ -0,0 +1,56 @@ + + + + + + Списки студентов + + +

Список отличников

+ + + + + + + + @foreach($excellentStudents as $student) + + + + @endforeach + +
ФИО
{{ $student->fio }}
+

Список хорошистов

+ + + + + + + + @foreach($goodStudents as $student) + + + + @endforeach + +
ФИО
{{ $student->fio }}
+ + diff --git a/resources/views/grades/show.blade.php b/resources/views/grades/show.blade.php index dc25c85..98ffe23 100644 --- a/resources/views/grades/show.blade.php +++ b/resources/views/grades/show.blade.php @@ -10,9 +10,11 @@
Название: {{ $grade->name }}
- + @can('update', $grade) + + @endcan
@@ -33,18 +35,22 @@ {{ $subject->name }}
- -
- Журнал -
- - -
- @csrf - @method('DELETE') - -
- + @can('journal', \App\Models\Grade::class) + +
+ Журнал +
+ + @endcan + @can('delete', $grade) + +
+ @csrf + @method('DELETE') + +
+ + @endcan @endforeach @@ -53,9 +59,11 @@

У класса отсутствуют предметы

@endif
- + @can('create', \App\Models\Grade::class) + + @endcan diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index 678f1be..ad46c39 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -5,49 +5,49 @@
- - - +
- @if(\Illuminate\Support\Facades\Auth::user()->userable_type != \App\Models\Student::class) - - @endif + @can('viewAny', \App\Models\Grade::class) + + @endcan - + @can('viewAny', \App\Models\Subject::class) + + @endcan - @if(\Illuminate\Support\Facades\Auth::user()->userable_type != \App\Models\Student::class) - - @endif + @can('viewAny', \App\Models\Student::class) + + @endcan - @if(\Illuminate\Support\Facades\Auth::user()->userable_type != \App\Models\Teacher::class) - - @endif + @can('viewAny', \App\Models\Teacher::class) + + @endcan - @if(\Illuminate\Support\Facades\Auth::user()->userable_type == \App\Models\Student::class) + @can('debts', \App\Models\Student::class) - @endif + @endcan
@@ -99,9 +99,35 @@