@php use Illuminate\Support\Str; $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]; }; $fR = $renderFirma($orden->firma_responsable); $fS = $renderFirma($orden->firma_supervisor); $kpiClass = function ($desv) { if ($desv === null) return ''; $abs = abs($desv); if ($abs <= 10) return 'ok'; if ($abs <= 25) return 'warn'; return 'bad'; }; @endphp {{-- ===== 1. CABECERA ===== --}}
Tipo de Documento: {{ $cab['tipo_documento'] }}
{{ $cab['empresa_larga'] }}
{{ $cab['direccion'] }}
Código de Formato:
{{ $cab['codigo_formato'] }}{{ $cab['fecha_codigo'] ? ' / ' . $cab['fecha_codigo'] : '' }}
Versión: {{ $cab['version'] }}

INFORME INTERNO

{{-- ===== 2. BLOQUE DE INFORMACIÓN ===== --}}
INFORME N° {{ $numero_informe }} Fecha: {{ $cab['fecha'] }}
Asunto: {{ $asunto }}
Dirigido a: @php $cargos = ['Gerente','Encargado','Super Intendente','Superintendente','Jefe','Director','Coordinador','Supervisor']; $esCargo = fn ($l) => collect($cargos)->contains(fn ($c) => stripos($l, $c) !== false); $esCC = fn ($l) => Str::startsWith(trim($l), ['CC:','cc:']); @endphp @foreach($destinatarios as $linea)

{{ $linea }}

@endforeach
Elaborado por: {{ $elaborado_nombre }} @if($elaborado_cargo){{ $elaborado_cargo }}@endif
Objetivo: {{ $objetivo }}
Alcance: {{ $alcance }}
{{-- ===== 3. DATOS TÉCNICOS DEL EQUIPO ===== --}} @if($orden->equipo)

1. DATOS TÉCNICOS DEL EQUIPO

Código{{ $orden->equipo->codigo }} Nombre{{ $orden->equipo->nombre }}
Marca{{ $orden->equipo->marca ?: '—' }} Modelo{{ $orden->equipo->modelo ?: '—' }}
Serie{{ $orden->equipo->serie ?: '—' }} Ubicación{{ $orden->equipo->ubicacion ?: '—' }}
Área{{ optional($orden->area ?? $orden->equipo->area)->nombre ?: '—' }} Sistema{{ optional($orden->sistema)->nombre ?: '—' }}
Fecha de instalación{{ optional($orden->equipo->fecha_instalacion)->format('d/m/Y') ?: '—' }} Horómetro actual{{ number_format((float) $orden->equipo->horometro_actual, 2) }} h
Plan asociado{{ $orden->plan ? $orden->plan->codigo . ' — ' . $orden->plan->nombre : '—' }}
Frecuencia OT {{ optional($orden->frecuencia)->nombre ?: '—' }}{{ optional($orden->frecuencia)->dias ? ' (' . $orden->frecuencia->dias . ' días)' : '' }} Prioridad{{ optional($orden->prioridad)->nombre ?: '—' }}
@endif {{-- ===== 4. INDICADORES DE CUMPLIMIENTO ===== --}}

2. INDICADORES DE CUMPLIMIENTO

Checklist completado
{{ $indicadores['checklist_pct'] }}%
{{ $indicadores['items_realizados'] }}/{{ $indicadores['items_total'] }} ítems
Cobertura LILA
{{ $indicadores['lila_pct'] }}%
L · I · Lu · A marcadas
Tiempo plan vs real
@if($indicadores['tiempo_desv_pct'] !== null) {{ ($indicadores['tiempo_desv_pct'] >= 0 ? '+' : '') . $indicadores['tiempo_desv_pct'] }}% @else — @endif
@if($indicadores['tiempo_plan_h']) plan {{ $indicadores['tiempo_plan_h'] }}h · @endif @if($indicadores['tiempo_real_h']) real {{ $indicadores['tiempo_real_h'] }}h @endif
Costo plan vs real
@if($indicadores['costo_desv_pct'] !== null) {{ ($indicadores['costo_desv_pct'] >= 0 ? '+' : '') . $indicadores['costo_desv_pct'] }}% @else — @endif
{{ $cab['moneda'] }} {{ number_format($indicadores['costo_real'], 2) }} @if($indicadores['costo_plan'] > 0) / plan {{ number_format($indicadores['costo_plan'], 2) }}@endif
@if($indicadores['horometro_inicio'] !== null || $indicadores['horometro_fin'] !== null)
Horómetro: inicio {{ $indicadores['horometro_inicio'] !== null ? number_format((float)$indicadores['horometro_inicio'], 2) . ' h' : '—' }} · fin {{ $indicadores['horometro_fin'] !== null ? number_format((float)$indicadores['horometro_fin'], 2) . ' h' : '—' }} @if($indicadores['horometro_delta'] !== null) · Δ {{ number_format($indicadores['horometro_delta'], 2) }} h @endif
@endif
{{-- ===== 5. CHECKLIST EJECUTADO ===== --}} @if($orden->items->count())

