web: Preise-Seite zeigt unter Weitere Leistungen nur noch Depublizieren

Inhaltliche Korrektur (8 Credits) und Update/Ergänzung (4 Credits)
existieren als buchbare Leistungen noch nicht — sie folgen erst mit dem
Bookings-/Magic-Link-Rework und fliegen bis dahin von der Preisliste.

Depublizieren wird als Direktkauf in Euro abgerechnet (Stripe-Checkout
über billing.depublication_price_cents), nicht in Credits: Die Seite
zeigt jetzt 35 € aus derselben Preisquelle wie der Kauf-Flow statt der
falschen 35 Credits. Ohne konfigurierten Preis verschwindet der Block
komplett (wie das Angebot auf der PM-Detailseite).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-16 11:34:22 +00:00
parent 2ea64ad222
commit 07d89a0e6a
5 changed files with 36 additions and 32 deletions

View file

@ -43,12 +43,11 @@ class PreisePageData
'boostCategory' => $staffel(config('credits.boost_category', [])), 'boostCategory' => $staffel(config('credits.boost_category', [])),
'proofPdf' => (int) config('credits.proof_pdf'), 'proofPdf' => (int) config('credits.proof_pdf'),
'creditPacks' => config('credits.packs', []), 'creditPacks' => config('credits.packs', []),
// TODO: Lineup/Preise hängen am Bookings-/Magic-Link-Rework — final abstimmen. // Depublizieren wird als Direktkauf in Euro abgerechnet (Stripe-
'morePaths' => [ // Checkout), nicht in Credits — gleiche Preisquelle wie der Kauf-
'correction' => (int) config('credits.paths.correction'), // Flow. Null/0 = Angebot deaktiviert, dann zeigt die Seite nichts.
'update' => (int) config('credits.paths.update'), // Korrektur/Update folgen erst mit dem Bookings-/Magic-Link-Rework.
'depublish' => (int) config('credits.depublish'), 'depublicationPriceCents' => (int) config('billing.depublication_price_cents'),
],
]; ];
} }
} }

View file

@ -95,12 +95,10 @@ return [
'net' => 'netto', 'net' => 'netto',
], ],
// TODO: Diese Leistungen hängen am Magic-Link-/Bookings-Rework — Lineup // Korrektur/Update folgen erst mit dem Magic-Link-/Bookings-Rework —
// und Preise final abstimmen, sobald die In-App-Seite steht. // bis dahin ist Depublizieren die einzige weitere Leistung.
'more' => [ 'more' => [
'title' => 'Weitere Leistungen', 'title' => 'Weitere Leistungen',
'correction' => 'Inhaltliche Korrektur',
'update' => 'Update / Ergänzung',
'depublish' => 'Depublizieren', 'depublish' => 'Depublizieren',
], ],
], ],

View file

@ -92,8 +92,6 @@ return [
'more' => [ 'more' => [
'title' => 'Further services', 'title' => 'Further services',
'correction' => 'Content correction',
'update' => 'Update / addition',
'depublish' => 'Unpublish', 'depublish' => 'Unpublish',
], ],
], ],

View file

