@extends('layouts.app')
@section('title', 'Dashboard')
@section('content')
{{-- Filtro global: período + hotel --}}
{{ $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 --}}
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'])
@include('admin.dashboard._content-list', ['items' => $contentPerformance['topPhotos'], 'labelKey' => 'title', 'subKey' => 'hotel', 'countKey' => 'total'])
@include('admin.dashboard._content-list', ['items' => $contentPerformance['topKits'], 'labelKey' => 'title', 'subKey' => 'hotel', 'countKey' => 'total'])
@include('admin.dashboard._content-list', ['items' => $contentPerformance['topCampaigns'], 'labelKey' => 'name', 'subKey' => null, 'countKey' => 'downloads_count'])
@if ($contentPerformance['unused']->isEmpty())
Todos os conteúdos publicados já tiveram pelo menos um download.
@else
@foreach ($contentPerformance['unused'] as $u)
- {{ $u->title }}{{ $u->created_at->format('d/m/Y') }}
@endforeach
@endif
@if ($contentPerformance['recentlyUpdated']->isEmpty())
Sem atualizações recentes de conteúdos.
@else
@foreach ($contentPerformance['recentlyUpdated'] as $u)
- {{ $u->title }}{{ \Illuminate\Support\Carbon::parse($u->uploaded_at)->format('d/m/Y H:i') }}
@endforeach
@endif
{{-- 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:
@foreach (array_slice($score['recommendations'], 0, 5) as $rec)
- {{ $rec }}
@endforeach
@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))