68 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			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);
 | |
|     }
 | |
| }
 |