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; } }