@extends('layouts.finance') @section('title', 'Dashboard') @section('subtitle', 'Consolidated view across US, Pakistan & Australia') @section('content') @php $settings = $data['settings']; $dateFilter = $data['date_filter'] ?? ['active' => false, 'from' => null, 'to' => null, 'label' => null]; $filterActive = (bool) ($dateFilter['active'] ?? false); $periodLabel = $filterActive ? 'Filtered' : 'Mo.'; $todayLabel = $filterActive ? 'Filtered' : 'Today'; $accounts = $data['bank_accounts']; $walletAccounts = $accounts->filter(fn($account) => trim((string) ($account->transaction_category ?? '')) === 'Wallets'); $usAccounts = $accounts ->where('currency', 'USD') ->reject(fn($account) => trim((string) ($account->transaction_category ?? '')) === 'Wallets'); $pkAccounts = $accounts->where('currency', 'PKR'); $auAccounts = $accounts->where('currency', 'AUD'); $cards = $data['credit_cards']; $inventoryProducts = $data['inventory_products'] ?? collect(); $inventoryUnits = $inventoryProducts->sum(fn($p) => $p->stock); $kpis = $data['kpis']; $kuickpayToday = $data['kuickpay_today'] ?? ['total' => 0, 'count' => 0, 'fee' => 0, 'payout_date' => null, 'received' => false]; $kuickpayPendingYesterday = $data['kuickpay_pending_yesterday'] ?? ['date' => null, 'remaining' => 0, 'net' => 0, 'fee' => 0, 'gross' => 0, 'status' => null]; $kuickpayBacklog = $data['kuickpay_pending_backlog'] ?? ['total' => 0, 'count' => 0]; $verification = $data['verification'] ?? [ 'currency' => 'PKR', 'business_total' => 0, 'business_total_before_liabilities' => 0, 'inventory_amount' => 0, 'lent_amount' => 0, 'transit_amount' => 0, 'credit_card_debt' => 0, 'loan_debt' => 0, 'liabilities_total' => 0, 'bank_balance' => 0, 'kuickpay_today_amount' => 0, 'kuickpay_today_fee' => 0, 'kuickpay_today_net' => 0, 'store_credit_amount' => 0, 'store_credit_source' => null, 'kuickpay_pending_balance' => 0, 'kuickpay_pending_gross' => 0, ]; $displayCurrency = 'PKR'; $displayMoney = fn($amount) => $metrics->moneyIn($amount, 'USD', $displayCurrency); $agentPointCards = app(\App\Support\AgentPointsReportService::class)->dashboardCards(); $kuickpayPendingTotal = (float) ($verification['kuickpay_pending_balance'] ?? (($kuickpayPendingYesterday['remaining'] ?? 0) + ($kuickpayBacklog['total'] ?? 0))); $kuickpayPendingGross = (float) ($verification['kuickpay_pending_gross'] ?? 0); // Before-fee (gross) equivalent of yesterday's unsettled remaining, proportional. $kuickpayYesterdayGross = (($kuickpayPendingYesterday['net'] ?? 0) > 0) ? (float) ($kuickpayPendingYesterday['gross'] ?? 0) * (($kuickpayPendingYesterday['remaining'] ?? 0) / $kuickpayPendingYesterday['net']) : 0.0; $kuickpayPendingDayCount = (int) ($kuickpayBacklog['count'] ?? 0) + (((float) ($kuickpayPendingYesterday['remaining'] ?? 0)) > 0 ? 1 : 0); // PayFast settlement mirror (same shape as KuickPay). $payfastToday = $data['payfast_today'] ?? ['total' => 0, 'count' => 0, 'fee' => 0, 'payout_date' => null, 'received' => false]; $payfastPendingYesterday = $data['payfast_pending_yesterday'] ?? ['date' => null, 'remaining' => 0, 'net' => 0, 'fee' => 0, 'gross' => 0, 'status' => null]; $payfastBacklog = $data['payfast_pending_backlog'] ?? ['total' => 0, 'count' => 0]; $payfastTodayNet = max(0.0, (float) ($payfastToday['total'] ?? 0) - (float) ($payfastToday['fee'] ?? 0)); $payfastPendingTotal = (float) ($verification['payfast_pending_balance'] ?? (($payfastPendingYesterday['remaining'] ?? 0) + ($payfastBacklog['total'] ?? 0))); $payfastPendingGross = (float) ($verification['payfast_pending_gross'] ?? 0); $payfastPendingDayCount = (int) ($payfastBacklog['count'] ?? 0) + (((float) ($payfastPendingYesterday['remaining'] ?? 0)) > 0 ? 1 : 0); $kuickpayProviderRows = collect($verification['kuickpay_provider_verification'] ?? [])->keyBy('key'); $kuickpayProviderCards = collect($metrics->kuickpayProviders())->map(function ($provider, $key) use ($metrics, $kuickpayProviderRows) { $row = $kuickpayProviderRows->get($key, []); $today = [ 'total' => (float) ($row['today_gross'] ?? 0), 'fee' => (float) ($row['today_fee'] ?? 0), 'count' => (int) ($row['today_count'] ?? 0), ]; return [ 'key' => $key, 'label' => $provider['label'], 'prefix' => $provider['prefix'], 'today' => $today, 'net' => (float) ($row['today_net'] ?? max(0.0, (float) ($today['total'] ?? 0) - (float) ($today['fee'] ?? 0))), // This provider's own outstanding net, not the gateway-wide total. 'pending' => (float) ($row['pending'] ?? 0), ]; }); $usSubtotal = $usAccounts->sum(fn($a) => $a->current_balance); $walletSubtotal = $walletAccounts->sum(fn($a) => $a->current_balance); $pkSubtotal = $pkAccounts->sum(fn($a) => $a->current_balance); $auSubtotal = $auAccounts->sum(fn($a) => $a->current_balance); $cardPayable = $cards->sum(fn($c) => $metrics->usd($c->payable_balance, $c->currency)); $cardLimit = $cards->sum(fn($c) => $metrics->usd($c->credit_limit, $c->currency)); $runningProfit = $data['running_profit'] ?? ['years' => [], 'current_year_profit' => 0]; $currentYearExpense = $filterActive ? (float) ($kpis['expenses'] ?? 0) : (float) ($runningProfit['years'][0]['expenses'] ?? 0); $currentYearProfit = $filterActive ? (float) ($kpis['profit'] ?? 0) : (float) ($runningProfit['current_year_profit'] ?? ($kpis['running_profit_year'] ?? 0)); $bankLogo = fn($account) => strtoupper(substr($account->bank_name ?: $account->name, 0, 4)); $bankColor = fn($currency) => $currency === 'PKR' ? '#1e3a8a' : ($currency === 'AUD' ? '#0d9488' : '#6366f1'); $gatewayDateParams = [ 'mode' => 'date', 'from' => $filterActive ? $dateFilter['from'] : now()->toDateString(), 'to' => $filterActive ? $dateFilter['to'] : now()->toDateString(), ]; $dashboardCardParams = $filterActive ? ['from' => $dateFilter['from'], 'to' => $dateFilter['to']] : []; $dashboardDateModeParams = $filterActive ? ['mode' => 'date'] + $dashboardCardParams : []; @endphp
@if($filterActive) Clear Showing date-based cards for {{ $dateFilter['label'] }} @else Default dashboard shows current live balances, today collections, and current month totals. @endif

Overall

Core business cards and live monthly / yearly totals

{{ $verification['currency'] }}
Total Amount in Business
{{ $metrics->money($verification['business_total'], $verification['currency']) }}
Before liabilities {{ $metrics->money($verification['business_total_before_liabilities'] ?? $verification['business_total'], $verification['currency']) }}
Bank + inventory + lent + transit + KuickPay - liabilities
Inventory Amount
{{ $metrics->money($verification['inventory_amount'], $verification['currency']) }}
{{ number_format($inventoryUnits) }} units in stock
Lent Amount
{{ $metrics->money($verification['lent_amount'], $verification['currency']) }}
Open collectible balance
Bank Balance
{{ $metrics->money($verification['bank_balance'], $verification['currency']) }}
All active bank accounts
Net Worth
{{ $displayMoney($kpis['net_worth']) }}
Store Credit
{{ $metrics->money($verification['store_credit_amount'], $verification['currency']) }}
Available across all users
In Transit
{{ $displayMoney($kpis['transit']) }}
Expenses ({{ $periodLabel }})
{{ $displayMoney($kpis['expenses']) }}
Revenue ({{ $periodLabel }})
{{ $displayMoney($kpis['revenue']) }}
Profit ({{ $periodLabel }})
{{ $displayMoney($kpis['profit']) }}
{{ number_format($kpis['margin'], 1) }}% margin
Total Debt
{{ $displayMoney($kpis['debt']) }}
{{ $displayMoney($cardPayable) }} CC - {{ $displayMoney(max(0, $kpis['debt'] - $cardPayable)) }} Loans
Expense ({{ $filterActive ? 'Filtered' : 'Year' }})
{{ $displayMoney($currentYearExpense) }}
Profit ({{ $filterActive ? 'Filtered' : 'Year' }})
{{ $displayMoney($currentYearProfit) }}

Charitable & Zakaat

Giving and obligation estimates

KuickPay

Provider collections, fees, and pending balances

Live

PayFast

{{ $todayLabel }} collections and unsettled pending balance

Live

Factory

{{ $filterActive ? 'Filtered' : 'Current month' }} factory expense and revenue cards

{{ $filterActive ? 'Filtered' : 'Monthly' }}

Wallets USD

Live balances across all wallet and gateway accounts

