@extends('layouts.admin.theme') @section('title', env('APP_NAME') . ' :: ' . __('Dashboard - Gerenciador de Demandas')) @php $prioConfig = [ 'critica' => ['label' => 'Crítica', 'color' => 'danger'], 'alta' => ['label' => 'Alta', 'color' => 'warning'], 'media' => ['label' => 'Média', 'color' => 'primary'], 'baixa' => ['label' => 'Baixa', 'color' => 'success'], ]; $totalAbertas = ($resumo['pendente'] ?? 0) + ($resumo['em_andamento'] ?? 0); // Pré-computa dados para Chart.js (só para o secretário) $tendenciaLabs = $tendenciaVals = $canalLabels = $canalValues = $canalColors = $unidadeLabels = $unidadeValues = []; if ($isSecretario) { $nomesMeses = ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez']; foreach ($tendencia['meses'] as $mes => $total) { [$ano, $num] = explode('-', $mes); $tendenciaLabs[] = $nomesMeses[(int)$num - 1] . '/' . substr($ano, 2); $tendenciaVals[] = $total; } $canalCores = [ 'portal' => '#2C499F', 'telefone' => '#198754', 'email' => '#fd7e14', 'presencial' => '#6f42c1', 'sei' => '#20c997', 'interno' => '#6c757d', ]; $canalLabels = $porCanal->pluck('canal')->toArray(); $canalValues = $porCanal->pluck('total')->toArray(); $canalColors = $porCanal->map(fn($c) => $canalCores[$c['chave']] ?? '#adb5bd')->values()->toArray(); $unidadeLabels = $porUnidade->pluck('nome')->toArray(); $unidadeValues = $porUnidade->pluck('total')->toArray(); } @endphp @section('content')
@include('components.buttons._headLineButtonsBackAdd', [ 'headLine' => " " . __('Dashboard - Gerenciador de Demandas'), 'routeBack' => 'admin.demandas.index', 'routeBackParams' => [], 'nameBack' => __('Quadro'), 'permission' => 'GERENCIADOR_DEMANDAS', 'tabs' => [ [ 'route' => 'admin.demandas.relatorio.index', 'label' => 'Relatório', 'class' => 'fa-file-chart-column', ], ], ])
@include('errors.messageFlash') {{-- ── STAT CARDS (sempre visíveis) ───────────────────────────────── --}} @php $statCards = [ ['label' => 'Total', 'value' => $resumo['total'], 'color' => 'primary', 'icon' => 'fa-clipboard-list'], ['label' => 'Em Andamento', 'value' => $resumo['em_andamento'], 'color' => 'info', 'icon' => 'fa-spinner'], ['label' => 'Pendentes', 'value' => $resumo['pendente'], 'color' => 'warning', 'icon' => 'fa-clock'], ['label' => 'Atendidas', 'value' => $resumo['atendido'], 'color' => 'success', 'icon' => 'fa-circle-check'], ['label' => 'Canceladas', 'value' => $resumo['cancelado'], 'color' => 'secondary', 'icon' => 'fa-ban'], ]; @endphp
@foreach ($statCards as $card)

{{ $card['value'] }}

