Initial commit

This commit is contained in:
2026-04-12 06:24:30 +00:00
commit 007f107be6
213 changed files with 25576 additions and 0 deletions
@@ -0,0 +1,161 @@
<?php
namespace App\Http\Controllers;
use App\Models\AcademicYear;
use App\Models\Department;
use App\Models\DocumentType;
use App\Models\SchoolClass;
use App\Models\Student;
use App\Models\StudentDocument;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
use Illuminate\View\View;
use RealRashid\SweetAlert\Facades\Alert;
class MaintenanceController extends Controller
{
protected array $availableTargets = [
'academic_years' => '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',
];
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(),
],
'targets' => $this->availableTargets,
]);
}
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('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');
}
$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']);
}
if ($resolved->contains('classes')) {
$resolved = $resolved->merge(['students', 'student_academic_histories']);
}
if ($resolved->contains('document_types')) {
$resolved = $resolved->merge(['student_documents']);
}
if ($resolved->contains('departments')) {
$resolved = $resolved->merge(['classes', 'students', 'student_academic_histories']);
}
if ($resolved->contains('academic_years')) {
$resolved = $resolved->merge(['classes', 'students', 'student_academic_histories']);
}
return $resolved->unique()->values()->all();
}
}