@extends('layouts.app')
@section('title', 'OS ' . $ordem->numero_os)
@section('page_title', 'OS ' . $ordem->numero_os)
@section('content')
@php
$colorMap = [
'blue' => 'bg-blue-100 text-blue-700',
'indigo' => 'bg-indigo-100 text-indigo-800',
'teal' => 'bg-teal-100 text-teal-800',
'red' => 'bg-red-100 text-red-700',
'orange' => 'bg-orange-100 text-orange-700',
'gray' => 'bg-gray-100 text-gray-700',
];
$badge = $colorMap[$ordem->statusColor()] ?? 'bg-gray-100 text-gray-700';
@endphp
{{-- Cabeçalho --}}
{{ $ordem->numero_os }}
{{ $ordem->statusLabel() }}
@if($ordem->finalizado)
Finalizado
@endif
@if($ordem->solicitacao)
Solicitação:
{{ $ordem->solicitacao->numero_solicitacao }}
@endif
Cliente: {{ $ordem->cliente_solicitante }}
@if($ordem->pedido_cliente)
Pedido / OS Cliente: {{ $ordem->pedido_cliente }}@endif
Data: {{ $ordem->data_servico?->format('d/m/Y') }}
@if($ordem->operador)
Operador: {{ $ordem->operador->name }}
@endif
{{-- Alertas --}}
@if(session('success'))
{{ session('success') }}
@endif
@if(session('error'))
{{ session('error') }}
@endif
@if($errors->any())
@foreach($errors->all() as $error)- {{ $error }}
@endforeach
@endif
{{-- Linha do tempo operacional --}}
@php
$timeline = [
['label'=>'Início da viagem','data'=>$ordem->inicio_viagem_em,'duracao'=>null,'km'=>null,'tipo'=>'vazio'],
['label'=>'Chegada na origem','data'=>$ordem->chegada_origem_em,'duracao'=>$ordem->tempoAteOrigemMinutos(),'km'=>$ordem->km_vazio_ate_origem,'tipo'=>'vazio'],
['label'=>'Saída da origem','data'=>$ordem->saida_origem_em,'duracao'=>$ordem->permanenciaOrigemMinutos(),'km'=>null,'tipo'=>'parada'],
['label'=>'Chegada no destino','data'=>$ordem->chegada_destino_em,'duracao'=>$ordem->transitoDestinoMinutos(),'km'=>$ordem->kmCarregado(),'tipo'=>'carregado'],
['label'=>'Saída do destino','data'=>$ordem->saida_destino_em,'duracao'=>$ordem->permanenciaDestinoMinutos(),'km'=>null,'tipo'=>'parada'],
['label'=>'Ponto de espera','data'=>$ordem->chegada_ponto_espera_em,'duracao'=>$ordem->tempoPosDestinoMinutos(),'km'=>$ordem->km_vazio_pos_destino,'tipo'=>'vazio'],
];
$primeiroPendente = collect($timeline)->search(fn ($etapa) => !$etapa['data']);
$primeiroPendente = $primeiroPendente === false ? count($timeline) : $primeiroPendente;
@endphp
Linha do Tempo Operacional
Evolução real da viagem, com tempos e quilômetros conhecidos em cada fase.
{{ \App\Models\OrdemServico::formatarDuracao($ordem->tempoOperacaoTotalMinutos()) }} operação
{{ $ordem->kmOperacaoConsolidado() !== null ? number_format($ordem->kmOperacaoConsolidado(),3,',','.') . ' km' : '—' }} consolidados
@foreach($timeline as $i => $etapa)
@php
$concluida = (bool)$etapa['data'];
$atual = !$concluida && $i === $primeiroPendente && !in_array($ordem->status, ['concluido','cancelado','negado'], true);
$corTexto = $etapa['tipo'] === 'carregado' ? 'text-blue-700' : ($etapa['tipo'] === 'parada' ? 'text-amber-700' : 'text-emerald-700');
@endphp
@if($i < count($timeline)-1)
@endif
{{ $concluida ? '✓' : $i + 1 }}
{{ $etapa['label'] }}
{{ $etapa['data'] ? $etapa['data']->format('d/m H:i') : ($atual ? 'Próxima etapa' : 'Pendente') }}
@if($etapa['duracao'] !== null)
{{ \App\Models\OrdemServico::formatarDuracao($etapa['duracao']) }}
@endif
@if($etapa['km'] !== null)
{{ number_format($etapa['km'],3,',','.') }} km
@endif
@endforeach
@if($ordem->percentualKmCarregado() !== null)
Produtivo{{ number_format($ordem->percentualKmCarregado(),1,',','.') }}%
Vazio{{ number_format($ordem->percentualKmVazio(),1,',','.') }}%
Parado origem + destino{{ \App\Models\OrdemServico::formatarDuracao($ordem->tempoParadoMinutos()) }}
Km carregados{{ number_format($ordem->kmCarregado(),3,',','.') }} km
@endif
{{-- Formulário de edição --}}
@php
// Prepara a matriz no PHP antes de serializar para JavaScript.
// Evita que o parser Blade tente interpretar arrays/arrow functions dentro de @json(...).
$composicoesPorCavalo = $composicoes
->groupBy('cavalo_id')
->map(function ($grupo) {
return $grupo
->map(function ($c) {
return [
'id' => $c->carreta?->id,
'placa' => $c->carreta?->placa,
'subtipo' => $c->carreta?->subtipo,
'capacidade' => $c->carreta?->capacidade_ton !== null
? (float) $c->carreta->capacidade_ton
: null,
];
})
->filter(fn ($c) => !empty($c['id']))
->values();
});
@endphp
@endsection