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); } }