@ -7,7 +7,8 @@
Datenquellen (alles aus dem System, nichts hartkodiert): Datenquellen (alles aus dem System, nichts hartkodiert):
- Abos: Plan::active() -> $plans - Abos: Plan::active() -> $plans
- Einzel-PM: config('billing.single_pm_price_cents') -> $singlePmPriceCents - Einzel-PM: config('billing.single_pm_price_cents') -> $singlePmPriceCents
- Add-ons: config('credits.*') -> $extraPm, $boost, $proofPdf, $creditPacks, $morePaths - Add-ons: config('credits.*') -> $extraPm, $boost, $proofPdf, $creditPacks
- Depublizieren: config('billing.depublication_price_cents') -> $depublicationPriceCents (Direktkauf in Euro)
Inhalte/Texte: lang/de/pricing.php + lang/en/pricing.php (Schlüssel pricing.*). Inhalte/Texte: lang/de/pricing.php + lang/en/pricing.php (Schlüssel pricing.*).
@ -261,25 +262,20 @@
</div> </div>
</div> </div>
{{-- Weitere Leistungen — TODO: hängt am Bookings-/Magic-Link-Rework, {{-- Weitere Leistungen: aktuell nur Depublizieren (Direktkauf in
Lineup und Preise final abstimmen, sobald die In-App-Seite steht. --}} Euro, nicht Credits). Korrektur/Update folgen erst mit dem
<div class="mt-px bg-bg border border-bg-rule border-t-0 p-6"> Bookings-/Magic-Link-Rework und bleiben bis dahin draußen. --}}
<div class="eyebrow muted mb-3">{{ __('pricing.addons.more.title') }}</div> @if ($depublicationPriceCents > 0)
<div class="flex flex-wrap gap-x-8 gap-y-2 text-[12.5px]"> <div class="mt-px bg-bg border border-bg-rule border-t-0 p-6">
<span class="inline-flex items-baseline gap-2"> <div class="eyebrow muted mb-3">{{ __('pricing.addons.more.title') }}</div>
<span class="text-ink-2">{{ __('pricing.addons.more.correction') }}</span> <div class="flex flex-wrap gap-x-8 gap-y-2 text-[12.5px]">
<span class="font-mono text-ink">{{ $morePaths['correction'] }} {{ __('pricing.addons.credits_unit') }}</span> <span class="inline-flex items-baseline gap-2">
</span> <span class="text-ink-2">{{ __('pricing.addons.more.depublish') }}</span>
<span class="inline-flex items-baseline gap-2"> <span class="font-mono text-ink">{{ $euro($depublicationPriceCents) }}&nbsp;€</span>
<span class="text-ink-2">{{ __('pricing.addons.more.update') }}</span> </span>
<span class="font-mono text-ink">{{ $morePaths['update'] }} {{ __('pricing.addons.credits_unit') }}</span> </div>
</span>
<span class="inline-flex items-baseline gap-2">
<span class="text-ink-2">{{ __('pricing.addons.more.depublish') }}</span>
<span class="font-mono text-ink">{{ $morePaths['depublish'] }} {{ __('pricing.addons.credits_unit') }}</span>
</span>
</div> </div>
</div> @endif
<p class="text-[11.5px] text-ink-3 m-0 mt-4 max-w-[680px]">{{ __('pricing.vat_note') }}</p> <p class="text-[11.5px] text-ink-3 m-0 mt-4 max-w-[680px]">{{ __('pricing.vat_note') }}</p>

View file

@ -30,7 +30,20 @@ test('the pricing page renders the editorial shell with real plans, single pm an
->assertSeeText('7 Tage') // boost 7d aus config ->assertSeeText('7 Tage') // boost 7d aus config
->assertSeeText('10 Credits') // Credit-Paket p10 aus config ->assertSeeText('10 Credits') // Credit-Paket p10 aus config
->assertSeeText('Depublizieren') ->assertSeeText('Depublizieren')
->assertSeeText('35 Credits'); // depublish aus config ->assertSee('35&nbsp;€', false) // billing.depublication_price_cents (Direktkauf, keine Credits)
// Korrektur/Update gibt es noch nicht (folgen mit dem Magic-Link-Rework).
->assertDontSeeText('Inhaltliche Korrektur')
->assertDontSeeText('Update / Ergänzung');
});
test('the pricing page hides the depublication offer without a configured price', function () {
/** @var TestCase $this */
$this->seed(PlanSeeder::class);
config()->set('billing.depublication_price_cents', null);
$this->get('https://businessportal24.test/de/preise')
->assertSuccessful()
->assertDontSeeText('Depublizieren');
}); });
test('the pricing page serves english content on the english edition', function () { test('the pricing page serves english content on the english edition', function () {