20 lines
1.2 KiB
PHP
20 lines
1.2 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
require_once __DIR__ . '/ReportFilters.php';
|
|
require_once __DIR__ . '/ReportDataMapper.php';
|
|
require_once __DIR__ . '/ReportQuery.php';
|
|
|
|
final class ClientJobcardReport implements ReportQuery
|
|
{
|
|
public function __construct(private readonly ?ReportFilters $filters = null, private readonly ?ReportDataMapper $mapper = null) {}
|
|
/** @param list<array<string,mixed>> $rows @return list<array<string,mixed>> */
|
|
public function build(array $rows, string $audience = 'client'): array
|
|
{
|
|
$filters = $this->filters ?? new ReportFilters(); $mapper = $this->mapper ?? new ReportDataMapper(); $result = [];
|
|
foreach ($rows as $row) if ($filters->matches($row)) $result[] = $audience === 'internal' ? $mapper->internalJobcard($row) : $mapper->clientJobcard($row);
|
|
usort($result, static fn(array $a,array $b): int => strcmp((string)($a['created_at'] ?? ''), (string)($b['created_at'] ?? '')) ?: strcmp((string)($a['reference_no'] ?? ''), (string)($b['reference_no'] ?? '')));
|
|
return $result;
|
|
}
|
|
public function query(array $rows, string $audience = 'client'): array { return $this->build($rows, $audience); }
|
|
}
|