Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add feature: account balance tracking #16

Merged
Merged
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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ test {
}

application {
mainClass.set("BudgetBuddy")
mainClass.set("budgetbuddy.BudgetBuddy")
}

shadowJar {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import financemanager.TransactionList;
import ui.UserInterface;
package budgetbuddy;

import budgetbuddy.account.Account;
import budgetbuddy.transaction.TransactionList;
import budgetbuddy.ui.UserInterface;

import java.util.Scanner;

Expand All @@ -8,7 +11,6 @@ public class BudgetBuddy {
/**
* Main entry-point for the java.BudgetBuddy application.
*/

public static void main(String[] args){
String logo = "BUDGET BUDDY";
System.out.println("Hello from\n" + logo);
Expand All @@ -17,7 +19,9 @@ public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("Hello " + in.nextLine());


TransactionList transactions = new TransactionList();
Account account = new Account();
boolean isRunning = true;
try{
while (isRunning) {
Expand All @@ -29,13 +33,13 @@ public static void main(String[] args){
isRunning = false;
break;
case "list":
transactions.printTransactions();
transactions.printTransactions(account);
break;
case "delete":
transactions.removeTransaction(input);
transactions.removeTransaction(input, account);
break;
case "add":
transactions.processTransaction(input);
transactions.processTransaction(input, account);
break;
default:
UserInterface.printNoCommandExists();
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/budgetbuddy/account/Account.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package budgetbuddy.account;

public class Account {
private double balance;

public Account() {
this.balance = 0.00;
}

public Account(double balance) {
this.balance = balance;
}

public double getBalance() {
return balance;
}

public void setBalance(double balance) {
this.balance = balance;
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
package parser;
package budgetbuddy.parser;

import transactions.Transaction;
import budgetbuddy.account.Account;
import budgetbuddy.transaction.type.Expense;
import budgetbuddy.transaction.type.Income;
import budgetbuddy.transaction.type.Transaction;

public class Parser {

public static final int ADD_COMMAND_INDEX = 3;

public Transaction parseTransaction(String input) {
public Transaction parseTransaction(String input, Account account) {
String data = input.substring(ADD_COMMAND_INDEX + 1);
String[] parseData = data.split("/");
String type = null;
String description = null;
String date = null;
String amount = null;
String category = null;
for(int i = 0; i < parseData.length; i++) {
switch (parseData[i].trim()) {
case "t":
type = parseData[i + 1].trim();
break;
case "n":
description = parseData[i + 1].trim();
break;
Expand All @@ -32,6 +39,11 @@ public Transaction parseTransaction(String input) {
}
}
assert amount != null;
return new Transaction(description, Float.parseFloat(amount), category, date);
if (type.equalsIgnoreCase("income")) {
return new Income(description, Double.parseDouble(amount), category, date, account);
} else if (type.equalsIgnoreCase("expense")) {
return new Expense(description, Double.parseDouble(amount), category, date, account);
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package financemanager;
package budgetbuddy.transaction;

import parser.Parser;
import transactions.Transaction;
import ui.UserInterface;
import budgetbuddy.account.Account;
import budgetbuddy.parser.Parser;
import budgetbuddy.transaction.type.Transaction;
import budgetbuddy.ui.UserInterface;

import java.util.ArrayList;

Expand All @@ -25,17 +26,18 @@ public ArrayList<Transaction> getTransactions() {
return transactions;
}

public void printTransactions(){
UserInterface.printAllTransactions(transactions);
public void printTransactions(Account account){
UserInterface.printAllTransactions(transactions, account.getBalance());
}

public void removeTransaction(String input){
public void removeTransaction(String input, Account account){
int id = Integer.parseInt(input.substring(DELETE_BEGIN_INDEX).trim()) - INDEX_OFFSET;
int size = transactions.size();
if (id >= LOWER_BOUND && id < size) {
String itemRemoved = transactions.get(id).toString();
account.setBalance(account.getBalance() - transactions.get(id).getAmount() );
transactions.remove(id);
UserInterface.printDeleteMessage(itemRemoved);
UserInterface.printDeleteMessage(itemRemoved, account.getBalance());
} else {
throw new IndexOutOfBoundsException(size);
}
Expand All @@ -45,10 +47,10 @@ void addTransaction(Transaction t) {
transactions.add(t);
}

public void processTransaction(String input) {
Transaction t = parser.parseTransaction(input);
public void processTransaction(String input, Account account) {
Transaction t = parser.parseTransaction(input, account);
addTransaction(t);
String fetchData = String.valueOf(transactions.get(transactions.size() - 1));
UserInterface.printAddMessage(fetchData);
UserInterface.printAddMessage(fetchData, account.getBalance());
}
}
17 changes: 17 additions & 0 deletions src/main/java/budgetbuddy/transaction/type/Expense.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package budgetbuddy.transaction.type;

import budgetbuddy.account.Account;

public class Expense extends Transaction {
private static final String TRANSACTION_TYPE = "Expense";

public Expense(String description, double amount, String category, String date, Account account) {
super(description, -amount, category, date);
account.setBalance(account.getBalance() + this.getAmount());
}

@Override
public String getTransactionType() {
return TRANSACTION_TYPE;
}
}
17 changes: 17 additions & 0 deletions src/main/java/budgetbuddy/transaction/type/Income.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package budgetbuddy.transaction.type;

import budgetbuddy.account.Account;

public class Income extends Transaction {
private static final String TRANSACTION_TYPE = "Income";

public Income(String description, double amount, String category, String date, Account account) {
super(description, amount, category, date);
account.setBalance(account.getBalance() + this.getAmount());
}

@Override
public String getTransactionType() {
return TRANSACTION_TYPE;
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package transactions;
package budgetbuddy.transaction.type;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Transaction {
public abstract class Transaction {
private String description;
private float amount;
private double amount;
private String category;
private LocalDate date;

public Transaction(String description, float amount, String category,String date) {
public Transaction(String description, double amount, String category,String date) {
this.description = description;
this.amount = amount;
this.category = category;
Expand All @@ -20,7 +20,7 @@ public String getDescription() {
return description;
}

public float getAmount() {
public double getAmount() {
return amount;
}

Expand All @@ -35,10 +35,13 @@ private LocalDate parseDate(String by) {
public String getCategory() {
return category;
}


public abstract String getTransactionType();

@Override
public String toString() {
return (" Description: " + getDescription() + " | " +
return (" Transaction Type: " + getTransactionType() + " | " +
" Description: " + getDescription() + " | " +
" Date: " + getDate() + " | " +
" Amount: " + getAmount() + " | " +
" Category: " + getCategory()) ;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ui;
package budgetbuddy.ui;

import transactions.Transaction;
import budgetbuddy.transaction.type.Transaction;

import java.time.LocalDate;
import java.util.ArrayList;
Expand All @@ -12,25 +12,30 @@ public class UserInterface {
"----------------------------------------------------------------------" +
"-----------------------";
private static final String TABLE_BORDER = "________________________________________" +
"_____________________________________________________________________";
"_________________________________________________________________________________";

private static final String TAB_SPACE = " ";


public static void printDeleteMessage(String transaction){
public static void printDeleteMessage(String transaction, double balance){
String[] parts = transaction.split("\\|");
System.out.println(LINE);
System.out.println(TAB_SPACE + "Got it. I have removed the following transaction from the history");
System.out.println( TAB_SPACE + transaction);
System.out.println(TAB_SPACE + "Got it. I have removed the following transaction from the history \n");
for (String part : parts) {
System.out.println(TAB_SPACE + part.trim());
}
System.out.println("\n" + TAB_SPACE + "Your updated account balance is $" + balance);
System.out.println(LINE);
}

public static void printAddMessage(String transaction){
public static void printAddMessage(String transaction, double balance){
String[] parts = transaction.split("\\|");
System.out.println(LINE);
System.out.println(TAB_SPACE + "Got it. I have added the following transaction \n");
for (String part : parts) {
System.out.println(TAB_SPACE + part.trim());
}
System.out.println("\n" + TAB_SPACE + "Your updated account balance is $" + balance);
System.out.println(LINE);
}

Expand All @@ -47,21 +52,26 @@ public static void printUnknownError(String message){
System.out.println(LINE);
}

public static void printAllTransactions(ArrayList<Transaction> transactions) {
public static void printAllTransactions(ArrayList<Transaction> transactions, double balance) {
int index = transactions.size();
System.out.println(LINE);
System.out.println(TAB_SPACE + "Your Transaction history:");
System.out.println(TABLE_BORDER);
System.out.printf(TAB_SPACE + "%-5s %-50s %-20s %-15s %-15s%n", "ID", "Transaction", "Date",
"Amount", "Category");
System.out.println(TAB_SPACE+TABLE_BORDER);
System.out.printf(TAB_SPACE+TAB_SPACE + "%-5s %-10s %-50s %-20s %-15s %-15s%n", "ID", "Type", "Transaction",
"Date", "Amount", "Category");
for (int i = START_INDEX; i < index; i++) {
Transaction transaction = transactions.get(i);
String type = transaction.getTransactionType();
String description = transaction.getDescription();
LocalDate date = transaction.getDate();
System.out.printf(TAB_SPACE + "%-5d %-50.45s %-20s %-15f %-15s%n", i + 1,
transaction.getDescription(), date,
transaction.getAmount(), transaction.getCategory());
double amount = transaction.getAmount();
String category = transaction.getCategory();

System.out.printf(TAB_SPACE+TAB_SPACE + "%-5d %-10s %-50.45s %-20s %-15.2f %-15s%n", i + 1, type,
description, date, amount, category);
}
System.out.println(TABLE_BORDER);
System.out.println(TAB_SPACE+TABLE_BORDER);
System.out.println("\n" + TAB_SPACE + "Your currents account balance is $" + balance);
System.out.println(LINE);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package parser;
package budgetbuddy.parser;
import budgetbuddy.account.Account;
import org.junit.jupiter.api.Test;
import transactions.Transaction;
import budgetbuddy.transaction.type.Transaction;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
Expand All @@ -12,7 +13,9 @@ public class ParserTest {
@Test
public void testParseTransaction() {
Parser parser = new Parser();
Transaction transaction = parser.parseTransaction("add /n/Shopping /$/50 /d/14-03-2024 /c/Personal");
Account account = new Account();
Transaction transaction = parser.parseTransaction("add /t/Income /n/Shopping /$/50 /d/14-03-2024 " +
"/c/Personal", account);
assertEquals("Shopping", transaction.getDescription());
assertEquals(50.0f, transaction.getAmount(), 0.001);
assertEquals(LocalDate.parse("14-03-2024", DateTimeFormatter.ofPattern("dd-MM-yyyy")), transaction.getDate());
Expand Down
Loading
Loading