3. CHECKLIST EJECUTADO — 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 EstadoLectura Observaciones
{{ $it->numero_item }} {{ $it->descripcion }}{{ $it->$f ? 'X' : '' }}{{ str_replace('_',' ',$it->estado_item) }} {{ $it->lectura_condicion }} {{ $it->observaciones }}
@endif {{-- ===== 6. ANÁLISIS DE FALLA Y CAUSA RAÍZ (solo correctivas) ===== --}} @if($orden->clase === 'correctivo' && ($orden->falla_sintoma || $orden->falla_causa_probable || $orden->falla_causa_raiz || $orden->falla_accion_correctiva || $orden->falla_accion_preventiva))

4. ANÁLISIS DE FALLA Y CAUSA RAÍZ

@if($orden->falla_sintoma) @endif @if($orden->falla_causa_probable) @endif @if($orden->falla_causa_raiz) @endif @if($orden->falla_accion_correctiva) @endif @if($orden->falla_accion_preventiva) @endif
Síntoma observado{{ $orden->falla_sintoma }}
Causa probable{{ $orden->falla_causa_probable }}
Causa raíz{{ $orden->falla_causa_raiz }}
Acción correctiva{{ $orden->falla_accion_correctiva }}
Acción preventiva{{ $orden->falla_accion_preventiva }}
@endif {{-- ===== 7. PERSONAL ASIGNADO ===== --}} @if(count($personal) > 0)

5. PERSONAL ASIGNADO

@foreach($personal as $p) @endforeach
RolNombreCargoUsuarioHoras estimadas
{{ $p['rol'] }} {{ $p['usuario']->nombre_completo ?: $p['usuario']->usuario }} {{ $p['usuario']->cargo ?: '—' }} {{ $p['usuario']->usuario }} {{ $p['horas'] !== null ? $p['horas'] . ' h' : '—' }}
@endif {{-- ===== 8. RECURSOS UTILIZADOS ===== --}} @if($recursos['repuestos']->count() || $recursos['mano_obra']->count() || $recursos['otros']->count())

6. RECURSOS UTILIZADOS

@if($recursos['repuestos']->count())
Repuestos y materiales
@foreach($recursos['repuestos'] as $c) @endforeach
CódigoDescripción Ubicación Cantidad Costo unit. Total
{{ optional($c->repuesto)->codigo ?: '—' }} {{ $c->concepto }}{{ optional($c->repuesto)->descripcion ? ' · ' . Str::limit($c->repuesto->descripcion, 40) : '' }} {{ optional($c->repuesto)->ubicacion ?: '—' }} {{ rtrim(rtrim(number_format($c->cantidad,3),'0'),'.') }} {{ optional(optional($c->repuesto)->unidad)->codigo ?: '' }} {{ number_format($c->costo_unitario,2) }} {{ number_format($c->costo_total,2) }}
Subtotal repuestos {{ $cab['moneda'] }} {{ number_format($recursos['total_repuestos'],2) }}
@endif @if($recursos['mano_obra']->count())
Mano de obra
@foreach($recursos['mano_obra'] as $c) @endforeach
Concepto Horas Costo unit. Total
{{ $c->concepto }} {{ rtrim(rtrim(number_format($c->cantidad,3),'0'),'.') }} {{ number_format($c->costo_unitario,2) }} {{ number_format($c->costo_total,2) }}
Subtotal mano de obra {{ $cab['moneda'] }} {{ number_format($recursos['total_mano_obra'],2) }}
@endif @if($recursos['otros']->count())
Otros costos
@foreach($recursos['otros'] as $c) @endforeach
Concepto Cant. Costo unit. Total
{{ $c->concepto }} {{ rtrim(rtrim(number_format($c->cantidad,3),'0'),'.') }} {{ number_format($c->costo_unitario,2) }} {{ number_format($c->costo_total,2) }}
Subtotal otros {{ $cab['moneda'] }} {{ number_format($recursos['total_otros'],2) }}
@endif
COSTO TOTAL DE LA OT {{ $cab['moneda'] }} {{ number_format($orden->costo_total, 2) }}
@endif {{-- ===== 9. PROCEDIMIENTO PASO A PASO (línea de tiempo) ===== --}} @if($procedimiento->count())

