feat(production): fermo linea e fine produzione fanno finalmente qualcosa

Punto 6 del documento modifiche del 28/07. I due pulsanti esistevano, chiedevano
correttamente l'autorizzazione del capoturno, e poi ricadevano su un commento:
"handled by GAIA integration (future)". E' la riga di apertura del documento.

Ora agiscono sulla produzione aperta: fermo linea sospende e congela il conto alla
rovescia, la ripresa lo fa ripartire restituendo il tempo del fermo, fine
produzione chiude ed emette il file di statistica. Le credenziali del capoturno
vanno direttamente all'endpoint, che le verifica e registra sulla traccia della
produzione chi ha autorizzato cosa: validarle a parte non lascerebbe traccia, e
sarebbe un giro in piu'.

In interfaccia il pulsante di fermo diventa "Riprendi" quando la linea e' ferma, e
una banda dichiara lo stato con il valore congelato a video: una linea ferma che
sembra in marcia e' il modo in cui si salta un intervallo di misura senza
accorgersene.

Il file di statistica ha richiesto di legare le misure alla produzione (migrazione
006): Measurement conosceva solo versione, lotto e seriale, nessuno dei quali
separa una produzione dalla successiva sulla stessa ricetta e sullo stesso lotto,
quindi "le misure dell'intera produzione" non era una query. Il CSV rispetta i
separatori configurati in system_settings e porta con se' i limiti di tolleranza:
senza quelli un esito pass/fail non e' piu' ricalcolabile dal file a distanza di
anni, che e' il senso di un documento per audit. Le misure esportate vengono
marcate synced_to_csv. Se la produzione non ha misure non viene scritto nulla: un
file vuoto sarebbe rumore nella cartella, non evidenza.

L'invio a GAIA resta assente e non abbozzato, con il punto d'innesto dichiarato in
close_run: una chiamata vuota che sembra collegata e' peggio di niente. Tutto il
resto del punto 6 non dipende dal gestionale e funziona adesso.

Anche la 006 e' stata eseguita su SQLite usa e getta prima di essere considerata
buona, e anche qui la prova ha trovato un difetto: aggiungere una colonna con
foreign key fa emettere ad alembic un ALTER di vincolo, che SQLite rifiuta. Ora usa
batch_alter_table con il vincolo nominato, che su MySQL resta un ALTER normale e su
SQLite ricostruisce la tabella - cosi' la chiave esterna non va persa per far
contento il dialetto dei test.

Corretto anche il proxy di salvataggio misura, che chiamava /api/measurements senza
slash finale e pagava un redirect 307 a ogni singola misura.

