WS-4: Bestandsschutz im Kundenbereich als echtes Paket darstellen

/admin/me/buchungen-add-ons: Bestandsschutz raus aus dem gedrängten
"Aktueller Tarif"-Panel, eigener prominenter Paket-Block:
- Portal-Badge (fehlte bisher), Schild-Icon, Akzentleiste, Rahmen (ring)
- größere Typo, Netto-Preis + Intervall, Feature-Liste (unbegrenzte PMs,
  Konditionen unverändert, nächste Rechnung), Bündel-Hinweis bei mehreren Posten
- Helper legacyPortalLabel()/legacyIntervalLabel() im Volt-Component
- BookingsPageTest auf die neue Darstellung + Portal-Anzeige aktualisiert

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-06-16 15:29:21 +00:00
parent be7d1799a5
commit afefa86711
2 changed files with 119 additions and 24 deletions

View file

@ -90,22 +90,30 @@ test('a subscriber sees the current plan and the manage button', function () {
->assertSee(route('me.checkout.billing-portal'), false);
});
test('a grandfathered legacy user sees the bestandstarif with unlimited quota', function () {
test('a grandfathered legacy user sees the bestandsschutz package with portal and unlimited quota', function () {
/** @var TestCase $this */
$user = bookingsTestCustomer();
UserPaymentOption::factory()->create([
'user_id' => $user->id,
'status' => UserPaymentOptionStatus::Grandfathered->value,
'current_period_end' => now()->addMonths(3),
'legacy_conditions' => ['name' => 'Presseverteiler Premium'],
'legacy_conditions' => [
'name' => 'Presseverteiler Premium',
'legacy_portal' => 'presseecho',
'net_cents' => 100000,
'interval' => 'yearly',
],
]);
$this->actingAs($user);
LivewireVolt::test('customer.bookings')
->assertSee('Bestandstarif')
->assertSee('Ihr Bestandsschutz')
->assertSee('Bestandsschutz')
->assertSee('Presseverteiler Premium')
->assertSee('Unbegrenzte Pressemitteilungen (Bestandsschutz).');
// Portal wird jetzt angezeigt.
->assertSee('Presseecho')
->assertSee('Unbegrenzte');
});
test('open and consumed single purchases appear in the card and history', function () {