feat: FASE 3 - Flusso MeasurementTec (selezione ricetta, esecuzione misure, riepilogo)

Implementazione completa del flusso operativo per il ruolo MeasurementTec:

Blueprint measure.py:
- select_recipe: selezione ricetta con ricerca e barcode
- task_list: lista task con conteggi subtask e allegati
- task_execute: esecuzione misure con numpad, calibro USB, feedback real-time
- task_complete: riepilogo con statistiche pass/fail e export CSV
- API AJAX: lookup-barcode, save-traceability, save-measurement
- Autorizzazione role_required("MeasurementTec") su tutte le route

Componenti riutilizzabili:
- numpad.html/js/css: tastierino numerico touch-friendly con keyboard support
- caliper_status.html + caliper.js: integrazione calibro USB via Web Serial API
- barcode_scanner.html + barcode.js: scansione barcode con html5-qrcode
- measurement_feedback.html: feedback visivo pass/warning/fail in tempo reale
- next_measurement.html: indicatore prossima misurazione
- annotation-viewer.js: visualizzatore canvas con marker su disegni tecnici
- csv-export.js: export CSV con locale italiano (delimitatore ;, decimale ,)

Sicurezza:
- Decoratore role_required(*roles) per autorizzazione basata su ruoli
- CSRF token su tutti i POST AJAX
- |tojson per prevenire XSS su annotations_json
- Validazione input lato client e server

