@push('css') @endpush

Visita nutrizionale

Nome: {{ $this->clienteHeader['nome'] }} | Sesso: {{ $this->clienteHeader['sesso'] }} | Altezza: {{ $this->clienteHeader['altezza'] }} | Età: {{ $this->clienteHeader['eta'] }}

{{-- Barra step a griglia di card (stile reference) --}} @php $stepsConfig = [ 1 => ['label' => 'Selezione cliente', 'sublabel' => 'Cerca e seleziona il cliente dall\'anagrafica', 'icon' => 'fa-user'], 2 => ['label' => 'Composizione corporea', 'sublabel' => 'Esame di composizione corporea (BIA)', 'icon' => 'fa-ruler'], 3 => ['label' => 'Impostazioni Piano', 'sublabel' => 'Peso, LAF, FCG e macronutrienti', 'icon' => 'fa-sliders-h'], 4 => ['label' => 'Schema Pasti', 'sublabel' => 'Piano nutrizionale settimanale', 'icon' => 'fa-utensils'], 5 => ['label' => 'Indicazioni e suggerimenti', 'sublabel' => 'Esercizio, cibi da evitare, acqua, integrazione', 'icon' => 'fa-running'], 6 => ['label' => 'Composizione dieta', 'sublabel' => 'Composizione della dieta', 'icon' => 'fa-chart-bar'], 7 => ['label' => 'Resoconto piano', 'sublabel' => 'Riepilogo grafico del piano settimanale', 'icon' => 'fa-flag-checkered'], ]; @endphp
@foreach($stepsConfig as $num => $config) @php $isActive = $stepCorrente === $num; $isDisabled = $num > 1 && !$visitaNutrizionaleId; $hideStep = in_array($num, [4, 6]) && !$this->canManualiDieta(); @endphp @if(!$hideStep) @endif @endforeach
{{-- Step 1: Selezione cliente --}} @if($stepCorrente === 1)
1. Selezione del cliente

Cerca e seleziona il cliente dall'anagrafica per avviare la visita.

@if($clienteId)
Cliente selezionato
@elseif(strlen(trim($searchCliente)) >= 2)
@foreach($this->clientiCercati as $cliente) @endforeach @if($this->clientiCercati->isEmpty())
Nessun cliente trovato
@endif
@endif
@error('clienteId') {{ $message }} @enderror @if($clienteId)

Cerca un documento dalla biblioteca (pubblici e tuoi) da inviare al cliente mentre prepari il piano.

@if($consiglioSelezionatoId)
Consiglio selezionato: {{ $consiglioSelezionatoTitolo }}
@elseif(strlen(trim($searchConsiglio)) >= 2)
@foreach($this->consigliCercati as $consiglio) @endforeach @if($this->consigliCercati->isEmpty())
Nessun consiglio trovato
@endif
@endif
@error('consiglioSelezionatoId') {{ $message }} @enderror
@if($consiglioSelezionatoId) @endif
@if($messaggioInvioConsiglio !== '')
{{ $messaggioInvioConsiglio }}
@endif @if($this->inviiConsigliCliente->isNotEmpty())
Ultimi invii: @foreach($this->inviiConsigliCliente as $invio) {{ \Illuminate\Support\Str::limit($invio->consiglioNutrizionale?->titolo ?? '—', 25) }}: @if($invio->stato === \App\Models\ConsiglioNutrizionaleInvio::STATO_APERTO) aperto @elseif($invio->stato === \App\Models\ConsiglioNutrizionaleInvio::STATO_SCADUTO) scaduto @else inviato @endif @endforeach
@endif
@endif

Anamnesi salvata nella scheda cliente.

@if($clienteId) @livewire('pazienti.anamnesi', ['user' => $clienteId], key('wizard-anamnesi-'.$clienteId.'-'.$anamnesiEditorKey)) @else @endif
@if($clienteId)
Indagine alimentare abituale

Raccogli le abitudini alimentari del paziente inserendo gli alimenti consumati abitualmente nei vari pasti della giornata. I dati verranno utilizzati per stimare l'introito energetico medio giornaliero.

