More improvements

This commit is contained in:
2026-08-05 10:55:06 +02:00
parent e55cdd1988
commit a0d26648ee
20 changed files with 279 additions and 216 deletions
@@ -7,6 +7,7 @@ use App\Enumerations\EfzStatus;
use App\Enumerations\FirstAidPermission;
use App\Enumerations\ParticipationType;
use App\Enumerations\SwimmingPermission;
use App\EventPaymentModules\DTO\RegistrationRenderContext;
use App\EventPaymentModules\ProvidesGiroCode;
use App\Models\AvailablePaymentMethod;
use App\Models\Event;
@@ -117,21 +118,54 @@ class EventParticipantPaymentSummaryTest extends TestCase
$this->assertSame('Kasse', $config['account_owner']);
}
public function test_payment_summary_builds_lines_from_resolved_config(): void
public function test_payment_summary_renders_html_from_resolved_config(): void
{
$event = $this->createEventWithTransfer(['account_owner' => 'Kasse', 'iban' => 'DE-EVENT']);
$participant = $this->createParticipant($event, 50.0);
$summary = $participant->paymentSummary();
// Web-Kontext: SPA-Markup (form-table), IBAN aus der Config + GiroCode-Bild über den Endpoint.
$web = $participant->paymentSummary(RegistrationRenderContext::Web);
$this->assertTrue($web->hasPaymentInformation);
$this->assertStringContainsString('DE-EVENT', $web->html);
$this->assertStringContainsString('/print-girocode/', $web->html);
$this->assertStringContainsString('class="form-table"', $web->html);
// Mail-Kontext: E-Mail-Markup (Inline-Styles), GiroCode als inline-CID.
$mail = $participant->paymentSummary(RegistrationRenderContext::Mail);
$this->assertStringContainsString('cid:girocode.png', $mail->html);
$this->assertStringContainsString('style="', $mail->html);
$this->assertStringNotContainsString('class="form-table"', $mail->html);
}
public function test_cash_summary_renders_configured_text(): void
{
$event = $this->createEventWithTransfer(['account_owner' => 'Kasse', 'iban' => 'DE-EVENT']);
$cashConfig = ['payment_information' => '<p>Bitte bar vor Ort zahlen.</p>'];
AvailablePaymentMethod::create([
'tenant' => $this->tenant->slug, 'slug' => PaymentMethod::PAYMENT_NOT_DEFINED,
'name' => 'Barzahlung', 'active' => true, 'configuration' => $cashConfig,
]);
EventPaymentMethods::create([
'event_id' => $event->id, 'slug' => PaymentMethod::PAYMENT_NOT_DEFINED, 'configuration' => $cashConfig,
]);
$participant = $this->createParticipant($event, 50.0, PaymentMethod::PAYMENT_NOT_DEFINED);
$summary = $participant->paymentSummary(RegistrationRenderContext::Web);
$this->assertTrue($summary->hasPaymentInformation);
$this->assertTrue($summary->showGiroCode);
$this->assertStringContainsString('Bitte bar vor Ort zahlen.', $summary->html);
$this->assertStringContainsString('class="payment-information"', $summary->html);
}
$byLabel = [];
foreach ($summary->lines as $line) {
$byLabel[$line['label']] = $line['value'];
}
$this->assertSame('DE-EVENT', $byLabel['IBAN']);
public function test_paid_participant_has_no_payment_information(): void
{
$event = $this->createEventWithTransfer(['account_owner' => 'Kasse', 'iban' => 'DE-EVENT']);
$participant = $this->createParticipant($event, 50.0);
$participant->amount_paid = 50.0;
$participant->save();
$this->assertFalse($participant->paymentSummary()->hasPaymentInformation);
}
public function test_resource_exposes_payment_summary(): void
@@ -142,6 +176,6 @@ class EventParticipantPaymentSummaryTest extends TestCase
$array = $participant->toResource()->toArray(request());
$this->assertTrue($array['paymentSummary']['hasPaymentInformation']);
$this->assertTrue($array['paymentSummary']['showGiroCode']);
$this->assertStringContainsString('DE-EVENT', $array['paymentSummary']['html']);
}
}
+4 -51
View File
@@ -3,12 +3,15 @@
namespace Tests\Unit;
use App\EventPaymentModules\DTO\RegistrationSummaryRequest;
use App\EventPaymentModules\Modules\AccountTransferPaymentModule;
use App\EventPaymentModules\Modules\UndefinedPaymentModule;
use App\Models\EventParticipant;
use App\ValueObjects\Amount;
use PHPUnit\Framework\TestCase;
/**
* Reine Modul-Logik ohne Framework-Kontext. Das Überweisungs-Modul rendert inzwischen Blade und wird
* daher auf Feature-Ebene getestet (siehe EventParticipantPaymentSummaryTest).
*/
class RegistrationSummaryTest extends TestCase
{
private function participant(float $amount, float $amountPaid, string $purpose = 'Zweck'): EventParticipant
@@ -24,56 +27,6 @@ class RegistrationSummaryTest extends TestCase
return $participant;
}
public function test_account_transfer_summary_builds_lines_from_config(): void
{
$module = new AccountTransferPaymentModule();
$request = new RegistrationSummaryRequest(
$this->participant(50.0, 0.0, 'Camp - Beitrag'),
['account_owner' => 'Kasse', 'iban' => 'DE123', 'bic' => 'XY'],
);
$summary = $module->registrationSummary($request);
$this->assertTrue($summary->hasPaymentInformation);
$this->assertTrue($summary->showGiroCode);
$this->assertNull($summary->html);
$byLabel = [];
foreach ($summary->lines as $line) {
$byLabel[$line['label']] = $line['value'];
}
$this->assertSame('Kasse', $byLabel['Kontoinhaber']);
$this->assertSame('DE123', $byLabel['IBAN']);
$this->assertSame('Camp - Beitrag', $byLabel['Verwendungszweck']);
$this->assertArrayHasKey('Betrag', $byLabel);
}
public function test_account_transfer_without_open_amount_has_no_payment_information(): void
{
$module = new AccountTransferPaymentModule();
$summary = $module->registrationSummary(new RegistrationSummaryRequest(
$this->participant(50.0, 50.0),
['account_owner' => 'Kasse', 'iban' => 'DE123'],
));
$this->assertFalse($summary->hasPaymentInformation);
$this->assertFalse($summary->showGiroCode);
}
public function test_cash_summary_returns_configured_html(): void
{
$module = new UndefinedPaymentModule();
$summary = $module->registrationSummary(new RegistrationSummaryRequest(
$this->participant(50.0, 0.0),
['payment_information' => '<p>Bitte bar vor Ort zahlen.</p>'],
));
$this->assertTrue($summary->hasPaymentInformation);
$this->assertFalse($summary->showGiroCode);
$this->assertSame('<p>Bitte bar vor Ort zahlen.</p>', $summary->html);
$this->assertSame([], $summary->lines);
}
public function test_cash_summary_empty_when_no_text_configured(): void
{
$module = new UndefinedPaymentModule();