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

MetodoPathFunzioneJSP
GET/Routing iniziale post-login verso prima voce menu— (redirect)
GET/accesso/loginForm di loginaccesso/login
GET/accesso/recuperaForm recupero passwordaccesso/recupera
POST/accesso/richiestaRecuperoInvia email con password tempaccesso/login (messaggio)
POST/j_spring_security_checkEndpoint Spring Security login— (Spring interno)
GET/j_spring_security_logoutLogout Spring Security— (Spring interno)

🧪 Analisi (/analisis)

MetodoPathFunzioneJSP / Return
GET/analisis/Form di ricerca analisianalisi/cerca
POST/analisis/Esegue ricerca con filtrianalisi/cerca
GET/analisis/inCorsoLista analisi in corsoanalisi/lista
GET/analisis/daAnalizzareLotti da rianalizzare questo meseanalisi/lista
GET/analisis/lotto/{idLotto}Tutte le analisi di un lottoanalisi/cerca
GET/analisis/cercaLotto/{lotto}Ricerca per codice lottoanalisi/cerca
GET/analisis/lottoEsaurito/{idLotto}Imposta lotto esauritoredirect daAnalizzare
GET/analisis/analisi/newScegli lotto per nuova analisianalisi/nuova
GET/analisis/lotto/{idLotto}/newCrea nuova analisi su lottoanalisi/update
GET/analisis/analisi/{id}Dettaglio analisi (editable)analisi/update
POST/analisis/analisi/updateSalva modifiche analisi (azioni: save / AGGIUNGI_CONTA / CANCELLA_CONTA / CHIUDI_ANALISI)analisi/update
POST/analisis/cancellaSoft delete con motivoredirect inCorso
GET/analisis/analisi/{id}/{azienda}/schedaStampa scheda controllo PDF— (PDF)
GET/analisis/analisi/{id}/{azienda}/certificatoStampa certificato DOCX— (DOCX)
GET/analisis/avvisi/jsonJSON contatori per badge navbarJSON {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)

MetodoPathFunzione
GET/lottos/Lista + form ricerca + checkbox esauriti
POST/lottos/Esegue ricerca
GET/lottos/lotto/newForm nuovo lotto
POST/lottos/lotto/updateUpsert (create se id=null)
POST/lottos/settaEsauritoBulk set esaurito (params lotto_{id}=true)
GET/lottos/varieta/{idVarieta}/jsonJSON lotti di una varietà (AJAX)
GET/lottos/lotto/{lotto}/jsonJSON dettaglio lotto by codice (AJAX)

🌿 Specie (/species)

MetodoPathFunzione
GET/species/Lista specie
GET/species/specie/{id}Modifica specie (con matrice mesi×tipologie)
POST/species/specie/{id}Update specie
GET/species/specie/newForm nuova specie
POST/species/specie/newCrea specie

🌱 Varietà (/varietas)

MetodoPathFunzione
GET/varietas/ o /varietas/specie/Lista globale
GET/varietas/specie/{idSpecie}Lista varietà di una specie
GET/varietas/varieta/newForm nuova
GET/varietas/varieta/specie/{idSpecie}/newNuova con specie pre-selezionata
GET/varietas/varieta/{id}Modifica
POST/varietas/varieta/updateUpsert
GET/varietas/specie/{idSpecie}/jsonJSON varietà (AJAX dropdown)

🏭 Produttore (/produttores)

MetodoPathFunzione
GET/produttores/Lista
GET/produttores/produttore/{id}Modifica
GET/produttores/produttore/newForm nuovo
POST/produttores/produttore/updateUpsert da form standard
POST/produttores/produttore/update/jsonUpsert 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)

MetodoPathFunzione
GET/utenti/myselfMostra dati propri
GET/utenti/utente/{id}(Placeholder, restituisce utente/update vuoto)
GET/utenti/lista(Placeholder)
POST/utenti/utente/updateAggiorna dati self → logout forzato
POST/utenti/myself/cambiaPasswordCambia password → logout forzato
GET/utenti/utente/{id}resettaPasswordReset password self (??? strano path)

🔧 Amministrazione (/amministrazione)

Tutti richiedono ruolo Amministrazione (enforcement solo via menu, vedi policy).

MetodoPathFunzione
GET/amministrazione/utentiLista utenti
GET/amministrazione/utente/{id}Modifica utente
GET/amministrazione/utente/newForm nuovo utente
POST/amministrazione/utente/updateUpsert utente (crea/modifica)
GET/amministrazione/utente/{id}/resettaPasswordReset password utente (admin)
GET/amministrazione/analisis/cancellateLista analisi cancellate
GET/amministrazione/analisis/analisi/{id}/cancellaHard 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-DDExport 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/loginSessione scaduta o non autenticata
HTTP 500 + NPE in /semiorto-report/reportRange 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