90 lines
2.3 KiB
PHP
90 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Invoice;
|
|
|
|
use App\Invoice\Models\Invoice;
|
|
use App\Payment\Payment;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Support\Str;
|
|
use Zoomyboy\Tex\Document;
|
|
use Zoomyboy\Tex\Engine;
|
|
use Zoomyboy\Tex\Template;
|
|
|
|
abstract class InvoiceDocument extends Document
|
|
{
|
|
abstract public function getSubject(): string;
|
|
abstract public function view(): string;
|
|
|
|
public string $until;
|
|
public string $filename;
|
|
|
|
/**
|
|
* @param array<string, string> $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
|
|
{
|
|
return static::factory()->withoutMagicalCreation()->from([
|
|
'toName' => $invoice->to['name'],
|
|
'toAddress' => $invoice->to['address'],
|
|
'toZip' => $invoice->to['zip'],
|
|
'toLocation' => $invoice->to['location'],
|
|
'greeting' => $invoice->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<string, string>
|
|
*/
|
|
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, '.', '');
|
|
}
|
|
}
|