# Revisione e Validazione

## Revisione Documento

La pagina **Revisione Documento** (`/documents/{id}/review`) è il cuore del processo di validazione. Qui puoi verificare e correggere i dati estratti automaticamente dall'OCR a partire dal PDF dell'ODL cartaceo.

### Struttura del Documento ODL Originale

Il foglio di Lavorazione Interna (ODL) cartaceo ha la seguente struttura:

- **Intestazione**: Cliente, Padre ID, Num. ID (commessa), descrizione lavoro, quantità
- **Tabella "Lavorazioni Svolte"**: Data | Operaio (matricola) | Ore Lav. | Fuori (flag cantiere esterno) | Descrizione Lavoro
- Compilato manualmente dagli operai, con firma del responsabile

:::note[Colonna "Fuori"]
La colonna **Fuori** (spunta quadrato) indica se la lavorazione è avvenuta fuori sede – informazione **cruciale** per attivare il calcolo delle ore di viaggio nel sistema.

Durante l'estrazione OCR, il flag viene impostato automaticamente anche quando nella **Descrizione Lavoro** compare la scritta `VIAGGIO` oppure `FUORI SEDE`, anche se la casella non risulta barrata nel documento.
:::

### Intestazione ODL

La sezione superiore della pagina di revisione mostra i dati generali estratti dall'OCR:

| Campo | Descrizione |
|-------|-------------|
| **Cliente** | Nome del cliente associato all'ODL |
| **Padre ID** | Identificativo del documento padre |
| **Num. ID (Commessa)** | Codice commessa – selezionabile dal dropdown o digitabile manualmente |
| **Quantità** | Quantità specificata nell'ODL |
| **Descrizione Lavoro** | Descrizione testuale del lavoro svolto |

:::tip
Il campo **Num. ID (Commessa)** offre un dropdown con le commesse padre aperte nel gestionale. Puoi anche digitare manualmente un codice se la commessa non è presente nella lista (es. `14_Pr000021`).
:::

### Tabella Lavorazioni Svolte

La tabella mostra il dettaglio delle lavorazioni estratte dall'OCR:

| Colonna | Descrizione |
|---------|-------------|
| **Data** | Data in cui è stata svolta la lavorazione |
| **Operaio** | Dropdown per selezionare l'operaio dalla lista delle risorse attive del gestionale. Ogni voce mostra **Cod. Risorsa — Descrizione** (es. `RIS001 — Rossi Mario`). Se l'operaio ha compilato il modulo con il proprio **codice risorsa**, il sistema lo riconosce automaticamente |
| **Cod. Risorsa** | Codice risorsa del gestionale (compilato automaticamente dalla selezione operaio o dal riconoscimento OCR). Corrisponde all'ID risorsa nel gestionale, **non** al numero badge delle timbrature |
| **Ore Lav.** | Ore lavorate nella giornata |
| **Fuori** | Checkbox che indica lavoro **fuori sede** – attiva il calcolo ore di viaggio |
| **Sotto-commessa** | Badge con il codice sotto-commessa (se assegnato dopo uno split) |
| **Descrizione Lavoro** | Descrizione specifica della lavorazione svolta |

:::note[Identificazione Operaio]
Il sistema si basa sul **codice risorsa** scritto dall'operaio nel modulo ODL cartaceo per l'identificazione automatica. È fondamentale che gli operai seguano lo standard di compilazione indicato nella sezione [Caricamento Documenti](/documenti/caricamento/) scrivendo il proprio codice risorsa (matricola) nella colonna "Operaio".
Se il codice non è riconosciuto, l'operatore dovrà selezionare manualmente l'operaio dal dropdown.
:::

### Operazioni sulla Tabella

#### Aggiungere una Riga
Premi il pulsante **"Aggiungi riga"** in alto a destra della tabella per inserire una nuova lavorazione manualmente (es. se l'OCR ha mancato una riga del PDF).

#### Eliminare una Riga
Clicca l'icona **cestino** (🗑️) nella colonna azioni della riga da rimuovere (es. riga duplicata dall'OCR).

