from PySide6.QtCore import Qt from database.finance_database import FinanceDatabase from datetime import datetime from dataclasses import dataclass from finance_watcher_dataclasses.enums import BusinessTypeEnum from helpers.helper_functions import get_amount_from_string, get_date_from_string @dataclass class TransactionDetails: amount: float business_name: str business_type_id: int created_date: datetime import sys from PySide6.QtWidgets import ( QLineEdit, QPushButton, QApplication, QLabel, QVBoxLayout, QDialog, QComboBox ) LABEL_INDEX = 0 LINE_EDIT_INDEX = 1 class Form(QDialog): def __init__(self, parent=None): super(Form, self).__init__(parent) self.finance_db = FinanceDatabase() self.id_widgets = {} self.description_label = QLabel( "Enter a new transaction:" ) self.feedback_label = QLabel() self.feedback_label.setAlignment(Qt.AlignmentFlag.AlignCenter) # Create widgets self.create_transaction_form() self.button = QPushButton("INSERT INTO DATABASE") # Create layout and add widgets layout = QVBoxLayout() self.create_description_label() layout.addWidget(self.description_label) for _, widgets in self.id_widgets.items(): layout.addWidget((widgets[LABEL_INDEX])) class_found = widgets[LINE_EDIT_INDEX] layout.addWidget(class_found) layout.addWidget(self.button) layout.addWidget(self.feedback_label) # Set dialog layout self.setLayout(layout) self.button.clicked.connect( self.get_info_and_insert_into_the_database ) def rollout_error_message(self, message: str) -> None: self.feedback_label.setText(message) def create_transaction_form(self): self.id_widgets = { "amount": [ QLabel("What is the amount?"), QLineEdit() ], "business": [ QLabel("What business is this?"), QLineEdit() ], "business_type": [ QLabel('What is the business type?'), QComboBox() ], "created_date": [ QLabel("When did you make the purchase? (format: YYYY-MM-DD)"), QLineEdit() ] } self.id_widgets['business_type'][1].insertItems(0, BusinessTypeEnum.get_all_business_types()) def get_info_and_insert_into_the_database(self): business_name = self.id_widgets['business'][1].text() business_type_str = self.id_widgets['business_type'][1].currentText() amount = self.id_widgets['amount'][1].text() amount_int = get_amount_from_string(amount) if amount_int is None: return self.rollout_error_message( 'Invalid number. Please try again.' ) date = self.id_widgets['created_date'][1].text() created_date = get_date_from_string(date) if created_date is None: return self.rollout_error_message( 'Invalid format for the date. Be sure it is this format: YYYY-MM-DD' ) if created_date > datetime.now(): return self.rollout_error_message( 'This date is in the future! How is that even possible?!?' ) business_type_enum = BusinessTypeEnum.get_business_type_from_str(business_type_str) if business_type_enum is None: return self.rollout_error_message( 'Invalid business type. Try again.' ) business_type = self.finance_db.get_business_type(business_type_enum) if business_type_enum is None: return self.rollout_error_message( 'Invalid business type. Try again.' ) business = self.finance_db.ensure_business(business_name, business_type.id) if business is None: return self.rollout_error_message( 'Failed to insert business into the database. Try again.' ) if self.finance_db.insert_transaction( amount, business.id, True, created_date ): return self.rollout_error_message('Insert was successful!') else: return self.rollout_error_message( 'Failed to insert transaction! Check the connection of the database.' ) def reset_feedback(self): self.feedback_label.setText('') def create_description_label(self): description_font = self.font() description_font.setPointSize(20) description_font.setBold(True) self.description_label.setFont(description_font) if __name__ == '__main__': # Create the Qt Application app = QApplication(sys.argv) # Create and show the form form = Form() form.show() # Run the main Qt loop sys.exit(app.exec())