---
# System prepended metadata

title: Class diagram

---


**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


