Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 0 additions & 7 deletions projects/001-budget-app/budget.py

This file was deleted.

25 changes: 0 additions & 25 deletions projects/001-budget-app/main.py

This file was deleted.

Empty file.
108 changes: 108 additions & 0 deletions projects/001-budget-app/python/budget_app/app_function.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
from budget_app.controller import Controller
from budget_app.menu import PrintMenu

class AppFunction:
def __init__(self):
self.controller = Controller()
self.menu = PrintMenu

def menu_selection(self):
while True:
self.menu.print_menu()
try:
if (selection := int(input("Select an option: "))) not in [1,2,3,4,5,6,7]:
print("Invalid selection. Try again.")
continue

match selection:
case 1:
self.create_category()
case 2:
self.add_funds()
case 3:
self.get_withdraw()
case 4:
self.transfer()
case 5:
self.show_category_detail()
case 6:
self.show_graphic_spent()
case 7:
print("Thank you for using this program")
break

except ValueError:
print("Invalid selection. Try again.")

def create_category(self):
name = input("Enter category name: ")
try:
self.controller.add_category(name)
print("Successfully added category '{}'".format(name))
while (response := input("Category have budget 0, want to add funds?(y,n): ").lower()) not in ["n","no"]:
if response in ["y", "yes"]:
category = self.controller.get_category(name)
self.add_funds(category, "Initial deposit")
break
else:
print("Invalid input. Try again.")
except ValueError as e:
print(f"Error: {e}")

def add_funds(self, name_category=None, description=None):
try:
if name_category is None:
name_category = self.controller.get_category(input("Enter category name: "))

if (amount := int(input("Enter amount of funds: "))) < 0:
print("Amount must be positive.")
return

if description is None:
description = input("Enter description of funds: ")
name_category.deposit(amount, description)
print(f"Deposited: {amount}, Description: {description}")

except (ValueError, KeyError) as e:
print(f"Error: {e}")


def get_withdraw(self):
try:
name_category = self.controller.get_category(input("Enter category name: "))



if name_category.withdraw(
(amount:=int(input("Enter amount of withdrawals: "))),
(description :=input("Enter description of withdrawals: "))
):

print(f"Withdrawal: {amount}, Description: {description}")
else:
print("Not enough funds.")
except (ValueError, KeyError) as e:
print(f"Error: {e}")

def transfer(self):
try:
from_category = self.controller.get_category(input("Transfer from category: "))
to_category = self.controller.get_category(input("To category: "))


if from_category.transfer(amount :=int(input("Enter amount of transfers: ")), to_category):
print(f"Transferred: {amount} from {from_category.name} to {to_category.name}")
else:
print("Not enough funds to transfer!")
except (ValueError, KeyError) as e:
print(f"Error: {e}")

def show_category_detail(self):
if category_name := self.controller.get_category(input("Enter category name: ")):
print(category_name)
else:
print("Not found")

def show_graphic_spent(self):
print(self.controller.create_spend_chart())

49 changes: 49 additions & 0 deletions projects/001-budget-app/python/budget_app/budget.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
class Category:
def __init__(self, name: str):
self.name = name
self.ledger = []
self.budget = 0

def check_funds(self, amount: float) -> bool:
return self.budget >= amount

def deposit(self, amount: float, description: str ="") -> None:
self.ledger.append({"amount": amount, "description": description})
self.budget += amount


def withdraw(self, amount: float, description: str ="") -> bool:
if self.check_funds(amount):
self.ledger.append({"amount": -amount, "description": description})
self.budget -= amount
return True
return False


def get_balance(self) -> float:
return self.budget

def transfer(self, amount: float, category:"Category") -> bool:
if self.check_funds(amount):
self.withdraw(amount, f"Transfer to {category.name}")
category.deposit(amount, f"Transfer from {self.name}")
return True
return False


def __str__(self):
title = f"{self.name:*^30}\n"
items = ""
for entry in self.ledger:
description = entry["description"][:23]
amount = f"{entry['amount']:>7.2f}"
items += f"{description:<23}{amount}\n"
total= f"Total: {self.budget:.2f}"
return title + items + total







60 changes: 60 additions & 0 deletions projects/001-budget-app/python/budget_app/controller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from budget_app.budget import Category


class Controller:
def __init__(self):
self.categories = {}

def add_category(self, name: str) -> Category:
if name not in self.categories:
category = Category(name)
self.categories[name] = category
return category
else:
raise ValueError(f"Category {name} already exists")

def get_category(self, name: str) -> Category:
if name in self.categories:
return self.categories[name]
else:
raise ValueError(f"Category {name} does not exist")

def create_spend_chart(self):
categories = list(self.categories.values())
spending = []
for category in categories:
total_spent = 0
for entry in category.ledger:
amount = entry["amount"]
if amount < 0:
total_spent += abs(amount)
spending.append(total_spent)

total = sum(spending)
percentages = [int((sp / total) * 10) * 10 for sp in spending]

chart = "Percentage spent by category\n"

for i in range(100, -1, -10):
chart += f"{i:>3}| "
for p in percentages:
if p >= i:
chart += "o "
else:
chart += " "
chart += "\n"

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

max_len = max(len(c.name) for c in categories)
for i in range(max_len):
chart += " "
for c in categories:
if i < len(c.name):
chart += c.name[i] + " "
else:
chart += " "
if i < max_len - 1:
chart += "\n"

return chart
12 changes: 12 additions & 0 deletions projects/001-budget-app/python/budget_app/menu.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class PrintMenu:
def print_initial_message():
print("Welcome to budget app")

def print_menu():
print("What would you like to do?")
print("1. Create a new category budget")
print("2. Add founds to your category budget")
print("3. Get a withdraw")
print("4. transfer between categories ")
print("5. Show category balance")
print("6. Show graphic spent")
Empty file.
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import unittest
import budget
from budget import create_spend_chart
import sys
import os

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))

from source.class_config import budget
from source.utility.create_spend_chart import create_spend_chart
import unittest

class UnitTests(unittest.TestCase):
def setUp(self):
Expand Down
13 changes: 13 additions & 0 deletions projects/001-budget-app/python/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from budget_app.menu import PrintMenu
from budget_app.app_function import AppFunction

class StartApp:
@staticmethod
def start():
PrintMenu.print_initial_message()
app = AppFunction()
app.menu_selection()


if __name__ == "__main__":
StartApp.start()
Empty file added projects/__init__.py
Empty file.