@extends('layouts.app') @section('title', 'Histórico de OS & Importação') @section('page_title', 'Histórico de OS') @section('content') @php $auditLabels = [ 'sem_os' => 'OS não informada', 'sem_cliente' => 'Cliente não informado', 'cliente_nao_vinculado' => 'Cliente sem vínculo cadastral', 'sem_origem' => 'Origem não informada', 'origem_nao_vinculada' => 'Origem sem vínculo cadastral', 'sem_destino' => 'Destino não informado', 'destino_nao_vinculado' => 'Destino sem vínculo cadastral', 'sem_motorista' => 'Motorista não informado', 'motorista_nao_vinculado' => 'Motorista sem vínculo cadastral', 'sem_cavalo' => 'Cavalo não informado', 'cavalo_nao_vinculado' => 'Cavalo sem vínculo cadastral', 'sem_carreta' => 'Carreta não informada', 'carreta_nao_vinculada' => 'Carreta sem vínculo cadastral', ]; $activeAudit = request('auditoria'); $hasFilters = collect(request()->except(['page', 'sort', 'direction', 'per_page'])) ->filter(fn($v) => $v !== null && $v !== '') ->isNotEmpty(); $sortUrl = function (string $column) use ($sort, $dir) { $newDir = $sort === $column && $dir === 'asc' ? 'desc' : 'asc'; return route('admin.historico.index', array_merge(request()->except('page'), [ 'sort' => $column, 'direction' => $newDir, ])); }; $sortMark = fn(string $column) => $sort === $column ? ($dir === 'asc' ? '↑' : '↓') : ''; @endphp
{{-- Progresso da importação --}}

Preparando...
Inseridos

Sheets puladas

✓ Importação concluída com sucesso! Recarregar página

Consulte também storage/logs/laravel.log.
@if(session('success'))
{{ session('success') }}
@endif @if(session('error'))
{{ session('error') }}
@endif {{-- Totais globais --}}
Σ

Total no histórico

{{ number_format($total, 0, ',', '.') }}

Importados (XLSX)

{{ number_format($importados, 0, ',', '.') }}

S

Gerados pelo sistema

{{ number_format($sistema, 0, ',', '.') }}

{{-- Qualidade dos dados --}}

Qualidade dos dados

Indicadores calculados sobre os registros atualmente filtrados.

Registros analisados

{{ number_format($qualidade['total'], 0, ',', '.') }}

@php $qualityCards = [ ['label' => 'Número da OS', 'data' => $qualidade['os'], 'type' => 'field'], ['label' => 'Cliente', 'data' => $qualidade['cliente'], 'type' => 'link'], ['label' => 'Motorista', 'data' => $qualidade['motorista'], 'type' => 'link'], ['label' => 'Origem', 'data' => $qualidade['origem'], 'type' => 'link'], ['label' => 'Destino', 'data' => $qualidade['destino'], 'type' => 'link'], ['label' => 'Cavalo', 'data' => $qualidade['cavalo'], 'type' => 'link'], ['label' => 'Carreta', 'data' => $qualidade['carreta'], 'type' => 'link'], ]; @endphp @foreach($qualityCards as $card)

{{ $card['label'] }}

{{ $card['data']['percentual_preenchimento'] ?? $card['data']['percentual'] }}%

{{ number_format($card['data']['informados'], 0, ',', '.') }} preenchidos de {{ number_format($qualidade['total'], 0, ',', '.') }}

@if($card['type'] === 'link')

{{ number_format($card['data']['vinculados'], 0, ',', '.') }} vinculados ao cadastro · {{ $card['data']['percentual_vinculo'] }}%

@else

{{ number_format($card['data']['sem_info'], 0, ',', '.') }} sem informação

@endif
@endforeach @php $rotaInformadaPct = $qualidade['total'] > 0 ? round(($qualidade['rota']['informados'] / $qualidade['total']) * 100, 1) : 0; $rotaVinculoPct = $qualidade['rota']['informados'] > 0 ? round(($qualidade['rota']['vinculados'] / $qualidade['rota']['informados']) * 100, 1) : 0; @endphp

Rota completa

{{ $rotaInformadaPct }}%

{{ number_format($qualidade['rota']['informados'], 0, ',', '.') }} com origem + destino

{{ number_format($qualidade['rota']['vinculados'], 0, ',', '.') }} rotas totalmente vinculadas · {{ $rotaVinculoPct }}%

