From 2c8136dcf352b109eeeb807ee7366032642db74c Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 9 Dec 2025 15:40:33 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20feat(SurveyorController):=20Tamb?= =?UTF-8?q?ahkan=20cleanup=20inspeksi=20otomatis=20pada=20method=20show?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Menambahkan fungsi cleanupInspeksiData() untuk membersihkan data inspeksi lama secara otomatis saat menampilkan detail permohonan - Method cleanupInspeksiData() dipanggil otomatis di method show() line 112 - Implementasi cleanup berbasis created_by dengan grouping data - Soft delete data inspeksi tanpa dokument_id jika ada data lengkap dengan dokument_id - Transaction handling dengan DB::beginTransaction() dan DB::rollback() untuk konsistensi data - Comprehensive logging untuk audit trail setiap operasi cleanup - Error handling individual per data dengan continue pada exception - Validasi mutual exclusion antara data dengan dan tanpa dokument_id - Integrasi dengan Auth::id() untuk tracking user yang melakukan akses --- app/Http/Controllers/SurveyorController.php | 103 +++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index f5eb6a9..5d17de3 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -9,9 +9,11 @@ use Maatwebsite\Excel\Facades\Excel; use Modules\Lpj\Exports\BasicDataSurveyorExport; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Log; use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Carbon; +use Exception; use Modules\Lpj\Models\Debiture; use Modules\Lpj\Models\LaporanExternal; use Modules\Lpj\Models\Permohonan; @@ -106,6 +108,9 @@ class SurveyorController extends Controller $provinces = Province::all(); $bentukTanah = BentukTanah::all(); + // Jalankan cleanup inspeksi otomatis untuk permohonan ini + $this->cleanupInspeksiData($id); + // Get all inspeksi data for this permohonan if (strtolower($permohonan->tujuanPenilaian->name) == 'rap') { $inspeksiData = Inspeksi::where('permohonan_id', $id) @@ -237,7 +242,7 @@ class SurveyorController extends Controller ], 200); } catch (\Exception $e) { - \Log::error('Denah Store Error: ' . $e->getMessage()); + Log::error('Denah Store Error: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => 'Gagal menyimpan data: ' . $e->getMessage() @@ -1063,7 +1068,7 @@ class SurveyorController extends Controller return null; } catch (\Exception $e) { - \Log::error('File upload error: ' . $e->getMessage()); + Log::error('File upload error: ' . $e->getMessage()); throw new \Exception("Gagal mengupload file: " . $e->getMessage()); } } @@ -2893,5 +2898,99 @@ class SurveyorController extends Controller ]); } + /** + * Fungsi untuk cleanup data inspeksi otomatis + * Menghapus data inspeksi tanpa dokument_id jika ada data lain dengan dokument_id yang sama + */ + private function cleanupInspeksiData($permohonanId) + { + try { + Log::info('SurveyorController: Memulai cleanup inspeksi otomatis', [ + 'permohonan_id' => $permohonanId, + 'user_id' => Auth::id() + ]); + + // Ambil data inspeksi yang memiliki dokument_id (data lengkap) + $dataWithDokument = Inspeksi::where('permohonan_id', $permohonanId) + ->whereNotNull('dokument_id') + ->whereNull('deleted_at') + ->get(); + + // Ambil data inspeksi yang tidak memiliki dokument_id (data yang akan di-cleanup) + $dataWithoutDokument = Inspeksi::where('permohonan_id', $permohonanId) + ->whereNull('dokument_id') + ->whereNull('deleted_at') + ->get(); + + // Jika ada data tanpa dokument_id, cek apakah ada data dengan dokument_id yang sama + if ($dataWithoutDokument->isNotEmpty() && $dataWithDokument->isNotEmpty()) { + + // Group data dengan dokument_id by created_by + $groupedDataWithDokument = $dataWithDokument->groupBy('created_by'); + + // Group data tanpa dokument_id by created_by + $groupedDataWithoutDokument = $dataWithoutDokument->groupBy('created_by'); + + // Proses cleanup untuk setiap user + foreach ($groupedDataWithDokument as $userId => $userDataWithDokument) { + + // Cek apakah user ini juga memiliki data tanpa dokument_id + if (isset($groupedDataWithoutDokument[$userId])) { + + // Ambil salah satu data dengan dokument_id sebagai referensi untuk logging + $referenceData = $userDataWithDokument->first(); + + Log::info('SurveyorController: Menemukan data lengkap untuk user, akan menghapus data tidak lengkap', [ + 'user_id' => $userId, + 'permohonan_id' => $permohonanId, + 'reference_dokument_id' => $referenceData->dokument_id, + 'data_count_to_delete' => $groupedDataWithoutDokument[$userId]->count() + ]); + + // Ambil semua data tanpa dokument_id untuk user ini + $userDataWithoutDokument = $groupedDataWithoutDokument[$userId]; + + // Soft delete data tanpa dokument_id + foreach ($userDataWithoutDokument as $dataToDelete) { + DB::beginTransaction(); + try { + // Soft delete data + $dataToDelete->delete(); + + Log::info('SurveyorController: Data inspeksi berhasil di-soft delete', [ + 'id' => $dataToDelete->id, + 'permohonan_id' => $dataToDelete->permohonan_id, + 'dokument_id' => $dataToDelete->dokument_id, + 'created_by' => $dataToDelete->created_by, + 'deleted_at' => now() + ]); + + DB::commit(); + } catch (\Exception $e) { + DB::rollback(); + Log::error('SurveyorController: Gagal menghapus data inspeksi', [ + 'id' => $dataToDelete->id, + 'error' => $e->getMessage() + ]); + } + } + } + } + } + + Log::info('SurveyorController: Cleanup inspeksi otomatis selesai', [ + 'permohonan_id' => $permohonanId, + 'data_with_dokument' => $dataWithDokument->count(), + 'data_without_dokument' => $dataWithoutDokument->count() + ]); + + } catch (\Exception $e) { + Log::error('SurveyorController: Error saat cleanup inspeksi otomatis', [ + 'permohonan_id' => $permohonanId, + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + } + } }