@php
$C = [
'indigo' => '#6366f1',
'violet' => '#8b5cf6',
'cyan' => '#06b6d4',
'amber' => '#f59e0b',
'emerald' => '#10b981',
'rose' => '#f43f5e',
'slate' => '#0f172a',
'muted' => '#64748b',
];
$money = function ($v) {
return number_format((float) ($v ?: 0), 2, '.', ',');
};
$moneyK = function ($v) use ($money) {
$n = (float) ($v ?: 0);
$abs = abs($n);
if ($abs >= 1e6) return number_format($n / 1e6, 2).'M';
if ($abs >= 1e5) return number_format($n / 1e3, 0).'K';
return $money($n);
};
$dt = fn ($v) => $v ? substr((string) $v, 0, 10) : '—';
$pct = fn ($v) => number_format((float) ($v ?: 0), 1).'%';
$ratio = function ($paid, $total) {
$t = (float) ($total ?: 0);
if ($t <= 0) return 0;
return min(100, ((float) ($paid ?: 0) / $t) * 100);
};
$k = $data['kpis'] ?? [];
$counts = $data['counts'] ?? [];
$breakdownItems = [
['key' => 'materials', 'label' => __('dashboard.materials'), 'color' => $C['cyan'], 'value' => (float) ($data['cost_breakdown']['materials'] ?? 0)],
['key' => 'labor', 'label' => __('dashboard.labor'), 'color' => $C['amber'], 'value' => (float) ($data['cost_breakdown']['labor'] ?? 0)],
['key' => 'machinery', 'label' => __('dashboard.machinery'), 'color' => $C['emerald'], 'value' => (float) ($data['cost_breakdown']['machinery'] ?? 0)],
['key' => 'expenses', 'label' => __('dashboard.expenses'), 'color' => $C['rose'], 'value' => (float) ($data['cost_breakdown']['expenses'] ?? 0)],
];
$breakdownTotal = array_sum(array_column($breakdownItems, 'value'));
$spendPct = ($k['estimated_budget'] ?? 0) > 0
? min(999, ((float) $k['actual_cost'] / (float) $k['estimated_budget']) * 100)
: (($k['actual_cost'] ?? 0) > 0 ? 100 : 0);
$varianceStatus = ((float) ($k['variance'] ?? 0)) > 0 ? 'over' : (((float) ($k['variance'] ?? 0)) < 0 ? 'under' : 'on');
$varianceColor = $varianceStatus === 'over' ? $C['rose'] : ($varianceStatus === 'under' ? $C['emerald'] : $C['slate']);
$card = 'background:#fff;border:1px solid #e2e8f0;border-radius:18px;padding:20px;box-shadow:0 10px 30px rgba(15,23,42,0.04)';
$track = 'height:7px;background:#f1f5f9;border-radius:99px;overflow:hidden';
$iconBox = 'width:36px;height:36px;border-radius:12px;display:flex;align-items:center;justify-content:center';
$ghost = 'font-size:12px;font-weight:700;color:#6366f1;text-decoration:none;background:#eef2ff;padding:8px 12px;border-radius:10px;display:inline-block';
$qLink = 'display:flex;align-items:center;gap:8px;padding:10px;border-radius:12px;text-decoration:none;color:#0f172a;font-size:12px;font-weight:700;background:#f8fafc;border:1px solid #e2e8f0';
$badgeBase = 'font-size:11px;font-weight:700;border-radius:99px;padding:3px 9px;text-transform:capitalize';
$statusStyle = function ($st) use ($C) {
$map = [
'active' => ['bg' => '#eef2ff', 'color' => $C['indigo']],
'planning' => ['bg' => '#f1f5f9', 'color' => '#475569'],
'complete' => ['bg' => '#ecfdf5', 'color' => $C['emerald']],
'completed' => ['bg' => '#ecfdf5', 'color' => $C['emerald']],
'over' => ['bg' => '#fff1f2', 'color' => $C['rose']],
'under' => ['bg' => '#ecfdf5', 'color' => $C['emerald']],
'on_budget' => ['bg' => '#f8fafc', 'color' => '#475569'],
];
return $map[$st] ?? $map['planning'];
};
// Donut math
$donutSize = 176;
$donutR = 62;
$donutCirc = 2 * M_PI * $donutR;
$donutAcc = 0;
$donutT = $breakdownTotal > 0 ? $breakdownTotal : 1;
@endphp
{{-- Hero --}}
{{ __('dashboard.command_center') }}
@if (!empty($data['generated_at']))
{{ __('dashboard.updated') }} {{ \Carbon\Carbon::parse($data['generated_at'])->timezone(config('app.timezone'))->toDayDateTimeString() }}
@endif
{{ __('dashboard.title') }}
{{ __('dashboard.subtitle') }}
@foreach ([
['fa-project-diagram', __('common.projects'), $counts['projects'] ?? 0],
['fa-layer-group', __('common.active'), $counts['active'] ?? 0],
['fa-users', __('common.people'), $counts['employees'] ?? 0],
['fa-truck', __('common.suppliers'), $counts['suppliers'] ?? 0],
['fa-tools', __('common.equipment'), $counts['equipment'] ?? 0],
['fa-wallet', __('common.accounts'), $counts['accounts'] ?? 0],
['fa-warehouse', __('common.warehouses'), $counts['warehouses'] ?? 0],
] as [$icon, $label, $value])
{{ $label }}
{{ $value }}
@endforeach
{{-- KPI cards --}}
{{ __('dashboard.estimated_budget') }}
{{ $moneyK($k['estimated_budget'] ?? 0) }}
{{ $money($k['estimated_budget'] ?? 0) }}
{{ __('dashboard.actual_cost') }}
{{ $moneyK($k['actual_cost'] ?? 0) }}
{{ $pct($spendPct) }} {{ __('dashboard.of_budget_spent') }}
{{ __('dashboard.variance') }}
{{ ((float)($k['variance'] ?? 0)) > 0 ? '+' : '' }}{{ $moneyK($k['variance'] ?? 0) }}
{{ $varianceStatus === 'over' ? __('dashboard.over_estimated_budget') : ($varianceStatus === 'under' ? __('dashboard.under_estimated_budget') : __('dashboard.on_budget')) }}
{{ __('dashboard.budget_health') }}
{{ $k['under_budget'] ?? 0 }} {{ __('dashboard.under') }}
{{ $k['over_budget'] ?? 0 }} {{ __('dashboard.over') }} · {{ $k['on_budget'] ?? 0 }} {{ __('dashboard.on_target') }}
{{-- Cost composition + Estimated vs actual --}}
{{ __('dashboard.cost_composition') }}
{{ __('dashboard.materials_labor_machinery_expenses') }}
@foreach ($breakdownItems as $item)
@php $w = $breakdownTotal > 0 ? max(3, ($item['value'] / $breakdownTotal) * 100) : 0; @endphp
{{ $item['label'] }}
{{ $money($item['value']) }}
@endforeach
{{ __('dashboard.estimated_vs_actual') }}
{{ __('dashboard.portfolio_wide_budget_against_recorded_cost') }}
@php
$est = (float) ($k['estimated_budget'] ?? 0);
$act = (float) ($k['actual_cost'] ?? 0);
$maxBar = max($est, $act, 1);
@endphp
{{ __('dashboard.estimated') }}
{{ $money($est) }}
{{ __('dashboard.actual') }}
{{ $money($act) }}
@foreach ([[__('common.planning'), $counts['planning'] ?? 0], [__('common.active'), $counts['active'] ?? 0], [__('common.complete'), $counts['complete'] ?? 0]] as [$label, $val])
@endforeach
{{-- Payables --}}
{{ __('dashboard.payables_and_commitments') }}
{{ __('dashboard.materials_credit_labor_due_and_machinery_hire') }}
@php
$payables = [
[
'icon' => 'fa-truck', 'title' => __('dashboard.materials'), 'accent' => $C['cyan'],
'href' => url('/reports/purchase-payables'),
'rows' => [[__('common.purchased'), $k['materials_purchased'] ?? 0], [__('common.paid'), $k['materials_paid'] ?? 0], [__('common.owed'), $k['materials_owed'] ?? 0]],
'progress' => $ratio($k['materials_paid'] ?? 0, $k['materials_purchased'] ?? 0),
],
[
'icon' => 'fa-hard-hat', 'title' => __('dashboard.labor'), 'accent' => $C['amber'],
'href' => url('/employee/labor-report'),
'rows' => [[__('common.due'), $k['labor_due'] ?? 0], [__('common.paid'), $k['labor_paid'] ?? 0], [__('common.owed'), $k['labor_owed'] ?? 0]],
'progress' => $ratio($k['labor_paid'] ?? 0, $k['labor_due'] ?? 0),
],
[
'icon' => 'fa-tools', 'title' => __('dashboard.machinery'), 'accent' => $C['emerald'],
'href' => url('/equipment/reports'),
'rows' => [[__('dashboard.usage_cost'), $k['machinery_cost'] ?? 0], [__('common.paid'), $k['machinery_paid'] ?? 0], [__('common.owed'), $k['machinery_owed'] ?? 0]],
'progress' => $ratio($k['machinery_paid'] ?? 0, $k['machinery_cost'] ?? 0),
],
];
@endphp
@foreach ($payables as $p)
@foreach ($p['rows'] as $i => [$label, $val])
{{ $label }}
{{ $money($val) }}
@endforeach
{{ $pct($p['progress']) }} settled
@endforeach
{{-- Project portfolio --}}
@if (empty($data['projects']))
@else
@foreach ($data['projects'] as $p)
@php
$c = $p['comparison'] ?? [];
$a = $p['actual'] ?? [];
$st = $statusStyle($p['project']['status'] ?? 'planning');
$vs = $statusStyle($c['status'] ?? 'on_budget');
$spend = min(100, (float) ($c['spend_percent'] ?? 0));
@endphp
{{ $p['project']['project_code'] ?? '' }}
{{ $p['project']['project_name'] ?? '' }}
{{ $p['project']['status'] ?? '—' }}
{{ $pct($c['spend_percent'] ?? 0) }} spent
{{ ($c['status'] ?? '') === 'over' ? __('dashboard.over') : (($c['status'] ?? '') === 'under' ? __('dashboard.under') : __('dashboard.on_budget')) }}
{{ __('dashboard.estimated') }}
{{ $moneyK($c['estimated_budget'] ?? 0) }}
{{ __('dashboard.actual') }}
{{ $moneyK($c['actual_total'] ?? 0) }}
{{ __('dashboard.mat_short') }} {{ $moneyK($a['materials_used'] ?? 0) }}
·
{{ __('dashboard.lab_short') }} {{ $moneyK($a['labor_cost'] ?? 0) }}
·
{{ __('dashboard.mach_short') }} {{ $moneyK($a['machinery_cost'] ?? 0) }}
@endforeach
@endif
{{-- Shareholders / Activity / Quick links --}}
@if (($data['shareholders'] ?? collect())->isEmpty())
@else
@foreach ($data['shareholders'] as $s)
{{ $s->account_name }}
{{ $s->account_code }} · {{ $s->type_name ?: __('common.account') }}
{{ number_format((float) ($s->ownership_percent ?? 0), 2) }}%
{{ __('dashboard.ownership') }}
@endforeach
@endif
{{ __('dashboard.recent_activity') }}
{{ __('dashboard.purchases_expenses_labor_transfers') }}
@foreach ([
['purchases', __('dashboard.purchases')],
['expenses', __('dashboard.expenses')],
['labor', __('dashboard.labor')],
['transfers', __('dashboard.transfers')],
] as [$id, $label])
@endforeach
@php $rows = $data['recent'][$feed] ?? collect(); @endphp
@if ($rows->isEmpty())
{{ __('dashboard.no_recent_feed', ['feed' => __('dashboard.'.$feed)]) }}
@else
@foreach ($rows as $r)
@if ($feed === 'purchases')
{{ $r->purchase_no ?: __('menu.purchase_order') }} · {{ $r->supplier_name ?: __('common.supplier') }}
{{ $dt($r->purchase_date) }} · {{ $r->payment_type }}
{{ $money($r->grand_total) }}
@elseif ($feed === 'expenses')
{{ $r->expense_no ?: __('dashboard.expenses') }} · {{ $r->project_name ?: __('common.project') }}
{{ $dt($r->expense_date) }} · {{ $r->status }}
{{ $money($r->amount) }}
@elseif ($feed === 'labor')
{{ $r->employee_name ?: __('dashboard.worker') }} · {{ $r->project_name }}
{{ $dt($r->work_date) }} · {{ $r->unit_type }} × {{ $r->quantity }}
{{ $money($r->amount) }}
@else
{{ $r->from_name ?: __('common.from') }} → {{ $r->to_name ?: __('common.to') }}
{{ $dt($r->transfer_date) }} · {{ $r->transfer_no ?: $r->status }}
{{ $money($r->from_amount ?: $r->to_amount) }}
@endif
@endforeach
@endif
{{ __('dashboard.quick_links') }}
{{ __('dashboard.jump_into_the_six_modules') }}
@foreach ([
['/projects', 'fa-building', __('common.projects')],
['/reports/project-budget', 'fa-balance-scale', __('common.budget')],
['/reports/project-cost', 'fa-clipboard-list', __('dashboard.cost_vs_budget')],
['/reports/purchase-payables', 'fa-credit-card', __('common.payables')],
['/employee/labor-work', 'fa-hard-hat', __('dashboard.labor_work')],
['/employee/labor-report', 'fa-users', __('dashboard.labor_report')],
['/equipment/payments', 'fa-tools', __('dashboard.hire_payments')],
['/equipment/reports', 'fa-tools', __('dashboard.machinery')],
['/purchase/supplier-payments', 'fa-money-bill-wave', __('dashboard.supplier_pay')],
['/purchase/project-expense', 'fa-receipt', __('common.expenses')],
['/reports/account-ledger', 'fa-wallet', __('common.ledger')],
['/account-transfers', 'fa-exchange-alt', __('common.transfers')],
] as [$href, $icon, $label])
{{ $label }}
@endforeach