@php $tabPasti = [ 'colazione' => 'Colazione', 'spuntino_mattutino' => 'Spuntino mattutino', 'pranzo' => 'Pranzo', 'spuntino_pomeridiano' => 'Spuntino pomeridiano', 'cena' => 'Cena', ]; @endphp
@foreach($tabPasti as $keyPasto => $labelPasto) @endforeach
@foreach($tabPasti as $keyPasto => $labelPasto)
{{ $labelPasto }}
@php $righePasto = $indaginePasti[$keyPasto] ?? []; @endphp @forelse($righePasto as $idx => $riga) @php $alimentoId = (int) ($riga['alimento_id'] ?? 0); $infoAlimento = $this->nomiAlimentiIndagine[$alimentoId] ?? null; $nomeAlimento = $infoAlimento['nome'] ?? ($alimentoId ? 'Alimento #'.$alimentoId : '-'); $porzioneAlimento = $infoAlimento['porzione'] ?? null; @endphp @empty @endforelse
Alimento Quantità Azione
{{ $nomeAlimento }}
@if($porzioneAlimento)
Porzione: {{ $porzioneAlimento }}
@endif
{{ isset($riga['quantita_g']) ? number_format((float) $riga['quantita_g'], 1, ',', '.') : '-' }} g
Nessun alimento inserito per questo pasto.
@endforeach
@if($indagineKcalMedia !== null) @php $totaliIndagine = $indagineTotali ?? null; $proteineG = $totaliIndagine['proteine_g'] ?? 0; $carboG = $totaliIndagine['carboidrati_g'] ?? 0; $lipidiG = $totaliIndagine['lipidi_g'] ?? 0; $fibreG = $totaliIndagine['fibre_g'] ?? 0; $proteineKcalIndagine = (float) $proteineG * 4; $carboKcalIndagine = (float) $carboG * 4; $lipidiKcalIndagine = (float) $lipidiG * 9; $totaleMacroKcalIndagine = $proteineKcalIndagine + $carboKcalIndagine + $lipidiKcalIndagine; $proteinePctIndagine = $totaleMacroKcalIndagine > 0 ? ($proteineKcalIndagine / $totaleMacroKcalIndagine) * 100 : 0; $carboPctIndagine = $totaleMacroKcalIndagine > 0 ? ($carboKcalIndagine / $totaleMacroKcalIndagine) * 100 : 0; $lipidiPctIndagine = $totaleMacroKcalIndagine > 0 ? ($lipidiKcalIndagine / $totaleMacroKcalIndagine) * 100 : 0; $tolleranzaSemaforoPct = 5.0; $calcolaStatoSemaforo = static function (float $valore, float $targetMin, float $targetMax, float $tolleranzaPct): string { if ($valore >= $targetMin && $valore <= $targetMax) { return 'verde'; } $sogliaMinTollerata = $targetMin - ($targetMin * ($tolleranzaPct / 100)); $sogliaMaxTollerata = $targetMax + ($targetMax * ($tolleranzaPct / 100)); return ($valore >= $sogliaMinTollerata && $valore <= $sogliaMaxTollerata) ? 'giallo' : 'rosso'; }; $semaforoMacro = [ [ 'nome' => 'Proteine', 'pct' => $proteinePctIndagine, 'range' => '15–20%', 'suffisso' => '%', 'stato' => $calcolaStatoSemaforo((float) $proteinePctIndagine, 15, 20, $tolleranzaSemaforoPct), ], [ 'nome' => 'Carboidrati', 'pct' => $carboPctIndagine, 'range' => '50–55%', 'suffisso' => '%', 'stato' => $calcolaStatoSemaforo((float) $carboPctIndagine, 50, 55, $tolleranzaSemaforoPct), ], [ 'nome' => 'Grassi', 'pct' => $lipidiPctIndagine, 'range' => '25–30%', 'suffisso' => '%', 'stato' => $calcolaStatoSemaforo((float) $lipidiPctIndagine, 25, 30, $tolleranzaSemaforoPct), ], [ 'nome' => 'Fibre', 'pct' => (float) $fibreG, 'range' => '>=25 g ', 'suffisso' => 'g', 'stato' => ((float) $fibreG >= 25) ? 'verde' : (((float) $fibreG >= 20) ? 'giallo' : 'rosso'), ], ]; @endphp

Introito energetico medio stimato: {{ (int) round($indagineKcalMedia) }} kcal/giorno

Apporto medio dai macronutrienti: Proteine {{ number_format((float) $proteineG, 1, ',', '.') }} g, Carboidrati {{ number_format((float) $carboG, 1, ',', '.') }} g, Grassi {{ number_format((float) $lipidiG, 1, ',', '.') }} g.

