@php $cards = $dashboard['cards'] ?? []; $visible = \App\Support\DashboardTorreCards::visibleMap(); $format = fn (int|float $value): string => number_format((float) $value, 0, ',', '.'); $progress = fn (int $done, int $total): int => $total > 0 ? min(100, (int) round(($done / $total) * 100)) : 0; $labels = [ 'indicadores' => ['Indicadores da Torre', 'Entregas, coletas, ocorrencias, OTIF e demais cards habilitados'], 'evolucao' => ['Evolucao operacional', 'Movimentos, percentual concluido e operacoes agendadas'], 'ocorrencias' => ['Ocorrencias pontuadas', 'Quantidade por motivo de ocorrencia e codigo do cliente'], 'regioes' => ['Notas fiscais por regiao', 'Distribuicao das notas fiscais por cidade de destino'], ]; [$titulo, $subtitulo] = $labels[$painel]; $inicioLabel = \Illuminate\Support\Carbon::parse($filters['inicio'])->format('d/m/Y'); $fimLabel = \Illuminate\Support\Carbon::parse($filters['fim'])->format('d/m/Y'); $periodoLabel = $filters['inicio'] === $filters['fim'] ? $inicioLabel : $inicioLabel.' a '.$fimLabel; $movimentos = $dashboard['movimentos'] ?? ['abertos' => 0, 'concluidos' => 0, 'ocorrencias' => 0, 'em_rota' => 0, 'total' => 0]; $agendados = $dashboard['movimentos_agendados'] ?? ['abertos' => 0, 'concluidos' => 0, 'ocorrencias' => 0, 'em_rota' => 0, 'total' => 0]; $slices = fn (array $data): array => [ ['label' => 'Em aberto', 'value' => (int) ($data['abertos'] ?? 0), 'color' => '#f59e0b'], ['label' => 'Concluidos', 'value' => (int) ($data['concluidos'] ?? 0), 'color' => '#22c55e'], ['label' => 'Ocorrencias', 'value' => (int) ($data['ocorrencias'] ?? 0), 'color' => '#ef4444'], ['label' => 'Em rota', 'value' => (int) ($data['em_rota'] ?? 0), 'color' => '#3b82f6'], ]; $pieStyle = function (array $items): string { $total = array_sum(array_column($items, 'value')); if ($total <= 0) return 'background:#e5e7eb;'; $cursor = 0; $parts = []; foreach ($items as $item) { $start = $cursor; $cursor += ($item['value'] / $total) * 100; $parts[] = $item['color'].' '.$start.'% '.$cursor.'%'; } return 'background:conic-gradient('.implode(', ', $parts).');'; }; $movimentoSlices = $slices($movimentos); $agendadoSlices = $slices($agendados); $evolucao = $progress((int) ($movimentos['concluidos'] ?? 0), (int) ($movimentos['total'] ?? 0)); $cardItems = [ ['key'=>'entregas','label'=>'Entregas','value'=>$cards['entregas'] ?? 0,'done'=>$cards['entregas_executadas'] ?? 0,'total'=>$cards['entregas'] ?? 0,'detail'=>'entregues','color'=>'#2563eb','sigla'=>'ENT'], ['key'=>'coletas','label'=>'Coletas','value'=>$cards['coletas'] ?? 0,'done'=>$cards['coletas_executadas'] ?? 0,'total'=>$cards['coletas'] ?? 0,'detail'=>'coletadas','color'=>'#16a34a','sigla'=>'COL'], ['key'=>'transferencias','label'=>'Transferencias','value'=>$cards['transferencias'] ?? 0,'done'=>$cards['transferencias_concluidas'] ?? 0,'total'=>$cards['transferencias'] ?? 0,'detail'=>'concluidas','color'=>'#7c3aed','sigla'=>'TRA'], ['key'=>'reentregas','label'=>'Reentregas','value'=>$cards['reentregas'] ?? 0,'done'=>$cards['reentregas_concluidas'] ?? 0,'total'=>$cards['reentregas'] ?? 0,'detail'=>'concluidas','color'=>'#dc2626','sigla'=>'REE'], ['key'=>'ocorrencias','label'=>'Ocorrencias','value'=>max(($cards['ocorrencias_total'] ?? 0)-($cards['ocorrencias_tratadas'] ?? 0),0),'done'=>$cards['ocorrencias_tratadas'] ?? 0,'total'=>$cards['ocorrencias_total'] ?? 0,'detail'=>'tratadas','color'=>'#d97706','sigla'=>'OCO'], ['key'=>'app_acessos','label'=>'Acessos ao aplicativo','value'=>$cards['motoristas_app'] ?? 0,'done'=>$cards['motoristas_app'] ?? 0,'total'=>$cards['motoristas_operacionais'] ?? 0,'detail'=>'com acesso','color'=>'#0284c7','sigla'=>'APP'], ['key'=>'veiculos_rota','label'=>'Veiculos em rota','value'=>$cards['veiculos_em_rota'] ?? 0,'done'=>$cards['veiculos_em_rota_concluidos'] ?? 0,'total'=>$cards['veiculos_em_rota_total_movimentos'] ?? 0,'detail'=>'movimentos concluidos','color'=>'#475569','sigla'=>'VEI'], ['key'=>'entregas_rota','label'=>'Entregas por rota','value'=>$cards['media_entregas_por_rota'] ?? 0,'done'=>$cards['entregas_por_rota_concluidas'] ?? 0,'total'=>$cards['entregas_por_rota_total'] ?? 0,'detail'=>'concluidas','color'=>'#7c3aed','sigla'=>'ROT'], ['key'=>'custo_viagem','label'=>'Custo por viagem','value'=>'R$ '.number_format((float)($cards['custo_medio_por_viagem'] ?? 0),2,',','.'),'done'=>1,'total'=>1,'detail'=>'media estimada','color'=>'#ca8a04','sigla'=>'CUS'], ['key'=>'eficiencia','label'=>'Eficiencia da operacao','value'=>$progress((int)($cards['eficiencia_concluidos'] ?? 0),(int)($cards['eficiencia_total'] ?? 0)).'%','done'=>$cards['eficiencia_concluidos'] ?? 0,'total'=>$cards['eficiencia_total'] ?? 0,'detail'=>'concluidos','color'=>'#16a34a','sigla'=>'EFI'], ['key'=>'otif','label'=>'OTIF','value'=>$progress((int)($cards['otif_concluidos'] ?? 0),(int)($cards['otif_total'] ?? 0)).'%','done'=>$cards['otif_concluidos'] ?? 0,'total'=>$cards['otif_total'] ?? 0,'detail'=>'entregas no prazo','color'=>'#059669','sigla'=>'OTF'], ['key'=>'entregas_fora_prazo','label'=>'Entregas fora do prazo','value'=>$cards['otif_fora_prazo'] ?? 0,'done'=>$cards['otif_fora_prazo'] ?? 0,'total'=>$cards['otif_entregues'] ?? 0,'detail'=>'entregas atrasadas','color'=>'#dc2626','sigla'=>'ATR'], ]; $cardItems = collect($cardItems)->filter(fn ($item) => $visible[$item['key']] ?? true)->values(); $ocorrencias = $dashboard['ocorrencias_por_motivo'] ?? []; $maxOcorrencia = max(array_column($ocorrencias, 'total') ?: [0]); $maxRegiao = max(array_column($notasPorRegiao, 'total') ?: [0]); $logo = $filters['tema'] === 'escuro' ? ($tenant?->logo_dark_path ?: $tenant?->logo_path ?: $tenant?->logo_small_path) : ($tenant?->logo_path ?: $tenant?->logo_small_path); $logoUrl = $logo ? asset('storage/'.ltrim($logo, '/')) : null; @endphp @once @endonce
@if($logoUrl) {{ $tenant?->name ?: 'Cliente' }} @else {{ strtoupper(substr($tenant?->name ?: 'Kreative', 0, 2)) }} @endif
{{ $titulo }}{{ $subtitulo }} ยท {{ $periodoLabel }}
{{ $filters['tema']==='escuro'?'Claro':'Escuro' }} 03:00
@if($painel === 'indicadores')
@foreach($cardItems as $card) @php($pct = $progress((int)$card['done'], (int)$card['total']))
{{ $card['sigla'] }}{{ $card['label'] }}
{{ is_numeric($card['value']) ? $format($card['value']) : $card['value'] }}
{{ $format($card['done']) }}/{{ $format($card['total']) }} {{ $card['detail'] }}{{ $pct }}%
@endforeach
@elseif($painel === 'evolucao')
@foreach([['Movimentos',$movimentoSlices],['Agendados',$agendadoSlices]] as [$nome,$itens]) @if($nome === 'Agendados')
@else
@endif
{{ $nome }}{{ $nome==='Movimentos'?'NFs, coletas, reentregas e transferencias':'Movimentos com data e hora de entrega' }}
{{ $format(array_sum(array_column($itens,'value'))) }}
{{ $format(array_sum(array_column($itens,'value'))) }}
@foreach($itens as $item)
{{ $item['label'] }}{{ $format($item['value']) }}
@endforeach
@endforeach
Evolucao operacionalMovimentos ja concluidos
{{ $evolucao }}%
{{ $evolucao }}%{{ $format($movimentos['concluidos'] ?? 0) }} concluidos
@elseif($painel === 'ocorrencias')
Ocorrencias pontuadasQuantidade por motivo e codigo do cliente
{{ $format(array_sum(array_column($ocorrencias,'total'))) }}
@if(count($ocorrencias))
@foreach($ocorrencias as $item)@php($pct=max(7,(int)round(($item['total']/max($maxOcorrencia,1))*100)))
{{ $format($item['total']) }}
{{ $item['motivo'] }}{{ $item['codigo_cliente'] }}
@endforeach
@else
Sem ocorrencias pontuadas no periodo.
@endif
@else
Notas fiscais por regiaoQuantidade por cidade de destino
{{ $format(array_sum(array_column($notasPorRegiao,'total'))) }}
@if(count($notasPorRegiao))
@foreach($notasPorRegiao as $regiao)@php($pct=max(3,(int)round(($regiao['total']/max($maxRegiao,1))*100)))
{{ $regiao['cidade'] }}{{ $regiao['uf'] }}
{{ $format($regiao['total']) }}
@endforeach
@else
Sem notas fiscais no periodo selecionado.
@endif
@endif
@once @endonce