**Aggiornare i requisiti poiché il catalogo è relativo al punto vendita**
## Stakeholders
1. Catena di mobili
2. Cliente
<!-- 3. Amministratore
4. Manager -->
## Che cosa ogni stakeholder si aspetta dal sistema
- Catena mobili vuole migliorare l'esperienza d'acquisto
- Gestione del magazzino
- Customer relationship management
- Organizza gli acquisti
- (Prenotazione)
- Consultazione catalogo
Nota che bisogna capire se inserimento e modifica possiamo metterlo nello stesso requisito o dobbiamo farne 2
## Requisiti
1. Inserimento modifica e cancellazione articoli
2. Definizione caretteristiche articoli
1. Creazione e di punti vendita
2.gestione articoli venduti in punto vendita
1. Visualizzare e aggiornare disponibilità articoli
2. Inviare email ai clienti registrati
3. Rispondere ai commenti
4. Gestione degli utenti registrati nel punto vendita
5. Autenticazione utente presso puntovendita
6. Ricerca articoli
7. Forniure informazioni relative all'articolo
8. Definire liste d'acquisto
9. Richiedere e-mail con lista d'aquisto
10. Aggiungere e rimuovere articoli
11. Salvare lista di acquisto
12. Prenotare articoli non disponibili
13. Inserire commenti e/o indici di gradimento relativi ad articoli acquistati
14. Invio lista di acquisto tramite e-mail al cliente
15. Sfogliare il catalogo
16. Registrare utente
```plantuml
@startuml
left to right direction
skinparam packageStyle rectangle
actor Amministratore as A
actor Cliente as C
actor Manager as M
rectangle MyShop {
A -- (Sfoglia catalogo)
C -- (Sfoglia catalogo)
M -- (Sfoglia catalogo)
A -- (Crea articolo)
A -- (Modifica articolo)
A -- (Cancella articolo)
A -- (Crea Punto Vendita)
A -- (Seleziona articoli da vendere)
A -- (Crea manager)
(Effettua acquisto tramite lista) -- C
(Crea lista) -- C
(Inserisce articoli nella lista) -- C
(Prenota articoli non disponibili) -- C
(Lascia feedback) -- C
(Richiede lista in formato PDF) -- C
M -- (Visualizza stato magazzino)
M -- (Rifornisce magazzino)
M -- (Invia e-mail agli utenti)
M -- (Risponde ai commenti sotto agli articoli)
M -- (Disabilita clienti)
M -- (Cancella clienti)
(Effettua acquisto tramite lista) .> (Crea lista) : include
(Effettua acquisto tramite lista) .> (Inserisce articoli nella lista) : include
(Effettua acquisto tramite lista) .> (Prenota articoli non disponibili) : include
(Rifornisce magazzino) .> (Visualizza stato magazzino) : include
@enduml
```
## Use cases
Attori:
1. Amministratore
2. Manager
3. Cliente
## Use cases
### ~~Utente guest~~
1. ~~Registrazione Utente~~
### ~~Amministratore~~
3. ~~Prodotto~~
- ~~Creazione prodotto~~
- ~~Costo~~
- ~~Collocazione magazino~~
- ~~Produttore~~
- ~~Creazione categoria~~
- ~~Creazione sottocategoria~~
- ~~Modifica prodotto~~
- ~~Cancellazione prodotto~~
4. ~~Servizio~~
3. ~~Creazione Servizio~~
4. ~~Costo~~
5. ~~Creazione categoria~~
5. ~~Modifica Servizio~~
6. ~~Cancellazione Servizio~~
5. Punti vendita
2. ~~Creazione punti vendita~~
3. ~~Selezione articoli da vendere~~
6. ~~Manager~~ (non necessario)
3. ~~Creazione manager~~
### Manager
(Autenticazione???)
1. Articoli
- Visualizzare stato magazzino
- Rifornire magazzino
2. Gestione relazioni clienti
- Invio e-mail
- rispondere ai commenti sugli articoli
- Gestione account utenti
- Disabilita account cliente
- Cancella account cliente
### ~~Cliente~~
(Autenticazione???)
1. ~~Ricerca articolo per consultare informazioni~~
2. ~~Cliente completa lista d'acquisto e paga alla cassa~~
- ~~Creazione liste di acquisto~~
- ~~inserimento articoli di interesse~~
- ~~cancellazione articoli di interesse~~
- ~~Modifica lista di acquisto~~
- ~~inserimento articoli di interesse~~
- ~~cancellazione articoli di interesse~~
- ~~Esportazione lista in pdf tramite email~~
3. ~~Utente prenota articoli non disponibili~~ |
4. ~~Utente lascia feedback~~
### Creazione prodotto
L'amministratore autenticato va nella finestra crea prodotto e inserisce nei vari campi presenti il costo, la collocazione, produttore, categorie e sottocategorie (se non presenti le aggiunge). Prodotto creato correttamente.
#### Estensioni
- prodotto esiste gia'
- Categoria non esiste e crea nuova categoria digitandone il nome
- Sottocategoria non esiste e crea nuova categoria digitandone il nome
## Amministratore
|Nome | Creazione prodotto|
|----|----|
|**Precondizione**|L'amministratore ha un account abilitato|
|**Post-condizione**|Il prodotto è stato creato correttamente e inserito nel catalogo|
|**Scenario principale**|1. L'amministratore fa il login|
| |2.L'amministratore seleziona la voce crea prodotto dal catalogo|
| |3. L'amministratore inserisce nei rispettivi campi le caratteristiche del prodotto|
| |4. L'amministratore seleziona la categoria del prodotto|
| |5. L'amministratore seleziona la sottocategoria del prodotto|
| |6. Il sistema conferma la creazione del prodotto|
|**Estensioni**|4a. La categoria non è elencata. L'amministratore inserisce una nuova categoria |
||5a. La sottocategoria non è elencata. L'amministratore inserisce una nuova sottocategoria|
||6a. Creazione del prodotto fallita: non sono stati inseriti tutti i campi richiesti|
||6b. Creazione del prodotto fallita: il prodotto è già esistente nel catalogo|
|Nome | Modifica articolo|
|----|----|
|**Precondizione**|L'amministratore ha un account abilitato|
||L'articolo da modificare è presente nel catalogo|
|**Post-condizione**|L' articolo è stato aggiornato correttamente|
|**Scenario principale**|1. L'amministratore fa il login|
| |2. L'amministratore sfoglia il catalogo|
| |3. L'amministratore seleziona l'articolo dal catalogo|
| |4. L'amministratore modifica i campi dell'articolo selezionato|
| |6. Il sistema conferma l'avvenuta modifica dell'articolo|
|**Estensioni**|6a. Modifica dell'articolo fallita: non sono stati inseriti tutti i campi richiesti|
||6b. Modifica dell'articolo fallita: esiste già un articolo uguale a quello risultante dalla modifica|
|Nome | Cancellazione Articoli|
|----|----|
|**Precondizione**|L'amministratore ha un account abilitato|
||L'articolo da cancellare è presente nel catalogo|
|**Post-condizione**|L'articolo è stato eliminato correttamente|
|**Scenario principale**|1. L'amministratore fa il login|
| |2. L'amministratore sfoglia il catalogo|
| |3. L'amministratore seleziona gli articoli da cancellare dalla lista degli articoli|
| |4. Il sistema conferma l'avvenuta cancellazione degli articoli|
|Nome | Creazione Servizio|
|----|----|
|**Precondizione**|L'amministratore ha un account abilitato|
|**Post-condizione**|Il servizio è stato creato correttamente e inserito nel catalogo|
|**Scenario principale**|1. L'amministratore fa il login|
| |2. L'amministratore seleziona la voce crea servizio dal catalogo|
| |3. L'amministratore inserisce nei rispettivi campi le caratteristiche del servizio|
| |4. L'amministratore seleziona la categoria del servizio|
| |5. Il sistema conferma la creazione del servizio|
|**Estensioni**|4a. La categoria non è elencata. L'amministratore inserisce una nuova categoria |
||6a. Creazione del servizio fallita: non sono stati inseriti tutti i campi richiesti|
||6b. Creazione del servizio fallita: il servizio è già esistente nel catalogo|
|Nome | Creazione Punto vendita|
|----|----|
|**Precondizione**|L'amministratore ha un account abilitato|
|**Post-condizione**|Il punto vendita è stato creato correttamente|
|**Scenario principale**|1. L'amministratore fa il login|
| |2. L'amministratore seleziona la voce gestione punti vendita dal menù|
| |3. L'amministratore seleziona crea punto vendita |
| |4. L'amministratore inserisce le caratteristiche del punto vendita|
| |5. L'amministratore inserisce il nome utente del manager da associare al punto vendita|
| |6. Il sistema conferma la creazione del punto vendita|
|**Estensioni**|6a. Creazione del punto vendita fallita: non sono stati inseriti tutti i campi richiesti|
|Nome | Selezione articoli da vendere|
|----|----|
|**Precondizione**|L'amministratore ha un account abilitato|
||Esiste il punto vendita|
||Esistono degli articoli nel catalogo|
|**Post-condizione**|Gli articoli selezionati sono presenti nel punto vendita|
|**Scenario principale**|1. L'amministratore fa il login|
| |2. L'amministratore seleziona la voce gestione punti vendita dal menù|
| |3. L'amministratore cerca e seleziona il punto vendita|
| |4. L'amministratore cerca e seleziona gli articoli da aggiungere|
| |5. Il sistema conferma l'aggiunta degli articoli al catalogo del punto vendita|
|Nome | Creazione account manager|
|----|----|
|**Precondizione**|L'amministratore ha un account abilitato|
||Esiste il punto vendita|
|**Post-condizione**|L'account manager è stato creato correttamente ed associato al punto vendita|
|**Scenario principale**|1. L'amministratore fa il login|
| |2. L'amministratore seleziona la voce gestione punti vendita dal menù|
| |4. L'amministratore seleziona la voce crea manager|
| |5. Il sistema conferma l'aggiunta del manager al punto vendita|
|**Estensioni**||
## Cliente
|Nome | Registrazione Utente |
| --- | ---|
|**Pre-condizione**||
|**Post-condizione**|L' account dell' utente è stato creato|
|**Scenario principale**|1. L' utente naviga sulla pagina di login|
||2. L' utente seleziona il pulsante "registrati"|
||3. L' utente fornisce i dati personali|
||4. Il sistema conferma la registrazione dell' utente|
|**Estensioni**|4a. L' e-mail o il numero di telefono sono già associati ad un altro utente|
||4b. L' e-mail inserita non esiste|
||4c. L' utente non ha inserito uno o più dati necessari alla registrazione|
|Nome | Ricerca articolo per consultare informazioni|
| --- | ---|
|**Pre-condizione**||
|**Post-condizione**||
|**Scenario principale**|1. L'utente naviga sul catalogo degli articoli del punto vendita|
||2. L'utente seleziona l'articolo di interesse|
|Nome | Cliente effettua acquisto tramite lista |
| --- | ---|
|**Pre-condizione**|L'utente è loggato con un account abilitato|
|**Post-condizione**|L'utente ha acquistato gli articoli presenti nella lista|
|**Scenario principale**|1. L' utente <ins>crea una nuova lista</ins>|
||2. L'utente <ins>inserisce e/o rimuove articoli</ins>|
||3. L'utente <ins>richiede la lista in pdf sulla sua e-mail</ins>|
||4. L'utente <ins>acquista la lista</ins>|
|**Estensioni**|1a. L'utente <ins>prenota gli articoli non disponibili</ins>|
|Nome | Utente crea una nuova lista |
| --- | ---|
|**Pre-condizione**|L'utente è loggato con un account abilitato|
|**Post-condizione**|La lista è presente nella sezione delle liste dell'utente|
|**Scenario principale**|1. L'utente preme il pulsante crea lista
||2. Il sistema mostra il catalogo con la nuova lista attualmente in uso|
|Nome | Utente carica una lista salvata|
| --- | ---|
|**Pre-condizione**|L'utente è loggato con un account abilitato|
|**Post-condizione**||
|**Scenario principale**|1. L'utente naviga nella sezione "le mie liste"|
| |2. L'utente seleziona la lista che intende modificare|
| |3. Il sistema mostra il catalogo con la lista caricata attualmente in uso|
|Nome | Utente inserisce nuovi articoli nella lista |
| --- | ---|
|**Pre-condizione**|L'utente è loggato con un account abilitato e una lista è attualmente in uso|
|**Post-condizione**| L'articolo è presente nella lista|
|**Scenario principale**|1. L'utente seleziona l'articolo d'interesse nel catalogo|
| |2. L'utente preme il pulsante "aggiungi articolo alla lista" |
|Nome | Utente rimuove articoli dalla lista |
| --- | ---|
|**Pre-condizione**|L'utente è loggato con un account abilitato e una lista è attualmente in uso|
|| L'articolo da rimuovere è presente nella lista|
|**Post-condizione**| L'articolo è rimosso dalla lista|
|**Scenario principale**|1. L'utente seleziona l'articolo da rimuovere dalla lista|
| |2. L'utente preme il pulsante "rimuovi articolo dalla lista" |
| |3. Il sistema aggiorna la lista|
|Nome | Utente prenota articoli non disponibili |
| --- | ---|
|**Pre-condizione**|L'articolo d'interesse non è disponibile in magazzino|
||L'utente è loggato con un account abilitato e una lista è attualmente in uso|
|**Post-condizione**|Il sistema memorizza id utente e la quantità di articoli prenotati|
|**Scenario principale**|1. <ins>Ricerca articolo per consultare informazioni</ins>|
||2. L'utente seleziona la voce prenota articolo|
||3. Il sistema registra la prenotazione e da una conferma all'utente|
|Nome | Utente lascia feedback |
| --- | ---|
|**Pre-condizione**|L'articolo è presente in una lista acquistat dall'utente|
||L'utente è loggato con un account abilitato|
|**Post-condizione**|Il feedback è visibile tra le informazioni dell'articolo |
|**Scenario principale**|1. <ins>Ricerca articolo per consultare informazioni</ins>|
||2. L'utente preme il pulsante aggiungi feedback|
||3. L'utente inserisce il gradimento e/o commenti sull'articolo|
||4. Il sistema conferma che l'operazione è avvenuta con successo|
|Nome | Utente richiede la lista in pdf sulla sua e-mail|
|---|---|
|**Pre-condizione**|L'utente è loggato con un account abilitato|
||Una lista è attualmente in uso ed è composta da almeno un'articolo|
|**Post-condizione**|L'utente ha ricevuto la mail con il PDF|
|**Scenario principale**|1. L'utente preme il pulsante "salva in PDF"|
||2. Il sistema genera il PDF e lo invia in allegato all' e-mail dell'utente|
||3. Il sistema conferma l'operazione|
## Manager
. Articoli
- Visualizzare stato magazzino
- Rifornire magazzino
2. Gestione relazioni clienti
- Invio e-mail
- rispondere ai commenti sugli articoli
- Gestione account utenti
- Disabilita account cliente
- Cancella account cliente
| Nome | Visualizzare stato magazzino |
| --- | ---|
|**Pre-condizione**|L'utente è autenticato con un account manager|
|**Post-condizione**||
|**Scenario principale**|1. Il manager seleziona la voce "gestione magazzino" dal menù|
|**Estensioni**||
| Nome | Rifornire magazzino |
| --- | ---|
|**Pre-condizione**|L'utente è autenticato con un account manager|
|**Post-condizione**|Il sistema aggiorna la disponibiltà degli articoli riforniti|
|**Scenario principale**|1. Il manager seleziona la voce "gestione magazzino" dal menù|
||2. Il manager seleziona l'articolo su cui deve aggiornare la disponibilità|
||3. Il manager digita la quantità degli articoli da aggiungere|
||4. Il sistema conferma la avvenuta modifica della disponibilità dell'articolo|
|**Estensioni**||
| Nome | Invio e-mail agli utenti acquirenti |
| --- | ---|
|**Pre-condizione**|L'utente è autenticato con un account manager|
||Almeno un utente è registrato nel suo punto vendita|
|**Post-condizione**|Gli utenti ricevono la mail|
|**Scenario principale**|1. Il manager preme il pulsante gestione utenti|
||2. Il manager seleziona gli utenti |
||3. Il manager scrive la mail |
||4. Il manager conferma l'invio|
|**Estensioni**||
| Nome | Risponde ai commenti sotto gli articoli |
| --- | ---|
|**Pre-condizione**|L'utente è autenticato con un account manager|
||L'articolo è stato commentato almeno una volta|
|**Post-condizione**|La risposta è visualizzabile sotto al commento|
|**Scenario principale**|1. Il manager naviga sul catalogo|
||2. Il manager seleziona l'articolo d'interesse|
||3. Il manager seleziona il commento e preme il pulsante rispondi|
||4. Il manager scrive la risposta|
||5. Il sistema conferma che la risposta è inserita con successo|
|**Estensioni**||
| Nome | Disabilita account cliente |
| --- | ---|
|**Pre-condizione**|L'utente è autenticato con un account manager e almeno un cliente è registrato al suo punto vendita|
|**Post-condizione**|L'utente non può fare login al sistema|
|**Scenario principale**|1. Il manager preme il pulsante gestione utenti|
||2. Il manager seleziona gli utenti |
||3. Il manager preme il pulsante disabilità utenti|
||4. Il sistema chiede di confermare l'operazione |
||5. Il manager conferma l'operazione |
||6. Il sistema conferma l'avvenuta disabilitazione|
|**Estensioni**|5.a Il manager annulla l'operazione|
| Nome | Cancella account cliente |
| --- | ---|
|**Pre-condizione**|L'utente è autenticato con un account manager e almeno un cliente è registrato al suo punto vendita|
|**Post-condizione**|L'account utente è eliminato dal sistema|
|**Scenario principale**|1. Il manager preme il pulsante gestione utenti|
||2. Il manager seleziona gli utenti |
||3. Il manager preme il pulsante cancella utenti|
||4. Il sistema chiede di confermare l'operazione |
||5. Il manager conferma l' operazione |
||6. Il sistema conferma l'avvenuta cancellazione |
|**Estensioni**|5.a Il manager annulla l'operazione|
## Schede CRC
|UtenteBusiness| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|Verifica dei privilegi|UtenteDAO|
|gestione utenze||
|UtenteDAO| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione persistenza utenze||
|ArticoloBusiness| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione articoli|ArticoloDAO||
|getione del catalogo del punto vendita||
|ArticoloDAO| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione persistenza articoli||
|ProdottoBusiness| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione prodotti|ProdottoDAO|
|ProdottoDAO| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione persistenza prodotti||
|ServizioBusiness| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione servizi|ServizioDAO|
|ServizioDAO| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione persistenza servizi||
|PuntoVenditaBusiness | |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione punti vendita|PuntoVenditaDAO|
|||
|PuntoVenditaDAO| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione persistenza punti vendita||
|gestione persistenza degli articoli vendibili nei punti vendita||
|ListaBusiness| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione liste di articoli|ListaDAO|
|||
|AcquistoBusiness| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione acquisti di liste|AcquistoDAO|
|||
|MailAPI| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione creazione e invio di email||
|||
|Feedback Business | |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione feedback clienti|EspressioneDiGradimentoDAO|||
|gestione ordinamento feedback|
|EspressioneDiGradimentoDAO | |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione persistenza feedback||||
|PdfAPI | |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione PDF |||
|MagazzinoBusiness | |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione magazzini di un punto vendita|MagazzinoDAO|||
|MagazzinoDAO| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione persistenza magazzini||
|gestione persistenza degli articoli disponibili nei magazzini||
|SessionManager| |
|---| --|
|**Responsabilita**| **Collaboratori**|
|gestione delle sessioni|||
## Schema relazionale
1. Utente(<ins>idUtente</ins>, username, password, nome, cognome, email, data_nascita)
2. Produttore_Fornitore(<ins>idProduttore_Fornitore</ins>, sitoweb*, nome, citta, nazione, produttore_fornitore)
3. Posizione(<ins>idPosizione</ins>, scaffale, corsia)
4. Punto_Vendita(<ins>idPunto_Vendita</ins>, citta, via, civico, *Manager_Utente_idUtente*)
```Con vincolo di int. ref fra Punto_vendita(Manager_Utente_idUtente) e Manager(Utente_idUtente)```
5. Magazzino(<ins>idMagazzino</ins>, PuntoVendita_idPuntoVendita)
```Con vincolo di int. ref fra Magazzino(PuntoVendita_idPuntoVendita) e Punto_vendita(idPuntoVendita)```
6. Acquisto(<ins>idAcquisto</ins>, Cliente_Utente_idUtente)
```Con vincolo di int. ref fra Acquisto(Cliente_Utente_idUtente) e Cliente(Utente_idUtente)```
7. Lista(<ins>idLista</ins>, nome, pdf*, *Cliente_Utente_idUtente*)
```Con vincolo di int. ref fra Lista(Cliente_Utente_idUtente) e Cliente(Utente_idUtente)```
8. Categoria(<ins>idCategoria</ins>, nome, prodotto_servizio)
9. Articolo(<ins>idArticolo</ins>, prezzo, nome, descrizione, *CategoriaidCategoria*, *Produttore_Fornitore_idProduttoreFornitore*)
```Con vincolo di int. ref fra Articolo(Categoria_idCategoria) e Categoria(idCategoria)```
```Con vincolo di int. ref fra Articolo(Produttore_Fornitore_idProduttoreFornitore) e Produttore_Fornitore(idProduttore_Fornitore)```
10. Immagine(<ins>idImmagine</ins>, Articolo_idArticolo, immagine)
```Con vincolo di int. ref fra Immagine(Articolo_idArticolo) e Articolo(idArticolo)```
11. Cliente(<ins>Utente_idUtente</ins>, abilitato, professione, telefono, indirizzo, *PuntoVendita_idPuntoVendita*)
```Con vincolo di int. ref fra Cliente(PuntoVendita_idPuntoVendita) e Punto_Vendita(idPunto_vendita)```
```Con vincolo di int. ref fra Cliente(Utente_idUtente) e Utente(idUtente)```
12. Amministratore(<ins>Utente_idUtente</ins>)
```Con vincolo di int. ref fra Amministraotore(Utente_idUtente) e Utente(idUtente)```
13. Manager(<ins>Utente_idUtente</ins>)
```Con vincolo di int. ref fra Manager(Utente_idUtente) e Utente(idUtente)```
14. Prodotto(<ins>Articolo_idArticolo</ins>, *id_posizione**, *SottoCategoria_idSottoCategoria**)
```Con vincolo di int. ref fra Prodotto(Articolo_idArticolo) e Articolo(idArticolo)```
```Con vincolo di int. ref fra ProdottoPosizione_idPosizione) e Posizione(idArticolo)```
15. Servizio(<ins>Articolo_idArticolo</ins>)
```Con vincolo di int. ref fra Servizio(Articolo_idArticolo) e Articolo(idArticolo)```
16. PuntoVendita_has_Articolo(<ins>*PuntoVendita_idPuntoVendita*</ins>, <ins>Articolo_idArticolo</ins>)
```Con vincolo di int. ref fra PuntoVendita_has_Prodotto(PuntoVendita_idPuntoVendita) e Punto_Vendita(idPunto_vendita)```
```Con vincolo di int. ref fra PuntoVendita_has_Prodotto(Prodotto_Articolo_idArticolo) e Articolo(Articolo_idArticolo)```
17. Acquisto_has_Articolo(<ins>Acquisto_idAcquisto</ins>, <ins>Articolo_idArticolo</ins>, quantita)
```Con vincolo di int. ref fra Acquisto_has_Articolo(Acquisto_idAcquisto) e Acquisto(idAcquisto)```
```Con vincolo di int. ref fra Acquisto_has_Articolo(Articolo_idArticolo) e Articolo(idArticolo)```
18. Commento(testo,<ins>Espressione_di_gradimento_Cliente_Utente_idUtente</ins>,<ins>Espressione_di_gradimento_idArticolo</ins>)
```Con vincolo di int. ref fra Commento(Espressione_di_gradimento_Cliente_Utente_idUtente) e Espressione_di_gradimento(Cliente_Utente_idUtente)```
```Con vincolo di int. ref fra Commento(Espressione_di_gradimento_idArticolo) e Espressione_di_gradimento(Acquisto_has_Articolo_idArticolo) ```
19. Risposta(risposta, data,<ins>*Commento_Espressione_di_gradimento_idUtente*</ins>, *Manager_Utente_idUtente*,<ins>*Commento_Espressione_di_gradimento_idArticolo*</ins>)
```Con vincolo di int. ref fra Risposta(Commento_Espressione_di_gradimento_idUtente) e Commento(Espressione_di_gradimento_Cliente_Utente_idUtente) ```
```Con vincolo di int. ref fra Risposta(Commento_Espressione_di_gradimento_idArticolo) e Commento(Espressione_di_gradimento_idArticolo) ```
```Con vincolo di int. ref fra Risposta(Manager_Utente_idUtente) e Manager(Utente_idUtente) ```
20. Lista_has_articolo(<ins>Lista_idLista</ins>, <ins>Articolo_idArticolo</ins>,quantita')
```Con vincolo di int. ref fra Lista_has_articolo(Lista_idLista) e Lista(idLista)```
```Con vincolo di int. ref fra Lista_has_articolo(Articolo_idArticolo) e Articolo(idArticolo)```
21. Espressione_di_gradimento( <ins>Acquisto_has_Articolo_Articolo_idArticolo</ins>, <ins>*Cliente_Utente_idUtente*</ins>, gradimento,data)
```Con vincolo di int. ref fra Espressione_di_gradimento(Acquisto_has_Articolo_Acquisto_idArticolo) e Acquisto_has_Articolo(idArticolo)```
```Con vincolo di int. ref fra Espressione_di_gradimento(Cliente_Utente_idUtente) e Acquisto(Cliente_Utente_idUtente)```
22. Presente_in(<ins>*Magazzino_idMagazzino*</ins>, <ins>*Prodotto_Articolo_idArticolo*</ins>, quantita, )
```Con vincolo di int. ref fra Presente_in(Magazzino_idMagazzino) e Magazzino(idMagazzino)```
```Con vincolo di int. ref fra Presente_in(Prodotto_Articolo_idArticolo) e Prodotto(Articolo_idArticolo)```
23. Prenotazione(<ins>*Acquisto_has_Articolo_idAcquisto*</ins>, <ins>*Acquisto_has_Articolo_Articolo_idAcquisto*</ins>)
```Con vincolo di int. ref fra Prenotazione(Acquisto_has_Articolo_idArticolo) e Acquisto_has_articolo(Articolo_idArticolo)```
```Con vincolo di int. ref fra Prenotazione(Acquisto_has_Articolo_idAcquisto) e Acquisto_has_Articolo(Acquisto_idAcquisto)```
24. Prodotto_has_Prodotto(<ins>*Prodotto_Articolo_idArticolo_padre*</ins>, <ins>*Prodotto_Articolo_idArticolo_figlio*</ins>)
```Con vincolo di int. ref fra Prodotto_has_Prodotto(Prodotto_Articolo_idArticolo_padre) e Prodotto(Articolo_idArticolo)```
```Con vincolo di int. ref fra Prodotto_has_Prodotto(Prodotto_Articolo_idArticolo_figlio) e Prodotto(Articolo_idArticolo)```
25. Sottocategoria(<ins>*idSottocategoria*</ins>, nome)
# Class diagram
```plantuml
@startuml
' Model
package Model #DDDDDD{
Class Amministratore extends Utente
Class Articolo implements IArticolo {
- int idArticolo
- float prezzo
- String nome
- String descrizione
- ArrayList<Immagine> immagini
- ICategoria categoria
}
Articolo "0..*" - "1" Feedback
Articolo "0..*" - "1" Immagine
Articolo - ICategoria
Class ArticoloConQuantita {
- int quantita
- IArticolo articolo
}
ArticoloConQuantita - IArticolo
Class CategoriaProdotto implements ICategoria{
- String nome
- int idCategoria
}
Class CategoriaServizio implements ICategoria{
- String nome
- int idCategoria
}
Class Cliente extends Utente{
- boolean abilitato
- String professione
- String telefono
- String indirizzo
- int idPuntoVendita
}
Abstract Commento {
- int idCliente
- int idArticolo
- String testo
- Timestamp data
}
Class Corsia {
- int numero
- List<Scaffale> scaffali
+ ArrayList<IProdotto> getAllProducts()
}
Corsia "1..*" - Scaffale
Class Disponibilita extends Prodotto{
- int quantita
- int idMagazzino
- Magazzino magazzino
}
Disponibilita - Magazzino
Class Feedback extends Commento{
- int punteggio
- Cliente cliente
- Articolo articolo
- Risposta risposta
}
Feedback - Risposta
Feedback - Articolo
Feedback - Cliente
Class FornitoreServizio extends ProduttoreFornitore {
- List<Servizio> servizi
}
FornitoreServizio "1..*" - Servizio
Interface IArticolo {
+ ICategoria getCategoria()
+ int getIdCategoria()
+ String getNome()
+ int getId()
+ Float getPrezzo()
+ int getIdFornProd()
+ String getDescrizione()
+ ArrayList<Immagine> getImmagini()
}
Interface ICategoria{
+ String getNome()
+ int getId()
}
Class Immagine {
- int idImmagine
- int idArticolo
- File immagine
}
Interface IProdotto extends IArticolo {
+ Float getPrezzo()
+ int getId()
+ String getNome()
+ List<IProdotto> getComponents()
}
Class ListaArticoli {
- int idLista
- int idAcquisto
- int idCliente
- Cliente cliente
- String nome
- List<ArticoloConQuantita> articoli
}
ListaArticoli - Cliente
ListaArticoli "1..*" - ArticoliConQuantita
Class Magazzino {
- int idMagazzino
- List<Disponibilita> disponibilita
- String nome
- int idPuntoVendita
}
Magazzino "0..*" - Disponibilita
Class Manager extends Utente{
- PuntoVendita puntoVendita
}
Manager - PuntoVendita
Class Posizione {
- int idCorsia
- int idScaffale
- Corsia corsia
- Scaffale scaffale
}
Posizione - Corsia
Posizione - Scaffale
Class Prodotto extends Articolo implements IProdotto {
- Produttore produttore
- SottoCategoria sottoCategoria
- Posizione posizione
}
Prodotto - Produttore
Prodotto - SottoCategoria
Prodotto - Posizione
Class ProdottoComposito extends Articolo implements IProdotto {
- List<IProdotto> sottoProdotti
+ Float getPrezzo()
}
ProdottoComposito *-- Prodotto
Class Produttore extends ProduttoreFornitore{
- List<IProdotto> prodotti
}
Produttore "1..*" - IProdotto
Abstract ProduttoreFornitore {
- int id
- String nome
- String citta
- String nazione
- String sitoWeb
}
Class PuntoVendita {
- int idPuntoVendita
- int idManager
- String citta
- String via
- String civico
- List<Cliente> clienti
}
PuntoVendita "0..*" - Cliente
Class Risposta extends Commento{
-int idManager
-Manager manager
}
Risposta - Manager
Class Scaffale {
- int numero
- IProdotto prodotto
}
Scaffale - IProdotto
Class Servizio extends Articolo
Class SottoCategoria {
- int id
- String nome
}
Class Utente {
- int idUtente
- String username
- String password
- String name
- String surname
- String email
- Date dataNascita
}
@enduml
```
```plantuml
@startuml
left to right direction
' business
package Business #DDDDDD{
Interface AbstractFactory<T extends IArticolo> {
+ Articolo creaArticolo()
+ ICategoria creaCategoria()
+ ProduttoreFornitore creaProduttoreFornitore()
+ IProdottoServizioDAO<T> getDAO()
}
Class AcquistoBusiness {
+ void acquistaLista()
}
Class ArticoloBusiness {
+ ArticoloResponse creaArticolo()
+ Articolo Response modificaArticolo()
+ int rimuoviArticolo()
}
Class ArticoloResponse extends Response
Class BestFirstFeedbackSort implements IFeedbackSortStrategy
Class CategoriaBusiness {
+ ICategoria creaCategoria()
}
Class ClienteBusiness {
+ int rimuoviClienti()
+ int disabilitaClienti()
}
Class ClienteResponse extends Response
Class CreaManagerResponse extends Response
Class CreaProduttoreFornitoreResponse extends Response
Abstract Documento {
- PdfAPI pdfAPI
+ void invia()
}
Documento - PdfAPI
Class DocumentoListaAcquisto extends Documento {
- List<ArticoloConQuantita> lista
}
Class FactoryProvider {
+ AbstractFactory getFactory()
}
Class FeedbackBusiness {
+ void creaFeedback()
+ void sortFeedbacks()
}
Interface IFeedbackSortStrategy {
+ void sort()
}
Class JavaxMailAPI implements MailAPI
Class ListaBusiness {
+ int creaLista()
+ int addArticoliInLista()
+ int rimuoviLista()
}
Class MagazzinoBusiness {
+ int aggiornaDisponibilita()
}
Interface MailAPI {
+ void sendEmail()
}
Class ManagerBusiness
Interface PdfAPI {
+ void creaPdf()
}
Class PdfBoxAPI implements PdfAPI
Class PrenotazioneBusiness
Class ProdottoBusiness
Class ProdottoCompositoFactory implements AbstractFactory
Class ProdottoFactory implements AbstractFactory
Class ProduttoreFornitoreBusiness
Class PuntoVenditaBusiness {
+ PuntoVenditaResponse creaPuntoVendita()
}
Class PuntoVenditaResponse extends Response
Class RecentFirstFeedbackSort implements IFeedbackSortStrategy
Abstract Response<T> {
- ArrayList<String> messages
- T result
}
Class ServizioFactory implements AbstractFactory
Class SessionManager {
- HashMap<String, Object> session
}
Class SortedFeedbackList {
- List<Feedback> feedBackList;
- IFeedbackSortStrategy sortStrategy
}
SortedFeedbackList - IFeedbackSortStrategy
Class SottoCategoriaBusiness {
+ SottoCategoria creaSottoCategoria()
}
Class UrgentFirstFeedbackSort implements IFeedbackSortStrategy
Class UtenteBusiness {
+ UtenteResponse login()
+ ClienteResponse signUp()
+ CreaManagerResponse creaManager()
+ boolean userCan()
}
Class UtenteResponse extends Response
}
' dao
package DAO #DDDDDD {
Class AcquistoDAO implements IAcquistoDAO
Class ArticoloDAO implements IArticoloDAO
Class CategoriaDAO implements ICategoriaDAO
Class ClienteDAO implements IClienteDAO
Class EspressioneDiGradimentoDAO implements IEspressioneDiGradimentoDAO
Interface IAcquistoDAO
Interface IArticoloDAO
Interface ICategoriaDAO
Interface IClienteDAO
Interface IEspressioneDiGradimentoDAO
Interface IImmagineDAO
Interface IListaDAO
Interface IMagazzinoDAO
Interface IManagerDAO
Class ImmagineDAO implements IImmagineDAO
Interface IPosizioneDAO
Interface IPrenotazioneDAO
Interface IProdottoCompositoDAO
Interface IProdottoDAO
Interface IProdottoServizioDAO<T>
Interface IProduttoreFornitoreDAO
Interface IPuntoVenditaDAO
Interface IServizioDAO
Interface ISottoCategoriaDAO
Interface IUtenteDAO
Class ListaDAO implements IListaDAO
Class MagazzinoDAO implements IMagazzinoDAO
Class ManagerDAO implements IManagerDAO
Class PosizioneDAO implements IPosizioneDAO
Class PrenotazioneDAO implements IPrenotazioneDAO
Class ProdottoCompositoDAO implements IProdottoCompositoDAO, IProdottoServizioDAO
Class ProduttoreFornitoreDAO implements IProduttoreFornitoreDAO
Class ProdottoDAO implements IProdottoDAO, IProdottoServizioDAO
Class PuntoVenditaDAO implements IPuntoVenditaDAO
Class ServizioDAO implements IServizioDAO, IProdottoServizioDAO
Class SottoCategoriaDAO implements ISottoCategoriaDAO
Class UtenteDAO implements IUtenteDAO
}
AcquistoBusiness - IAcquistoDAO
ArticoloBusiness - IArticoloDAO
ArticoloBusiness - IImmagineDAO
CategoriaBusiness - ICategoriaDAO
ClienteBusiness - IClienteDAO
FeedbackBusiness - IEspressioneDiGradimentoDAO
ListaBusiness - IListaDAO
MagazzinoBusiness - IMagazzinoDAO
ManagerBusiness - IManagerDAO
PrenotazioneBusiness - IPrenotazioneDAO
ProdottoBusiness - IProdottoDAO
ProduttoreFornitoreBusiness - IProduttoreFornitoreDAO
PuntoVenditaBusiness - IPuntoVenditaDAO
SottoCategoriaBusiness - ISottoCategoriaDAO
UtenteBusiness - IUtenteDAO
@enduml
```
# Design patterns utilizzati
Dovremmo avere prodottoFactory e servizio factory
pF:
- ArticoloProdotto
- FornitoreProdotto
- CategoriaProdotto
sF:
- ArticoloServizio
- FornitoreServizio
- CategoriaServizio
- **Abstract factory**
- Dove: Per la creazione di prodotti o servizi e delle classi inerenti come categoria e ProduttoreFornitore.
- Perchè:
- per poter garantire l'aggiunta di articoli di un nuovo tipo senza modificare il codice dal lato del chiamante.
-
- **Iterator**
- **Decorator**
- Dove: Per gestire l'aggiunta di funzionalita' al menu basate sui privilegi dell'utente loggato
- Perchè: per riutilizzare il codice e evitare di replicarlo per ogni tipo di utenza reimplementando una classe diversa
- **Command**
- **Strategy**
- **Composite**
- Dove: per gestire in modo trasparente i prodotti e i prodotti compositi attraverso l' interfaccia IProdotto
- Perchè: per lavorare con strutture ad albero quali il prodotto composito. In particolare, il pattern è stato utilizzato per calcolarne il prezzo, definito come la somma dei prezzi dei suoi componenti
- **Singleton**
- Dove: nelle classi dei package Business e DAO e nella classe DBConnection
- Perchè: per garantire che ci sia una singola istanza per ogni classe che implementa il design pattern Singleton