@push('css') @endpush

Visita nutrizionale

Visualizza e registra le informazioni del cliente e crea il piano alimentare.

{{-- 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', '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)
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.

@endif
@endif {{-- Step 2: Misurazioni --}} @if($stepCorrente === 2)
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
@endif {{-- Step 3: Pianificazione (stile reference: Calcoli + Distribuzione macronutrienti) --}} @if($stepCorrente === 3) @php $dati = $this->datiAnalisiSolaLettura; $lafDescAttuale = $laf_attuale && isset(\App\Livewire\VisitaNutrizionale\Wizard::LAF_OPZIONI[$laf_attuale]) ? \App\Livewire\VisitaNutrizionale\Wizard::LAF_OPZIONI[$laf_attuale] : null; $lafDescObiettivo = $laf && isset(\App\Livewire\VisitaNutrizionale\Wizard::LAF_OPZIONI[$laf]) ? \App\Livewire\VisitaNutrizionale\Wizard::LAF_OPZIONI[$laf] : null; @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
@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 e assunzione d'acqua.

Attività fisiche da prescrivere al cliente.

Alimenti che non devono essere ingeriti.

Consumo giornaliero d'acqua raccomandato.

@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(\App\Services\PianoSettimanaleNutrizionaleService::GIORNI_SETTIMANA 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; @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