@php $quoteBadge = [ 'DRAFT' => 'slate', 'SENT' => 'sky', 'ACCEPTED' => 'emerald', 'REJECTED' => 'rose', 'EXPIRED' => 'amber', ]; $kpiAccent = [ 'indigo' => '#6366f1', 'amber' => '#f59e0b', 'emerald' => '#10b981', 'sky' => '#0ea5e9', 'rose' => '#f43f5e', ]; $avatarColors = [ 'bg-indigo-100 text-indigo-700', 'bg-emerald-100 text-emerald-700', 'bg-amber-100 text-amber-700', 'bg-sky-100 text-sky-700', 'bg-rose-100 text-rose-700', 'bg-violet-100 text-violet-700', ]; $initials = function (?string $name): string { $parts = collect(preg_split('/\s+/', trim((string) $name)))->filter(); if ($parts->isEmpty()) { return '—'; } return $parts->take(2)->map(fn ($w) => mb_strtoupper(mb_substr($w, 0, 1)))->implode(''); }; $avatarColor = fn (?string $name): string => $avatarColors[abs(crc32((string) $name)) % count($avatarColors)]; @endphp
{{ $kpi['label'] }}
{{ $kpi['value'] }}
{{ $kpi['sub'] }}| {{ __('Quote No.') }} | {{ __('Customer') }} | {{ __('For') }} | {{ __('Status') }} | {{ __('Total') }} | {{ __('Date') }} | ||
|---|---|---|---|---|---|---|---|
|
{{-- The note count stays on the row, not in the selection bar:
it is an at-a-glance signal, and nobody ticks a row to
discover there was something written on it. --}}
#{{ $quote->id }} |
{{ $initials($quote->customer?->name) }}
{{ $quote->customer?->name ?: '—' }} @if ($quote->customer?->email){{ $quote->customer->email }} @endif @if ($quote->linkedOpportunity) {{ __('For: :title', ['title' => $quote->linkedOpportunity->title]) }} @endif |
|
|
{{ $quote->currency_code }} {{ number_format((float) $quote->total, 2) }} |
{{ $quote->created_at?->format('Y-m-d') }} @if ($vu) @if ($daysLeft < 0){{ __('Expired') }} @elseif ($daysLeft === 0){{ __('Expires today') }} @else{{ trans_choice('{1} :count day to expiry|[2,*] :count days to expiry', $daysLeft, ['count' => $daysLeft]) }} @endif @endif |
{{ $quote->customer?->name ?: '—' }}
{{ $quote->currency_code }} {{ number_format((float) $quote->total, 2) }}
{{ $quote->created_at?->format('Y-m-d') }} @if ($vu) @if ($daysLeft < 0) · {{ __('Expired') }} @elseif ($daysLeft === 0) · {{ __('Expires today') }} @else · {{ trans_choice('{1} :count day to expiry|[2,*] :count days to expiry', $daysLeft, ['count' => $daysLeft]) }} @endif @endif
@if ($lineMode === 'per_sqm')
{{ __('Associated costs') }}
{{ __('Material calculator') }}
{{ __('auto m² · offcut · cost') }}{{ __('Consumed') }}
{{ $this->trimNum($mc['consumed_qty']) }} {{ $mc['consumed_unit'] }}
{{ __('Offcut') }}
{{ $this->trimNum($mc['offcut_area']) }} m² ({{ number_format($mc['offcut_pct'], 0) }}%)
{{ __('Material cost') }}
{{ $currency_code }} {{ number_format($mc['material_cost'], 2) }}
{{ __('Weight') }}
{{ $mc['weight_kg'] !== null ? $mc['weight_kg'].' kg' : '—' }}
{{ __('Offcut costs :cur :amt, what do you want to do?', ['cur' => $currency_code, 'amt' => number_format($mc['offcut_cost'], 2)]) }}
@if ($mc['remnant_reusable']){{ __('Enter a size and quantity to calculate…') }}
@endif{{ __('Other additions') }}
{{ __('Methods carrying a charge add it to the total.') }} {{ __('Set rates') }}
{{-- A quote gets the same treatment as an invoice: clients pay off quotes as though they were pro-formas, so an account number on one priced for cash invites a transfer we never charged for. --}} @php $bankingMethod = $paymentMethods->firstWhere('id', (int) $payment_method_id); @endphp{{ $bankingMethod?->isBankTransfer() ? __('Your bank details will print on this quote.') : __('No bank details will print on this quote.') }}