125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Invoice;
 | |
| 
 | |
| use App\Payment\Payment;
 | |
| use Carbon\Carbon;
 | |
| use Exception;
 | |
| use Generator;
 | |
| use Illuminate\Database\Eloquent\Relations\HasMany;
 | |
| use Illuminate\Support\Collection;
 | |
| use Illuminate\Support\Str;
 | |
| use Zoomyboy\Tex\Document;
 | |
| use Zoomyboy\Tex\Engine;
 | |
| use Zoomyboy\Tex\Template;
 | |
| 
 | |
| abstract class Invoice extends Document
 | |
| {
 | |
|     abstract public function getSubject(): string;
 | |
| 
 | |
|     abstract public function view(): string;
 | |
| 
 | |
|     abstract public function linkLabel(): string;
 | |
| 
 | |
|     abstract public static function sendAllLabel(): string;
 | |
| 
 | |
|     /**
 | |
|      * @param HasMany<Payment> $query
 | |
|      *
 | |
|      * @return HasMany<Payment>
 | |
|      */
 | |
|     abstract public static function paymentsQuery(HasMany $query): HasMany;
 | |
| 
 | |
|     /**
 | |
|      * @return array<int, string>
 | |
|      */
 | |
|     abstract public static function getDescription(): array;
 | |
| 
 | |
|     abstract public function afterSingle(Payment $payment): void;
 | |
| 
 | |
|     /**
 | |
|      * @var Collection<int, Page>
 | |
|      */
 | |
|     public Collection $pages;
 | |
|     public string $subject;
 | |
|     protected string $filename;
 | |
|     public string $until;
 | |
|     public InvoiceSettings $settings;
 | |
| 
 | |
|     /**
 | |
|      * @param Collection<int, Page> $pages
 | |
|      */
 | |
|     public function __construct(Collection $pages)
 | |
|     {
 | |
|         $this->pages = $pages;
 | |
|         $this->subject = $this->getSubject();
 | |
|         $this->until = now()->addWeeks(2)->format('d.m.Y');
 | |
|         $this->setFilename(Str::slug("{$this->getSubject()} für {$pages->first()?->familyName}"));
 | |
|         $this->settings = app(InvoiceSettings::class);
 | |
|     }
 | |
| 
 | |
|     public function number(int $number): string
 | |
|     {
 | |
|         return number_format($number / 100, 2, '.', '');
 | |
|     }
 | |
| 
 | |
|     public function getUntil(): Carbon
 | |
|     {
 | |
|         return now()->addWeeks(2);
 | |
|     }
 | |
| 
 | |
|     public function getEngine(): Engine
 | |
|     {
 | |
|         return Engine::XELATEX;
 | |
|     }
 | |
| 
 | |
|     public function basename(): string
 | |
|     {
 | |
|         return $this->filename;
 | |
|     }
 | |
| 
 | |
|     public function template(): Template
 | |
|     {
 | |
|         return Template::make('tex.templates.default');
 | |
|     }
 | |
| 
 | |
|     public function setFilename(string $filename): self
 | |
|     {
 | |
|         $this->filename = $filename;
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     public function getRecipient(): MailRecipient
 | |
|     {
 | |
|         if (!$this->pages->first()?->email) {
 | |
|             throw new Exception('Cannot get Recipient. Mail not set.');
 | |
|         }
 | |
| 
 | |
|         return new MailRecipient($this->pages->first()->email, $this->pages->first()->familyName);
 | |
|     }
 | |
| 
 | |
|     public function allPayments(): Generator
 | |
|     {
 | |
|         foreach ($this->pages as $page) {
 | |
|             foreach ($page->getPayments() as $payment) {
 | |
|                 yield $payment;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return view-string
 | |
|      */
 | |
|     public function mailView(): string
 | |
|     {
 | |
|         $view = 'mail.payment.'.Str::snake(class_basename($this));
 | |
| 
 | |
|         if (!view()->exists($view)) {
 | |
|             throw new Exception('Mail view '.$view.' existiert nicht.');
 | |
|         }
 | |
| 
 | |
|         return $view;
 | |
|     }
 | |
| }
 |