> $rows @return list> */ public function build(array $rows, string $audience = 'client'): array { ReportAudience::validate($audience); $filters = $this->filters ?? new ReportFilters(); $mapper = $this->mapper ?? new ReportDataMapper(); $selected = []; foreach ($rows as $row) if ($filters->matches($row)) $selected[] = $row; usort($selected, static fn(array $a,array $b): int => strcmp((string)($a['changed_at'] ?? ''), (string)($b['changed_at'] ?? '')) ?: ((int)($a['id'] ?? $a['jobcard_id'] ?? 0) <=> (int)($b['id'] ?? $b['jobcard_id'] ?? 0)) ?: strcmp((string)($a['reference_no'] ?? ''), (string)($b['reference_no'] ?? ''))); $result = []; foreach ($selected as $row) $result[] = $audience === ReportAudience::INTERNAL ? $mapper->internalHistory($row) : $mapper->clientHistory($row); return $result; } public function query(array $rows, string $audience = 'client'): array { return $this->build($rows, $audience); } }