@php $loc = app()->getLocale(); $eur = fn ($c) => Number::currency($c / 100, in: 'EUR', locale: $loc); @endphp

{{ __('billing.title') }}

{{ __('billing.subtitle') }}

{{-- Current plan --}}

{{ __('billing.current_plan') }}

{{ __('billing.plan.'.$currentKey) }}

{{ $eur($current['price_cents'] ?? 0) }}

{{ __('billing.net_per_month') }}

@if ($totalMonthlyCents !== null && $totalMonthlyCents !== ($current['price_cents'] ?? 0)) {{-- The plan alone is not the bill once modules are booked, and every part of it is frozen at what was agreed. --}}

{{ __('billing.total_with_addons', ['total' => $eur($totalMonthlyCents)]) }}

@endif
@foreach ([ ['billing.storage', ($current['quota_gb'] ?? 0).' GB'], ['billing.seats', $current['seats'] ?? '—'], ['billing.performance', __('billing.perf.'.($current['performance'] ?? 'standard'))], ['billing.status', __('billing.status_active')], ] as [$label, $value])

{{ __($label) }}

{{ $value }}

@endforeach
{{-- Cart: "5 purchases pending" told nobody what they had ordered, and offered no way to change their mind. --}} @if ($pending->isNotEmpty())

{{ __('billing.cart.title') }}

{{ __('billing.cart.subtitle') }}
@php $net = $pending->sum('amount_cents'); $gross = $pending->sum(fn ($o) => $o->grossCents()); // Summed from the same per-order rounding the total uses: rounding // after aggregating would let the two figures disagree by a cent. $recurringGross = $pending->filter->isRecurring()->sum(fn ($o) => $o->grossCents()); @endphp
{{ __('billing.cart.subtotal_net') }} {{ $eur($net) }}
{{ $tax->reverseCharge ? __('billing.cart.reverse_charge') : __('billing.cart.vat', ['percent' => $tax->percentLabel()]) }} {{ $eur($gross - $net) }}
{{ __('billing.cart.total_gross') }} {{ $eur($gross) }}
@if ($recurringGross > 0) {{-- The number that actually matters every month, kept apart from a one-off traffic top-up in the same cart. --}}

{{ __('billing.cart.recurring_note', ['amount' => $eur($recurringGross)]) }}

@endif
@endif {{-- Upgrades --}} @if (count($upgrades) > 0)

{{ __('billing.upgrade_title') }}

@foreach ($upgrades as $key) @php $p = $plans[$key]; @endphp

{{ __('billing.plan.'.$key) }}

{{ __('billing.perf.'.($p['performance'] ?? 'standard')) }}

{{ $p['quota_gb'] }} GB · {{ __('billing.seats_count', ['count' => $p['seats'] ?? 0]) }}

    @foreach (array_slice($features[$key] ?? [], 0, 4) as $f)
  • {{ __('billing.feature.'.$f) }}
  • @endforeach

{{ $eur($p['price_cents']) }} / {{ __('billing.month_short') }}

{{ $tax->reverseCharge ? __('billing.net_reverse_charge') : __('billing.net_hint', ['percent' => $tax->percentLabel()]) }}

{{ __('billing.upgrade_cta') }}
@endforeach
@endif {{-- ── Downgrade ────────────────────────────────────────────────────── Smaller plans are listed even when they cannot be taken, with the reason in the customer's own numbers. A plan that quietly disappears reads as "no longer offered"; a greyed-out button that does not say what is in the way is the thing people ring about. --}} @if ($downgrades !== [])

{{ __('billing.downgrade') }}

{{ __('billing.downgrade_hint') }}

@foreach ($downgrades as $key => $plan)

{{ $plan['name'] ?? $key }}

{{ $plan['quota_gb'] ?? 0 }} GB · {{ __('billing.seats_count', ['count' => $plan['seats'] ?? 0]) }}

{{ $eur($plan['price_cents'] ?? 0) }} {{ __('billing.per_month') }}

@if ($plan['check']->allowed) {{ __('billing.downgrade_to', ['plan' => $plan['name'] ?? $key]) }} @else

{{ __('billing.downgrade_blocked') }}

    @foreach ($plan['check']->blockers as $blocker)
  • {{ __('billing.downgrade_blocker.'.$blocker['key'], [ 'current' => $blocker['current'], 'limit' => $blocker['limit'], ]) }}
  • @endforeach
@endif
@endforeach
@endif {{-- Extra storage + Add-ons --}}
{{-- Storage --}}

{{ __('billing.storage_title') }}

{{ __('billing.storage_body', ['gb' => $storage['gb'], 'price' => $eur($storage['price_cents'])]) }}

{{ __('billing.net_per_month') }}

{{ __('billing.storage_cta', ['gb' => $storage['gb']]) }}
{{-- Traffic --}}

{{ __('billing.traffic_title') }}

{{ __('billing.traffic_body', ['gb' => $trafficAddon['gb'], 'price' => $eur($trafficAddon['price_cents'])]) }}

{{ __('billing.net_once') }}

@if ($trafficMeter)

{{ __('billing.traffic_used', [ 'used' => \App\Support\Bytes::human($trafficMeter->usedBytes), 'quota' => \App\Support\Bytes::human($trafficMeter->quotaBytes), ]) }}

@endif {{ __('billing.traffic_cta', ['gb' => $trafficAddon['gb']]) }}
{{-- Add-ons --}} @foreach ($addons as $key => $addon)

{{ __('billing.addon.'.$key.'.name') }}

{{ __('billing.addon.'.$key.'.desc') }}

{{-- What they actually pay for it once booked (packs and all), and today's price while it is still a sale to be made. --}}

{{ $eur($addon['booked'] ? $addon['monthly_cents'] : (int) $addon['price_cents']) }} / {{ __('billing.month_short') }} @if ($addon['booked'] && $addon['quantity'] > 1) · {{ __('billing.addon_packs', ['count' => $addon['quantity']]) }} @endif

{{ $tax->reverseCharge ? __('billing.net_reverse_charge') : __('billing.net_hint', ['percent' => $tax->percentLabel()]) }}

@if ($addon['booked']) {{-- Already theirs, at the price they booked it for — which is why this card does not show today's. --}}

{{ __('billing.addon_booked') }}

@else {{ __('billing.addon_cta') }} @endif
@endforeach

{{ __('billing.mock_note') }}