getMessage()); } } // ============================================================ // INDEX — RT & Admin // ============================================================ public function index() { $user = Auth::user(); if ($user->role == 'admin') { // Admin hanya lihat (tidak ada approve lagi, hanya view) $layanan = Layanan::with('penghuni') ->latest() ->get(); } else { // RT lihat pengaduan penghuni di RT-nya $rtId = $user->id; $layanan = Layanan::with('penghuni') ->whereHas('penghuni', function ($q) use ($rtId) { $q->where('rt_id', $rtId); }) ->latest() ->get(); } return view('admin.layanan.index', compact('layanan')); } // ============================================================ // STORE — dari admin panel (jika ada) // ============================================================ public function store(Request $request) { Layanan::create([ 'penghuni_id' => $request->penghuni_id, 'tanggal_pengaduan' => now(), 'kategori_masalah' => $request->kategori_masalah, 'deskripsi' => $request->deskripsi, 'status' => 'diajukan' ]); return back()->with('success', 'Pengaduan berhasil ditambahkan'); } // ============================================================ // TANGGAPI RT — RT memberi tanggapan awal (status: diproses) // ============================================================ public function tanggapiRT(Request $request, $id) { $request->validate([ 'tanggapan_admin' => 'required|string', ]); $layanan = Layanan::with('penghuni')->findOrFail($id); $layanan->tanggapan_admin = $request->tanggapan_admin; $layanan->status = 'diproses'; $layanan->save(); $this->kirimNotif($layanan); return back()->with('success', 'Tanggapan berhasil dikirim ke penghuni.'); } // ============================================================ // KONFIRMASI SELESAI — RT konfirmasi selesai + foto bukti // ============================================================ public function konfirmasiSelesai(Request $request, $id) { $request->validate([ 'catatan_selesai' => 'required|string', 'foto_bukti_rt' => 'nullable|image|mimes:jpg,jpeg,png|max:3072', ]); $layanan = Layanan::with('penghuni')->findOrFail($id); // Simpan catatan selesai $layanan->catatan_selesai = $request->catatan_selesai; $layanan->status = 'selesai'; // Upload foto bukti RT jika ada if ($request->hasFile('foto_bukti_rt')) { $path = $request->file('foto_bukti_rt')->store('bukti_rt', 'public'); $layanan->foto_bukti_rt = $path; } $layanan->save(); // Kirim notifikasi selesai $this->kirimNotifSelesai($layanan); return back()->with('success', 'Pengaduan dikonfirmasi selesai & notifikasi terkirim.'); } // ============================================================ // DESTROY // ============================================================ public function destroy($id) { Layanan::findOrFail($id)->delete(); return back()->with('success', 'Data berhasil dihapus'); } // ============================================================ // INDEX ADMIN (view only) // ============================================================ public function indexAdmin() { $layanan = Layanan::with('penghuni')->latest()->get(); return view('admin.layanan.index', compact('layanan')); } // ============================================================ // PRIVATE: Notif tanggapan awal (diproses) // ============================================================ private function kirimNotif($layanan) { if (!$layanan->penghuni) return; $nama = $layanan->penghuni->nama; $tanggapan = $layanan->tanggapan_admin ?? '-'; $tanggal = now()->format('d-m-Y H:i'); // WhatsApp if (!empty($layanan->penghuni->telepon)) { $pesan = "🏡 *GREEN VIEW RESIDENCE*\n"; $pesan .= "━━━━━━━━━━━━━━━━━━━━━━\n"; $pesan .= "📢 *NOTIFIKASI PENGADUAN*\n"; $pesan .= "━━━━━━━━━━━━━━━━━━━━━━\n\n"; $pesan .= "Halo *{$nama}* 👋\n\n"; $pesan .= "Pengaduan Anda sedang *DIPROSES* oleh RT.\n\n"; $pesan .= "📌 *TANGGAPAN RT*\n"; $pesan .= "──────────────────────\n"; $pesan .= "{$tanggapan}\n\n"; $pesan .= "📅 Tanggal: {$tanggal}\n"; $pesan .= "📲 Cek detail: " . url('/') . "\n\n"; $pesan .= "━━━━━━━━━━━━━━━━━━━━━━\n"; $pesan .= "🙏 Terima kasih atas kepercayaan Anda\n"; $pesan .= "🏡 *Green View Residence*"; $terkirim = WhatsappService::send($layanan->penghuni->telepon, $pesan); if (!$terkirim) { Log::warning('[Layanan] WA gagal ke: ' . $layanan->penghuni->telepon); } } // Email if (!empty($layanan->penghuni->email)) { try { Mail::to($layanan->penghuni->email)->send(new NotifPengaduan($layanan)); } catch (\Exception $e) { Log::error('[Layanan] Email gagal: ' . $e->getMessage()); } } } // ============================================================ // PRIVATE: Notif selesai (RT konfirmasi selesai) // ============================================================ private function kirimNotifSelesai($layanan) { if (!$layanan->penghuni) return; $nama = $layanan->penghuni->nama; $catatan = $layanan->catatan_selesai ?? '-'; $tanggal = now()->format('d-m-Y H:i'); // WhatsApp if (!empty($layanan->penghuni->telepon)) { $pesan = "🏡 *GREEN VIEW RESIDENCE*\n"; $pesan .= "━━━━━━━━━━━━━━━━━━━━━━\n"; $pesan .= "✅ *PENGADUAN SELESAI*\n"; $pesan .= "━━━━━━━━━━━━━━━━━━━━━━\n\n"; $pesan .= "Halo *{$nama}* 👋\n\n"; $pesan .= "Pengaduan Anda telah *SELESAI* ditangani oleh RT.\n\n"; $pesan .= "📋 *KETERANGAN PENYELESAIAN*\n"; $pesan .= "──────────────────────\n"; $pesan .= "{$catatan}\n\n"; $pesan .= "📅 Tanggal Selesai: {$tanggal}\n"; $pesan .= "📲 Lihat bukti: " . url('/') . "\n\n"; $pesan .= "━━━━━━━━━━━━━━━━━━━━━━\n"; $pesan .= "🙏 Terima kasih telah menggunakan layanan kami\n"; $pesan .= "🏡 *Green View Residence*"; $terkirim = WhatsappService::send($layanan->penghuni->telepon, $pesan); if (!$terkirim) { Log::warning('[Layanan] WA selesai gagal ke: ' . $layanan->penghuni->telepon); } } // Email if (!empty($layanan->penghuni->email)) { try { Mail::to($layanan->penghuni->email)->send(new NotifPengaduan($layanan, 'selesai')); } catch (\Exception $e) { Log::error('[Layanan] Email selesai gagal: ' . $e->getMessage()); } } } }