hospital_report/app/Http/Controllers/KasirController.php
2025-04-27 23:36:33 +07:00

280 lines
9.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Asuransi;
use App\Models\Pasien;
use App\Models\Pegawai;
use App\Models\Registrasi;
use App\Models\RuangPelayanan;
use App\Models\Tindakan;
use App\Models\Transaksi;
use App\Models\TransaksiDetail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class KasirController extends Controller
{
public function __construct()
{
$this->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');
}
}