@section('page-title', 'Premium Collection') @php $statusColors = [ 'active' => ['bg' => 'bg-emerald-50', 'text' => 'text-emerald-700', 'ring' => 'ring-emerald-200/60'], 'due' => ['bg' => 'bg-amber-50', 'text' => 'text-amber-700', 'ring' => 'ring-amber-200/60'], 'suspended' => ['bg' => 'bg-red-50', 'text' => 'text-red-700', 'ring' => 'ring-red-200/60'], 'pending_reactivation' => ['bg' => 'bg-orange-50', 'text' => 'text-orange-700', 'ring' => 'ring-orange-200/60'], 'cancelled' => ['bg' => 'bg-slate-100', 'text' => 'text-slate-500', 'ring' => 'ring-slate-200/60'], ]; $methodLabels = [ 'eft' => 'EFT', 'rtgs' => 'RTGS', 'ecocash' => 'EcoCash', 'cheque' => 'Cheque', 'cash' => 'Cash', 'card' => 'Card', 'bank_transfer' => 'Bank Transfer', ]; @endphp {{-- Page header --}}

Premium Collection

Track, record and monitor all member premium payments

Finance Overview
{{-- Stats row --}}

Collected This Month

${{ number_format($totalCollectedMonth / 100, 2) }}

{{ date('F Y') }}

Collected {{ $currentYear }}

${{ number_format($totalCollectedYear / 100, 2) }}

Year to date

Pending

${{ number_format($pendingAmount / 100, 2) }}

Awaiting confirmation

Overdue Records

{{ $overdueCount }}

Marked overdue

Lapsed This Month

{{ count($lapsedMembers) }}

of {{ $activeCount }} active

{{-- Record Payment Form --}}

Record Premium Payment

@csrf
@error('member_id')

{{ $message }}

@enderror
@error('corporate_client_id')

{{ $message }}

@enderror
@error('amount')

{{ $message }}

@enderror
@error('payment_reference')

{{ $message }}

@enderror
{{-- Recent Payments --}}

Recent Payments

Last 30 transactions
@forelse($recentPayments as $payment) @empty @endforelse
Member / Corporate Period Amount Method Reference Status Date
@if($payment->member) {{ $payment->member->full_name }}

{{ $payment->member->member_number }}

@elseif($payment->corporateClient) {{ $payment->corporateClient->name }}

Corporate

@else N/A @endif
{{ $payment->period_label }} ${{ number_format($payment->amount_cents / 100, 2) }} {{ $methodLabels[$payment->payment_method] ?? ucfirst($payment->payment_method ?? '—') }} {{ $payment->payment_reference ?? '—' }} @php $sc = match($payment->status) { 'paid' => 'badge-green', 'pending' => 'badge-yellow', 'overdue' => 'badge-red', default => 'badge-gray' }; @endphp {{ ucfirst($payment->status) }} {{ $payment->paid_at?->format('d M Y') ?? $payment->created_at->format('d M Y') }}
No premium payments recorded yet.
{{-- Member Premium Overview — grouped by package --}}
{{-- Filter bar --}}

Premium Overview by Package

{{ $allPrincipalMembers->count() }} principal member{{ $allPrincipalMembers->count() !== 1 ? 's' : '' }} across {{ $membersByPolicy->count() }} package{{ $membersByPolicy->count() !== 1 ? 's' : '' }}

@if($search || $filterStatus || $filterPolicy) Clear @endif
@forelse($membersByPolicy as $policyId => $policyMembers) @php $pkg = $policies->get($policyId); $pkgCurrency = $pkg?->currency ?? 'USD'; $pkgPremium = $pkg?->monthly_premium_cents ?? 0; $memberCount = $policyMembers->count(); $expectedMonth = $pkgPremium * $memberCount; $collectedMonth = $policyMembers->sum(function($m) use ($currentMonth, $currentYear) { return $m->premiumPayments ->where('status', 'paid') ->where('period_month', $currentMonth) ->where('period_year', $currentYear) ->sum('amount_cents'); }); $totalOutstanding = $policyMembers->sum(function($m) { $missed = count($m->getMissedPaymentMonths()); return $missed * $m->getPremiumAmountCents(); }); $overdueInGroup = $policyMembers->filter(function($m) { return $m->getNextDueDate()->lt(now()->startOfMonth()); })->count(); $collectionRate = $expectedMonth > 0 ? round(($collectedMonth / $expectedMonth) * 100) : 0; $groupId = 'pkg-' . $policyId; @endphp
{{-- Package header --}} {{-- Member rows --}}
@foreach($policyMembers as $m) @php $lastPmt = $m->getLastPayment(); $nextDue = $m->getNextDueDate(); $missed = count($m->getMissedPaymentMonths()); $premCents = $m->getPremiumAmountCents(); $outstanding = $missed * $premCents; $sc = $statusColors[$m->status] ?? $statusColors['active']; $isOverdue = $nextDue->lt(now()->startOfMonth()); @endphp @endforeach
Member Monthly Premium Last Payment Last Paid Date Next Due Outstanding Status
{{ strtoupper(substr($m->first_name, 0, 1)) }}
{{ $m->full_name }}

{{ $m->member_number }} @if($m->corporateClient) • {{ $m->corporateClient->name }} @endif

{{ $pkgCurrency }} {{ $premCents > 0 ? number_format($premCents / 100, 2) : '—' }} @if($lastPmt) {{ $pkgCurrency }} {{ number_format($lastPmt->amount_cents / 100, 2) }}

{{ $lastPmt->period_label }}

@else No payments @endif
{{ $lastPmt?->paid_at?->format('d M Y') ?? '—' }} {{ $nextDue->format('M Y') }} @if($isOverdue)

Overdue

@endif
@if($outstanding > 0) {{ $pkgCurrency }} {{ number_format($outstanding / 100, 2) }}

{{ $missed }} month{{ $missed > 1 ? 's' : '' }}

@else Up to date @endif
{{ $m->status_label }} View →
@empty
No members found matching your filters.
@endforelse
{{-- Lapsed This Month --}} @if(count($lapsedMembers) > 0)

Lapsed This Month ({{ count($lapsedMembers) }} principal members without {{ date('F Y') }} payment)

@foreach($lapsedMembers as $lm) @endforeach
Member # Name Policy Phone Join Date Months Active
{{ $lm->member_number }} {{ $lm->full_name }} {{ $lm->policy->name ?? '—' }} {{ $lm->phone ?? '—' }} {{ $lm->join_date?->format('d M Y') ?? '—' }} {{ $lm->monthsActive() }} Record →
@endif