@foreach($semaforoMacro as $macroSemaforo)
{{ $macroSemaforo['nome'] }}
{{ number_format((float) $macroSemaforo['pct'], 1, ',', '.') }}{{ $macroSemaforo['suffisso'] }} target {{ $macroSemaforo['range'] }}
@endforeach
@else

Inserisci almeno un alimento per ottenere la stima dell'introito energetico medio giornaliero.

@endif @error('indagine') {{ $message }} @enderror

I semafori nutrizionali sono riferiti a soggetti adulti in condizioni fisiologiche e in buono stato di salute; in presenza di gravidanza, patologie o regimi dietetici specifici, i range devono essere personalizzati.

Alimenti non graditi dal paziente

Inserisci gli alimenti o gruppi alimentari che il paziente non gradisce (es. crostacei, latte, molluschi). Verranno evidenziati in rosso durante la composizione del piano allo step 4.

@if(!empty($cibiNonGraditi))
@foreach($cibiNonGraditi as $idxTag => $tag) {{ $tag }} @endforeach
@else

Nessun alimento inserito.

@endif
@error('nuovoTagNonGradito') {{ $message }} @enderror
@endif
@endif {{-- Step 2: Misurazioni --}} @if($stepCorrente === 2)
@if($this->canHaBia())
2. Misurazioni – Esame di composizione corporea

Associa un esame di composizione corporea (BIA) al cliente per utilizzare peso, massa grassa e metabolismo basale nella pianificazione.

@if($this->analisiCliente->isEmpty())

Nessuna analisi trovata per questo cliente. Puoi procedere senza e inserire i dati manualmente nello step successivo.

@else
@foreach($this->analisiCliente as $analisi)
{{ $analisi->created_at?->format('d/m/Y H:i') }}
  • Peso: {{ $analisi->Peso }} kg
  • @if($analisi->FMP !== null)
  • Massa grassa: {{ $analisi->FMP }}%
  • @endif @if(isset($analisi->BMR))
  • BMR: {{ round($analisi->BMR) }} kcal
  • @endif
@endforeach

@endif @else @php $compNoBia = $this->composizioneStimataNoBia; @endphp @php $pesoIdealeNoBia = $this->pesoIdealeStimatoNoBia; @endphp
2. Misurazioni – Composizione corporea stimata

Inserisci peso, altezza, peso ideale, LAF e (opzionale) FM% per il calcolo base della composizione corporea, come nei piani alimentari No-BIA. Altezza precompilata dalla scheda cliente.

@error('peso_attuale')
{{ $message }}
@enderror
@error('altezza')
{{ $message }}
@enderror
@error('fmp_attuale')
{{ $message }}
@enderror
@error('formulaPesoIdeale')
{{ $message }}
@enderror

{{ $pesoIdealeNoBia !== null ? number_format($pesoIdealeNoBia, 1, ',', '.') : 'N/A' }}

@error('laf_attuale')
{{ $message }}
@enderror
@if($compNoBia !== [])
@if(isset($compNoBia['TDEE']))
@endif @endif
@endif
@endif {{-- Step 3: Pianificazione (stile reference: Calcoli + Distribuzione macronutrienti) --}} @if($stepCorrente === 3) @php $dati = $this->datiAnalisiSolaLettura; $lafDescAttuale = \App\Support\LafOpzioni::etichetta($laf_attuale); $lafDescObiettivo = \App\Support\LafOpzioni::etichetta($laf); @endphp
Calcoli

Definisci gli obiettivi dell'attività fisica e del FCG.

Valore Attuale Obiettivo
Livello di attività fisica Coefficiente LAF per il calcolo del fabbisogno
LAF {{ $laf_attuale ?? '–' }}
LAF {{ $laf ?? '–' }}
Metabolismo basale Energia a riposo (kcal/giorno)
Peso Peso corporeo
Massa grassa percentuale Da analisi BIA
Fabbisogno calorico giornaliero MB × LAF
Distribuzione dei macronutrienti

Imposta la distribuzione dei macronutrienti (la somma deve essere 100%).

