Specifica Form Barcode WMS
Documento di lavoro per replica Python del client barcode C# con miglioramenti di usabilita'.
1. Obiettivo operativo
La form barcode guida il magazziniere nello scarico dei pallet secondo due code operative:
- F1 = coda ad alta priorita', cioe' picking list prenotata (IDStato = 1)
- F2 = coda a bassa priorita', cioe' picking list non prenotata (IDStato = 0)
Il magazziniere puo' passare da una coda all'altra e il sistema riprende dal punto corretto interrogando il database a ogni richiesta. Occorre che la seconda coda che compare , e che non può essere prenotata sulla desktop app se ne è già stata prenotata una, sia quella più vecchia tra quelle esistenti nell’elenco, cioè quella con id del documento più basso.
2. File C# analizzati
- C:_decompiled.cs
- C:_decompiled.cs
- C:_house.sql
3. Comandi principali della form C#
- F1 / H Priority: imposta iStatoPkPallet = 1 e carica la prossima riga da XMag_ViewPackingList con IDStato = 1
- F2 / L Priority: imposta iStatoPkPallet = 0 e carica la prossima riga da XMag_ViewPackingList con IDStato = 0
- Enter / Salva: esegue il movimento quando i campi sono completi, quindi questa operazione effettua un carico, ma prima l’operatore deve premer un tasto che resetta di due campi , cioè li azzera e deve comparire una barra rossa sulla form del barcode (verificare il c#), da quel momento se l’operatore legge i barcode della udc e il bacrode della locazione e preme “carica” non “salva” avviene il versamento.
4. Significato reale dei campi nella form legacy
La UI C# e' poco intuitiva perche' i nomi dei campi non spiegano bene il flusso.
- txtDocRif
etichetta visibile: Pallet
significato reale: barcode del pallet letto o da confermare
- txtBarcode
etichetta visibile: Cella
significato reale: ubicazione operativa di destinazione o uscita; nel picking viene impostata a 9000000
- lblTesto1
mostra ubicazione sorgente o stato operazione
- lblTesto2
mostra Documento
- lblTesto3
mostra cliente o nazione
- lblTesto4
mostra il pallet atteso, come passo successivo nella coda selezionata. 
5. Flusso F1 e F2 nel C#
Metodo chiave: GetDatiPallet("", "", idStato) in FSkMovimenti.cs.
Query utilizzata:
SELECT TOP 1 * FROM XMag_ViewPackingList WHERE Ordinamento > 0 AND IDStato = idStato ORDER BY Ordinamento
Effetto operativo:
- legge il prossimo pallet della coda scelta
- mostra ubicazione, documento, cliente e pallet atteso
- se la ricerca parte senza barcode specifico, alla fine la funzione restituisce 9000000
- per questo i pulsanti F1/F2 finiscono per scrivere 9000000 nel campo Cella
Flusso reale per l'operatore:
1. preme F1 oppure F2
2. il sistema mostra il prossimo pallet atteso
3. il campo Cella viene impostato a 9000000
4. l'operatore scansiona il pallet nel campo Pallet
5. se il pallet coincide con quello atteso, viene eseguito lo scarico
6. Validazione dello scan
Metodo chiave: SalvaOk().
Regola importante:
- se txtBarcode = 9000000, il pallet letto in txtDocRif deve coincidere con lblTesto4
- se non coincide, il sistema scrive Errata Lettura e blocca l'operazione
- se coincide, chiama Ricevi(...)
Questa e' la protezione che impedisce di scaricare il pallet sbagliato durante il picking.
7. Esecuzione del movimento
Metodi chiave nel C#:
- Ricevi(...)
- spt_SaveStoredProcedure(...)
Stored procedure usata:
sp_xMagGestioneMagazziniPallet
Parametri principali:
- IDOperatore
- BarcodeCella
- BarcodePallet
- NumeroCella
Dopo il movimento il C# richiama ancora GetDatiPallet(sBarcodePallet, sBarcodeCella, iStatoPkPallet) per riallinearsi alla coda corrente.
8. Legame con la prenotazione della picking list
La prenotazione dal backoffice chiama la stored:
sp_xExePackingListPallet
Effetto DB:
- mette Celle.IDStato = 1 sulle celle del documento prenotato
- se richiamata di nuovo, toglie la prenotazione riportando IDStato = 0
- registra il documento in LogPackingList
Dopo ogni scarico, sp_xMagGestioneMagazziniPallet richiama:
sp_ControllaPrenotazionePackingListPalletNew
Questa procedura:
- legge l'ultima picking list attiva dal log
- riapplica IDStato = 1 alle celle residue del documento tramite sp_xExePackingListPalletPrenota
Quindi il comportamento risultante e':
- F1 continua a scorrere la picking list prenotata residua
- F2 continua a scorrere la coda non prenotata
9. Allineamento con il backoffice
Nel backoffice C# la griglia picking list:
- carica la testata aggregata da XMag_ViewPackingList
- il dettaglio basso e' agganciato al solo Documento
- Prenota/Sprenota richiama la stessa stored e poi ricarica davvero la griglia con InitGrid()
Questo modello e' coerente con il comportamento della form barcode.
10. Criticita' di usabilita' della form legacy
- etichette fuorvianti: Cella e Pallet non spiegano cosa va letto in quel momento
- il valore 9000000 compare senza contesto esplicito
- non e' chiaro visivamente se si sta lavorando in F1 o in F2
- i label non parlano il linguaggio dell'operatore
- la regola di validazione contro il pallet atteso non e' evidente a schermo
- la UI richiede addestramento e memoria del flusso, non si lascia capire da sola
11. Specifica proposta per il nuovo client Python barcode
Da mantenere identico al C#:
- una sola picking list prenotata per volta
- F1 legge IDStato = 1
- F2 legge IDStato = 0
- ordine di proposta basato su Ordinamento
- scarico tramite la stessa semantica DB del C#
- verifica del barcode atteso prima dello scarico verso 9000000
Da migliorare nella nuova UI:
- mostrare chiaramente la coda attiva: Alta priorita' (F1) o Bassa priorita' (F2)
- rinominare i campi in modo esplicito
  - Pallet atteso
  - Pallet letto
  - Ubicazione sorgente
  - Destinazione operativa
- mostrare un messaggio guida esplicito: Scansiona il pallet indicato
- evidenziare in grande ubicazione da raggiungere e pallet atteso
- separare visivamente missione, area scan ed esito operazione
- mantenere il focus sempre sul campo scan
- usare hotkey semplici: F1, F2, Enter
12. Architettura consigliata del client Python
- UI minimale in tkinter puro
- service layer con logica operativa F1/F2
- repository layer per SQL e stored procedure
- timeout configurabili
- reconnect DB automatico
- log rotante
- zero finestre multiple
- stato minimo in RAM
13. Conclusione
Il comportamento C# della form barcode e' oggi abbastanza chiaro: e' piu' coerente di quanto sembri, ma e' esposto con una UI poco autoesplicativa. Il nuovo client Python dovrebbe quindi essere una replica funzionale fedele, ma con una UI molto piu' guidata e leggibile.