Subtotal
{{ $metrics->money($walletSubtotal) }}
@forelse($walletAccounts as $account)
{{ $account->account_number ? '****'.substr($account->account_number, -4) : 'No #' }}
{{ $account->name }}
{{ $account->bank_name }}
{{ $metrics->money($account->current_balance, $account->currency) }}
@if($account->currency !== 'USD')
{{ $metrics->money($metrics->usd($account->current_balance, $account->currency)) }} USD eq.
@endif
@empty
No wallet accounts yet.
@endforelse
@foreach([ ['title' => 'Balance in US Banks', 'pill' => 'USD', 'pillClass' => 'pill-blue', 'accounts' => $usAccounts, 'subtotal' => $metrics->money($usSubtotal), 'subtitle' => 'Live balances across all American accounts'], ['title' => 'Balance in Pakistan Banks', 'pill' => 'PKR', 'pillClass' => 'pill-amber', 'accounts' => $pkAccounts, 'subtotal' => $metrics->money($pkSubtotal, 'PKR'), 'subtitle' => 'Live balances across all Pakistani accounts'], ['title' => 'Balance in Australian Banks', 'pill' => 'AUD', 'pillClass' => 'pill-teal', 'accounts' => $auAccounts, 'subtotal' => $metrics->money($auSubtotal, 'AUD'), 'subtitle' => 'Live balances across all Australian accounts'], ] as $group)

{{ $group['title'] }} {{ $group['pill'] }}

{{ $group['subtitle'] }}

Subtotal
{{ $group['subtotal'] }}
@if($group['pill'] !== 'USD')
{{ $metrics->money($metrics->usd($group['accounts']->sum(fn($a) => $a->current_balance), $group['pill'])) }} USD eq.
@endif
@forelse($group['accounts'] as $account)
{{ $account->account_number ? '****'.substr($account->account_number, -4) : 'No #'}}
{{ $account->name }}
{{ $account->bank_name }}
{{ $metrics->money($account->current_balance, $account->currency) }}
@if($account->currency !== 'USD')
{{ $metrics->money($metrics->usd($account->current_balance, $account->currency)) }} USD eq.
@endif
@empty
No {{ $group['pill'] }} accounts yet.
@endforelse
@endforeach

Credit Cards Liability

Limits, balances payable, and due dates

Total Payable
{{ $metrics->money($cardPayable) }}
of {{ $metrics->money($cardLimit) }} limit
@forelse($cards as $card) @php $util = (float) $card->credit_limit > 0 ? min(100, ((float) $card->payable_balance / (float) $card->credit_limit) * 100) : 0; @endphp
{{ $card->short_name ?: strtoupper(substr($card->issuer, 0, 4)) }}
Payable
{{ $metrics->money($card->payable_balance, $card->currency) }}
Limit {{ $metrics->money($card->credit_limit, $card->currency) }}
{{ $card->card_name }}{{ number_format($util, 0) }}%
Due {{ $card->due_date?->format('M d') ?: 'Not set' }}
@empty
No credit cards yet.
@endforelse
Inventory Value Vouchers
Rs {{ number_format($metrics->convert($kpis['inventory'], 'USD', 'PKR'), 2, '.', '') }}
Units in stock
{{ $inventoryUnits }}
Avg. cost / unit
{{ $displayMoney($kpis['inventory'] > 0 ? $kpis['inventory'] / max(1, $inventoryUnits) : 0) }}
Amount in Transit Pending
Rs {{ number_format($metrics->convert($kpis['transit'], 'USD', 'PKR'), 2, '.', '') }}
Transit invoices
{{ \App\Models\FinanceInvoice::where('status', 'transit')->count() }}
Source
Invoice status
Overall Net Worth Live
{{ $displayMoney($kpis['net_worth']) }}
Bank balances{{ $displayMoney($kpis['bank_total']) }}
Inventory{{ $displayMoney($kpis['inventory']) }}
In transit{{ $displayMoney($kpis['transit']) }}
Collectible{{ $displayMoney($kpis['collectible']) }}
Total debt-{{ $displayMoney($kpis['debt']) }}
@php $trendData = $metrics->trendMonths(6); $bankChart = $data['charts']['bank_allocation']; $expChart = $data['charts']['expense_breakdown']; // Palette used consistently across all three charts $palette = ['#6366f1','#10b981','#f59e0b','#06b6d4','#ec4899','#ef4444','#8b5cf6','#0d9488','#f97316','#3b82f6']; @endphp
{{-- Bank Allocation doughnut --}}

Bank Allocation

USD eq.
@if(count($bankChart['labels']) > 0)
@else
No accounts with positive balances yet.
@endif
{{-- Expense Breakdown doughnut --}}

Expense Breakdown

{{ $filterActive ? 'Filtered' : 'This month' }}
@if(count($expChart['labels']) > 0)
@else
No expenses recorded {{ $filterActive ? 'for this filter.' : 'this month.' }}
@endif
{{-- Revenue vs Expenses 6-month bar --}}

Revenue vs. Expenses

Last 6 months
@push('scripts') @endpush @endsection