From b4d0ca48987dd97cea75a277d6a52732b4c3c361 Mon Sep 17 00:00:00 2001 From: Simone Bierti Date: Tue, 7 Apr 2026 12:17:29 +0200 Subject: [PATCH] Add ROLE_INCARICATO, configure mail, and add booking visualization specs - Add ROLE_INCARICATO authority (AuthoritiesConstants, authority.csv) - Configure SMTP mail settings for dev and prod environments - Add faIdCard icon to FontAwesome config - Add feature spec for booking visualization and management by role Co-Authored-By: Claude Sonnet 4.6 --- features/visualizzazione-prenotazioni.md | 78 +++++++++++++++++++ .../security/AuthoritiesConstants.java | 2 + src/main/resources/config/application-dev.yml | 13 +++- .../resources/config/application-prod.yml | 12 ++- src/main/resources/config/application.yml | 2 +- .../config/liquibase/data/authority.csv | 1 + src/main/webapp/app/shared/config/config.ts | 2 + 7 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 features/visualizzazione-prenotazioni.md diff --git a/features/visualizzazione-prenotazioni.md b/features/visualizzazione-prenotazioni.md new file mode 100644 index 0000000..dfc4af5 --- /dev/null +++ b/features/visualizzazione-prenotazioni.md @@ -0,0 +1,78 @@ +Ecco una bozza di specifiche tecniche strutturate in **Markdown**, ottimizzate per essere interpretate da un agente di coding (come un plugin IDE o un modello LLM focalizzato sullo sviluppo). + +--- + +# Specifiche Tecniche: Gestione e Visualizzazione Prenotazioni + +## 1. Obiettivo +Implementare un sistema di visualizzazione e gestione delle prenotazioni basato sui ruoli utente (`ROLE_USER`, `ROLE_INCARICATO`), con logica di business legata all'esistenza di un oggetto `Conferma` correlato. + +## 2. Modello Dati e Relazioni +* **Prenotazione (P):** Entità principale. +* **Conferma (C):** Entità correlata a `Prenotazione`. + * **Relazione:** One-to-One. + * **Chiave Primaria:** `C.id` deve coincidere con `P.id`. + * **Campi Conferma:** + * `tipoConferma` (Enum: `TipoConferma`) + * `motivoConferma` (String/Text) + * `codice` (String, Alfanumerico Base62, generato dal sistema). + +## 3. Logica di Accesso e Visualizzazione + +### 3.1 Vista: ROLE_USER +L'utente visualizza esclusivamente le proprie prenotazioni. + +* **Query:** `SELECT * FROM Prenotazione WHERE utente_id = :current_user_id ORDER BY data_inserimento DESC`. +* **Interfaccia (Tabella):** + * **Caso A: Prenotazione SENZA Conferma** + * Azioni permesse: **Visualizza**, **Modifica**, **Cancella**. + * **Caso B: Prenotazione CON Conferma** + * Azioni permesse: **Visualizza** (Read-only), **Visualizza Conferma**. + * Inibizione: I tasti Modifica e Cancella devono essere disabilitati o nascosti. + +### 3.2 Vista: ROLE_INCARICATO +L'utente visualizza tutte le prenotazioni del sistema create negli ultimi 12 mesi. + +* **Filtro Temporale:** `data_prenotazione >= CURRENT_DATE - 12 mesi`. +* **Layout:** Due tabelle distinte. + +#### Tabella 1: Prenotazioni Pendenti (Senza Conferma) +* **Contenuto:** Prenotazioni che non hanno un record corrispondente nella tabella `Conferma`. +* **Azioni:** + 1. **Visualizza:** Apre il dettaglio della prenotazione. + 2. **Prendi in carico:** Apre una finestra modale (Pop-up). + +#### Tabella 2: Prenotazioni Completate (Con Conferma) +* **Contenuto:** Prenotazioni che hanno un record corrispondente nella tabella `Conferma`. +* **Azioni:** Visualizzazione del dettaglio e della relativa conferma. + +--- + +## 4. Workflow "Prendi in carico" (Modale) +Al clic sul pulsante nella Tabella 1 del `ROLE_INCARICATO`: + +1. **Apertura Modale:** Form di creazione per l'oggetto `Conferma`. +2. **Input Utente:** + * `tipoConferma`: Select box basata sull'Enum. + * `motivoConferma`: TextArea (Testo libero). +3. **Logica di Sistema (Generazione Codice):** + * Il campo `codice` deve essere generato lato server (o pre-calcolato) convertendo il timestamp corrente (data/ora) in una stringa **Base62** (caratteri `0-9`, `a-z`, `A-Z`). +4. **Salvataggio:** + * Creazione record `Conferma` con `id` identico a quello della `Prenotazione` selezionata. +5. **Post-Azione:** + * Chiusura modale. + * **Refresh Reattivo:** Le tabelle devono aggiornarsi senza ricaricare l'intera pagina (la prenotazione deve spostarsi dalla Tabella 1 alla Tabella 2). + +--- + +## 5. Requisiti Tecnici Suggeriti +* **Sicurezza:** Verificare l'authority lato server (Spring Security o equivalente) per ogni richiesta API. Non basarsi solo sull'occultamento dei tasti lato UI. +* **Generazione Base62:** Implementare una funzione di encoding che trasformi `long timestamp` in `String Base62`. + +--- + +## 6. Definizione del Successo (Criteri di Accettazione) +* [ ] Un `ROLE_USER` non può cancellare una prenotazione se esiste una conferma. +* [ ] Un `ROLE_INCARICATO` vede solo i dati degli ultimi 12 mesi. +* [ ] Il salvataggio di una conferma sposta istantaneamente la riga tra le due tabelle dell'incaricato. +* [ ] Il codice della conferma è univoco e generato in Base62. diff --git a/src/main/java/it/sw/pa/comune/artegna/security/AuthoritiesConstants.java b/src/main/java/it/sw/pa/comune/artegna/security/AuthoritiesConstants.java index 6bdbb6d..8e2f868 100644 --- a/src/main/java/it/sw/pa/comune/artegna/security/AuthoritiesConstants.java +++ b/src/main/java/it/sw/pa/comune/artegna/security/AuthoritiesConstants.java @@ -7,6 +7,8 @@ public final class AuthoritiesConstants { public static final String ADMIN = "ROLE_ADMIN"; + public static final String INCARICATO = "ROLE_INCARICATO"; + public static final String USER = "ROLE_USER"; public static final String ANONYMOUS = "ROLE_ANONYMOUS"; diff --git a/src/main/resources/config/application-dev.yml b/src/main/resources/config/application-dev.yml index 20718c5..47d02ed 100644 --- a/src/main/resources/config/application-dev.yml +++ b/src/main/resources/config/application-dev.yml @@ -42,10 +42,15 @@ spring: # Remove 'faker' if you do not want the sample data to be loaded automatically contexts: dev, faker mail: - host: localhost - port: 25 - username: - password: + host: smtps.aruba.it + port: 465 + username: noreply@bigc.it + password: Ungr@nb3l4n1m4l0 + protocol: smtps + properties.mail.smtp: + auth: true + starttls.enable: true + messages: cache-duration: PT1S # 1 second, see the ISO 8601 standard thymeleaf: diff --git a/src/main/resources/config/application-prod.yml b/src/main/resources/config/application-prod.yml index bf0ced6..b18ff38 100644 --- a/src/main/resources/config/application-prod.yml +++ b/src/main/resources/config/application-prod.yml @@ -43,10 +43,14 @@ spring: liquibase: contexts: prod mail: - host: localhost - port: 25 - username: - password: + host: smtps.aruba.it + port: 465 + username: noreply@bigc.it + password: Ungr@nb3l4n1m4l0 + protocol: smtps + properties.mail.smtp: + auth: true + starttls.enable: true thymeleaf: cache: true diff --git a/src/main/resources/config/application.yml b/src/main/resources/config/application.yml index 2db1949..b58d6c7 100644 --- a/src/main/resources/config/application.yml +++ b/src/main/resources/config/application.yml @@ -193,7 +193,7 @@ jhipster: # allow-credentials: true # max-age: 1800 mail: - from: smartbooking@localhost + from: noreply@bigc.it api-docs: default-include-pattern: /api/** management-include-pattern: /management/** diff --git a/src/main/resources/config/liquibase/data/authority.csv b/src/main/resources/config/liquibase/data/authority.csv index af5c6df..aa1403a 100644 --- a/src/main/resources/config/liquibase/data/authority.csv +++ b/src/main/resources/config/liquibase/data/authority.csv @@ -1,3 +1,4 @@ name ROLE_ADMIN ROLE_USER +ROLE_INCARICATO diff --git a/src/main/webapp/app/shared/config/config.ts b/src/main/webapp/app/shared/config/config.ts index 1777cb5..272585c 100644 --- a/src/main/webapp/app/shared/config/config.ts +++ b/src/main/webapp/app/shared/config/config.ts @@ -16,6 +16,7 @@ import { faEye } from '@fortawesome/free-solid-svg-icons/faEye'; import { faFlag } from '@fortawesome/free-solid-svg-icons/faFlag'; import { faHeart } from '@fortawesome/free-solid-svg-icons/faHeart'; import { faHome } from '@fortawesome/free-solid-svg-icons/faHome'; +import { faIdCard } from '@fortawesome/free-solid-svg-icons/faIdCard'; import { faList } from '@fortawesome/free-solid-svg-icons/faList'; import { faLock } from '@fortawesome/free-solid-svg-icons/faLock'; import { faPencilAlt } from '@fortawesome/free-solid-svg-icons/faPencilAlt'; @@ -69,6 +70,7 @@ export function initFortAwesome(vue: App) { faFlag, faHeart, faHome, + faIdCard, faList, faLock, faPencilAlt,