presseportale/resources/views/emails/billing/manual-invoice-issued.blade.php
Kevin Adametz a00f9dc79a billing: MAN-Rechnungen fuer Ueberweisungskunden bearbeiten, hold-Altlast bereinigen
Bestandskunden aus dem Altsystem zahlen per Ueberweisung; nach dem 04:30-Lauf
fehlte bisher der gesamte Bearbeitungsweg (kein PDF, keine Mail, kein
Zahlungseingang, kein Bestandsschutz-Ende). Plan und Befund:
dev/lagacy-rechnungen/entwicklungsplan-2026-09-16.md.

Bereinigung (legacy:settle-unpaid, wiederholbar):
- Legacy-Status hold = nie bezahlt, ersatzlos erledigt. 9 daraus abgeleitete
  Bestandsschutz-Buendel werden gekuendigt, MAN-00001/00002 storniert.
  Archivzeilen bleiben erhalten, sind aber in Admin-Archiv und Kundenkonto
  standardmaessig ausgeblendet.
- pending/reminder (recurring) = offene Vorgaenge: Periode auf den
  Leistungsbeginn der unbezahlten Rechnung zurueckgedreht und als MAN-Rechnung
  neu ausgestellt (Archiv-Status superseded, replaces_legacy_invoice_number).
- pending/reminder (single) = abgeschrieben (uncollectible).
- legacy:grandfather-subscriptions wertet den Zahlungsstatus jetzt selbst aus.

Workflow in /admin/payments (ManualInvoiceDunningService, je Aktion mit
Eintrag im Aktivitaets-Verlauf):
- Rechnung senden: Mail mit PDF-Anhang, Bankverbindung aus billing.issuer,
  Hinweis auf Bestandsschutz-Ende; Zahlungsziel zaehlt ab Versand.
- Erinnerung: gleiche Mail im Mahn-Ton, Nachfrist bei verstrichener Frist.
- Bezahlt: Zahlungseingang laut Kontoauszug verbuchen.
- Bestandsschutz beenden: Rechnung storniert (nie geloescht), Buendel
  gekuendigt, weitere offene MAN-Rechnungen des Kunden storniert, optionale
  Kundenmail.
- Panel "Blockierte Vereinbarungen": faellige Posten ohne Rechnung (meist
  fehlende Rechnungsadresse) mit "Jetzt abrechnen" oder "Entfernen".

Schema: invoices bekommt user_payment_option_id, sent_at, reminded_at,
reminder_count, voided_at, void_reason, replaces_legacy_invoice_number
(inkl. Backfill der bestehenden MAN-Rechnungen). PDF-Primitiven des
Archiv-Renderers in den Trait DrawsPdf ausgelagert; MAN-PDF on-demand ueber
admin.invoices.pdf / me.invoices.manual-pdf (InvoicePolicy).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-16 10:56:29 +00:00

93 lines
4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@php
$formatCents = fn (int $cents): string => number_format($cents / 100, 2, ',', '.')
.' '.($invoice->currency === 'EUR' ? '€' : $invoice->currency);
$dueDate = $invoice->due_date?->format('d.m.Y');
$title = $isReminder ? 'Zahlungserinnerung zu Ihrer Rechnung' : 'Ihre Rechnung für den Bestandsschutz';
$preheader = $isReminder
? 'Für die Rechnung '.$invoice->number.' liegt uns noch kein Zahlungseingang vor.'
: 'Rechnung '.$invoice->number.' im Anhang — bitte bis zum '.$dueDate.' überweisen.';
@endphp
<x-emails.layout :title="$title" :preheader="$preheader">
<p>Guten Tag {{ $user->name }},</p>
@if ($isReminder)
<p>
zu der unten aufgeführten Rechnung konnten wir bisher keinen Zahlungseingang
feststellen. Vielleicht ist sie in der Ablage untergegangen — die Rechnung liegt
dieser E-Mail noch einmal als PDF bei.
</p>
@else
<p>
als Bestandskunde nutzen Sie Ihre bisherige Vereinbarung auf pressekonto weiter
zu den gewohnten Konditionen (Bestandsschutz). Für den neuen Leistungszeitraum
erhalten Sie anbei Ihre Rechnung als PDF.
</p>
@if ($invoice->replaces_legacy_invoice_number)
<p>
Diese Rechnung ersetzt die Rechnung Nr. {{ $invoice->replaces_legacy_invoice_number }}
aus unserem bisherigen System. Bitte begleichen Sie nur noch die hier
aufgeführte Rechnung.
</p>
@endif
@endif
<dl class="meta">
<dt>Rechnungsnummer</dt>
<dd>{{ $invoice->number }}</dd>
<dt>Rechnungsdatum</dt>
<dd>{{ $invoice->invoice_date?->format('d.m.Y') }}</dd>
<dt>Leistung</dt>
<dd>{{ $serviceName }}</dd>
@if ($servicePeriod)
<dt>Leistungszeitraum</dt>
<dd>{{ $servicePeriod[0] }} – {{ $servicePeriod[1] }}</dd>
@endif
<dt>Betrag (netto)</dt>
<dd>{{ $formatCents($invoice->amount_cents) }}</dd>
@if ($invoice->tax_cents > 0)
<dt>Umsatzsteuer</dt>
<dd>{{ $formatCents($invoice->tax_cents) }}</dd>
@endif
<dt>Rechnungsbetrag</dt>
<dd><strong>{{ $formatCents($invoice->total_cents) }}</strong></dd>
<dt>Zahlbar bis</dt>
<dd><strong>{{ $dueDate }}</strong></dd>
</dl>
<p>Bitte überweisen Sie den Rechnungsbetrag auf folgendes Konto:</p>
<dl class="meta">
<dt>Kontoinhaber</dt>
<dd>{{ $issuer['account_holder'] }}</dd>
<dt>IBAN</dt>
<dd>{{ $issuer['iban'] }}</dd>
<dt>BIC</dt>
<dd>{{ $issuer['bic'] }}</dd>
<dt>Bank</dt>
<dd>{{ $issuer['bank_name'] }}</dd>
<dt>Verwendungszweck</dt>
<dd>Rechnungsnummer {{ $invoice->number }}</dd>
</dl>
<div class="meta-danger">
<p style="margin: 0;">
<strong>Wichtiger Hinweis zum Bestandsschutz:</strong>
Geht die Zahlung nicht bis zum <strong>{{ $dueDate }}</strong> bei uns ein, endet
Ihr Bestandsschutz zu diesem Datum und die Rechnung wird storniert. Ihre bereits
veröffentlichten Pressemitteilungen bleiben online; neue Veröffentlichungen sind
danach nur noch über die aktuellen Tarife auf pressekonto möglich.
</p>
</div>
<x-emails.button :url="$invoicesUrl">Rechnung im Konto ansehen</x-emails.button>
<div class="note">
<p>
Sie möchten die Vereinbarung nicht fortführen? Dann müssen Sie nichts weiter tun —
der Bestandsschutz endet mit Ablauf des Zahlungsziels automatisch. Die aktuellen
Tarife finden Sie unter <a href="{{ $bookingUrl }}">Buchungen &amp; Add-ons</a>.
</p>
<p>Falls Sie den Betrag bereits überwiesen haben, betrachten Sie diese E-Mail bitte als gegenstandslos.</p>
<p>Bei Fragen erreichen Sie uns über den <a href="{{ config('domains.domain_portal_url') }}/de/hilfe">Hilfe-Bereich auf pressekonto</a> oder per E-Mail an {{ $issuer['email'] }}.</p>
</div>
</x-emails.layout>