-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExpense Tracker
More file actions
126 lines (108 loc) · 4 KB
/
Expense Tracker
File metadata and controls
126 lines (108 loc) · 4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import json
import datetime
# Initialize an empty list to store expense data
expenses = []
# Function to save expenses to a JSON file
def save_expenses():
with open("expenses.json", "w") as file:
json.dump(expenses, file)
# Function to load expenses from the JSON file
def load_expenses():
try:
with open("expenses.json", "r") as file:
return json.load(file)
except FileNotFoundError:
return []
# Function to display the main menu
def show_menu():
print("\nExpense Tracker")
print("1. Add Expense")
print("2. View Expenses")
print("3. Search Expenses")
print("4. Filter Expenses by Date")
print("5. Exit")
# Function to get a valid date from the user
def get_valid_date_input(prompt):
while True:
try:
date_str = input(prompt + " (YYYY-MM-DD): ")
return datetime.datetime.strptime(date_str, "%Y-%m-%d")
except ValueError:
print("Invalid date format. Please use YYYY-MM-DD.")
# Function to add a new expense
def add_expense():
try:
amount = float(input("Enter the expense amount: "))
description = input("Enter a short description: ")
category = input("Enter expense category: ")
date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
expense = {
"amount": amount,
"description": description,
"category": category,
"date": date
}
expenses.append(expense)
save_expenses()
print("Expense added successfully!")
except ValueError:
print("Invalid input. Please enter a valid expense amount.")
# Function to view expenses
def view_expenses():
print("\nExpense List:")
for expense in expenses:
print(f"Date: {expense['date']}")
print(f"Amount: ${expense['amount']:.2f}")
print(f"Description: {expense['description']}")
print(f"Category: {expense['category']}")
print("-" * 30)
total = sum(expense['amount'] for expense in expenses)
print(f"Total Expenses: ${total:.2f}\n")
# Function to search expenses by description
def search_expenses():
search_term = input("Enter a search term: ").lower()
search_results = [expense for expense in expenses if search_term in expense['description'].lower()]
if search_results:
print("\nSearch Results:")
for expense in search_results:
print(f"Date: {expense['date']}")
print(f"Amount: ${expense['amount']:.2f}")
print(f"Description: {expense['description']}")
print(f"Category: {expense['category']}")
print("-" * 30)
else:
print("No expenses found for the given search term.")
# Function to filter expenses by date range
def filter_expenses_by_date():
start_date = get_valid_date_input("Enter start date")
end_date = get_valid_date_input("Enter end date")
filtered_expenses = [expense for expense in expenses if start_date <= datetime.datetime.strptime(expense['date'], "%Y-%m-%d %H:%M:%S") <= end_date]
if filtered_expenses:
print("\nExpenses within the specified date range:")
for expense in filtered_expenses:
print(f"Date: {expense['date']}")
print(f"Amount: ${expense['amount']:.2f}")
print(f"Description: {expense['description']}")
print(f"Category: {expense['category']}")
print("-" * 30)
else:
print("No expenses found within the specified date range.")
# Main program loop
expenses = load_expenses()
while True:
show_menu()
choice = input("Enter your choice: ")
if choice == "1":
add_expense()
elif choice == "2":
view_expenses()
elif choice == "3":
search_expenses()
elif choice == "4":
filter_expenses_by_date()
elif choice == "5":
print("Exiting Expense Tracker. Goodbye!")
save_expenses() # Save expenses before exiting
break
else:
print("Invalid choice. Please try again.")