@extends('layouts.app') @section('title', 'Follow-up Worklist') @section('content')

Follow-up Worklist

{{ now()->format('l, d M Y') }}

← Dashboard
{{-- ── Compact stat strip ──────────────────────────────────────────── --}}

Due Today

{{ $stats['due_today'] }}

Done Today

{{ $stats['completed_today'] }}

Repeat Tomorrow

{{ $stats['repeat_tomorrow'] }}

Complaints (7d)

{{ $stats['complaints_recent'] }}

{{-- ── Tabs ─────────────────────────────────────────────────────────── --}} @php $tabs = [ 'due_today' => ['label' => 'Due Today', 'count' => $stats['due_today']], 'overdue' => ['label' => 'Overdue', 'count' => null], 'repeat' => ['label' => 'Repeat Tomorrow', 'count' => $stats['repeat_tomorrow']], 'completed' => ['label' => 'Completed Today', 'count' => $stats['completed_today']], ]; @endphp
{{-- ── Search ──────────────────────────────────────────────────────── --}}
@if(request('search')) Clear @endif
{{-- Flash messages --}} @if(session('success'))
{{ session('success') }}
@endif @if(session('error'))
{{ session('error') }}
@endif {{-- ── Worklist ────────────────────────────────────────────────────── --}}
@forelse($followUps as $f) {{-- Patient --}} {{-- Trigger badge + reason --}} {{-- Visit context (snapshot fields) --}} {{-- Due date --}} {{-- Attempts --}} {{-- Action --}} @empty @endforelse
Patient Trigger Visit Context Due Attempts Action

{{ $f->patient->full_name ?? '—' }}

{{ $f->patient->mrn ?? '' }} {{ $f->patient->phone ?? 'No phone' }}
{{ $f->triggerLabel() }}

{{ $f->reason }}

@if($f->department_snapshot)

{{ $f->department_snapshot }}

@endif @if($f->clinician_snapshot)

{{ $f->clinician_snapshot }}

@endif @if($f->diagnosis_snapshot)

{{ \Illuminate\Support\Str::limit($f->diagnosis_snapshot, 60) }}

@endif
@php $effectiveDue = $f->next_attempt_due ?? $f->due_date; $isOverdue = $effectiveDue && $effectiveDue->isPast() && $f->status !== 'closed'; @endphp

{{ $effectiveDue?->format('d M') ?? '—' }}

@if($isOverdue)

{{ $effectiveDue->diffForHumans() }}

@endif
@for($i = 1; $i <= 3; $i++) @php $attempt = $f->attempts->firstWhere('attempt_number', $i); $dotClass = !$attempt ? 'bg-gray-200' : ($attempt->wasPickedUp() ? 'bg-green-500' : 'bg-amber-400'); @endphp @endfor

{{ $f->attempt_count }}/{{ \App\Models\FollowUp::MAX_ATTEMPTS }}

@if($f->status === 'closed') @if($f->outcome === 'doing_well') Satisfied @elseif($f->outcome === 'still_unwell') Return visit @elseif($f->outcome === 'complaint') Complaint @elseif($f->outcome === 'unreachable') Unreachable @elseif($f->outcome === 'wrong_number') Wrong number @elseif($f->outcome === 'do_not_call') Do not call @endif @if($f->review_eligible && !$f->review_sent)
@csrf
@elseif($f->review_sent) Review sent @endif @else @endif

@switch($tab) @case('overdue') No overdue calls. Well done. @break @case('repeat') No repeat calls scheduled for tomorrow. @break @case('completed') No follow-ups completed today yet. @break @default No calls due today. The list is clear. @endswitch

@if($followUps->hasPages())
{{ $followUps->links() }}
@endif
{{-- ── Call outcome modal ──────────────────────────────────────────── --}} @endsection