def display_expense_by_month(): """ Summarize all expesnses by month :return: All expenses subtotal in last 12 months :rtype: dict """ EM = ExpenseManager() EM.from_csv(expense_csv) return EM.by_month_expense()
def list_all_expenses(): """ Lists all expenses in the expenses csv file :return: All expenses records :rtype: dict """ EM = ExpenseManager() EM.from_csv(expense_csv) return {"expenses": EM.get_expenses()}
def display_expense_by_category(): """ Summarize all expenses by category :return: All expenses subtotal by category in last 12 months, with percentage :rtype: dict """ EM = ExpenseManager() EM.from_csv(expense_csv) return EM.by_category()
def edit(ID): EM = ExpenseManager() EM.from_csv(expense_csv) expense = EM.get_details(ID) category = getattr(expense, "_Category") amount = getattr(expense, "_Amount") date = getattr(expense, "_Date") category=category.lower() return render_template("update.html", ID=ID,category=category, amount=amount, date=date)
def test_get_expenses(): """ Tests for the get_expenses method """ manager = ExpenseManager() # Checks if method exists assert hasattr(manager, "get_expenses") # Checks if method returns correct value assert manager.get_expenses() == []
def update_expense(ID, category, amount, date): EM = ExpenseManager() EM.from_csv(expense_csv) expense = Expense(ID, category, amount, date) EM.upd_expense(ID, expense) EM.override_to_csv(expense_csv)
def test_to_csv(): """ Tests for the to_csv method """ manager = ExpenseManager() # Checks if method exists assert hasattr(manager, "to_csv")
def test_read_largest_id(): """ Tests for the read_largest_id method """ manager = ExpenseManager() # Checks if method exists assert hasattr(manager, "read_largest_id")
def test_get_details(): """ Tests for the get_details method """ manager = ExpenseManager() expense = Expense(1, "School", 200, "2020-02-13") # Checks if method exists assert hasattr(manager, "get_details") # Adds expense manager.add_expense(expense) # Checks if correct values are returned expense_object = manager.get_details(1) assert getattr(expense_object, "_Category") == "School" assert getattr(expense_object, "_Amount") == "200.00"
def test_by_category(): manager = ExpenseManager() Expense1 = Expense(1, "Food", 50, "2020-04-29") Expense2 = Expense(2, "School", 20, "2021-04-30") Expense3 = Expense(3, "Food", 36.6, "2021-05-01") Expense4 = Expense(4, "Family", 100, "2021-05-02") Expense5 = Expense(5, "Family", 88.8, "2021-01-02") # Add to the manager manager.add_expense(Expense1) manager.add_expense(Expense2) manager.add_expense(Expense3) manager.add_expense(Expense4) manager.add_expense(Expense5) assert manager.by_category()["Food"][0] == 36.6 assert manager.by_category()["Family"][0] == 188.8 assert manager.by_category()["Health"][0] == 0
def delete_expense(ID): """ Delete the expense record from the list :return: None :rtype: None """ # Load the list of expenses from csv, then put it into EM to manipulate # Finally put it back to the csv EM = ExpenseManager() EM.from_csv(expense_csv) EM.del_expense(ID) EM.override_to_csv(expense_csv)
def test_attributes(): """ Tests if ExpenseManager class has the correct attributes and they are set correctly """ manager = ExpenseManager() # Checks if private attribute exists assert hasattr(manager, "_expenses") # Checks if private attribute was set correctly assert manager._expenses == {}
def test_by_month_expense(): manager = ExpenseManager() Expense1 = Expense(1, "Food", 50, "2020-04-29") Expense2 = Expense(2, "School", 20, "2021-04-30") Expense3 = Expense(3, "Food", 36.6, "2021-05-01") Expense4 = Expense(4, "Family", 100, "2021-05-02") Expense5 = Expense(5, "Family", 88.8, "2021-01-02") Expense6 = Expense(6, "Health", 62, "2021-01-31") # Add to the manager manager.add_expense(Expense1) manager.add_expense(Expense2) manager.add_expense(Expense3) manager.add_expense(Expense4) manager.add_expense(Expense5) manager.add_expense(Expense6) assert manager.by_month_expense()["Apr"] == 20 assert manager.by_month_expense()["May"] == 136.6 assert manager.by_month_expense()["Jan"] == 150.8
def update_expense(ID, category, amount, date): """ Updates the specified expense :param ID: ID of expense to be updated :type ID: int :return: None :rtype: None """ EM = ExpenseManager() EM.from_csv(expense_csv) expense = Expense(ID, category, amount, date) EM.upd_expense(ID, expense) EM.override_to_csv(expense_csv)
def update(ID): try: category = request.form['category'] amount = float(request.form['amount']) date = request.form['date'] except ValueError: flash("Please enter a valid number for expense amount") return redirect(url_for("edit", ID=ID)) except KeyError: return redirect(url_for("index")) flash(f'Expense #{ID} has been updated!') EM = ExpenseManager() EM.from_csv(expense_csv) expense = EM.get_details(ID) original_expense = float(getattr(expense, "_Amount")) # Updates balance amount bal_dict = from_csv(balance_csv) original_balance = float(bal_dict["balance"]) updated_expense = amount # Deducts from balance (expense amount increased) if updated_expense > original_expense: amount_to_change = updated_expense - original_expense updated_balance = original_balance - amount_to_change flash(f'${float(amount_to_change)} deducted from balance') # Adds to balance (expense amount decreased) elif updated_expense < original_expense: amount_to_change = original_expense - updated_expense updated_balance = original_balance + amount_to_change flash(f'${float(amount_to_change)} added to balance') else: updated_balance = original_balance # Save expense EM.to_csv(expense_csv) # Save balance, budget add_to_csv(updated_balance, bal_dict["budget"]) update_expense(ID, category, amount, date) if updated_balance < float(bal_dict["budget"]): flash("Your balance has exceeded your budget!") return redirect(url_for("index"))
def expense(): ## Expense ## # Get input from html try: category = request.form['category'] except KeyError: flash("Please select a category") return redirect(url_for("index")) try: amount = float(request.form['amount']) except ValueError: flash("Please enter a valid number for expense amount") return redirect(url_for("index")) if category != "": # Store as a class Expense object EM = ExpenseManager() Next_ID = EM.read_largest_id(expense_csv) + 1 # Assign the next ID# expense = Expense(Next_ID, category, amount) # Add the expense into the Expense Manager EM.add_expense(expense) # Deduct expense amount from balance bal_dict = from_csv(balance_csv) bal_dict["balance"] = float(bal_dict["balance"]) - float( expense.Amount) if bal_dict["balance"] < float(bal_dict["budget"]): flash("Your balance has exceeded your budget!") # Save expense EM.to_csv(expense_csv) # Save balance, budget add_to_csv(bal_dict["balance"], bal_dict["budget"]) elif len(category) == 0: flash("Category can't be left empty") return redirect(url_for("index")) flash(f'Expense #{Next_ID} has been added!') flash(f'${expense.Amount} deducted from balance') return redirect(url_for("index"))
def test_upd_expense(): """ Tests for the upd_expense method """ manager = ExpenseManager() expense = Expense(1, "Health", 300, "2020-05-12") updated_expense = Expense(1, "School", 100.1, "2020-05-11") # Checks if method exists assert hasattr(manager, "upd_expense") # Adds expense manager.add_expense(expense) assert manager._expenses[1] == expense # Checks that update expense works correctly manager.upd_expense(1, updated_expense) assert manager._expenses[1] == updated_expense
def delete(ID): EM = ExpenseManager() EM.from_csv(expense_csv) expense = EM.get_details(ID) category = getattr(expense, "_Category") amount = getattr(expense, "_Amount") date = getattr(expense, "_Date") # Adds expense amount back to balance bal_dict = from_csv(balance_csv) bal_dict["balance"] = float(bal_dict["balance"]) + float(amount) # Save expense EM.to_csv(expense_csv) # Save balance, budget add_to_csv(bal_dict["balance"], bal_dict["budget"]) delete_expense(ID) flash(f'Expense #{ID} has been deleted!') flash(f'${amount} added to balance') return redirect(url_for("index"))
def test_add_expense(): """ Tests for the add_expense method """ manager = ExpenseManager() expense1 = Expense(1, "Health", 300, "2020-05-12") expense2 = Expense(2, "School", 1000, "2021-04-20") expense3 = Expense(3, "Food", 25.6, "2021-4-30") # Checks if method exists assert hasattr(manager, "add_expense") # Tests that method correctly adds expenses to dictionary manager.add_expense(expense1) manager.add_expense(expense2) manager.add_expense(expense3) assert manager._expenses[1] == expense1 assert manager._expenses[2] == expense2 assert manager._expenses[3] == expense3
def test_del_expense(): """ Tests for the del_expense method """ manager = ExpenseManager() expense1 = Expense(1, "Health", 300, "2020-05-12") expense2 = Expense(2, "School", 100.1, "2020-05-11") # Checks if method exists assert hasattr(manager, "del_expense") # Adds expenses manager.add_expense(expense1) manager.add_expense(expense2) assert manager._expenses[1] == expense1 assert manager._expenses[2] == expense2 # Checks that added expenses are deleted correctly manager.del_expense(1) manager.del_expense(2) with pytest.raises(KeyError): assert manager._expenses[1] assert manager._expenses[2]