@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) @if ($item['value'] > 0) @php $frac = $item['value'] / $donutT; $dash = $frac * $donutCirc; $rot = ($donutAcc / $donutT) * 360 - 90; $donutAcc += $item['value']; @endphp @endif @endforeach {{ __('dashboard.actual') }} {{ $moneyK($breakdownTotal) }}
@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])
{{ $val }}
{{ $label }}
@endforeach
{{ __('dashboard.estimated_budget_report') }} {{ __('dashboard.cost_vs_budget') }}
{{-- 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)
{{ $p['title'] }}
@foreach ($p['rows'] as $i => [$label, $val])
{{ $label }} {{ $money($val) }}
@endforeach
{{ $pct($p['progress']) }} settled
@endforeach
{{-- Project portfolio --}}

{{ __('dashboard.project_portfolio') }}

{{ __('dashboard.spend_against_each_project_s_estimated_budget') }}

{{ __('dashboard.manage_projects') }}
@if (empty($data['projects']))
{{ __('dashboard.no_projects_yet') }} {{ __('dashboard.add_project') }}
@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 --}}

{{ __('dashboard.shareholders') }}

{{ __('dashboard.ownership_on_chart_of_accounts') }}

{{ __('dashboard.ledger') }}
@if (($data['shareholders'] ?? collect())->isEmpty())
{{ __('dashboard.no_shareholder_ownership') }} {{ __('dashboard.accounts') }}
@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