slug) { 'starter' => 'rocket-launch', 'business' => 'briefcase', 'pro' => 'chart-bar', 'agency' => 'building-office-2', default => 'megaphone', }; } public function with(): array { $user = auth()->user(); $subscription = $user->subscription(); $currentPlan = $user->currentPlan(); $currentInterval = null; if ($currentPlan && $subscription) { $currentInterval = $subscription->stripe_price === $currentPlan->stripe_price_id_yearly ? 'yearly' : 'monthly'; } return [ // Rückkehr aus dem Stripe-Checkout (?checkout=erfolg|abbruch) // bzw. Hinweis aus den Checkout-Guards (Session-Flash). 'checkoutResult' => request()->query('checkout'), 'checkoutNotice' => session('checkout-notice'), 'plans' => Plan::query()->active()->get(), 'currentPlan' => $currentPlan, 'currentInterval' => $currentInterval, 'subscription' => $subscription, // Bestandstarife: laufende Legacy-Vereinbarungen (MAN-Kreis, // unbegrenzte PMs — Entscheidung 12.06.2026). 'legacyOptions' => $user ->userPaymentOptions() ->whereIn('status', [UserPaymentOptionStatus::Active->value, UserPaymentOptionStatus::Grandfathered->value]) ->orderBy('current_period_end') ->get(), 'openPurchases' => $user->singlePurchases()->grantingSubmission()->orderBy('paid_at')->get(), 'consumedPurchases' => $user->singlePurchases()->where('status', SinglePurchaseStatus::Consumed->value)->with('pressRelease')->latest('consumed_at')->limit(10)->get(), 'quotaRemaining' => $user->pressReleaseQuotaRemaining(), 'quotaTotal' => $user->pressReleaseQuotaTotal(), 'singlePmPrice' => $this->formatEuro((int) config('billing.single_pm_price_cents')), 'singlePmAvailable' => (bool) config('billing.single_pm_stripe_price_id'), ]; } }; ?>
{{-- ============== CHECKOUT-RÜCKMELDUNG ============== --}} @if ($checkoutResult === 'erfolg')
{{ __('Vielen Dank für Ihre Buchung!') }} {{ __('Die Zahlung wird von Stripe bestätigt — die Buchung erscheint hier in wenigen Augenblicken. Die Rechnung finden Sie anschließend unter Rechnungen.') }}
@elseif ($checkoutResult === 'abbruch')
{{ __('Der Bezahlvorgang wurde abgebrochen. Es wurde nichts gebucht — Sie können den Checkout jederzeit erneut starten.') }}
@endif @if ($checkoutNotice)
{{ $checkoutNotice }}
@endif {{-- ============== PAGE HEADER ============== --}}
{{ __('User Backend') }} {{ __('Mein Bereich · Finanzen') }}

{{ __('Buchungen & Add-ons') }}

{{ __('Tarif wählen oder einzelne Pressemitteilung buchen. Alle Preise sind Nettopreise zzgl. USt.; die Abrechnung erfolgt sicher über Stripe.') }}

{{ __('Rechnungen') }}
{{-- ============== AKTUELLER TARIF ============== --}} {{-- Erscheint erst, wenn eine Buchung existiert — vorher würde hier nur „kein Tarif" stehen und das Kontingent wäre irreführend. --}} @if ($subscription || $legacyOptions->isNotEmpty() || $openPurchases->isNotEmpty())
{{ __('Aktueller Tarif') }} @if ($currentPlan) {{ $currentPlan->name }} @elseif ($legacyOptions->isNotEmpty()) {{ __('Bestandstarif') }} @else {{ __('Einzel-PM') }} @endif
@if ($currentPlan)
{{ $currentInterval === 'yearly' ? $this->formatEuro($currentPlan->yearly_price_cents) . ' / ' . __('Jahr') : $this->formatEuro($currentPlan->monthly_price_cents) . ' / ' . __('Monat') }} {{ __('netto') }}

{{ __(':quota Pressemitteilungen pro Monat', ['quota' => $currentPlan->press_release_quota]) }} @if ($currentPlan->daily_limit) · {{ __('max. :limit Veröffentlichungen pro Tag', ['limit' => $currentPlan->daily_limit]) }} @endif

@if ($subscription?->onGracePeriod())

{{ __('Gekündigt — läuft am :date aus.', ['date' => $subscription->ends_at?->format('d.m.Y')]) }}

@endif @elseif ($legacyOptions->isNotEmpty()) @foreach ($legacyOptions as $option)
{{ data_get($option->legacy_conditions, 'name') ?? ($option->paymentOption?->article_number ?? __('Bestehende Vereinbarung')) }}

{{ __('Unbegrenzte Pressemitteilungen (Bestandsschutz).') }} @if ($option->current_period_end) {{ __('Nächste Rechnung am :date.', ['date' => $option->current_period_end->format('d.m.Y')]) }} @endif

@endforeach

{{ __('Ihre bisherigen Konditionen gelten unverändert weiter; die Abrechnung erfolgt wie gewohnt per Rechnung.') }}

@elseif ($openPurchases->isNotEmpty())
{{ trans_choice(':count Einzel-Pressemitteilung verfügbar|:count Einzel-Pressemitteilungen verfügbar', $openPurchases->count(), ['count' => $openPurchases->count()]) }}

{{ __('Jeder Kauf berechtigt zu genau einer Veröffentlichung — eingelöst wird er erst, wenn die Pressemitteilung live geht.') }}

@endif
{{-- Kontingent nur als echte Zahl — „unbegrenzt" wäre vor dem Launch-Schalter inhaltlich falsch. --}} @if (!is_null($quotaRemaining))
{{ __('PM-Kontingent diesen Monat') }}
{{ $quotaRemaining }} / {{ $quotaTotal }}
{{ __('Wird erst bei Veröffentlichung verbraucht.') }}
@endif @if ($subscription) {{ __('Abo verwalten') }}

{{ __('Zahlungsmethode, Rechnungen und Kündigung — sicher über das Stripe-Kundenportal.') }}

@endif
@endif {{-- ============== TARIF-RASTER ============== --}}
{{ __('Tarife') }}

{{ __('Den passenden Tarif wählen') }}

{{ __('Monatlich kündbar. Im Jahrestarif sind 2 Monate gratis — Sie zahlen 10 von 12 Monaten.') }}

@foreach ($plans as $plan) @php($isCurrent = $currentPlan && $plan->is($currentPlan))
$isCurrent, ]) wire:key="plan-{{ $plan->slug }}">

{{ $plan->name }}

@if ($isCurrent) {{ __('Aktuell') }} @endif
{{ $this->formatEuro($plan->monthly_price_cents) }} / {{ __('Monat') }}
{{ $this->formatEuro($plan->yearly_price_cents) }} / {{ __('Jahr') }}
{{ __('netto zzgl. USt.') }}
  • {{ $plan->press_release_quota }} {{ __('Pressemitteilungen pro Monat') }}
  • @if ($plan->daily_limit) {{ __('max. :limit Veröffentlichungen pro Tag', ['limit' => $plan->daily_limit]) }} @else {{ __('Ohne Tageslimit') }} @endif
  • {{ __('Prüfung und Veröffentlichung inklusive') }}
@if ($subscription) {{ $isCurrent ? __('Ihr aktueller Tarif') : __('Wechsel über „Abo verwalten"') }} @else
{{ __('Monatlich buchen') }}
{{ __('Jährlich buchen') }}
@endif
@endforeach

{{ __('Mehr als 60 Pressemitteilungen pro Monat, mehrere Teams oder Sonderkonditionen? Enterprise-Konditionen erhalten Sie auf Anfrage über den Support. Inklusive KI-Prüfung und Veröffentlichung.info@pressekonto.com') }}

{{-- ============== EINZEL-PM (OHNE ABO) ============== --}}

{{ __('Einzel-Pressemitteilung — ohne Abo') }}

{{ __('Genau eine Veröffentlichung inklusive Prüfung und Veröffentlichung. Eingelöst wird der Kauf erst, wenn die Pressemitteilung live geht — Ablehnungen kosten nichts.') }} @if ($openPurchases->isNotEmpty()) {{ trans_choice('Aktuell :count offener Kauf.|Aktuell :count offene Käufe.', $openPurchases->count(), ['count' => $openPurchases->count()]) }} @endif

{{ $singlePmPrice }}
{{ __('netto zzgl. USt.') }}
{{ __('Jetzt buchen') }}
{{-- ============== VERLAUF ============== --}} {{-- Aktive Buchungen stehen oben im Tarif-Panel — hier nur die Historie, durch Trennlinie und Zwischenüberschrift klar abgesetzt. --}}
{{ __('Verlauf') }}

{{ __('Eingelöste Käufe') }}

{{ __('Jeder eingelöste Einzelkauf mit der zugehörigen Pressemitteilung — die Rechnungen dazu finden Sie unter Rechnungen.') }}

@if ($consumedPurchases->isNotEmpty())
@foreach ($consumedPurchases as $purchase)
{{ $purchase->pressRelease?->title ?? $purchase->type->label() }}
{{ __('eingelöst am :date', ['date' => $purchase->consumed_at?->format('d.m.Y')]) }}
{{ __('eingelöst') }}
@endforeach
@else
{{ __('Noch kein Buchungsverlauf') }}

{{ __('Eingelöste Einzelkäufe erscheinen hier mit der zugehörigen Pressemitteilung.') }}

@endif