@php $peso = $peso_obiettivo ?? $peso_attuale ?? 60; $fcg = (int)($fcg_obiettivo ?? $fcg_attuale ?? 2000); $proteineG = $fcg > 0 ? round(($proteine_pct ?? 0) / 100 * $fcg / 4, 0) : 0; $carboidratiG = $fcg > 0 ? round(($carboidrati_pct ?? 0) / 100 * $fcg / 4, 0) : 0; $lipidiG = $fcg > 0 ? round(($lipidi_pct ?? 0) / 100 * $fcg / 9, 0) : 0; $proteineGkg = $peso > 0 ? round($proteineG / $peso, 2) : 0; $carboidratiGkg = $peso > 0 ? round($carboidratiG / $peso, 2) : 0; $lipidiGkg = $peso > 0 ? round($lipidiG / $peso, 2) : 0; // Calcolo energia in kcal per ciascun macronutriente $proteineKcal = $proteineG * 4; $carboidratiKcal = $carboidratiG * 4; $lipidiKcal = $lipidiG * 9; $totaleMacroKcal = $proteineKcal + $carboidratiKcal + $lipidiKcal; @endphp {{-- Tabella a 6 colonne: Nome macro | Slider con % | Quantità gr | kcal | g/kg | Range --}}
% su kcal g totali kcal g/kg Range %
1
Proteine Distribuzione delle proteine nella pianificazione
{{ number_format((float)($proteine_pct ?? 0), 1, ',', '') }} %
{{ $proteineG }} g {{ $proteineKcal }} kcal {{ $proteineGkg }} g/kg 10 – 35 %
2
Carboidrati Distribuzione dei carboidrati nella pianificazione
{{ number_format((float)($carboidrati_pct ?? 0), 1, ',', '') }} %
{{ $carboidratiG }} g {{ $carboidratiKcal }} kcal {{ $carboidratiGkg }} g/kg 45 – 65 %
3
Lipidi Distribuzione dei lipidi nella pianificazione
{{ number_format((float)($lipidi_pct ?? 0), 1, ',', '') }} %
{{ $lipidiG }} g {{ $lipidiKcal }} kcal {{ $lipidiGkg }} g/kg 20 – 35 %
@php $sum = (float)($proteine_pct ?? 0) + (float)($carboidrati_pct ?? 0) + (float)($lipidi_pct ?? 0); $macroOk = abs($sum - 100.0) < 0.001; @endphp

Totale: {{ number_format($sum, 1, ',', '') }}% @if(!$macroOk) (valore raccomandato 100%) @endif

Energia dai macronutrienti impostati: {{ $totaleMacroKcal }} kcal @if($fcg > 0) su un fabbisogno di circa {{ $fcg }} kcal/giorno @endif

@error('macro') {{ $message }} @enderror
@php // Fabbisogno reale su cui calcolare le kcal per pasto: senza fallback, // così la sezione resta nascosta finché non c'è un FCG impostato. $fcgPasti = (int) round((float) ($fcg_obiettivo ?? $fcg_attuale ?? 0)); @endphp @if($fcgPasti > 0) @php $pastiDistribuzione = \App\Models\VisitaNutrizionale::PASTI_DISTRIBUZIONE; $sublabelPasti = [ 'colazione' => 'Primo pasto della giornata', 'spuntino_mattutino' => 'Spuntino di metà mattina', 'pranzo' => 'Pasto principale di mezzogiorno', 'spuntino_pomeridiano' => 'Spuntino del pomeriggio', 'cena' => 'Ultimo pasto della giornata', ]; $kcalPasti = $this->kcalPerPasto; $totalePastiPct = $this->totaleDistribuzionePastiPct; $pastiOk = abs($totalePastiPct - 100.0) < 0.001; $mostraErrorePasti = $vincoloDistribuzionePasti100 && !$pastiOk; $kcalAssegnate = array_sum($kcalPasti); @endphp
Distribuzione delle calorie per pasto

Attiva lo switch per impostare la distribuzione percentuale delle kcal sui pasti della giornata. Con switch attivo la somma deve essere 100%; i valori restano indicativi nello step Schema Pasti.

@if($vincoloDistribuzionePasti100)
@foreach($pastiDistribuzione as $keyPastoDist => $labelPastoDist) @php $pctPasto = (float) ($distribuzionePastiPct[$keyPastoDist] ?? 0); @endphp @endforeach
% su kcal giornaliere kcal obiettivo
{{ $loop->iteration }}
{{ $labelPastoDist }} {{ $sublabelPasti[$keyPastoDist] ?? '' }}
{{ number_format($pctPasto, 1, ',', '') }} %
{{ (int) round($kcalPasti[$keyPastoDist] ?? 0) }} kcal

