main.py
import json
import datetime
# load account if exists
def load_account():
try:
with open("account.json", "r") as f:
account = json.load(f)
return account
except FileNotFoundError:
return -1
# create new account
def create_account():
account = {
"balance": 0.0,
"transactions": []
}
with open("account.json", "w") as f:
json.dump(account, f)
return account
# save account state
def save_account(account):
with open("account.json", "w") as f:
json.dump(account, f)
# deposit function
def deposit(account, amount):
account["balance"] += amount
account["transactions"].append({
"transaction_id": transaction_id_generator(len(account["transactions"])+1),
"type": "deposit",
"amount": amount,
"date": str(datetime.datetime.now()),
"balance_after": account["balance"]
})
save_account(account)
# Generate a unique 10-digit transaction ID
def transaction_id_generator(number):
return str(number).zfill(10)
# withdraw function
def withdraw(account, amount):
account["balance"] -= amount
account["transactions"].append({
"transaction_id": transaction_id_generator(len(account["transactions"])+1),
"type": "withdraw",
"amount": amount,
"date": str(datetime.datetime.now()),
"balance_after": account["balance"]
})
save_account(account)
# check balance function
def check_balance(account):
return account["balance"]
# view transactions function
def view_transactions(account):
if len(account["transactions"]) == 0:
return -1
else:
return account["transactions"]
# search transaction by ID function
def search_transaction_by_id(account, transaction_id):
for i in account["transactions"]:
if i["transaction_id"] == transaction_id:
return i
return -1
# search transaction by amount function
def search_transaction_by_amount(account, amount):
results = []
for i in account["transactions"]:
if i["amount"] == amount:
results.append(i)
if len(results) == 0:
return -1
else:
return results
# search transaction by date function
def search_transaction_by_date(account, date):
results = []
for i in account["transactions"]:
if date in i["date"]:
results.append(i)
if len(results) == 0:
return -1
else:
return results
# main program
def main():
# load or create account
account = load_account()
if account == -1:
account = create_account()
program_state = True
while program_state:
# main menu input
while True:
try:
print("\nInput option:\n1. Deposit\n2. Withdraw\n3. Check Balance\n4. View Transactions\n5. Search Transaction\n6. Exit")
choice = int(input("Enter choice (1-6): "))
if choice >= 1 and choice <= 6:
break
else:
print("Invalid choice. Please enter a number between 1 and 6.")
except ValueError:
print("Invalid input. Please enter a number between 1 and 6.")
# carry out the chosen operations with:
# 1. input with exception handling
# 2. perform operation
# 3. display result with formatting
# options:
# 1. deposit
if choice == 1:
while True:
try:
amount = float(input("Enter amount to deposit: "))
if amount > 0:
deposit(account, amount)
print(f"Deposited: ${amount:.2f}")
break
else:
print("Amount must be positive.")
except ValueError:
print("Invalid input. Please enter a valid amount.")
# 2. withdraw
elif choice == 2:
if account["balance"] <= 0:
print("Insufficient balance to withdraw.")
else:
while True:
try:
amount = float(input("Enter amount to withdraw: "))
if amount > 0 and amount <= account["balance"]:
withdraw(account, amount)
print(f"Withdrew: ${amount:.2f}")
break
else:
print("Invalid amount. Please enter a positive amount not exceeding your balance.")
except ValueError:
print("Invalid input. Please enter a valid amount.")
# 3. check balance
elif choice == 3:
balance = check_balance(account)
print(f"Current Balance: ${balance:.2f}")
# 4. view transactions
elif choice == 4:
transactions = view_transactions(account)
if transactions == -1:
print("Record is empty.")
else:
print("Transaction History:")
for i in transactions:
print(f"ID: {i['transaction_id']} | Type: {i['type']} | Amount: ${i['amount']:.2f} | Date: {i['date']} | Balance After: ${i['balance_after']:.2f}")
elif choice == 5:
# search transaction submenu
while True:
try:
print("Search options:\n1. By Transaction ID\n2. By Amount\n3. By Date\n4. Back to Main Menu")
search_choice = int(input("Enter choice (1-4): "))
if search_choice >= 1 and search_choice <= 4:
break
else:
print("Invalid choice. Please enter a number between 1 and 4.")
except ValueError:
print("Invalid input. Please enter a number between 1 and 4.")
# 1. search by transaction ID
if search_choice == 1:
# validate id input
while True:
try:
search_id = input("Enter Transaction ID to search: ")
if len(search_id) == 10 and search_id.isdigit():
break
else:
print("Invalid Transaction ID. It must be a 10-digit number.")
except ValueError:
print("Invalid Transaction ID. It must be a 10-digit number.")
# perform search
result = search_transaction_by_id(account, search_id)
if result == -1:
print("Transaction not found.")
else:
print("Transaction Found:")
print(f"ID: {result['transaction_id']} | Type: {result['type']} | Amount: ${result['amount']:.2f} | Date: {result['date']} | Balance After: ${result['balance_after']:.2f}")
# 2. search by amount
elif search_choice == 2:
# validate amount input
while True:
try:
search_amount = float(input("Enter Amount to search: "))
if search_amount > 0:
break
else:
print("Amount must be positive.")
except ValueError:
print("Invalid input. Please enter a valid amount.")
# perform search
results = search_transaction_by_amount(account, search_amount)
if results == -1:
print("No transactions found with specified amount.")
else:
print("Transactions Found:")
for i in results:
print(f"ID: {i['transaction_id']} | Type: {i['type']} | Amount: ${i['amount']:.2f} | Date: {i['date']} | Balance After: ${i['balance_after']:.2f}")
# 3. search by date
elif search_choice == 3:
# validate date input
while True:
try:
search_year = input("Enter Year (YYYY) to search: ")
search_month = input("Enter Month (MM) to search: ")
search_day = input("Enter Day (DD) to search: ")
if (len(search_year) == 4 and search_year.isdigit() and
len(search_month) == 2 and search_month.isdigit() and
len(search_day) == 2 and search_day.isdigit()):
search_date = f"{search_year}-{search_month}-{search_day}"
break
else:
print("Invalid date format. Please enter valid year, month, and day.")
except ValueError:
print("Invalid date format. Please enter valid year, month, and day.")
# perform search
results = search_transaction_by_date(account, search_date)
if results == -1:
print("No transactions found on the specified date.")
else:
print("Transactions Found:")
for i in results:
print(f"ID: {i['transaction_id']} | Type: {i['type']} | Amount: ${i['amount']:.2f} | Date: {i['date']} | Balance After: ${i['balance_after']:.2f}")
# 4. back to main menu
elif search_choice == 4:
main()
# 6. exit
elif choice == 6:
program_state = False
# run main program
main()
exit()