class VistaHomeIstruttore(
        QWidget
):  # Apre e visualizza la vista home con le funzioni consentite all'istruttore.
    def __init__(self, tipo):
        super(VistaHomeIstruttore, self).__init__()
        self.tipo = tipo
        self.controller = ControllerListaPrenotazioni()
        self.controller_clienti = ControllerListaClienti()

        self.stylesheet_toolbutton = """
                    QToolButton{
                        background-color: white;
                        border: 1px solid #9c9c9c;
                        border-radius: 10px;
                    }

                    QToolButton::Pressed{
                        background-color: grey;
                    }
                """

        self.stylesheet_button_back = """
                    QPushButton{
                        border-radius: 15px;
                    }

                    QPushButton::Pressed{
                        background-color: transparent;
                    }
                """

        # Inserimento e impostazioni grafiche dell'immagine dello sfondo della finestra.
        self.imagePath = "Image/foto.png"
        self.image = QImage(self.imagePath)
        self.label = QLabel(self)
        self.label.setPixmap(QPixmap.fromImage(self.image))
        self.label.setScaledContents(True)
        self.label.setGeometry(0, 0, 800, 600)

        # Il seguente blocco crea le azioni che saranno svolte dai bottoni, i bottoni
        # che saranno presenti sulla schermata e i collegamenti tra i due.
        self.action_prenota = QAction()
        self.action_elenco_prenotazioni = QAction()
        self.action_disdetta = QAction()
        self.action_esiti = QAction()
        self.create_button('Image/prenota.png', 'Lista orari', 210,
                           self.action_elenco_prenotazioni)
        self.create_button('Image/lista.png', 'Prenota cliente', 410,
                           self.action_prenota)
        self.create_button2('Image/disdici_visita.png', 'Disdici prenotazione',
                            210, self.action_disdetta)
        self.create_button2('Image/patente.png', 'Esiti esami', 410,
                            self.action_esiti)
        self.action_prenota.triggered.connect(self.go_prenota)
        self.action_elenco_prenotazioni.triggered.connect(self.go_lista)
        self.action_disdetta.triggered.connect(self.go_disdici)
        self.action_esiti.triggered.connect(self.go_esiti)

        # Se a questa classe viene passato  come parametro il tipo 'Segretario' allora questa vista verrà aperta
        # come vista che permette al segretario di gestire le prenotazioni.
        if tipo == "Segretario":
            self.button_back = QPushButton(self)
            self.button_back.setIcon(QIcon('Image/back.png'))
            self.button_back.setIconSize(QSize(90, 90))
            self.button_back.setGeometry(60, 490, 90, 90)
            self.button_back.setStyleSheet(self.stylesheet_button_back)
            self.button_back.clicked.connect(self.go_back)
            self.setWindowTitle("Prenotazioni")

        # Impostazioni grafiche generali della finestra del programma.
        self.setWindowTitle("Home Istruttore")
        self.resize(800, 600)
        self.setFixedSize(self.size())

    # == create_button ==
    # La funzione crea i bottoni che saranno presenti sulla schermata nella prima colonna prendendo per input
    # il path dell immagine che rappresenterà il bottone, il suo nome, la posizione che avrà nella
    # schermata e quale azione dovrà compiere una volta premuto.
    # La funzione si occupa dei bottoni anche dal punto di vista grafico.
    def create_button(self, path_img, nome, posizione, action):
        self.button = QToolButton(self)
        self.button.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        font_button = QFont("Times", 11)
        self.button.setFont(font_button)
        self.button.setGeometry(posizione, 200, 180, 80)
        action.setIcon(QIcon(path_img))
        action.setText(nome)
        self.button.setIconSize(QSize(50, 50))
        self.button.setDefaultAction(action)
        self.button.setStyleSheet(self.stylesheet_toolbutton)

    # == create_button2 ==
    # La funzione crea i bottoni che saranno presenti sulla schermata nella seconda colonna prendendo per input
    # il path dell immagine che rappresenterà il bottone, il suo nome, la posizione che avrà nella
    # schermata e quale azione dovrà compiere una volta premuto.
    # La funzione si occupa dei bottoni anche dal punto di vista grafico.
    def create_button2(self, path_img, nome, posizione, action):
        self.button = QToolButton(self)
        self.button.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        font_button = QFont("Times", 11)
        self.button.setFont(font_button)
        self.button.setGeometry(posizione, 300, 180, 80)
        action.setIcon(QIcon(path_img))
        action.setText(nome)
        self.button.setIconSize(QSize(50, 50))
        self.button.setDefaultAction(action)
        self.button.setStyleSheet(self.stylesheet_toolbutton)

    # == go_lista ==
    # La funzione si occupa di aprire la VistaListaPrenotazioni.
    def go_lista(self):
        self.prenota_visita = VistaListaPrenotazioni(self.tipo)
        self.prenota_visita.show()
        self.close()

    # == go_prenota ==
    # La funzione si occupa di controllare che il pagamento iniziale da parte di un cliente è stato effettuato.
    # Successivamente, se sono presenti informazioni nella lista delle prenotazioni verrà aperta
    # la VistaPrenotazione, in caso contrario verrà inviato un messaggio di errore all'utente. Anche nel caso
    # in cui nessun cliente abbia effettuato il pagamento iniziale viene inviato un messaggio di errore.
    def go_prenota(self):
        trovato = False
        for cliente in self.controller_clienti.get_lista_clienti():
            self.controller_cliente = ControllerCliente(cliente)
            if self.controller_cliente.get_pagamento_iniziale() != "None":
                trovato = True
        if trovato:
            if self.controller.get_lista_prenotazioni():
                self.go_prenotazione = VistaPrenotazione(self.tipo)
                self.go_prenotazione.show()
                self.close()
            else:
                QMessageBox.critical(
                    self, "Errore", "Nessuna data disponibile per prenotarsi",
                    QMessageBox.Ok)
        else:
            QMessageBox.critical(self, "Errore",
                                 "Nessun cliente ha pagato la rata iniziale",
                                 QMessageBox.Ok)

    # == go_disdici ==
    # La funzione controlla innanzitutto che ci siano clienti nella lista_clienti a cui sono associate delle
    # prenotazioni. Se ce ne sono viene allora aperta la VistaDisdettaPrenotazione, altrimenti viene inviato un
    # messaggio di errore.
    def go_disdici(self):
        trovato = False
        for cliente in self.controller_clienti.get_lista_clienti():
            self.controller_cliente = ControllerCliente(cliente)
            if self.controller_cliente.get_prenotazione() != "None":
                trovato = True
        if trovato:
            self.vista_esiti = VistaDisdettaPrenotazione(self.tipo)
            self.vista_esiti.show()
            self.close()
        else:
            QMessageBox.critical(self, "Errore",
                                 "Nessun cliente si è prenotato")

    # == go_esiti ==
    # La funzione per prima cosa controlla se ci sono clienti con prenotazioni per lezioni ad esso
    # associate. Se questo controllo è soddisfatto allora viene aperta la VistaInserisciEsitoEsame.
    # In caso contrario sarà inviato un messaggio di errore.
    def go_esiti(self):
        trovato = False
        for cliente in self.controller_clienti.get_lista_clienti():
            self.controller_cliente = ControllerCliente(cliente)
            if self.controller_cliente.get_prenotazione() != "None":
                nome = self.controller_cliente.get_prenotazione().split("-")
                if nome[2].strip() != "Lezione":
                    trovato = True
        if trovato:
            self.go_esito = VistaInserisciEsitoEsame(self.tipo)
            self.go_esito.show()
            self.close()
        else:
            QMessageBox.critical(self, "Errore",
                                 "Nessun esito è presente nel sistema")

    # == go_back ==
    # La funzione si occupa di aprire la finestra precedente.
    def go_back(self):
        self.go_home = VistaHomeSegretario.VistaHomeSegretario()
        self.go_home.show()
        self.close()
