update the new school year model

This commit is contained in:
root
2026-06-07 20:01:58 -04:00
parent 6866aedf42
commit 68a5c9edca
19 changed files with 472 additions and 32 deletions
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api\BadgeScan;
use App\Http\Controllers\Api\Core\BaseApiController;
use App\Services\BadgeScan\BadgeScanService;
use App\Services\SchoolYears\SchoolYearContextService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
@@ -13,6 +14,7 @@ class BadgeScanController extends BaseApiController
{
public function __construct(
private BadgeScanService $badgeScan,
private SchoolYearContextService $schoolYears,
) {
parent::__construct();
}
@@ -24,13 +26,21 @@ class BadgeScanController extends BaseApiController
{
$validator = Validator::make($request->all(), [
'badge_scan' => ['required', 'string', 'max:255'],
'school_year' => ['nullable', 'string', 'max:50'],
'semester' => ['nullable', 'string', 'max:50'],
]);
if ($validator->fails()) {
return $this->respondValidationError($validator->errors()->toArray());
}
$result = $this->badgeScan->processScan($validator->validated()['badge_scan']);
$payload = $validator->validated();
$context = $this->schoolYears->options($payload['school_year'] ?? null, $payload['semester'] ?? null);
$result = $this->badgeScan->processScan(
$payload['badge_scan'],
$context['school_year'] ?? null,
$context['semester'] ?? null
);
if (! $result['recognized']) {
return $this->error($result['message'], Response::HTTP_NOT_FOUND);
@@ -46,10 +56,19 @@ class BadgeScanController extends BaseApiController
/**
* Authenticated scan log listing (legacy RFIDController::log).
*/
public function logs(): JsonResponse
public function logs(Request $request): JsonResponse
{
$context = $this->schoolYears->options(
$request->query('school_year'),
$request->query('semester')
);
return $this->success([
'logs' => $this->badgeScan->scanLogRows(),
'logs' => $this->badgeScan->scanLogRows(
$context['school_year'] ?? null,
$context['semester'] ?? null
),
'meta' => $context,
]);
}
}
@@ -40,7 +40,9 @@ class ClassProgressController extends BaseApiController
return $this->respondSuccess(
$this->buildMetaPayload(
$request->validated('class_id'),
(int) ($request->validated('sunday_count') ?? 12)
(int) ($request->validated('sunday_count') ?? 12),
$request->query('school_year'),
$request->query('semester')
),
'Progress metadata loaded.'
);
@@ -66,7 +68,7 @@ class ClassProgressController extends BaseApiController
fn (array $assignment) => (int) ($assignment['class_id'] ?? 0) === $activeClassId
) ?? ($assignments[0] ?? []);
$sundayCount = (int) ($request->validated('sunday_count') ?? 12);
$payload = $this->buildMetaPayload($activeClassId > 0 ? $activeClassId : null, $sundayCount);
$payload = $this->buildMetaPayload($activeClassId > 0 ? $activeClassId : null, $sundayCount, $schoolYear, $semester);
$payload['classes'] = $assignments;
$payload['defaults'] = [
'class_id' => $activeClassId > 0 ? $activeClassId : null,
@@ -87,6 +89,9 @@ class ClassProgressController extends BaseApiController
}
$filters = $request->validated();
$meta = $this->queryService->meta($filters['school_year'] ?? null, $filters['semester'] ?? null);
$filters['school_year'] = $filters['school_year'] ?? ($meta['school_year'] ?? null);
$filters['semester'] = $filters['semester'] ?? ($meta['semester'] ?? null);
$paginator = $this->queryService->listReports($auth, $filters);
if (!empty($filters['group_by_week'])) {
@@ -96,6 +101,7 @@ class ClassProgressController extends BaseApiController
return $this->respondSuccess([
'items' => ClassProgressReportResource::collection($paginator->items()),
'meta' => $meta,
'pagination' => [
'current_page' => $paginator->currentPage(),
'per_page' => $paginator->perPage(),
@@ -241,13 +247,16 @@ class ClassProgressController extends BaseApiController
return $user;
}
private function buildMetaPayload(?int $classId, int $sundayCount): array
private function buildMetaPayload(?int $classId, int $sundayCount, ?string $schoolYear = null, ?string $semester = null): array
{
$meta = $this->queryService->meta($schoolYear, $semester);
return [
'subject_sections' => $this->metaService->subjectSections(),
'status_options' => $this->metaService->statusOptions(),
'sunday_options' => $this->metaService->sundayOptionsAlignedWithCi($sundayCount),
'curriculum' => $this->metaService->curriculumOptions($classId),
'curriculum' => $this->metaService->curriculumOptions($classId, $meta['school_year'] ?? null),
'meta' => $meta,
];
}
}
@@ -7,6 +7,7 @@ use App\Http\Requests\SchoolYears\CloseSchoolYearRequest;
use App\Http\Requests\SchoolYears\PreviewCloseSchoolYearRequest;
use App\Http\Requests\SchoolYears\SaveSchoolYearRequest;
use App\Services\SchoolYears\SchoolYearClosureService;
use App\Services\SchoolYears\SchoolYearContextService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
@@ -14,14 +15,44 @@ use Symfony\Component\HttpFoundation\Response;
class SchoolYearController extends BaseApiController
{
public function __construct(private SchoolYearClosureService $service)
{
public function __construct(
private SchoolYearClosureService $service,
private SchoolYearContextService $context
) {
parent::__construct();
}
public function index(): JsonResponse
public function index(Request $request): JsonResponse
{
return response()->json(['ok' => true, 'data' => $this->service->list()]);
$context = $this->context->options(
$request->query('school_year'),
$request->query('semester')
);
return response()->json([
'ok' => true,
'data' => $this->service->list(),
'meta' => $context,
'school_years' => $context['school_years'],
'current_school_year' => $context['current_school_year'],
'current_semester' => $context['current_semester'],
]);
}
public function current(Request $request): JsonResponse
{
return response()->json([
'ok' => true,
'data' => $this->context->options(
$request->query('school_year'),
$request->query('semester')
),
]);
}
public function options(Request $request): JsonResponse
{
return $this->current($request);
}
public function store(SaveSchoolYearRequest $request): JsonResponse
@@ -10,6 +10,7 @@ use App\Http\Resources\Subjects\SubjectCurriculumResource;
use App\Models\SubjectCurriculum;
use App\Services\Subjects\SubjectCurriculumService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class SubjectCurriculumController extends BaseApiController
{
@@ -18,15 +19,16 @@ class SubjectCurriculumController extends BaseApiController
parent::__construct();
}
public function index(): JsonResponse
public function index(Request $request): JsonResponse
{
$data = $this->service->list();
$data = $this->service->list($request->query('school_year'));
return response()->json([
'ok' => true,
'classes' => SubjectClassResource::collection($data['classes']),
'entries' => SubjectCurriculumResource::collection($data['entries']),
'subject_labels' => $data['subject_labels'],
'meta' => $data['meta'],
]);
}