@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')
{{ $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)
| {{ $k }} | {{ $v }} |
@endforeach
@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ón | Real |
| 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
| Hora | Tipo | Origen |
Ventana | pH | Reserva | Dulzor | Observado |
@forelse($registros as $r)
| {{ $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
|
@empty
| Sin registros. |
@endforelse
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