{{-- Subscription Pricing Box (with billing cycle toggle) --}} {{-- All data is prepared by ProductService - no business logic in theme --}} @php use App\Support\PricingModelRegistry; @endphp
{{-- Inject Product Config for JS --}} @if(isset($pricingData['product_config'])) @endif {{-- Billing Cycle Switcher --}}
@foreach($billingTiers as $cycleId => $tier) @if($tier) @endif @endforeach

@lang('shop.Select Plan')

@foreach($pricingData['plans'] as $index => $plan) @php $planTiers = collect($plan['pricing_tiers']); $isDefault = $plan['is_default'] || ($index === 0 && !$pricingData['plans']->contains('is_default', true)); // Get list of supported cycle IDs for this plan $supportedCycles = $planTiers->map(function($t) { return $t['billing_cycle'] ?: 'onetime'; })->implode(','); @endphp {{-- Plan Radio Card --}}
$tier) @if($tier) @php // Match plan tier by Cycle ID $planTier = $planTiers->first(function($t) use ($cycleId) { $tCycleId = $t['billing_cycle'] ?: 'onetime'; return $tCycleId == $cycleId; }); $tierPricingModel = $planTier['pricing_model'] ?? 'fixed'; $tierModelHandler = app(PricingModelRegistry::class)->resolve($tierPricingModel); // JS reads data-price-{cycle} to calculateTotal(); per-unit models use per_unit_amount. $tierDisplayPrice = $tierModelHandler->usesPerUnitAmount() ? number_format($planTier['per_unit_amount'] ?? 0, 2, '.', '') : ($planTier ? number_format($planTier['price'], 2, '.', '') : '0.00'); @endphp data-price-{{ $cycleId }}="{{ $tierDisplayPrice }}" data-tier-{{ $cycleId }}="{{ $planTier ? $planTier['id'] : '' }}" data-pricing-model-{{ $cycleId }}="{{ $tierPricingModel }}" @endif @endforeach >
@endforeach
{{-- Seat Count Input (shown by JS when a per-seat plan is selected) --}} {{-- Hidden input for selected pricing tier --}} @php // Find default tier ID based on default cycle $defaultTier = null; if ($pricingData['default_billing_cycle'] && isset($billingTiers[$pricingData['default_billing_cycle']])) { $defaultTier = $billingTiers[$pricingData['default_billing_cycle']]; } elseif ($billingTiers->isNotEmpty()) { $defaultTier = $billingTiers->first(); } $defaultTierId = $defaultTier ? $defaultTier['id'] : ''; @endphp {{-- Enhanced Add-ons Section --}} @php $currentTierAddons = isset($pricingData['addons_by_tier'][$defaultTierId]) ? $pricingData['addons_by_tier'][$defaultTierId] : []; @endphp @if(count($pricingData['available_addons'] ?? []) > 0)

@lang('shop.Optional Add-ons')

@foreach($pricingData['available_addons'] as $addonId => $addon) @php $isAvailable = isset($addon['tier_pricing'][$defaultTier['id']]); $addonTierData = $isAvailable ? $addon['tier_pricing'][$defaultTier['id']] : null; @endphp
@endforeach
@endif {{-- Total Due Today --}} @php $defaultPricingModel = $defaultTier['pricing_model'] ?? 'fixed'; $defaultModelHandler = app(PricingModelRegistry::class)->resolve($defaultPricingModel); $initialTotal = $defaultModelHandler->checkoutDisplayZero() ? '0.00' : ($defaultModelHandler->usesPerUnitAmount() ? number_format($defaultTier['per_unit_amount'] ?? 0, 2) : ($defaultTier ? number_format($defaultTier['price'], 2) : '0.00')); @endphp
@lang('shop.Total Due Today') ${{ $initialTotal }}

@lang('shop.Renews automatically. Cancel anytime.')

{{-- Subscribe Button --}}