Casi d'uso
Scenari operativi reali del laboratorio Semiorto, con attori, trigger, passi e post-condizioni
Casi documentati
- UC-1: Accettazione nuovo lotto in laboratorio
- UC-2: Avvio nuova analisi di germinabilità
- UC-3: Registrazione conte giornaliere
- UC-4: Chiusura analisi con risultato
- UC-5: Stampa certificato di analisi per cliente
- UC-6: Gestione lotti esauriti
- UC-7: Verifica mensile "Da Analizzare"
- UC-8: Aggiunta fornitore inline durante creazione lotto
- UC-9: Configurazione calendario analisi di una specie
- UC-10: Cancellazione e ripristino analisi errata
- UC-11: Admin crea nuovo utente laboratorio
- UC-12: Reset password utente (self + admin)
- UC-13: Ricerca storica per cliente/varietà
UC-1: Accettazione nuovo lotto in laboratorio
- Attore
- Magazzino oppure Laboratorio
- Trigger
- Fornitore consegna un lotto di seme con documento di trasporto
- Pre-condizioni
- Utente loggato, specie/varietà/produttore già esistenti in anagrafica
Passi principali
- Utente apre menu Lotto → Aggiungi (
/lottos/lotto/new) - Seleziona la specie (es. Pomodoro) dal dropdown
- Il dropdown varietà si popola via AJAX con le varietà di quella specie
- Seleziona varietà (es. Italiko Ex-Genovese Classico)
- Seleziona fornitore (es. Schiavone Fernando). Se non esiste → usa modal
+per crearlo inline (vedi UC-8) - Inserisce quantità in kg (es. 5.5) o numero semi
- Inserisce data arrivo (datepicker, default oggi)
- Inserisce codice lotto (es.
VSF012/E-C) — libero, non auto-generato - Salva
Flusso alternativo
Se il codice lotto è già presente nel sistema → messaggio di warning: "Il lotto esiste già, vuoi creare un lotto con lo stesso nome?"
- Se sì → checkbox
forza=true, nuovo salva. Viene creato un lotto duplicato (stesso codice, id diverso) - Se no → utente modifica il codice
Post-condizioni
- Nuovo record in
semiorto_lottoconesaurito=false - Redirect a lista lotti
UC-2: Avvio nuova analisi di germinabilità
- Attore
- Laboratorio
- Trigger
- Lotto arrivato, serve test di germinabilità
- Pre-condizioni
- Lotto esistente e non esaurito
Passi
- Tecnico apre Analisi → Nuova (
/analisis/analisi/new) - Vede lista lotti non ancora analizzati (filtrabile per specie)
- Click sul lotto desiderato → redirect a
/analisis/lotto/{id}/new - Il sistema crea l'entity con:
ftauto-generato (es. "3562/26")dataArrivoLaboratorio= oggiid_lotto= lotto selezionato- Una conta A pre-popolata con
giorni_1 = specie.giorni1Contaegiorni_2 = specie.giorniTConta − specie.giorni1Conta
- Mostra form completo con dati pre-compilati
- Tecnico compila campi mancanti:
- Tipologia seme (Natura, Selezionato, Calibrato, …)
- Prova (PETRI / TORBA / CONT. ALVEOLATI)
- Categoria (STANDARD / COMMERCIALE)
- Replica analisi (1/2/3 repliche = letters A, A+B, A+B+C)
- Calibratura, Data inizio, Note, ecc.
- Salva (azione default) → persiste, torna al form con messaggio "salvato"
Post-condizioni
- Analisi in stato In corso (
data IS NULL) - Ora è visibile in "Analisi → In Corso" con contatore aggiornato in navbar
UC-3: Registrazione conte giornaliere
- Attore
- Laboratorio
- Trigger
- È arrivato il giorno della 1ᵃ o 2ᵃ conta (es. giorno 5 dall'inizio, poi giorno 10)
- Pre-condizioni
- Analisi esistente, data inizio registrata
Passi 1ª conta (tipicamente giorno 5)
- Tecnico apre Analisi → In Corso → vede le analisi con badge "(1°) data"
- Click su analisi →
/analisis/analisi/{id} - Nella sezione "Conte giornaliere", seleziona la ripetizione A
- Inserisce nei campi
germinati_1,duri_1,freschi_1,anormali_1,morti_1i conteggi osservati (somma = 100) - Seleziona
vigore_1(SCARSO / MEDIO / OTTIMO) dal radio - Salva (default)
- Ripete per B, C, D (altre 3 Petri)
Passi 2ª conta (tipicamente giorno 10, alla fine)
- Tecnico torna sull'analisi
- Compila
germinati_2,duri_2, ecc. per le 4 ripetizioni - Salva
Aggiunta manuale di una conta
Se per qualche motivo servono più di 4 repliche:
- Click + Aggiungi Conta
- Il sistema assegna la prossima lettera disponibile (A → B → C → D → E → …)
- Giorni pre-popolati = quelli della prima conta
Post-condizioni
- Una o più conte in
semiorto_contecollegate all'analisi - Germinabilità media aggiornata (calcolata on-the-fly ogni save)
UC-4: Chiusura analisi con risultato
- Attore
- Laboratorio
- Trigger
- Raggiunto il giorno totale prova + tutte le conte completate
- Pre-condizioni
- Analisi "In corso", tutte le repliche hanno
giorni_2compilati
Passi
- Tecnico apre analisi
- Click "Chiudi Analisi" → azione =
CHIUDI_ANALISI - Spring valida: tutti i campi required, tutte le conte complete
- Se errori → messaggi rossi sotto i campi, non chiude
- Se OK:
data= oggi (data chiusura)- Mostra form chiusura con campi aggiuntivi pre-compilati:
- Germinabilità = somma germinati medi (calcolata + normalizzata)
- Vigore finale = media vigori delle conte
- Tecnico (obbligatorio)
- Scostamento (REGOLARE / IRREGOLARE)
- Risultato (POSITIVO / NEGATIVO) ← deciso dal tecnico, non auto
- Tecnico conferma
- Save finale
Post-condizioni
- Analisi chiusa (
dataNOT NULL) - Esce da "In corso", appare in "Cerca" con filtri anno
- Disponibili stampe Scheda e Certificato
📌 Risultato POS/NEG non automatico
Contrariamente a quanto si potrebbe pensare, il sistema non imposta POSITIVO automaticamente in base alla germinabilità. Il tecnico lo decide manualmente al momento della chiusura. Questo permette di gestire casi limite (es. 84% potrebbe essere POS per una specie specifica o NEG per un'altra).
UC-5: Stampa certificato di analisi per cliente
- Attore
- Laboratorio
- Trigger
- Cliente richiede certificato formale
- Pre-condizioni
- Analisi chiusa con risultato POSITIVO (normalmente)
Passi
- Tecnico apre analisi chiusa
- Click "Stampa Certificato" → GET
/analisis/analisi/{id}/{azienda}/certificato - Backend:
- Popola mappa 20 placeholder (NOME_SPECIE, DATA_ARRIVO, GERMINATI, ecc.)
- Carica template
modello-certificato-{azienda}.docxdaTEMPLATES_DIRECTORY/ - Sostituisce ogni
$$_NOME_$$con valore - Invia DOCX al browser con nome
Quality-Certificate-{lotto}-YYYY/MM/YY.docx
- Utente salva/stampa il file
Post-condizioni
- Nessuna modifica DB. Il certificato è ricalcolato ogni volta.
UC-6: Gestione lotti esauriti
- Attore
- Magazzino o Laboratorio
- Trigger
- Seme finito in laboratorio o venduto tutto
Modalità 1: bulk dalla lista lotti
- Apre Lotto → Setta come esaurito (
/lottos/) - Cerca i lotti con filtri (specie, varietà, codice)
- Spunta le checkbox dei lotti da marcare
- Click "Setta esauriti" → POST
/lottos/settaEsaurito - Sistema imposta
esaurito=true,dataEsaurito=oggiper tutti i selezionati
Modalità 2: da dettaglio analisi
- Nella lista analisi "Da Analizzare", vede lotti suggeriti per rianalisi
- Se sa che il lotto è esaurito, click sul bottone "Lotto esaurito" accanto
- GET
/analisis/lottoEsaurito/{idLotto}→ stesso effetto
Post-condizioni
- Lotto non apparirà più in "Da Analizzare"
- Nelle query analisi filtrate per esaurito, appare nel set giusto
UC-7: Verifica mensile "Da Analizzare"
- Attore
- Laboratorio
- Trigger
- Inizio mese o check periodico
Passi
- Tecnico vede badge rosso "Da Analizzare (N)" nella navbar
- Click →
/analisis/daAnalizzare - Sistema esegue query SQL complessa (vedi Flussi): "Quali lotti attivi di specie configurate per questo mese non sono stati ri-analizzati?"
- Per ogni lotto in lista, tecnico decide:
- Crea nuova analisi (link "Analizza")
- Imposta lotto esaurito se non ci sono più semi
Post-condizioni
- Badge "Da Analizzare" si azzera quando tutti i lotti sono gestiti
UC-8: Aggiunta fornitore inline durante creazione lotto
- Attore
- Magazzino
- Trigger
- Fornitore non presente nel dropdown durante creazione lotto
Passi
- Nel form lotto, click sul "+" blu a fianco del campo Fornitore
- Si apre modal "Aggiungi Fornitore" con campi Nome + Codice
- Utente compila
- Click "Aggiungi" → AJAX POST a
/produttores/produttore/update/json - Backend:
- Normalizza nome e codice in MAIUSCOLO
- Valida (duplicati, campi obbligatori)
- Se OK → salva + restituisce JSON
{obj:{id:123,nome:"...",codice:"..."}} - Se errore →
{error:true, errors:["..."]}
- Frontend:
- Se OK → aggiunge opzione al dropdown + la seleziona + chiude modal
- Se errore → alert + modal resta aperto
- Utente continua la compilazione del lotto
UC-9: Configurazione calendario analisi di una specie
- Attore
- Laboratorio (chi sa quando rianalizzare le varie specie)
- Trigger
- Nuova specie aggiunta o aggiornamento protocollo
Passi
- Menu Specie → Lista
- Click su specie →
/species/specie/{id} - Compila campi base: italiano, inglese, latino, codice, giorni1Conta, giorniTConta, UR%
- Scorre alla sezione "Ripetizione analisi" — matrice 12 mesi × 9 tipologie seme
- Spunta le celle corrispondenti al calendario desiderato:
- Esempio: Pomodoro → Maggio/Natura, Settembre/Selezionato, Gennaio/Calibrato
- Salva
Post-condizioni
- Per ogni cella spuntata → record in
semiorto_map_specie_analisi_ripetizione_tipologia_seme - Query "Da Analizzare" include ora i lotti di questa specie nei mesi configurati
UC-10: Cancellazione e ripristino analisi errata
- Attore
- Laboratorio (cancella), Amministrazione (ripristina/elimina definitivamente)
- Trigger
- Errore nell'inserimento (es. lotto sbagliato, conte errate)
Cancellazione (soft)
- Tecnico apre analisi
- Click "Cancella" → modal chiede motivo (es. "Errore lotto")
- POST
/analisis/cancellacon id + motivo - Backend imposta
cancella = motivo, non elimina fisicamente - Analisi sparisce dalle liste attive
Ripristino da parte admin
- Admin apre Amministrazione → Analisi Cancellate
- Vede lista con motivo di cancellazione
- Click su analisi → apre dettaglio readonly
- Può rimuovere campo
cancellavia update (da verificare se il form lo permette)
Eliminazione definitiva
- Admin clicca "Elimina definitivamente" nella lista cancellate
- GET
/amministrazione/analisis/analisi/{id}/cancella - Backend esegue
DELETE FROM semiorto_analisi WHERE id=? - Cascade elimina anche tutte le conte associate
UC-11: Admin crea nuovo utente laboratorio
- Attore
- Amministrazione
- Trigger
- Assunzione nuovo tecnico di laboratorio
Passi
- Menu Amministrazione → Utenti
- Click "Aggiungi" →
/amministrazione/utente/new - Compila:
- Nome, Cognome
- Username (unique, validato)
- Stato: ATTIVO
- Permessi: checkbox "Laboratorio"
- Submit → POST
/amministrazione/utente/update - Backend:
- Valida
- Crea record
utenteconcambiaPassword=true - Genera password random
- Invia email "[Semiorto] Creazione utente" con password temp
- Crea record in tabella
permessi
- Nuovo utente riceve email con credenziali temporanee
Primo login nuovo utente
- Utente si logga con password temporanea
- Sistema rileva
cambiaPassword=true→ redirect forzato a/utente/cambioPassword - Utente imposta nuova password
- Logout forzato + re-login
UC-12: Reset password utente (self + admin)
12a — Self-service (utente dimentica password)
- Login page → link "Recupera Password"
- Inserisce username
- Sistema verifica esistenza + email settata
- Genera password random, invia email "[Semiorto] Richiesta cambio password"
- Utente apre email, usa password temp, viene forzato al cambio
12b — Admin reset
- Admin apre utente (
/amministrazione/utente/{id}) - Click "Resetta password" → GET
/amministrazione/utente/{id}/resettaPassword - Stesso flusso lato backend (genera + email)
UC-13: Ricerca storica per cliente/varietà
- Attore
- qualsiasi ruolo (lettura)
- Trigger
- Serve verificare storico analisi per una varietà o cliente
Passi
- Menu Analisi → Cerca
- Seleziona specie → dropdown varietà si popola
- Seleziona varietà
- Click su "anni" per vedere tutti gli anni (default ultimi 3)
- Submit
- Sistema esegue Criteria query con JOIN su 5 tabelle, ordina per specie/varietà/data/lotto
- Mostra risultati con colonne: Data, FT, Lotto, Germ%, Risultato, Vigore
- Click su una riga → dettaglio analisi