Totale: {{ number_format($totalePastiPct, 1, ',', '') }}% @if(!$pastiOk) (obbligatorio 100% con distribuzione attiva) @endif

@error('distribuzione_pasti') {{ $message }} @enderror

Energia assegnata ai pasti: {{ (int) round($kcalAssegnate) }} kcal su {{ $fcgPasti }} kcal/giorno

@endif
@endif
@endif {{-- Step 4: Pasti (embed CreaPianoSettimanale) – visibile solo con permesso manuali-diete --}} @if($stepCorrente === 4) @can('manuali-diete')
4. Pasti – Piano nutrizionale settimanale
Compila il piano e salvalo; poi clicca Avanti per le raccomandazioni.
@if($this->visitaNutrizionale?->cliente_id) @livewire('piani-alimentari.crea-piano-settimanale', [ 'clienteId' => $this->visitaNutrizionale->cliente_id, 'visitaNutrizionaleId' => $visitaNutrizionaleId, ], key('crea-piano-'.$visitaNutrizionaleId)) @endif
@else
La funzionalità piano nutrizionale settimanale non è disponibile per il tuo profilo.
@endcan @endif {{-- Step 5: Raccomandazioni --}} @if($stepCorrente === 5)
5. Raccomandazioni

Esercizio fisico, cibi da evitare, assunzione d'acqua e integrazione.

Attività fisiche da prescrivere al cliente.

Alimenti che non devono essere ingeriti.

Consumo giornaliero d'acqua raccomandato.

@error('acqua_raccomandata')
{{ $message }}
@enderror

Eventuali integratori che il paziente deve assumere.

Annotazioni libere da associare a questa visita.

@endif {{-- Step 6: Analisi – contenuto analisi visibile solo con permesso manuali-diete --}} @if($stepCorrente === 6)
6. Analisi – Composizione della dieta

Distribuzione macronutrienti ed energetica del piano alimentare.

@can('manuali-diete') {{-- Blocco scelta giorni: stesso stile card degli step (bianco inattivo, teal attivo) --}}
Analisi per giorno
@foreach($this->giorniAnalisiDisponibili as $giorno) @php $macroGiorno = $this->analisiMacroPerGiorno[$giorno] ?? ['totali' => ['energia_kcal' => 0, 'proteine_g' => 0, 'carboidrati_g' => 0, 'lipidi_g' => 0, 'fibre_g' => 0], 'percentuali' => ['proteine' => 0, 'carboidrati' => 0, 'lipidi' => 0]]; $perc = $macroGiorno['percentuali']; $tot = $macroGiorno['totali']; $isActive = $giornoAnalisiSelezionato === $giorno; $labelGiorno = trim((string) ($this->labelsGiorniPiano[$giorno] ?? '')) ?: $giorno; @endphp @endforeach
@livewire('visita-nutrizionale.analisi-piano', [ 'visitaNutrizionaleId' => $visitaNutrizionaleId, 'giornoSelezionato' => $giornoAnalisiSelezionato, ], key('analisi-piano-'.$visitaNutrizionaleId.'-'.$giornoAnalisiSelezionato.'-'.$analisiPianoRefreshKey)) @else
L'analisi della composizione della dieta non è disponibile per il tuo profilo.
@endcan @if(!$this->visitaNutrizionale?->completata)
@else
Visita nutrizionale conclusa.
@endif
@endif {{-- Step 7: Resoconto piano nutrizionale --}} @if($stepCorrente === 7)
7. Resoconto piano nutrizionale

Riepilogo moderno del piano alimentare giornaliero e dei macronutrienti, ispirato al layout NutritionPro.

@if($visitaNutrizionaleId) @livewire('visita-nutrizionale.resoconto-piano', [ 'visitaNutrizionaleId' => $visitaNutrizionaleId, ], key('resoconto-piano-'.$visitaNutrizionaleId)) @else
Seleziona e salva una visita nutrizionale prima di visualizzare il resoconto del piano.
@endif
@endif
{{-- Modale inserimento alimenti per indagine alimentare (riuso pattern step 4) --}} @if($mostraModalIndagineAlimenti) @endif