{{-- Token status banner --}} @php $tok = $this->tokenStatus; $stats = $this->stats; @endphp @if($stats['stalled_nodes'] > 0)
{{ number_format($stats['stalled_nodes']) }} node(s) are pending/fetching with nothing queued to process them — likely left behind by a "Stop JLR Jobs" click. They will not resolve on their own. Click Extract All to resume.
@endif
Catalogue
Vehicles
{{ number_format($stats['vehicles']) }}
Nodes
{{ number_format($stats['nodes']) }}
Leaf Sections
{{ number_format($stats['leaf_nodes']) }}
Parts
{{ number_format($stats['parts']) }}
Extraction health
Pending Nodes
{{ number_format($stats['pending_nodes']) }}
Failed Nodes
{{ number_format($stats['failed_nodes']) }}
@php $ssTotal = $stats['osi_apns_total']; $ssFetched = $stats['osi_apns_fetched']; $ssPct = $ssTotal > 0 ? round(($ssFetched / $ssTotal) * 100, 1) : 0; $ssDone = $ssTotal > 0 && $ssFetched >= $ssTotal; @endphp
Supersessions Fetched
{{ $ssPct }}%
{{-- Token status card --}}
Authentication
@if($tok['has_refresh']) {{-- Refresh token present → session can always auto-renew, access token expiry is irrelevant --}} Session active · auto-refresh @elseif($tok['has_token'] && !$tok['expired']) Token valid @else Not authenticated — click Authenticate @endif
@if($tok['email'])
Logged in as: {{ $tok['email'] }}
@endif {{-- EPC API token status (idp_access_token — used for catalogue extraction) --}}
@if($tok['has_epc_token'] && !$tok['epc_expired']) EPC token valid @if($tok['epc_expires_in'] !== null) · {{ (int)($tok['epc_expires_in'] / 60) }} min remaining @endif @elseif($tok['has_epc_token'] && $tok['epc_expired']) EPC token expired (auto-refreshes on next extraction) @else No EPC token — authenticate to obtain one @endif

Use Authenticate above to log in with your JLR EPC trade account. The EPC catalogue token is obtained automatically during login and refreshed every ~5 minutes during extraction.

{{-- Quick actions --}}
Extraction Guide
  1. Authenticate once with your JLR EPC credentials to bootstrap the 90-day refresh token.
  2. Sync Vehicles to import the vehicle list from the SFCC catalogue API.
  3. Extract All to queue a full recursive hierarchy + parts extraction for every vehicle. This runs in the background — monitor via the Console panel.
  4. Browse Catalogue to navigate the stored data without hitting the live API.
Note: Extraction respects the rate limit setting ({{ app(\Webkul\JlrEpc\Settings\JlrEpcSettings::class)->rate_limit_ms }}ms between requests). Diagram images are downloaded immediately during extraction since the signed URLs expire.
{{-- Recent extraction runs --}} @php $runs = $this->recentRuns; @endphp @if(!empty($runs))
Recent Extraction Runs
@foreach($runs as $run) @php $pct = $run['nodes_total'] > 0 ? round(($run['nodes_done'] / $run['nodes_total']) * 100) : 0; $vehicle = \Webkul\JlrEpc\Models\JlrVehicle::find($run['vehicle_id']); @endphp
{{ $vehicle?->name ?? "Vehicle #{$run['vehicle_id']}" }}
{{ $run['status'] }}
{{ $run['nodes_done'] }}/{{ $run['nodes_total'] }}
{{ $run['started_at'] ? \Carbon\Carbon::parse($run['started_at'])->diffForHumans() : '' }}
@endforeach
@endif