{{ __($card['label']) }}
@endforeach
@if ($isSecretario) {{-- ════════════════════════════════════════════════════════════════ --}} {{-- VISÃO SECRETÁRIO --}} {{-- ════════════════════════════════════════════════════════════════ --}} {{-- Linha 1: Tendência | Por Responsável | Por Canal ──────────── --}}
{{-- Tendência Mensal --}}
{{ __('Tendência Mensal') }}
{{ __('Demandas abertas nos últimos 6 meses') }}
{{ $tendencia['qtd_atual'] }} {{ __('este mês') }}
@if ($tendencia['variacao'] !== null) {{ $tendencia['variacao'] >= 0 ? '+' : '' }}{{ $tendencia['variacao'] }}% {{ __('vs. mês anterior') }} @else - {{ __('vs. mês anterior') }} @endif
{{-- Por Responsável --}}
{{ __('Por Responsável') }}
{{ __('Quem está atendendo mais demandas') }} @if ($porResponsavel->isEmpty())
{{ __('Nenhum responsável encontrado.') }}
@else @php $maxResp = $porResponsavel->max('total') ?: 1; @endphp @foreach ($porResponsavel as $i => $resp) @php $cores = ['primary','success','warning','info','danger']; $cor = $cores[$i % 5]; $ini = collect(explode(' ', $resp['nome']))->map(fn($p) => strtoupper($p[0] ?? ''))->take(2)->join(''); $pct = round(($resp['total'] / $maxResp) * 100); @endphp
{{ $ini }}
{{ $resp['nome'] }} {{ $resp['total'] }}
@endforeach
{{ __('Mais ativo:') }} {{ $porResponsavel->first()['nome'] }}
@endif
{{-- Por Canal --}}
{{ __('Por Canal de Entrada') }}
{{ __('De onde vêm as demandas') }} @if ($porCanal->isEmpty())
{{ __('Nenhum canal registrado.') }}
@else
@foreach ($porCanal as $c) @php $cor = $canalCores[$c['chave']] ?? '#adb5bd'; @endphp
{{ $c['canal'] }} {{ $c['total'] }}
@endforeach
@endif
{{-- Linha 2: Por Unidade | Tempo Médio ───────────────────────── --}}
{{-- Por Unidade --}}
{{ __('Abertas por Unidade') }}
{{ __('Demandas pendentes e em andamento por setor') }} @if ($porUnidade->isEmpty())
{{ __('Nenhuma demanda aberta no momento.') }}
@else @endif
{{-- Tempo Médio --}}
{{ __('Tempo Médio de Atendimento') }}
{{ __('Dias para resolver, por prioridade') }} @php $maxTempo = collect($tempoMedio)->except('geral')->filter()->max() ?: 1; @endphp @foreach ($prioConfig as $key => $cfg) @php $val = $tempoMedio[$key]; @endphp
{{ __($cfg['label']) }}
@if ($val !== null)
@endif
{{ $val !== null ? $val . 'd' : '-' }}
@endforeach
@if ($tempoMedio['geral'] !== null) {{ __('Média geral:') }} {{ $tempoMedio['geral'] }} {{ __('dias') }} @else {{ __('Sem demandas atendidas ainda.') }} @endif
@else {{-- ════════════════════════════════════════════════════════════════ --}} {{-- VISÃO USUÁRIO COMUM --}} {{-- ════════════════════════════════════════════════════════════════ --}} {{-- Linha 1: Ação Requerida | Abertas por Prioridade ───────────── --}}
{{-- Ação Requerida --}}
{{ __('Ação Requerida') }}
{{ __('Itens que dependem de você agora') }} @if ($acaoRequerida['total'] === 0)
{{ __('Tudo em dia! Nenhum item aguardando sua ação.') }}
@else
{{ $acaoRequerida['total'] }} {{ __('item(ns) aguardando sua ação') }}
@endif
{{-- Abertas por Prioridade --}}
{{ __('Abertas por Prioridade') }}
{{ __('Demandas pendentes e em andamento') }} - {{ $totalAbertas }} {{ __('no total') }} @if ($totalAbertas === 0)
{{ __('Nenhuma demanda aberta no momento.') }}
@else @foreach ($prioConfig as $key => $cfg) @php $qtd = (int) ($abertasPorPrioridade[$key] ?? 0); $pct = $totalAbertas > 0 ? round(($qtd / $totalAbertas) * 100) : 0; @endphp
{{ __($cfg['label']) }} {{ $qtd }} @if ($qtd > 0) ({{ $pct }}%) @endif
@endforeach @endif
{{-- Linha 2: Próximas com Prazo | Recentes ─────────────────────── --}}
{{-- Próximas com Prazo --}}
{{ __('Prazos') }}
{{ __('Vencidas e nos próximos 7 dias') }}
@if ($proximasPrazo['vencidas']->isNotEmpty()) {{ $proximasPrazo['vencidas']->count() }} {{ __('vencida(s)') }} @endif
@if ($proximasPrazo['vencidas']->isEmpty() && $proximasPrazo['proximas']->isEmpty())
{{ __('Nenhum prazo vencido ou próximo.') }} @if ($totalAbertas > 0)
{{ __('Defina prazos ao criar demandas para receber alertas aqui.') }}
@endif
@endif {{-- Vencidas --}} @foreach ($proximasPrazo['vencidas'] as $dem) @php $diasAtraso = (int) \Carbon\Carbon::parse($dem->prazo)->diffInDays(now()); @endphp
{{ $dem->numero }} - {{ $dem->titulo }} {{ __('Venceu há') }} {{ $diasAtraso }}d
{{ $dem->prazo->format('d/m') }}
@endforeach {{-- Próximas --}} @foreach ($proximasPrazo['proximas'] as $dem) @php $diasRestantes = (int) now()->diffInDays(\Carbon\Carbon::parse($dem->prazo)); @endphp
{{ $dem->numero }} - {{ $dem->titulo }} {{ __('Vence em') }} {{ $diasRestantes }}d
{{ $dem->prazo->format('d/m') }}
@endforeach
{{-- Recentes --}}
{{ __('Recentes') }}
@if ($recentes->isEmpty())
{{ __('Nenhuma demanda encontrada.') }}
@else
@foreach ($recentes as $d) @php $sColor = match ($d->status) { 'em_andamento' => 'primary', 'pendente' => 'warning', 'atendido' => 'success', default => 'secondary', }; $pColor = match ($d->prioridade) { 'critica' => 'danger', 'alta' => 'warning', 'media' => 'info', default => 'success', }; @endphp @endforeach
{{ __('Nº') }} {{ __('Título') }} {{ __('Status') }} {{ __('Abertura') }}
{{ $d->numero }} {{ $d->titulo }} @if ($d->prazo && $d->prazo->isPast() && !in_array($d->status, ['atendido','cancelado'])) {{ __('Prazo vencido') }} @endif {{ __($statusLabels[$d->status] ?? $d->status) }} {{ $d->data_abertura?->format('d/m/Y') ?? '-' }}
@endif
@endif {{-- fim condicional secretário/usuário --}}
@endsection @if ($isSecretario) @push('after-scripts') @endpush @endif