---
title: "Problem Statement"
---
# Attori
- Gli utenti possono assumere più ruoli
- attore utente come utente generico del sistema che può agire sia come conducente sia come passeggero, a seconda delle necessità. questa flessibilità migliora l'efficienza e la convenienza del sistema.
```plantuml
@startuml
rectangle ViaggiamoInsieme
actor Utente
actor Conducente
actor Passeggero
actor Impiegato
actor GestoreUtenti
actor GestoreCorse
ViaggiamoInsieme <-left- Utente
ViaggiamoInsieme <-right- Impiegato
Utente <|-- Conducente
Utente <|-- Passeggero
Impiegato <|-- GestoreUtenti
Impiegato <|-- GestoreCorse
@enduml
```
# Scenari
## Remind
- passeggero cerca, trova, e prenota corsa, (inviare notifica a conducente) (registrazione o login)
- conducente pubblica una corsa (registrazione o login)
- passeggero annulla prenotazione (utente visualizza le sue corse)-
- conducente annulla corsa (utente visualizza le sue corse) (passaeggero riceve notifica)
- conducente arriva a destinazione . . . (coducente indica quando corsa terminata)
- passeggero accede alla home, vede le sue corse a cui si è prenotato, vede partecipanti alla corsa, e puo vedere il loro profilo
- conducente accede alla home, vede le sue corse, vede partecipanti alla corsa, e puo vedere il loro profilo
- passeggero vede che è stata annullata corsa (deve accedere a home e in norifiche)
- conducente vede che è stata annullata prenotazione (deve accedere a home e in norifiche)
## Scenari per il Passeggero
Marco ha la necessità improvvisa di recarsi da Milano a Torino per un importante appuntamento il giorno successivo, si ritrova a cercare un passaggio affidabile. Marco procede sulla piattaforma "ViaggiamoInsieme", seleziona l'opzione di ricerca corse e inserisce i dettagli del suo viaggio: partenza da Milano, destinazione Torino, e la data per il giorno successivo. Il sistema elabora la sua ricerca e gli mostra un elenco di corse disponibili. La prima opzione è una corsa offerta da Laura, con partenza alle ore 09:00 e arrivo alle ore 12:00. Il costo del viaggio è di 20 euro e sono disponibili due posti. La seconda opzione è presentata da Giorgio, partendo alle 08:30 e arrivando alle 11:30. Il viaggio costa 25 euro ed è disponibile un solo posto. La terza e ultima corsa mostrata è offerta da Silvia, che partirà alle 10:00 e arriverà alle 13:00. Il prezzo è di 18 euro e sono disponibili due posti. Tra le varie opzioni, la prima corsa, quella offerta da Laura attira la sua attenzione, in quanto soddisfa perfettamente i suoi requisiti di orario e costo. Marco clicca sulla corsa scelta, visualizzando i dettagli aggiuntivi: passeggeri già prenotati alla corsa e eventuali note, un uomo di nome Luca Bianchi e una donna di nome Martina Verdi. Le note di Laura specificano "sosta durante il tragitto di 15 minuti". Marco allora tenta di procede con la prenotazione di questa corsa, ma gli viene mostrato che per farlo è necessario che esso sia autenticato. Poiché è la prima volta che utilizza la piattaforma, inizia il processo di registrazione. Viene mostrato un modulo da compilare. Inizia inserendo il suo nome "Marco" nel campo del nome e "Rossi" nel campo del cognome. Successivamente, inserisce la sua data di nascita "15/03/1985" nel campo dedicato. Prosegue compilando il campo del numero di telefono, dove digita "3356789012". Il passo successivo richiede di caricare un documento di identità. Marco utilizza una immagine della carta di identità che ha sul suo dispositivo, "CI_Marco_Rossi.jpg", e la carica nel modulo. Dopo aver caricato il documento, Marco procede con l'inserimento dell'indirizzo email, `marco_milano@viaggio.com` nel campo dell'email. Infine, arriva al campo della password. Qui, Marco crea una password "MilanoTorino2024" e la inserisce nel campo corrispondente. Dopo aver inserito tutti i dati richiesti, Marco esamina il modulo per assicurarsi che tutto sia corretto. Poi clicca sul pulsante per completare la sua registrazione. Dopo due ore riceve una notifica via email che il suo account è stato verificato, allora accede alla piattaforma, procede con l'autenticazione accedendo alla sezione dedicata e inserisce le sue credenziali email `marco_milano@viaggio.com` e password "MilanoTorino2024". Marco è ora autenticato e procede alla prenotazione di questa corsa cliccando sul pulsante prenota. Una notifica viene inviata immediatamente a Laura, informandola della nuova prenotazione di Marco. Laura, riceve la notifica dalla piattaforma "Il passeggero Marco Rossi si è prenotato alla tua corsa".
---
Maria, avendo precedentemente prenotato un passaggio da Roma a Napoli tramite il sistema "ViaggiamoInsieme", si ritrova a dover cambiare i suoi piani in modo inaspettato. Decide quindi di annullare la sua prenotazione. Dopo aver preso questa decisione, Maria accede alla piattaforma "ViaggiamoInsieme" autenticandosi: inserisce le sue credenziali, la sua email `maria_roma@viaggio.com` e la password `RomaNapoli123`. Una volta all'interno del sistema, naviga verso la sezione delle corse prenotate, dove trova elencate tutte le sue prenotazioni. Tra queste, individua la prenotazione per il suo viaggio da Roma a Napoli. Clicca sulla prenotazione e, nella pagina successiva, clicca sul pulsante contrassegnato con "Cancella". Il sistema "mostra una finestra di dialogo che chiede a Maria di confermare l'annullamento della prenotazione. Maria legge attentamente il messaggio e poi conferma la sua scelta. Il sistema elabora la sua richiesta e annulla la prenotazione. Viene inviata una notifica al conducente del viaggio, Luca Bianchi, informandolo dell'accaduto: "Maria Bianchi ha annullato la prenotazione per la tua corsa".
---
Giuseppe, utente del sistema di car sharing "ViaggiamoInsieme", ha recentemente prenotato un viaggio verso Firenze. Dopo aver prenotato il passaggio, decide di approfondire i dettagli del suo viaggio. Accede a "ViaggiamoInsieme" inserendo le sue credenziali: l'email `giuseppe_fiorenze@viaggio.com` e la password `PassFiorenze123`. Una volta nella homepage, si orienta immediatamente verso la sezione "I Miei Viaggi" per visualizzare le sue corse prenotate. Nell'elenco delle corse, seleziona quella per Firenze, programmata per partire il giorno seguente. Cliccando sulla prenotazione, viene reindirizzato a una pagina che mostra tutti i dettagli della corsa: l'orario di partenza fissato per le 08:00 del mattino e il luogo di partenza, Firenze. Nella stessa pagina, Giuseppe nota un elenco dei partecipanti alla corsa, che include nomi di altri passeggeri e del conducente. Curioso di sapere chi lo accompagnerà nel viaggio, clicca su un nome tra i tre mostrati: Alessandro Rossi. Viene mostrata la pagina dell'utente con la data di nascita, il 25 dicembre 1940 e una breve descrizione delle corse da lui pubblicate, due corse, una da Salerno a Milano e un'altra da Salerno a Roma.
---
Carlo, un conducente abituale del sistema di car sharing "ViaggiamoInsieme", aveva pianificato un viaggio da Bologna a Venezia. Tuttavia, si imbatte in un imprevisto: il suo veicolo, un affidabile Fiat Ducato, presenta un guasto improvviso. Consapevole dell'impossibilità di effettuare il viaggio, Carlo decide di procedere con l'annullamento. Accede e si autentica su "ViaggiamoInsieme" utilizzando la sua email `carlo_bologna@viaggio.com` e la password `BoloVene2024`. Una volta nella sua area riservata, naviga nella sezione delle corse pianificate. Qui, Carlo trova l'elenco delle sue corse future e seleziona quella programmata per Bologna-Venezia. Nella pagina della corsa, individua il pulsante "Cancella" e clicca su di esso. Una finestra pop-up chiede a Carlo di confermare l'annullamento. Carlo, consapevole delle conseguenze, clicca su "Conferma". Giulia e Marco, due passeggeri che avevano prenotato posti per questa corsa, ricevono una notifica sulla piattaforma. La notifica include un messaggio di Carlo che spiega: "Carlo Verdi ha annullato la corsa a cui eri prenotato: Sono spiacente di informarvi che a causa di un imprevisto guasto al mio veicolo, sono costretto ad annullare il viaggio da Bologna a Venezia previsto per domani. Mi scuso per l'inconveniente."
---
.
## Scenari per il Conducente
### Pubblicazione di una corsa
Marco, un conducente registrato al sito "ViaggiamoInsieme", ha deciso di pubblicare una corsa da Milano a Roma per condividere il viaggio in auto con altri utenti.
Marco naviga sul web e apre la pagina "ViaggiamoInsieme", effettua il login e accede al suo account personale. Nella schermata principale, seleziona l'apposita opzione "Pubblica una corsa". Una volta aperta la pagina apposita per la pubblicazione di una corsa Marco inserisce i dettagli della corsa: partenza da Milano, destionazione Roma, data di partenza 05/12/2023, orario di partenza 17:18, Marco inserisce poi il tempo stimato per effetturare la corsa, 5 ore e 30 minuti. Marco ha 3 posti disponibili e decide come importo da pagare per prenotare il posto la cifra di 30€. Marco non ama particolarmente gli animali, di conseguenza specifica nelle note del viaggio che non sono ammessi animali a bordo. Una volta inseriti tutti i dati richiesti, Marco revisiona i dati e decide di pubblicare la sua corsa, quando clicca sul tasto 'Pubblica', il sistema ricorda a Marco attraverso una finestra di dialogo che una volta pubblicato, i dati della corsa non potrenno più essere modificati. Marco è sicuro dei dati inseriti e clicca il tasto 'Pubblica la corsa' presente nella finestra di dialogo. Il sistema riceve le informazioni inserite da Marco e rende la corsa visibile per gli utenti che cercano una corsa da Milano a Roma. Il sistema provvede inoltre ad aggiungere la corsa nella sezione _le mi corse_ di Marco con stato _pianificato_.
### Annullamento di una Corsa
Giulia, una conducente registrata su "ViaggiamoInsieme", ha pianificato di guidare da Torino a Bologna per condividere il viaggio con altri utenti. Dopo aver pubblicato i dettagli della sua corsa. Giulia riceve diverse prenotazioni dagli utenti interessati. Tuttavia, a causa di circostanze impreviste come un guasto meccanico al suo veicolo, Giulia si trova nell'impossibilità di effettuare il viaggio pianificato. Decide quindi di annullare la corsa tramite la piattaforma "ViaggiamoInsieme". Accede al suo account, nella schermata principale, clicca su _le mie corse_, seleziona la corsa da Torino a Bologna e trova l'opzione di annullamento della corsa. Una volta confermato l'annullamento, il sistema invia notifiche immediate ai passeggeri che hanno prenotato i posti sulla corsa, informandoli dell'annullamento. Il sistema rimuoverà inoltre la corsa dalla sezione _le mie corse_ di Giulia.
### Conclusione della corsa
Roberto, un conducente registrato su "ViaggiamoInsieme", ha offerto un viaggio da Verona a Trento per condividere il tragitto con altri utenti. Dopo aver pianificato la corsa e pubblicato i dettagli, ha ricevuto prenotazioni dagli utenti interessati. All'orario prestabilito, Roberto parte da Verona con i passeggeri a bordo e raggiunge senza intoppi la destinazione a Trento. Una volta arrivato a destinazione, Roberto segnala sul sistema che la corsa è terminata. Per fare ciò, accede al suo account su "ViaggiamoInsieme", nella schermata home, clicca sull'opzione _le mie corse_ e una volta visualizzata la pagina con le corse, seleziona la corsa da Verona a Trento e trova l'opzione per segnalare la conclusione della corsa. La piattaforma gli chiede di confermare la conclusione. Roberto conferma la conclusione della corsa, indicando che il viaggio è stato completato con successo e che tutti i passeggeri sono stati consegnati in sicurezza a destinazione. Inoltre, la piattaforma registra il completamento della corsa nel profilo di Roberto, impostando lo stato della corsa da _In corso_ a _Completata_.
### Gestione corse pubblicate
Carla è una conducente registrata su "ViaggiamoInsieme" e ha pubblicato diverse corse offerte sulla piattaforma. Una volta effettuato l'accesso al suo account e giunta alla home del sito 'ViaggiamoInsieme', clicca sull'opzione _le mie corse_ e accede alla pagina di visualizzazione delle sue corse dove decide di controllare lo stato delle corse che ha offerto. Carla visualizza un elenco delle sue offerte attive e passate. Seleziona una delle corse attive, ad esempio il viaggio da Milano a Torino, per controllare lo stato delle prenotazioni. Carla clicca sulla corsa e il sistema le fa visualizzare una pagina contenente tutti i dati relativi alla corsa che lei stesso ha inserito quando l'ha pubblicata. La piattaforma inoltre le mostra un elenco dei passeggeri che si sono prenotati per questa corsa, indicando i loro profili utente. Carla decide di accedere ai profili dei passeggeri, cliccando sul loro nome, per conoscere meglio chi viaggerà con lei. Esaminando i profili dei passeggeri, Carla vede informazioni quali il nome, la data di nascita e le corse pubblicate.
### Ricezione notifica annullata prenotazione - Conducente
Daniele è un conducente registrato alla piattaforma di carpooling "Viaggiamo Insieme".
Un giorno, dopo aver effettuato il login alla sua area riservata, nota una nuova notifica in entrata. Decidendo di visualizzarne il contenuto, scopre che Filippo, un passeggero registrato, a causa di un imprevisto ha annullato la sua prenotazione per la corsa da Milano a Torino che Daniele aveva pubblicato.
Daniele dopo essere venuto a conoscenza della notizia,trovandosi già sulla piattaforma, decide di visualizzare i dati aggiornati della sua corsa, come posti disponibili, numero di prenotazioni effettuate.
## Scenari gestore utenti
### Verifica utente - gestore utente
Simone ha intenzione di effettuare una corsa da Roma a Milano. Dopo una ricerca accurata, opta per la piattaforma "ViaggiamoInsieme" per trovare la corsa perfetta che soddisfi le sue esigenze. Prima di poter prenotare la sua prima corsa, Simone decide di registrarsi sulla piattaforma inserendo nome, cognome, data di nascita, telefono, e-mail e un documento, e resta in attesa della convalida del suo profilo. Filippo, gestore utente, dopo aver effettuato il login alla sua area riservata apre la richiesta di registrazione di Simone e con attenzione esamina ogni dettaglio fornito da Simone per garantire la correttezza delle informazioni. Fortunatamente, Filippo constata che tutti i dati forniti da Simone sono accurati e rispondono ai criteri di registrazione richiesti dalla piattaforma e procede con la convalida del profilo, consentendogli così di accedere pienamente alle funzionalità della piattaforma e di prenotare la sua corsa da Roma a Milano. Nel caso in cui i dati forniti da Simone in fase di registrazione non rispettino i criteri di registrazione richiesti dalla piattaforma Filippo rifiuta la richiesta, e Simone ritenta la registrazione inserendo dati validi.
## Scenari gestore delle corse
### Convalida corsa - gestore corse
Marta un nuovo utente della piattaforma di carpooling "ViaggiamoInsieme" decide di pubblicare una nuova corsa da Roma a Milano e dare la possibilità ad altri di condividere l'esperienza di viaggio. Filippo, accedendo alla home della sua area riservata nota che è presente una nuova corsa Roma-Milano nella sezione 'corse in corso', e in quanto gestore delle corse, decide di visualizzarne i dettagli come: conducente, data della corsa, orario di partenza, orario di arrivo, indirizzo di partenza e arrivo, numero di posti prenotati, numero di posti disponibili,prezzo, ed eventuali note inserite dal conducente, per verificare che essi rispettino le linee guida prefissate. Filippo dopo essersi accertato che i dettagli della corsa sono corretti, lascia la corsa attiva, in caso contrario se sono presenti delle informazioni non valide Filippo cancella la corsa e il sistema procede con l'invio di una notica a tutti i passeggeri già prenotati.
### Report Statistico - gestore corse
Filippo, gestore delle corse, incaricato dall'azienda di condurre un report statistico sull'attività di carpooling effettuata a Gennaio 2024, utilizza le funzionalità offerte dalla piattaforma per eseguire quest'analisi statistica. Filippo effettua l'accesso alla sua area riservata e selezionata la sezione 'statistiche', qui inserisce i dati richiesti dal sistema come il periodo di tempo da analizzare, nel suo caso 'Gennaio 2024'. Il sistema gli mostra quindi tutte le corse effettuate, il numero di corse annullate, il prezzo medio per corsa, i passeggeri medi per corsa, i chilometri percorsi in media, il guadagno medio dei conducenti.
Esaminando le informazioni restituite dal sistema Filippo visualizza le dinamiche di utilizzo della piattaforma da parte degli utenti, scoprendo che la corsa da Napoli a Milano nel mese di Gennaio è stata la corsa più gettonata.
- Gestore utenti
- VerificaUtente
- il gestore utente seleziona la funzionalità per visualizzare la lista degli utenti da verificare
- il sistema fornisce al gestore la lista degli utenti da verificare
- il gestore seleziona un singolo utente che è in attesa di verifica
- il sistema fornisce al gestore i dati dell'utente da verificare: nome, congnome, data di nascita, indirizzo email e documento di riconoscimento
- il gestore in base ai dati decide di approvare o rifiutare la richiesta (chiedere ai tutor)
- il sistema salva le informazioni dell'account verificato
- Gestore corse
- VisualizzaCorseinCorso
- il gestore delle corse seleziona la funzionalità per visualizzare le corse in corso
- il sistema mostra la lista delle corse in corso e mostra dettagli: luogo di partenza, luogo di arrivo, data e ora di partenza, data e ora di arrivo, numero di posti prenotati, numero di posti disponibili, prezzo per il singolo posto
- il gestore delle corse seleziona una corsa
- il sistema mostra tutti i dettagli della corsa selezionata compreso: luogo di partenza, luogo di destinazione, conducente, data e ora di partenza, data e ora di arrivo stimato, posti prenotati e da chi, prezzo per un posto e eventuali note aggiunte dal conducente (forse include) (punto di estensione visualiizadettaglituente)
- Utente
- RegistraUtente
- l'utente seleziona la funzione nuovo account
- il sistema chiede all'utente di inserire i dati; nome, cognome, data di nascita, telefono, documento di riconoscimento (in formato immagine), email, password e la sua conferma
- l'utente inserisci i dati richiesti
- il sistema registra la richiesta di creazione di un nuovo account(e la lista degli utenti in attesa di verifica degli account viene aggiornata)
- Autenticazione
- l'utente seleziona la funzione accedi
- il sistema chiede all'utente email e password
- l'utente inserisci i dati richiesti
- il sistema controlla le credenziali e il controlo ha esito positivo
- il sistema reindirizza l'utente alla sua home page
- Eccezione: Se al punto 3 il sistema rileva credenziali non corrette, il sistema mostrerà il messaggio di errore “username o password non corrette” e ripresenterà la schermata di autenticazione (UC 1.1Autenticazione Fallita)
**Alternativa**
se al punto 4 il sistema rileva credenziali non corrette, il sistema mostrerà il messagio di errore "email e password non corretti" e ripresenterà la schermata di autenticazione.
- il sistema mostra il messaggio di errore “username o password non corrette”
- il sistema ripresenta all’utente la schermata di autenticazione
---
Passeggero: TrovaCorse
- **Nome caso d'uso:** `TrovaCorse`
- **Entry condition:** None
- **Attori:** Iniziato da `Passeggero`
- **Flusso degli eventi:**
1. Il passeggero seleziona l'opzione di ricerca corse.
2. Il sistema presenta un modulo di ricerca dove il passeggero inserisce i dettagli della corsa desiderata, come luogo di partenza, luogo di destinazione e il numero di posti necessari.
3. Il passeggero invia la richiesta di ricerca.
4. Il sistema elabora la richiesta e mostra un elenco di corse disponibili che corrispondono ai criteri forniti dal passeggero, includendo le informazioni: luogo di partenza e destinazione, data e ora di partenza, data e ora di arrivo, numero di posti prenotati e disponibili e prezzo.
5. Il passeggero seleziona una corsa che soddisfa le sue esigenze.
6. include `VisualizzaDettagliCorsa`
- **Exit condition:** Il passeggero ha visualizzato i dettagli completi di una corsa specifica e può procedere alla prenotazione o continuare la ricerca.
- **Nome caso d'uso:** `PrenotaCorsa`
- **Entry condition:** Il passeggero ha effettuato il login.
- **Attori:** Iniziato da `Passeggero`
- **Flusso degli eventi:**
1. Il passeggero seleziona la funzionalità per prenotare una corsa.
2. Il sistema richiede al passeggero di confermare o annullare la prenotazione.
- **Exit condition:** La prenotazione è stata confermata e può essere visualizzata dal passeggero.
- **Nome caso d'uso:** `AnnullaPrenotazioneCorsa`
- **Entry condition:** Il passeggero ha una corsa prenotata ed ha effettuato il login.
- **Attori:** Iniziato da `Passeggero`
- **Flusso degli eventi:**
1. Il passeggero seleziona la funzione per annullare la prenotazione di una corsa.
2. Il sistema aggiorna lo stato della corsa, contrassegnandola come annullata.
3. Il sistema notifica il conducente della corsa dell'avvenuto annulamento della prenotazione.
- **Exit condition:** La prenotazione è stata annullata.
- **Nome caso d'uso:** `VisualizzaCorsePrenotate`
- **Entry condition:** Il passeggero ha effettuato l'accesso.
- **Attori:** Iniziato da `Passeggero`
- **Flusso degli eventi:**
1. Il passeggero seleziona la funzione per visualizzare le corse prenotate.
2. Il sistema mostra le corse prenotate dall'utente.
3. Il passeggero seleziona una corsa prenotata.
4. include `VisualizzaDettagliCorsa`
- **Exit condition:** Il passeggero ha visualizzato i dettagli della corsa prenotata.
- **Nome caso d'uso:** `VisualizzaDettagliUtente`
- **Entry condition:** Il caso d'uso `VisualizzaDettagliUtente` estende `VisualizzaDettagliCorsa` nel caso in cui si decida di visualizzare i dettagli dell'utente.
- **Attori:** Comunica con `Passeggero`, `Conducente` e `GestoreCorse`
- **Flusso degli eventi:**
1. Il passeggero seleziona un utente per visualizzare i suoi dettagli.
2. Il sistema mostra i dettagli dell'utente.
- **Exit condition:** Il passeggero ha visualizzato i dettagli dell'utente.
- **Nome caso d'uso:** `accettaPagamentoConCarta`
- **Entry condition:** Il caso d'uso estende `PrenotaCorsa` nel caso in cui il passeggero decida di procedere alla prenotazione della corsa.
- **Attori:** Iniziato da `Passeggero`, Comunica con `AziendaGestionePagamento`
- **Flusso degli eventi:**
1. Il sistema recupera i dettagli della carta di credito del passeggero.
2. Il sistema invia un messaggio a `AziendaGestionePagamento`, includendo:
- Identificativo del titolare
- Nome del titolare
- Numero della carta
- Data di scadenza della carta
- Importo della transazione
3. `AziendaGestionePagamento` autorizza la transazione.
4. Il sistema notifica al passeggero l'esito del pagamento.
5. Il sistema aggiorna la prenotazione.
- **Exit condition:** La transazione è stata autorizzata e la prenotazione è stata aggiornata.
---
### Conducente
- **Nome caso d'uso:** `PubblicaCorsa`
- **Entry condition:** Il conducente deve essere autenticato.
- **Attori:** Iniziato da Conducente
- **Flusso degli eventi:**
1. Il conducente accede alla funzione di pubblicazione corsa.
2. Il sistema presenta un modulo dove il conducente inserisce i dettagli della corsa, quali luogo di partenza, luogo di destinazione, data e ora di partenza, durata stimata del viaggio, numero di posti disponibili, prezzo per posto, e eventuali note rilevante.
3. Il conducente conferma e pubblica la corsa.
4. Il sistema elabora la pubblicazione.
- **Exit condition:** La corsa è stata pubblicata con successo.
- **Nome caso d'uso:** `AnnullaPubblicazioneCorsa`
- **Entry condition:** Il conducente ha precedentemente pubblicato almeno una corsa con stato in corso e deve essere autenticato.
- **Attori:** Iniziato da Conducente
- **Flusso degli eventi:**
1. Il conducente sceglie una corsa già pubblicata dall'elenco delle sue corse.
2. Il conducente seleziona l'opzione per annullare la pubblicazione della corsa.
3. Il sistema richiede conferma dell'annullamento al conducente.
4. Dopo la conferma, il sistema procede con l'eliminazione della corsa.
5. Il sistema invia automaticamente una notifica ai passeggeri che avevano prenotato la corsa, informandoli dell'annullamento.
- **Exit condition:** La corsa è stata annullata con successo e tutti i passeggeri interessati sono stati informati.
- **Nome caso d'uso:** `AnnunciaTerminazioneCorsa`
- **Entry condition:** Il coducente è autenticato.
- **Attori:** Iniziato da Conducente
- **Flusso degli eventi:**
1. Il conducente sceglie una corsa dall'elenco delle sue corse.
2. Il conducente seleziona l'opzione per annunciare la terminazione della corsa.
3. Il sistema richiede conferma al conducente e, una volta confermato, procede con l'aggiornamento dello stato della corsa a "terminata".
4. Il sistema invia una notifica ai passeggeri che hanno partecipato alla corsa, confermando la sua conclusione.
- **Exit condition:** La terminazione della corsa è stata annunciata e registrata con successo nel sistema.
- **Nome caso d'uso:** `VisualizzaCorsePubblicate`
- **Entry condition:** Il conducente è autenticato.
- **Attori:** Iniziato da Conducente
- **Flusso degli eventi:**
1. Il conducente seleziona l'opzione per visualizzare le corse pubblicate.
2. Il sistema mostra un elenco delle corse pubblicate dal conducente.
3. Il conducente sceglie una corsa dall'elenco per visualizzarne i dettagli.
4. include `VisualizzaDettagliCorsa`
- **Exit condition:** Il conducente ha visualizzato i dettagli di una o più corse che ha pubblicato.
---
### Gestore utenti
- **Nome caso d'uso:** `VerificaUtente`
- **Entry condition:** Il gestore utenti è autenticato
- **Attori:** Iniziato da Gestore utenti
- **Flusso degli eventi:**
1. Il gestore utenti seleziona l'opzione per visualizzare gli utenti in attesa di verifica.
2. Il sistema presenta l'elenco degli utenti che necessitano di verifica.
3. Il gestore sceglie un utente dall'elenco per esaminare i suoi dettagli.
4. Il sistema fornisce i dettagli dell'utente, inclusi nome, cognome, data di nascita, indirizzo email, e documento di riconoscimento.
5. Il gestore valuta le informazioni fornite e decide se approvare o rifiutare la registrazione dell'utente.
6. Il sistema aggiorna l'account dell'utente.
- **Exit condition:** La verifica dell'utente è stata completata e l'eventuale account è stato creato.
---
### Gestore corse
- **Nome caso d'uso:** `VisualizzaCorseinCorso`
- **Entry condition:** Il gestore delle corse è autenticato.
- **Attori:** Iniziato da Gestore corse
- **Flusso degli eventi:**
1. Il gestore delle corse seleziona l'opzione per visualizzare le corse in corso.
2. Il sistema presenta un elenco delle corse attualmente in corso, mostrando: luogo di partenza e di arrivo, orari di partenza e arrivo previsti, e numero di posti disponibili.
3. Il gestore può selezionare una corsa specifica dall'elenco per visualizzarne i dettagli.
4. include `VisualizzaDettagliCorsa`
- **Exit condition:** Il gestore ha visualizzato i dettagli delle corse in corso e ha ottenuto le informazioni necessarie.
- **Nome caso d'uso:** `RimuoviCorsa`
- **Entry condition:** Il gestore delle corse è autenticato. La corsa da eliminare deve trovarsi nello stato di pianificata.
- **Attori:** Iniziato da Gestore Corse
- **Flusso:**
1. Il gestore delle corse sceglie una corsa dall'elenco delle corse disponibili
2. include `VisualizzaDettagliCorsa`
3. Il gestore seleziona l'opzione per rimuovere la corsa
4. Il sistema procede all'eliminazione della corsa
5. Il sistema invia una notifica ai passeggeri che avevano prenotato la corsa e al conducente, informandoli dell'annullamento.
- **Exit condition:** La corsa è stata eliminata con successo e gli utenti sono stati notificati.
---
### Utente
- **Nome caso d'uso:** `RegistraUtente`
- **Entry condition:**
- **Attori:** Iniziata da Utente
- **Flusso degli eventi:**
1. L'individuo seleziona l'opzione per creare un nuovo account.
2. Il sistema presenta un modulo di registrazione dove l'individuo inserisce i dettagli richiesti: nome, cognome, data di nascita, numero di telefono, documento di identità (in formato immagine), email e password.
3. L'utente invia la richiesta di registrazione.
4. Il sistema registra la richiesta e aggiorna l'elenco degli utenti in attesa di verifica dell'account.
- **Exit condition:** La richiesta di creazione dell'account è stata inviata e registrata con successo.
- **Nome caso d'uso:** `Autenticazione`
- **Entry condition:**
- **Attori:** Iniziato da Utente
- **Flusso degli eventi:**
1. L'utente seleziona l'opzione di accesso sulla piattaforma.
2. Il sistema chidede le credienziali all'utente: email e password.
3. L'utente inserisce le credenziali.
4. il sistema controlla le credenziali e il controlo ha esito positivo
5. il sistema reindirizza l'utente alla sua home page
- **Exit condition:** L'utente viene autenticato e accede alla piattaforma.
- caso d'uso estensione
- **Nome caso d'uso:** `AutenticazioneFallita`
- **Attore:** Iniziato da utente
- **Entry Condition:** Se al punto 3 il sistema rileva credenziali non corrette, il sistema mostrerà il messaggio di errore “username o password non corrette” e ripresenterà la schermata di autenticazione (UC 1.1Autenticazione Fallita)
- **Flusso di eventi:**
1. il sistema mostra il messaggio di errore “username o password non corrette”
2. il sistema ripresenta all’utente la schermata di autenticazione
- **Exit Condition:** L’utente si trova sulla home page di Esse3 con la schermata di autenticazione
---
- **Nome caso d'uso:** `VisualizzaDettagliCorsa`
- **Attore:** Iniziato da `Passeggero`, `Conducente` e `GestoreCorse`
- **Entry Condition:** Il `Passeggero` o il `Conducente` o il `GestoreCorse` è autenticato nel sistema.
- **Flusso degli eventi:**
1. Il sistema mostra tutti i dettagli della corsa selezionata compreso: luogo di partenza, di luogo di destinazione, conducente, data e ora di partenza, data e ora di arrivo stimato, posti prenotati e da chi, prezzo per un posto e eventuali note aggiunte dal conducente.
- **Exit Condition:** Il sistema ha mostrato i dati della corsa.
---
```plantuml
@startuml
' Define layout direction
left to right direction
' Define actors
actor Passeggero
actor Conducente
actor Utente
actor GestoreUtenti
actor GestoreCorse
actor AziendaGestionePagamento
' Define use cases
usecase TrovaCorse as "Trova Corse"
usecase PrenotaCorsa as "Prenota Corsa"
usecase AnnullaPrenotazioneCorsa as "Annulla Prenotazione Corsa"
usecase VisualizzaCorsePrenotate as "Visualizza Corse Prenotate"
usecase PubblicaCorsa as "Pubblica Corsa"
usecase AnnullaPubblicazioneCorsa as "Annulla Pubblicazione Corsa"
usecase AnnunciaTerminazioneCorsa as "Annuncia Terminazione Corsa"
usecase VisualizzaCorsePubblicate as "Visualizza Corse Pubblicate"
usecase VerificaUtente as "Verifica Utente"
usecase VisualizzaCorseinCorso as "Visualizza Corse in Corso"
usecase RimuoviCorsa as "Rimuovi Corsa"
usecase RegistraUtente as "Registra Utente"
usecase Autenticazione
usecase AutenticazioneFallita as "Autenticazione Fallita"
usecase AccettaPagamentoConCarta as "Accetta Pagamento Con Carta"
usecase VisualizzaDettagliCorsa as "Visualizza Dettagli Corsa"
usecase VisualizzaDettagliUtente as "Visualizza Dettagli Utente"
' Define relationships
Utente <|- Conducente
Utente <|- Passeggero
Passeggero -- TrovaCorse
Passeggero -- PrenotaCorsa
Passeggero -- AnnullaPrenotazioneCorsa
Passeggero -- VisualizzaCorsePrenotate
Passeggero -- AccettaPagamentoConCarta
Conducente -- PubblicaCorsa
Conducente -- AnnullaPubblicazioneCorsa
Conducente -- AnnunciaTerminazioneCorsa
Conducente -- VisualizzaCorsePubblicate
GestoreCorse -- VisualizzaCorseinCorso
GestoreCorse -- RimuoviCorsa
GestoreUtenti -- VerificaUtente
Utente -- RegistraUtente
Utente -- Autenticazione
Autenticazione <.. AutenticazioneFallita : extends
AccettaPagamentoConCarta -- AziendaGestionePagamento
TrovaCorse ..> VisualizzaDettagliCorsa : include
VisualizzaCorsePrenotate ..> VisualizzaDettagliCorsa : include
VisualizzaCorsePubblicate ..> VisualizzaDettagliCorsa : include
VisualizzaCorseinCorso ..> VisualizzaDettagliCorsa : include
RimuoviCorsa ..> VisualizzaDettagliCorsa : include
VisualizzaDettagliCorsa <.. VisualizzaDettagliUtente : extends
@enduml
```
1. **TrovaCorse**
- Oggetti:
- Modulo di ricerca (contiene campi per luogo di partenza, luogo di destinazione, numero di posti)
- Elenco corse (lista di corse con dettagli come luogo di partenza e destinazione, orari, posti, prezzo)
- Corsa (ogni elemento nell'elenco delle corse)
2. **PrenotaCorsa**
- Oggetti:
- Corsa (dettagli della corsa selezionata per la prenotazione)
- Prenotazione (dettagli della prenotazione, incluso il riferimento alla corsa)
3. **AnnullaPrenotazioneCorsa**
- Oggetti:
- Prenotazione (prenotazione da annullare)
- Notifica (messaggio inviato al conducente)
4. **VisualizzaCorsePrenotate**
- Oggetti:
- Elenco prenotazioni (lista delle prenotazioni fatte dall'utente)
- Prenotazione (ogni elemento nell'elenco delle prenotazioni)
5. **VisualizzaDettagliUtente**
- Oggetti:
- Utente (dettagli dell'utente selezionato)
6. **accettaPagamentoConCarta**
- Oggetti:
- Dettagli carta di credito (informazioni sulla carta di credito del passeggero)
- Transazione (dettagli della transazione, compreso l'importo)
7. **PubblicaCorsa**
- Oggetti:
- Modulo di pubblicazione corsa (contiene campi per i dettagli della corsa)
- Corsa (dettagli della corsa pubblicata)
8. **AnnullaPubblicazioneCorsa**
- Oggetti:
- Corsa (corsa selezionata per l'annullamento)
- Notifica (messaggio inviato ai passeggeri)
9. **AnnunciaTerminazioneCorsa**
- Oggetti:
- Corsa (corsa selezionata per annunciare la terminazione)
- Notifica (messaggio di conferma della conclusione della corsa)
10. **VisualizzaCorsePubblicate**
- Oggetti:
- Elenco corse pubblicate (lista delle corse pubblicate dal conducente)
- Corsa (ogni elemento nell'elenco delle corse pubblicate)
11. **VerificaUtente**
- Oggetti:
- Elenco utenti (lista degli utenti in attesa di verifica)
- Utente (dettagli dell'utente selezionato per la verifica)
12. **VisualizzaCorseinCorso**
- Oggetti:
- Elenco corse in corso (lista delle corse attualmente in corso)
- Corsa (ogni elemento nell'elenco delle corse in corso)
13. **RimuoviCorsa**
- Oggetti:
- Corsa (corsa selezionata per la rimozione)
- Notifica (messaggi inviati ai passeggeri e al conducente)
14. **RegistraUtente**
- Oggetti:
- Modulo di registrazione (contiene campi per i dettagli richiesti)
- Richiesta di registrazione (dettagli dell'utente inviati per la registrazione)
15. **Autenticazione**
- Oggetti:
- Credenziali (email e password fornite dall'utente)
- Sessione utente (rappresenta la sessione dell'utente autenticato)
16. **AutenticazioneFallita**
- Oggetti:
- Messaggio di errore (notifica mostrata all'utente)
17. **VisualizzaDettagliCorsa**
- Oggetti:
- Dettagli della corsa (informazioni complete sulla corsa selezionata)
### Entity Objects
Gli Entity Objects sono oggetti che rappresentano informazioni persistenti tracciate dal sistema. In genere si riferiscono a dati che devono essere memorizzati e recuperati dal sistema.
- **Corsa**: Include dettagli come luogo di partenza e destinazione, orari, posti, prezzo. Usata in vari casi d'uso come `TrovaCorse`, `PubblicaCorsa`, `AnnullaPubblicazioneCorsa`, ecc.
- **Prenotazione**: Dettagli delle prenotazioni, riferimenti alle corse. Utilizzata in `PrenotaCorsa`, `AnnullaPrenotazioneCorsa`, ecc.
- **Utente**: Dettagli dell'utente, utilizzati in casi d'uso come `VerificaUtente`, `VisualizzaDettagliUtente`.
- **Transazione**: Rappresenta le transazioni finanziarie, usata in `accettaPagamentoConCarta`.
- **Elenco corse**: Lista delle corse disponibili, utilizzata in `TrovaCorse`, `VisualizzaCorseinCorso`, ecc.
- **Elenco prenotazioni**: Lista delle prenotazioni effettuate, usata in `VisualizzaCorsePrenotate`.
- **Elenco utenti**: Lista degli utenti in attesa di verifica, utilizzata in `VerificaUtente`.
### Boundary Objects
I Boundary Objects rappresentano le interazioni tra gli attori e il sistema. Essi facilitano la comunicazione tra il sistema e il mondo esterno.
- **Modulo di ricerca**: Interfaccia per inserire i criteri di ricerca nelle corse, usato in `TrovaCorse`.
- **Modulo di pubblicazione corsa**: Interfaccia per inserire i dettagli della corsa da pubblicare, usato in `PubblicaCorsa`.
- **Modulo di registrazione**: Form per la registrazione dell'utente, usato in `RegistraUtente`.
- **Interfaccia di autenticazione**: Schermata per il login, usata in `Autenticazione` e `AutenticazioneFallita`.
- **Notifica**: Messaggi inviati agli utenti, usati in vari casi come `AnnullaPubblicazioneCorsa`, `AnnunciaTerminazioneCorsa`, ecc.
### Control Objects
I Control Objects sono responsabili della realizzazione dei casi d'uso, gestendo la logica e il flusso di controllo.
- **Gestione Ricerca Corse**: Controllo del flusso di eventi in `TrovaCorse`.
- **Gestione Prenotazioni**: Gestisce la logica di prenotazione, annullamento e visualizzazione delle prenotazioni.
- **Gestione Utenti**: Controlla il processo di verifica degli utenti, registrazione e autenticazione.
- **Gestione Pagamenti**: Gestisce le transazioni e la comunicazione con `AziendaGestionePagamento` in `accettaPagamentoConCarta`.
- **Gestione Corse**: Controlla la pubblicazione, cancellazione e visualizzazione delle corse.
---
# Analisi
## Fasi dell'analisi

## Definizione degli oggetti partecipanti
### Definire gli entity object
**Entity Objects:**
1. **Passeggero:** Rappresenta un utente che prenota o utilizza una corsa.
2. **Corsa:** Contiene informazioni sulla corsa, come luogo di partenza, luogo di destinazione, data e ora, posti disponibili, ecc.
3. **Prenotazione:**
4. **UTENTE SARA' UNA GENERALIZZAZIONE SUCCESSIVA**
5. **Conducente:** Rappresenta un utente che guida un veicolo e pubblica corse.
6. **GestoreCorse:** Rappresenta un utente responsabile della gestione delle corse nel sistema.
7. **GestoreUtenti:** Rappresenta un utente responsabile della gestione degli utenti nel sistema.
8. **AziendaGestionePagamento:(?????)** Rappresenta l'azienda responsabile della gestione dei pagamenti nel sistema.
### Definire i boundary object
**Boundary Objects:** *Tips: i boundary object collezionano informazioni ottenute dagli attori e le gestiscono in modo tale da poter essere gestite poi dagli entity e control object*
1. **Interfaccia di Prenotazione:** Consente al passeggero di visualizzare i dettagli della corsa e prenotarla.
2. **Interfaccia di Ricerca Corsa:** Consente ad un utente di inserire i dati per cercare una corsa.
3. **Interfaccia di Annullamento Prenotazione:** Consente al passeggero di annullare la prenotazione di una corsa.
4. **Interfaccia di Pubblicazione Corsa:** Consente al conducente di inserire i dettagli della corsa da pubblicare.
5. **Interfaccia di conferma Pubblicazione Corsa:** Consente al conducente di confermare i dettagli della corsa da pubblicare.
6. **Interfaccia di Annullamento Pubblicazione:** Permette al conducente di annullare la pubblicazione di una corsa.
7. **Interfaccia di Annuncio Terminazione Corsa:** Consente al conducente di annunciare la terminazione di una corsa.
8. **Interfaccia di Visualizzazione Corse Pubblicate:** Permette al conducente di visualizzare le corse pubblicate.
9. **Interfaccia di Visualizzazione Corse Cercate:** Permette all'utente di visualizzare le corse da lui cercate.
10. **Interfaccia di Verifica Utente:** Consente al gestore utenti di visualizzare e verificare gli utenti in attesa di verifica.
11. **Interfaccia di Visualizzazione Corse in Corso:** Permette al gestore corse di visualizzare le corse attualmente in corso.
12. **Interfaccia di Rimozione Corsa:** Consente al gestore corse di rimuovere una corsa.
13. **Interfaccia di Registrazione Utente:** Permette agli utenti di inserire i dettagli richiesti per la registrazione.
14. **Interfaccia di Autenticazione:** Consente agli utenti di inserire le credenziali per l'autenticazione.
15. **Interfaccia di AutenticazioneFallita:** Mostra un messaggio di errore in caso di fallimento dell'autenticazione.
16. **Interfaccia di Visualizzazione Dettagli Corsa:** Consente a passeggeri, conducenti e gestori corse di visualizzare i dettagli di una corsa.
17. **Interfaccia di Visualizzazione Informazioni Utente:** Consente a passeggeri e conducenti, di visualizzare le informazioni di altri utenti in riferimento ad una stessa corsa.
18. **Interfaccia di Visualizzazione Corse Prenotate**: Rappresenta l’interfaccia utente attraverso la quale il passeggero seleziona la funzione per visualizzare le corse prenotate.
19. **Interfaccia di Visualizzazione delle notifiche:** Consente agli utenti di visualizzare le notifiche ricevute.(*poiché consideriamo le notifiche semplicemente come un metodo di comunicazione del sistema con l'utente queste possono essere considerate come boundary object e non come entity.*)
### Definire i control object
**Control Objects:** *Tips: Solitamente gli oggetti di questo tipi vengono istanziati all'inizio di un caso d'uso e vengono deallocati alla fine. Si occupa di ottenere le informazioni dai boundary object e distribuirle agli entity objects*
1. **Controller di Prenotazione:** Gestisce la prenotazione di una corsa, inclusa l'autorizzazione del pagamento.
2. **Controller di Ricerca Corsa:** Gestisce la ricerca di una corsa.
3. **Controller di Annullamento Prenotazione:** Gestisce l'annullamento della prenotazione di una corsa da parte del passeggero.
4. **Controller di Pubblicazione Corsa:** Gestisce la pubblicazione di una corsa da parte del conducente.
5. **Controller di Conferma Pubblicazione Corsa:** Gestisce la conferma di pubblicazione di una corsa da parte del conducente.
6. **Controller di Annullamento Pubblicazione:** Gestisce l'annullamento della pubblicazione di una corsa da parte del conducente.
7. **Controller di Annuncio Terminazione Corsa:** Gestisce l'annuncio di terminazione di una corsa da parte del conducente.
8. **Controller di Visualizzazione Corse Pubblicate:** Gestisce la visualizzazione delle corse pubblicate da parte del conducente.
9. **Controller di Visualizzazione Corse Prenotate:** Gestisce la visualizzazione delle corse prenotate da parte del passeggero.
10. **Controller di Verifica Utente:** Gestisce la verifica degli utenti da parte del gestore utenti.
11. **Controller di Visualizzazione Corse in Corso:** Gestisce la visualizzazione delle corse attualmente in corso da parte del gestore corse.
12. **Controller di Rimozione Corsa:** Gestisce la rimozione di una corsa da parte del gestore corse.
13. **Controller di Registrazione Utente:** Gestisce la registrazione di un nuovo utente.
14. **Controller di Autenticazione:** Gestisce il processo di autenticazione dell'utente.
15. **Controller di AutenticazioneFallita:** Gestisce il flusso in caso di fallimento dell'autenticazione.
16. **Controller di Visualizzazione Dettagli Corsa:** Gestisce la visualizzazione dei dettagli di una corsa.
17. **Controller di Visualizzazione Dettagli Utente:** Gestisce la visualizzazione dei dettagli di un utente.
18. **Controller di Visualizzazione Corse Cercate:** Gestisce la visualizzazione delle corse in base ai criteri forniti dall'utente.
19. **Controller di Gestione delle Notifiche:** Gestisce l'inoltre delle notifiche agli utenti.
```plantuml
@startuml
actor Passeggero
participant "TrovaCorseButton"
Passeggero -> TrovaCorseButton : press()
TrovaCorseButton -> TrovaCorseControl : <<create>>
TrovaCorseControl -> TrovaCorseForm : <<create>>
Passeggero -> TrovaCorseForm : fillContents()
Passeggero -> TrovaCorseForm : submit()
TrovaCorseForm -> TrovaCorseControl : submitTrovaCorse()
TrovaCorseControl -> TrovaCorseControl : findCorse()
TrovaCorseControl -> CorseTrovateSummary : <<create>>
TrovaCorseControl -> CorseTrovateSummary : setCorseTrovate(Corse)
Passeggero -> CorseTrovateSummary : visualizzaCorseTrovate()
Passeggero -> CorseTrovateSummary : selezionaCorsa()
CorseTrovateSummary -> CorsaControl : <<create>>
CorseTrovateSummary -> CorsaControl : submitCorsaSelezionata()
CorsaControl -> Corsa : <<create>>
CorsaControl -> CorsaView : <<create>>
CorsaControl -> CorsaView : setCorsa()
Passeggero -> CorsaView : visualizzaDettagliCorsa()
@enduml
```
---
- **Nome caso d'uso:** `TrovaCorse`
- **Entry condition:** None
- **Attori:** Iniziato da `Passeggero`
- **Flusso degli eventi:**
1. Il passeggero seleziona l'opzione di ricerca corse.
2. Il sistema presenta un modulo di ricerca dove il passeggero inserisce i dettagli della corsa desiderata, come luogo di partenza, luogo di destinazione e il numero di posti necessari.
3. Il passeggero invia la richiesta di ricerca.
4. Il sistema elabora la richiesta e mostra un elenco di corse disponibili che corrispondono ai criteri forniti dal passeggero, includendo le informazioni: luogo di partenza e destinazione, data e ora di partenza, data e ora di arrivo, numero di posti prenotati e disponibili e prezzo.
5. Il passeggero seleziona una corsa che soddisfa le sue esigenze.
6. include `VisualizzaDettagliCorsa`
- **Exit condition:** Il passeggero ha visualizzato i dettagli completi di una corsa specifica e può procedere alla prenotazione o continuare la ricerca.