83 lines
2.8 KiB
PHP
83 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Admin;
|
|
|
|
use App\Models\ClassProgressReport;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
|
|
class AdminProgressQueryService
|
|
{
|
|
public function baseIndexQuery(): Builder
|
|
{
|
|
return ClassProgressReport::query()
|
|
->from('class_progress_reports')
|
|
->select([
|
|
'class_progress_reports.*',
|
|
'cs.class_section_name',
|
|
])
|
|
->selectRaw("CONCAT(COALESCE(u.firstname, ''), ' ', COALESCE(u.lastname, '')) AS teacher_name")
|
|
->leftJoin('classSection as cs', 'cs.class_section_id', '=', 'class_progress_reports.class_section_id')
|
|
->leftJoin('users as u', 'u.id', '=', 'class_progress_reports.teacher_id');
|
|
}
|
|
|
|
public function applyFilters(Builder $query, array $filters): Builder
|
|
{
|
|
if (!empty($filters['from'])) {
|
|
$query->where('week_start', '>=', $filters['from']);
|
|
}
|
|
|
|
if (!empty($filters['to'])) {
|
|
$query->where('week_end', '<=', $filters['to']);
|
|
}
|
|
|
|
if (!empty($filters['class_section_id'])) {
|
|
$query->where('class_progress_reports.class_section_id', (int) $filters['class_section_id']);
|
|
}
|
|
|
|
if (!empty($filters['status'])) {
|
|
$query->where('class_progress_reports.status', $filters['status']);
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
|
|
public function baseShowQuery(): Builder
|
|
{
|
|
return ClassProgressReport::query()
|
|
->from('class_progress_reports')
|
|
->select([
|
|
'class_progress_reports.*',
|
|
'cs.class_section_name',
|
|
])
|
|
->selectRaw("CONCAT(COALESCE(u.firstname, ''), ' ', COALESCE(u.lastname, '')) AS teacher_name")
|
|
->leftJoin('classSection as cs', 'cs.class_section_id', '=', 'class_progress_reports.class_section_id')
|
|
->leftJoin('users as u', 'u.id', '=', 'class_progress_reports.teacher_id');
|
|
}
|
|
|
|
public function groupReportsByWeekAndSection(array $rows): array
|
|
{
|
|
$groups = [];
|
|
|
|
foreach ($rows as $row) {
|
|
$key = ($row['week_start'] ?? '') . '_' . ($row['class_section_id'] ?? '');
|
|
if ($key === '_') {
|
|
continue;
|
|
}
|
|
|
|
if (!isset($groups[$key])) {
|
|
$groups[$key] = [
|
|
'week_start' => $row['week_start'] ?? null,
|
|
'week_end' => $row['week_end'] ?? null,
|
|
'class_section_id' => $row['class_section_id'] ?? null,
|
|
'class_section_name' => $row['class_section_name'] ?? '',
|
|
'reports' => [],
|
|
];
|
|
}
|
|
|
|
$subject = (string) ($row['subject'] ?? 'unknown');
|
|
$groups[$key]['reports'][$subject] = $row;
|
|
}
|
|
|
|
return $groups;
|
|
}
|
|
} |