# Barcode: logging errori e transazioni ## Problema rilevato Durante uno scarico picking list dal lettore barcode, l'operazione DB e' arrivata a buon fine ma il client ha mostrato un'eccezione. I file standard output/error erano vuoti. Con `pythonw` non e' sufficiente affidarsi a stdout/stderr: eccezioni Tk, future asincrone o callback possono non arrivare al wrapper principale. ## Strategia adottata Il client barcode ora registra errori in modo esplicito su `warehouse_fatal.log` e su `barcode_wms_launch.log`. Canali coperti: - `sys.excepthook` - `threading.excepthook` - `Tk.report_callback_exception` - exception handler del loop `asyncio` - eccezioni delle operazioni asincrone barcode - errori del repository durante movimento DB - errori post-movimento durante ricostruzione stato UI ## Transazione movimento DB Il movimento barcode passa da `BarcodeRepository.execute_legacy_move`. La batch SQL usa: ```sql SET XACT_ABORT ON; ``` ed e' eseguita con: ```python query_json(..., commit=True) ``` Questo significa: - successo: commit; - eccezione SQL/Python: rollback automatico della transazione SQLAlchemy; - il valore `@RC` restituito dalla stored legacy non viene interpretato come errore. Nota importante: in `sp_xMagGestioneMagazziniPallet`, quando il movimento va a buon fine, `@RC` viene valorizzato con `@@IDENTITY`, cioe' con l'identificativo del movimento inserito. Quindi un valore diverso da zero e' compatibile con un movimento riuscito e non deve causare rollback. ## Distinzione tra movimento e refresh UI Dopo un movimento riuscito, il service ricostruisce il messaggio UI interrogando picking list e tracciabilita'. Se questa fase post-movimento fallisce: - il movimento resta valido; - l'errore viene loggato; - l'utente vede `Movimento eseguito. Dettagli non aggiornati.`; - non viene mostrato il messaggio "transazione non completata". Se invece fallisce la transazione vera: - l'utente vede `Transazione non completata, ripeti l'operazione.`; - il dettaglio tecnico viene scritto nel log. ## File principali - `runtime_support.py` - `barcode_client.py` - `barcode_repository.py` - `barcode_service.py`