fix parent, teacher and admin pages

This commit is contained in:
root
2026-04-25 00:00:23 -04:00
parent 4cd98f1d30
commit eafe4eb134
30 changed files with 1566 additions and 105 deletions
@@ -14,15 +14,26 @@ class ClassProgressQueryService
public function listReports(User $user, array $filters): LengthAwarePaginator
{
$query = ClassProgressReport::query()
->with('classSection')
->with(['classSection', 'teacher'])
->orderBy($filters['sort_by'] ?? 'week_start', $filters['sort_dir'] ?? 'desc');
if (!$this->isAdmin($user)) {
$relaxedSectionIds = TeacherClass::distinctSectionIdsForTeacher((int) $user->id);
if (! empty($filters['class_section_id'])) {
$ids = $this->resolveAssignedTeacherIds((int) $filters['class_section_id']);
$query->whereIn('teacher_id', $ids !== [] ? $ids : [(int) $user->id]);
$sid = (int) $filters['class_section_id'];
// Section filter: if this user has ever taught the section, show all rows for that section
// (legacy DB often has `class_progress_reports` without matching current-year `teacher_class`).
if (! in_array($sid, $relaxedSectionIds, true)) {
$query->where('teacher_id', (int) $user->id);
}
} else {
$query->where('teacher_id', $user->id);
$query->where(function ($q) use ($user, $relaxedSectionIds) {
$q->where('teacher_id', (int) $user->id);
if ($relaxedSectionIds !== []) {
$q->orWhereIn('class_section_id', $relaxedSectionIds);
}
});
}
} elseif (! empty($filters['teacher_id'])) {
$query->where('teacher_id', (int) $filters['teacher_id']);
@@ -76,10 +87,7 @@ class ClassProgressQueryService
->whereDate('week_start', $report->week_start)
->orderBy('subject', 'asc');
if (! $this->isAdmin($user)) {
$ids = $this->resolveAssignedTeacherIds((int) $report->class_section_id);
$query->whereIn('teacher_id', $ids !== [] ? $ids : [(int) $user->id]);
}
// Non-admins reach this only after policy `view` passed on the anchor report (author or teaches section).
$rows = $query->get();
$attachments = $this->attachmentMap($rows->pluck('id')->all());
@@ -160,6 +168,9 @@ class ClassProgressQueryService
$semester = (string) (Configuration::getConfig('semester') ?? '');
$rows = TeacherClass::assignedForSectionTerm($classSectionId, $semester, $schoolYear);
if ($rows === []) {
$rows = TeacherClass::assignedForSectionTerm($classSectionId, $semester, $schoolYear, null, false);
}
$ids = [];
foreach ($rows as $row) {
$id = (int) ($row['teacher_id'] ?? 0);
@@ -177,8 +188,10 @@ class ClassProgressQueryService
return true;
}
$ids = $this->resolveAssignedTeacherIds((int) $report->class_section_id);
return $ids !== [] && in_array((int) $user->id, $ids, true);
return in_array(
(int) $report->class_section_id,
TeacherClass::distinctSectionIdsForTeacher((int) $user->id),
true
);
}
}