class VistaPrenotazione(
        QWidget):  # Apre la vista che permette di effettuare una prenotazione.
    def __init__(self, tipo):
        super(VistaPrenotazione, self).__init__()
        self.tipo = tipo
        self.controller = ControllerListaPrenotazioni()
        self.controller_clienti = ControllerListaClienti()

        # Inserisce il 'lista_orari' le informazioni contenute nel file 'lista_prenotazioni.pickle'.
        self.lista_orari = self.controller.get_lista_prenotazioni()

        self.stylesheet_frame = """
                   QFrame{
                       background-color: white;
                       border: 1px solid grey;
                   }
               """

        self.stylesheet_window = """
                   QWidget{
                       background-color: #efefef;
                   }
               """

        self.stylesheet_label = """
                   QLabel{
                       background-color: white;
                   }

                   QLineEdit{
                       background-color: white;
                       border: 2px solid #dfdfdf
                   }

                   QComboBox{
                       background-color: white;
                       border: 1px solid grey;
                       color: black;
                   }

               """

        self.stylesheet_button_back = """
                   QPushButton{
                       background-color: transparent;
                       border-radius: 15px;
                   }

                   QPushButton::Pressed{
                       background-color: grey;
                   }        
               """

        self.stylesheet_button = """
                   QPushButton{
                       background-color: #cc3234;
                       color: white;
                       border-radius: 15px;
                   }

                   QPushButton::Pressed{
                       background-color: grey
                   }        
               """

        self.stylesheet_calendar = """
                    QCalendarWidget QToolButton{
                        background-color : lightblue;
                    }
                    QCalendarWidget QWidget{
                        background-color : lightblue;
                    }
        """

        # Inserimento e impostazioni grafiche dell'immagine dello sfondo della finestra.
        self.imagePath = "Image/foto.png"
        self.image = QImage(self.imagePath)
        self.label = QLabel(self)
        self.label.setPixmap(QPixmap.fromImage(self.image))
        self.label.setScaledContents(True)
        self.label.setGeometry(0, 0, 1000, 550)

        # Inserimento e impostazioni grafiche dell'etichetta 'Nuova Prenotazione'.
        self.label = QLabel(self)
        self.font = QFont("Arial", 18, QFont.Bold)
        self.label.setText("Nuova Prenotazione")
        self.label.setFont(self.font)
        self.label.setGeometry(50, 55, 350, 40)
        self.label.setStyleSheet('background-color: transparent')

        # Inserimento e impostazioni grafiche del frame nella finestra.
        self.frame = QFrame(self)
        self.frame.setStyleSheet(self.stylesheet_frame)
        self.frame.setGeometry(50, 100, 900, 280)

        # Usa la funzione 'create_label1' per creare due etichette.
        self.create_label1("Cliente", 150)
        self.create_label1("Tipo", 250)

        # Inserimento e impostazioni grafiche dell'etichetta 'Data'.
        self.label_edit = QLabel(self)
        self.label_edit.setText("Data")
        self.label_edit.setGeometry(500, 150, 100, 20)
        self.label_edit.setStyleSheet(self.stylesheet_label)
        self.font_label1 = QFont("Times", 9)
        self.label_edit.setFont(self.font_label1)

        # Inserimento e impostazioni grafiche del menù a tendina contenente la lista dei cliente
        # che non hanno effettuato alcuna prenotazione.
        self.edit_cliente = QComboBox(self)
        for cliente in self.controller_clienti.get_lista_clienti():
            self.controller_cliente = ControllerCliente(cliente)
            if self.controller_cliente.get_esame_teorico() == "None" or \
                    self.controller_cliente.get_esame_pratico() == "None":
                if self.controller_cliente.get_id() != "None":
                    self.edit_cliente.addItem(self.controller_cliente.get_nome() + " " + \
                                              self.controller_cliente.get_cognome())
        self.edit_cliente.setGeometry(250, 150, 200, 30)
        self.edit_cliente.setStyleSheet(self.stylesheet_label)

        # Inserimento e impostazioni grafiche del menù a tendina contenente la lista dei servizi
        # per cui è possibile effettuare un pagamento.
        self.edit_tipo = QComboBox(self)
        self.edit_tipo.addItem("Lezione", self.get_data("Lezione"))
        self.edit_tipo.addItem("Esame teorico", self.get_data("Esame teorico"))
        self.edit_tipo.addItem("Lezione guida", self.get_data("Lezione guida"))
        self.edit_tipo.addItem("Esame pratico", self.get_data("Esame pratico"))
        self.edit_tipo.setGeometry(250, 250, 200, 30)
        self.edit_tipo.setStyleSheet(self.stylesheet_label)

        # Inserimento e impostazioni grafiche del menù a tendina contenente le dati per cui
        # è possibile prenotarsi.
        self.edit_data = QComboBox(self)
        self.edit_data.setStyleSheet(self.stylesheet_label)
        self.edit_data.setGeometry(600, 150, 200, 30)

        # In base al servizio scelto vengono cambiate le dati per cui è possibile prenotarsi.
        self.edit_tipo.currentIndexChanged.connect(self.update_data)
        self.update_data(self.edit_tipo.currentIndex())

        # Inserimento e impostazioni grafiche del bottone per tornare alla vista precedente.
        self.button_back = QPushButton(self)
        self.button_back.setIcon(QIcon('Image/back.png'))
        self.button_back.setIconSize(QSize(90, 90))
        self.button_back.setGeometry(50, 420, 90, 90)
        self.button_back.setStyleSheet(self.stylesheet_button_back)
        self.button_back.clicked.connect(self.go_back)

        # Inserimento e impostazioni grafiche del bottone che permette di confermare la prenotazione.
        self.button_new_prenotazione = QPushButton(self)
        self.button_new_prenotazione.setText("Salva")
        self.font_button = QFont("Arial", 11)
        self.button_new_prenotazione.setFont(self.font_button)
        self.button_new_prenotazione.setGeometry(800, 440, 120, 50)
        self.button_new_prenotazione.setStyleSheet(self.stylesheet_button)
        self.button_new_prenotazione.clicked.connect(self.salva_prenotazione)

        # Impostazioni grafiche generali della finestra del programma.
        self.setWindowTitle("Nuova Prenotazione")
        self.setStyleSheet(self.stylesheet_window)
        self.resize(1000, 550)
        self.setFixedSize(self.size())

    # == create_label1 ==
    # La funzione crea un etichetta con nome inserito in input alla funzione e posizione nella finestra
    # presa anch'essa in input. La funzione gestisce anche le impostazioni grafiche dell'etichetta.
    def create_label1(self, nome, posizione):
        self.label_edit = QLabel(self)
        self.label_edit.setText(nome)
        self.label_edit.setGeometry(80, posizione, 100, 20)
        self.label_edit.setStyleSheet(self.stylesheet_label)
        self.font_label = QFont("Arial", 9)
        self.label_edit.setFont(self.font_label)

    # == get_data ==
    # La funzione aggiunge alla lista 'lezioni' gli orari per cui è possibile prenotarsi ad un determinato
    # servizio. La lista 'lezioni' verrà poi ritornata dalla funzione.
    def get_data(self, nome):
        lezioni = []
        count = 0
        for prenotazione in self.lista_orari:
            self.controller_prenotazione = ControllerPrenotazione(prenotazione)
            count += 1
            if self.controller_prenotazione.get_tipo() == nome:
                lezioni.append(self.controller_prenotazione.get_data())
        return lezioni

    # == update_data ==
    # La funzione aggiunge al menù a tendina relativo alle date le date del servizio selezionato.
    def update_data(self, index):
        self.edit_data.clear()
        date = self.edit_tipo.itemData(index)
        if date:
            self.edit_data.addItems(date)

    # == salva_prenotazione ==
    # La funzione permette di salvare la prenotazione scelta. Prima si controlla che il cliente sia presente a sistema e se
    # abbia effettuato il pagamento iniziale: nel caso in cui non fosse stato effettuato viene inviato
    # un messaggio di errore. Vengono poi effettuati ulteriori controller per verificare che
    # il client abbia pagato i servizi per cui sta effettuando le prenotazioni. Inoltre, se il cliente ha già effettuato
    # una prenotazione viene inviato un messaggio all'utente chiedendogli se desidera cancellare la prenotazione
    # effettuare sostituendola con una nuova. Infine le modifiche vengono salvate e l'utente è riportato
    # alla VistaHomeIstruttore.
    def salva_prenotazione(self):
        for cliente in self.controller_clienti.get_lista_clienti():
            self.controller_cliente = ControllerCliente(cliente)
            if self.edit_cliente.currentText() == \
                    self.controller_cliente.get_nome() + " " + self.controller_cliente.get_cognome():
                if self.edit_tipo.currentIndex() == 0:
                    if self.controller_cliente.get_pagamento_iniziale(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha pagato l'iscrizione",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_visita_medica() == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha fatto la visita medica",
                            QMessageBox.Ok)
                        return

                if self.edit_tipo.currentIndex() == 1:
                    if self.controller_cliente.get_pagamento_iniziale(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha pagato l'iscrizione",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_visita_medica() == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha fatto la visita medica",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_pagamento_esame_teorico(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha pagato l'iscrizione per l'esame teorico",
                            QMessageBox.Ok)
                        return
                print('caio')

                if self.edit_tipo.currentIndex() == 2:
                    if self.controller_cliente.get_pagamento_iniziale(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha pagato l'iscrizione",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_visita_medica() == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha fatto la visita medica",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_pagamento_esame_teorico(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha ancora fatto l'esame teorico",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_pagamento_lezioni_guida(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha ancora pagato le lezioni di guida",
                            QMessageBox.Ok)
                        return

                if self.edit_tipo.currentIndex() == 3:
                    if self.controller_cliente.get_pagamento_iniziale(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha pagato l'iscrizione",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_visita_medica() == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha fatto la visita medica",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_pagamento_esame_teorico(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha ancora fatto l'esame teorico",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_pagamento_lezioni_guida(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha ancora pagato le lezioni di guida",
                            QMessageBox.Ok)
                        return
                    if self.controller_cliente.get_pagamento_esame_pratico(
                    ) == "None":
                        QMessageBox.critical(
                            self, "Errore",
                            "Il cliente non ha pagato l'iscrizione per l'esame pratico",
                            QMessageBox.Ok)
                        return

                if self.controller_cliente.get_prenotazione() == "None":
                    self.controller_cliente.set_prenotazione(
                        self.edit_data.currentText() + " - " +
                        self.edit_tipo.currentText())
                else:
                    conferma = QMessageBox.question(
                        self, "Attenzione", "Il cliente si è già prenotato,"
                        "vuoi annullare la data precedente?", QMessageBox.Yes,
                        QMessageBox.No)
                    if conferma == QMessageBox.Yes:
                        self.controller_cliente.set_prenotazione(
                            self.edit_data.currentText() + " - " +
                            self.edit_tipo.currentText())
                    else:
                        return
        self.controller_clienti.save_data()
        self.go_lista_prenotazioni = VistaHomeIstruttore.VistaHomeIstruttore(
            self.tipo)
        self.go_lista_prenotazioni.show()
        self.close()

    # == go_back ==
    # La funzione si occupa di aprire la finestra precedente.
    def go_back(self):
        self.go_lista_prenotazioni = VistaHomeIstruttore.VistaHomeIstruttore(
            self.tipo)
        self.go_lista_prenotazioni.show()
        self.close()
