Compare commits
6 Commits
feature/ta
...
master
Author | SHA1 | Date | |
---|---|---|---|
d157d40747 | |||
ac5d318cef | |||
|
780a12581f | ||
|
733bb76122 | ||
|
c7fefd138a | ||
2214c533d0 |
43
app/Console/Commands/AddScores.php
Normal file
43
app/Console/Commands/AddScores.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Models\Grade;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
|
class AddScores extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'app:add-scores {grade}';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = 'Add 4 and 5 scores for students';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$grade = Grade::firstWhere('id', $this->argument('grade'));
|
||||||
|
|
||||||
|
$grade->students->random(7)->each(function ($student) {
|
||||||
|
$student
|
||||||
|
->lessons()
|
||||||
|
->syncWithPivotValues($student->lessons()->pluck('id'), ['score' => 4]);
|
||||||
|
});
|
||||||
|
|
||||||
|
$grade->students->random(5)->each(function ($student) {
|
||||||
|
$student
|
||||||
|
->lessons()
|
||||||
|
->syncWithPivotValues($student->lessons()->pluck('id'), ['score' => 5]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -69,7 +69,7 @@ class GradeController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function edit(Grade $grade): View
|
public function edit(Grade $grade): View
|
||||||
{
|
{
|
||||||
if(request()->user()->cannot('update', Grade::class)) {
|
if(request()->user()->cannot('update', $grade)) {
|
||||||
abort(403);
|
abort(403);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,11 +83,13 @@ class GradeController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function update(GradePostRequest $request, Grade $grade): RedirectResponse
|
public function update(GradePostRequest $request, Grade $grade): RedirectResponse
|
||||||
{
|
{
|
||||||
if(request()->user()->cannot('update', Grade::class)) {
|
if(request()->user()->cannot('update', $grade)) {
|
||||||
abort(403);
|
abort(403);
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('grades.show', $grade->update($request->validated()));
|
$grade->update($request->validated());
|
||||||
|
|
||||||
|
return redirect()->route('grades.show', $grade);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -95,9 +97,10 @@ class GradeController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function destroy(Grade $grade): RedirectResponse
|
public function destroy(Grade $grade): RedirectResponse
|
||||||
{
|
{
|
||||||
if(request()->user()->cannot('delete', Grade::class)) {
|
if(request()->user()->cannot('delete', $grade)) {
|
||||||
abort(403);
|
abort(403);
|
||||||
}
|
}
|
||||||
|
|
||||||
$grade->delete();
|
$grade->delete();
|
||||||
|
|
||||||
return redirect()->route('grades.index');
|
return redirect()->route('grades.index');
|
||||||
|
@ -113,12 +113,9 @@ class LessonController extends Controller
|
|||||||
abort(403);
|
abort(403);
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route(
|
$lesson->update($request->validated());
|
||||||
'grades.lessons.show',[
|
|
||||||
$grade,
|
return redirect()->route('grades.lessons.show',[$grade, $lesson,]);
|
||||||
$lesson->update($request->validated()),
|
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -6,6 +6,7 @@ use App\Http\Requests\StudentPostRequest;
|
|||||||
use App\Models\Grade;
|
use App\Models\Grade;
|
||||||
use App\Models\Student;
|
use App\Models\Student;
|
||||||
use App\Models\Subject;
|
use App\Models\Subject;
|
||||||
|
use App\Services\FileService;
|
||||||
use App\Services\StudentService;
|
use App\Services\StudentService;
|
||||||
use Illuminate\Http\RedirectResponse;
|
use Illuminate\Http\RedirectResponse;
|
||||||
use Illuminate\View\View;
|
use Illuminate\View\View;
|
||||||
@ -134,4 +135,9 @@ class StudentController extends Controller
|
|||||||
'lessons' => $service->getDebts(),
|
'lessons' => $service->getDebts(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function exportAvgScores(StudentService $service)
|
||||||
|
{
|
||||||
|
return $service->exportAvgScores();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,10 +82,9 @@ class SubjectController extends Controller
|
|||||||
abort(403);
|
abort(403);
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route(
|
$subject->update($request->validated());
|
||||||
'subjects.show',
|
|
||||||
$subject->update($request->validated())
|
return redirect()->route('subjects.show', $subject);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -6,6 +6,7 @@ use App\Models\Admin;
|
|||||||
use App\Models\Grade;
|
use App\Models\Grade;
|
||||||
use App\Models\Lesson;
|
use App\Models\Lesson;
|
||||||
use App\Models\Student;
|
use App\Models\Student;
|
||||||
|
use App\Models\Teacher;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
|
||||||
class LessonPolicy
|
class LessonPolicy
|
||||||
@ -13,9 +14,9 @@ class LessonPolicy
|
|||||||
/**
|
/**
|
||||||
* Determine whether the user can view any models.
|
* Determine whether the user can view any models.
|
||||||
*/
|
*/
|
||||||
public function viewAny(User $user, Grade $grade): bool
|
public function viewAny(User $user): bool
|
||||||
{
|
{
|
||||||
return $user->userable_type != Student::class || $user->userable->grade_id == $grade->id;
|
return $user->userable_type == Teacher::class;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -23,7 +24,7 @@ class LessonPolicy
|
|||||||
*/
|
*/
|
||||||
public function view(User $user, Lesson $lesson): bool
|
public function view(User $user, Lesson $lesson): bool
|
||||||
{
|
{
|
||||||
return $user->userable_type != Student::class || $user->userable->grade_id == $lesson->grade_id;
|
return $user->userable_type == Teacher::class;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,7 +32,7 @@ class LessonPolicy
|
|||||||
*/
|
*/
|
||||||
public function create(User $user): bool
|
public function create(User $user): bool
|
||||||
{
|
{
|
||||||
return $user->userable_type != Student::class;
|
return $user->userable_type == Teacher::class;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -39,7 +40,7 @@ class LessonPolicy
|
|||||||
*/
|
*/
|
||||||
public function update(User $user, Lesson $lesson): bool
|
public function update(User $user, Lesson $lesson): bool
|
||||||
{
|
{
|
||||||
return $user->userable_type != Student::class;
|
return $user->userable_type == Teacher::class;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -47,6 +48,6 @@ class LessonPolicy
|
|||||||
*/
|
*/
|
||||||
public function delete(User $user, Lesson $lesson): bool
|
public function delete(User $user, Lesson $lesson): bool
|
||||||
{
|
{
|
||||||
return $user->userable_type != Student::class;
|
return $user->userable_type == Teacher::class;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,4 +52,9 @@ class StudentPolicy
|
|||||||
{
|
{
|
||||||
return $user->userable_type == Student::class;
|
return $user->userable_type == Student::class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function avgScores(User $user): bool
|
||||||
|
{
|
||||||
|
return $user->userable_type == Student::class;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,4 +42,9 @@ class SubjectPolicy
|
|||||||
{
|
{
|
||||||
return $user->userable_type == Student::class;
|
return $user->userable_type == Student::class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function pdf(User $user): bool
|
||||||
|
{
|
||||||
|
return $user->userable_type == Student::class;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ use App\Enums\ScoreEnum;
|
|||||||
use App\Models\Student;
|
use App\Models\Student;
|
||||||
use App\Models\Subject;
|
use App\Models\Subject;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
use Barryvdh\DomPDF\Facade\Pdf;
|
||||||
use Illuminate\Database\Eloquent\Collection;
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
use Illuminate\Pagination\LengthAwarePaginator;
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
@ -82,4 +83,18 @@ class StudentService
|
|||||||
|
|
||||||
return $student->lessons()->whereIn('score', ScoreEnum::getDebtScores())->get();
|
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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ return [
|
|||||||
|
|
||||||
'commands' => [
|
'commands' => [
|
||||||
App\Console\Commands\AddAdmin::class,
|
App\Console\Commands\AddAdmin::class,
|
||||||
|
App\Console\Commands\AddScores::class,
|
||||||
],
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -36,11 +36,13 @@
|
|||||||
class="btn btn-block col-8">{{ $grade->name }}</a>
|
class="btn btn-block col-8">{{ $grade->name }}</a>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
@can('viewAny', \App\Models\Lesson::class)
|
||||||
<div>
|
<td>
|
||||||
<a href="{{ route('grades.lessons.index', $grade) }}" class="btn btn-primary">Занятия</a>
|
<div>
|
||||||
</div>
|
<a href="{{ route('grades.lessons.index', $grade) }}" class="btn btn-primary">Занятия</a>
|
||||||
</td>
|
</div>
|
||||||
|
</td>
|
||||||
|
@endcan
|
||||||
@can('list', \App\Models\Grade::class)
|
@can('list', \App\Models\Grade::class)
|
||||||
<td>
|
<td>
|
||||||
<div>
|
<div>
|
||||||
|
43
resources/views/students/avg-scores.blade.php
Normal file
43
resources/views/students/avg-scores.blade.php
Normal file
@ -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>
|
@ -18,7 +18,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card mt-4">
|
<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">
|
<div class="card-body">
|
||||||
@if (count($subjects))
|
@if (count($subjects))
|
||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
@ -69,7 +74,9 @@
|
|||||||
@can('create', \App\Models\Subject::class)
|
@can('create', \App\Models\Subject::class)
|
||||||
<a href="{{ route('subjects.create') }}" class="btn btn-success">Добавить</a>
|
<a href="{{ route('subjects.create') }}" class="btn btn-success">Добавить</a>
|
||||||
@endcan
|
@endcan
|
||||||
<a href="{{ route('export-pdf') }}" class="btn btn-info">PDF</a>
|
@can('pdf', \App\Models\Subject::class)
|
||||||
|
<a href="{{ route('export-pdf') }}" class="btn btn-info">PDF</a>
|
||||||
|
@endcan
|
||||||
</div>
|
</div>
|
||||||
<div class="card-footer">{{ $subjects->links() }}</div>
|
<div class="card-footer">{{ $subjects->links() }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -55,6 +55,7 @@ Route::middleware('auth')->group(function () {
|
|||||||
Route::get('subjects/{subject}/student-scores', [StudentController::class, 'scores'])->name('student-scores');
|
Route::get('subjects/{subject}/student-scores', [StudentController::class, 'scores'])->name('student-scores');
|
||||||
Route::get('student-debts', [StudentController::class, 'debts'])->name('student-debts');
|
Route::get('student-debts', [StudentController::class, 'debts'])->name('student-debts');
|
||||||
Route::get('teachers/{teacher}/subjects', [SubjectTeacherController::class, 'index'])->name('teachers.subjects.index');
|
Route::get('teachers/{teacher}/subjects', [SubjectTeacherController::class, 'index'])->name('teachers.subjects.index');
|
||||||
|
Route::get('export-avg-scores', [StudentController::class, 'exportAvgScores'])->name('export-avg-scores');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user