Improve reset data module safety and UI

This commit is contained in:
2026-05-02 14:03:52 +07:00
parent a57b17720f
commit cb87dd2f9a
2 changed files with 356 additions and 68 deletions
+126 -5
View File
@@ -7,11 +7,14 @@ use App\Models\Department;
use App\Models\DocumentType;
use App\Models\SchoolClass;
use App\Models\Student;
use App\Models\StudentAchievement;
use App\Models\StudentDocument;
use App\Models\StudentExit;
use App\Models\StudentGraduation;
use App\Models\StudentTransfer;
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;
@@ -28,6 +31,10 @@ class MaintenanceController extends Controller
'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
@@ -42,8 +49,13 @@ class MaintenanceController extends Controller
'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(),
]);
}
@@ -76,6 +88,52 @@ class MaintenanceController extends Controller
$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();
}
@@ -122,6 +180,22 @@ class MaintenanceController extends Controller
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(', ');
@@ -136,11 +210,26 @@ class MaintenanceController extends Controller
$resolved = collect($targets);
if ($resolved->contains('students')) {
$resolved = $resolved->merge(['student_documents', 'student_parents', 'student_academic_histories']);
$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']);
$resolved = $resolved->merge([
'students',
'student_academic_histories',
'student_achievements',
'student_exits',
'student_transfers',
'student_graduations',
]);
}
if ($resolved->contains('document_types')) {
@@ -148,14 +237,46 @@ class MaintenanceController extends Controller
}
if ($resolved->contains('departments')) {
$resolved = $resolved->merge(['classes', 'students', 'student_academic_histories']);
$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']);
$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();
}
}