update controllers logic
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services\Badges;
|
||||
|
||||
use App\Models\Student;
|
||||
use App\Models\StudentClass;
|
||||
|
||||
class BadgeStudentLookupService
|
||||
{
|
||||
public function __construct(
|
||||
protected BadgeTextFormatter $formatter
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Load students for badge printing: valid school_id (QR payload), ordered by name.
|
||||
*
|
||||
* @param int[] $studentIds
|
||||
* @return array<int, array{student_id:int, fullname:string, grade:string, academic_year:string, school_id:string}>
|
||||
*/
|
||||
public function fetchForBadges(array $studentIds, ?string $schoolYear): array
|
||||
{
|
||||
$studentIds = $this->formatter->normalizeIds($studentIds);
|
||||
if ($studentIds === []) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$rows = Student::query()
|
||||
->whereIn('id', $studentIds)
|
||||
->where('is_active', 1)
|
||||
->orderBy('lastname')
|
||||
->orderBy('firstname')
|
||||
->get();
|
||||
|
||||
$out = [];
|
||||
foreach ($rows as $student) {
|
||||
$schoolId = trim((string) ($student->school_id ?? ''));
|
||||
if ($schoolId === '' || !preg_match('/^[A-Za-z0-9_-]+$/', $schoolId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$fullname = Student::getFullName($student->toArray());
|
||||
$grade = $this->resolveGrade((int) $student->id, (string) ($student->registration_grade ?? ''));
|
||||
|
||||
$academicYear = $schoolYear ?? (string) ($student->school_year ?? '');
|
||||
$academicYear = $this->formatter->norm($academicYear);
|
||||
|
||||
$out[] = [
|
||||
'student_id' => (int) $student->id,
|
||||
'fullname' => $fullname !== '' ? $fullname : 'Student',
|
||||
'grade' => $grade,
|
||||
'academic_year' => $academicYear,
|
||||
'school_id' => $schoolId,
|
||||
];
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
protected function resolveGrade(int $studentId, string $registrationGrade): string
|
||||
{
|
||||
$registrationGrade = $this->formatter->norm($registrationGrade);
|
||||
if ($registrationGrade !== '') {
|
||||
return $registrationGrade;
|
||||
}
|
||||
|
||||
try {
|
||||
$g = StudentClass::getStudentGrade($studentId);
|
||||
$g = $this->formatter->norm((string) $g);
|
||||
|
||||
return $g !== '' ? $g : '—';
|
||||
} catch (\Throwable) {
|
||||
return '—';
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user