# Scientific Computing with Python Projects - Budget App

Tell us what’s happening:
Hello world! I have a AssertionError at line 102. I tried for some time and can’t find my mistake maybe im doing it wrong. Time flies by and I dont know what to do… need help on how to do the right spacing. Sorry for my bad english I try x)

Here is my code:

``````def create_spend_chart(categories):
# Calculate the total amount spent
total_spent = sum(category.get_spent() for category in categories)

# Calculate the percentage spent
percentages = [(category.get_spent() / total_spent) * 100 for category in categories]

# Build the spend chart
chart = "Percentage spent by category\n"
for i in range(100, -10, -10):
chart += f"{i:3d}| "
for percentage in percentages:
if percentage >= i:
chart += "o  "
else:
chart += "   "
chart += "\n"

chart += "    " + "-" * (3 * len(categories) + 1) + "\n"

# Determine the maximum category name length
max_name_length = max(len(category.category_name) for category in categories)

# Write the category names vertically below the bars
for i in range(max_name_length):
chart += "     "
for category in categories:
if i < len(category.category_name):
chart += category.category_name[i] + "  "
else:
chart += "   "
chart += "\n"

return chart
``````

User Agent is: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36`

Challenge: Scientific Computing with Python Projects - Budget App

Missing the catagory class here.

Can you share your full code or replit?

Yes here is the full code:

``````"""
Represents the category class
"""
class Category:
"""
Initializes a Category object
Parameters:
- category_name (str): the name of the category
"""
def __init__(self, category_name):
self.category_name = category_name
self.ledger = []

"""
Deposits an amount into the category ledger
Parameters:
- amount (float): the amount deposited
- description (str): description of the deposit
"""
def deposit(self, amount, description=""):
self.ledger.append({"amount": amount, "description": description})

def check_funds(self, amount):
total = sum(item["amount"] for item in self.ledger)

def withdraw(self, amount, description=""):
if self.check_funds(amount):
self.ledger.append({"amount": -amount, "description": description})
return True
else:
return False

def transfer(self, amount, category):
if self.check_funds(amount):
self.withdraw(amount, f"Transfer to {category.category_name}")
category.deposit(amount, f"Transfer from {self.category_name}")
return True
else:
return False

def get_balance(self):
balance = 0
for item in self.ledger:
balance += item["amount"]
return balance

def get_spent(self):
spent = 0
for item in self.ledger:
if item["amount"] < 0:
spent -= item["amount"]
return spent

def __str__(self):
title = f"{self.category_name}".center(30, "*") + "\n"
items = ""
total = 0
for item in self.ledger:
description = item["description"][:23].ljust(23)
amount = "{:.2f}".format(item["amount"]).rjust(7)
items += f"{description}{amount}\n"
total += item["amount"]
total_line = f"Total: {total:.2f}"
return title + items + total_line

def create_spend_chart(categories):
# Calculate the total amount spent
total_spent = sum(category.get_spent() for category in categories)

# Calculate the percentage spent
percentages = [(category.get_spent() / total_spent) * 100 for category in categories]

# Build the spend chart
chart = "Percentage spent by category\n"
for i in range(100, -10, -10):
chart += f"{i:3d}| "
for percentage in percentages:
if percentage >= i:
chart += "o  "
else:
chart += "   "
chart += "\n"

chart += "    " + "-" * (3 * len(categories) + 1) + "\n"

# Determine the maximum category name length
max_name_length = max(len(category.category_name) for category in categories)

# Write the category names vertically below the bars
for i in range(max_name_length):
chart += "     "
for category in categories:
if i < len(category.category_name):
chart += category.category_name[i] + "  "
else:
chart += "   "
chart += "\n"

return chart
``````