Warenwirtschaft: Review-Fix — Altdaten-PDFs zentral regenerieren (ensureFilesOnDisk)

document('combined') lief bei fehlender Alt-PDF ungeprüft in eine
PDFMerger-Exception (500); der Sammel-Druck prüfte nur den Lieferschein,
eine fehlende Rechnungs-PDF ließ den ganzen Batch platzen. Neue zentrale
InvoiceRepository::ensureFilesOnDisk() ersetzt den dreifach kopierten
Altdaten-Check (MailLogistic 2x, batchDocuments); Merge-/Response-Code im
OrderFulfillmentController zu mergedPdf()/pdfResponse() dedupliziert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-20 12:28:41 +00:00
parent 8ad0f65947
commit f28f4b4b68
5 changed files with 242 additions and 132 deletions

View file

@ -133,31 +133,20 @@ class OrderFulfillmentController extends Controller
return redirect()->route('admin.inventory.orders.index');
}
$merger = new PDFMerger;
$merger->init();
foreach ($printable as $order) {
if (! Invoice::isInvoice($order)) {
(new InvoiceRepository($order))->create([]);
} elseif (! Storage::disk('public')->exists(Invoice::getDownloadPathDelivery($order))) {
// Datei fehlt auf der Platte (Altdaten) — mit bestehender Nummer neu erzeugen
(new InvoiceRepository($order))->update([]);
} else {
// Fehlende Dateien (Altdaten) mit bestehender Nummer regenerieren —
// prüft Rechnung UND Lieferschein (Review 20.07.2026)
(new InvoiceRepository($order))->ensureFilesOnDisk();
}
if ($data['type'] === 'combined') {
$merger->addPDF(Invoice::getDownloadPath($order, true));
}
$merger->addPDF(Invoice::getDownloadPathDelivery($order, true));
}
$filename = ($data['type'] === 'combined' ? 'Rechnungen-Lieferscheine-' : 'Lieferscheine-')
.now()->format('d-m-Y_Hi').'.pdf';
$merger->setFileName($filename);
$merger->merge();
return Response::make($merger->output(), 200)
->header('Content-Type', 'application/pdf')
->header('Content-disposition', 'inline; filename="'.$filename.'"');
return $this->pdfResponse($this->mergedPdf($printable, $data['type'] === 'combined', $filename), $filename);
}
/**
@ -175,25 +164,18 @@ class OrderFulfillmentController extends Controller
if ($type === 'label') {
abort_unless($order->wp_label_path && Storage::disk('local')->exists($order->wp_label_path), 404);
return Response::make(Storage::disk('local')->get($order->wp_label_path), 200)
->header('Content-Type', 'application/pdf')
->header('Content-disposition', 'inline; filename="DHL-Label-Bestellung-'.$order->id.'.pdf"');
return $this->pdfResponse(Storage::disk('local')->get($order->wp_label_path), 'DHL-Label-Bestellung-'.$order->id.'.pdf');
}
abort_unless(Invoice::isInvoice($order), 404);
// Fehlende Dateien (Altdaten) mit bestehender Nummer regenerieren — vorher
// lief der combined-Zweig ungeprüft in eine Exception (Review 20.07.2026)
abort_unless((new InvoiceRepository($order))->ensureFilesOnDisk(), 404);
if ($type === 'combined') {
$merger = new PDFMerger;
$merger->init();
$merger->addPDF(Invoice::getDownloadPath($order, true));
$merger->addPDF(Invoice::getDownloadPathDelivery($order, true));
$filename = str_replace('Rechnung-', 'Rechnung-Lieferschein-', Invoice::getFilename($order));
$merger->setFileName($filename);
$merger->merge();
return Response::make($merger->output(), 200)
->header('Content-Type', 'application/pdf')
->header('Content-disposition', 'inline; filename="'.$filename.'"');
return $this->pdfResponse($this->mergedPdf([$order], true, $filename), $filename);
}
$path = $type === 'invoice' ? Invoice::getDownloadPath($order) : Invoice::getDownloadPathDelivery($order);
@ -201,7 +183,36 @@ class OrderFulfillmentController extends Controller
abort_unless(Storage::disk('public')->exists($path), 404);
return Response::make(Storage::disk('public')->get($path), 200)
return $this->pdfResponse(Storage::disk('public')->get($path), $filename);
}
/**
* Rechnung (optional) + Lieferschein der Bestellungen zu EINEM PDF mergen —
* gemeinsame Implementierung für Einzel-Kombi und Sammel-Druck.
*
* @param iterable<ShoppingOrder> $orders
*/
private function mergedPdf(iterable $orders, bool $withInvoice, string $filename): string
{
$merger = new PDFMerger;
$merger->init();
foreach ($orders as $order) {
if ($withInvoice) {
$merger->addPDF(Invoice::getDownloadPath($order, true));
}
$merger->addPDF(Invoice::getDownloadPathDelivery($order, true));
}
$merger->setFileName($filename);
$merger->merge();
return $merger->output();
}
private function pdfResponse(string $content, string $filename)
{
return Response::make($content, 200)
->header('Content-Type', 'application/pdf')
->header('Content-disposition', 'inline; filename="'.$filename.'"');
}