diff --git a/app/Http/Controllers/StudentController.php b/app/Http/Controllers/StudentController.php index f0ce8cf..5c0b0e8 100644 --- a/app/Http/Controllers/StudentController.php +++ b/app/Http/Controllers/StudentController.php @@ -6,6 +6,7 @@ use App\Http\Requests\StudentPostRequest; use App\Models\Grade; use App\Models\Student; use App\Models\Subject; +use App\Services\FileService; use App\Services\StudentService; use Illuminate\Http\RedirectResponse; use Illuminate\View\View; @@ -134,4 +135,9 @@ class StudentController extends Controller 'lessons' => $service->getDebts(), ]); } + + public function exportAvgScores(StudentService $service) + { + return $service->exportAvgScores(); + } } diff --git a/app/Policies/StudentPolicy.php b/app/Policies/StudentPolicy.php index f5a70c9..3d027da 100644 --- a/app/Policies/StudentPolicy.php +++ b/app/Policies/StudentPolicy.php @@ -52,4 +52,9 @@ class StudentPolicy { return $user->userable_type == Student::class; } + + public function avgScores(User $user): bool + { + return $user->userable_type == Student::class; + } } diff --git a/app/Services/StudentService.php b/app/Services/StudentService.php index 7e83f62..33a75f2 100644 --- a/app/Services/StudentService.php +++ b/app/Services/StudentService.php @@ -6,6 +6,7 @@ use App\Enums\ScoreEnum; use App\Models\Student; use App\Models\Subject; use App\Models\User; +use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Database\Eloquent\Collection; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\Auth; @@ -82,4 +83,18 @@ class StudentService return $student->lessons()->whereIn('score', ScoreEnum::getDebtScores())->get(); } + + public function exportAvgScores() + { + $subjects = Auth::user()->userable->grade->subjects; + $avgScores = collect(); + + $subjects->each(function ($subject) use ($avgScores) { + $avgScores->put($subject->name, $this->getAvgScore($subject)); + }); + + return Pdf::loadView('students.avg-scores', [ + 'avgScores' => $avgScores, + ])->download('Успеваемость.pdf'); + } } diff --git a/resources/views/students/avg-scores.blade.php b/resources/views/students/avg-scores.blade.php new file mode 100644 index 0000000..196a54a --- /dev/null +++ b/resources/views/students/avg-scores.blade.php @@ -0,0 +1,43 @@ +<!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> +<h1>Информация об успеваемости</h1> +<table> + <thead> + <tr> + <th>Предмет</th> + <th>Средняя оценка</th> + </tr> + </thead> + <tbody> + @foreach($avgScores as $key => $item) + <tr> + <td>{{ $key }}</td> + <td>{{ $item }}</td> + </tr> + @endforeach + </tbody> +</table> +</body> +</html> diff --git a/resources/views/subjects/index.blade.php b/resources/views/subjects/index.blade.php index c01d208..3eccc69 100644 --- a/resources/views/subjects/index.blade.php +++ b/resources/views/subjects/index.blade.php @@ -18,7 +18,12 @@ </div> </div> <div class="card mt-4"> - <div class="card-header">{{__('Предметы')}}</div> + <div class="card-header d-flex justify-content-between align-items-center"> + {{__('Предметы')}} + @can('avgScores', \App\Models\Student::class) + <a href="{{ route('export-avg-scores') }}" class="btn btn-primary">Успеваемость</a> + @endcan + </div> <div class="card-body"> @if (count($subjects)) <table class="table table-striped"> diff --git a/routes/web.php b/routes/web.php index bf8fbcd..30ffff6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -54,6 +54,7 @@ Route::middleware('auth')->group(function () { Route::get('subjects/{subject}/student-scores', [StudentController::class, 'scores'])->name('student-scores'); Route::get('student-debts', [StudentController::class, 'debts'])->name('student-debts'); Route::get('teachers/{teacher}/subjects', [SubjectTeacherController::class, 'index'])->name('teachers.subjects.index'); + Route::get('export-avg-scores', [StudentController::class, 'exportAvgScores'])->name('export-avg-scores'); }); });