Files
PackControl/pirp/public/invoice_pdf.php

86 lines
2.9 KiB
PHP

<?php
/**
* GoBD-konforme PDF-Auslieferung
*
* Diese Datei liefert archivierte, unveränderliche Rechnungs-PDFs aus.
* Bei erstmaligem Aufruf wird die PDF generiert und permanent gespeichert.
*/
require_once __DIR__ . '/../src/config.php';
require_once __DIR__ . '/../src/auth.php';
require_once __DIR__ . '/../src/db.php';
require_once __DIR__ . '/../src/pdf_functions.php';
require_login();
$id = (int)($_GET['id'] ?? 0);
if ($id <= 0) {
die('Ungültige Rechnungs-ID.');
}
// Prüfe ob archivierte PDF existiert
$pdfPath = get_archived_pdf_path($id);
if (!$pdfPath) {
// Noch keine archivierte PDF - jetzt erstellen
$pdfPath = archive_invoice_pdf($id);
if (!$pdfPath) {
// Diagnose: Warum konnte die PDF nicht erstellt werden?
$pdo = get_db();
$stmt = $pdo->prepare("SELECT i.id, i.invoice_number, i.customer_id, c.id AS cust_exists
FROM invoices i
LEFT JOIN customers c ON c.id = i.customer_id
WHERE i.id = :id");
$stmt->execute([':id' => $id]);
$diag = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$diag) {
die('Fehler: Rechnung nicht gefunden (ID: ' . $id . ')');
}
if (!$diag['cust_exists']) {
die('Fehler: Kunde zur Rechnung ' . htmlspecialchars($diag['invoice_number']) . ' existiert nicht mehr.');
}
// Prüfe Verzeichnis-Berechtigungen
$uploadBase = __DIR__ . '/uploads/invoices';
if (!is_dir($uploadBase)) {
die('Fehler: Upload-Verzeichnis fehlt (' . $uploadBase . '). Bitte erstellen mit: mkdir -p ' . $uploadBase);
}
if (!is_writable($uploadBase)) {
die('Fehler: Upload-Verzeichnis nicht beschreibbar (' . $uploadBase . ')');
}
die('Fehler beim Generieren der PDF. Bitte Logs prüfen.');
}
}
// Vollständiger Dateipfad
$fullPath = __DIR__ . '/' . $pdfPath;
if (!file_exists($fullPath) || !is_readable($fullPath)) {
die('PDF-Datei nicht gefunden.');
}
// Integritätsprüfung
$isValid = verify_invoice_pdf($id);
if ($isValid === false) {
// WARNUNG: PDF wurde möglicherweise manipuliert!
error_log("WARNUNG: Integritätsprüfung fehlgeschlagen für Rechnung ID $id");
// Optional: Warnung anzeigen statt die PDF auszuliefern
// die('PDF-Integritätsfehler! Die Datei wurde möglicherweise manipuliert.');
}
// Rechnungsnummer für Dateinamen holen
$pdo = get_db();
$stmt = $pdo->prepare("SELECT invoice_number FROM invoices WHERE id = :id");
$stmt->execute([':id' => $id]);
$invoiceNumber = $stmt->fetchColumn() ?: 'Rechnung';
// PDF ausliefern
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="Rechnung-' . $invoiceNumber . '.pdf"');
header('Content-Length: ' . filesize($fullPath));
header('Cache-Control: private, max-age=0, must-revalidate');
readfile($fullPath);
exit;