Files
alrahma_sunday_school_api/app/Services/Teachers/TeacherAssignmentService.php
T
2026-06-09 00:03:03 -04:00

192 lines
7.1 KiB
PHP

<?php
namespace App\Services\Teachers;
use App\Models\ClassSection;
use App\Models\TeacherClass;
use App\Models\User;
class TeacherAssignmentService
{
public function __construct(private TeacherConfigService $configService) {}
public function listAssignments(?string $schoolYear = null): array
{
$context = $this->configService->context();
$schoolYear = $schoolYear ?: (string) ($context['school_year'] ?? '');
$semester = trim((string) ($context['semester'] ?? ''));
$teachers = User::getTeachersAndTAs();
$classSections = ClassSection::query()
->when($schoolYear !== '', fn ($q) => $q->where('school_year', $schoolYear))
->orderBy('class_section_name')
->get()
->toArray();
if (empty($classSections)) {
$classSections = ClassSection::query()->orderBy('class_section_name')->get()->toArray();
}
$classNames = [];
foreach ($classSections as $section) {
$sectionId = (int) ($section['class_section_id'] ?? $section['id'] ?? 0);
if ($sectionId <= 0) {
continue;
}
$classNames[$sectionId] = $section['class_section_name'] ?? 'N/A';
}
$assignments = TeacherClass::query()
->when($schoolYear !== '', fn ($q) => $q->where('school_year', $schoolYear))
->when($semester !== '', fn ($q) => $q->where('semester', $semester))
->get()
->toArray();
$assignmentMap = [];
foreach ($assignments as $assign) {
$teacherId = (int) ($assign['teacher_id'] ?? 0);
$sectionId = (int) ($assign['class_section_id'] ?? 0);
if ($teacherId <= 0 || $sectionId <= 0) {
continue;
}
$role = strtolower((string) ($assign['position'] ?? ''));
if (! in_array($role, ['main', 'ta'], true)) {
continue;
}
$assignmentMap[$teacherId][$role][] = [
'section_id' => $sectionId,
'class_section_name' => $classNames[$sectionId] ?? 'N/A',
'role' => $role,
'semester' => (string) ($assign['semester'] ?? ''),
'school_year' => (string) ($assign['school_year'] ?? $schoolYear),
];
}
$teacherData = [];
foreach ($teachers as $teacher) {
$tid = (int) ($teacher['id'] ?? 0);
if ($tid <= 0) {
continue;
}
$assigned = $assignmentMap[$tid] ?? ['main' => [], 'ta' => []];
$name = trim(($teacher['firstname'] ?? '').' '.($teacher['lastname'] ?? ''));
if ($name === '') {
$name = 'User#'.$tid;
}
$teacherData[] = [
'teacher_id' => $tid,
'firstname' => $teacher['firstname'] ?? '',
'lastname' => $teacher['lastname'] ?? '',
'name' => $name,
'email' => $teacher['email'] ?? '',
'cellphone' => $teacher['cellphone'] ?? '',
'role' => $teacher['role'] ?? '',
'school_year' => $schoolYear,
'main_assignments' => $assigned['main'] ?? [],
'ta_assignments' => $assigned['ta'] ?? [],
];
}
$classesPayload = [];
foreach ($classSections as $section) {
$sectionId = (int) ($section['class_section_id'] ?? $section['id'] ?? 0);
if ($sectionId <= 0) {
continue;
}
$classesPayload[] = [
'class_section_id' => $sectionId,
'class_section_name' => $section['class_section_name'] ?? 'N/A',
];
}
return [
'school_year' => $schoolYear,
'teachers' => $teacherData,
'classes' => $classesPayload,
];
}
public function assign(array $input): array
{
$context = $this->configService->context();
$schoolYear = (string) ($input['school_year'] ?? $context['school_year'] ?? '');
$semester = trim((string) ($input['semester'] ?? $context['semester'] ?? ''));
$teacherId = (int) ($input['teacher_id'] ?? 0);
$classSectionId = (int) ($input['class_section_id'] ?? 0);
$teacherRole = (string) ($input['teacher_role'] ?? '');
$loggedInUserId = (int) ($input['updated_by'] ?? 0);
if ($teacherId <= 0 || $classSectionId <= 0 || $schoolYear === '' || $semester === '') {
return ['ok' => false, 'message' => 'Missing required parameters for assignment.'];
}
if ($teacherRole === '') {
$teacherRole = (string) (User::getUserRoleName($teacherId) ?? '');
}
$isAssistant = strtolower($teacherRole) === 'teacher_assistant';
$position = $isAssistant ? 'ta' : 'main';
$alreadyAssigned = TeacherClass::query()
->where('teacher_id', $teacherId)
->where('class_section_id', $classSectionId)
->where('position', $position)
->where('semester', $semester)
->where('school_year', $schoolYear)
->first();
if ($alreadyAssigned) {
return ['ok' => false, 'message' => 'This teacher is already assigned to this class with the same role.'];
}
TeacherClass::query()->create([
'teacher_id' => $teacherId,
'class_section_id' => $classSectionId,
'position' => $position,
'semester' => $semester,
'school_year' => $schoolYear,
'created_at' => now(),
'updated_at' => now(),
'updated_by' => $loggedInUserId ?: null,
]);
return [
'ok' => true,
'message' => 'Class assigned successfully.',
'position' => $position,
];
}
public function delete(array $input): array
{
$context = $this->configService->context();
$teacherId = (int) ($input['teacher_id'] ?? 0);
$classSectionId = (int) ($input['class_section_id'] ?? 0);
$position = strtolower((string) ($input['position'] ?? ''));
$semester = trim((string) ($input['semester'] ?? $context['semester'] ?? ''));
$schoolYear = trim((string) ($input['school_year'] ?? $context['school_year'] ?? ''));
if ($teacherId <= 0 || $classSectionId <= 0 || ! in_array($position, ['main', 'ta'], true) || $schoolYear === '' || $semester === '') {
return ['ok' => false, 'message' => 'Missing or invalid data for deletion.'];
}
$assignment = TeacherClass::query()
->where('teacher_id', $teacherId)
->where('class_section_id', $classSectionId)
->where('semester', $semester)
->where('school_year', $schoolYear)
->where('position', $position)
->first();
if (! $assignment) {
return ['ok' => false, 'message' => 'Assignment not found.'];
}
$assignment->delete();
return ['ok' => true, 'message' => ucfirst($position).' assignment removed successfully.'];
}
}