From a2275758b1ffccd344c4c4a31611bbf3f5ed9060 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 9 Dec 2025 15:34:47 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=8D=20feat(CleanupInspeksiStatusComman?= =?UTF-8?q?d):=20Tambahkan=20command=20untuk=20monitoring=20status=20data?= =?UTF-8?q?=20inspeksi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Membuat artisan command untuk cek status data yang memerlukan cleanup dengan opsi filter dan detail view - Command signature: `lpj:cleanup-inspeksi-status` dengan opsi --permohonan-id, --created-by, dan --detailed - Method showGeneralStats() untuk statistik umum data (total, aktif, terhapus, dengan/tanpa dokument_id) - Method showCleanupStats() untuk identifikasi data yang perlu cleanup berdasarkan permohonan_id dan created_by - Method showDetailedData() untuk menampilkan 20 data terbaru dengan relasi permohonan dan dokument - Query optimization dengan DB::table dan raw SQL untuk performa optimal - Error handling dengan try-catch dan logging ke Laravel Log - Tampilan tabel yang informatif dengan format number_format untuk angka besar - Support filter berdasarkan permohonan_id dan created_by untuk analisis spesifik - Limit 20 data untuk mencegah overload memory pada dataset besar --- .../Commands/CleanupInspeksiStatusCommand.php | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 app/Console/Commands/CleanupInspeksiStatusCommand.php diff --git a/app/Console/Commands/CleanupInspeksiStatusCommand.php b/app/Console/Commands/CleanupInspeksiStatusCommand.php new file mode 100644 index 0000000..be54ccc --- /dev/null +++ b/app/Console/Commands/CleanupInspeksiStatusCommand.php @@ -0,0 +1,192 @@ +option('permohonan-id'); + $createdBy = $this->option('created-by'); + $detailed = $this->option('detailed'); + + $this->info('=== Status Data Inspeksi ==='); + $this->newLine(); + + // Ambil statistik umum + $this->showGeneralStats(); + + // Ambil data yang memerlukan cleanup + $this->showCleanupStats($permohonanId, $createdBy); + + if ($detailed) { + $this->showDetailedData($permohonanId, $createdBy); + } + + return Command::SUCCESS; + + } catch (\Exception $e) { + Log::error('CleanupInspeksiStatusCommand: Terjadi error', [ + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + + $this->error('Terjadi kesalahan: ' . $e->getMessage()); + return Command::FAILURE; + } + } + + /** + * Tampilkan statistik umum + */ + private function showGeneralStats(): void + { + $this->info('Statistik Umum:'); + + $totalData = Inspeksi::count(); + $activeData = Inspeksi::whereNull('deleted_at')->count(); + $deletedData = Inspeksi::whereNotNull('deleted_at')->count(); + $dataWithDokument = Inspeksi::whereNotNull('dokument_id')->count(); + $dataWithoutDokument = Inspeksi::whereNull('dokument_id')->count(); + + $this->table( + ['Metrik', 'Jumlah'], + [ + ['Total Data', number_format($totalData)], + ['Data Aktif', number_format($activeData)], + ['Data Terhapus (Soft)', number_format($deletedData)], + ['Data dengan Dokument ID', number_format($dataWithDokument)], + ['Data tanpa Dokument ID', number_format($dataWithoutDokument)], + ] + ); + + $this->newLine(); + } + + /** + * Tampilkan statistik cleanup + */ + private function showCleanupStats(?int $permohonanId = null, ?int $createdBy = null): void + { + $this->info('Data yang Memerlukan Cleanup:'); + + $query = DB::table('inspeksi as i') + ->select( + 'i.permohonan_id', + 'i.created_by', + DB::raw('COUNT(CASE WHEN i.dokument_id IS NOT NULL AND i.deleted_at IS NULL THEN 1 END) as new_data_count'), + DB::raw('COUNT(CASE WHEN i.dokument_id IS NULL AND i.deleted_at IS NULL THEN 1 END) as old_data_count'), + DB::raw('MIN(i.created_at) as oldest_data'), + DB::raw('MAX(i.created_at) as newest_data') + ) + ->whereNull('i.deleted_at') + ->groupBy('i.permohonan_id', 'i.created_by'); + + if ($permohonanId) { + $query->where('i.permohonan_id', $permohonanId); + } + + if ($createdBy) { + $query->where('i.created_by', $createdBy); + } + + $results = $query->havingRaw('new_data_count > 0 AND old_data_count > 0') + ->orderBy('old_data_count', 'desc') + ->limit(20) + ->get(); + + if ($results->isEmpty()) { + $this->info('Tidak ada data yang memerlukan cleanup.'); + return; + } + + $this->table( + ['Permohonan ID', 'Created By', 'Data Baru', 'Data Lama', 'Data Terlama', 'Data Terbaru'], + $results->map(function ($item) { + return [ + $item->permohonan_id, + $item->created_by, + $item->new_data_count, + $item->old_data_count, + $item->oldest_data, + $item->newest_data, + ]; + })->toArray() + ); + + $totalPermohonan = $results->count(); + $totalOldData = $results->sum('old_data_count'); + + $this->info("Total permohonan yang perlu cleanup: {$totalPermohonan}"); + $this->info("Total data lama yang akan dihapus: {$totalOldData}"); + $this->newLine(); + } + + /** + * Tampilkan detail data + */ + private function showDetailedData(?int $permohonanId = null, ?int $createdBy = null): void + { + $this->info('Detail Data (20 data terbaru):'); + + $query = Inspeksi::with(['permohonan', 'dokument']) + ->whereNull('deleted_at'); + + if ($permohonanId) { + $query->where('permohonan_id', $permohonanId); + } + + if ($createdBy) { + $query->where('created_by', $createdBy); + } + + $data = $query->orderBy('created_at', 'desc') + ->limit(20) + ->get(); + + if ($data->isEmpty()) { + $this->info('Tidak ada data untuk ditampilkan.'); + return; + } + + $this->table( + ['ID', 'Permohonan ID', 'Created By', 'Dokument ID', 'Status', 'Created At'], + $data->map(function ($item) { + return [ + $item->id, + $item->permohonan_id, + $item->created_by, + $item->dokument_id ?? '-', + $item->status, + $item->created_at, + ]; + })->toArray() + ); + } +} \ No newline at end of file