{{-- Folha de Serviço do Dia — PDF (dompdf) Notas de compatibilidade com o dompdf: · sem flexbox e sem grid — a estrutura é toda em · fonte DejaVu Sans, a única que garante acentuação correta · imagens por caminho absoluto no disco; o dompdf não vai à rede --}} @php use App\Models\Jornada; $fmt = function ($minutos) { return Jornada::formataMinutos($minutos); }; $tempoTotal = $jornada->inicio_em ? $jornada->inicio_em->diffInMinutes($jornada->fim_em ?: now()) : 0; $kms = ($jornada->km_inicio !== null && $jornada->km_fim !== null) ? $jornada->km_fim - $jornada->km_inicio : null; $alertas = $jornada->alertas ?? []; $graves = collect($alertas)->where('gravidade', 'grave'); @endphp Folha de Serviço · {{ optional($motorista)->nome }} · {{ optional($jornada->data)->format('d/m/Y') }} {{-- ================= CABEÇALHO ================= --}}
@if($logo) @else TFUEL @endif
Folha de Serviço do Dia
{{ optional($motorista)->nome ?: '—' }} · {{ optional($jornada->data)->format('d/m/Y') }} @if($jornada->estado === 'reaberta') · continuação @endif
Registo n.º
#{{ $jornada->id }}
{{-- ================= IDENTIFICAÇÃO ================= --}}
Identificação
Motorista{{ optional($motorista)->nome ?: '—' }}
Nº interno{{ optional($motorista)->codigo_interno ?: '—' }}
Carta {{ optional($motorista)->numero_carta ?: '—' }} @if(optional($motorista)->validade_carta) · val. {{ $motorista->validade_carta->format('d/m/Y') }} @endif
CAM {{ optional($motorista)->cam ?: '—' }} @if(optional($motorista)->validade_cam) · val. {{ $motorista->validade_cam->format('d/m/Y') }} @endif
ADR {{ optional($motorista)->adr ?: '—' }} @if(optional($motorista)->validade_adr) · val. {{ $motorista->validade_adr->format('d/m/Y') }} @if($motorista->validade_adr->isPast()) expirado @endif @endif
Cartão tacográfico {{ optional($motorista)->cartao_tacografico ?: '—' }} @if(optional($motorista)->validade_cartao_tacografico) · val. {{ $motorista->validade_cartao_tacografico->format('d/m/Y') }} @endif
Data {{ optional($jornada->data)->format('d/m/Y') }} @if($jornada->tipo_dia !== 'util') {{ $jornada->tipo_dia_label }} @if($jornada->feriado_nome) {{ $jornada->feriado_nome }} @endif @endif
Início {{ optional($jornada->inicio_em)->format('H:i') ?: '—' }} @if($jornada->local_inicio)
{{ $jornada->local_inicio }}
@endif
Fim {{ optional($jornada->fim_em)->format('H:i') ?: '— em curso —' }} @if($jornada->estado === 'reaberta') reaberta @endif @if($jornada->local_fim)
{{ $jornada->local_fim }}
@endif
Viatura {{ $jornada->matricula ?: (optional($veiculo)->matricula ?: '—') }} @if(optional($veiculo)->marca) · {{ $veiculo->marca }} {{ $veiculo->modelo }} @endif
Quilómetros @if($kms !== null) {{ number_format($kms, 0, ',', ' ') }} km ({{ number_format($jornada->km_inicio, 0, ',', ' ') }} → {{ number_format($jornada->km_fim, 0, ',', ' ') }}) @else — @endif
Origem tempos {{ $jornada->fonte_tempos === 'tacografo' ? 'tacógrafo' : ($jornada->fonte_tempos === 'misto' ? 'misto' : 'app do motorista') }}
{{-- ================= TEMPOS ================= --}}
Tempos do dia
{{ $fmt($jornada->minutos_conducao) }}
Condução
{{ $fmt($jornada->minutos_pausa) }}
Pausas e almoço
{{ $fmt($jornada->minutos_outro_trabalho) }}
Outro trabalho
{{ $fmt($jornada->minutos_trabalho_total) }}
Trabalho total
Amplitude do dia: {{ $fmt($tempoTotal) }} · Disponibilidade/espera: {{ $fmt($jornada->minutos_disponibilidade) }} @if($jornada->tem_alerta) {{ count($alertas) }} alerta(s) de conformidade @else Sem alertas de conformidade @endif
@if(count($alertas))
@foreach($alertas as $alerta)
{{ $alerta['mensagem'] }} {{ $alerta['base_legal'] }}
@endforeach
@endif {{-- ================= RH: REFEIÇÕES E SUBSÍDIOS ================= --}} @php $valoresRh = $jornada->valoresRh(); $refeicoes = $jornada->refeicoes(); @endphp
Ajudas de custo e subsídio de risco
Rubrica Atribuída Valor
Ajuda de custo — almoço {{ $jornada->refeicao_almoco ? 'Sim' : '—' }} {{ $valoresRh['almoco'] > 0 ? number_format($valoresRh['almoco'], 2, ',', ' ') . ' €' : '—' }}
Ajuda de custo — jantar {{ $jornada->refeicao_jantar ? 'Sim' : '—' }} {{ $valoresRh['jantar'] > 0 ? number_format($valoresRh['jantar'], 2, ',', ' ') . ' €' : '—' }}
Ajuda de custo — dormida fora {{ $jornada->refeicao_dormida ? 'Sim' : '—' }} {{ $valoresRh['dormida'] > 0 ? number_format($valoresRh['dormida'], 2, ',', ' ') . ' €' : '—' }}
Subsídio de risco — dia com camião {{ $jornada->subsidio_risco ? 'Sim' : '—' }} {{ $valoresRh['risco'] > 0 ? number_format($valoresRh['risco'], 2, ',', ' ') . ' €' : '—' }}
Refeições marcadas pelo motorista no fecho do dia. @if($jornada->tipo_dia !== 'util') As horas deste dia não entram no cálculo das horas extra mensais. @endif Total: {{ number_format($valoresRh['total'], 2, ',', ' ') }} €
{{-- ================= PERÍODOS ================= --}}
Registo de períodos
@forelse($periodos as $periodo) @empty @endforelse
Período Início Fim Duração Origem Observações
{{ $periodo->tipo_label }} {{ optional($periodo->inicio_em)->format('H:i') }} {{ optional($periodo->fim_em)->format('H:i') ?: '—' }} {{ $fmt($periodo->minutos) }} {{ $periodo->origem }} @if($periodo->editado)editado@endif {{ $periodo->observacoes }}
Sem períodos registados.
{{-- ================= TRABALHO DO DIA ================= --}}
Mapas de carga e descargas
@forelse($mapas as $mapa)
{{ $mapa->referencia }} · carga {{ optional($mapa->data_carga)->format('d/m/Y') ?: '—' }} · {{ $mapa->matricula }} @if($mapa->enchimento) enchimento {{ number_format($mapa->enchimento->litros_total, 0, ',', ' ') }} L @else sem enchimento @endif
@if($mapa->enchimento && $mapa->enchimento->linhas->count()) @foreach($mapa->enchimento->linhas as $linha) @endforeach
CompartimentoProdutoLitros carregados
{{ $linha->compartimento ? '#' . $linha->compartimento : '—' }} {{ $linha->descricao ?: $linha->artigo }} {{ number_format($linha->litros, 0, ',', ' ') }}
@endif
@empty
Sem mapas de carga associados a esta jornada.
@endforelse @forelse($descargas as $descarga) @empty @endforelse
# Cliente Produto Prevista Entregue Horas Documentos
{{ $descarga->sequencia }} {{ $descarga->cliente_nome }} @if($descarga->requer_desconto_ga)GA@endif @if($descarga->estado === 'falhada')
Não realizada: {{ $descarga->motivo_falha }}
@endif
{{ $descarga->produto_descricao ?: $descarga->artigo }} {{ number_format($descarga->qtd_prevista, 0, ',', ' ') }} {{ $descarga->qtd_entregue !== null ? number_format($descarga->qtd_entregue, 0, ',', ' ') : '—' }} @if($descarga->a_caminho_em) saída {{ $descarga->a_caminho_em->format('H:i') }}
@endif @if($descarga->concluida_em) fim {{ $descarga->concluida_em->format('H:i') }} @endif
{{ $descarga->documentos->count() }} anexo(s)
Sem descargas nesta jornada.
{{-- ================= CRONOLOGIA ================= --}}
Cronologia do dia — registo completo de eventos
@forelse($eventos as $evento) @empty @endforelse
Hora Mapa Evento Origem Registado por
@if($evento->hora_estimada) {{ optional($evento->ocorrido_em)->format('d/m') }} s/ hora @else {{ optional($evento->ocorrido_em)->format('H:i') }} @endif {{ optional($evento->mapaCarga)->referencia ?: '—' }} {{ $evento->descricao }} @if($evento->latitude && $evento->longitude)
GPS {{ number_format($evento->latitude, 5, '.', '') }}, {{ number_format($evento->longitude, 5, '.', '') }}
@endif
{{ $evento->origem }} {{ optional($evento->user)->name ?: (optional($evento->driver)->first_name ?: '—') }}
Sem eventos registados nesta jornada.
{{-- ================= DECLARAÇÃO E ASSINATURAS ================= --}}
Declaração e assinaturas
O motorista abaixo assinado declara que os tempos de condução, pausas e repouso registados nesta folha correspondem ao serviço efetivamente prestado no dia {{ optional($jornada->data)->format('d/m/Y') }}, e que as quantidades entregues foram conferidas no ato da descarga.
@if($assinatura) Assinatura do motorista
{{ $jornada->assinatura_nome ?: optional($motorista)->first_name }} — motorista
Assinado na app em {{ optional($jornada->assinatura_em)->format('d/m/Y H:i') }}
@else
{{ optional($motorista)->nome }} — motorista
Sem assinatura digital — assinar à mão
@endif
Responsável de logística
Data ____ / ____ / ________