#### Dividere in Sotto-commesse
Clicca l'icona **split** (↕️) per aprire la modale di suddivisione delle ore in sotto-commesse.

### Suddivisione in Sotto-commesse

Quando un operaio ha lavorato su più sotto-commesse nella stessa giornata, puoi dividere le ore:

1. Clicca l'icona **split** sulla riga desiderata
2. Si apre una modale con le sotto-commesse disponibili per la commessa padre
3. **Assegna le ore** a ciascuna sotto-commessa
4. (Opzionale) Usa il pulsante **"Suggerisci con AI"** per ottenere un suggerimento automatico basato sulla descrizione del lavoro
5. Verifica che il totale delle ore assegnate corrisponda al totale originale
6. Premi **"Conferma Split"**

#### Suggerisci con AI

Il pulsante **"Suggerisci con AI"** invia la descrizione del lavoro al sistema AI per ricevere una proposta automatica di suddivisione delle ore tra le sotto-commesse.

- **Descrizione**: il campo descrizione della riga viene mostrato in **sola lettura** nella modale, come riferimento per il contesto inviato all'AI
- **Suggerimento**: se il sistema AI riesce a interpretare la descrizione, propone automaticamente la distribuzione delle ore sulle sotto-commesse disponibili
- **Esito negativo**: se il sistema AI non riesce a identificare uno split valido, viene mostrato il messaggio:

  > ⚠️ **Non ho compreso**

  In questo caso l'operatore deve assegnare le ore manualmente.

:::caution
Il totale delle ore assegnate alle sotto-commesse **deve corrispondere esattamente** alle ore totali della riga originale. Il pulsante "Conferma Split" sarà disabilitato finché i valori non corrispondono.
:::

### Sistema di Alert

Durante la revisione, il sistema genera automaticamente degli **alert** in caso di:

| Alert | Descrizione |
|-------|-------------|
| **⚠️ Ore discrepanti** | Ore timbrate significativamente superiori o inferiori alle ore ODL (soglia configurabile) |
| **⚠️ Operaio mancante** | Operaio presente in timbratura ma assente nell'ODL, o viceversa |
| **⚠️ ODL senza timbrature** | ODL aperto senza timbrature associate per più di N giorni lavorativi |
| **⚠️ Risorsa non trovata** | Il codice risorsa dell'operaio non corrisponde a nessuna risorsa attiva nel gestionale |

### Esclusione Righe Già Inserite

L'operatore ha la possibilità di **escludere le righe già inserite** in precedenza durante la validazione, evitando duplicazioni nei dati confermati.

### Salva Bozza

Durante la revisione puoi salvare i dati in qualsiasi momento premendo il pulsante **"Salva Bozza"** (💾). Questo persiste le correzioni senza confermare il documento, permettendoti di riprendere la revisione in un secondo momento.

- Il documento rimane nello stato **"Da revisionare"**
- Puoi salvare la bozza tutte le volte che vuoi
- Le modifiche vengono salvate sul server e saranno disponibili alla riapertura

### Conferma Dati

Dopo aver verificato e corretto tutti i dati:

1. Controlla ogni riga della tabella
2. Verifica la correttezza di commessa, operai, ore e flag **Fuori**
3. (Opzionale) Premi **"Salva Bozza"** per salvare le correzioni intermedie
4. Premi il pulsante **"Conferma Dati"** (✅)
5. Il documento passerà allo stato **Confermato**

:::caution[Documento bloccato dopo la conferma]
Una volta confermati, i dati **non sono più modificabili**. Tutti i campi e le azioni di modifica (aggiungi riga, elimina, split, assegnazione sotto-commessa) vengono disabilitati. Un banner informativo indica che il documento è bloccato. Assicurati che tutti i dati siano corretti prima di confermare.
:::