finance-watcher / scripts / insert_transactions.py
insert_transactions.py
Raw
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())