prepare("SELECT id FROM invoices WHERE storno_of = :id LIMIT 1");
$stmt->execute([':id' => $id]);
$existing_storno = $stmt->fetchColumn();
} catch (\PDOException $e) {
$existing_storno = false;
}
if ($existing_storno) {
header('Location: ' . url_for('invoices.php?msg=' . urlencode('Für diese Rechnung existiert bereits eine Stornorechnung.')));
exit;
}
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
try {
$storno_id = create_storno_invoice($id);
archive_invoice_pdf($storno_id);
// Journalbuchung stornieren falls vorhanden
$original_entry = get_journal_entry_for_invoice($id);
if ($original_entry) {
create_storno_journal_entry($id, $storno_id);
}
$stmt = $pdo->prepare("SELECT invoice_number FROM invoices WHERE id = :id");
$stmt->execute([':id' => $storno_id]);
$storno_number = $stmt->fetchColumn();
header('Location: ' . url_for('invoices.php?msg=' . urlencode('Stornorechnung ' . $storno_number . ' erstellt.')));
exit;
} catch (\Exception $e) {
$error = $e->getMessage();
}
}
?>
Storno – = htmlspecialchars($inv['invoice_number']) ?>
= htmlspecialchars($error) ?>
Stornorechnung erstellen
Rechnungsnummer = htmlspecialchars($inv['invoice_number']) ?>
Kunde = htmlspecialchars($inv['customer_name']) ?>
Datum = date('d.m.Y', strtotime($inv['invoice_date'])) ?>
Betrag = number_format($inv['total_gross'], 2, ',', '.') ?> €
Status = $inv['paid'] ? 'bezahlt' : 'offen' ?>
Achtung: Es wird eine neue Rechnung mit negativen Beträgen (Stornorechnung) erstellt.
Die bestehende Journalbuchung wird automatisch storniert (Gegenbuchung).
Die Rechnung ist noch nicht bezahlt – es wird keine Journalbuchung storniert.