@extends('layouts.app') @section('title', 'Dashboard') @section('content') {{-- Filtro global: período + hotel --}}
até
@if ($svc->accessibleHotels->count() > 1) @elseif ($svc->accessibleHotels->count() === 1) {{ $svc->accessibleHotels->first()->name }} @endif
{{-- KPI cards --}}
{{ $kpis['partners']['value'] }}
Parceiros Ativos
@include('admin.dashboard._delta', ['delta' => $kpis['partners']['delta']])
{{ $kpis['downloads']['value'] }}
Downloads
@include('admin.dashboard._delta', ['delta' => $kpis['downloads']['delta']])
{{ $kpis['views']['value'] }}
Visualizações
@include('admin.dashboard._delta', ['delta' => $kpis['views']['delta']])
{{ $kpis['views']['note'] }}
{{ $kpis['salesBoxOpenRate']['value'] !== null ? $kpis['salesBoxOpenRate']['value'].'%' : '—' }}
Sales Box — Taxa de Abertura
{{ $kpis['salesBoxOpenRate']['opened'] }} de {{ $kpis['salesBoxOpenRate']['total'] }} links acedidos
{{ $kpis['activeCampaigns']['value'] }}
Campanhas Ativas
@php $st = $kpis['storage']; @endphp
{{ fmt_size($st['usedBytes']) }} / {{ $st['quotaBytes'] ? fmt_size($st['quotaBytes']) : 'sem limite' }}
Armazenamento
@if ($st['percent'] !== null)
@endif
{{-- Atividade Travel Trade + Mercados --}}

Atividade Travel Trade

@if (array_sum($series['downloads']) === 0 && array_sum($series['views']) === 0)
Ainda não existem dados suficientes para este período. A informação aparecerá automaticamente à medida que os parceiros utilizarem o Travel Trade.
@else @endif

Mercados com Maior Interesse

@if (empty($markets))
Ainda não existem downloads suficientes para identificar mercados.
@else @foreach ($markets as $m)
{{ $m['flag'] ?? '🌍' }} {{ $m['label'] }} {{ $m['total'] }}
@endforeach @endif
{{-- Top Partners --}}

Top Partners

@if (empty($topPartners))
Ainda não existem parceiros com atividade neste período.
@else @foreach ($topPartners as $p) @endforeach
ParceiroEmpresaPaísMercadoDownloadsÚltima atividade
{{ $p['name'] }} {{ $p['company'] ?: '—' }} {{ $p['country'] ?: '—' }} {{ $p['market'] ?: '—' }} {{ $p['downloads'] }} {{ $p['lastAccess'] ? \Illuminate\Support\Carbon::parse($p['lastAccess'])->format('d/m/Y') : '—' }}
@endif
{{-- Content Performance --}}

Content Performance

@foreach (['materials' => 'Mais descarregados', 'photos' => 'Fotografias', 'kits' => 'Sales Kits', 'campaigns' => 'Campanhas', 'unused' => 'Sem utilização', 'recent' => 'Atualizados'] as $key => $label) {{ $label }} @endforeach
@include('admin.dashboard._content-list', ['items' => $contentPerformance['topMaterials'], 'labelKey' => 'title', 'subKey' => 'hotel', 'countKey' => 'total'])
{{-- Interesse por Categoria + Travel Trade Score --}}

Interesse por Categoria

@if (empty($categories))
Ainda não existem downloads suficientes para calcular o interesse por categoria.
@else @endif

Travel Trade Score

@if (! $score)
Seleciona um hotel específico no filtro acima para veres o Travel Trade Score.
@else
{{ $score['score'] }} / 100
@if (! empty($score['recommendations']))

Para melhorar:

@else

Perfil comercial completo. 🎉

@endif @endif
{{-- AI Insights + Oportunidades --}}

✨ AI Insights

@if (empty($insights))
Ainda não existem dados suficientes para gerar insights. A informação aparecerá automaticamente à medida que os parceiros utilizarem o Travel Trade.
@else @foreach ($insights as $insight)
{{ $insight }}
@endforeach @endif

Oportunidades

@if (empty($opportunities))
Sem oportunidades comerciais identificadas neste momento.
@else @foreach ($opportunities as $opp)
{{ $opp['text'] }}
@endforeach @endif
{{-- Alertas: administrativos vs comunicações Travel Trade --}}

Alertas Administrativos

@if (empty($adminAlerts))
Sem alertas administrativos.
@else @foreach ($adminAlerts as $alert)
{{ $alert }}
@endforeach @endif

Comunicações Travel Trade

@if (empty($partnerCommunications))
Sem comunicações recentes para parceiros.
@else @foreach ($partnerCommunications as $comm)
{{ $comm['title'] }} — {{ $comm['status'] }} · {{ \Illuminate\Support\Carbon::parse($comm['createdAt'])->format('d/m/Y') }}
@endforeach @endif
{{-- Atividade Recente --}}

Atividade Recente

@if (empty($recentActivity))
Sem atividade recente registada.
@else
@foreach ($recentActivity as $act)
{{ \Illuminate\Support\Carbon::parse($act['occurred_at'])->format('d/m H:i') }} {{ $act['description'] }}
@endforeach
@endif
{{-- Últimas Entradas --}} @if (! empty($latestEntries))

Últimas Entradas

@foreach ($latestEntries as $entry) @endforeach
ConteúdoTipoHotelUtilizadorData/hora
{{ $entry['content'] }} {{ $entry['type'] }} {{ $entry['hotel'] ?? '—' }} {{ $entry['user'] ?? '—' }} {{ optional($entry['at'])->format('d/m/Y H:i') ?? '—' }}
@endif @endsection @push('scripts') @endpush