add test batches

This commit is contained in:
root
2026-06-08 23:45:55 -04:00
parent c792b8be05
commit 8d4d610b82
1480 changed files with 22587 additions and 10762 deletions
@@ -13,7 +13,8 @@ class AttendancePendingViolationService
protected AttendanceData $attendanceDataModel,
protected ViolationRuleEngineService $violationRuleEngine,
protected AttendanceViolationStudentResolverService $studentResolverService
) {}
) {
}
public function getPendingViolations(
string $defaultSchoolYear,
@@ -21,52 +22,52 @@ class AttendancePendingViolationService
?string $semesterParam = null
): array {
$schoolYear = filled($schoolYearParam) ? (string) $schoolYearParam : (string) $defaultSchoolYear;
$semester = filled($semesterParam) ? (string) $semesterParam : null;
$semester = filled($semesterParam) ? (string) $semesterParam : null;
$debugInfo = [
'school_year_param' => $schoolYear,
'semester_param' => $semester,
'class_students' => 0,
'student_ids' => 0,
'attendance_rows' => 0,
'filtered_rows' => 0,
'violations' => 0,
'active_weeks' => 0,
'abs_last5' => 0,
'late_last5' => 0,
'semester_param' => $semester,
'class_students' => 0,
'student_ids' => 0,
'attendance_rows' => 0,
'filtered_rows' => 0,
'violations' => 0,
'active_weeks' => 0,
'abs_last5' => 0,
'late_last5' => 0,
];
$resolved = $this->studentResolverService->resolveForSchoolYear($schoolYear, $semester);
$schoolYear = (string) ($resolved['school_year'] ?? $schoolYear);
$semester = $resolved['semester'] ?? $semester;
$studentIds = $resolved['student_ids'] ?? [];
$studentCodes = $resolved['student_codes'] ?? [];
$students = $resolved['students'] ?? [];
$schoolYear = (string) ($resolved['school_year'] ?? $schoolYear);
$semester = $resolved['semester'] ?? $semester;
$studentIds = $resolved['student_ids'] ?? [];
$studentCodes = $resolved['student_codes'] ?? [];
$students = $resolved['students'] ?? [];
$studentCodeToId = $resolved['student_code_to_id'] ?? [];
$existingIds = $resolved['existing_ids'] ?? [];
$resolverDebug = $resolved['debug'] ?? [];
$existingIds = $resolved['existing_ids'] ?? [];
$resolverDebug = $resolved['debug'] ?? [];
$debugInfo['class_students'] = $resolverDebug['class_students'] ?? 0;
$debugInfo['student_ids'] = $resolverDebug['student_ids'] ?? 0;
$debugInfo['student_ids'] = $resolverDebug['student_ids'] ?? 0;
if (empty($studentIds) && empty($studentCodes)) {
return [
'students' => [],
'students' => [],
'school_year' => $schoolYear,
'semester' => $semester,
'error' => 'No student identifiers found for the current school year.',
'debug' => $debugInfo,
'semester' => $semester,
'error' => 'No student identifiers found for the current school year.',
'debug' => $debugInfo,
];
}
if (empty($students)) {
return [
'students' => [],
'students' => [],
'school_year' => $schoolYear,
'semester' => $semester,
'error' => 'No students found matching attendance records.',
'debug' => $debugInfo,
'semester' => $semester,
'error' => 'No students found matching attendance records.',
'debug' => $debugInfo,
];
}
@@ -90,14 +91,14 @@ class AttendancePendingViolationService
'is_reported',
'is_notified',
])
->when(! empty($schoolYear), fn ($q) => $q->where('school_year', $schoolYear))
->when(! empty($semester), fn ($q) => $q->where('semester', $semester))
->when(!empty($schoolYear), fn ($q) => $q->where('school_year', $schoolYear))
->when(!empty($semester), fn ($q) => $q->where('semester', $semester))
->where(function ($q) use ($studentIds, $studentCodes) {
if (! empty($studentIds)) {
if (!empty($studentIds)) {
$q->whereIn('student_id', $studentIds);
}
if (! empty($studentCodes)) {
if (! empty($studentIds)) {
if (!empty($studentCodes)) {
if (!empty($studentIds)) {
$q->orWhereIn('student_id', $studentCodes);
} else {
$q->whereIn('student_id', $studentCodes);
@@ -117,16 +118,16 @@ class AttendancePendingViolationService
if (empty($termRows)) {
$latestAttendanceTerm = DB::table($this->attendanceDataModel->getTable())
->select('school_year', 'semester', 'date')
->when(! empty($studentIds), fn ($q) => $q->whereIn('student_id', $studentIds))
->when(!empty($studentIds), fn ($q) => $q->whereIn('student_id', $studentIds))
->orderByDesc('date')
->first();
if ($latestAttendanceTerm) {
$schoolYear = ! empty($latestAttendanceTerm->school_year)
$schoolYear = !empty($latestAttendanceTerm->school_year)
? (string) $latestAttendanceTerm->school_year
: $schoolYear;
$semester = ! empty($latestAttendanceTerm->semester)
$semester = !empty($latestAttendanceTerm->semester)
? (string) $latestAttendanceTerm->semester
: $semester;
@@ -149,14 +150,14 @@ class AttendancePendingViolationService
'is_reported',
'is_notified',
])
->when(! empty($schoolYear), fn ($q) => $q->where('school_year', $schoolYear))
->when(! empty($semester), fn ($q) => $q->where('semester', $semester))
->when(!empty($schoolYear), fn ($q) => $q->where('school_year', $schoolYear))
->when(!empty($semester), fn ($q) => $q->where('semester', $semester))
->where(function ($q) use ($studentIds, $studentCodes) {
if (! empty($studentIds)) {
if (!empty($studentIds)) {
$q->whereIn('student_id', $studentIds);
}
if (! empty($studentCodes)) {
if (! empty($studentIds)) {
if (!empty($studentCodes)) {
if (!empty($studentIds)) {
$q->orWhereIn('student_id', $studentCodes);
} else {
$q->whereIn('student_id', $studentCodes);
@@ -176,10 +177,10 @@ class AttendancePendingViolationService
if (empty($termRows)) {
return [
'students' => [],
'students' => [],
'school_year' => $schoolYear,
'semester' => $semester,
'debug' => $debugInfo,
'semester' => $semester,
'debug' => $debugInfo,
];
}
}
@@ -187,7 +188,7 @@ class AttendancePendingViolationService
$attendanceRows = [];
foreach ($termRows as $row) {
$dStr = $row['date'] ?? null;
if (! $dStr) {
if (!$dStr) {
continue;
}
@@ -197,7 +198,7 @@ class AttendancePendingViolationService
continue;
}
if ($d->lt($start) || ! $d->lt($endEx)) {
if ($d->lt($start) || !$d->lt($endEx)) {
continue;
}
@@ -221,15 +222,15 @@ class AttendancePendingViolationService
if (empty($attendanceRows)) {
return [
'students' => [],
'students' => [],
'school_year' => $schoolYear,
'semester' => $semester,
'debug' => $debugInfo,
'semester' => $semester,
'debug' => $debugInfo,
];
}
$debugInfo['attendance_rows'] = count($termRows);
$debugInfo['filtered_rows'] = count($attendanceRows);
$debugInfo['filtered_rows'] = count($attendanceRows);
$violations = $this->violationRuleEngine->computeViolations(
$students,
@@ -240,17 +241,17 @@ class AttendancePendingViolationService
);
$ruleDebug = $this->violationRuleEngine->getDebugCompute();
$debugInfo['violations'] = count($violations);
$debugInfo['violations'] = count($violations);
$debugInfo['active_weeks'] = $ruleDebug['active_weeks'] ?? 0;
$debugInfo['by_student'] = $ruleDebug['by_student'] ?? 0;
$debugInfo['abs_last5'] = $ruleDebug['abs_last5'] ?? 0;
$debugInfo['late_last5'] = $ruleDebug['late_last5'] ?? 0;
$debugInfo['by_student'] = $ruleDebug['by_student'] ?? 0;
$debugInfo['abs_last5'] = $ruleDebug['abs_last5'] ?? 0;
$debugInfo['late_last5'] = $ruleDebug['late_last5'] ?? 0;
return [
'students' => $violations,
'students' => $violations,
'school_year' => $schoolYear,
'semester' => $semester,
'debug' => $debugInfo,
'semester' => $semester,
'debug' => $debugInfo,
];
}
}
}