fix problem in conttroller admin
This commit is contained in:
parent
9d516a5edf
commit
2f6f211649
|
|
@ -1,220 +1,213 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Models\CalonPenerima;
|
||||
use App\Models\LaporanPublik;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\PenerimaFinal;
|
||||
use App\Models\LaporanPublik;
|
||||
use App\Models\CalonPenerima;
|
||||
use App\Models\Dusun;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Barryvdh\DomPDF\Facade\Pdf;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use App\Exports\LaporanExport;
|
||||
|
||||
class LandingPageController extends Controller
|
||||
|
||||
class LaporanController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$nik = trim((string) $request->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.');
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue