@extends('layouts.app') @section('title', ($admission->patient->full_name ?? '') . ' | Inpatient') @section('styles') @endsection @section('content') @php $isDischarged = $admission->status === 'discharged'; @endphp @if($isDischarged)

This patient has been discharged on {{ $admission->discharge_date ? $admission->discharge_date->format('d M Y H:i') : '' }}. Records are read-only.

@endif {{-- Patient Header --}}
IPD

{{ $admission->patient->full_name ?? '' }}

{{ $admission->patient->mrn ?? '' }} · {{ ucfirst($admission->patient->gender??'') }} · {{ $admission->patient->age ?? '' }} · {{ $admission->ward->name ?? '' }} · Bed {{ $admission->bed->bed_number ?? '' }}

@if($admission->patient->allergies && count($admission->patient->allergies))⚠ {{ implode(', ', $admission->patient->allergies) }}@endif Day {{ $admission->length_of_stay }} Admitted
{{-- Tabs --}}
{{-- OVERVIEW --}}

Admission

Admitted{{ $admission->admission_date->format('d M Y H:i') }}
Ward{{ $admission->ward->name ?? '-' }}
Bed{{ $admission->bed->bed_number ?? '-' }}
Days{{ $admission->length_of_stay }}
Clinician{{ $admission->clinician->name ?? '-' }}

Clinical

Admission Dx{{ $admission->diagnosis_on_admission ?? '-' }}
Reason{{ $admission->reason ?? '-' }}
Labs{{ $admission->visit?->labOrders?->count() ?? 0 }} orders
Prescriptions{{ $admission->visit?->prescriptions?->count() ?? 0 }} items

Billing

@if($admission->visit?->invoice)
TotalKES {{ number_format($admission->visit?->invoice?->total_amount) }}
PaidKES {{ number_format($admission->visit?->invoice?->amount_paid) }}
BalanceKES {{ number_format($admission->visit?->invoice?->balance) }}
@else

No invoice

@endif

Latest Note

@if($admission->nursingNotes->first())

{{ $admission->nursingNotes->first()->content }}

{{ $admission->nursingNotes->first()->nurse->name ?? '' }} · {{ $admission->nursingNotes->first()->created_at->format('d M H:i') }}

@else

No notes yet

@endif
{{-- ADMISSION NOTE --}}

Admission Date

{{ $admission->admission_date->format('l, d M Y H:i') }}

Ward / Bed

{{ $admission->ward->name ?? '' }} · Bed {{ $admission->bed->bed_number ?? '' }}

Admitting Clinician

{{ $admission->clinician->name ?? '-' }}

Reason for Admission

{{ $admission->reason ?? '-' }}

Diagnosis on Admission

{{ $admission->diagnosis_on_admission ?? '-' }}

@if($admission->visit?->triage)

Vitals on Admission

@foreach([['BP',($admission->visit->triage->blood_pressure_systolic??'-').'/'.($admission->visit->triage->blood_pressure_diastolic??'-')],['Temp',$admission->visit->triage->temperature??'-'],['Pulse',$admission->visit->triage->pulse??'-'],['SpO2',$admission->visit->triage->oxygen_saturation??'-']] as [$l,$val])

{{ $l }}

{{ $val }}

@endforeach
@endif
{{-- DAILY NOTES (SOAP) --}}
{{-- Add Note Form | Nurse + Clinician only --}} @if(auth()->user()->hasAnyRole('Nurse','Clinician','Super Admin','Hospital Admin'))

Add Progress Note

@csrf
{{-- Vital Signs Section --}}
Vital Signs (optional)
@endif {{-- /note-form guard --}} {{-- Notes Timeline by Date --}} @forelse($notesByDate as $date => $notes)

{{ \Carbon\Carbon::parse($date)->format('l, d M Y') }} | Day {{ (int) $admission->admission_date->copy()->startOfDay()->diffInDays(\Carbon\Carbon::parse($date)->startOfDay(), true) + 1 }}

@foreach($notes as $note)
{{ ucfirst(str_replace('_',' ',$note->note_type)) }} {{ $note->created_at->format('H:i') }} · {{ $note->nurse->name ?? 'Unknown' }}
@if($note->vitals && is_array($note->vitals) && count(array_filter($note->vitals)))
@foreach(['bp'=>'BP','pulse'=>'Pulse','temp'=>'Temp','spo2'=>'SpO2','rr'=>'RR','weight'=>'Wt','rbs'=>'RBS'] as $key => $label) @if(!empty($note->vitals[$key])) {{ $label }}: {{ $note->vitals[$key] }}@if($key==='temp')°C @elseif($key==='spo2')% @elseif($key==='pulse') bpm @elseif($key==='rr') /min @elseif($key==='weight') kg @elseif($key==='bp') mmHg @endif @endif @endforeach
@endif

{{ $note->content }}

@endforeach
@empty

No notes recorded yet. Add the first progress note above.

@endforelse
{{-- MEDICATION CHART --}}
{{-- Safety warning banner --}} @if(session('safety_warnings'))

Drug Safety Warnings

    @foreach(session('safety_warnings') as $warning)
  • ▸ {{ $warning }}
  • @endforeach

Re-submit the prescription with the acknowledgement checkbox checked to override.

@endif @if($admission->visit?->prescriptions?->count()) @foreach($admission->visit->prescriptions as $rx) @php $freqTimes = ['OD'=>['08:00'],'BD'=>['08:00','20:00'],'TDS'=>['08:00','14:00','20:00'],'QID'=>['06:00','12:00','18:00','00:00'],'STAT'=>['Now'],'Nocte'=>['22:00'],'PRN'=>['As needed']]; $times = $freqTimes[$rx->frequency] ?? ['08:00']; $hasSchedule = $rx->administrations->count() > 0; @endphp @endforeach
Date Drug Dose Freq Route Duration Qty Schedule Status Actions
{{ $rx->created_at->format('d M Y') }} {{ $rx->drug_name }} {{ $rx->dosage ?? '-' }} {{ $rx->frequency ?? '-' }} {{ $rx->route ?? 'oral' }} {{ $rx->duration ?? '-' }} {{ $rx->quantity }}
@if($hasSchedule) @php $scheduledTimes = $rx->administrations->pluck('scheduled_time')->unique()->sort(); @endphp @foreach($scheduledTimes as $t) {{ $t }} @endforeach @else @foreach($times as $t) {{ $t }} @endforeach @endif
@php $rxSC = ['pending'=>'badge-warning','dispensed'=>'badge-success','cancelled'=>'badge-danger']; @endphp {{ ucfirst($rx->status) }} @if($rx->status === 'dispensed' && !$hasSchedule)
@csrf
@elseif($hasSchedule) @php $doneCount = $rx->administrations->whereIn('status',['administered','partially_given'])->count(); $totalCount = $rx->administrations->count(); @endphp {{ $doneCount }}/{{ $totalCount }} given @elseif($rx->status === 'pending')
Awaiting pharmacy
@csrf @method('DELETE')
@endif
@endif @if(auth()->user()->hasAnyRole('Clinician','Super Admin','Hospital Admin'))
Add Medication
@csrf

@endif {{-- /prescribe guard --}}
{{-- MEDICATION ADMINISTRATION RECORD (MAR) --}}
{{-- Overdue Alert --}} @if(isset($overdueDoses) && $overdueDoses > 0)

{{ $overdueDoses }} Overdue Dose(s)

Some scheduled doses are past their administration time.

