95 lines
3.4 KiB
PHP
95 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Rechnung\Actions\GeneratePdf;
|
|
|
|
use Barryvdh\DomPDF\Facade\Pdf;
|
|
|
|
class GeneratePdfCommand
|
|
{
|
|
public function __construct(private readonly GeneratePdfRequest $request) {}
|
|
|
|
public function execute(): GeneratePdfResponse
|
|
{
|
|
$rechnungsnummer = $this->request->rechnungsnummer !== ''
|
|
? $this->request->rechnungsnummer
|
|
: date('Y') . '-' . str_pad(random_int(1, 999), 3, '0', STR_PAD_LEFT);
|
|
|
|
$positionen = array_values(array_filter(
|
|
$this->request->positionen,
|
|
fn($p) => !empty($p['bezeichnung'])
|
|
));
|
|
|
|
$netto = array_sum(array_map(
|
|
fn($p) => (float) ($p['menge'] ?? 0) * (float) ($p['einzelpreis'] ?? 0),
|
|
$positionen
|
|
));
|
|
$mwst = $netto * $this->request->mwstSatz / 100;
|
|
$brutto = $netto + $mwst;
|
|
|
|
$pdf = Pdf::loadView('pdf.rechnung', [
|
|
'rechnungsnummer' => $rechnungsnummer,
|
|
'organisation' => $this->request->organisation,
|
|
'anrede' => $this->request->anrede,
|
|
'vorname' => $this->request->vorname,
|
|
'nachname' => $this->request->nachname,
|
|
'adresse' => $this->request->adresse,
|
|
'plz' => $this->request->plz,
|
|
'ort' => $this->request->ort,
|
|
'email' => $this->request->email,
|
|
'iban' => $this->request->iban,
|
|
'bic' => $this->request->bic,
|
|
'rechnungsdatum' => $this->request->rechnungsdatum,
|
|
'zahlungsziel' => $this->request->zahlungsziel,
|
|
'rechnungsdatumFormatiert' => $this->formatDate($this->request->rechnungsdatum),
|
|
'zahlungszielFormatiert' => $this->formatDate($this->request->zahlungsziel),
|
|
'positionen' => $positionen,
|
|
'mwstSatz' => $this->request->mwstSatz,
|
|
'netto' => $netto,
|
|
'mwst' => $mwst,
|
|
'brutto' => $brutto,
|
|
'absenderEmail' => $this->request->absenderEmail,
|
|
'absenderTelefon' => $this->request->absenderTelefon,
|
|
'kohteDataUri' => $this->imageToDataUri(storage_path('app/elemente/kohte.png')),
|
|
'logoDataUri' => $this->imageToDataUri(public_path('wbm.png')),
|
|
]);
|
|
|
|
$pdf->setPaper('A4', 'portrait');
|
|
$pdf->render();
|
|
|
|
$pdfContent = $pdf->output();
|
|
|
|
return new GeneratePdfResponse(
|
|
pdfContent: $pdfContent,
|
|
filename: 'rechnung-' . $rechnungsnummer . '.pdf',
|
|
);
|
|
}
|
|
|
|
private function formatDate(string $date): string
|
|
{
|
|
if (!$date) {
|
|
return '—';
|
|
}
|
|
|
|
$ts = strtotime($date);
|
|
|
|
return $ts ? date('d.m.Y', $ts) : $date;
|
|
}
|
|
|
|
|
|
private function imageToDataUri(string $path): string
|
|
{
|
|
if (!file_exists($path)) {
|
|
return '';
|
|
}
|
|
|
|
$mime = match (strtolower(pathinfo($path, PATHINFO_EXTENSION))) {
|
|
'jpg', 'jpeg' => 'image/jpeg',
|
|
'svg' => 'image/svg+xml',
|
|
default => 'image/png',
|
|
};
|
|
|
|
return 'data:' . $mime . ';base64,' . base64_encode(file_get_contents($path));
|
|
}
|
|
|
|
}
|