@extends('admin.layouts.admin') @section('title', 'Registro del mentor — ' . $tanda->name) @php /** La ventana de un registro, en su unidad, o «—». */ $ventana = function ($r) { $v = data_get($r?->ventana, 'valor'); if (! is_array($v)) { return '—'; } $u = data_get($r->ventana, 'unidad') === 'horas' ? 'h' : 'd'; return round($v[0]) . '–' . round($v[1]) . ' ' . $u; }; /** Un valor previsto, con su unidad. */ $prev = fn ($r, $k, $suf = '') => data_get($r?->previsto, $k) !== null ? rtrim(rtrim(number_format((float) data_get($r->previsto, $k), 2, ',', ''), '0'), ',') . $suf : '—'; $corteHoras = data_get($corte?->metadata, 'estado_real.dia_corte'); @endphp @section('content')
← Registro del mentor
{{ $tanda->name }}

{{ $tanda->guide?->name }} · {{ $tanda->recipe?->name }} · {{ $tanda->user?->name }} · {{ $tanda->status }} · {{ $tanda->target_yield_value }} {{ $tanda->target_yield_unit }} @if($tanda->start_date) · arrancada el {{ $tanda->start_date->format('d/m/Y') }} @endif

{{-- Lo que se pidió: el perfil congelado. Sin esto, la línea temporal no dice contra qué se estaba prediciendo. --}} @php $entrada = data_get($tanda->formulacion, 'entrada', []); @endphp @if($entrada)
Lo que se pidió
@foreach($entrada as $k => $v) @continue(is_array($v) || $v === null) @endforeach
{{ $k }}{{ $v }}
@endif {{-- EL BUCLE 2. Lo que esta tanda LLEVABA aplicado y lo que el mentor ha aprendido hasta hoy. Sin esto, la calibración sería un número que se mueve sin que nadie pueda ver por qué — que es justo lo que pasó con `insights.context`. --}} @php $calCongelada = data_get($tanda->formulacion, 'calibracion'); @endphp
Lo que el mentor había aprendido
Aplicado a esta tanda @if($calCongelada) ×{{ $calCongelada['aplicado'] }} — de un desvío medio de ×{{ $calCongelada['factor'] }} sobre {{ $calCongelada['tandas'] }} tanda(s); el resto se aplica según se acumulen @else nada: era su primera tanda de este fermento @endif
Lo que esta tanda enseñó @if($medida) llegó a su punto a las {{ $medida['real'] }} h y estaba previsto a las {{ $medida['previsto'] }} h → ×{{ $medida['factor'] }} @else nada: sin cata «en su punto» no se aprende @endif
Acumulado hasta hoy @if($calibracion) ×{{ $calibracion->factor }} sobre {{ $calibracion->tandas }} tanda(s), dispersión {{ $calibracion->dispersion }} → se aplica ×{{ $calibracion->aplicado() }} @else todavía nada @endif
{{-- EL CONTRASTE. Las tres columnas que responden a la pregunta del bucle 2: qué dijo el mentor al principio, qué decía al final (después de mover con las catas) y qué pasó de verdad. Si las dos primeras son iguales, el bucle 1 no llegó a actuar. --}}
Predicho contra real
Al empezarÚltima predicciónReal
Ventana {{ $ventana($primera) }} {{ $ventana($ultima) }} @if($corteHoras !== null) cortada el día {{ $corteHoras }} @elseif($tanda->actual_end_date) terminada el {{ $tanda->actual_end_date->format('d/m/Y') }} @else sin cerrar @endif
pH al corte {{ $prev($primera, 'ph_al_corte') }} {{ $prev($ultima, 'ph_al_corte') }} @php $phReal = $registros->where('origen', 'ph')->last(); @endphp {{ $phReal ? data_get($phReal->observado, 'ph') : '—' }}
Reserva {{ $prev($primera, 'reserva_gL', ' g/L') }} {{ $prev($ultima, 'reserva_gL', ' g/L') }} sin medir
Dulzor {{ data_get($primera?->previsto, 'dulzor', '—') }} {{ data_get($ultima?->previsto, 'dulzor', '—') }} {{-- Lo más cercano a un dulzor real: la última cata a paladar. --}} @php $cata = $registros->where('origen', 'cata')->last(); @endphp {{ $cata ? data_get($cata->observado, 'cata') : '—' }}
Alcohol {{ $prev($primera, 'abv_estimado', ' %') }} {{ $prev($ultima, 'abv_estimado', ' %') }} requiere laboratorio
{{-- La línea temporal completa, en horas de tanda: es donde se ve la ventana moverse con cada cata, que es lo que el bucle 1 hace y hasta ahora no dejaba rastro. --}}
Línea temporal
@forelse($registros as $r) @empty @endforelse
HoraTipoOrigen VentanapHReservaDulzorObservado
{{ $r->horas_tanda !== null ? round($r->horas_tanda) . ' h' : '—' }} {{ $r->tipo === 'prediccion' ? 'predicción' : 'observación' }} {{ $r->origen }} {{ $ventana($r) }} {{ $prev($r, 'ph_al_corte') }} {{ $prev($r, 'reserva_gL') }} {{ data_get($r->previsto, 'dulzor', '—') }} @if($r->observado) @foreach($r->observado as $k => $v) {{ $k }}: {{ is_scalar($v) ? $v : json_encode($v) }}@if(!$loop->last), @endif @endforeach @else — @endif
Sin registros.

Las horas son de tanda (desde el arranque real, no desde medianoche). Una fila de predicción con origen cata o medicion es el bucle 1 moviendo la ventana; con origen motor, el punto de partida.

@endsection