get('search')); $academicYearId = $request->get('academic_year_id'); $departmentId = $request->get('department_id'); $classId = $request->get('class_id'); $studentTransfersQuery = StudentTransfer::query() ->with(['academicYear', 'department', 'classRoom']) ->when($search !== '', function ($query) use ($search) { $query->where(function ($subQuery) use ($search) { $subQuery->where('full_name', 'like', "%{$search}%") ->orWhere('student_number', 'like', "%{$search}%") ->orWhere('nisn', 'like', "%{$search}%"); }); }) ->when($academicYearId, fn ($query) => $query->where('academic_year_id', $academicYearId)) ->when($departmentId, fn ($query) => $query->where('department_id', $departmentId)) ->when($classId, fn ($query) => $query->where('class_id', $classId)); $studentTransfers = (clone $studentTransfersQuery) ->latest('transfer_date') ->latest('id') ->paginate(10) ->withQueryString(); $totalTransfers = StudentTransfer::count(); $withLetterCount = StudentTransfer::query()->whereNotNull('transfer_letter_file_path')->count(); $withoutLetterCount = max($totalTransfers - $withLetterCount, 0); $thisYearCount = StudentTransfer::query()->whereYear('transfer_date', now()->year)->count(); $latestTransferDate = StudentTransfer::query()->max('transfer_date'); $recentTransfers = StudentTransfer::query() ->latest('transfer_date') ->latest('id') ->limit(3) ->get(['id', 'full_name', 'transfer_date', 'department_id', 'class_id']); return view('student-transfers.index', [ 'studentTransfers' => $studentTransfers, 'search' => $search, 'filters' => [ 'academic_year_id' => $academicYearId, 'department_id' => $departmentId, 'class_id' => $classId, ], 'academicYears' => AcademicYear::orderBy('name')->pluck('name', 'id'), 'departments' => Department::orderBy('name')->pluck('name', 'id'), 'classes' => SchoolClass::orderBy('name')->pluck('name', 'id'), 'summary' => [ 'total' => $totalTransfers, 'with_letter' => $withLetterCount, 'without_letter' => $withoutLetterCount, 'this_year' => $thisYearCount, 'latest_transfer_date' => $latestTransferDate, 'filtered' => $studentTransfers->total(), ], 'recentTransfers' => $recentTransfers, ]); } public function show(StudentTransfer $studentTransfer): View { $studentTransfer->load(['academicYear', 'department', 'classRoom']); return view('student-transfers.show', [ 'studentTransfer' => $studentTransfer, ]); } public function update(Request $request, StudentTransfer $studentTransfer): RedirectResponse { $validated = $request->validate([ 'transfer_date' => ['nullable', 'date'], 'transfer_reason' => ['nullable', 'string'], 'transfer_letter' => ['nullable', 'file', 'mimes:pdf,jpg,jpeg,png', 'max:2048'], ], [ 'transfer_letter.mimes' => 'Surat pindah harus berupa file PDF, JPG, JPEG, atau PNG.', 'transfer_letter.max' => 'Ukuran surat pindah maksimal 2 MB.', ]); $studentTransfer->transfer_date = $validated['transfer_date'] ?? $studentTransfer->transfer_date; $studentTransfer->transfer_reason = $validated['transfer_reason'] ?? $studentTransfer->transfer_reason; if ($request->hasFile('transfer_letter')) { if ($studentTransfer->transfer_letter_file_path && Storage::disk('public')->exists($studentTransfer->transfer_letter_file_path)) { Storage::disk('public')->delete($studentTransfer->transfer_letter_file_path); } $file = $request->file('transfer_letter'); $path = $file->store("student-transfer-letters/{$studentTransfer->student_id}", 'public'); $studentTransfer->transfer_letter_file_name = $file->getClientOriginalName(); $studentTransfer->transfer_letter_file_path = $path; $studentTransfer->transfer_letter_mime_type = $file->getMimeType(); $studentTransfer->transfer_letter_file_size = $file->getSize(); } $studentTransfer->save(); Alert::success('Berhasil', 'Arsip siswa mutasi berhasil diperbarui.'); return redirect()->route('student-transfers.show', $studentTransfer)->with('success', 'Arsip siswa mutasi berhasil diperbarui.'); } public function previewLetter(StudentTransfer $studentTransfer): View { abort_unless($studentTransfer->transfer_letter_file_path && Storage::disk('public')->exists($studentTransfer->transfer_letter_file_path), 404); $mimeType = $studentTransfer->transfer_letter_mime_type ?: Storage::disk('public')->mimeType($studentTransfer->transfer_letter_file_path); $fileUrl = asset('storage/' . $studentTransfer->transfer_letter_file_path); $isImage = str_starts_with((string) $mimeType, 'image/'); $isPdf = $mimeType === 'application/pdf'; return view('student-transfers.preview-letter', [ 'studentTransfer' => $studentTransfer, 'fileUrl' => $fileUrl, 'mimeType' => $mimeType, 'isImage' => $isImage, 'isPdf' => $isPdf, ]); } }