$positions */ public function __construct( public string $toName, public string $toAddress, public string $toZip, public string $toLocation, public string $greeting, public array $positions, public string $usage, ) { $this->until = now()->addWeeks(2)->format('d.m.Y'); $this->filename = Str::slug("{$this->getSubject()} für {$toName}"); } public static function fromInvoice(Invoice $invoice): self { $recipient = $invoice->getRecipient(); return static::factory()->withoutMagicalCreation()->from([ 'toName' => $recipient->name, 'toAddress' => $recipient->address, 'toZip' => $recipient->zip, 'toLocation' => $recipient->location, 'greeting' => $recipient->greeting, 'positions' => static::renderPositions($invoice), 'usage' => $invoice->usage, ]); } public function settings(): InvoiceSettings { return app(InvoiceSettings::class); } public function getEngine(): Engine { return Engine::PDFLATEX; } public function basename(): string { return $this->filename; } public function template(): Template { return Template::make('tex.templates.invoice'); } public function setFilename(string $filename): self { $this->filename = $filename; return $this; } /** * @return array */ public static function renderPositions(Invoice $invoice): array { return $invoice->positions->mapWithKeys(fn ($position) => [$position->description => static::number($position->price)])->toArray(); } public static function number(int $number): string { return number_format($number / 100, 2, '.', ''); } }