# Diagnostica Scarico Celle Multiple

## Contesto

La finestra `Scarico` aperta da `Gestione layout` serve a gestire celle fisiche che contengono piu' UDC.
Nel database legacy non esisteva un vincolo rigido `una cella = una UDC`, quindi una cella rossa puo' contenere:

- UDC realmente compresenti nella stessa cella;
- UDC rimaste in cella anche se appartenenti a picking list gia' chiuse/spedite.

L'obiettivo della diagnostica non e' ricostruire tutta la storia della UDC, ma aiutare l'operatore a capire quali righe scaricare come spedite.

## Fonti Dati

La griglia della dialog parte dalla giacenza corrente:

```sql
dbo.XMag_GiacenzaPallet
```

Questa vista indica quali UDC risultano presenti nella cella aperta dal layout.

La diagnostica controlla anche:

```sql
dbo.XMag_GiacenzaPalletPlistChiuse
```

Questa vista non e' uno storico documentale puro. E' una vista ibrida che incrocia la giacenza corrente con i documenti SAM chiusi.
In pratica serve a individuare UDC ancora presenti in una cella fisica, ma appartenenti a una picking list/documento gia' chiuso.

## Conclusione Operativa

Per una cella fisica aperta da `Gestione layout`, i casi realmente utili sono solo due.

### 1. Nessuna Diagnostica

La UDC e' presente nella cella multipla e non compare in `XMag_GiacenzaPalletPlistChiuse`.

Significato:

```text
UDC normalmente presente in cella.
```

Non viene mostrato nessun messaggio nella colonna diagnostica.

### 2. Spedita Ma Non Scaricata Dalla Cella

La UDC e' presente nella cella fisica aperta, ma compare anche in `XMag_GiacenzaPalletPlistChiuse`.

Diagnostica mostrata:

```text
Motivo: spedita ma non scaricata dalla cella
```

Significato:

```text
La UDC appartiene a una picking list chiusa, ma non e' stata scaricata dalla cella fisica.
```

Operativamente questa UDC va selezionata e scaricata come spedita, quindi verso la cella virtuale:

```text
7G.1.1 / IDCella 9999 / barcode cella 9000000
```

## Casi Teorici Scartati Dalla Dialog

Durante l'analisi erano stati ipotizzati altri casi, ma sono stati esclusi dalla diagnostica della dialog per non confondere l'operatore.

### UDC Gia' In 7G.1.1

Se una UDC risulta davvero in `IDCella = 9999`, normalmente non dovrebbe comparire nella cella fisica aperta dal layout.
Se accadesse, sarebbe un'incoerenza tra viste o dati non sincronizzati.

Per questo la dialog di scarico da layout fisico non mostra piu' il messaggio:

```text
Motivo: spedita
```

### UDC In Picking List Chiusa Ma Non Spedita

Questo caso e' teoricamente possibile ma raro e ambiguo nel modello dati attuale.
Le viste disponibili non forniscono una distinzione documentale/storica abbastanza pulita da renderlo utile in questa dialog operativa.

Per questo la dialog non mostra piu':

```text
Motivo: in plist chiusa, non spedita e non scaricata dalla cella
```

Eventuali analisi piu' profonde vanno fatte nelle finestre di storico, non nella dialog rapida di scarico.

## Regola Finale Implementata

La diagnostica della dialog `Scarico` e' volutamente semplice:

```text
se UDC in XMag_GiacenzaPalletPlistChiuse:
    "Motivo: spedita ma non scaricata dalla cella"
altrimenti:
    diagnostica vuota
```

Questa scelta riduce il rischio di falsi positivi e mantiene chiaro il comportamento per l'operatore.

## Aggiornamento 04/07/2026 - Barcode Picking List

Durante i test sul barcode sono state introdotte alcune modifiche operative collegate alla gestione delle picking list, agli skip UDC e alla ripresa del lavoro dopo movimenti liberi.

### Anti Autosubmit Su Cambio Lista

Problema osservato:

```text
passando rapidamente da una picking list prenotata a una non prenotata,
il barcode poteva considerare come lettura valida un valore gia' presente nel campo Pallet
e scaricare automaticamente una UDC della nuova lista.
```

Correzione implementata:

```text
lo scarico automatico in picking list parte solo se il campo Pallet e' stato modificato
dall'operatore dopo il caricamento della UDC proposta.
```

In pratica, quando il programma carica una nuova UDC attesa, il valore visualizzato non puo' piu' generare da solo lo scarico. Serve una nuova lettura o digitazione effettiva.

### Skip UDC In Picking List

Durante l'evasione di una picking list, il tasto F4 assume il significato:

```text
[F4] Salta UDC
```

La UDC saltata viene registrata nella tabella:

```sql
dbo.py_BarcodePickingListSkip
```

Le righe aperte hanno:

```text
Risolto = 0
```

La query del barcode esclude le UDC saltate aperte, quindi la lista puo' proseguire sulle UDC successive senza chiudere definitivamente quelle non trovate.

### Fine Lista Con UDC Saltate

Quando una picking list non ha piu' UDC immediatamente lavorabili, ma contiene una o piu' UDC saltate, il barcode:

```text
non chiude la picking list;
rilascia la prenotazione;
lascia la lista riprenotabile;
mostra un messaggio di sospensione con numero UDC saltate.
```

La lista resta quindi aperta e potra' essere ripresa in un secondo momento.

### Riprenotazione E Ripresa UDC Saltate

Quando la picking list viene riprenotata, gli skip aperti del documento vengono marcati come risolti:

```sql
UPDATE dbo.py_BarcodePickingListSkip
   SET Risolto = 1,
       RisoltoDa = <operatore>,
       RisoltoDataOra = SYSDATETIME()
 WHERE Documento = <documento>
   AND Risolto = 0;
```

Questo permette al barcode di riproporre le UDC saltate rimaste da evadere.

### Posizione UDC Dopo Movimenti Liberi

Una UDC saltata puo' essere movimentata in pausa tramite operazioni libere, ad esempio:

```text
versamento in una nuova cella fisica;
dissociazione verso 9001000 / Non scaffalata.
```

Alla ripresa della picking list, la posizione mostrata dal barcode riflette la giacenza corrente, perche' la vista operativa deriva `Cella` e `Ubicazione` da:

```sql
dbo.XMag_GiacenzaPallet
```

Quindi una UDC prima saltata e poi spostata verra' proposta con la nuova cella, oppure come:

```text
Non scaffalata
```

se e' stata dissociata verso la locazione virtuale `9001000`.

### Regola Conservata

Resta confermata la regola operativa:

```text
una UDC diventa Spedita / 7G.1.1 / 9000000 solo nel flusso picking list.
```

Le operazioni libere non spediscono una UDC. Possono solo versarla in una cella fisica oppure metterla in `9001000 / Non scaffalata`.

### File Coinvolti

Le modifiche principali sono nei moduli:

```text
barcode_client.py
barcode_repository.py
barcode_service.py
prenota_sprenota_sql.py
version_info.py
```

La patch DB cumulativa da usare sul database online e':

```text
apply_online_python_wms_full_patch.sql
```

La patch contiene gli oggetti SQL necessari al ramo Python e puo' essere eseguita una sola volta da SSMS.