i18n: 23+ nuove chiavi tradotte IT/EN per tutti i template FASE 3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Adriano
2026-02-07 08:40:58 +01:00
parent edd4580a5a
commit a386986c17
19 changed files with 3905 additions and 16 deletions
@@ -245,3 +245,260 @@ msgstr "Tecnico di Misura"
msgid "Metrologist"
msgstr "Metrologo"
# Measure - Recipe Selection
msgid "Seleziona Ricetta"
msgstr "Seleziona Ricetta"
msgid "Scegli la ricetta di misura da eseguire"
msgstr "Scegli la ricetta di misura da eseguire"
msgid "Scansiona Barcode"
msgstr "Scansiona Barcode"
msgid "Cerca ricetta"
msgstr "Cerca ricetta"
msgid "Nome, codice o descrizione..."
msgstr "Nome, codice o descrizione..."
msgid "Numero Lotto"
msgstr "Numero Lotto"
msgid "Numero Seriale"
msgstr "Numero Seriale"
msgid "Opzionale"
msgstr "Opzionale"
msgid "ricette trovate"
msgstr "ricette trovate"
msgid "Nessuna descrizione disponibile"
msgstr "Nessuna descrizione disponibile"
msgid "Seleziona"
msgstr "Seleziona"
msgid "Nessuna ricetta trovata"
msgstr "Nessuna ricetta trovata"
msgid "Nessun risultato per"
msgstr "Nessun risultato per"
msgid "Prova con un termine diverso."
msgstr "Prova con un termine diverso."
msgid "Non ci sono ricette disponibili al momento."
msgstr "Non ci sono ricette disponibili al momento."
msgid "Inserisci o scansiona il codice della ricetta per selezionarla automaticamente."
msgstr "Inserisci o scansiona il codice della ricetta per selezionarla automaticamente."
msgid "Codice Ricetta"
msgstr "Codice Ricetta"
msgid "Es. REC-001"
msgstr "Es. REC-001"
msgid "Cerca"
msgstr "Cerca"
# Measure - Task List
msgid "Lotto"
msgstr "Lotto"
msgid "Seriale"
msgstr "Seriale"
msgid "Task da eseguire"
msgstr "Task da eseguire"
msgid "Task"
msgstr "Task"
msgid "misurazioni"
msgstr "misurazioni"
msgid "Allegato"
msgstr "Allegato"
msgid "Inizia Misure"
msgstr "Inizia Misure"
msgid "Nessun task disponibile"
msgstr "Nessun task disponibile"
msgid "Questa ricetta non ha ancora task definiti."
msgstr "Questa ricetta non ha ancora task definiti."
msgid "Seleziona altra ricetta"
msgstr "Seleziona altra ricetta"
msgid "misurazioni totali"
msgstr "misurazioni totali"
# Measure - Task Execute
msgid "Task di misurazione"
msgstr "Task di misurazione"
msgid "Disegno Tecnico"
msgstr "Disegno Tecnico"
msgid "attivo"
msgstr "attivo"
msgid "Visualizzatore PDF"
msgstr "Visualizzatore PDF"
msgid "In fase di sviluppo"
msgstr "In fase di sviluppo"
msgid "Apri PDF"
msgstr "Apri PDF"
msgid "Nessuna immagine allegata"
msgstr "Nessuna immagine allegata"
msgid "Segui le istruzioni nella direttiva"
msgstr "Segui le istruzioni nella direttiva"
msgid "Misurazione"
msgstr "Misurazione"
msgid "Nominale"
msgstr "Nominale"
msgid "Misura"
msgstr "Misura"
msgid "Misurazione registrata"
msgstr "Misurazione registrata"
msgid "Salvataggio..."
msgstr "Salvataggio..."
msgid "Riepilogo"
msgstr "Riepilogo"
msgid "Misurazioni Complete"
msgstr "Misurazioni Complete"
msgid "Tutte le"
msgstr "Tutte le"
msgid "misurazioni sono state registrate."
msgstr "misurazioni sono state registrate."
msgid "Conformi"
msgstr "Conformi"
msgid "Non Conf."
msgstr "Non Conf."
msgid "Vai al Riepilogo"
msgstr "Vai al Riepilogo"
msgid "Errore nel salvataggio della misurazione"
msgstr "Errore nel salvataggio della misurazione"
msgid "Errore di rete. Riprovare."
msgstr "Errore di rete. Riprovare."
# Measure - API Errors
msgid "Errore nel caricamento delle ricette: %(detail)s"
msgstr "Errore nel caricamento delle ricette: %(detail)s"
msgid "Ricetta non trovata: %(detail)s"
msgstr "Ricetta non trovata: %(detail)s"
msgid "Errore nel caricamento dei task: %(detail)s"
msgstr "Errore nel caricamento dei task: %(detail)s"
msgid "Task non trovato: %(detail)s"
msgstr "Task non trovato: %(detail)s"
msgid "Codice non fornito"
msgstr "Codice non fornito"
msgid "Ricetta non trovata"
msgstr "Ricetta non trovata"
msgid "Dati mancanti: subtask_id, task_id e value sono obbligatori"
msgstr "Dati mancanti: subtask_id, task_id e value sono obbligatori"
msgid "Errore nel salvataggio"
msgstr "Errore nel salvataggio"
# Task Complete Page
msgid "Codice"
msgstr "Codice"
msgid "Nome"
msgstr "Nome"
msgid "Versione"
msgstr "Versione"
msgid "Totale"
msgstr "Totale"
msgid "Dettaglio Misurazioni"
msgstr "Dettaglio Misurazioni"
msgid "Esporta CSV"
msgstr "Esporta CSV"
msgid "Descrizione"
msgstr "Descrizione"
msgid "Deviazione"
msgstr "Deviazione"
msgid "Esito"
msgstr "Esito"
msgid "Metodo"
msgstr "Metodo"
msgid "Pass"
msgstr "Pass"
msgid "Warning"
msgstr "Warning"
msgid "Fail"
msgstr "Fail"
msgid "Manuale"
msgstr "Manuale"
msgid "Calibro"
msgstr "Calibro"
msgid "Ripeti misurazioni"
msgstr "Ripeti misurazioni"
# Measurement Feedback
msgid "CONFORME"
msgstr "CONFORME"
msgid "ATTENZIONE"
msgstr "ATTENZIONE"
msgid "NON CONFORME"
msgstr "NON CONFORME"
# Caliper Status
msgid "Connessione..."
msgstr "Connessione..."
msgid "Errore calibro"
msgstr "Errore calibro"
msgid "Browser non supporta Web Serial API"
msgstr "Browser non supporta Web Serial API"
# Recipe Selection Additional
msgid "Errore di connessione"
msgstr "Errore di connessione"