middleware(['auth', 'role:kasir']); } public function dashboard() { $pasienHariIni = Registrasi::whereDate('tanggal_registrasi', today()) ->count(); $pendapatanHariIni = Transaksi::whereDate('tanggal_transaksi', today()) ->where('status_pembayaran', 'lunas') ->sum('total_tarif'); $registrasiTerbaru = Registrasi::with(['pasien', 'pegawai', 'ruang_pelayanan']) ->orderBy('tanggal_registrasi', 'desc') ->limit(5) ->get(); $transaksiTerbaru = Transaksi::with(['registrasi', 'pegawai']) ->orderBy('tanggal_transaksi', 'desc') ->limit(5) ->get(); $registrasiSelesai = Registrasi::where('status', 'selesai') ->where(function ($query) { $query->whereDoesntHave('transaksi') ->orWhereHas('transaksi', function ($q) { $q->where('status_pembayaran', '!=', 'lunas'); }); }) ->with(['pasien', 'ruang_pelayanan', 'transaksi']) ->orderBy('tanggal_registrasi', 'desc') ->get(); $registrasi = Registrasi::with(['pasien', 'ruang_pelayanan']) ->orderBy('created_at', 'desc') ->paginate(10); $belumLunas = Transaksi::where('status_pembayaran', 'belum lunas')->count(); return view('kasir.dashboard.kasir', compact( 'registrasiTerbaru', 'transaksiTerbaru', 'belumLunas', 'registrasiSelesai', 'registrasi', 'pasienHariIni', 'pendapatanHariIni' )); } public function createRegistrasi() { $pegawai = Pegawai::all(); $ruang_pelayanan = RuangPelayanan::all(); $asuransi = Asuransi::all(); $registrasi = Registrasi::all(); return view('kasir.registrasi.create', compact( 'pegawai', 'ruang_pelayanan', 'asuransi', 'registrasi' )); } public function storeRegistrasi(Request $request) { // Mengambil nomor antrian terakhir dan menambahkannya $lastNomorAntrian = Registrasi::max('nomor_antrian') ?? 0; $nomorAntrianBaru = $lastNomorAntrian + 1; // Validasi inputan $validated = $request->validate([ 'nik' => 'required|string|max:20|unique:pasiens,nik', 'nama_pasien' => 'required|string|max:255', 'jenis_kelamin' => 'required|in:Laki-Laki,Perempuan', 'tanggal_lahir' => 'required|date', 'nomor_telepon' => 'nullable|string|max:20', 'pegawai_id' => 'required|exists:pegawais,id', 'ruang_pelayanan_id' => 'required|exists:ruang_pelayanans,id', 'asuransi_id' => 'nullable|exists:asuransis,id', 'nomor_kartu_asuransi' => 'nullable|string|max:50', 'tanggal_registrasi' => 'required|date', 'keluhan' => 'nullable|string', 'nomor_antrian' => 'nullable', ]); DB::beginTransaction(); try { $pasien = Pasien::where('nik', $validated['nik'])->first(); if (!$pasien) { $pasien = Pasien::create([ 'nik' => $validated['nik'], 'nama_pasien' => $validated['nama_pasien'], 'jenis_kelamin' => $validated['jenis_kelamin'], 'tanggal_lahir' => $validated['tanggal_lahir'], 'nomor_telepon' => $validated['nomor_telepon'] ?? null, ]); } Registrasi::create([ 'pasien_id' => $pasien->id, 'pegawai_id' => $validated['pegawai_id'], 'ruang_pelayanan_id' => $validated['ruang_pelayanan_id'], 'asuransi_id' => $validated['asuransi_id'] ?? null, 'nomor_kartu_asuransi' => $validated['nomor_kartu_asuransi'] ?? null, 'tanggal_registrasi' => $validated['tanggal_registrasi'], 'keluhan' => $validated['keluhan'] ?? null, 'nomor_antrian' => $nomorAntrianBaru, 'status' => 'menunggu', ]); Log::debug('Data Registrasi:', $validated); DB::commit(); return redirect()->route('registrasi.create')->with('success', 'Registrasi berhasil.'); } catch (\Exception $e) { DB::rollBack(); return redirect()->route('registrasi.create')->with('error', 'Registrasi gagal: ' . $e->getMessage()); } } public function editRegistrasi(Registrasi $registrasi) { return view('registrasi.edit', compact('registrasi')); } public function updateRegistrasi(Request $request, Registrasi $registrasi) { $lastNomorAntrian = Registrasi::max('nomor_antrian'); $nomorAntrianBaru = $lastNomorAntrian + 1; $validated = $request->validate([ 'pegawai_id' => 'sometimes|exists:pegawais,id', 'ruang_pelayanan_id' => 'sometimes|exists:ruang_pelayanans,id', 'asuransi_id' => 'nullable|exists:asuransis,id', 'nomor_kartu_asuransi' => 'required|string|max:50', 'keluhan' => 'nullable|string', 'nomor_antrian' => $nomorAntrianBaru, ]); $registrasi->update($validated); return $registrasi; } public function editPasien(Pasien $pasien) { return view('pasien.edit', compact('pasien')); } public function updatePasien(Request $request, Pasien $pasien) { $validated = $request->validate([ 'nama_pasien' => 'sometimes|string|max:255', 'jenis_kelamin' => 'sometimes|in:Laki-Laki,Perempuan', 'tanggal_lahir' => 'sometimes|date', 'nomor_telepon' => 'nullable|string|max:20', ]); $pasien->update($validated); return $pasien; } // ==================== PEMBAYARAN & BILLING ==================== public function showBilling(Registrasi $registrasi) { $registrasi = Registrasi::with(['pasien', 'pegawai', 'ruang_pelayanan', 'asuransi'])->findOrFail($registrasi->id); return view('billing.show', compact('registrasi')); } public function createTransaksi(Registrasi $registrasi) { if (!$registrasi->id) { return redirect()->route('dashboard.kasir')->with('error', 'Registrasi tidak ditemukan.'); } $tindakans = Tindakan::all(); return view('kasir.transaksi.create', compact('registrasi', 'tindakans')) ->with('error', 'Transaksi hanya bisa dilakukan jika registrasi sudah selesai.'); } public function storeTransaksi(Request $request, Registrasi $registrasi) { DB::beginTransaction(); try { $validated = $request->validate([ 'registrasi_id' => 'required|exists:registrasis,id', 'tindakan_id' => 'required|exists:tindakans,id', 'pegawai_id' => 'required|exists:users,id', 'jumlah_tindakan' => 'required|integer|min:1', 'total_tarif' => 'required|numeric|min:0', 'tanggal_transaksi' => 'required|date', 'metode_pembayaran' => 'required|string', 'status_pembayaran' => 'required|string', 'tanggal_pembayaran' => 'nullable|date', ]); Transaksi::create($validated); DB::commit(); return redirect()->route('dashboard.kasir', ['registrasi_id' => $registrasi->id])->with('success', 'Transaksi berhasil.'); } catch (\Exception $e) { DB::rollBack(); return redirect()->route('dashboard.kasir', ['registrasi_id' => $registrasi->id])->with('error', 'Transaksi gagal: ' . $e->getMessage()); } } public function storeTransaksiDetail(Request $request) { $validated = $request->validate([ 'transaksi_id' => 'required|exists:transaksis,id', 'tindakan_id' => 'required|exists:tindakans,id', 'jumlah_tindakan' => 'required|integer', 'total_tarif' => 'required|numeric', ]); return TransaksiDetail::create($validated); } public function showTransaksi($id) { $transaksi = Transaksi::with(['registrasi.pasien', 'details.tindakan']) ->where('registrasi_id', $id) ->first(); $formMetodePembayaran = Transaksi::distinct()->pluck('metode_pembayaran'); return view('kasir.transaksi.show', compact('transaksi', 'formMetodePembayaran')); } public function prosesPembayaran(Request $request, $id) { $validated = $request->validate([ 'metode_pembayaran' => 'required|in:cash,transfer,debit,asuransi,qris', 'status_pembayaran' => 'required|in:belum lunas,lunas', 'tanggal_pembayaran' => 'required|date', ]); $transaksi = Transaksi::findOrFail($id); $transaksi->update([ 'metode_pembayaran' => $validated['metode_pembayaran'], 'status_pembayaran' => $validated['status_pembayaran'], 'tanggal_pembayaran' => $validated['tanggal_pembayaran'], ]); return redirect()->route('dashboard.kasir') ->with('success', 'Pembayaran berhasil diproses'); } }