From 51a28c4de0d74c90b25f40b3ebd096cc3c702310 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Tue, 26 Mar 2024 16:55:14 +0800 Subject: [PATCH 01/15] Instantiate enum class Category.java --- .../java/budgetbuddy/categories/Category.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/budgetbuddy/categories/Category.java diff --git a/src/main/java/budgetbuddy/categories/Category.java b/src/main/java/budgetbuddy/categories/Category.java new file mode 100644 index 0000000000..2c87620935 --- /dev/null +++ b/src/main/java/budgetbuddy/categories/Category.java @@ -0,0 +1,19 @@ +package budgetbuddy.categories; + +public enum Category { + DINING(1), + GROCERIES(2), + UTILITIES(3), + TRANSPORTATION(4), + HEALTHCARE(5), + ENTERTAINMENT(6), + RENT(7), + SALARY(8), + OTHER(9); + + private int categoryNum; + + Category(int categoryNum) { + this.categoryNum = categoryNum; + } +} From d687e4e35972ea3be3c240d3390a22b737533ab5 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Tue, 26 Mar 2024 17:20:11 +0800 Subject: [PATCH 02/15] Add attribute categoryName to enum class Category.java --- .../java/budgetbuddy/categories/Category.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/budgetbuddy/categories/Category.java b/src/main/java/budgetbuddy/categories/Category.java index 2c87620935..5753757bcc 100644 --- a/src/main/java/budgetbuddy/categories/Category.java +++ b/src/main/java/budgetbuddy/categories/Category.java @@ -1,19 +1,21 @@ package budgetbuddy.categories; public enum Category { - DINING(1), - GROCERIES(2), - UTILITIES(3), - TRANSPORTATION(4), - HEALTHCARE(5), - ENTERTAINMENT(6), - RENT(7), - SALARY(8), - OTHER(9); + DINING(1, "Dining"), + GROCERIES(2, "Groceries"), + UTILITIES(3, "Utilities"), + TRANSPORTATION(4, "Transportation"), + HEALTHCARE(5, "Healthcare"), + ENTERTAINMENT(6, "Entertainment"), + RENT(7, "Rent"), + SALARY(8, "Salary"), + OTHER(9, "Other"); private int categoryNum; + private String categoryName; - Category(int categoryNum) { + Category(int categoryNum, String categoryName) { this.categoryNum = categoryNum; + this.categoryName = categoryName; } } From 00c400794532d5386dc363e8328b216454293391 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Tue, 26 Mar 2024 17:22:35 +0800 Subject: [PATCH 03/15] Add fromNumber method in Category.java to return Category object from number --- src/main/java/budgetbuddy/categories/Category.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/budgetbuddy/categories/Category.java b/src/main/java/budgetbuddy/categories/Category.java index 5753757bcc..17aeaccd86 100644 --- a/src/main/java/budgetbuddy/categories/Category.java +++ b/src/main/java/budgetbuddy/categories/Category.java @@ -18,4 +18,13 @@ public enum Category { this.categoryNum = categoryNum; this.categoryName = categoryName; } + + public static Category fromNumber(int number) { + for (Category category : Category.values()) { + if (category.categoryNum == number) { + return category; + } + } + return null; + } } From 0cff1440f4acb1f0160826fa8ecbd76cc2d0f8ae Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Tue, 26 Mar 2024 17:23:38 +0800 Subject: [PATCH 04/15] Create getter for categoryName attribute in Category.java --- src/main/java/budgetbuddy/categories/Category.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/budgetbuddy/categories/Category.java b/src/main/java/budgetbuddy/categories/Category.java index 17aeaccd86..0080c69325 100644 --- a/src/main/java/budgetbuddy/categories/Category.java +++ b/src/main/java/budgetbuddy/categories/Category.java @@ -27,4 +27,8 @@ public static Category fromNumber(int number) { } return null; } + + public String getCategoryName() { + return categoryName; + } } From a081102baf0d15ae731a604bfb8397c564653a48 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Tue, 26 Mar 2024 17:30:45 +0800 Subject: [PATCH 05/15] Remove category argument in add command and subsequent method calls --- src/main/java/budgetbuddy/parser/Parser.java | 10 +++------- src/main/java/budgetbuddy/storage/DataStorage.java | 4 ++-- .../budgetbuddy/transaction/TransactionList.java | 2 +- .../java/budgetbuddy/transaction/type/Expense.java | 5 ++--- .../java/budgetbuddy/transaction/type/Income.java | 5 ++--- .../budgetbuddy/transaction/type/Transaction.java | 13 +++++++++---- 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/main/java/budgetbuddy/parser/Parser.java b/src/main/java/budgetbuddy/parser/Parser.java index 7ba488805e..c981a5302c 100644 --- a/src/main/java/budgetbuddy/parser/Parser.java +++ b/src/main/java/budgetbuddy/parser/Parser.java @@ -20,7 +20,6 @@ public Transaction parseTransaction(String input, Account account) String description = null; String date = null; String amount = null; - String category = null; for(int i = 0; i < parseData.length-1; i++) { switch (parseData[i].trim()) { case "t": @@ -39,21 +38,18 @@ public Transaction parseTransaction(String input, Account account) case "d": date = parseData[i + 1].trim(); break; - case "c": - category = parseData[i + 1].trim(); - break; default: break; } } assert amount != null; assert type != null; - if(description.trim().isEmpty() || category.trim().isEmpty() || type.trim().isEmpty()){ + if(description.trim().isEmpty() || type.trim().isEmpty()){ throw new EmptyArgumentException("data for the arguments "); } else if (type.equalsIgnoreCase("income")) { - return new Income(description, Double.parseDouble(amount), category, date, account); + return new Income(description, Double.parseDouble(amount), date, account); } else if (type.equalsIgnoreCase("expense")) { - return new Expense(description, Double.parseDouble(amount), category, date, account); + return new Expense(description, Double.parseDouble(amount), date, account); } else { throw new InvalidTransactionTypeException(type); } diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 88f55a588f..cb2471323f 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -59,10 +59,10 @@ private Transaction processData(String s, Account account) { switch (transactionInfo[2]) { case "Income": return new Income(transactionInfo[0], Double.parseDouble(transactionInfo[4]), - transactionInfo[1], transactionInfo[3], account); + transactionInfo[1], account); case "Expense": return new Expense(transactionInfo[0], -Double.parseDouble(transactionInfo[4]), - transactionInfo[1], transactionInfo[3], account); + transactionInfo[1], account); default: return null; } diff --git a/src/main/java/budgetbuddy/transaction/TransactionList.java b/src/main/java/budgetbuddy/transaction/TransactionList.java index 0e1d35f5df..475d268f7d 100644 --- a/src/main/java/budgetbuddy/transaction/TransactionList.java +++ b/src/main/java/budgetbuddy/transaction/TransactionList.java @@ -87,7 +87,7 @@ void addTransaction(Transaction t) { public void processTransaction(String input, Account account) throws InvalidTransactionTypeException, InvalidAddTransactionSyntax, EmptyArgumentException { // Check for syntax for add transaction - String[] arguments = {"/t/", "/n/", "/$/", "/d/", "/c/"}; + String[] arguments = {"/t/", "/n/", "/$/", "/d/"}; for (String argument : arguments) { if (!input.contains(argument)) { throw new InvalidAddTransactionSyntax("Invalid add syntax."); diff --git a/src/main/java/budgetbuddy/transaction/type/Expense.java b/src/main/java/budgetbuddy/transaction/type/Expense.java index 8d8fa36583..a3ab3c761e 100644 --- a/src/main/java/budgetbuddy/transaction/type/Expense.java +++ b/src/main/java/budgetbuddy/transaction/type/Expense.java @@ -5,11 +5,10 @@ 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); + public Expense(String description, double amount, String date, Account account) { + super(description, -amount, date); assert this.getAmount() < 0: "Expense amount must be positive"; assert description != null && !description.isEmpty() : "Description cannot be null or empty"; - assert category != null && !category.isEmpty() : "Category cannot be null or empty"; assert date != null : "Date cannot be null"; assert account != null : "Account cannot be null"; diff --git a/src/main/java/budgetbuddy/transaction/type/Income.java b/src/main/java/budgetbuddy/transaction/type/Income.java index 684dcb271f..ec2c594774 100644 --- a/src/main/java/budgetbuddy/transaction/type/Income.java +++ b/src/main/java/budgetbuddy/transaction/type/Income.java @@ -5,11 +5,10 @@ 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); + public Income(String description, double amount, String date, Account account) { + super(description, amount, date); assert this.getAmount() > 0: "Income amount must be positive"; assert description != null && !description.isEmpty() : "Description cannot be null or empty"; - assert category != null && !category.isEmpty() : "Category cannot be null or empty"; assert date != null : "Date cannot be null"; assert account != null : "Account cannot be null"; diff --git a/src/main/java/budgetbuddy/transaction/type/Transaction.java b/src/main/java/budgetbuddy/transaction/type/Transaction.java index 5b816a5531..48ba911fce 100644 --- a/src/main/java/budgetbuddy/transaction/type/Transaction.java +++ b/src/main/java/budgetbuddy/transaction/type/Transaction.java @@ -1,18 +1,19 @@ package budgetbuddy.transaction.type; +import budgetbuddy.categories.Category; + import java.time.LocalDate; import java.time.format.DateTimeFormatter; public abstract class Transaction { private String description; private double amount; - private String category; + private Category category = Category.OTHER; private LocalDate date; - public Transaction(String description, double amount, String category,String date) { + public Transaction(String description, double amount,String date) { this.description = description; this.amount = amount; - this.category = category; this.date = parseDate(date); } @@ -33,7 +34,7 @@ private LocalDate parseDate(String by) { } public String getCategory() { - return category; + return category.getCategoryName(); } public abstract String getTransactionType(); @@ -46,4 +47,8 @@ public String toString() { " Amount: " + getAmount() + " | " + " Category: " + getCategory()) ; } + + public void setCategory(Category category) { + this.category = category; + } } From c18b932365c25bfae481302d2292649ccfb9d3c6 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Tue, 26 Mar 2024 18:13:21 +0800 Subject: [PATCH 06/15] Add getter for categoryNum in Category.java --- src/main/java/budgetbuddy/categories/Category.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/budgetbuddy/categories/Category.java b/src/main/java/budgetbuddy/categories/Category.java index 0080c69325..9967343873 100644 --- a/src/main/java/budgetbuddy/categories/Category.java +++ b/src/main/java/budgetbuddy/categories/Category.java @@ -11,8 +11,8 @@ public enum Category { SALARY(8, "Salary"), OTHER(9, "Other"); - private int categoryNum; - private String categoryName; + private final int categoryNum; + private final String categoryName; Category(int categoryNum, String categoryName) { this.categoryNum = categoryNum; @@ -31,4 +31,8 @@ public static Category fromNumber(int number) { public String getCategoryName() { return categoryName; } + + public int getCategoryNum() { + return categoryNum; + } } From 2e9fba43da196679462fc37baa1d47e95e05cbe2 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Tue, 26 Mar 2024 21:30:29 +0800 Subject: [PATCH 07/15] Add functionality of user choosing categories after add command --- src/main/java/budgetbuddy/BudgetBuddy.java | 2 +- .../transaction/TransactionList.java | 4 ++++ .../java/budgetbuddy/ui/UserInterface.java | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/budgetbuddy/BudgetBuddy.java b/src/main/java/budgetbuddy/BudgetBuddy.java index 791f57eb56..0cb69c345f 100644 --- a/src/main/java/budgetbuddy/BudgetBuddy.java +++ b/src/main/java/budgetbuddy/BudgetBuddy.java @@ -20,7 +20,7 @@ public static void main(String[] args) { String logo = "BUDGET BUDDY"; System.out.println("Hello from\n" + logo); System.out.println("What can I do for you?"); - Scanner in = new Scanner(System.in); + Scanner in = UserInterface.in; TransactionList transactions = null; try { diff --git a/src/main/java/budgetbuddy/transaction/TransactionList.java b/src/main/java/budgetbuddy/transaction/TransactionList.java index 475d268f7d..384af25f4e 100644 --- a/src/main/java/budgetbuddy/transaction/TransactionList.java +++ b/src/main/java/budgetbuddy/transaction/TransactionList.java @@ -1,6 +1,7 @@ package budgetbuddy.transaction; import budgetbuddy.account.Account; +import budgetbuddy.categories.Category; import budgetbuddy.exceptions.EmptyArgumentException; import budgetbuddy.exceptions.InvalidAddTransactionSyntax; import budgetbuddy.exceptions.InvalidIndexException; @@ -96,6 +97,9 @@ public void processTransaction(String input, Account account) Transaction t = parser.parseTransaction(input, account); assert t != null : "Parsed transaction is null"; + UserInterface.listCategories(); + int category = UserInterface.getCategoryNum(); + t.setCategory(Category.fromNumber(category)); addTransaction(t); assert transactions.get(transactions.size() - 1) != null : "Added transaction is null after adding to the list"; String fetchData = String.valueOf(transactions.get(transactions.size() - 1)); diff --git a/src/main/java/budgetbuddy/ui/UserInterface.java b/src/main/java/budgetbuddy/ui/UserInterface.java index 342735d31f..ea1950b0fa 100644 --- a/src/main/java/budgetbuddy/ui/UserInterface.java +++ b/src/main/java/budgetbuddy/ui/UserInterface.java @@ -1,9 +1,11 @@ package budgetbuddy.ui; +import budgetbuddy.categories.Category; import budgetbuddy.transaction.type.Transaction; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Scanner; public class UserInterface { @@ -16,6 +18,22 @@ public class UserInterface { private static final String TAB_SPACE = " "; + public static Scanner in = new Scanner(System.in); + + public static void listCategories(){ + System.out.println(LINE); + System.out.println(TAB_SPACE + "Here are the available categories:"); + for(Category category : Category.values()) { + System.out.println(TAB_SPACE + TAB_SPACE + category.getCategoryName() + ": " + category.getCategoryNum()); + } + System.out.println(LINE); + } + + public static int getCategoryNum(){ + System.out.println("In which category do you want to list this transaction? [Enter number between 1 and 9]"); + String input = in.nextLine(); + return Integer.parseInt(input); + } public static void printDeleteMessage(String transaction, double balance){ String[] parts = transaction.split("\\|"); From 2080d48cf552d257ddea743ae363d27c56eb29b7 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Wed, 27 Mar 2024 20:03:21 +0800 Subject: [PATCH 08/15] Change getCategory method signature to return Category object instead of string --- src/main/java/budgetbuddy/transaction/type/Transaction.java | 6 +++--- src/main/java/budgetbuddy/ui/UserInterface.java | 2 +- src/test/java/budgetbuddy/parser/ParserTest.java | 2 +- .../java/budgetbuddy/transaction/TransactionListTest.java | 4 ++-- .../java/budgetbuddy/transaction/type/TransactionTest.java | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/budgetbuddy/transaction/type/Transaction.java b/src/main/java/budgetbuddy/transaction/type/Transaction.java index 48ba911fce..0fc5719bb1 100644 --- a/src/main/java/budgetbuddy/transaction/type/Transaction.java +++ b/src/main/java/budgetbuddy/transaction/type/Transaction.java @@ -33,8 +33,8 @@ private LocalDate parseDate(String by) { return LocalDate.parse(by, DateTimeFormatter.ofPattern("dd-MM-yyyy")); } - public String getCategory() { - return category.getCategoryName(); + public Category getCategory() { + return category; } public abstract String getTransactionType(); @@ -45,7 +45,7 @@ public String toString() { " Description: " + getDescription() + " | " + " Date: " + getDate() + " | " + " Amount: " + getAmount() + " | " + - " Category: " + getCategory()) ; + " Category: " + getCategory().getCategoryName()) ; } public void setCategory(Category category) { diff --git a/src/main/java/budgetbuddy/ui/UserInterface.java b/src/main/java/budgetbuddy/ui/UserInterface.java index ea1950b0fa..771b8d7db7 100644 --- a/src/main/java/budgetbuddy/ui/UserInterface.java +++ b/src/main/java/budgetbuddy/ui/UserInterface.java @@ -116,7 +116,7 @@ public static void printAllTransactions(ArrayList transactions, dou String description = transaction.getDescription(); LocalDate date = transaction.getDate(); double amount = transaction.getAmount(); - String category = transaction.getCategory(); + String category = transaction.getCategory().getCategoryName(); System.out.printf(TAB_SPACE+TAB_SPACE + "%-5d %-10s %-50.45s %-20s %-15.2f %-15s%n", i + 1, type, description, date, amount, category); diff --git a/src/test/java/budgetbuddy/parser/ParserTest.java b/src/test/java/budgetbuddy/parser/ParserTest.java index 95831bd2fe..cc991fad65 100644 --- a/src/test/java/budgetbuddy/parser/ParserTest.java +++ b/src/test/java/budgetbuddy/parser/ParserTest.java @@ -21,6 +21,6 @@ public void testParseTransaction() throws InvalidTransactionTypeException, Empty assertEquals("Shopping", transaction.getDescription()); assertEquals(50.0f, transaction.getAmount(), 0.001); assertEquals(LocalDate.parse("14-03-2024", DateTimeFormatter.ofPattern("dd-MM-yyyy")), transaction.getDate()); - assertEquals("Personal", transaction.getCategory()); + assertEquals("Personal", transaction.getCategory().getCategoryName()); } } diff --git a/src/test/java/budgetbuddy/transaction/TransactionListTest.java b/src/test/java/budgetbuddy/transaction/TransactionListTest.java index 337203989b..9b008a1843 100644 --- a/src/test/java/budgetbuddy/transaction/TransactionListTest.java +++ b/src/test/java/budgetbuddy/transaction/TransactionListTest.java @@ -34,14 +34,14 @@ public void getTransactions_initiallyEmpty() { @Test public void processTransaction_addsTransaction() throws InvalidTransactionTypeException, InvalidAddTransactionSyntax, EmptyArgumentException { - Transaction testTransaction = new Income("Test", 200,"Personal", "14-03-2024", + Transaction testTransaction = new Income("Test", 200, "Personal", "14-03-2024", account); transactionList.processTransaction("add /t/Income /n/Test /$/200 /d/14-03-2024 /c/Personal", account); assertEquals(1, transactionList.getTransactions().size()); assertEquals(testTransaction.getDescription(), transactionList.getTransactions().get(0).getDescription()); assertEquals(testTransaction.getAmount(), transactionList.getTransactions().get(0).getAmount()); - assertEquals(testTransaction.getCategory(), transactionList.getTransactions().get(0).getCategory()); + assertEquals(testTransaction.getCategory().getCategoryName(), transactionList.getTransactions().get(0).getCategory().getCategoryName()); assertEquals(testTransaction.getDate(), transactionList.getTransactions().get(0).getDate()); } diff --git a/src/test/java/budgetbuddy/transaction/type/TransactionTest.java b/src/test/java/budgetbuddy/transaction/type/TransactionTest.java index 6ae13fb51e..0ec450a178 100644 --- a/src/test/java/budgetbuddy/transaction/type/TransactionTest.java +++ b/src/test/java/budgetbuddy/transaction/type/TransactionTest.java @@ -24,7 +24,7 @@ public void testTransactionConstructor() { new Account()); assertEquals("Groceries", transaction.getDescription()); assertEquals(50.0f, transaction.getAmount(), 0.001); - assertEquals("Food", transaction.getCategory()); + assertEquals("Food", transaction.getCategory().getCategoryName()); LocalDate date = LocalDate.parse("14-03-2024", DateTimeFormatter.ofPattern("dd-MM-yyyy")); assertEquals(date, transaction.getDate()); } @@ -47,7 +47,7 @@ public void testGetAmount() { public void testGetCategory() { Transaction transaction = new Income("Groceries", 50.0f, "Food", "14-03-2024", account); - assertEquals("Food", transaction.getCategory()); + assertEquals("Food", transaction.getCategory().getCategoryName()); } @Test From 75d21102b854af3c66ceba29dd9d955e704762c9 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Wed, 27 Mar 2024 20:13:33 +0800 Subject: [PATCH 09/15] Update DataStorage.java for new category functionality --- .../java/budgetbuddy/storage/DataStorage.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index cb2471323f..54de1925c7 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -1,6 +1,7 @@ package budgetbuddy.storage; import budgetbuddy.account.Account; +import budgetbuddy.categories.Category; import budgetbuddy.transaction.type.Expense; import budgetbuddy.transaction.type.Income; import budgetbuddy.transaction.type.Transaction; @@ -46,23 +47,28 @@ private static void writeToFile(String stringToWrite) throws IOException { private static String getStringToWrite(Transaction t) { LocalDate date = t.getDate(); String stringDate = date.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")); - return t.getDescription() + " ," + t.getCategory() + " ," + t.getTransactionType() + " ," + stringDate + return t.getDescription() + " ," + t.getCategory().getCategoryNum() + " ," + t.getTransactionType() + " ," + stringDate + " ," + t.getAmount() + "\n"; } private Transaction processData(String s, Account account) { String[] transactionInfo = s.split(" ,"); + int categoryNum = Integer.parseInt(transactionInfo[1]); assert transactionInfo.length == 5 : "Invalid transaction information format"; assert transactionInfo[2].equals("Income") || transactionInfo[2].equals("Expense") : "Invalid transaction type"; switch (transactionInfo[2]) { case "Income": - return new Income(transactionInfo[0], Double.parseDouble(transactionInfo[4]), - transactionInfo[1], account); + Income incomeObj = new Income(transactionInfo[0], Double.parseDouble(transactionInfo[4]), + transactionInfo[3], account); + incomeObj.setCategory(Category.fromNumber(categoryNum)); + return incomeObj; case "Expense": - return new Expense(transactionInfo[0], -Double.parseDouble(transactionInfo[4]), - transactionInfo[1], account); + Expense expenseObj = new Expense(transactionInfo[0], -Double.parseDouble(transactionInfo[4]), + transactionInfo[3], account); + expenseObj.setCategory(Category.fromNumber(categoryNum)); + return expenseObj; default: return null; } From 99822582c5bde9f64b9b3b314b31b48bd3657454 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Thu, 28 Mar 2024 10:30:03 +0800 Subject: [PATCH 10/15] Update add command to take in optional category argument --- src/main/java/budgetbuddy/parser/Parser.java | 17 +++++++++++++++-- .../transaction/TransactionList.java | 8 +++++--- .../transaction/type/Transaction.java | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main/java/budgetbuddy/parser/Parser.java b/src/main/java/budgetbuddy/parser/Parser.java index c981a5302c..0750eeb31c 100644 --- a/src/main/java/budgetbuddy/parser/Parser.java +++ b/src/main/java/budgetbuddy/parser/Parser.java @@ -1,6 +1,7 @@ package budgetbuddy.parser; import budgetbuddy.account.Account; +import budgetbuddy.categories.Category; import budgetbuddy.exceptions.EmptyArgumentException; import budgetbuddy.exceptions.InvalidTransactionTypeException; import budgetbuddy.transaction.TransactionList; @@ -20,6 +21,7 @@ public Transaction parseTransaction(String input, Account account) String description = null; String date = null; String amount = null; + String category = null; for(int i = 0; i < parseData.length-1; i++) { switch (parseData[i].trim()) { case "t": @@ -38,6 +40,9 @@ public Transaction parseTransaction(String input, Account account) case "d": date = parseData[i + 1].trim(); break; + case "c": + category = parseData[i + 1].trim(); + break; default: break; } @@ -47,9 +52,17 @@ public Transaction parseTransaction(String input, Account account) if(description.trim().isEmpty() || type.trim().isEmpty()){ throw new EmptyArgumentException("data for the arguments "); } else if (type.equalsIgnoreCase("income")) { - return new Income(description, Double.parseDouble(amount), date, account); + Income income = new Income(description, Double.parseDouble(amount), date, account); + if (category != null){ + income.setCategory(Category.fromNumber(Integer.parseInt(category))); + } + return income; } else if (type.equalsIgnoreCase("expense")) { - return new Expense(description, Double.parseDouble(amount), date, account); + Expense expense = new Expense(description, Double.parseDouble(amount), date, account); + if (category != null){ + expense.setCategory(Category.fromNumber(Integer.parseInt(category))); + } + return expense; } else { throw new InvalidTransactionTypeException(type); } diff --git a/src/main/java/budgetbuddy/transaction/TransactionList.java b/src/main/java/budgetbuddy/transaction/TransactionList.java index 384af25f4e..eedd93b506 100644 --- a/src/main/java/budgetbuddy/transaction/TransactionList.java +++ b/src/main/java/budgetbuddy/transaction/TransactionList.java @@ -97,9 +97,11 @@ public void processTransaction(String input, Account account) Transaction t = parser.parseTransaction(input, account); assert t != null : "Parsed transaction is null"; - UserInterface.listCategories(); - int category = UserInterface.getCategoryNum(); - t.setCategory(Category.fromNumber(category)); + if (t.getCategory() == null) { + UserInterface.listCategories(); + int category = UserInterface.getCategoryNum(); + t.setCategory(Category.fromNumber(category)); + } addTransaction(t); assert transactions.get(transactions.size() - 1) != null : "Added transaction is null after adding to the list"; String fetchData = String.valueOf(transactions.get(transactions.size() - 1)); diff --git a/src/main/java/budgetbuddy/transaction/type/Transaction.java b/src/main/java/budgetbuddy/transaction/type/Transaction.java index 0fc5719bb1..b9052ef7c0 100644 --- a/src/main/java/budgetbuddy/transaction/type/Transaction.java +++ b/src/main/java/budgetbuddy/transaction/type/Transaction.java @@ -8,7 +8,7 @@ public abstract class Transaction { private String description; private double amount; - private Category category = Category.OTHER; + private Category category; private LocalDate date; public Transaction(String description, double amount,String date) { From 8b3a57ede6a229c8afa6cc8663bc90e06413ac17 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Thu, 28 Mar 2024 10:47:58 +0800 Subject: [PATCH 11/15] Update JUnit test cases to match new changes in Category --- .../transaction/TransactionListTest.java | 32 ++++++++++--------- .../transaction/type/TransactionTest.java | 20 ++++++------ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/test/java/budgetbuddy/transaction/TransactionListTest.java b/src/test/java/budgetbuddy/transaction/TransactionListTest.java index 9b008a1843..0a56202692 100644 --- a/src/test/java/budgetbuddy/transaction/TransactionListTest.java +++ b/src/test/java/budgetbuddy/transaction/TransactionListTest.java @@ -1,6 +1,7 @@ package budgetbuddy.transaction; import budgetbuddy.account.Account; +import budgetbuddy.categories.Category; import budgetbuddy.exceptions.EmptyArgumentException; import budgetbuddy.exceptions.InvalidAddTransactionSyntax; import budgetbuddy.exceptions.InvalidIndexException; @@ -34,9 +35,10 @@ public void getTransactions_initiallyEmpty() { @Test public void processTransaction_addsTransaction() throws InvalidTransactionTypeException, InvalidAddTransactionSyntax, EmptyArgumentException { - Transaction testTransaction = new Income("Test", 200, "Personal", "14-03-2024", + Transaction testTransaction = new Income("Test", 200, "14-03-2024", account); - transactionList.processTransaction("add /t/Income /n/Test /$/200 /d/14-03-2024 /c/Personal", account); + testTransaction.setCategory(Category.fromNumber(1)); + transactionList.processTransaction("add /t/Income /n/Test /$/200 /d/14-03-2024 /c/1", account); assertEquals(1, transactionList.getTransactions().size()); assertEquals(testTransaction.getDescription(), transactionList.getTransactions().get(0).getDescription()); @@ -44,35 +46,35 @@ public void processTransaction_addsTransaction() assertEquals(testTransaction.getCategory().getCategoryName(), transactionList.getTransactions().get(0).getCategory().getCategoryName()); assertEquals(testTransaction.getDate(), transactionList.getTransactions().get(0).getDate()); } - @Test + public void processTransaction_withInvalidAddSyntax_throwsInvalidAddTransactionSyntax() { assertThrows(InvalidAddTransactionSyntax.class, () -> transactionList.processTransaction( - "add Expense /n/Shopping /$/50 /d/14-03-2024 /c/Personal", account)); - assertThrows(InvalidAddTransactionSyntax.class, () -> transactionList.processTransaction( - "add /t/Expense Shopping /$/50 /d/14-03-2024 /c/Personal", account)); + "add Expense /n/Shopping /$/50 /d/14-03-2024 /c/2", account)); assertThrows(InvalidAddTransactionSyntax.class, () -> transactionList.processTransaction( - "add /t/Expense /n/Shopping 50 /d/14-03-2024 /c/Personal", account)); + "add /t/Expense Shopping /$/50 /d/14-03-2024 /c/2", account)); assertThrows(InvalidAddTransactionSyntax.class, () -> transactionList.processTransaction( - "add /t/Expense /n/Shopping /$/50 14-03-2024 /c/Personal", account)); + "add /t/Expense /n/Shopping 50 /d/14-03-2024 /c/2", account)); assertThrows(InvalidAddTransactionSyntax.class, () -> transactionList.processTransaction( - "add /t/Expense /n/Shopping /$/50 /d/14-03-2024 Personal", account)); + "add /t/Expense /n/Shopping /$/50 14-03-2024 /c/2", account)); } @Test public void processTransaction_withInvalidTransactionType_throwsTransactionTypeException() { assertThrows(InvalidTransactionTypeException.class, () -> transactionList.processTransaction( - "add /t/Donation /n/Test /$/200 /d/14-03-2024 /c/Personal", account)); + "add /t/Donation /n/Test /$/200 /d/14-03-2024 /c/2", account)); } @Test public void removeTransaction_removesCorrectTransaction() throws EmptyArgumentException, InvalidIndexException { - Transaction testTransaction1 = new Income("Test1", 100, "Category1", + Transaction testTransaction1 = new Income("Test1", 100, "14-03-2024", account); - Transaction testTransaction2 = new Income("Test2", 200, "Category2", + testTransaction1.setCategory(Category.fromNumber(1)); + Transaction testTransaction2 = new Income("Test2", 200, "16-03-2024", account); + testTransaction1.setCategory(Category.fromNumber(2)); transactionList.addTransaction(testTransaction1); transactionList.addTransaction(testTransaction2); @@ -84,7 +86,7 @@ public void removeTransaction_removesCorrectTransaction() throws EmptyArgumentEx @Test public void removeTransaction_withInvalidIndex_throwsIndexOutOfBoundsException() { - Transaction testTransaction = new Income("Test", 200, "Personal", + Transaction testTransaction = new Income("Test", 200, "14-03-2024", account); transactionList.addTransaction(testTransaction); @@ -94,7 +96,7 @@ public void removeTransaction_withInvalidIndex_throwsIndexOutOfBoundsException() @Test public void removeTransaction_withMissingIndex_throwsEmptyArgumentException() { - Transaction testTransaction = new Income("Test", 100, "Personal", + Transaction testTransaction = new Income("Test", 100, "14-03-2024", account); transactionList.addTransaction(testTransaction); @@ -104,7 +106,7 @@ public void removeTransaction_withMissingIndex_throwsEmptyArgumentException() { @Test public void removeTransaction_withInvalidIndex_throwsNumberFormatException() { - Transaction testTransaction = new Income("Test", 100, "Personal", + Transaction testTransaction = new Income("Test", 100, "14-03-2024", account); transactionList.addTransaction(testTransaction); diff --git a/src/test/java/budgetbuddy/transaction/type/TransactionTest.java b/src/test/java/budgetbuddy/transaction/type/TransactionTest.java index 0ec450a178..e117077d80 100644 --- a/src/test/java/budgetbuddy/transaction/type/TransactionTest.java +++ b/src/test/java/budgetbuddy/transaction/type/TransactionTest.java @@ -1,6 +1,7 @@ package budgetbuddy.transaction.type; import budgetbuddy.account.Account; +import budgetbuddy.categories.Category; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -20,39 +21,39 @@ public void setUp() { @Test public void testTransactionConstructor() { - Transaction transaction = new Income("Groceries", 50.0f, "Food", "14-03-2024", + Transaction transaction = new Income("Groceries", 50.0f, "14-03-2024", new Account()); assertEquals("Groceries", transaction.getDescription()); assertEquals(50.0f, transaction.getAmount(), 0.001); - assertEquals("Food", transaction.getCategory().getCategoryName()); LocalDate date = LocalDate.parse("14-03-2024", DateTimeFormatter.ofPattern("dd-MM-yyyy")); assertEquals(date, transaction.getDate()); } @Test public void testGetDescription() { - Transaction transaction = new Income("Groceries", 50.0f, "Food", "14-03-2024", + Transaction transaction = new Income("Groceries", 50.0f, "14-03-2024", account); assertEquals("Groceries", transaction.getDescription()); } @Test public void testGetAmount() { - Transaction transaction = new Income("Groceries", 50.0f, "Food", "14-03-2024", + Transaction transaction = new Income("Groceries", 50.0f, "14-03-2024", account); assertEquals(50.0f, transaction.getAmount(), 0.001); } @Test public void testGetCategory() { - Transaction transaction = new Income("Groceries", 50.0f, "Food", "14-03-2024", + Transaction transaction = new Income("Groceries", 50.0f, "14-03-2024", account); - assertEquals("Food", transaction.getCategory().getCategoryName()); + transaction.setCategory(Category.fromNumber(1)); + assertEquals("Dining", transaction.getCategory().getCategoryName()); } @Test public void testGetDate() { - Transaction transaction = new Income("Groceries", 50.0f, "Food", "14-03-2024", + Transaction transaction = new Income("Groceries", 50.0f, "14-03-2024", account); LocalDate date = LocalDate.parse("14-03-2024", DateTimeFormatter.ofPattern("dd-MM-yyyy")); assertEquals(date, transaction.getDate()); @@ -60,10 +61,11 @@ public void testGetDate() { @Test public void testToString() { - Transaction transaction = new Income("Groceries", 50.0f, "Food", "14-03-2024", + Transaction transaction = new Income("Groceries", 50.0f, "14-03-2024", account); + transaction.setCategory(Category.fromNumber(1)); String expected = " Transaction Type: Income | Description: Groceries | Date: 2024-03-14 | Amount: 50.0 | " + - " Category: Food"; + " Category: Dining"; assertEquals(expected, transaction.toString()); } } From 836b814a3fe5829469fa88365964f775c2ec5793 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Thu, 28 Mar 2024 10:51:57 +0800 Subject: [PATCH 12/15] Refactor long line in DataStorage.java --- src/main/java/budgetbuddy/storage/DataStorage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 54de1925c7..ab8bc0ecd0 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -47,8 +47,8 @@ private static void writeToFile(String stringToWrite) throws IOException { private static String getStringToWrite(Transaction t) { LocalDate date = t.getDate(); String stringDate = date.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")); - return t.getDescription() + " ," + t.getCategory().getCategoryNum() + " ," + t.getTransactionType() + " ," + stringDate - + " ," + t.getAmount() + "\n"; + return t.getDescription() + " ," + t.getCategory().getCategoryNum() + " ," + + t.getTransactionType() + " ," + stringDate + " ," + t.getAmount() + "\n"; } private Transaction processData(String s, Account account) { From fed98bc137e191781b5c74a250d988ddc7f470c6 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Thu, 28 Mar 2024 10:56:28 +0800 Subject: [PATCH 13/15] Refactor long line in TransactionListTest.java --- src/test/java/budgetbuddy/transaction/TransactionListTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/budgetbuddy/transaction/TransactionListTest.java b/src/test/java/budgetbuddy/transaction/TransactionListTest.java index 0a56202692..47a186c3b5 100644 --- a/src/test/java/budgetbuddy/transaction/TransactionListTest.java +++ b/src/test/java/budgetbuddy/transaction/TransactionListTest.java @@ -43,7 +43,8 @@ public void processTransaction_addsTransaction() assertEquals(1, transactionList.getTransactions().size()); assertEquals(testTransaction.getDescription(), transactionList.getTransactions().get(0).getDescription()); assertEquals(testTransaction.getAmount(), transactionList.getTransactions().get(0).getAmount()); - assertEquals(testTransaction.getCategory().getCategoryName(), transactionList.getTransactions().get(0).getCategory().getCategoryName()); + assertEquals(testTransaction.getCategory().getCategoryName(), + transactionList.getTransactions().get(0).getCategory().getCategoryName()); assertEquals(testTransaction.getDate(), transactionList.getTransactions().get(0).getDate()); } @Test From ca8f45513071ecff23a9f31a5706689798af1c93 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Thu, 28 Mar 2024 10:59:54 +0800 Subject: [PATCH 14/15] Update ParserTest.java with new changes --- src/test/java/budgetbuddy/parser/ParserTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/budgetbuddy/parser/ParserTest.java b/src/test/java/budgetbuddy/parser/ParserTest.java index cc991fad65..1deb359728 100644 --- a/src/test/java/budgetbuddy/parser/ParserTest.java +++ b/src/test/java/budgetbuddy/parser/ParserTest.java @@ -17,10 +17,10 @@ public void testParseTransaction() throws InvalidTransactionTypeException, Empty Parser parser = new Parser(); Account account = new Account(); Transaction transaction = parser.parseTransaction("add /t/Income /n/Shopping /$/50 /d/14-03-2024 " + - "/c/Personal", account); + "/c/1", 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()); - assertEquals("Personal", transaction.getCategory().getCategoryName()); + assertEquals("Dining", transaction.getCategory().getCategoryName()); } } From d08ffc138d007267e5a927801616f6789c2467ce Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Thu, 28 Mar 2024 11:03:11 +0800 Subject: [PATCH 15/15] Rename OTHER Category to OTHERS --- src/main/java/budgetbuddy/categories/Category.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/budgetbuddy/categories/Category.java b/src/main/java/budgetbuddy/categories/Category.java index 9967343873..c2ef8219d8 100644 --- a/src/main/java/budgetbuddy/categories/Category.java +++ b/src/main/java/budgetbuddy/categories/Category.java @@ -9,7 +9,7 @@ public enum Category { ENTERTAINMENT(6, "Entertainment"), RENT(7, "Rent"), SALARY(8, "Salary"), - OTHER(9, "Other"); + OTHERS(9, "Others"); private final int categoryNum; private final String categoryName;