7. PROCEDIMIENTO EJECUTADO — LÍNEA DE TIEMPO

@foreach($procedimiento as $l)
{{ $l->created_at->format('d/m/Y H:i') }} · {{ ucfirst(str_replace('_',' ', $l->accion)) }} @if($l->estado_anterior || $l->estado_nuevo) ({{ $l->estado_anterior ?? '—' }} → {{ $l->estado_nuevo ?? '—' }}) @endif
{{ optional($l->usuario)->nombre_completo ?: optional($l->usuario)->usuario ?: 'sistema' }} @if($l->detalle) — {{ $l->detalle }}@endif
@endforeach
@endif {{-- ===== 10. ANTECEDENTES DEL EQUIPO ===== --}} @if($antecedentes['ultimas']->count() > 0 || $antecedentes['acumulado_anio'] > 0)

8. ANTECEDENTES DEL EQUIPO

Costo acumulado {{ $antecedentes['anio'] ?? now()->year }}: {{ $cab['moneda'] }} {{ number_format($antecedentes['acumulado_anio'], 2) }} · año anterior: {{ $cab['moneda'] }} {{ number_format($antecedentes['acumulado_anterior'], 2) }}
@if($antecedentes['ultimas']->count()) @foreach($antecedentes['ultimas'] as $ot) @endforeach
CódigoTipoFrecuencia Fecha cierreEstadoCosto
{{ $ot->codigo }} {{ ucfirst($ot->clase) }} {{ optional($ot->frecuencia)->nombre ?: '—' }} {{ $ot->fecha_cierre?->format('d/m/Y') }} {{ optional($ot->estado)->nombre }} {{ $cab['moneda'] }} {{ number_format($ot->costo_total, 2) }}
@else
Sin antecedentes cerrados registrados para este equipo.
@endif
@endif {{-- ===== 11. ACCIONES DE SEGUIMIENTO ===== --}} @if($proximas->count())

9. ACCIONES DE SEGUIMIENTO — PRÓXIMAS OT

@foreach($proximas as $ot) @endforeach
CódigoTipoFrecuencia ProgramadaPrioridadEstado
{{ $ot->codigo }} {{ ucfirst($ot->clase) }} {{ optional($ot->frecuencia)->nombre ?: '—' }} {{ $ot->fecha_programada?->format('d/m/Y') }} {{ optional($ot->prioridad)->nombre ?: '—' }} {{ optional($ot->estado)->nombre }}
@endif {{-- ===== 12. CONCLUSIONES Y RECOMENDACIONES ===== --}} @if($orden->conclusiones || $orden->recomendaciones)

10. CONCLUSIONES Y RECOMENDACIONES

@if($orden->conclusiones)
Conclusiones: {{ $orden->conclusiones }}
@endif @if($orden->recomendaciones)
Recomendaciones: {{ $orden->recomendaciones }}
@endif
@endif {{-- ===== 13. OBSERVACIONES Y BITÁCORA ===== --}} @if($orden->observaciones || $orden->observaciones_cierre)

11. OBSERVACIONES

@if($orden->observaciones)
Observaciones: {{ $orden->observaciones }}
@endif @if($orden->observaciones_cierre)
Observaciones de cierre: {{ $orden->observaciones_cierre }}
@endif
@endif {{-- ===== 14. FIRMAS ===== --}}
@if($fR['img'])
@endif {{ $fR['texto'] ?: '—' }}
Responsable
@if($fS['img'])
@endif {{ $fS['texto'] ?: '—' }}
Supervisor
{{-- ===== PÁGINAS DE EVIDENCIAS (grid 2x3) ===== --}} @php $paginasFotos = $orden->fotos->chunk(6); @endphp @foreach($paginasFotos as $idxPagina => $grupo)

12. EVIDENCIAS FOTOGRÁFICAS — {{ $orden->codigo }} Página {{ $idxPagina + 1 }} de {{ count($paginasFotos) }} · {{ $orden->fotos->count() }} foto(s)

@php $items = $grupo->values(); $filas = ceil($items->count() / 2); @endphp @for($f = 0; $f < $filas; $f++) @for($c = 0; $c < 2; $c++) @php $idx = $f * 2 + $c; $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 {{-- ===== Pie de página repetible con numeración ===== --}}