Traduzioni: pybabel aveva di nuovo indovinato sette voci marcandole fuzzy, e in
italiano "Linea ferma" era diventato "Lingua Preferita" su una banda di sicurezza.
Tradotte per esteso in IT ed EN e tolti i flag.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-07-28 17:32:43 +00:00
parent 55e5e0153f
commit 7bc3c1f938
16 changed files with 889 additions and 159 deletions
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: TieMeasureFlow 1.0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2026-07-28 16:15+0000\n"
"POT-Creation-Date: 2026-07-28 17:30+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n"
@@ -37,7 +37,7 @@ msgstr "Please log in to continue"
msgid "Inserisci username e password"
msgstr "Enter username and password"
#: blueprints/auth.py:81 blueprints/measure.py:407
#: blueprints/auth.py:81 blueprints/measure.py:412
msgid "Credenziali non valide"
msgstr "Invalid credentials"
@@ -156,20 +156,20 @@ msgstr "Recipe not found"
msgid "Dati mancanti: subtask_id, version_id e value sono obbligatori"
msgstr "Missing data: subtask_id, version_id and value are required"
#: blueprints/measure.py:383 templates/admin/stations.html:549
#: blueprints/measure.py:388 templates/admin/stations.html:549
#: templates/maker/recipe_editor.html:543
msgid "Errore nel salvataggio"
msgstr "Error saving"
#: blueprints/measure.py:402
#: blueprints/measure.py:407 blueprints/measure.py:495
msgid "Username e password richiesti"
msgstr "Username and password required"
#: blueprints/measure.py:412
#: blueprints/measure.py:417
msgid "Utente non autorizzato (richiesto capoturno)"
msgstr "User not authorized (shift supervisor required)"
#: blueprints/measure.py:431 blueprints/measure.py:448
#: blueprints/measure.py:436 blueprints/measure.py:453
#: templates/errors/station_not_configured.html:2
#: templates/errors/station_not_configured.html:16
msgid "Stazione non configurata"
@@ -376,7 +376,7 @@ msgstr "Optional notes"
#: templates/maker/task_editor.html:747 templates/maker/task_editor.html:866
#: templates/maker/task_editor.html:931 templates/maker/task_editor.html:1036
#: templates/measure/select_recipe.html:367
#: templates/measure/task_execute.html:684
#: templates/measure/task_execute.html:719
msgid "Annulla"
msgstr "Cancel"
@@ -392,7 +392,7 @@ msgstr "Create Station"
#: templates/admin/stations.html:241 templates/admin/users.html:299
#: templates/maker/recipe_editor.html:107
#: templates/maker/recipe_editor.html:448 templates/maker/task_drawing.html:61
#: templates/measure/task_execute.html:380
#: templates/measure/task_execute.html:391
msgid "Salvataggio..."
msgstr "Saving..."
@@ -521,7 +521,7 @@ msgstr "New User"
#: templates/admin/users.html:48 templates/admin/users.html:173
#: templates/admin/users.html:179 templates/auth/login.html:35
#: templates/auth/login.html:49 templates/auth/profile.html:36
#: templates/measure/task_execute.html:669
#: templates/measure/task_execute.html:704
msgid "Username"
msgstr "Username"
@@ -573,7 +573,7 @@ msgstr "Username cannot be changed"
#: templates/admin/users.html:206 templates/admin/users.html:214
#: templates/auth/login.html:57 templates/auth/login.html:71
#: templates/measure/task_execute.html:674
#: templates/measure/task_execute.html:709
msgid "Password"
msgstr "Password"
@@ -864,7 +864,7 @@ msgstr "Preview"
#: templates/maker/recipe_editor.html:128 templates/maker/recipe_list.html:246
#: templates/maker/task_drawing.html:106 templates/maker/task_editor.html:130
#: templates/measure/task_complete.html:168
#: templates/measure/task_execute.html:497 templates/measure/task_list.html:2
#: templates/measure/task_execute.html:532 templates/measure/task_list.html:2
#: templates/measure/task_list.html:156
msgid "Task"
msgstr "Task"
@@ -1013,8 +1013,8 @@ msgstr "Error during deletion"
# Recipe Selection Additional
#: templates/maker/recipe_list.html:55 templates/measure/select_recipe.html:55
#: templates/measure/task_execute.html:1057
#: templates/measure/task_execute.html:1241
#: templates/measure/task_execute.html:1102
#: templates/measure/task_execute.html:1301
msgid "Errore di connessione"
msgstr "Connection Error"
@@ -1144,7 +1144,7 @@ msgid "Apri PDF"
msgstr "Open PDF"
#: templates/maker/recipe_preview.html:254
#: templates/measure/task_execute.html:255
#: templates/measure/task_execute.html:266
msgid "Nessuna immagine allegata"
msgstr "No image attached"
@@ -1155,7 +1155,7 @@ msgstr "Measurement Points"
#: templates/maker/recipe_preview.html:299 templates/maker/task_editor.html:544
#: templates/maker/task_editor.html:686
#: templates/measure/task_complete.html:170
#: templates/measure/task_execute.html:289
#: templates/measure/task_execute.html:300
msgid "Nominale"
msgstr "Nominal"
@@ -1612,7 +1612,7 @@ msgid "Misurazione aggiunta"
msgstr "Measurement added"
#: templates/maker/task_editor.html:1645
#: templates/measure/task_execute.html:931
#: templates/measure/task_execute.html:976
msgid "Errore nel salvataggio della misurazione"
msgstr "Error saving measurement"
@@ -1770,13 +1770,13 @@ msgstr "Search"
#: templates/measure/task_complete.html:3
#: templates/measure/task_complete.html:36
#: templates/measure/task_execute.html:112
#: templates/measure/task_execute.html:605
#: templates/measure/task_execute.html:640
#: templates/statistics/dashboard.html:139
msgid "Riepilogo"
msgstr "Summary"
#: templates/measure/task_complete.html:44
#: templates/measure/task_execute.html:582
#: templates/measure/task_execute.html:617
msgid "Misurazioni Complete"
msgstr "Measurements Complete"
@@ -1797,12 +1797,12 @@ msgid "Totale"
msgstr "Total"
#: templates/measure/task_complete.html:103
#: templates/measure/task_execute.html:590
#: templates/measure/task_execute.html:625
msgid "Conformi"
msgstr "Pass"
#: templates/measure/task_complete.html:120
#: templates/measure/task_execute.html:594
#: templates/measure/task_execute.html:629
msgid "Attenzione"
msgstr "Warning"
@@ -1970,120 +1970,148 @@ msgstr "Measurement task"
msgid "Lista task"
msgstr "Task list"
#: templates/measure/task_execute.html:124
#: templates/measure/task_execute.html:127
msgid "Fermo linea"
msgstr "Line stop"
#: templates/measure/task_execute.html:132
#: templates/measure/task_execute.html:135
msgid "Riprendi"
msgstr "Resume"
#: templates/measure/task_execute.html:143
msgid "Fine Produzione"
msgstr "End Production"
#: templates/measure/task_execute.html:227
#: templates/measure/task_execute.html:238
msgid "Immagine dettaglio misura"
msgstr "Measurement detail image"
#: templates/measure/task_execute.html:275
#: templates/measure/task_execute.html:286
msgid "Misurazione"
msgstr "Measurement"
#: templates/measure/task_execute.html:277
#: templates/measure/task_execute.html:288
msgid "Misura"
msgstr "Measure"
#: templates/measure/task_execute.html:353
#: templates/measure/task_execute.html:364
msgid "Registrata"
msgstr "Recorded"
#: templates/measure/task_execute.html:421
#: templates/measure/task_execute.html:432
msgid "Prossima misurazione tra"
msgstr "Next measurement in"
#: templates/measure/task_execute.html:426
#: templates/measure/task_execute.html:437
msgid "Ciclo"
msgstr "Cycle"
#: templates/measure/task_execute.html:445
#: templates/measure/task_execute.html:456
msgid "Linea ferma"
msgstr "Line stopped"
#: templates/measure/task_execute.html:459
msgid "Il conto alla rovescia è congelato a"
msgstr "The countdown is frozen at"
#: templates/measure/task_execute.html:461
msgid "serve il capoturno per riprendere"
msgstr "the supervisor must authorise the restart"
#: templates/measure/task_execute.html:480
msgid "Produzione non registrata sul server"
msgstr "Production not recorded on the server"
#: templates/measure/task_execute.html:466
#: templates/measure/task_execute.html:632
#: templates/measure/task_execute.html:501
#: templates/measure/task_execute.html:667
msgid "Avvio Produzione"
msgstr "Production Start"
#: templates/measure/task_execute.html:470
#: templates/measure/task_execute.html:505
msgid "Invia segnale al gestionale per avviare il timer della linea"
msgstr "Send a signal to the ERP system to start the line timer"
#: templates/measure/task_execute.html:481
#: templates/measure/task_execute.html:516
msgid "Produzione avviata"
msgstr "Production started"
#: templates/measure/task_execute.html:526
#: templates/measure/task_execute.html:561
msgid "Fine ciclo misura"
msgstr "Measurement cycle complete"
#: templates/measure/task_execute.html:536
#: templates/measure/task_execute.html:550
#: templates/measure/task_execute.html:571
#: templates/measure/task_execute.html:585
msgid "Completato"
msgstr "Completed"
#: templates/measure/task_execute.html:584
#: templates/measure/task_execute.html:619
msgid "Tutte le"
msgstr "All"
#: templates/measure/task_execute.html:584
#: templates/measure/task_execute.html:619
msgid "misurazioni sono state registrate."
msgstr "measurements have been recorded."
#: templates/measure/task_execute.html:598
#: templates/measure/task_execute.html:633
msgid "Non Conf."
msgstr "Fail"
#: templates/measure/task_execute.html:612
#: templates/measure/task_execute.html:647
msgid "Conferma ciclo"
msgstr "Confirm cycle"
#: templates/measure/task_execute.html:622
#: templates/measure/task_execute.html:657
msgid "Task successivo"
msgstr "Next task"
#: templates/measure/task_execute.html:662
#: templates/measure/task_execute.html:697
msgid "Autorizzazione capoturno"
msgstr "Shift supervisor authorization"
#: templates/measure/task_execute.html:671
#: templates/measure/task_execute.html:706
msgid "Username capoturno"
msgstr "Supervisor username"
#: templates/measure/task_execute.html:693
#: templates/measure/task_execute.html:728
msgid "Autorizza"
msgstr "Authorize"
#: templates/measure/task_execute.html:975
#: templates/measure/task_execute.html:1020
msgid "Errore di rete. Riprovare."
msgstr "Network error. Please retry."
#: templates/measure/task_execute.html:1052
#: templates/measure/task_execute.html:1097
msgid "Errore di comunicazione con il server"
msgstr "Error communicating with the server"
#: templates/measure/task_execute.html:1198
#: templates/measure/task_execute.html:1248
msgid "Misurazione fuori tolleranza"
msgstr "Measurement out of tolerance"
#: templates/measure/task_execute.html:1199
#: templates/measure/task_execute.html:1249
msgid "Fermo linea richiesto"
msgstr "Line stop requested"
#: templates/measure/task_execute.html:1200
#: templates/measure/task_execute.html:1250
msgid "Ripresa della produzione"
msgstr "Resuming production"
#: templates/measure/task_execute.html:1251
msgid "Fine produzione richiesta"
msgstr "End of production requested"
#: templates/measure/task_execute.html:1219
#: templates/measure/task_execute.html:1280
msgid "Credenziali non valide o utente non autorizzato"
msgstr "Invalid credentials or unauthorized user"
#: templates/measure/task_execute.html:1312
msgid "Nessuna produzione aperta su questa stazione"
msgstr "No production open at this station"
#: templates/measure/task_execute.html:1329
msgid "Azione non riuscita"
msgstr "Action failed"
#: templates/measure/task_list.html:84
msgid "AVVIA"
msgstr "START"