API reference
Tutti gli endpoint HTTP del software Semiorto Report
📌 Natura degli endpoint
Semiorto non espone un'API REST pubblica. Tutti gli endpoint sono parte del server-side rendering MVC (form POST + GET navigation). Gli endpoint /json sono AJAX interni al frontend per dropdown dipendenti e creazione inline produttore.
Legenda
GET = navigazione / lettura · POST = submit form · Admin / Lab / Mag = accesso via menu
🏠 Default
| Metodo | Path | Funzione | JSP |
| GET | / | Routing iniziale post-login verso prima voce menu | — (redirect) |
| GET | /accesso/login | Form di login | accesso/login |
| GET | /accesso/recupera | Form recupero password | accesso/recupera |
| POST | /accesso/richiestaRecupero | Invia email con password temp | accesso/login (messaggio) |
| POST | /j_spring_security_check | Endpoint Spring Security login | — (Spring interno) |
| GET | /j_spring_security_logout | Logout Spring Security | — (Spring interno) |
🧪 Analisi (/analisis)
| Metodo | Path | Funzione | JSP / Return |
| GET | /analisis/ | Form di ricerca analisi | analisi/cerca |
| POST | /analisis/ | Esegue ricerca con filtri | analisi/cerca |
| GET | /analisis/inCorso | Lista analisi in corso | analisi/lista |
| GET | /analisis/daAnalizzare | Lotti da rianalizzare questo mese | analisi/lista |
| GET | /analisis/lotto/{idLotto} | Tutte le analisi di un lotto | analisi/cerca |
| GET | /analisis/cercaLotto/{lotto} | Ricerca per codice lotto | analisi/cerca |
| GET | /analisis/lottoEsaurito/{idLotto} | Imposta lotto esaurito | redirect daAnalizzare |
| GET | /analisis/analisi/new | Scegli lotto per nuova analisi | analisi/nuova |
| GET | /analisis/lotto/{idLotto}/new | Crea nuova analisi su lotto | analisi/update |
| GET | /analisis/analisi/{id} | Dettaglio analisi (editable) | analisi/update |
| POST | /analisis/analisi/update | Salva modifiche analisi (azioni: save / AGGIUNGI_CONTA / CANCELLA_CONTA / CHIUDI_ANALISI) | analisi/update |
| POST | /analisis/cancella | Soft delete con motivo | redirect inCorso |
| GET | /analisis/analisi/{id}/{azienda}/scheda | Stampa scheda controllo PDF | — (PDF) |
| GET | /analisis/analisi/{id}/{azienda}/certificato | Stampa certificato DOCX | — (DOCX) |
| GET | /analisis/avvisi/json | JSON contatori per badge navbar | JSON {inCorso, daAnalizzare} |
Payload esempio — POST /analisis/analisi/update
id=12345
ft=3562/26
azione= # oppure AGGIUNGI_CONTA, CANCELLA_CONTA, CHIUDI_ANALISI
oggetto= # id della conta in caso di CANCELLA_CONTA
idLotto=...
idTecnico=1
idTipologiaSeme=2
prova=PETRI
categoria=STANDARD
replicaAnalisi=2 # 1/2/3
calibratura=...
dataInizioS=20/04/2026
dataFineS=
ur=30
totaleGiorniDiProva=10
semePuro=100
materialeInerte=0
altriSemi=
osservazioni=...
osservazioniPurezza=...
risultato=
scostamento=
vigore=
# Conte (array index-based)
conte[0].id=12301
conte[0].lettera=A
conte[0].giorni[0]=5
conte[0].giorni[1]=5
conte[0].germinati[0]=80
conte[0].germinati[1]=10
conte[0].duri[0]=2
...
conte[0].vigores[0]=OTTIMO
conte[0].vigores[1]=OTTIMO
conte[1].lettera=B
...
# Conte da cancellare (ID semicolon-separated)
conteDaCancellare=;123;124
# Analisi esterna (riferimento fornitore)
analisiEsterna.numero=...
analisiEsterna.dataS=10/01/2026
analisiEsterna.germinabilita=92
📦 Lotto (/lottos)
| Metodo | Path | Funzione |
| GET | /lottos/ | Lista + form ricerca + checkbox esauriti |
| POST | /lottos/ | Esegue ricerca |
| GET | /lottos/lotto/new | Form nuovo lotto |
| POST | /lottos/lotto/update | Upsert (create se id=null) |
| POST | /lottos/settaEsaurito | Bulk set esaurito (params lotto_{id}=true) |
| GET | /lottos/varieta/{idVarieta}/json | JSON lotti di una varietà (AJAX) |
| GET | /lottos/lotto/{lotto}/json | JSON dettaglio lotto by codice (AJAX) |
🌿 Specie (/species)
| Metodo | Path | Funzione |
| GET | /species/ | Lista specie |
| GET | /species/specie/{id} | Modifica specie (con matrice mesi×tipologie) |
| POST | /species/specie/{id} | Update specie |
| GET | /species/specie/new | Form nuova specie |
| POST | /species/specie/new | Crea specie |
🌱 Varietà (/varietas)
| Metodo | Path | Funzione |
| GET | /varietas/ o /varietas/specie/ | Lista globale |
| GET | /varietas/specie/{idSpecie} | Lista varietà di una specie |
| GET | /varietas/varieta/new | Form nuova |
| GET | /varietas/varieta/specie/{idSpecie}/new | Nuova con specie pre-selezionata |
| GET | /varietas/varieta/{id} | Modifica |
| POST | /varietas/varieta/update | Upsert |
| GET | /varietas/specie/{idSpecie}/json | JSON varietà (AJAX dropdown) |
🏭 Produttore (/produttores)
| Metodo | Path | Funzione |
| GET | /produttores/ | Lista |
| GET | /produttores/produttore/{id} | Modifica |
| GET | /produttores/produttore/new | Form nuovo |
| POST | /produttores/produttore/update | Upsert da form standard |
| POST | /produttores/produttore/update/json | Upsert AJAX (usato dal modal inline lotto) |
Payload JSON — POST /produttores/produttore/update/json
POST (form-encoded)
nome=Schiavone Fernando
codice=SF
Response:
{
"obj": {
"id": 42,
"nome": "SCHIAVONE FERNANDO",
"codice": "SF"
},
"error": false,
"errors": []
}
Uppercase automatico lato backend.
👤 Utente self (/utenti)
| Metodo | Path | Funzione |
| GET | /utenti/myself | Mostra dati propri |
| GET | /utenti/utente/{id} | (Placeholder, restituisce utente/update vuoto) |
| GET | /utenti/lista | (Placeholder) |
| POST | /utenti/utente/update | Aggiorna dati self → logout forzato |
| POST | /utenti/myself/cambiaPassword | Cambia password → logout forzato |
| GET | /utenti/utente/{id}resettaPassword | Reset password self (??? strano path) |
🔧 Amministrazione (/amministrazione)
Tutti richiedono ruolo Amministrazione (enforcement solo via menu, vedi policy).
| Metodo | Path | Funzione |
| GET | /amministrazione/utenti | Lista utenti |
| GET | /amministrazione/utente/{id} | Modifica utente |
| GET | /amministrazione/utente/new | Form nuovo utente |
| POST | /amministrazione/utente/update | Upsert utente (crea/modifica) |
| GET | /amministrazione/utente/{id}/resettaPassword | Reset password utente (admin) |
| GET | /amministrazione/analisis/cancellate | Lista analisi cancellate |
| GET | /amministrazione/analisis/analisi/{id}/cancella | Hard delete analisi cancellata |
📥 Report (WAR separato /semiorto-report)
Questo è un WAR distinto, non parte di ROOT ma deployato nello stesso Tomcat. Contiene un solo endpoint:
| GET | /semiorto-report/report?dataInizio=YYYY-MM-DD&dataFine=YYYY-MM-DD | Export XLSX di tutte le analisi nel periodo |
Response XLSX
File Excel con colonne: F.T., Specie, Varietà, Lotto, Provenienza, Dettaglio, Germ%, Data.
⚠ Bug noto: NullPointerException su range multi-anno
Su range molto ampi (es. 2014-01-01 → 2020-12-31) l'endpoint va in NPE 500. Funziona bene con range mensili o annuali. In TopSeed riscrittura: usare COALESCE(NULL,0) per tutti i campi numeric nullable.
Autenticazione & Session
Ogni request (eccetto /assets/**) richiede cookie JSESSIONID valido. Ottieni con:
curl -c cookies.txt -d "j_username=diego&j_password=xxx" \
http://.../j_spring_security_check
# Poi usa cookie per chiamate successive:
curl -b cookies.txt http://.../analisis/inCorso
Errori comuni
| HTTP 302 → /accesso/login | Sessione scaduta o non autenticata |
HTTP 500 + NPE in /semiorto-report/report | Range date troppo ampio, campi null |
| HTTP 404 /assets/css/... | Se dietro reverse-proxy con regex globale js|css: serve location ^~ |
| HTTP 400 "dataInizio not present" | Query params case-sensitive: usa dataInizio, non dataInizioX |