@extends("client.layouts.app") @section("title", $service->product?->name ?? __("client.services.title")) @section("content") @php $st = strtolower((string) $service->status); $isPanelica = (($service->server?->type ?? $service->product?->server_type ?? '') === 'panelica'); // Login to panel: Panelica, and any other module that can hand out a sign-in link (ssoLogin). $panelModule = $service->server_id ? app(\App\Services\ProvisioningService::class)->resolveModule($service) : null; $canPanelLogin = $isPanelica || ($panelModule && method_exists($panelModule, 'ssoLogin')); $feat = $hostingFeatures ?? []; // Full control-panel tool set. `route` null = not built yet (shown as Soon). $tools = [ ['k'=>'files','name'=>__('client.hosting.files.title'),'desc'=>__('client.hosting.files.subtitle'),'ic'=>'ri-folder-open-line','c'=>'#3b82f6','route'=>route('client.services.files',$service)], ['k'=>'emails','name'=>__('client.hosting.email.title'),'desc'=>__('client.hosting.email.subtitle'),'ic'=>'ri-mail-line','c'=>'#8b5cf6','route'=>route('client.services.emails',$service)], ['k'=>'databases','name'=>__('client.hosting.databases.title'),'desc'=>__('client.hosting.databases.subtitle'),'ic'=>'ri-database-2-line','c'=>'#0ea5e9','route'=>route('client.services.databases',$service)], ['k'=>'ftp','name'=>__('client.hosting.ftp.title'),'desc'=>__('client.hosting.ftp.subtitle'),'ic'=>'ri-folder-transfer-line','c'=>'#f59e0b','route'=>route('client.services.ftp',$service)], ['k'=>'subdomains','name'=>__('client.hosting.subdomains.title'),'desc'=>__('client.hosting.subdomains.subtitle'),'ic'=>'ri-node-tree','c'=>'#10b981','route'=>route('client.services.subdomains',$service)], ['k'=>'dns','name'=>__('client.hosting.dns.title'),'desc'=>__('client.hosting.dns.subtitle'),'ic'=>'ri-global-line','c'=>'#6366f1','route'=>route('client.services.dns',$service)], ['k'=>'cron','name'=>__('client.hosting.cron.title'),'desc'=>__('client.hosting.cron.subtitle'),'ic'=>'ri-time-line','c'=>'#ec4899','route'=>route('client.services.cron',$service)], ['k'=>'backups','name'=>__('client.hosting.backups.title'),'desc'=>__('client.hosting.backups.subtitle'),'ic'=>'ri-archive-2-line','c'=>'#64748b','route'=>route('client.services.backups',$service)], ['k'=>'containers','name'=>__('client.hosting.containers.title'),'desc'=>__('client.hosting.containers.subtitle'),'ic'=>'ri-apps-2-line','c'=>'#0ea5e9','route'=>route('client.services.containers',$service)], ['k'=>'laravel','name'=>__('client.hosting.laravel.title'),'desc'=>__('client.hosting.laravel.subtitle'),'ic'=>'ri-fire-line','c'=>'#ef4444','route'=>route('client.services.laravel',$service)], ['k'=>'nodejs','name'=>__('client.hosting.nodejs.title'),'desc'=>__('client.hosting.nodejs.subtitle'),'ic'=>'ri-nodejs-line','c'=>'#22c55e','route'=>route('client.services.nodejs',$service)], ['k'=>'python','name'=>__('client.hosting.python.title'),'desc'=>__('client.hosting.python.subtitle'),'ic'=>'ri-terminal-box-line','c'=>'#3b82f6','route'=>route('client.services.python',$service)], ]; @endphp
{{ __('client.services.back_to_services') }} {{-- Hero --}}

{{ $service->domain ?: ($service->product?->name ?? __('client.services.title')) }}

