'Tahun Angkatan', 'departments' => 'Program Keahlian', 'classes' => 'Kelas', 'document_types' => 'Jenis Dokumen', 'students' => 'Data Siswa', 'student_parents' => 'Orang Tua / Wali', 'student_documents' => 'Dokumen Siswa + file storage', 'student_academic_histories' => 'Histori Akademik Siswa', 'student_achievements' => 'Prestasi Siswa + file storage', 'student_exits' => 'Arsip Siswa Keluar + file storage', 'student_transfers' => 'Arsip Mutasi Siswa + file storage', 'student_graduations' => 'Arsip Kelulusan Siswa + file storage', ]; public function index(): View { return view('maintenance.reset-data', [ 'stats' => [ 'academicYears' => AcademicYear::count(), 'departments' => Department::count(), 'classes' => SchoolClass::count(), 'documentTypes' => DocumentType::count(), 'students' => Student::withTrashed()->count(), 'studentParents' => DB::table('student_parents')->count(), 'studentDocuments' => StudentDocument::withTrashed()->count(), 'studentAcademicHistories' => DB::table('student_academic_histories')->count(), 'studentAchievements' => StudentAchievement::count(), 'studentExits' => StudentExit::count(), 'studentTransfers' => StudentTransfer::count(), 'studentGraduations' => StudentGraduation::count(), ], 'targets' => $this->availableTargets, 'resolvedTargetsPreview' => $this->buildResolvedTargetPreview(), ]); } public function reset(Request $request): RedirectResponse { $data = $request->validate([ 'targets' => ['required', 'array', 'min:1'], 'targets.*' => ['string'], 'admin_password' => ['required', 'string'], ]); if (! Hash::check($data['admin_password'], (string) $request->user()->password)) { return back()->withErrors([ 'admin_password' => 'Password admin tidak valid.', ])->withInput(); } $targets = collect($data['targets']) ->filter(fn ($target) => array_key_exists($target, $this->availableTargets)) ->values(); if ($targets->isEmpty()) { return back()->withErrors([ 'targets' => 'Pilih minimal satu kelompok data yang ingin dikosongkan.', ])->withInput(); } $resolvedTargets = $this->resolveTargets($targets->all()); DB::transaction(function () use ($resolvedTargets) { if (in_array('student_achievements', $resolvedTargets, true)) { StudentAchievement::query()->get()->each(function (StudentAchievement $achievement) { foreach ([$achievement->certificate_file, $achievement->activity_photo] as $path) { if ($path && Storage::disk('public')->exists($path)) { Storage::disk('public')->delete($path); } } }); DB::table('student_achievements')->delete(); } if (in_array('student_exits', $resolvedTargets, true)) { StudentExit::query()->get()->each(function (StudentExit $studentExit) { if ($studentExit->exit_letter_file_path && Storage::disk('public')->exists($studentExit->exit_letter_file_path)) { Storage::disk('public')->delete($studentExit->exit_letter_file_path); } }); DB::table('student_exits')->delete(); } if (in_array('student_transfers', $resolvedTargets, true)) { StudentTransfer::query()->get()->each(function (StudentTransfer $studentTransfer) { if ($studentTransfer->transfer_letter_file_path && Storage::disk('public')->exists($studentTransfer->transfer_letter_file_path)) { Storage::disk('public')->delete($studentTransfer->transfer_letter_file_path); } }); DB::table('student_transfers')->delete(); } if (in_array('student_graduations', $resolvedTargets, true)) { StudentGraduation::query()->get()->each(function (StudentGraduation $graduation) { foreach ([ $graduation->skl_file_path, $graduation->ijazah_file_path, $graduation->transcript_file_path, $graduation->ukk_certificate_file_path, $graduation->lsp_certificate_file_path, ] as $path) { if ($path && Storage::disk('public')->exists($path)) { Storage::disk('public')->delete($path); } } }); DB::table('student_graduations')->delete(); } if (in_array('students', $resolvedTargets, true)) { Student::withTrashed()->get()->each->forceDelete(); } if (in_array('student_documents', $resolvedTargets, true)) { StudentDocument::withTrashed()->get()->each(function (StudentDocument $document) { if ($document->file_path && Storage::disk('public')->exists($document->file_path)) { Storage::disk('public')->delete($document->file_path); } }); DB::table('student_documents')->delete(); } if (in_array('student_parents', $resolvedTargets, true)) { DB::table('student_parents')->delete(); } if (in_array('student_academic_histories', $resolvedTargets, true)) { DB::table('student_academic_histories')->delete(); } if (in_array('students', $resolvedTargets, true)) { DB::table('students')->delete(); } if (in_array('classes', $resolvedTargets, true)) { DB::table('classes')->delete(); } if (in_array('document_types', $resolvedTargets, true)) { DB::table('document_types')->delete(); } if (in_array('departments', $resolvedTargets, true)) { DB::table('departments')->delete(); } if (in_array('academic_years', $resolvedTargets, true)) { DB::table('academic_years')->delete(); } }); if (in_array('student_documents', $resolvedTargets, true)) { Storage::disk('public')->deleteDirectory('student-documents'); } if (in_array('student_achievements', $resolvedTargets, true)) { Storage::disk('public')->deleteDirectory('student-achievements'); } if (in_array('student_exits', $resolvedTargets, true)) { Storage::disk('public')->deleteDirectory('student-exit-letters'); } if (in_array('student_transfers', $resolvedTargets, true)) { Storage::disk('public')->deleteDirectory('student-transfer-letters'); } if (in_array('student_graduations', $resolvedTargets, true)) { Storage::disk('public')->deleteDirectory('student-graduation-documents'); } $labels = collect($resolvedTargets) ->map(fn ($target) => $this->availableTargets[$target] ?? $target) ->implode(', '); Alert::success('Berhasil', 'Data berhasil dikosongkan: ' . $labels . '.'); return redirect()->route('settings.reset-data.index')->with('success', 'Data berhasil dikosongkan: ' . $labels . '.'); } protected function resolveTargets(array $targets): array { $resolved = collect($targets); if ($resolved->contains('students')) { $resolved = $resolved->merge([ 'student_documents', 'student_parents', 'student_academic_histories', 'student_achievements', 'student_exits', 'student_transfers', 'student_graduations', ]); } if ($resolved->contains('classes')) { $resolved = $resolved->merge([ 'students', 'student_academic_histories', 'student_achievements', 'student_exits', 'student_transfers', 'student_graduations', ]); } if ($resolved->contains('document_types')) { $resolved = $resolved->merge(['student_documents']); } if ($resolved->contains('departments')) { $resolved = $resolved->merge([ 'classes', 'students', 'student_academic_histories', 'student_achievements', 'student_exits', 'student_transfers', 'student_graduations', ]); } if ($resolved->contains('academic_years')) { $resolved = $resolved->merge([ 'classes', 'students', 'student_academic_histories', 'student_achievements', 'student_exits', 'student_transfers', 'student_graduations', ]); } return $resolved->unique()->values()->all(); } protected function buildResolvedTargetPreview(): array { return collect(array_keys($this->availableTargets)) ->mapWithKeys(function (string $target) { $resolved = $this->resolveTargets([$target]); return [ $target => collect($resolved) ->map(fn (string $resolvedTarget) => $this->availableTargets[$resolvedTarget] ?? $resolvedTarget) ->values() ->all(), ]; }) ->all(); } }