search) { $query->whereHas('user', function ($q) use ($request) { $q->where( 'nama_user', 'like', '%' . $request->search . '%' ); })->orWhereHas('properti', function ($q) use ($request) { $q->where( 'nama_properti', 'like', '%' . $request->search . '%' ); }); } // FILTER STATUS if ($request->status) { $query->where( 'status', $request->status ); } // FILTER METODE if ($request->metode) { $query->where( 'metode_pembayaran', $request->metode ); } // SORTING if ($request->sort == 'oldest') { $query->oldest(); } elseif ($request->sort == 'name_asc') { $query->join( 'users', 'pemesanan.id_user', '=', 'users.id_user' )->orderBy( 'users.nama_user', 'asc' ); } elseif ($request->sort == 'name_desc') { $query->join( 'users', 'pemesanan.id_user', '=', 'users.id_user' )->orderBy( 'users.nama_user', 'desc' ); } else { $query->latest(); } $pemesanan = $query ->latest() ->paginate(6) ->withQueryString(); return view( 'admin.monitoring-pemesanan', compact('pemesanan') ); } // ========================================================= // DETAIL MONITORING ADMIN // ========================================================= public function show($id) { $pemesanan = Pemesanan::with([ 'user', 'properti', 'dokumen' ])->findOrFail($id); // AMBIL RIWAYAT AKTIVITAS $aktivitas = LogAktivitas::where( 'ref_id', $pemesanan->id_pemesanan ) ->latest() ->get(); return view( 'admin.detail-monitoring', compact( 'pemesanan', 'aktivitas' ) ); } // ========================================================= // UPDATE MONITORING // ========================================================= public function update(Request $request, $id) { $pemesanan = Pemesanan::findOrFail($id); /* |------------------------------------------------------------------ | TENTUKAN STATUS TRANSAKSI |------------------------------------------------------------------ */ $statusTransaksi = 'menunggu_pembayaran'; if (strtolower($request->status) == 'selesai') { $statusTransaksi = 'berhasil'; } elseif (strtolower($request->status) == 'ditolak') { $statusTransaksi = 'ditolak'; } elseif ( strtolower($request->tahap_saat_ini) == 'pelunasan pembayaran' ) { $statusTransaksi = 'menunggu_pembayaran'; } elseif ( strtolower($request->tahap_saat_ini) == 'serah terima rumah' ) { $statusTransaksi = 'berhasil'; } /* |------------------------------------------------------------------ | UPDATE DATA PEMESANAN |------------------------------------------------------------------ */ $pemesanan->update([ 'tahap_saat_ini' => $request->tahap_saat_ini, 'status' => $request->status, 'estimasi_proses' => $request->estimasi_proses, 'catatan_admin' => $request->catatan_admin, ]); /* |------------------------------------------------------------------ | UPDATE STATUS TRANSAKSI |------------------------------------------------------------------ */ $transaksi = Transaksi::where( 'id_user', $pemesanan->id_user ) ->where( 'id_properti', $pemesanan->id_properti ) ->orderBy('id_transaksi', 'desc') ->first(); if ($transaksi) { $transaksi->update([ 'status_transaksi' => $statusTransaksi ]); } /* |------------------------------------------------------------------ | LOG AKTIVITAS |------------------------------------------------------------------ */ LogAktivitas::create([ 'id_user' => auth()->user()->id_user, 'aktivitas' => 'Admin mengubah progress menjadi "' . $request->tahap_saat_ini . '" dengan status "' . $request->status . '"', 'icon' => 'fa-sync-alt', 'tipe' => 'monitoring', 'ref_id' => $pemesanan->id_pemesanan ]); /* |------------------------------------------------------------------ | KIRIM NOTIFIKASI |------------------------------------------------------------------ */ if ($request->kirim_notifikasi) { $judul = 'Update Progress Pemesanan'; $pesan = 'Pemesanan properti kamu saat ini berada pada tahap "' . $request->tahap_saat_ini . '" dengan status "' . $request->status . '".'; // KHUSUS PELUNASAN if ( strtolower($request->tahap_saat_ini) == 'pelunasan' && $request->status != 'Selesai' ) { $judul = 'Tagihan Pelunasan'; $pesan = 'Silakan melakukan pelunasan pembayaran rumah Anda. Klik notifikasi ini untuk melihat invoice dan detail tagihan.'; Notifikasi::create([ 'id_user' => $pemesanan->id_user, 'judul' => $judul, 'pesan' => $pesan, 'tipe' => 'pelunasan', 'status_baca' => 0, 'status_kirim' => 'terkirim', 'channel' => 'in_app', 'referensi_id' => $transaksi->id_transaksi, 'referensi_tipe' => 'invoice', ]); } elseif ( strtolower($request->tahap_saat_ini) == 'pelunasan pembayaran' && $request->status == 'Selesai' ) { $judul = 'Pelunasan Berhasil'; $pesan = 'Pembayaran Anda telah berhasil diverifikasi. Klik notifikasi ini untuk melihat invoice.'; Notifikasi::create([ 'id_user' => $pemesanan->id_user, 'judul' => $judul, 'pesan' => $pesan, 'tipe' => 'pelunasan', 'status_baca' => 0, 'status_kirim' => 'terkirim', 'channel' => 'in_app', 'referensi_id' => $transaksi->id_transaksi, 'referensi_tipe' => 'invoice', ]); } else { Notifikasi::create([ 'id_user' => $pemesanan->id_user, 'judul' => $judul, 'pesan' => $pesan, 'tipe' => 'monitoring', 'status_baca' => 0, 'status_kirim' => 'terkirim', 'channel' => 'in_app', 'referensi_id' => $pemesanan->id_pemesanan, 'referensi_tipe' => 'pemesanan', ]); } /* |-------------------------------------------------------------- | LOG NOTIFIKASI |-------------------------------------------------------------- */ LogAktivitas::create([ 'id_user' => auth()->user()->id_user, 'aktivitas' => 'Admin mengirim notifikasi monitoring pemesanan', 'icon' => 'fa-paper-plane', 'tipe' => 'monitoring', 'ref_id' => $pemesanan->id_pemesanan ]); } return redirect() ->back() ->with( 'success', 'Monitoring berhasil diperbarui' ); } // ========================================================= // HALAMAN MONITORING PELANGGAN // ========================================================= public function pelanggan($id) { // 1. Ambil transaksi dulu (dari klik user) // $transaksi = Transaksi::with(['pemesanan','properti']) // ->where('id_transaksi', $id) // ->where('id_user', auth()->id()) // ->firstOrFail(); $pemesanan = Pemesanan::where('id_pemesanan', $id) ->where('id_user', auth()->id()) ->firstOrFail(); // 2. Ambil pemesanan dari transaksi $transaksi = $pemesanan->transaksi; // 3. Ambil aktivitas dari PEMESANAN (bukan transaksi) $aktivitas = LogAktivitas::where( 'ref_id', $pemesanan->id_pemesanan ) ->latest() ->get(); return view('detail-pemesanan', compact('pemesanan', 'aktivitas', 'transaksi')); } }