{{-- Lista do painel de TV. Linhas, não cartões: uma fila é uma coisa só, repetida — o que se lê é a coluna, e caixa em volta de cada item só acrescenta borda. As linhas são agrupadas por urgência, porque numa tela de aviso a pergunta não é "o que entrou por último" e sim "o que precisa de alguém agora". Datas absolutas ficaram de fora: quem lê de longe quer "há 12 min", não "07/08/2026 10:34". A conversão é feita no cliente (`data-desde`), porque a lista só é redesenhada quando a fila muda e uma hora escrita no HTML envelheceria na tela. `$painelItens` só chega no painel da Logística: é `[ticket_id => itens]` do ajuste de estoque. Onde ele existe, a linha mostra os produtos e o sentido do movimento no lugar do assunto do chamado. --}} @php $agora = now(); $painelItens ??= []; // Quantos produtos cabem numa linha antes de ela virar nota fiscal. $limiteItens = 2; $limite = $agora->copy()->subDays(3)->timestamp; // Agendado é silêncio esperado: tem data marcada, não está parado. [$parados, $fila] = collect($chamados)->partition( fn($c) => \App\Enums\ChamadoStatus::coerce($c['status']) !== \App\Enums\ChamadoStatus::Planejado && strtotime($c['date_mod']) <= $limite ); $grupos = [ ['titulo' => 'Precisam de atenção', 'perigo' => true, 'chamados' => $parados], ['titulo' => 'Na fila', 'perigo' => false, 'chamados' => $fila], ]; @endphp @if (count($chamados))
@foreach ($grupos as $grupo) @continue($grupo['chamados']->isEmpty())
{{ $grupo['titulo'] }} {{ $grupo['chamados']->count() }}
@foreach ($grupo['chamados'] as $chamado) @php $status = \App\Enums\ChamadoStatus::coerce($chamado['status']); $openedAt = \Carbon\Carbon::parse($chamado['date_creation']); $updatedAt = \Carbon\Carbon::parse($chamado['date_mod']); $podeParar = $status !== \App\Enums\ChamadoStatus::Planejado; $requesterName = trim((string) ($chamado['opener_name'] ?? '')); if ($requesterName === '') { $requesterName = trim((string) data_get($chamado['payload'], 'nome', data_get($chamado['payload'], 'name', ''))); } $supplierLabel = !empty($chamado['supplier_name']) ? $chamado['supplier_name'] : (!empty($chamado['suppliers_id']) ? 'Fornecedor #' . $chamado['suppliers_id'] : 'Planejado'); // Planejado mostra o fornecedor no lugar do rótulo; o // resto vem do enum. Status fora da fila cai em "Interno". $statusMeta = match (true) { $status === \App\Enums\ChamadoStatus::Planejado => ['label' => $supplierLabel, 'class' => $status->badgeClass()], $status !== null && $status->isEmAberto() => ['label' => $status->labelCurto(), 'class' => $status->badgeClass()], default => ['label' => 'Interno', 'class' => 'internal'], }; $itens = collect($painelItens[$chamado['id']] ?? []); $porMovimento = $itens->groupBy('movimento'); // Na Logística o assunto é sempre "Filial X - // Ajuste/Estoque": a filial diz mais e ocupa menos. $titulo = $itens->isNotEmpty() ? ($itens->first()['filial'] ?? $chamado['name']) : $chamado['name']; @endphp
#{{ $chamado['id'] }}

{{ Str::limit($titulo, 90) }}

{{-- "Novo" é ligado pelo relógio do cliente: nasce escondido e o CSS da linha o revela. --}} Novo {{-- Item pedido como "zerar" trava o encerramento até alguém contar: é o único estado da Logística que pede ação de quem passa. --}} @if ($itens->contains('pendente', true)) Aguardando contagem @endif
@if ($itens->isNotEmpty())
@foreach ($itens->take($limiteItens) as $item) @php // Ajustes antigos não têm sentido definido: // mostram o número sem sinal, não um errado. $sinal = match ($item['movimento']) { 'entrada' => '+', 'saida' => '−', default => '', }; @endphp {{ $item['pendente'] ? 'zerar' : $sinal . $item['quantidade'] }} {{ $item['codigo'] }} {{ $item['produto'] }} @endforeach @if ($itens->count() > $limiteItens) +{{ $itens->count() - $limiteItens }} {{ $itens->count() - $limiteItens === 1 ? 'item' : 'itens' }} @endif
@endif
{{ Str::limit($requesterName, 26) ?: '—' }} {{-- Onde há movimento de estoque é ele que ocupa a coluna de estado: numa TV da expedição, "Aberto" não diz nada que a lista já não diga, e o que se quer saber é se a mercadoria entra ou sai. --}} @if ($itens->isNotEmpty()) @foreach (['entrada', 'saida'] as $movimento) @continue(!$porMovimento->has($movimento)) {{ $porMovimento[$movimento]->first()['rotulo'] }} @endforeach @else {{ $statusMeta['label'] }} @endif {{-- No grupo de atenção o relógio que importa é o da última interação; na fila, o da abertura. Mostrar os dois era escrever "há 4 dias" duas vezes na mesma linha, porque no chamado parado eles são o mesmo número. --}} @if ($grupo['perigo']) — sem resposta @else {{-- Sem rótulo: "há 1h" ao lado de um chamado na fila só pode ser a idade dele. --}} — @endif
@endforeach
@endforeach
@else
Nenhum chamado na fila Tudo em dia por aqui.
@endif