instalasi-sim-rs/app/Http/Controllers/RegistrationController.php
vchandra22 c5c8e44752
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
fix: bug fix on datepicker simply get year for dob
2025-04-27 21:56:28 +07:00

270 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Employee;
use App\Models\Insurance;
use App\Models\Patient;
use App\Models\Registration;
use App\Models\ServiceRoom;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Inertia\Inertia;
class RegistrationController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$registrations = Registration::with([
'patient:id,name',
'employee:id,user_id',
'employee.user:id,name',
'serviceRoom:id,name',
'insurance:id,name',
'creator:id,name'
])
->orderBy('registration_datetime', 'desc')
->select([
'id',
'registration_number',
'patient_id',
'employee_id',
'service_room_id',
'insurance_id',
'created_by',
'registration_type',
'patient_type',
'registration_datetime',
'discharge_datetime',
'status',
'payment_status',
'is_active',
'created_at'
])
->paginate(10)
->through(function ($registration) {
return [
'id' => $registration->id,
'registration_number' => $registration->registration_number,
'patient_name' => $registration->patient->name,
'employee_name' => $registration->employee->user->name,
'service_room_name' => $registration->serviceRoom->name,
'insurance_name' => $registration->insurance?->name,
'registration_type' => $registration->registration_type,
'patient_type' => $registration->patient_type,
'registration_datetime' => $registration->registration_datetime->format('Y-m-d H:i'),
'discharge_datetime' => $registration->discharge_datetime?->format('Y-m-d H:i'),
'status' => $registration->status,
'payment_status' => $registration->payment_status,
'is_active' => (bool) $registration->is_active,
'created_at' => $registration->created_at->format('Y-m-d H:i:s'),
];
});
return Inertia::render('registrations/index', [
'registrations' => $registrations,
'status' => session('status'),
]);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$patients = Patient::select(['id', 'name'])
->whereNotExists(function($query) {
$query->select(DB::raw(1))
->from('t_registration')
->whereRaw('t_registration.patient_id = m_patient.id');
})
->get();
$employees = Employee::with('user:id,name')->get()->map(function ($employee) {
return [
'id' => $employee->id,
'name' => $employee->user->name
];
});
$serviceRooms = ServiceRoom::select(['id', 'name'])->get();
$insurances = Insurance::select(['id', 'name'])->get();
return Inertia::render('registrations/form', [
'mode' => 'create',
'patients' => $patients,
'employees' => $employees,
'serviceRooms' => $serviceRooms,
'insurances' => $insurances,
'registrationTypes' => ['Rawat Jalan', 'Rawat Inap', 'UGD'],
'patientTypes' => ['Umum', 'BPJS', 'Asuransi', 'Perusahaan', 'Gratis'],
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$validated = $request->validate([
'patient_id' => 'required|exists:m_patient,id',
'employee_id' => 'required|exists:m_employee,id',
'service_room_id' => 'required|exists:m_service_room,id',
'insurance_id' => 'nullable|exists:m_insurance,id',
'registration_type' => 'required|in:Rawat Jalan,Rawat Inap,UGD',
'patient_type' => 'required|in:Umum,BPJS,Asuransi,Perusahaan,Gratis',
'registration_datetime' => 'required|date',
'estimated_discharge' => 'nullable|date|after:registration_datetime',
'complaint' => 'required|string|max:500',
'is_referral' => 'boolean',
'referral_from' => 'nullable|required_if:is_referral,true|string|max:100',
'need_icu' => 'boolean',
]);
DB::transaction(function () use ($validated) {
$registrationNumber = $this->generateRegistrationNumber($validated['registration_type']);
Registration::create([
'registration_number' => $registrationNumber,
'patient_id' => $validated['patient_id'],
'employee_id' => $validated['employee_id'],
'service_room_id' => $validated['service_room_id'],
'insurance_id' => $validated['insurance_id'] ?? null,
'created_by' => auth()->id(),
'registration_type' => $validated['registration_type'],
'patient_type' => $validated['patient_type'],
'registration_datetime' => $validated['registration_datetime'],
'estimated_discharge' => $validated['estimated_discharge'] ?? null,
'complaint' => $validated['complaint'],
'is_referral' => $validated['is_referral'] ?? false,
'referral_from' => $validated['referral_from'] ?? null,
'need_icu' => $validated['need_icu'] ?? false,
]);
});
return redirect()->route('registrations.index')
->with('status', 'Pendaftaran berhasil dibuat');
}
/**
* Display the specified resource.
*/
public function show(Registration $registration)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Registration $registration)
{
$patients = Patient::select(['id', 'name'])->get();
$employees = Employee::with('user:id,name')->get()->map(function ($employee) {
return [
'id' => $employee->id,
'name' => $employee->user->name
];
});
$serviceRooms = ServiceRoom::select(['id', 'name'])->get();
$insurances = Insurance::select(['id', 'name'])->get();
return Inertia::render('registrations/form', [
'mode' => 'edit',
'registration' => [
'id' => $registration->id,
'patient_id' => $registration->patient_id,
'employee_id' => $registration->employee_id,
'service_room_id' => $registration->service_room_id,
'insurance_id' => $registration->insurance_id,
'registration_type' => $registration->registration_type,
'patient_type' => $registration->patient_type,
'registration_datetime' => $registration->registration_datetime->format('Y-m-d\TH:i'),
'estimated_discharge' => $registration->estimated_discharge?->format('Y-m-d\TH:i'),
'complaint' => $registration->complaint,
'medical_notes' => $registration->medical_notes,
'diagnoses' => $registration->diagnoses,
'prescriptions' => $registration->prescriptions,
'status' => $registration->status,
'payment_status' => $registration->payment_status,
'is_referral' => (bool) $registration->is_referral,
'referral_from' => $registration->referral_from,
'need_icu' => (bool) $registration->need_icu,
'is_active' => (bool) $registration->is_active,
],
'patients' => $patients,
'employees' => $employees,
'serviceRooms' => $serviceRooms,
'insurances' => $insurances,
'registrationTypes' => ['Rawat Jalan', 'Rawat Inap', 'UGD'],
'patientTypes' => ['Umum', 'BPJS', 'Asuransi', 'Perusahaan', 'Gratis'],
'statusOptions' => ['registered', 'in_progress', 'completed', 'cancelled'],
'paymentStatusOptions' => ['unpaid', 'partial', 'paid', 'insurance_cover'],
]);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, Registration $registration)
{
$validated = $request->validate([
'patient_id' => 'required|exists:m_patient,id',
'employee_id' => 'required|exists:m_employee,id',
'service_room_id' => 'required|exists:m_service_room,id',
'insurance_id' => 'nullable|exists:m_insurance,id',
'registration_type' => 'required|in:Rawat Jalan,Rawat Inap,UGD',
'patient_type' => 'required|in:Umum,BPJS,Asuransi,Perusahaan,Gratis',
'registration_datetime' => 'required|date',
'estimated_discharge' => 'nullable|date|after:registration_datetime',
'complaint' => 'required|string|max:500',
'medical_notes' => 'nullable|string',
'diagnoses' => 'nullable|array',
'prescriptions' => 'nullable|array',
'status' => 'required|in:registered,in_progress,completed,cancelled',
'payment_status' => 'required|in:unpaid,partial,paid,insurance_cover',
'is_referral' => 'boolean',
'referral_from' => 'nullable|required_if:is_referral,true|string|max:100',
'need_icu' => 'boolean',
'is_active' => 'boolean',
]);
$registration->update($validated);
return redirect()->route('registrations.index')
->with('status', 'Data pendaftaran berhasil diperbarui');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Registration $registration)
{
$registration->delete();
return redirect()->route('registrations.index')
->with('status', 'Data pendaftaran berhasil dihapus');
}
private function generateRegistrationNumber(string $type): string
{
$prefix = match($type) {
'Rawat Inap' => 'RI',
'UGD' => 'UGD',
default => 'RJ'
};
$datePart = now()->format('Ymd');
$lastNumber = Registration::where('registration_number', 'like', "{$prefix}-{$datePart}-%")
->orderBy('registration_number', 'desc')
->first();
$sequence = $lastNumber
? (int) substr($lastNumber->registration_number, -3) + 1
: 1;
return sprintf('%s-%s-%03d', $prefix, $datePart, $sequence);
}
}