{{ $service->product?->name }} @if($service->domain)· {{ ucfirst($service->billing_cycle) }}@endif
{{ __('client.status.' . $st) }}
@if($st === 'active') @endif
{{-- Resource strip --}} @if($isPanelica && $st === 'active')
{{ __('client.services.disk_usage') }}
…
{{ __('client.services.bandwidth_usage') }}
… MB
{{ __('client.hosting.dashboard.domains') }}
…
@endif @if(!empty($vpsFeatures)) @include('client.services.partials.vps') @endif {{-- App launcher --}} @if(!empty($feat) && $st === 'active')
{{ __('client.hosting.title') }}
@foreach($tools as $t) @php($live = $t['route'] && in_array($t['k'], $feat, true)) @if($live)
{{ $t['name'] }}
{{ $t['desc'] }}
@else
Soon
{{ $t['name'] }}
{{ $t['desc'] }}
@endif @endforeach
@endif {{-- Details --}}
{{ __('client.services.service_details') }}
  • {{ __('client.cart.product') }}{{ $service->product?->name ?? '—' }}
  • {{ __('client.cart.billing_cycle') }}{{ $service->billing_cycle ?? '—' }} @if(! empty($cycleOptions))
    @csrf
    @endif
  • {{ __('client.services.amount') }}{{ display_money_fmt($service->amount) }} / {{ $service->billing_cycle }}
  • {{ __('client.services.next_due_date') }}{{ $service->next_due_date?->format(date_fmt()) ?? '—' }} @if($canRenewEarly ?? false)
    @csrf
    @endif
  • {{ __('client.services.registration_date') }}{{ $service->registration_date?->format(date_fmt()) ?? '—' }}
  • {{ __('client.services.auto_renew') }}
    @csrf
{{ __('client.services.server_info') }}
  • {{ __('client.services.server') }}{{ $service->server->name ?? '—' }}
  • {{ __('client.services.username') }}{{ $service->username ?? '—' }}
  • {{-- A virtual server's host is the hypervisor: its address is not the customer's business. --}} @if(strtolower((string) $service->server?->type) !== 'proxmox') @if($service->server?->hostname)
  • {{ __('client.services.hostname') }}{{ $service->server->hostname }}
  • @endif @if($service->server?->ip_address)
  • {{ __('client.services.ip_address') }}{{ $service->server->ip_address }}
  • @endif @endif
@if($service->addons && $service->addons->count())
{{ __('client.services.addons') }}
@foreach($service->addons as $addon)@endforeach
{{ __('common.table.name') }}{{ __('common.table.amount') }}{{ __('common.table.billing_cycle') }}{{ __('client.services.next_due_date') }}{{ __('common.table.status') }}{{ __('common.table.actions') }}
{{ $addon->label() }}{{ display_money_fmt($addon->amount) }}{{ $addon->billing_cycle }} {{ $addon->next_due_date?->format(date_fmt()) ?? '-' }} {{ __('client.status.' . strtolower($addon->status)) }} @if(in_array(strtolower($addon->status),['active','pending'],true))
@csrf
@endif
@endif {{-- ClientAreaProductDetailsOutput, as WHMCS has it: what an addon shows for this service (a licence key, an outside account's status). --}} @php($productDetailsOutput = hook_output('ClientAreaProductDetailsOutput', ['service' => $service])) @if($productDetailsOutput !== '')
{!! $productDetailsOutput !!}
@endif @if(($downloads ?? collect())->isNotEmpty())
{{ __('client.downloads.title') }}
@foreach($downloads as $download)@endforeach
{{ $download->title }}@if($download->description)
{{ $download->description }}@endif
{{ __('common.actions.download') }}
@endif @if(($orderAnswers ?? collect())->isNotEmpty())
{{ __('client.cart.order_questions') }}
@endif @if(($availableAddons ?? collect())->isNotEmpty())
{{ __('client.services.addons_available') }}
@foreach($availableAddons as $available)
@csrf {{ $available->name }}@if($available->description)
{{ $available->description }}@endif
{{ display_money_fmt($available->priceFor($service->billing_cycle ?: 'Monthly')) }}
@endforeach
@endif
@if($isPanelica && $st === 'active') @endif @endsection