“Preenchido” significa que o XLSX trouxe texto para o campo. “Vinculado” significa que esse texto também encontrou correspondência no respectivo cadastro do Sistema MD.
{{-- Filtros --}}

Filtros e auditoria

Use os filtros para conferir grupos específicos de registros importados.

@if($periodo?->inicio && $periodo?->fim)Período disponível: {{ \Carbon\Carbon::parse($periodo->inicio)->format('d/m/Y') }} a {{ \Carbon\Carbon::parse($periodo->fim)->format('d/m/Y') }}@endif
@if($activeAudit)@endif
@if($hasFilters)Limpar filtros@endif Exportar XLSX filtrado
Auditoria rápida: @foreach($auditLabels as $key => $label) @php $active = $activeAudit === $key; @endphp {{ $label }} {{ number_format($auditoriaContagens[$key] ?? 0, 0, ',', '.') }} @endforeach @if($activeAudit)remover auditoria@endif
{{-- Grade do histórico --}}

Registros do histórico

Exibindo {{ number_format($registros->firstItem() ?? 0, 0, ',', '.') }}–{{ number_format($registros->lastItem() ?? 0, 0, ',', '.') }} de {{ number_format($registros->total(), 0, ',', '.') }} registros encontrados.

@if($activeAudit)Auditoria: {{ $auditLabels[$activeAudit] ?? $activeAudit }}@endif
@foreach([ 'data_servico'=>'Data','hora_coleta'=>'Hora','numero_os'=>'OS','cliente_nome'=>'Cliente', 'origem_texto'=>'Origem','destino_texto'=>'Destino','tipo_veiculo_solicitado'=>'Tipo veículo', 'cavalo_placa'=>'Cavalo','carreta_placa'=>'Carreta','motorista_nome'=>'Motorista','status'=>'Status','fonte'=>'Fonte' ] as $col => $label) @endforeach @forelse($registros as $h) @empty @endforelse
{{ $label }} {{ $sortMark($col) }}Detalhe
{{ $h->data_servico?->format('d/m/Y') ?? '—' }} {{ $h->hora_coleta ?: '—' }} {{ $h->numero_os ?: '—' }}
{{ $h->cliente_nome ?: '—' }}
@if($h->cliente_nome){{ $h->cliente_id ? '✓ vinculado' : '• sem vínculo' }}@endif
{{ $h->origem_texto ?: '—' }}
@if($h->origem_texto){{ $h->origem_id ? '✓ vinculada' : '• sem vínculo' }}@endif
{{ $h->destino_texto ?: '—' }}
@if($h->destino_texto){{ $h->destino_id ? '✓ vinculado' : '• sem vínculo' }}@endif
{{ $h->tipo_veiculo_solicitado ?: '—' }}
{{ $h->cavalo_placa ?: '—' }}
@if($h->cavalo_placa){{ $h->veiculo_id ? '✓ vinculado' : '• sem vínculo' }}@endif
{{ $h->carreta_placa ?: '—' }}
@if($h->carreta_placa){{ $h->carreta_id ? '✓ vinculada' : '• sem vínculo' }}@endif
{{ $h->motorista_nome ?: '—' }}
@if($h->motorista_nome){{ $h->motorista_id ? '✓ vinculado' : '• sem vínculo' }}@endif
{{ $h->status ?: '—' }} {{ $h->fonte === 'importacao' ? 'XLSX' : 'Sistema' }} @php $temPendenciaVinculo = ($h->cliente_nome && !$h->cliente_id) || ($h->origem_texto && !$h->origem_id) || ($h->destino_texto && !$h->destino_id) || ($h->motorista_nome && !$h->motorista_id) || ($h->cavalo_placa && !$h->veiculo_id) || ($h->carreta_placa && !$h->carreta_id); @endphp {{ $temPendenciaVinculo ? 'Vincular' : 'Ver' }}
Nenhum registro encontrado com os filtros selecionados.
@if($registros->hasPages())
{{ $registros->links() }}
@endif
{{-- Importação, recolhida por padrão para priorizar a auditoria --}}
@csrf

Selecione o arquivo Programacao_Operacao_XXXX.xlsx. Cada sheet DDMMAAAA representa um dia de operação.

()

Na reimportação, os dados anteriores são substituídos somente após a conclusão bem-sucedida. Registros com fonte = sistema não são afetados.

@endsection