Exemple #3
0
class VistaListaClienti(QWidget):  # Apre la vista che contiene la lista dei clienti
    def __init__(self):
        super(VistaListaClienti, self).__init__()
        self.controller = ControllerListaClienti()
        # Inserisce in 'lista_clienti' i dati contenuti nel file 'lista_clienti.pickle'.
        # Se la lista è vuota l'utente è notificato con un messaggio di errore.

        self.stylesheet_label = """
            QLabel{
                background-color: white;
                border: 1px solid #dfdfdf;
            }
        """

        self.stylesheet_window = """
            QWidget{
                background-color: #dfdfdf
            }
        """

        self.stylesheet_button_back = """
            QPushButton{
                border-radius: 15px;
                background-color: transparent;
            }

            QPushButton::Pressed{
                background-color: transparent;
            }        
        """

        self.stylesheet_button = """
            QPushButton{
                background-color: #cc3234;
                color: white;
                border-radius: 15px;
            }

            QPushButton::Pressed{
                background-color: grey
            }        
        """

        self.stylesheet_table = """
            QTableWidget{
                background-color: white;
            }
        """

        self.stylesheet_pagamento = """
            QPushButton{
                background-color: transparent;
                border-color: transparent;
            }

            QPushButton::Pressed{
                background-color: grey;
            }
        """

        # Inserimento e impostazioni grafiche dell'immagine dello sfondo della finestra.
        self.imagePath = "Image/foto.png"
        self.image = QImage(self.imagePath)
        self.label = QLabel(self)
        self.label.setPixmap(QPixmap.fromImage(self.image))
        self.label.setScaledContents(True)
        self.label.setGeometry(0, 0, 1670, 750)

        # Inserimento della tabella e intestazione delle colonne.
        self.table = QTableWidget(self)
        self.table.setColumnCount(9)
        self.table.setRowCount(1)
        self.table.setItem(0, 0, QTableWidgetItem("Apri"))
        self.table.setItem(0, 1, QTableWidgetItem("ID"))
        self.table.setItem(0, 2, QTableWidgetItem("Nome"))
        self.table.setItem(0, 3, QTableWidgetItem("Cognome"))
        self.table.setItem(0, 4, QTableWidgetItem("Esame teorico"))
        self.table.setItem(0, 5, QTableWidgetItem("Esame pratico"))
        self.table.setItem(0, 6, QTableWidgetItem("Pagamenti"))
        self.table.setItem(0, 7, QTableWidgetItem("Prenotazione"))
        self.table.setItem(0, 8, QTableWidgetItem("Cancella"))

        self.set_data()  # Inserisce nella tabella i dati contenuti nella lista_clienti.

        # Impostazioni grafiche della tabella.
        self.table.setGeometry(50, 50, 1300, 550)
        self.table.setColumnWidth(0, 90)
        self.table.setColumnWidth(1, 100)
        self.table.setColumnWidth(2, 280)
        self.table.setColumnWidth(3, 280)
        self.table.setColumnWidth(4, 110)
        self.table.setColumnWidth(5, 110)
        self.table.setColumnWidth(6, 110)
        self.table.setColumnWidth(7, 110)
        self.table.setColumnWidth(8, 90)
        self.table.setStyleSheet(self.stylesheet_table)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.horizontalHeader().hide()
        self.table.horizontalScrollBar().setDisabled(True)
        self.table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.table.verticalHeader().hide()
        self.table.setEditTriggers(self.table.NoEditTriggers)
        self.table.setSelectionMode(self.table.NoSelection)
        self.table.setFocusPolicy(Qt.NoFocus)

        # Inserimento e impostazioni grafiche del bottone per tornare alla vista precedente.
        self.button_back = QPushButton(self)
        self.button_back.setIcon(QIcon('Image/back.png'))
        self.button_back.setIconSize(QSize(90, 90))
        self.button_back.setGeometry(60, 630, 90, 90)
        self.button_back.setStyleSheet(self.stylesheet_button_back)
        self.button_back.clicked.connect(self.go_back)

        # Inserimento e impostazioni grafiche del bottone per inserire un nuovo cliente nella lista.
        self.button_new_cliente = QPushButton(self)
        self.button_new_cliente.setText("Nuovo cliente")
        self.font_button = QFont("Times", 11)
        self.button_new_cliente.setFont(self.font_button)
        self.button_new_cliente.setGeometry(1210, 650, 140, 50)
        self.button_new_cliente.setStyleSheet(self.stylesheet_button)
        self.button_new_cliente.clicked.connect(self.go_new_cliente)

        # Impostazioni grafiche generali della finestra del programma.
        self.setWindowTitle("Lista Clienti")
        self.resize(1400, 750)
        self.setFixedSize(self.size())
        self.setStyleSheet(self.stylesheet_window)

    # == set_data ==
    # La funzione si occupa di salvare le informazioni relative al cliente e contenute nel file
    # 'lista_clienti.pickle' nella tabella della VistaListaClienti. Per ogni cliente è disponibile
    # aprire e visualizzare le sue informazioni attraverso un bottone 'Apri' ed è possibile cancellarle
    # attraverso un bottone 'Elimina'.
    def set_data(self):
        self.button_group_apri = QButtonGroup()
        self.button_group_elimina = QButtonGroup()
        self.button_group_pagamenti = QButtonGroup()
        self.icon_no = QIcon("Image/no.png")
        self.icon_si = QIcon("Image/si.png")
        self.icon_sino = QIcon("Image/sino.png")
        self.apri_icon = QIcon("Image/apri_icon.png")
        self.cancella_icon = QIcon("Image/delete.png")
        self.no = QTableWidgetItem()
        self.no.setIcon(self.icon_no)
        self.si = QTableWidgetItem()
        self.si.setIcon(self.icon_si)
        i = 1
        n_righe = len(self.controller.get_lista_clienti())
        self.table.setRowCount(n_righe + 1)
        self.button_group_apri.buttonClicked.connect(self.on_selection_apri)
        self.button_group_elimina.buttonClicked.connect(self.on_selection_elimina)
        self.button_group_pagamenti.buttonClicked.connect(self.on_selection_pagamenti)
        for cliente in self.controller.get_lista_clienti():

            self.sino = QPushButton()
            self.sino.setIcon(self.icon_sino)
            self.sino.setStyleSheet(self.stylesheet_pagamento)
            self.button_group_pagamenti.addButton(self.sino, i)

            self.controller_cliente = ControllerCliente(cliente)
            self.apri = QPushButton()
            self.apri.setIcon(self.apri_icon)
            self.apri.setIconSize(QSize(30, 30))
            self.apri.setStyleSheet(self.stylesheet_pagamento)
            self.button_group_apri.addButton(self.apri, i)
            self.table.setCellWidget(i, 0, self.apri)
            if self.controller_cliente.get_id() == "None":
                self.table.setItem(i, 1, QTableWidgetItem(self.no))
            else:
                self.table.setItem(i, 1, QTableWidgetItem(self.controller_cliente.get_id()))
            self.table.setItem(i, 2, QTableWidgetItem(self.controller_cliente.get_nome()))
            self.table.setItem(i, 3, QTableWidgetItem(self.controller_cliente.get_cognome()))
            if self.controller_cliente.get_esame_teorico() == "None":
                self.table.setItem(i, 4, QTableWidgetItem(self.no))
            else:
                self.table.setItem(i, 4, QTableWidgetItem(self.si))
            if self.controller_cliente.get_esame_pratico() == "None":
                self.table.setItem(i, 5, QTableWidgetItem(self.no))
            else:
                self.table.setItem(i, 5, QTableWidgetItem(self.si))
            if self.controller_cliente.get_pagamento_iniziale() == "None" and \
                    self.controller_cliente.get_pagamento_esame_teorico() == "None" and \
                    self.controller_cliente.get_pagamento_lezioni_guida() == "None" and \
                    self.controller_cliente.get_pagamento_esame_pratico() == "None":
                self.table.setItem(i, 6, QTableWidgetItem(self.no))
            else:
                if self.controller_cliente.get_pagamento_iniziale() != "None" and \
                        self.controller_cliente.get_pagamento_esame_teorico() != "None" and \
                        self.controller_cliente.get_pagamento_lezioni_guida() != "None" and \
                        self.controller_cliente.get_pagamento_esame_pratico() != "None":
                    self.table.setItem(i, 6, QTableWidgetItem(self.si))
                else:
                    self.table.setCellWidget(i, 6, self.sino)
            if self.controller_cliente.get_prenotazione() == "None":
                if self.controller_cliente.get_esame_pratico() == "Effettuato" and \
                        self.controller_cliente.get_esame_teorico() == "Effettuato":
                    self.table.setItem(i, 7, QTableWidgetItem(self.si))
                else:
                    self.table.setItem(i, 7, QTableWidgetItem(self.no))
            else:
                self.table.setItem(i, 7, QTableWidgetItem(self.controller_cliente.get_prenotazione()))
            self.delete = QPushButton()
            self.delete.setIcon(self.cancella_icon)
            self.delete.setIconSize(QSize(35, 35))
            self.delete.setStyleSheet(self.stylesheet_pagamento)
            self.button_group_elimina.addButton(self.delete, i)
            self.table.setCellWidget(i, 8, self.delete)
            i = i + 1

    # == go_new_cliente ==
    # La funzione si occupa di aprire la VistaNuovoCliente.
    def go_new_cliente(self):
        self.vista_nuovo_cliente = VistaNuovoCliente()
        self.vista_nuovo_cliente.show()
        self.close()

    # == go_back ==
    # La funzione si occupa di aprire la finestra precedente.
    def go_back(self):
        self.go_lista_clienti = VistaHomeSegretario.VistaHomeSegretario()
        self.go_lista_clienti.show()
        self.close()

    # == go_pagamenti ==
    # La funzione si occupa di aprire la VistaPagamentiEffettuati.
    def go_pagamenti(self, i):
        pagamento = self.controller.get_lista_clienti()[i-1]
        self.go_vedi_pagamenti = VistaPagamentiEffettuati(pagamento)
        self.go_vedi_pagamenti.show()

    # == go_apri ==
    # La funzione si occupa di aprire la VistaCliente corrispondente al cliente scelto.
    def go_apri(self, i):
        cliente = self.controller.get_lista_clienti()[i - 1]
        self.go_cliente = VistaCliente(cliente, False)
        self.go_cliente.show()
        self.close()

    # == go_elimina ==
    # La funzione, dopo aver chiesto conferma all'utente, cancella le informazioni relative al
    # cliente scelto.
    def go_elimina(self, i):
        conferma = QMessageBox.question(self, "Attenzione", "Sei sicuro di voler eliminare questo cliente?",
                                        QMessageBox.No, QMessageBox.Yes)
        if conferma == QMessageBox.Yes:
            self.controller_pagamenti = ControllerListaPagamenti()
            self.controller_pagamenti.elimina_pagamento_by_cliente(i-1)
            self.controller.rimuovi_cliente_by_index(i-1)
            self.refresh()
        else:
            return

    def refresh(self):
        self.go_lista = VistaListaClienti()
        self.go_lista.show()
        self.close()

    def on_selection_apri(self, selected):
        self.go_apri(self.button_group_apri.id(selected))

    def on_selection_elimina(self, selected):
        self.go_elimina(self.button_group_elimina.id(selected))

    def on_selection_pagamenti(self, selected):
        self.go_pagamenti(self.button_group_pagamenti.id(selected))