@endif {{-- Today's Administration Schedule --}}

Today's Medication Administration | {{ now()->format('l, d M Y') }}

@if(isset($todayMAR) && $todayMAR->count()) @foreach($todayMAR as $mar) @php $marSC = ['scheduled'=>'badge-warning','administered'=>'badge-success','missed'=>'badge-danger','not_given'=>'badge-gray','partially_given'=>'badge-info']; $isDue = $mar->is_due; $isOverdue = $mar->is_overdue; @endphp @endforeach
Time Drug Dose Route Dose # Status Administered Nurse Actions
{{ $mar->scheduled_time ? \Carbon\Carbon::createFromFormat('H:i:s', $mar->scheduled_time)->format('h:i A') : '-' }} @if($isOverdue)OVERDUE@elseif($isDue)DUE@endif {{ $mar->prescription->drug_name ?? '' }} {{ $mar->prescription->dosage ?? '-' }} {{ $mar->prescription->route ?? 'oral' }} {{ $mar->dose_number }} {{ ucfirst(str_replace('_',' ',$mar->status)) }} {{ $mar->administered_at ? $mar->administered_at->format('H:i') : '-' }} {{ $mar->nurse->name ?? '-' }} @if($mar->status === 'scheduled') @if(auth()->user()->hasAnyRole('Nurse','Clinician','Super Admin','Hospital Admin'))
@csrf @method('PUT')
@endif {{-- /MAR administer guard --}} @elseif($mar->comments) {{ \Illuminate\Support\Str::limit($mar->comments, 20) }} @endif
@else

No medication schedules for today. Generate schedules from the Medication Chart tab after pharmacy dispenses.

@endif
{{-- Full MAR History --}}

Medication Administration History

@php $allMAR = \App\Models\MedicationAdministration::with(['prescription','nurse']) ->where('admission_id', $admission->id) ->orderBy('scheduled_date','desc')->orderBy('scheduled_time') ->limit(100)->get()->groupBy(fn($m) => $m->scheduled_date->format('Y-m-d')); @endphp @forelse($allMAR as $date => $doses)
{{ \Carbon\Carbon::parse($date)->format('l, d M Y') }}{{ $date === today()->format('Y-m-d') ? ' | TODAY' : '' }}
@foreach($doses as $d) @php $dSC = ['scheduled'=>'badge-warning','administered'=>'badge-success','missed'=>'badge-danger','not_given'=>'badge-gray','partially_given'=>'badge-info']; @endphp @endforeach
TimeDrugDoseStatusGiven AtNurseComments
{{ $d->scheduled_time ? \Carbon\Carbon::createFromFormat('H:i:s',$d->scheduled_time)->format('h:i A') : '-' }} {{ $d->prescription->drug_name ?? '' }} {{ $d->prescription->dosage ?? '' }} {{ ucfirst(str_replace('_',' ',$d->status)) }} {{ $d->administered_at ? $d->administered_at->format('H:i') : '-' }} {{ $d->nurse->name ?? '-' }} {{ $d->comments ?? '-' }}
@empty

No administration records yet.

@endforelse
{{-- MAR Other Action Modal --}} {{-- ORDERS (Lab & Imaging) --}}

Lab Orders

@if($admission->visit?->labOrders?->count()) @foreach($admission->visit->labOrders as $lo) @endforeach
TestUrgencyResultStatus
{{ $lo->test_name }}{{ $lo->urgency }} @if($lo->result && is_array($lo->result->results)) @php $resData = $lo->result->results; @endphp @if(isset($resData['generic'])) {{ $resData['generic']['value'] ?? '-' }} {{ $resData['generic']['unit'] ?? '' }} @else @foreach($resData as $param) @if(is_array($param) && isset($param['name'])) {{ $param['short_code'] ?? $param['name'] }}: {{ $param['value'] ?? '-' }} {{ $param['unit'] ?? '' }}@if(!$loop->last), @endif @endif @endforeach @endif @elseif($lo->result) {{ $lo->result->results ?? '-' }} @else - @endif {{ ucfirst($lo->status) }}
@endif @if(auth()->user()->hasAnyRole('Clinician','Super Admin','Hospital Admin'))
@csrf

@endif {{-- /lab-order guard --}}

Imaging Orders

@if($admission->visit?->imagingRequests?->count()) @foreach($admission->visit->imagingRequests as $ir) @endforeach
TypeBody PartStatus
{{ $ir->imaging_type }}{{ $ir->body_part ?? '-' }}{{ ucfirst($ir->status) }}
@endif @if(auth()->user()->hasAnyRole('Clinician','Super Admin','Hospital Admin'))
@csrf

@endif {{-- /imaging-order guard --}}
{{-- BILLING --}}
@php $inv = $admission->visit?->invoice; @endphp @if($inv)

Total

KES {{ number_format($inv->total_amount) }}

Paid

KES {{ number_format($inv->amount_paid) }}

Balance

KES {{ number_format($inv->balance) }}

{{-- Items --}} @foreach($inv->items as $item) @php $isEditable = $item->source_type !== 'prescription' && auth()->user()->hasAnyRole('Receptionist','Clinician','Nurse','Triage Nurse','Dental User','Hospital Admin','Super Admin'); @endphp @endforeach {{-- Manual add | search for services --}} @if(auth()->user()->hasAnyRole('Receptionist','Clinician','Nurse','Triage Nurse','Dental User','Super Admin','Hospital Admin')) @endif
ItemDetailsQtyPriceTotal
{{ $item->description }} {{ $item->category }} @if($isEditable) @else {{ $item->quantity }} @endif @if($isEditable) @else {{ number_format($item->unit_price) }} @endif {{ number_format($item->total) }} @if(auth()->user()->hasAnyRole('Receptionist','Clinician','Nurse','Triage Nurse','Dental User','Hospital Admin','Super Admin'))
@csrf @method('DELETE')
@endif
@csrf
Grand TotalKES {{ number_format($inv->total_amount) }}
{{-- Payments --}}

Payments

@foreach($inv->payments as $pay) @endforeach @if(auth()->user()->hasAnyRole('Receptionist','Clinician','Nurse','Triage Nurse','Dental User','Super Admin','Hospital Admin')) @endif {{-- /payment guard --}}
MethodDetailsAmountReference
{{ str_replace('_',' ',$pay->payment_method) }} {{ $pay->description ?? '' }} KES {{ number_format($pay->amount) }} {{ $pay->reference_number ?? '' }} @if(auth()->user()->hasAnyRole('Super Admin','Hospital Admin','Receptionist','Clinician','Nurse','Triage Nurse'))
@csrf @method('DELETE')
@endif
@csrf
Total PaidKES {{ number_format($inv->amount_paid) }}
Balance DueKES {{ number_format($inv->balance) }}
@else

No invoice yet. Orders will auto-generate billing items.

@endif
{{-- DISCHARGE --}}
{{-- Transfer ward --}}

Transfer Ward / Bed

@csrf
{{-- Discharge Summary | Clinician only --}} @if(auth()->user()->hasAnyRole('Clinician','Super Admin','Hospital Admin'))

Discharge Summary

PDF
@csrf
{{-- ── AUTO-POPULATED: Patient Demographics ── --}}
Patient Demographics
Name{{ $admission->patient->full_name ?? '' }}
MRN{{ $admission->patient->mrn ?? '' }}
Gender / Age{{ ucfirst($admission->patient->gender ?? '') }} · {{ $admission->patient->age ?? '' }}
Phone{{ $admission->patient->phone ?? '-' }}
@if($admission->patient->id_number)
ID Number{{ $admission->patient->id_number }}
@endif @if($admission->patient->insuranceCompany)
Insurance{{ $admission->patient->insuranceCompany->name ?? '-' }}
@endif @if($admission->patient->next_of_kin_name)
Next of Kin{{ $admission->patient->next_of_kin_name }} ({{ $admission->patient->next_of_kin_phone ?? '' }})
@endif
{{-- ── AUTO-POPULATED: Admission Details ── --}}
Admission Details
Admission Date{{ $admission->admission_date->format('d M Y H:i') }}
Ward / Bed{{ $admission->ward->name ?? '' }} · Bed {{ $admission->bed->bed_number ?? '' }}
Length of Stay{{ $admission->length_of_stay }} days
Admitting Clinician{{ $admission->clinician->name ?? '-' }}
Reason for Admission{{ $admission->reason ?? '-' }}
Diagnosis on Admission{{ $admission->diagnosis_on_admission ?? '-' }}
{{-- ── AUTO-POPULATED: Diagnoses ── --}}
Diagnoses
Admission Diagnosis{{ $admission->diagnosis_on_admission ?? '-' }}
@if($admission->visit?->consultation?->diagnosis)
Consultation Diagnosis{{ $admission->visit->consultation->diagnosis }}
@endif
{{-- ── AUTO-POPULATED: Investigations with Results ── --}}
Investigations & Results
@if($admission->visit?->labOrders?->count() || $admission->visit?->imagingRequests?->count())
@if($admission->visit->labOrders->count()) @foreach($admission->visit->labOrders as $lo) @endforeach
Lab TestResultReferenceRemarksStatus
{{ $lo->test_name ?? ($lo->labTest->name ?? '-') }} @if($lo->result && is_array($lo->result->results)) @php $res = $lo->result->results; @endphp @if(isset($res['generic'])) {{ $res['generic']['value'] ?? '-' }} {{ $res['generic']['unit'] ?? '' }} @else @foreach($res as $param) @if(is_array($param) && isset($param['name'])) {{ $param['short_code'] ?? $param['name'] }}: {{ $param['value'] ?? '-' }} {{ $param['unit'] ?? '' }}@if(!$loop->last), @endif @endif @endforeach @endif @if($lo->result->is_critical) CRITICAL @elseif($lo->result->is_abnormal) ABN @endif @elseif($lo->result) {{ $lo->result->results ?? '-' }} @else - @endif {{ $lo->result->reference_range ?? '-' }} {{ $lo->result->remarks ?? '-' }} {{ ucfirst($lo->status) }}
@endif @if($admission->visit->imagingRequests->count()) @foreach($admission->visit->imagingRequests as $ir) @endforeach
ImagingBody PartFindingsImpressionStatus
{{ $ir->imaging_type }} {{ $ir->body_part ?? '-' }} {{ $ir->report ? \Illuminate\Support\Str::limit($ir->report->findings, 100) : '–' }} {{ $ir->report->impression ?? '-' }} {{ ucfirst($ir->status) }}
@endif
@else

No investigations ordered during this admission.

@endif
{{-- ── AUTO-POPULATED: Procedures ── --}}
Procedures
@php $procedureNotes = $admission->nursingNotes->where('note_type', 'procedure'); @endphp @if($procedureNotes->count())
@foreach($procedureNotes as $pn)
{{ $pn->created_at->format('d M Y H:i') }} · {{ $pn->nurse->name ?? '' }}

{{ $pn->content }}

@endforeach
@else

No procedures recorded.

@endif
{{-- ── AUTO-POPULATED: Inpatient Medications ── --}}
Inpatient Medications
@if($admission->visit?->prescriptions?->count())
@foreach($admission->visit->prescriptions as $rx) @endforeach
DrugDoseFrequencyRouteDurationStatus
{{ $rx->drug_name }} {{ $rx->dosage ?? '-' }} {{ $rx->frequency ?? '-' }} {{ $rx->route ?? 'oral' }} {{ $rx->duration ?? '-' }} {{ ucfirst($rx->status) }}
@else

No medications prescribed during admission.

@endif

{{-- ═══ CLINICIAN INPUT SECTION ═══ --}}
Clinician to Complete
{{-- Discharge Medications (from pharmacy) --}}
@if($admission->visit?->prescriptions?->count())
@foreach($admission->visit->prescriptions as $rx)
{{ $rx->drug_name }} {{ $rx->dosage ?? '' }} · {{ $rx->frequency ?? '' }} · {{ $rx->duration ?? '' }} {{ ucfirst($rx->status) }}
@endforeach
@if($admission->visit->prescriptions->where('status','!=','dispensed')->count())

⚠ Some medications are pending dispensing. Ensure pharmacy completes before finalizing discharge.

@endif @else

No discharge medications. Prescribe from the Medication Chart tab if needed.

@endif
@php $dischargeBalance = $admission->visit?->invoice?->balance ?? 0; @endphp @if($dischargeBalance > 0)

Outstanding Balance: KES {{ number_format($dischargeBalance) }}

Bill must be cleared before discharge. Go to Billing tab to record payment.

@else ✓ Bill cleared @endif
@else

Discharge is restricted to Clinicians.

Contact the attending clinician to complete the discharge summary.

@endif {{-- /discharge guard --}}
@endsection @section('scripts') @endsection