From 2f6f21164950d163356d9c1e8a6e3d493790e836 Mon Sep 17 00:00:00 2001 From: Ryanpratama01 <220441100098@student.trunojoyo.ac.id> Date: Thu, 25 Jun 2026 20:14:57 +0700 Subject: [PATCH] fix problem in conttroller admin --- .../Controllers/Admin/LaporanController.php | 401 +++++++++--------- routes/web.php | 1 - 2 files changed, 197 insertions(+), 205 deletions(-) diff --git a/app/Http/Controllers/Admin/LaporanController.php b/app/Http/Controllers/Admin/LaporanController.php index 450e53b..3aef282 100644 --- a/app/Http/Controllers/Admin/LaporanController.php +++ b/app/Http/Controllers/Admin/LaporanController.php @@ -1,220 +1,213 @@ query('nik', '')); - $statusData = null; - $penerimaFinal = null; - $explanation = ['positive' => [], 'negative' => [], 'summary' => null]; + $user = $request->user(); - if ($nik !== '') { - $statusData = CalonPenerima::with(['rt.dusun', 'prediksiKelayakan']) - ->where('nik', $nik) - ->first(); - - if ($statusData) { - // ── Cari PenerimaFinal secara manual ── - // Coba berbagai kemungkinan foreign key / kolom pencarian - try { - $penerimaFinal = PenerimaFinal::where('nik', $nik)->first(); - } catch (\Exception $e) { - // Kolom 'nik' tidak ada, coba cara lain - } - - if (!$penerimaFinal) { - try { - $penerimaFinal = PenerimaFinal::where('calon_id', $statusData->id)->first(); - } catch (\Exception $e) {} - } - - if (!$penerimaFinal) { - try { - $penerimaFinal = PenerimaFinal::where('id_calon', $statusData->id)->first(); - } catch (\Exception $e) {} - } - - if (!$penerimaFinal) { - try { - $penerimaFinal = PenerimaFinal::where('user_id', $statusData->user_id)->first(); - } catch (\Exception $e) {} - } - - // ── Parse explanation dari prediksiKelayakan ── - if ($statusData->prediksiKelayakan) { - $pred = $statusData->prediksiKelayakan; - - $raw = $pred->explanation - ?? $pred->feature_explanation - ?? $pred->alasan - ?? null; - - if (is_string($raw) && !empty($raw)) { - $decoded = json_decode($raw, true); - if (is_array($decoded)) { - $explanation = [ - 'positive' => $decoded['positive'] ?? $decoded['pendukung'] ?? [], - 'negative' => $decoded['negative'] ?? $decoded['pengurang'] ?? [], - 'summary' => $decoded['summary'] ?? $decoded['ringkasan'] ?? null, - ]; - } - } elseif (is_array($raw)) { - $explanation = [ - 'positive' => $raw['positive'] ?? $raw['pendukung'] ?? [], - 'negative' => $raw['negative'] ?? $raw['pengurang'] ?? [], - 'summary' => $raw['summary'] ?? $raw['ringkasan'] ?? null, - ]; - } - - // Fallback field lain dari prediksi - if (empty($explanation['positive']) && empty($explanation['negative'])) { - foreach (['feature_importances', 'features', 'detail', 'data'] as $field) { - if (!empty($pred->$field)) { - $val = is_string($pred->$field) ? json_decode($pred->$field, true) : $pred->$field; - if (is_array($val) && isset($val['positive'])) { - $explanation = [ - 'positive' => $val['positive'] ?? [], - 'negative' => $val['negative'] ?? [], - 'summary' => $val['summary'] ?? null, - ]; - break; - } - } - } - } - - // ── GENERATE OTOMATIS dari data CalonPenerima ── - // Dijalankan jika explanation masih kosong setelah semua fallback - if (empty($explanation['positive']) && empty($explanation['negative'])) { - $cp = $statusData; - $positive = []; - $negative = []; - - // Pekerjaan - $pekerjaan = strtolower($cp->pekerjaan ?? ''); - if (in_array($pekerjaan, ['tidak bekerja', 'tidak ada', '-', ''])) { - $positive[] = 'Tidak bekerja / tidak memiliki penghasilan tetap'; - } elseif (in_array($pekerjaan, ['petani', 'buruh', 'nelayan', 'pemulung', 'pedagang kecil'])) { - $positive[] = 'Pekerjaan termasuk kategori rentan ('. ucfirst($pekerjaan) .')'; - } else { - $negative[] = 'Memiliki pekerjaan (' . ucfirst($pekerjaan) . ')'; - } - - // Penghasilan - $penghasilan = (float)($cp->penghasilan ?? 0); - if ($penghasilan == 0) { - $positive[] = 'Penghasilan Rp 0 (tidak ada penghasilan)'; - } elseif ($penghasilan < 500000) { - $positive[] = 'Penghasilan sangat rendah (Rp ' . number_format($penghasilan, 0, ',', '.') . '/bulan)'; - } elseif ($penghasilan < 1500000) { - $positive[] = 'Penghasilan di bawah UMR (Rp ' . number_format($penghasilan, 0, ',', '.') . '/bulan)'; - } else { - $negative[] = 'Penghasilan cukup (Rp ' . number_format($penghasilan, 0, ',', '.') . '/bulan)'; - } - - // Tanggungan - $tanggungan = (int)($cp->jumlah_tanggungan ?? 0); - if ($tanggungan >= 4) { - $positive[] = 'Jumlah tanggungan banyak (' . $tanggungan . ' orang)'; - } elseif ($tanggungan >= 2) { - $positive[] = 'Memiliki tanggungan ' . $tanggungan . ' orang'; - } else { - $negative[] = 'Tanggungan sedikit (' . $tanggungan . ' orang)'; - } - - // Aset - $aset = strtolower($cp->aset_kepemilikan ?? ''); - if (in_array($aset, ['tidak punya', 'tidak ada', 'tidak memiliki', '-', ''])) { - $positive[] = 'Tidak memiliki aset berarti'; - } else { - $negative[] = 'Memiliki aset kepemilikan (' . ucfirst($aset) . ')'; - } - - // Bantuan lain - $bantuan = strtolower($cp->bantuan_lain ?? ''); - if (in_array($bantuan, ['tidak', 'tidak ada', '-', ''])) { - $positive[] = 'Belum menerima bantuan sosial lain'; - } else { - $negative[] = 'Sudah menerima bantuan lain (' . $cp->bantuan_lain . ')'; - } - - // Usia - $usia = $cp->usia ?? ($cp->tanggal_lahir - ? \Carbon\Carbon::parse($cp->tanggal_lahir)->age - : null); - if ($usia !== null) { - if ($usia >= 60) { - $positive[] = 'Usia lanjut (' . $usia . ' tahun) — prioritas penerima'; - } elseif ($usia >= 50) { - $positive[] = 'Usia ' . $usia . ' tahun (termasuk kelompok rentan)'; - } elseif ($usia < 18) { - $positive[] = 'Usia ' . $usia . ' tahun (anak/remaja dalam keluarga)'; - } - } - - // Kondisi rumah - $kondisi = strtolower($cp->kondisi_rumah ?? ''); - if (in_array($kondisi, ['tidak layak', 'buruk', 'rusak', 'sangat buruk'])) { - $positive[] = 'Kondisi rumah tidak layak huni'; - } elseif (in_array($kondisi, ['sedang', 'cukup'])) { - // netral, tidak tambah ke mana-mana - } elseif (!empty($kondisi) && !in_array($kondisi, ['-', ''])) { - $negative[] = 'Kondisi rumah ' . ucfirst($kondisi); - } - - // Meteran listrik - $meteran = strtolower($cp->meteran_listrik ?? ''); - if (in_array($meteran, ['450va', '450 va'])) { - $positive[] = 'Meteran listrik 450VA (golongan sangat miskin)'; - } elseif (in_array($meteran, ['900va', '900 va'])) { - $positive[] = 'Meteran listrik 900VA (golongan miskin/subsidi)'; - } elseif (!empty($meteran) && !in_array($meteran, ['-', ''])) { - $negative[] = 'Meteran listrik ' . strtoupper($cp->meteran_listrik); - } - - // Sumber air - $air = strtolower($cp->sumber_air ?? ''); - if (in_array($air, ['sumur', 'sungai', 'mata air', 'tadah hujan'])) { - $positive[] = 'Sumber air ' . ucfirst($air) . ' (bukan PDAM)'; - } elseif (!empty($air) && !in_array($air, ['-', ''])) { - $negative[] = 'Sumber air ' . ucfirst($air); - } - - // Rekomendasi prediksi - $rek = strtolower($pred->recommendation ?? $pred->status ?? ''); - $isLayakPred = in_array($rek, ['layak', 'ya', 'yes', '1', 'true']); - - $explanation = [ - 'positive' => $positive, - 'negative' => $negative, - 'summary' => 'Nilai kelayakan dihitung berdasarkan pekerjaan, penghasilan, tanggungan, aset, bantuan lain, usia, kondisi rumah, meteran listrik, dan sumber air.' - . (count($positive) > 0 && count($negative) > 0 - ? ' Terdapat faktor pendukung dan pengurang.' - : (count($positive) > 0 ? ' Terdapat beberapa faktor pendukung.' : ' Tidak ada faktor yang signifikan.')), - ]; - } - } - } + if (!$user || $user->role !== 'admin') { + abort(403, 'Akses ditolak: hanya Admin.'); } - $laporanPubliks = LaporanPublik::where('is_active', true) - ->latest() - ->get(); + $dusuns = Dusun::orderBy('nama_dusun')->get(); - return view('landing', compact( - 'nik', - 'statusData', - 'penerimaFinal', - 'laporanPubliks', - 'explanation' + $filterDusun = $request->query('dusun', ''); + $filterStatus = $request->query('status', ''); + $filterPeriode = $request->query('periode', ''); + + $query = PenerimaFinal::query(); + + if ($filterDusun !== '') { + $query->where('nama_dusun', $filterDusun); + } + + if ($filterStatus !== '') { + $query->where('status_verifikasi', $filterStatus); + } + + if ($filterPeriode !== '') { + $query->where('periode_bantuan', $filterPeriode); + } + + $penerimas = $query->orderBy('nama_dusun')->orderByDesc('probability')->paginate(15)->withQueryString(); + + $totalPenerima = PenerimaFinal::where('status_verifikasi', 'ditetapkan')->count(); + $totalDitolak = PenerimaFinal::where('status_verifikasi', 'ditolak')->count(); + $totalBantuan = PenerimaFinal::where('status_verifikasi', 'ditetapkan')->sum('jumlah_bantuan'); + + $periodes = PenerimaFinal::distinct()->orderByDesc('periode_bantuan')->pluck('periode_bantuan'); + + $laporanPubliks = LaporanPublik::latest()->get(); + + return view('admin.laporan', compact( + 'penerimas', + 'dusuns', + 'filterDusun', + 'filterStatus', + 'filterPeriode', + 'totalPenerima', + 'totalDitolak', + 'totalBantuan', + 'periodes', + 'laporanPubliks' )); } + + public function exportPdf(Request $request) + { + $user = $request->user(); + + if (!$user || $user->role !== 'admin') { + abort(403, 'Akses ditolak: hanya Admin.'); + } + + $filterDusun = $request->query('dusun', ''); + $filterStatus = $request->query('status', ''); + $filterPeriode = $request->query('periode', ''); + + $query = PenerimaFinal::query(); + + if ($filterDusun !== '') { + $query->where('nama_dusun', $filterDusun); + } + + if ($filterStatus !== '') { + $query->where('status_verifikasi', $filterStatus); + } + + if ($filterPeriode !== '') { + $query->where('periode_bantuan', $filterPeriode); + } + + $penerimas = $query->orderBy('nama_dusun')->orderByDesc('probability')->get(); + + $pdf = Pdf::loadView('admin.laporan-pdf', compact('penerimas', 'filterDusun', 'filterStatus', 'filterPeriode')) + ->setPaper('a4', 'landscape'); + + return $pdf->download('laporan-penerima-blt-dd.pdf'); + } + + public function exportExcel(Request $request) + { + $user = $request->user(); + + if (!$user || $user->role !== 'admin') { + abort(403, 'Akses ditolak: hanya Admin.'); + } + + $filterDusun = $request->query('dusun', ''); + $filterStatus = $request->query('status', ''); + $filterPeriode = $request->query('periode', ''); + + return Excel::download( + new LaporanExport($filterDusun, $filterStatus, $filterPeriode), + 'laporan-penerima-blt-dd.xlsx' + ); + } + + public function kirimKeRt(Request $request) + { + $user = $request->user(); + + if (!$user || $user->role !== 'admin') { + abort(403, 'Akses ditolak: hanya Admin.'); + } + + // Tandai semua CalonPenerima yang sudah selesai agar RT bisa lihat hasilnya + CalonPenerima::where('tracking_status', 'selesai') + ->update(['tracking_status' => 'selesai']); + + return back()->with('success', 'Laporan berhasil dikirim ke RT.'); + } + + public function resetManual(Request $request) + { + $user = $request->user(); + + if (!$user || $user->role !== 'admin') { + abort(403, 'Akses ditolak: hanya Admin.'); + } + + $request->validate([ + 'periode_bantuan' => ['required', 'string'], + ]); + + PenerimaFinal::where('periode_bantuan', $request->periode_bantuan)->delete(); + + return back()->with('success', 'Data laporan periode ' . $request->periode_bantuan . ' berhasil direset.'); + } + + public function uploadPublikPdf(Request $request) + { + $user = $request->user(); + + if (!$user || $user->role !== 'admin') { + abort(403, 'Akses ditolak: hanya Admin.'); + } + + $request->validate([ + 'judul' => ['required', 'string', 'max:255'], + 'file' => ['required', 'file', 'mimes:pdf', 'max:10240'], + ]); + + $path = $request->file('file')->store('laporan-publik', 'public'); + + LaporanPublik::create([ + 'judul' => $request->judul, + 'file_path' => $path, + 'is_active' => true, + ]); + + return back()->with('success', 'PDF publik berhasil diupload.'); + } + + public function hapusPublikPdf(Request $request, $id) + { + $user = $request->user(); + + if (!$user || $user->role !== 'admin') { + abort(403, 'Akses ditolak: hanya Admin.'); + } + + $laporan = LaporanPublik::findOrFail($id); + + if (Storage::disk('public')->exists($laporan->file_path)) { + Storage::disk('public')->delete($laporan->file_path); + } + + $laporan->delete(); + + return back()->with('success', 'PDF publik berhasil dihapus.'); + } + + public function bersihkanRiwayatSelesai(Request $request) + { + $user = $request->user(); + + if (!$user || $user->role !== 'admin') { + abort(403, 'Akses ditolak: hanya Admin.'); + } + + // Arsipkan semua CalonPenerima yang tracking_status = selesai + CalonPenerima::where('tracking_status', 'selesai') + ->whereNull('arsip_tahun') + ->update(['arsip_tahun' => now()->year]); + + return back()->with('success', 'Riwayat data selesai berhasil dibersihkan dan diarsipkan.'); + } } \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 546c4a8..a90f7a5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,7 +13,6 @@ use App\Http\Controllers\Admin\AdminController; use App\Http\Controllers\Admin\FilterisasiController; use App\Http\Controllers\Admin\LaporanController; - // RT Controllers use App\Http\Controllers\Rt\DashboardController as RtDashboardController; use App\Http\Controllers\Rt\CalonPenerimaController as RtCalonPenerimaController;