Casi d'uso

Scenari operativi reali del laboratorio Semiorto, con attori, trigger, passi e post-condizioni

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

  1. Utente apre menu Lotto → Aggiungi (/lottos/lotto/new)
  2. Seleziona la specie (es. Pomodoro) dal dropdown
  3. Il dropdown varietà si popola via AJAX con le varietà di quella specie
  4. Seleziona varietà (es. Italiko Ex-Genovese Classico)
  5. Seleziona fornitore (es. Schiavone Fernando). Se non esiste → usa modal + per crearlo inline (vedi UC-8)
  6. Inserisce quantità in kg (es. 5.5) o numero semi
  7. Inserisce data arrivo (datepicker, default oggi)
  8. Inserisce codice lotto (es. VSF012/E-C) — libero, non auto-generato
  9. 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?"

Post-condizioni

UC-2: Avvio nuova analisi di germinabilità

Attore
Laboratorio
Trigger
Lotto arrivato, serve test di germinabilità
Pre-condizioni
Lotto esistente e non esaurito

Passi

  1. Tecnico apre Analisi → Nuova (/analisis/analisi/new)
  2. Vede lista lotti non ancora analizzati (filtrabile per specie)
  3. Click sul lotto desiderato → redirect a /analisis/lotto/{id}/new
  4. Il sistema crea l'entity con:
    • ft auto-generato (es. "3562/26")
    • dataArrivoLaboratorio = oggi
    • id_lotto = lotto selezionato
    • Una conta A pre-popolata con giorni_1 = specie.giorni1Conta e giorni_2 = specie.giorniTConta − specie.giorni1Conta
  5. Mostra form completo con dati pre-compilati
  6. 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.
  7. Salva (azione default) → persiste, torna al form con messaggio "salvato"

Post-condizioni

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)

  1. Tecnico apre Analisi → In Corso → vede le analisi con badge "(1°) data"
  2. Click su analisi → /analisis/analisi/{id}
  3. Nella sezione "Conte giornaliere", seleziona la ripetizione A
  4. Inserisce nei campi germinati_1, duri_1, freschi_1, anormali_1, morti_1 i conteggi osservati (somma = 100)
  5. Seleziona vigore_1 (SCARSO / MEDIO / OTTIMO) dal radio
  6. Salva (default)
  7. Ripete per B, C, D (altre 3 Petri)

Passi 2ª conta (tipicamente giorno 10, alla fine)

  1. Tecnico torna sull'analisi
  2. Compila germinati_2, duri_2, ecc. per le 4 ripetizioni
  3. Salva

Aggiunta manuale di una conta

Se per qualche motivo servono più di 4 repliche:

  1. Click + Aggiungi Conta
  2. Il sistema assegna la prossima lettera disponibile (A → B → C → D → E → …)
  3. Giorni pre-popolati = quelli della prima conta

Post-condizioni

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_2 compilati

Passi

  1. Tecnico apre analisi
  2. Click "Chiudi Analisi" → azione = CHIUDI_ANALISI
  3. Spring valida: tutti i campi required, tutte le conte complete
  4. Se errori → messaggi rossi sotto i campi, non chiude
  5. 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
  6. Tecnico conferma
  7. Save finale

Post-condizioni

📌 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

  1. Tecnico apre analisi chiusa
  2. Click "Stampa Certificato" → GET /analisis/analisi/{id}/{azienda}/certificato
  3. Backend:
    • Popola mappa 20 placeholder (NOME_SPECIE, DATA_ARRIVO, GERMINATI, ecc.)
    • Carica template modello-certificato-{azienda}.docx da TEMPLATES_DIRECTORY/
    • Sostituisce ogni $$_NOME_$$ con valore
    • Invia DOCX al browser con nome Quality-Certificate-{lotto}-YYYY/MM/YY.docx
  4. Utente salva/stampa il file

Post-condizioni

UC-6: Gestione lotti esauriti

Attore
Magazzino o Laboratorio
Trigger
Seme finito in laboratorio o venduto tutto

Modalità 1: bulk dalla lista lotti

  1. Apre Lotto → Setta come esaurito (/lottos/)
  2. Cerca i lotti con filtri (specie, varietà, codice)
  3. Spunta le checkbox dei lotti da marcare
  4. Click "Setta esauriti" → POST /lottos/settaEsaurito
  5. Sistema imposta esaurito=true, dataEsaurito=oggi per tutti i selezionati

Modalità 2: da dettaglio analisi

  1. Nella lista analisi "Da Analizzare", vede lotti suggeriti per rianalisi
  2. Se sa che il lotto è esaurito, click sul bottone "Lotto esaurito" accanto
  3. GET /analisis/lottoEsaurito/{idLotto} → stesso effetto

