From d4cabb23b7a7868b56fc68b2be627bf36906a906 Mon Sep 17 00:00:00 2001
From: "m.zargarov" <m.zargarov@framework.team>
Date: Mon, 24 Jun 2024 00:51:05 +0400
Subject: [PATCH] Fix

---
 app/Http/Controllers/GradeController.php      | 12 +++-
 app/Http/Controllers/LessonController.php     |  5 +-
 app/Http/Middleware/TeacherAction.php         |  4 +-
 app/Policies/LessonPolicy.php                 |  6 +-
 app/Policies/StudentPolicy.php                |  8 +--
 app/Services/FileService.php                  | 20 +++++++
 app/Services/GradeService.php                 | 23 ++++++++
 app/Services/LessonService.php                | 23 ++++++++
 resources/views/grade-lesson/form.blade.php   |  4 +-
 resources/views/grade-lesson/index.blade.php  |  4 +-
 resources/views/grades/index.blade.php        | 35 ++++++++----
 .../views/grades/list-students.blade.php      | 56 +++++++++++++++++++
 resources/views/grades/show.blade.php         | 32 ++++++-----
 resources/views/layouts/navigation.blade.php  |  4 +-
 resources/views/students/index.blade.php      | 42 +++++++++-----
 routes/web.php                                |  1 +
 16 files changed, 220 insertions(+), 59 deletions(-)
 create mode 100644 app/Services/GradeService.php
 create mode 100644 app/Services/LessonService.php
 create mode 100644 resources/views/grades/list-students.blade.php

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/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 c0f2155..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,7 +45,7 @@ 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
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 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\Grade;
+use App\Models\Teacher;
+use Illuminate\Support\Facades\Auth;
+
+class GradeService
+{
+    public function getGrades()
+    {
+        if (Auth::user()->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 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\Grade;
+use App\Models\Teacher;
+use Illuminate\Support\Facades\Auth;
+
+class LessonService
+{
+    public function getLessons(Grade $grade)
+    {
+        if (Auth::user()->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 @@
                         <select id="type" name="type" class="form-select" required>
                             <option value="">Выберите тип деятельности</option>
                             @foreach($types as $type)
-                                <option value="{{ $type }}" {{ isset($lesson) && $lesson->type == $type ? 'selected' : old('type') }}>
+                                <option value="{{ $type }}" {{ isset($lesson) && $lesson->type == $type->value ? 'selected' : old('type') }}>
                                     {{ $type }}
                                 </option>
                             @endforeach
@@ -36,7 +36,7 @@
                         <textarea class="form-control" id="description" name="description" rows="5" >{{ isset($lesson) ? $lesson->description : old('description') }}</textarea>
                     </div>
                     <div class="mb-3">
-                        <label for="lesson_date" class="form-label">Дата рождения:</label>
+                        <label for="lesson_date" class="form-label">Дата занятия:</label>
                         <input type="date" id="lesson_date" name="lesson_date" class="form-control" value="{{ isset($lesson) ? $lesson->lesson_date : old('lesson_date') }}" required>
                     </div>
                     <input type="hidden" name="grade_id" value="{{ $grade->id }}">
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')
     <div class="container col-md-5">
@@ -53,5 +53,3 @@
         </div>
     </div>
 @endsection
-
-`
diff --git a/resources/views/grades/index.blade.php b/resources/views/grades/index.blade.php
index 23861b6..26d7fde 100644
--- a/resources/views/grades/index.blade.php
+++ b/resources/views/grades/index.blade.php
@@ -43,17 +43,26 @@
                                     </td>
                                     <td>
                                         <div>
-                                            <a href="{{ route('grades.edit', $grade) }}" class="btn btn-warning">Редактировать</a>
+                                            <a href="{{ route('list-students', $grade) }}" class="btn btn-info">Списки учеников</a>
                                         </div>
                                     </td>
-                                    <td>
-                                        <form action="{{ route('grades.destroy', $grade) }}" method="POST"
-                                              style="display: inline-block;">
-                                            @csrf
-                                            @method('DELETE')
-                                            <button type="submit" class="btn btn-danger">Удалить</button>
-                                        </form>
-                                    </td>
+                                    @can('update', $grade)
+                                        <td>
+                                            <div>
+                                                <a href="{{ route('grades.edit', $grade) }}" class="btn btn-warning">Редактировать</a>
+                                            </div>
+                                        </td>
+                                    @endcan
+                                    @can('delete', $grade)
+                                        <td>
+                                            <form action="{{ route('grades.destroy', $grade) }}" method="POST"
+                                                  style="display: inline-block;">
+                                                @csrf
+                                                @method('DELETE')
+                                                <button type="submit" class="btn btn-danger">Удалить</button>
+                                            </form>
+                                        </td>
+                                    @endcan
                                 </tr>
                             @endforeach
                             </tbody>
@@ -62,9 +71,11 @@
                             <p>Классы отсутствуют</p>
                         @endif
                     </div>
-                    <div class="card-footer">
-                        <a href="{{ route('grades.create') }}" class="btn btn-success">Добавить</a>
-                    </div>
+                    @can('create', \App\Models\Grade::class)
+                        <div class="card-footer">
+                            <a href="{{ route('grades.create') }}" class="btn btn-success">Добавить</a>
+                        </div>
+                    @endcan
                     <div class="card-footer">{{ $grades->links() }}</div>
                 </div>
         </div>
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 @@
+<!doctype html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <style>
+        * { font-family: DejaVu Sans !important; }
+        table {
+            width: 100%;
+            border-collapse: collapse;
+        }
+        table, th, td {
+            border: 1px solid black;
+        }
+        th, td {
+            padding: 8px;
+            text-align: left;
+        }
+        th {
+            background-color: #f2f2f2;
+        }
+    </style>
+    <title>Списки студентов</title>
+</head>
+<body>
+<h3>Список отличников</h3>
+<table>
+    <thead>
+    <tr>
+        <th>ФИО</th>
+    </tr>
+    </thead>
+    <tbody>
+    @foreach($excellentStudents as $student)
+        <tr>
+            <td>{{ $student->fio }}</td>
+        </tr>
+    @endforeach
+    </tbody>
+</table>
+<h3>Список хорошистов</h3>
+<table>
+    <thead>
+    <tr>
+        <th>ФИО</th>
+    </tr>
+    </thead>
+    <tbody>
+    @foreach($goodStudents as $student)
+        <tr>
+            <td>{{ $student->fio }}</td>
+        </tr>
+    @endforeach
+    </tbody>
+</table>
+</body>
+</html>
diff --git a/resources/views/grades/show.blade.php b/resources/views/grades/show.blade.php
index dc25c85..03b66c5 100644
--- a/resources/views/grades/show.blade.php
+++ b/resources/views/grades/show.blade.php
@@ -10,9 +10,11 @@
                         <h5><strong>Название: </strong>{{ $grade->name }}</h5>
                     </div>
                 </div>
-                <div class="card-footer">
-                    <a href="{{ route('grades.edit', $grade) }}" class="btn btn-primary">Редактировать</a>
-                </div>
+                @can('update', $grade)
+                    <div class="card-footer">
+                        <a href="{{ route('grades.edit', $grade) }}" class="btn btn-primary">Редактировать</a>
+                    </div>
+                @endcan
             </div>
             <div class="card mt-4">
                 <div class="card-header">
@@ -38,13 +40,15 @@
                                             <a href="{{ route('grades.subjects.journal', [$grade, $subject]) }}" class="btn btn-primary">Журнал</a>
                                         </div>
                                     </td>
-                                    <td>
-                                        <form action="{{ route('grades.subjects.destroy', [$grade, $subject]) }}" method="POST" style="display: inline-block;">
-                                            @csrf
-                                            @method('DELETE')
-                                            <button type="submit" class="btn btn-danger">Удалить</button>
-                                        </form>
-                                    </td>
+                                    @can('delete', $grade)
+                                        <td>
+                                            <form action="{{ route('grades.subjects.destroy', [$grade, $subject]) }}" method="POST" style="display: inline-block;">
+                                                @csrf
+                                                @method('DELETE')
+                                                <button type="submit" class="btn btn-danger">Удалить</button>
+                                            </form>
+                                        </td>
+                                    @endcan
                                 </tr>
                             @endforeach
                             </tbody>
@@ -53,9 +57,11 @@
                         <p>У класса отсутствуют предметы</p>
                     @endif
                 </div>
-                <div class="card-footer">
-                    <a href="{{ route('grades.subjects.create', $grade) }}" class="btn btn-success">Добавить</a>
-                </div>
+                @can('create', \App\Models\Grade::class)
+                    <div class="card-footer">
+                        <a href="{{ route('grades.subjects.create', $grade) }}" class="btn btn-success">Добавить</a>
+                    </div>
+                @endcan
             </div>
         </div>
     </div>
diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php
index 18921fb..ad46c39 100644
--- a/resources/views/layouts/navigation.blade.php
+++ b/resources/views/layouts/navigation.blade.php
@@ -28,7 +28,7 @@
                 @can('viewAny', \App\Models\Student::class)
                     <div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
                         <x-nav-link :href="route('students.index')" :active="request()->routeIs('students.index')">
-                            {{ __('Студенты') }}
+                            {{ __('Ученики') }}
                         </x-nav-link>
                     </div>
                 @endcan
@@ -113,7 +113,7 @@
 
             @can('viewAny', \App\Models\Student::class)
                 <x-responsive-nav-link :href="route('students.index')" :active="request()->routeIs('students.index')">
-                    {{ __('Студенты') }}
+                    {{ __('Ученики') }}
                 </x-responsive-nav-link>
             @endcan
 
diff --git a/resources/views/students/index.blade.php b/resources/views/students/index.blade.php
index 73d5d60..e529fb3 100644
--- a/resources/views/students/index.blade.php
+++ b/resources/views/students/index.blade.php
@@ -24,6 +24,7 @@
                     <table class="table table-striped">
                         <thead>
                         <th>ФИО</th>
+                        <th>Класс</th>
                         <th>&nbsp;</th>
                         </thead>
                         <tbody>
@@ -31,21 +32,34 @@
                             <tr>
                                 <td class="table-text">
                                     <div>
-                                        <a href="{{ route('students.show', $student) }}" class="btn btn-block col-8">{{ $student->fio }}</a>
+                                        @can('view', $student)
+                                            <a href="{{ route('students.show', $student) }}" class="btn btn-block col-8">{{ $student->fio }}</a>
+                                        @else
+                                            {{ $student->fio }}
+                                        @endcan
                                     </div>
                                 </td>
-                                <td>
+                                <td class="table-text">
                                     <div>
-                                        <a href="{{ route('students.edit', $student) }}" class="btn btn-warning">Редактировать</a>
+                                        {{ $student->grade->name }}
                                     </div>
                                 </td>
-                                <td>
-                                    <form action="{{ route('students.destroy', $student) }}" method="POST" style="display: inline-block;">
-                                        @csrf
-                                        @method('DELETE')
-                                        <button type="submit" class="btn btn-danger">Удалить</button>
-                                    </form>
-                                </td>
+                                @can('update', $student)
+                                    <td>
+                                        <div>
+                                            <a href="{{ route('students.edit', $student) }}" class="btn btn-warning">Редактировать</a>
+                                        </div>
+                                    </td>
+                                @endcan
+                                @can('delete', $student)
+                                    <td>
+                                        <form action="{{ route('students.destroy', $student) }}" method="POST" style="display: inline-block;">
+                                            @csrf
+                                            @method('DELETE')
+                                            <button type="submit" class="btn btn-danger">Удалить</button>
+                                        </form>
+                                    </td>
+                                @endcan
                             </tr>
                         @endforeach
                         </tbody>
@@ -54,9 +68,11 @@
                         <p>Ученики остутствуют</p>
                     @endif
                 </div>
-                <div class="card-footer">
-                    <a href="{{ route('students.create') }}" class="btn btn-success">Добавить</a>
-                </div>
+                @can('create', \App\Models\Student::class)
+                    <div class="card-footer">
+                        <a href="{{ route('students.create') }}" class="btn btn-success">Добавить</a>
+                    </div>
+                @endcan
                 <div class="card-footer">{{ $students->links() }}</div>
             </div>
         </div>
diff --git a/routes/web.php b/routes/web.php
index 65d291c..bf44d83 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -46,6 +46,7 @@ Route::middleware('auth')->group(function () {
         Route::get('lessons/{lesson}/scores', [ScoreController::class, 'show'])->name('lessons.scores.show');
         Route::put('lessons/{lesson}/scores', [ScoreController::class, 'update'])->name('lessons.scores.update');
         Route::get('grades/{grade}/subjects/{subject}/journal', [GradeSubjectController::class, 'journal'])->name('grades.subjects.journal');
+        Route::get('grades/{grade}/list-students', [GradeController::class, 'listStudents'])->name('list-students');
     });
 
     Route::middleware([StudentAction::class])->group(function () {