@php $renderFirma = function ($valor) { if (!$valor) return ['img' => null, 'texto' => '']; if (str_starts_with($valor, 'IMG:')) { [$ruta, $nombre, $fecha] = array_pad(explode('|', substr($valor, 4)), 3, ''); $abs = public_path('storage/' . $ruta); return [ 'img' => file_exists($abs) ? $abs : null, 'texto' => trim($nombre . ' — ' . $fecha, ' —'), ]; } if (str_starts_with($valor, 'TXT:')) { [$nombre, $fecha] = array_pad(explode('|', substr($valor, 4)), 2, ''); return ['img' => null, 'texto' => trim($nombre . ' — ' . $fecha, ' —')]; } return ['img' => null, 'texto' => $valor]; }; $firmaR = $renderFirma($orden->firma_responsable); $firmaS = $renderFirma($orden->firma_supervisor); $paginasFotos = $orden->fotos->chunk(6); @endphp {{-- ===== PÁGINA 1: datos, checklist, costos, comentarios, firmas ===== --}}

{{ $appConfig['empresa'] }} — Orden de trabajo {{ ucfirst($orden->clase) }}

{{ $orden->codigo }}
{{ $orden->codigo }}
Emitido: {{ now()->format('d/m/Y H:i') }}
Equipo:{{ optional($orden->equipo)->codigo }} {{ optional($orden->equipo)->nombre }} Área:{{ optional($orden->area ?? $orden->equipo?->area)->nombre }} Programada:{{ $orden->fecha_programada?->format('d/m/Y') }}
Inicio:{{ $orden->fecha_inicio?->format('d/m/Y H:i') ?: '—' }} Cierre:{{ $orden->fecha_cierre?->format('d/m/Y H:i') ?: '—' }} Responsable:{{ optional($orden->responsable)->nombre_completo ?: '—' }}
Estado:{{ optional($orden->estado)->nombre }} Prioridad:{{ optional($orden->prioridad)->nombre ?: '—' }} Horómetro:{{ $orden->horometro_inicio ?: '—' }} → {{ $orden->horometro_fin ?: '—' }}
@if($orden->descripcion)
Descripción: {{ $orden->descripcion }}
@endif @if($orden->items->count())

Checklist — L: limpieza · I: inspección · Lu: lubricación · A: ajuste

@foreach($orden->items as $it) @foreach(['lila_l_limpieza','lila_i_inspeccion','lila_l_lubricacion','lila_a_ajuste'] as $f) @endforeach @endforeach
#Descripción LILuA Estado Lectura Observaciones
{{ $it->numero_item }} {{ $it->descripcion }}{{ $it->$f ? 'X' : '' }}{{ str_replace('_',' ',$it->estado_item) }} {{ $it->lectura_condicion }} {{ $it->observaciones }}
@endif @if($orden->costos->count())

Costos

@foreach($orden->costos as $c) @endforeach
ConceptoTipoCant.C. unit.Total
{{ $c->concepto }} {{ str_replace('_',' ',$c->tipo) }} {{ rtrim(rtrim(number_format($c->cantidad, 3),'0'),'.') }} {{ number_format($c->costo_unitario,2) }} {{ number_format($c->costo_total,2) }}
TOTAL {{ ($appConfig['moneda_simbolo'] ?? 'S/') }} {{ number_format($orden->costo_total,2) }}
@endif @if($orden->observaciones || $orden->observaciones_cierre || $orden->logs->count())

Comentarios y bitácora

@if($orden->observaciones)
Observaciones: {{ $orden->observaciones }}
@endif @if($orden->observaciones_cierre)
Observaciones de cierre: {{ $orden->observaciones_cierre }}
@endif @if($orden->logs->count())
@foreach($orden->logs->take(4) as $l)
{{ ucfirst(str_replace('_',' ', $l->accion)) }} @if($l->estado_anterior || $l->estado_nuevo) [{{ $l->estado_anterior ?? '—' }} → {{ $l->estado_nuevo ?? '—' }}] @endif @if($l->detalle) — {{ $l->detalle }} @endif · {{ optional($l->usuario)->usuario }} · {{ $l->created_at->format('d/m/Y H:i') }}
@endforeach
@endif @endif
@if($firmaR['img'])
@endif {{ $firmaR['texto'] }}
Responsable
@if($firmaS['img'])
@endif {{ $firmaS['texto'] }}
Supervisor
{{-- ===== PÁGINAS SIGUIENTES: evidencias fotográficas en grid 2x3 ===== --}} @foreach($paginasFotos as $idxPagina => $grupo)

Evidencias fotográficas — {{ $orden->codigo }} Página {{ $idxPagina + 2 }} de {{ count($paginasFotos) + 1 }}

{{ optional($orden->equipo)->codigo }} · {{ optional($orden->equipo)->nombre }} · {{ $orden->fotos->count() }} foto(s) en total · mostrando {{ $idxPagina * 6 + 1 }}–{{ $idxPagina * 6 + $grupo->count() }}
@php $items = $grupo->values(); $totalFilas = ceil($items->count() / 2); @endphp @for($fila = 0; $fila < $totalFilas; $fila++) @for($col = 0; $col < 2; $col++) @php $idx = $fila * 2 + $col; $foto = $items[$idx] ?? null; @endphp @endfor @endfor
@if($foto) @php $abs = public_path('storage/' . $foto->ruta); $existe = file_exists($abs); @endphp
@if($existe) @else
imagen no disponible
@endif {{ strtoupper($foto->tipo) }}
@if($foto->descripcion){{ $foto->descripcion }}@else Sin descripción @endif
{{ optional($foto->subidoPor)->nombre_completo ?: optional($foto->subidoPor)->usuario ?: 'Desconocido' }} · {{ $foto->created_at?->format('d/m/Y H:i') }}
@endif
@endforeach