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()
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")