280 lines
9.7 KiB
PHP
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');
|
|
}
|
|
}
|