Kundenwunsch 06.10.2026: Ein Kunde kam über die Stripe-Rechnungsseite nicht an seine Rechnung und fragte nach Belegen und einer Rechnungs-E-Mail. - Profil ▸ Rechnungsadresse ▸ Rechnungsversand: Schalter „Rechnungs-PDF an die Konto-E-Mail" (Standard an), optionale „E-Mail für Rechnungen" mit Schalter „Rechnungen als PDF an diese Adresse senden" (Standard an). Neue Spalten an billing_addresses (klein, ohne FULLTEXT). - InvoiceDelivery entscheidet Empfänger und Anhang; gleiche Adresse wie das Konto ergibt eine Mail mit PDF. - Zahlungsbestätigung (STR) und Bestandskunden-Rechnung/-Erinnerung (MAN) folgen der Einstellung; die Fassung an die Rechnungs-E-Mail nennt das Konto, ohne Blindkopie und ohne Login-Button. - StripeInvoicePdf holt das Stripe-PDF einmal und legt es lokal ab (storage/app/private/invoices/stripe); Mailversand wiederholt bei Stripe-Ausfall (5 Versuche). - Rechnungsseite: „PDF öffnen" aus pressekonto, „Beleg bei Stripe" für den Zahlungsbeleg auf der Stripe-Seite. Suite 2.340 grün, einer übersprungen; Larastan und Pint ohne Meldung. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
1.4 KiB
PHP
44 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Billing;
|
|
|
|
use App\Models\User;
|
|
|
|
/**
|
|
* Wer eine Rechnungsmail bekommt und ob das PDF anhängt (Kundenwunsch
|
|
* 06.10.2026, Einstellung an der Rechnungsadresse im Profil).
|
|
*
|
|
* - Die Konto-Adresse bekommt die Rechnungsmail immer; das PDF hängt an,
|
|
* solange der Kunde es nicht abgewählt hat (Standard: an).
|
|
* - Eine optionale Rechnungs-E-Mail bekommt eine eigene Mail mit PDF,
|
|
* wenn der Versand dorthin aktiviert ist (Standard: an, sobald eine
|
|
* Adresse eingetragen ist).
|
|
* - Ist die Rechnungs-E-Mail dieselbe wie die Konto-Adresse, geht keine
|
|
* zweite Mail raus; die Konto-Mail trägt dann das PDF.
|
|
*/
|
|
final class InvoiceDelivery
|
|
{
|
|
public function __construct(
|
|
public readonly bool $attachPdfForAccount,
|
|
public readonly ?string $invoiceEmail,
|
|
) {}
|
|
|
|
public static function for(User $user): self
|
|
{
|
|
$billingAddress = $user->billingAddress;
|
|
|
|
$attachPdfForAccount = $billingAddress->invoice_pdf_to_account ?? true;
|
|
|
|
$invoiceEmail = trim((string) $billingAddress?->invoice_email);
|
|
|
|
if ($invoiceEmail === '' || ! $billingAddress?->invoice_pdf_to_invoice_email) {
|
|
return new self($attachPdfForAccount, null);
|
|
}
|
|
|
|
if (strcasecmp($invoiceEmail, trim((string) $user->email)) === 0) {
|
|
return new self(true, null);
|
|
}
|
|
|
|
return new self($attachPdfForAccount, $invoiceEmail);
|
|
}
|
|
}
|