88 lines
3.6 KiB
PHP
88 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\ParticipantRefund\Controllers;
|
|
|
|
use App\Domains\ParticipantRefund\Actions\AcceptRefund\AcceptRefundCommand;
|
|
use App\Enumerations\RefundAccountSource;
|
|
use App\Models\ParticipantRefund;
|
|
use App\Providers\InertiaProvider;
|
|
use App\Scopes\CommonController;
|
|
use App\Support\Iban;
|
|
use Inertia\Response;
|
|
|
|
/**
|
|
* Die öffentliche Seite, auf der der Teili seine Bankverbindung hinterlegt.
|
|
*
|
|
* Liefert ausschließlich Anzeigedaten -- niemals die vollständige Bankverbindung: der Token wandert
|
|
* durch ein Postfach, und was einmal eingetragen ist, muss von dort nicht wieder herauslesbar sein.
|
|
* Ist das Konto aus dem Zahlungseingang bekannt, geht es deshalb **maskiert** hinaus: genug zum
|
|
* Wiedererkennen, zu wenig zum Mitschreiben.
|
|
*/
|
|
class RefundPageController extends CommonController
|
|
{
|
|
public function __invoke(string $refundToken): Response
|
|
{
|
|
$refund = $this->participantRefunds->getByToken($refundToken);
|
|
|
|
return new InertiaProvider('ParticipantRefund/RefundPage', $this->props($refund))->render();
|
|
}
|
|
|
|
/**
|
|
* @return array<string, mixed>
|
|
*/
|
|
private function props(?ParticipantRefund $refund): array
|
|
{
|
|
// Unbekannt und abgebrochen sind für den Teili derselbe Zustand: es gibt nichts zu tun.
|
|
if ($refund === null || $refund->status === ParticipantRefund::STATUS_CANCELLED) {
|
|
return [
|
|
'state' => 'unavailable',
|
|
'message' => AcceptRefundCommand::NO_OPEN_REFUND,
|
|
];
|
|
}
|
|
|
|
$participant = $refund->participant;
|
|
$event = $refund->event;
|
|
|
|
$common = [
|
|
'token' => $refund->token,
|
|
'name' => $participant->getNicename(),
|
|
'eventTitle' => $event->name,
|
|
'eventEmail' => $event->email,
|
|
'amount' => $refund->amount?->toString() ?? '0,00 Euro',
|
|
'reason' => $refund->reasonLabel(),
|
|
'reasonNote' => $refund->reason_note,
|
|
];
|
|
|
|
if ($refund->isAccepted()) {
|
|
return array_merge($common, [
|
|
'state' => 'accepted',
|
|
'acceptedAt' => $refund->accepted_at?->format('d.m.Y'),
|
|
// Wurde gespendet, darf der Abschlusstext keine Überweisung ankündigen, die nicht kommt.
|
|
'donation' => $refund->isDonation(),
|
|
]);
|
|
}
|
|
|
|
// Woher das Erstattungskonto kommt, entscheidet die Zahlungsart -- und damit, was die Seite
|
|
// fragt: gar nichts (Konto liegt vor), die Herkunftsfrage (es gab ein Ursprungskonto) oder nur
|
|
// die Felder (Barzahlung, es gab nie eines).
|
|
$accountSource = $refund->account_iban !== null
|
|
? RefundAccountSource::Known
|
|
: $participant->refundData()->source;
|
|
|
|
return array_merge($common, [
|
|
'state' => 'open',
|
|
'accountSource' => $accountSource->value,
|
|
// Der Name des page_texts-Eintrags, nicht der Text: Welche Erklärung gilt, entscheidet der
|
|
// Server -- sonst könnten Seite und Beleg auseinanderlaufen.
|
|
'accountDeclarationText' => $accountSource->accountDeclarationText(),
|
|
// Ist das Konto bekannt (aus dem Zahlungseingang), braucht der Teili es nicht einzugeben --
|
|
// er soll es aber wiedererkennen können, um einen Fehler zu melden. Deshalb maskiert:
|
|
// Die vollständige Bankverbindung verlässt diese Seite weiterhin nicht.
|
|
'knownAccount' => $refund->account_iban === null ? null : [
|
|
'owner' => $refund->account_owner,
|
|
'ibanMasked' => Iban::mask($refund->account_iban),
|
|
],
|
|
]);
|
|
}
|
|
}
|