@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 ===== --}}
@if(file_exists($cab['logo']))
@endif
|
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
| # | Descripción |
L | I | Lu | A |
Estado | Lectura |
Observaciones |
@foreach($orden->items as $it)
| {{ $it->numero_item }} |
{{ $it->descripcion }} |
@foreach(['lila_l_limpieza','lila_i_inspeccion','lila_l_lubricacion','lila_a_ajuste'] as $f)
{{ $it->$f ? 'X' : '' }} |
@endforeach
{{ str_replace('_',' ',$it->estado_item) }} |
{{ $it->lectura_condicion }} |
{{ $it->observaciones }} |
@endforeach
@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)
| Síntoma observado | {{ $orden->falla_sintoma }} |
@endif
@if($orden->falla_causa_probable)
| Causa probable | {{ $orden->falla_causa_probable }} |
@endif
@if($orden->falla_causa_raiz)
| Causa raíz | {{ $orden->falla_causa_raiz }} |
@endif
@if($orden->falla_accion_correctiva)
| Acción correctiva | {{ $orden->falla_accion_correctiva }} |
@endif
@if($orden->falla_accion_preventiva)
| Acción preventiva | {{ $orden->falla_accion_preventiva }} |
@endif
@endif
{{-- ===== 7. PERSONAL ASIGNADO ===== --}}
@if(count($personal) > 0)
5. PERSONAL ASIGNADO
| Rol | Nombre | Cargo | Usuario | Horas estimadas |
@foreach($personal as $p)
| {{ $p['rol'] }} |
{{ $p['usuario']->nombre_completo ?: $p['usuario']->usuario }} |
{{ $p['usuario']->cargo ?: '—' }} |
{{ $p['usuario']->usuario }} |
{{ $p['horas'] !== null ? $p['horas'] . ' h' : '—' }} |
@endforeach
@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
| Código | Descripción |
Ubicación |
Cantidad |
Costo unit. |
Total |
@foreach($recursos['repuestos'] as $c)
| {{ 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) }} |
@endforeach
| Subtotal repuestos |
{{ $cab['moneda'] }} {{ number_format($recursos['total_repuestos'],2) }} |
@endif
@if($recursos['mano_obra']->count())
Mano de obra
| Concepto |
Horas |
Costo unit. |
Total |
@foreach($recursos['mano_obra'] as $c)
| {{ $c->concepto }} |
{{ rtrim(rtrim(number_format($c->cantidad,3),'0'),'.') }} |
{{ number_format($c->costo_unitario,2) }} |
{{ number_format($c->costo_total,2) }} |
@endforeach
| Subtotal mano de obra |
{{ $cab['moneda'] }} {{ number_format($recursos['total_mano_obra'],2) }} |
@endif
@if($recursos['otros']->count())
Otros costos
| Concepto |
Cant. |
Costo unit. |
Total |
@foreach($recursos['otros'] as $c)
| {{ $c->concepto }} |
{{ rtrim(rtrim(number_format($c->cantidad,3),'0'),'.') }} |
{{ number_format($c->costo_unitario,2) }} |
{{ number_format($c->costo_total,2) }} |
@endforeach
| 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())
| Código | Tipo | Frecuencia |
Fecha cierre | Estado | Costo |
@foreach($antecedentes['ultimas'] as $ot)
| {{ $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) }} |
@endforeach
@else
Sin antecedentes cerrados registrados para este equipo.
@endif
@endif
{{-- ===== 11. ACCIONES DE SEGUIMIENTO ===== --}}
@if($proximas->count())
9. ACCIONES DE SEGUIMIENTO — PRÓXIMAS OT
| Código | Tipo | Frecuencia |
Programada | Prioridad | Estado |
@foreach($proximas as $ot)
| {{ $ot->codigo }} |
{{ ucfirst($ot->clase) }} |
{{ optional($ot->frecuencia)->nombre ?: '—' }} |
{{ $ot->fecha_programada?->format('d/m/Y') }} |
{{ optional($ot->prioridad)->nombre ?: '—' }} |
{{ optional($ot->estado)->nombre }} |
@endforeach
@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
@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
|
@endfor
@endfor
@endforeach
{{-- ===== Pie de página repetible con numeración ===== --}}