🔧 feat(SurveyorController): Tambahkan cleanup inspeksi otomatis pada method show

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
This commit is contained in:
Daeng Deni Mardaeni
2025-12-09 15:40:33 +07:00
parent 3315e1d4b6
commit 2c8136dcf3

View File

@@ -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()
]);
}
}
}