Skip to content

Commit 01a2779

Browse files
authored
Merge pull request larymak#164 from Aditya-Tripuraneni/main
Added Necessary files to run Finance Tracker
2 parents 32b78c6 + 1ef4400 commit 01a2779

File tree

3 files changed

+906
-0
lines changed

3 files changed

+906
-0
lines changed

PYTHON APPS/FinanceTracker/main.py

Lines changed: 376 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,376 @@
1+
import sys
2+
from PyQt5 import QtWidgets
3+
from PyQt5.QtWidgets import QDialog, QApplication
4+
from PyQt5.uic import loadUi
5+
import financeDataBase
6+
7+
mauve = "rgba(66, 39, 90, 1), stop:1 rgba(115, 75, 109, 1)"
8+
green_blue = "rgba(67, 206, 162, 1), stop:1 rgba(24, 90, 157, 1)"
9+
pink_orange = "rgba(221, 214, 243, 1), stop:1 rgba(250, 172, 168, 1)"
10+
11+
"""
12+
Method Name: verify
13+
Parameters: user_input
14+
@user_input: user entry is entered here
15+
Purpose: Makes sure user enters numerical digits
16+
"""
17+
18+
19+
def verify(user_input):
20+
try:
21+
float(user_input)
22+
print("Possible")
23+
return True
24+
except ValueError:
25+
print(f"Could not convert {user_input}!")
26+
return False
27+
28+
29+
"""
30+
Method Name: go_help
31+
Parameters: None
32+
Purpose: Switches to help screen
33+
"""
34+
35+
36+
def go_help():
37+
help_window = Help()
38+
widget.addWidget(help_window)
39+
widget.setCurrentIndex(widget.currentIndex() + 1)
40+
41+
42+
"""
43+
Method Name: go_home
44+
Parameters: None
45+
Purpose: Switches to home screen
46+
"""
47+
48+
49+
def go_home():
50+
financeapp = FinanceMenu()
51+
data = financeDataBase.get_bg_color()
52+
53+
print(f"this is data {data}")
54+
financeapp.setStyleSheet(
55+
f"QDialog#Dialog {{ background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1,"
56+
f"y2:1, stop:0 {data}) }}")
57+
58+
widget.addWidget(financeapp)
59+
widget.setCurrentIndex(widget.currentIndex() + 1)
60+
61+
62+
"""
63+
Method Name: go_settings
64+
Parameters: None
65+
Purpose: Switches to settings screen
66+
"""
67+
68+
69+
def go_settings():
70+
settings_window = Settings()
71+
widget.addWidget(settings_window)
72+
widget.setCurrentIndex(widget.currentIndex() + 1)
73+
74+
75+
"""
76+
Method Name: go_confirm
77+
Parameters: None
78+
Purpose: Switches to confirm screen
79+
"""
80+
81+
82+
def go_confirm():
83+
confirm = Confirm()
84+
widget.addWidget(confirm)
85+
widget.setCurrentIndex(widget.currentIndex() + 1)
86+
87+
88+
class FinanceMenu(QDialog):
89+
def __init__(self):
90+
super(FinanceMenu, self).__init__()
91+
loadUi("financeMenu.ui", self)
92+
self.enterAllDataButton.clicked.connect(self.send_all_data)
93+
self.viewTotalFunButton.clicked.connect(self.view_total_fun_expenses)
94+
self.viewTotalTransportationButton.clicked.connect(self.view_total_transport_expenses)
95+
self.viewTotalFoodButton.clicked.connect(self.view_total_food_expenses)
96+
self.viewTotalClothesButton.clicked.connect(self.view_total_clothes_expenses)
97+
self.viewTotalBillsButton.clicked.connect(self.view_total_bills_expenses)
98+
self.viewTotalOtherButton.clicked.connect(self.view_total_other_expenses)
99+
self.viewTotalExpenses.clicked.connect(self.view_all_expenses)
100+
self.viewFunGraph.clicked.connect(lambda: financeDataBase.graph("FUN"))
101+
self.viewTransportGraph.clicked.connect(lambda: financeDataBase.graph("TRANSPORTATION"))
102+
self.viewFoodGraph.clicked.connect(lambda: financeDataBase.graph("FOOD"))
103+
self.viewClothesGraph.clicked.connect(lambda: financeDataBase.graph("CLOTHES"))
104+
self.viewBillsGraph.clicked.connect(lambda: financeDataBase.graph("BILLS"))
105+
self.viewOtherGraph.clicked.connect(lambda: financeDataBase.graph("OTHER"))
106+
self.viewPieChart.clicked.connect(financeDataBase.graph_all)
107+
self.settingsButton.clicked.connect(lambda: go_settings())
108+
self.helpButton.clicked.connect(lambda: go_help())
109+
self.deletePrevFun.clicked.connect(lambda: financeDataBase.delete_recent("FUN"))
110+
self.deletePrevTransportation.clicked.connect(lambda: financeDataBase.delete_recent("TRANSPORTATION"))
111+
self.deletePrevFood.clicked.connect(lambda: financeDataBase.delete_recent("FOOD"))
112+
self.deletePrevClothes.clicked.connect(lambda: financeDataBase.delete_recent("CLOTHES"))
113+
self.deletePrevBills.clicked.connect(lambda: financeDataBase.delete_recent("BILLS"))
114+
self.deletePrevOther.clicked.connect(lambda: financeDataBase.delete_recent("OTHER"))
115+
self.del_table_fun.clicked.connect(lambda: financeDataBase.delete_data_in_table("fun"))
116+
self.del_table_transportation.clicked.connect(lambda: financeDataBase.delete_data_in_table("transportation"))
117+
self.del_table_food.clicked.connect(lambda: financeDataBase.delete_data_in_table("food"))
118+
self.del_table_clothes.clicked.connect(lambda: financeDataBase.delete_data_in_table("clothes"))
119+
self.del_table_bills.clicked.connect(lambda: financeDataBase.delete_data_in_table("bills"))
120+
self.del_table_other.clicked.connect(lambda: financeDataBase.delete_data_in_table("other"))
121+
self.enterGoalButton.clicked.connect(self.send_goal)
122+
self.checkGoalButton.clicked.connect(self.check_at_goal)
123+
self.setStyleSheet(f"QDialog#Dialog {{ background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1,"
124+
f"y2:1, stop:0 {financeDataBase.get_bg_color()}) }})")
125+
126+
"""
127+
Method Name: send_all_data
128+
Parameters: None
129+
Purpose: Sends all of entered expenses to DB on their computer
130+
"""
131+
132+
def send_all_data(self):
133+
if verify(self.funEntry.text()):
134+
financeDataBase.send_data("FUN", float(self.funEntry.text()))
135+
print("Successful")
136+
if verify(self.transportationEntry.text()):
137+
financeDataBase.send_data("TRANSPORTATION", self.transportationEntry.text())
138+
print("Transportation was sent successfully")
139+
140+
if verify(self.foodEntry.text()):
141+
financeDataBase.send_data("FOOD", self.foodEntry.text())
142+
print("Food was sent successfully")
143+
144+
if verify(self.clothesEntry.text()):
145+
financeDataBase.send_data("CLOTHES", self.clothesEntry.text())
146+
print("Clothes sent successfully ")
147+
148+
if verify(self.billsEntry.text()):
149+
financeDataBase.send_data("BILLS", self.billsEntry.text())
150+
print("Bills send successfully")
151+
152+
if verify(self.otherEntry.text()):
153+
financeDataBase.send_data("OTHER", self.otherEntry.text())
154+
print("other sent successfully")
155+
156+
# Clearing remaining text for user
157+
self.funEntry.setText("")
158+
self.transportationEntry.setText("")
159+
self.foodEntry.setText("")
160+
self.clothesEntry.setText("")
161+
self.billsEntry.setText("")
162+
self.otherEntry.setText("")
163+
164+
goal = financeDataBase.get_data("GOAL")
165+
total_spent = financeDataBase.get_total_spent()
166+
if total_spent > goal[0][0]:
167+
trial = Trial()
168+
trial.warning.setText("You Are Over Budget Now!")
169+
trial.exec_()
170+
elif total_spent == goal[0][0]:
171+
trial = Trial()
172+
trial.warning.setText("You Have Hit Your Budget!")
173+
trial.exec_()
174+
175+
"""
176+
Method Name: send_goal
177+
Parameters: None
178+
Purpose: Sends user's goal to database so it is saved
179+
"""
180+
181+
def send_goal(self):
182+
if verify(self.goalEntry.text()):
183+
financeDataBase.update_record("GOAL", self.goalEntry.text())
184+
self.goalEntry.setText("")
185+
186+
"""
187+
Method Name: check_at_goal
188+
Parameters: None
189+
Purpose: Checks if user surpassed goal
190+
"""
191+
192+
def check_at_goal(self):
193+
goal = financeDataBase.get_data("GOAL")
194+
if financeDataBase.get_total_spent() > goal[0][0]:
195+
print("You have exceeded your budget!")
196+
self.spentSpecificLabel.setText(f"You are over budget, your budget was ${goal[0][0]}")
197+
elif 0 <= (goal[0][0] - financeDataBase.get_total_spent()) <= 500:
198+
self.spentSpecificLabel.setText(f"You are $500 within the budget, your budget is ${goal[0][0]}")
199+
elif financeDataBase.get_total_spent() < goal[0][0]:
200+
self.spentSpecificLabel.setText(f"You are under budget don't worry! Budget: ${goal[0][0]}")
201+
else:
202+
self.spentSpecificLabel.setText(f"You reached budget! Budget: ${goal[0][0]}")
203+
204+
"""
205+
Method Name: view_total_fun_expenses
206+
Parameters: None
207+
Purpose: Displays total amount of money spent on fun category
208+
"""
209+
210+
def view_total_fun_expenses(self):
211+
spent = financeDataBase.sum_partic_expense("FUN")
212+
if spent is not None:
213+
self.spentSpecificLabel.setText(f"You spent ${round(spent)} on Fun")
214+
else:
215+
self.spentSpecificLabel.setText("Nothing spent on fun yet! Try entering something")
216+
217+
"""
218+
Method Name: view_total_transport_expenses
219+
Parameters: None
220+
Purpose: Displays total amount of money spent on transport category
221+
"""
222+
223+
def view_total_transport_expenses(self):
224+
spent = financeDataBase.sum_partic_expense("TRANSPORTATION")
225+
if spent is not None:
226+
self.spentSpecificLabel.setText(f"You spent ${round(spent)} on Transportation")
227+
else:
228+
self.spentSpecificLabel.setText("Nothing spent on transportation yet! Try entering something")
229+
230+
"""
231+
Method Name: view_total_food_expenses
232+
Parameters: None
233+
Purpose: Displays total amount of money spent on food category
234+
"""
235+
236+
def view_total_food_expenses(self):
237+
spent = financeDataBase.sum_partic_expense("FOOD")
238+
if spent is not None:
239+
self.spentSpecificLabel.setText(f"You spent ${round(spent)} on Food")
240+
else:
241+
self.spentSpecificLabel.setText("Nothing spent on food yet! Try entering something")
242+
243+
"""
244+
Method Name: view_total_clothes_expenses
245+
Parameters: None
246+
Purpose: Displays total amount of money spent on clothes category
247+
"""
248+
249+
def view_total_clothes_expenses(self):
250+
spent = financeDataBase.sum_partic_expense("CLOTHES")
251+
if spent is not None:
252+
self.spentSpecificLabel.setText(f"You spent ${round(spent)} on Clothes")
253+
else:
254+
self.spentSpecificLabel.setText("Nothing spent on clothes yet! Try entering something")
255+
256+
"""
257+
Method Name: view_total_bills_expenses
258+
Parameters: None
259+
Purpose: Displays total amount of money spent on bills category
260+
"""
261+
262+
def view_total_bills_expenses(self):
263+
spent = financeDataBase.sum_partic_expense("BILLS")
264+
if spent is not None:
265+
self.spentSpecificLabel.setText(f"You spent ${round(spent)} on Bills")
266+
else:
267+
self.spentSpecificLabel.setText("Nothing spent on bills yet! Try entering something")
268+
269+
"""
270+
Method Name: view_total_other_expenses
271+
Parameters: None
272+
Purpose: Displays total amount of money spent on other category
273+
"""
274+
275+
def view_total_other_expenses(self):
276+
spent = financeDataBase.sum_partic_expense("OTHER")
277+
if spent is not None:
278+
self.spentSpecificLabel.setText(f"You spent ${round(spent)} on Other")
279+
else:
280+
self.spentSpecificLabel.setText("Nothing spent on other yet! Try entering something")
281+
282+
"""
283+
Method Name: view_all_expenses
284+
Parameters: None
285+
Purpose: Displays total amount of money spent on all categories
286+
"""
287+
288+
def view_all_expenses(self):
289+
spent = financeDataBase.get_total_spent()
290+
self.spentSpecificLabel.setText(f"TOTAL Expenses: ${round(spent,2)}")
291+
292+
293+
class Help(QDialog):
294+
def __init__(self):
295+
super(Help, self).__init__()
296+
loadUi("help.ui", self)
297+
self.homeButton1.clicked.connect(lambda: go_home())
298+
self.explain.setWordWrap(True)
299+
300+
301+
class Trial(QDialog):
302+
def __init__(self):
303+
super(Trial, self).__init__()
304+
loadUi("trial.ui", self)
305+
self.setWindowTitle("Warning")
306+
self.exitButton.clicked.connect(self.close)
307+
308+
309+
class Settings(QDialog):
310+
def __init__(self):
311+
super(Settings, self).__init__()
312+
loadUi("settings.ui", self)
313+
self.homeButton.clicked.connect(lambda: go_home())
314+
self.submitButton.clicked.connect(self.change_back_colour) # this is defualt
315+
self.RGB_Button.clicked.connect(self.get_rgb_values)
316+
self.rSlider.valueChanged.connect(self.get_r_value)
317+
self.gSlider.valueChanged.connect(self.get_g_value)
318+
self.bSlider.valueChanged.connect(self.get_b_value)
319+
self.clearRecordsButton.clicked.connect(lambda: go_confirm())
320+
321+
def get_r_value(self):
322+
red = str(self.rSlider.value())
323+
self.rValue.setText(red)
324+
return int(red)
325+
326+
def get_rgb_values(self):
327+
red = str(self.rSlider.value())
328+
green = str(self.gSlider.value())
329+
blue = str(self.bSlider.value())
330+
rgb = f"rgb({red}, {green}, {blue})"
331+
financeDataBase.send_bg_color(rgb)
332+
333+
def get_g_value(self):
334+
green = str(self.gSlider.value())
335+
self.gValue.setText(green)
336+
return int(green)
337+
338+
def get_b_value(self):
339+
blue = str(self.bSlider.value())
340+
self.bValue.setText(blue)
341+
return int(blue)
342+
343+
def change_back_colour(self):
344+
state = self.colorSelectBox.currentText()
345+
print(state)
346+
347+
if state == "Mauve":
348+
financeDataBase.send_bg_color(mauve)
349+
elif state == "Green Blue":
350+
financeDataBase.send_bg_color(green_blue)
351+
else:
352+
financeDataBase.send_bg_color(pink_orange)
353+
354+
355+
class Confirm(QDialog):
356+
def __init__(self):
357+
super(Confirm, self).__init__()
358+
loadUi("confirm.ui", self)
359+
self.warning.setWordWrap(True)
360+
self.cancelButton.clicked.connect(lambda: go_settings())
361+
self.proceedButton.clicked.connect(lambda: financeDataBase.delete_all())
362+
363+
364+
app = QApplication(sys.argv)
365+
366+
widget = QtWidgets.QStackedWidget()
367+
window = FinanceMenu()
368+
369+
widget.addWidget(window)
370+
371+
sizeObject = QtWidgets.QDesktopWidget().screenGeometry(-1)
372+
373+
widget.setFixedWidth(sizeObject.width())
374+
widget.setFixedHeight(sizeObject.height())
375+
widget.show()
376+
app.exec_()

0 commit comments

Comments
 (0)