@php use App\Services\Reports\ReportCatalog; use App\Services\Reports\ReportDefinition; use App\Services\Reports\ReportFormatter; use App\Services\Reports\ReportOperators; use App\Services\Reports\ReportRunner; $type = $def->effectiveType(); $types = collect($def->columns)->mapWithKeys(fn ($c) => [$c => $def->columnType($c)])->all(); $aggCols = $runner->aggregateColumns(); $groupType = $def->groupColumn ? $def->columnType($def->groupColumn) : null; @endphp {{ $def->displayName() }} · {{ config('app.name') }} @vite(['resources/css/app.css'])
Back to report @if ($total > count($rows)) Only the first {{ number_format(count($rows)) }} of {{ number_format($total) }} records are printed — use CSV export for everything. @endif

{{ $def->displayName() }}

@if ($def->description)

{{ $def->description }}

@endif

{{ ['tabular' => 'Tabular', 'summary' => 'Summary', 'matrix' => 'Matrix'][$def->type] }} report · {{ ReportCatalog::moduleLabel($def->primary) }}@if ($def->related) + {{ collect($def->related)->map(fn ($m) => ReportCatalog::moduleLabel($m))->join(', ') }}@endif · {{ number_format($total) }} records · printed {{ now()->format('d-m-Y H:i') }} by {{ auth()->user()->name }} @if ($search !== '') · search “{{ $search }}”@endif

@if ($def->filters)

Filters: @foreach ($def->filters as $i => $f) @if ($i > 0) {{ $f['join'] }} @endif {{ $def->label($f['field']) }} {{ ReportOperators::ALL[$f['operator']][0] ?? $f['operator'] }} {{ $f['value'] }} @endforeach

@endif
@if ($matrix && $matrix['rows'])

{{ $matrix['measure'] }}

@foreach ($matrix['columns'] as $c => $_)@endforeach @foreach ($matrix['rows'] as $r => $rowTotal) @foreach ($matrix['columns'] as $c => $_)@endforeach @endforeach @foreach ($matrix['columns'] as $colTotal)@endforeach
{{ $def->label($def->groupColumn) }} \ {{ $def->label($def->matrixColumn) }}{{ ReportFormatter::bucket($c, $def->columnType($def->matrixColumn)) }}Total
{{ ReportFormatter::bucket($r, $groupType) }}{{ isset($matrix['cells'][$r][$c]) ? ReportFormatter::number($matrix['cells'][$r][$c]) : '' }}{{ ReportFormatter::number($rowTotal) }}
Total{{ ReportFormatter::number($colTotal) }}{{ ReportFormatter::number($matrix['grand']) }}
@endif @if ($groups && $groups['rows'])

Group subtotals — {{ $def->label($def->groupColumn) }}

@foreach ($aggCols as [$fn, $key])@endforeach @foreach ($groups['rows'] as $g) @foreach ($aggCols as $alias => $_)@endforeach @endforeach
{{ $def->label($def->groupColumn) }}Records{{ ReportDefinition::AGGREGATE_LABELS[$fn] }} {{ $def->label($key) }}
{{ ReportFormatter::bucket($g['__group'], $groupType) }} {{ number_format($g['__count']) }}{{ ReportFormatter::number($g[$alias]) }}
@endif

Records

@if ($type === 'summary')@endif @foreach ($def->columns as $c)@endforeach @forelse ($rows as $row) @if ($type === 'summary')@endif @foreach ($def->columns as $c) @endforeach @empty @endforelse @if ($totals) @foreach (ReportDefinition::AGGREGATE_LABELS as $fn => $fnLabel) @continue(! $def->aggregates[$fn]) @if ($type === 'summary')@endif @foreach ($def->columns as $i => $c) @php $alias = $fn.'__'.ReportRunner::alias($c); @endphp @endforeach @endforeach @endif
{{ $def->label($def->groupColumn) }} (group){{ $def->label($c) }}
{{ ReportFormatter::bucket($row->__group ?? null, $groupType) }}{{ ReportFormatter::cell($row->{ReportRunner::alias($c)} ?? null, $types[$c]) }}
No records.
{{ array_key_exists($alias, $totals['values']) ? $fnLabel.': '.ReportFormatter::number($totals['values'][$alias]) : '' }}