@extends('layouts.app') @section('title', $customer->display_name) @section('content')
{{ $customer->customer_number }} · {{ $customer->status }} · {{ title_case_words($customer->segment) }} @if ($customer->kyc_status === 'verified') · KYC verified @else · KYC {{ $customer->kyc_status }} @endif
| Service | Plan | RADIUS user | Speed | Price | Status | Next bill | |
|---|---|---|---|---|---|---|---|
|
{{ $service->service_number }}
{{ $service->installation_address }}
|
{{ $service->plan?->name }} | {{ $service->username }} | {{ $service->download_kbps ? round($service->download_kbps/1024).' / '.round($service->upload_kbps/1024).' Mbps' : ($service->plan?->speed_label ?? '—') }} | {{ money($service->effective_price, $customer->currency) }} | {{ $service->status }} | {{ $service->next_billing_date?->format('d M Y') ?: '—' }} | Open |
| @include('components.empty-state', ['icon' => '⇄', 'title' => 'No services yet', 'message' => 'Provision a subscription to start billing this customer.', 'action' => '+ Provision service']) | |||||||
| Invoice | Issued | Due | Total | Paid | Balance | Status | |
|---|---|---|---|---|---|---|---|
| {{ $invoice->invoice_number }} | {{ $invoice->issue_date->format('d M Y') }} | {{ $invoice->due_date->format('d M Y') }} | {{ money($invoice->total, $invoice->currency) }} | {{ money($invoice->amount_paid, $invoice->currency) }} | {{ money($invoice->balance, $invoice->currency) }} | {{ $invoice->status }} | View |
| @include('components.empty-state', ['icon' => '📄', 'title' => 'No invoices yet']) | |||||||
| Reference | Date | Method | Amount | Status | Collected by |
|---|---|---|---|---|---|
| {{ $payment->reference }} | {{ $payment->paid_at?->format('d M Y H:i') ?: '—' }} | {{ title_case_words($payment->method) }} | {{ money($payment->amount, $payment->currency) }} | {{ $payment->status }} | {{ $payment->collector?->name ?: 'Gateway' }} |
| @include('components.empty-state', ['icon' => '💳', 'title' => 'No payments recorded']) | |||||
| Ticket | Subject | Priority | Status | Owner | Opened |
|---|---|---|---|---|---|
| {{ $ticket->ticket_number }} | {{ $ticket->subject }} | {{ $ticket->priority }} | {{ title_case_words($ticket->status) }} | {{ $ticket->assignee?->name ?: 'Unassigned' }} | |
| @include('components.empty-state', ['icon' => '✉', 'title' => 'No tickets raised']) | |||||
| Date | Type | Description | Amount | Balance |
|---|---|---|---|---|
| {{ $credit->created_at->format('d M Y') }} | {{ $credit->type }} | {{ $credit->description }} | {{ money($credit->amount, $customer->currency) }} | {{ money($credit->balance, $customer->currency) }} |
| Contract | Title | Term | Monthly | Status |
|---|---|---|---|---|
| {{ $contract->contract_number }} | {{ $contract->title }} | {{ $contract->starts_on->format('M Y') }} – {{ $contract->ends_on->format('M Y') }} ({{ $contract->term_months }} mo) | {{ money($contract->monthly_value, $customer->currency) }} | {{ $contract->status }} |
{{ $customer->notes }}
No named contacts yet — who should be called about a bill, and who about an outage?
| Name | Role | Contact | |
|---|---|---|---|
|
{{ $contact->name }}
@if ($contact->is_primary)primary@endif
@if ($contact->position) {{ $contact->position }} @endif
|
{{ title_case_words($contact->type) }} |
{{ $contact->phone }}
@if ($contact->email) {{ $contact->email }} @endif
|
No identity or contract documents on file.
| Title | Type | Expires | Status | |
|---|---|---|---|---|
| {{ $doc->title }}
{{ $doc->size_bytes
? number_format($doc->size_bytes / 1024, 1).' KB' : 'reference only' }} |
{{ title_case_words($doc->type) }} | {{ $doc->expires_on?->format('d M Y') ?: '—' }} @if ($doc->expires_on && $doc->expires_on->lt(now()) && $doc->status === 'valid') lapsed @endif | {{ title_case_words($doc->status) }} | Get |
Records a document held elsewhere. Use the upload endpoint for a file stored on this server.
Only possible when no services remain attached. This action cannot be undone.