Post-condizioni

UC-7: Verifica mensile "Da Analizzare"

Attore
Laboratorio
Trigger
Inizio mese o check periodico

Passi

  1. Tecnico vede badge rosso "Da Analizzare (N)" nella navbar
  2. Click → /analisis/daAnalizzare
  3. Sistema esegue query SQL complessa (vedi Flussi): "Quali lotti attivi di specie configurate per questo mese non sono stati ri-analizzati?"
  4. Per ogni lotto in lista, tecnico decide:
    • Crea nuova analisi (link "Analizza")
    • Imposta lotto esaurito se non ci sono più semi

Post-condizioni

UC-8: Aggiunta fornitore inline durante creazione lotto

Attore
Magazzino
Trigger
Fornitore non presente nel dropdown durante creazione lotto

Passi

  1. Nel form lotto, click sul "+" blu a fianco del campo Fornitore
  2. Si apre modal "Aggiungi Fornitore" con campi Nome + Codice
  3. Utente compila
  4. Click "Aggiungi" → AJAX POST a /produttores/produttore/update/json
  5. 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:["..."]}
  6. Frontend:
    • Se OK → aggiunge opzione al dropdown + la seleziona + chiude modal
    • Se errore → alert + modal resta aperto
  7. 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

  1. Menu Specie → Lista
  2. Click su specie → /species/specie/{id}
  3. Compila campi base: italiano, inglese, latino, codice, giorni1Conta, giorniTConta, UR%
  4. Scorre alla sezione "Ripetizione analisi" — matrice 12 mesi × 9 tipologie seme
  5. Spunta le celle corrispondenti al calendario desiderato:
    • Esempio: Pomodoro → Maggio/Natura, Settembre/Selezionato, Gennaio/Calibrato
  6. Salva

Post-condizioni

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)

  1. Tecnico apre analisi
  2. Click "Cancella" → modal chiede motivo (es. "Errore lotto")
  3. POST /analisis/cancella con id + motivo
  4. Backend imposta cancella = motivo, non elimina fisicamente
  5. Analisi sparisce dalle liste attive

Ripristino da parte admin

  1. Admin apre Amministrazione → Analisi Cancellate
  2. Vede lista con motivo di cancellazione
  3. Click su analisi → apre dettaglio readonly
  4. Può rimuovere campo cancella via update (da verificare se il form lo permette)

Eliminazione definitiva

  1. Admin clicca "Elimina definitivamente" nella lista cancellate
  2. GET /amministrazione/analisis/analisi/{id}/cancella
  3. Backend esegue DELETE FROM semiorto_analisi WHERE id=?
  4. Cascade elimina anche tutte le conte associate

UC-11: Admin crea nuovo utente laboratorio

Attore
Amministrazione
Trigger
Assunzione nuovo tecnico di laboratorio

Passi

  1. Menu Amministrazione → Utenti
  2. Click "Aggiungi" → /amministrazione/utente/new
  3. Compila:
    • Nome, Cognome
    • Username (unique, validato)
    • Email
    • Stato: ATTIVO
    • Permessi: checkbox "Laboratorio"
  4. Submit → POST /amministrazione/utente/update
  5. Backend:
    • Valida
    • Crea record utente con cambiaPassword=true
    • Genera password random
    • Invia email "[Semiorto] Creazione utente" con password temp
    • Crea record in tabella permessi
  6. Nuovo utente riceve email con credenziali temporanee

Primo login nuovo utente

  1. Utente si logga con password temporanea
  2. Sistema rileva cambiaPassword=true → redirect forzato a /utente/cambioPassword
  3. Utente imposta nuova password
  4. Logout forzato + re-login

UC-12: Reset password utente (self + admin)

12a — Self-service (utente dimentica password)

  1. Login page → link "Recupera Password"
  2. Inserisce username
  3. Sistema verifica esistenza + email settata
  4. Genera password random, invia email "[Semiorto] Richiesta cambio password"
  5. Utente apre email, usa password temp, viene forzato al cambio

12b — Admin reset

  1. Admin apre utente (/amministrazione/utente/{id})
  2. Click "Resetta password" → GET /amministrazione/utente/{id}/resettaPassword
  3. 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

  1. Menu Analisi → Cerca
  2. Seleziona specie → dropdown varietà si popola
  3. Seleziona varietà
  4. Click su "anni" per vedere tutti gli anni (default ultimi 3)
  5. Submit
  6. Sistema esegue Criteria query con JOIN su 5 tabelle, ordina per specie/varietà/data/lotto
  7. Mostra risultati con colonne: Data, FT, Lotto, Germ%, Risultato, Vigore
  8. Click su una riga → dettaglio analisi