adrema/app/Letter/DocumentFactory.php

68 lines
1.5 KiB
PHP

<?php
namespace App\Letter;
use App\Letter\Queries\LetterMemberQuery;
use Illuminate\Support\Collection;
class DocumentFactory
{
/**
* @var array<int, class-string<Letter>>
*/
private array $types = [
BillDocument::class,
RememberDocument::class,
];
/**
* @return Collection<int, class-string<Letter>>
*/
public function getTypes(): Collection
{
return collect($this->types);
}
/**
* @param class-string<Letter> $type
*/
public function singleLetter(string $type, LetterMemberQuery $query): ?Letter
{
$pages = $query->getPages($type);
if ($pages->isEmpty()) {
return null;
}
return $this->resolve($type, $pages);
}
/**
* @param class-string<Letter> $type
*
* @return Collection<int, Letter>
*/
public function letterCollection(string $type, LetterMemberQuery $query): Collection
{
return $query
->getPages($type)
->map(fn ($page) => $this->resolve($type, collect([$page])));
}
public function afterSingle(Letter $letter): void
{
foreach ($letter->allPayments() as $payment) {
$letter->afterSingle($payment);
}
}
/**
* @param class-string<Letter> $type
* @param Collection<int, Page> $pages
*/
private function resolve(string $type, Collection $pages): Letter
{
return new $type($pages);
}
}