class VistaPagamentiEffettuati(
        QWidget
):  # Apre la vista che visualizza quali pagamenti sono stati effettuati dal cliente.
    def __init__(self, cliente):
        super(VistaPagamentiEffettuati, self).__init__()
        self.controller_cliente = ControllerCliente(cliente)
        self.stylesheet_table = """
            QTableWidget{
                background-color: white;
            }
        """

        # Inserimento della tabella e intestazione delle colonne.
        self.table = QTableWidget(self)
        self.table.setColumnCount(4)
        self.table.setRowCount(2)
        self.table.setItem(0, 0, QTableWidgetItem("Iscrizione"))
        self.table.setItem(0, 1, QTableWidgetItem("Esame teorico"))
        self.table.setItem(0, 2, QTableWidgetItem("Guide"))
        self.table.setItem(0, 3, QTableWidgetItem("Esame pratico"))

        # Impostazioni grafiche della tabella.
        self.table.setStyleSheet(self.stylesheet_table)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.table.horizontalHeader().hide()
        self.table.horizontalScrollBar().setDisabled(True)
        self.table.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.table.verticalHeader().hide()
        self.table.setEditTriggers(self.table.NoEditTriggers)
        self.table.setSelectionMode(self.table.NoSelection)
        self.table.setFocusPolicy(Qt.NoFocus)

        # Inserimento e impostazioni grafiche delle icone nella tabella.
        self.icon_no = QIcon("Image/no.png")
        self.icon_si = QIcon("Image/si.png")
        self.icon_sino = QIcon("Image/sino.png")
        self.no = QTableWidgetItem()
        self.no.setIcon(self.icon_no)
        self.si = QTableWidgetItem()
        self.si.setIcon(self.icon_si)

        # I seguenti if-else impostano l'icona corretta se il pagamento è stato effettuato o meno.
        if self.controller_cliente.get_pagamento_iniziale() == "None":
            self.table.setItem(1, 0, QTableWidgetItem(self.no))
        else:
            self.table.setItem(1, 0, QTableWidgetItem(self.si))
        if self.controller_cliente.get_pagamento_esame_teorico() == "None":
            self.table.setItem(1, 1, QTableWidgetItem(self.no))
        else:
            self.table.setItem(1, 1, QTableWidgetItem(self.si))
        if self.controller_cliente.get_pagamento_lezioni_guida() == "None":
            self.table.setItem(1, 2, QTableWidgetItem(self.no))
        else:
            self.table.setItem(1, 2, QTableWidgetItem(self.si))
        if self.controller_cliente.get_pagamento_esame_pratico() == "None":
            self.table.setItem(1, 3, QTableWidgetItem(self.no))
        else:
            self.table.setItem(1, 3, QTableWidgetItem(self.si))

        # Impostazioni grafiche generali della finestra del programma.
        self.table.setGeometry(20, 20, 600, 76)
        self.resize(640, 140)
        self.setFixedSize(self.size())
        self.setWindowTitle("Pagamenti Cliente")