124 lines
7.9 KiB
PHP
124 lines
7.9 KiB
PHP
<?php
|
||
|
||
namespace App\Domains\ParticipantRefund;
|
||
|
||
/**
|
||
* Katalog der Platzhalter, die in der Vorlage des Erstattungsbelegs zur Verfügung stehen.
|
||
*
|
||
* Dient wie {@see \App\Domains\ParticipantInvoice\ParticipantInvoiceTokens} zwei Zwecken: der
|
||
* Platzhalter-Liste in der Vorlagen-Verwaltung und den Beispieldaten für die Vorschau. Die echten Werte
|
||
* setzt
|
||
* {@see \App\Domains\ParticipantRefund\Actions\CreateRefundDocument\CreateRefundDocumentCommand}
|
||
* zusammen -- dass beide Seiten dieselben Namen kennen, sichert ein Test ab.
|
||
*/
|
||
final class ParticipantRefundTokens
|
||
{
|
||
/**
|
||
* @return array<string, array{label: string, tokens: array<string, array{description: string, sample: string}>}>
|
||
*/
|
||
public static function groups(): array
|
||
{
|
||
return [
|
||
'document' => [
|
||
'label' => 'Dokument',
|
||
'tokens' => [
|
||
'document_title' => ['description' => 'Titel des PDF-Dokuments', 'sample' => 'Rückerstattung WM-V-20260701-0005-R'],
|
||
'document_number' => ['description' => 'Belegnummer', 'sample' => 'WM-V-20260701-0005-R'],
|
||
'document_date' => ['description' => 'Datum der Bestätigung durch die teilnehmende Person', 'sample' => '18.06.2026'],
|
||
'event_name' => ['description' => 'Name der Veranstaltung', 'sample' => 'Sommerlager'],
|
||
'service_period' => ['description' => 'Zeitraum der Veranstaltung', 'sample' => '16.07.2026 – 20.07.2026'],
|
||
'unregistered_at' => ['description' => 'Datum der Abmeldung', 'sample' => '12.06.2026'],
|
||
],
|
||
],
|
||
'sender' => [
|
||
'label' => 'Absender',
|
||
'tokens' => [
|
||
'sender_name' => ['description' => 'Absender (Standard: Name des Mandanten)', 'sample' => 'BdP Landesverband Sachsen e.V.'],
|
||
'sender_address_1' => ['description' => 'Straße und Hausnummer', 'sample' => 'Musterweg 1'],
|
||
'sender_address_2' => ['description' => 'Adresszusatz, z. B. „c/o …"', 'sample' => 'c/o Mustermensch'],
|
||
'sender_address_3' => ['description' => 'Weiterer Adresszusatz', 'sample' => ''],
|
||
'sender_postcode' => ['description' => 'Postleitzahl', 'sample' => '01623'],
|
||
'sender_city' => ['description' => 'Ort', 'sample' => 'Lommatzsch'],
|
||
'sender_email' => ['description' => 'E-Mail-Adresse', 'sample' => 'kontakt@example.com'],
|
||
'sender_phone' => ['description' => 'Telefonnummer', 'sample' => '0351 1234567'],
|
||
'sender_tax_number' => ['description' => 'Steuernummer', 'sample' => '201/123/45678'],
|
||
'sender_vat_id' => ['description' => 'USt-IdNr.', 'sample' => ''],
|
||
],
|
||
],
|
||
'recipient' => [
|
||
'label' => 'Empfänger',
|
||
'tokens' => [
|
||
'recipient_name' => ['description' => 'Name der teilnehmenden Person', 'sample' => 'Mika Muster'],
|
||
'recipient_address_1' => ['description' => 'Straße und Hausnummer', 'sample' => 'Beispielstraße 3'],
|
||
'recipient_address_2' => ['description' => 'Adresszusatz', 'sample' => ''],
|
||
'recipient_postcode' => ['description' => 'Postleitzahl', 'sample' => '11111'],
|
||
'recipient_city' => ['description' => 'Ort', 'sample' => 'Beispielstadt'],
|
||
],
|
||
],
|
||
'refund' => [
|
||
'label' => 'Erstattung',
|
||
'tokens' => [
|
||
'paid_amount' => ['description' => 'Bereits gezahlter Teilnahmebeitrag', 'sample' => '300,00 €'],
|
||
'invoice_number' => ['description' => 'Nummer der Teilnahmerechnung', 'sample' => 'WM-V-20260701-0005'],
|
||
'refund_amount' => ['description' => 'Erstattungsbetrag', 'sample' => '220,00 €'],
|
||
'retained_amount' => ['description' => 'Betrag, der beim Verband bleibt — 0,00 € bei voller Erstattung', 'sample' => '80,00 €'],
|
||
'retention_note' => ['description' => 'Grund der Einbehaltung — leer bei voller Erstattung', 'sample' => 'Stornogebühr laut Ausschreibung'],
|
||
'refund_reason' => ['description' => 'Bezeichnung des Grundes', 'sample' => 'Krankheitsbedingte Absage'],
|
||
'refund_reason_text' => ['description' => 'Erläuterung des Grundes (bei „Sonstiger Grund" der Freitext)', 'sample' => 'Die Teilnahme konnte krankheitsbedingt nicht angetreten werden.'],
|
||
'account_owner' => ['description' => 'Kontoinhaber*in', 'sample' => 'Mika Muster'],
|
||
'account_iban' => ['description' => 'IBAN', 'sample' => 'DE02 1203 0000 0000 2020 51'],
|
||
'declaration_text' => ['description' => 'Die Erklärungen, die die teilnehmende Person bestätigt hat (gepflegt als Seitentexte CONFIRMATION_PARTICIPANT_REFUND und CONFIRMATION_PARTICIPANT_REFUND_ACCOUNT, bei einer Spende CONFIRMATION_PARTICIPANT_REFUND_DONATION)', 'sample' => 'Ich versichere, dass ich den genannten Betrag beglichen habe und nicht anderweitig zurückerstattet bekomme.<br /><br />Ich bestätige, dass das angegebene Konto dasselbe ist, von dem der Teilnahmebeitrag gezahlt wurde.'],
|
||
'intro_text' => ['description' => 'Einleitungssatz des Belegs — bei einer Spende der Verzicht statt der Bitte um Rückerstattung', 'sample' => 'Ich konnte an der Veranstaltung nicht oder nur teilweise teilnehmen und bitte um die Rückerstattung wie folgt:'],
|
||
'capture_note' => ['description' => 'Vermerk, wenn die Aktionsleitung die Bankverbindung aufgenommen hat — sonst leer', 'sample' => 'Angaben aufgenommen durch Aktions Leitung am 18.06.2026.'],
|
||
],
|
||
],
|
||
'body' => [
|
||
'label' => 'Beleginhalt (generiert)',
|
||
'tokens' => [
|
||
'details_table' => ['description' => 'Tabelle mit Name, gezahltem Beitrag, Rechnung, Erstattungsbetrag, Grund, Begründung und Bankverbindung', 'sample' => self::sampleDetails()],
|
||
],
|
||
],
|
||
];
|
||
}
|
||
|
||
/**
|
||
* Beispielwerte für die Vorschau.
|
||
*
|
||
* @return array<string, string>
|
||
*/
|
||
public static function sample(): array
|
||
{
|
||
$sample = [];
|
||
|
||
foreach (self::groups() as $group) {
|
||
foreach ($group['tokens'] as $name => $token) {
|
||
$sample[$name] = $token['sample'];
|
||
}
|
||
}
|
||
|
||
return $sample;
|
||
}
|
||
|
||
/** @return array<int, string> */
|
||
public static function names(): array
|
||
{
|
||
return array_keys(self::sample());
|
||
}
|
||
|
||
private static function sampleDetails(): string
|
||
{
|
||
return '<table class="detail-table">'
|
||
. '<tr><td class="detail-key">Name</td><td class="detail-val">Mika Muster</td></tr>'
|
||
. '<tr><td class="detail-key">Gezahlter Teilnahmebeitrag</td><td class="detail-val">300,00 €</td></tr>'
|
||
. '<tr><td class="detail-key">Rechnung</td><td class="detail-val">WM-V-20260701-0005</td></tr>'
|
||
. '<tr><td class="detail-key">Erstattungsbetrag</td><td class="detail-val">220,00 €</td></tr>'
|
||
. '<tr><td class="detail-key">Grund</td><td class="detail-val">Krankheitsbedingte Absage</td></tr>'
|
||
. '<tr><td class="detail-key">Begründung</td><td class="detail-val">Die Teilnahme konnte krankheitsbedingt nicht angetreten werden.</td></tr>'
|
||
. '<tr><td class="detail-key">Einbehalten</td><td class="detail-val">80,00 €</td></tr>'
|
||
. '<tr><td class="detail-key">Grund der Einbehaltung</td><td class="detail-val">Stornogebühr laut Ausschreibung</td></tr>'
|
||
. '<tr><td class="detail-key">Kontoinhaber*in</td><td class="detail-val">Mika Muster</td></tr>'
|
||
. '<tr><td class="detail-key">IBAN</td><td class="detail-val">DE02 1203 0000 0000 2020 51</td></tr>'
|
||
. '</table>';
|
||
}
|
||
}
|