From ac72d66e08e65f80e7a2cb691605de4aba25b019 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sat, 13 Apr 2024 21:39:29 +0800 Subject: [PATCH 01/59] Add exeption handling to readAccountFile method in DataStorage class --- .../java/budgetbuddy/storage/DataStorage.java | 43 ++++++++++++++++--- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index c79aff29cd..37ff3897d9 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -130,16 +130,41 @@ private static void createDataFolderIfNotExists() throws IOException { } } - public ArrayList readAccountFile() throws IOException { + public ArrayList readAccountFile() throws IOException, FileCorruptedException { File f = new File(ACCOUNTS_FILE_PATH); Scanner s = new Scanner(f); ArrayList accounts = new ArrayList<>(); while (s.hasNext()) { String[] accountInfo = s.nextLine().split(" ,"); - assert accountInfo.length == 3 : "Invalid account information format"; - accounts.add(new Account(Integer.parseInt(accountInfo[0]), accountInfo[1], - Double.parseDouble(accountInfo[2]))); + int accountNumber; + double balance; + String accountName = accountInfo[1].trim(); + if (accountInfo.length != 3) { + throw new FileCorruptedException("Invalid account information format"); + } + + try { + accountNumber = Integer.parseInt(accountInfo[0]); + } catch (NumberFormatException e) { + throw new FileCorruptedException("Invalid type for account number"); + } + + try { + balance = Double.parseDouble(accountInfo[2]); + } catch (NumberFormatException e) { + throw new FileCorruptedException("Invalid type for account balance"); + } + + if (accountNumber < 1000 || accountNumber > 9999) { + throw new FileCorruptedException("Invalid account number"); + } + + if (accountName.isEmpty()) { + throw new FileCorruptedException("Invalid account name"); + } + + accounts.add(new Account(accountNumber, accountInfo[1], balance)); } return accounts; } @@ -179,7 +204,13 @@ public AccountManager loadAccounts() { } return createNewAccountManager(); } - ArrayList accounts = readAccountFile(); + ArrayList accounts = null; + try { + accounts = readAccountFile(); + } catch (FileCorruptedException e) { + UserInterface.printFileCorruptedError(); + return createNewAccountManager(); + } if (accounts.isEmpty()) { return createNewAccountManager(); } @@ -189,7 +220,7 @@ public AccountManager loadAccounts() { } return new AccountManager(accounts, existingAccountNumbers); } catch (IOException e) { - System.out.println("Error reading accounts file. Creating new account manager."); + UserInterface.printFileCorruptedError(); return createNewAccountManager(); } } From 42991493d4aff08bad061226d0dec944e510adfc Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 00:02:34 +0800 Subject: [PATCH 02/59] Add newline read handling to DataStorage class --- src/main/java/budgetbuddy/storage/DataStorage.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 37ff3897d9..e769683ab1 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -136,10 +136,16 @@ public ArrayList readAccountFile() throws IOException, FileCorruptedExc ArrayList accounts = new ArrayList<>(); while (s.hasNext()) { - String[] accountInfo = s.nextLine().split(" ,"); + String line = s.nextLine(); + if (line.trim().isEmpty()) { + continue; + } + String[] accountInfo = line.split(" ,"); int accountNumber; double balance; String accountName = accountInfo[1].trim(); + + if (accountInfo.length != 3) { throw new FileCorruptedException("Invalid account information format"); } @@ -184,7 +190,11 @@ public ArrayList readTransactionFile() throws IOException { ArrayList transactionList = new ArrayList<>(); try { while (s.hasNext()) { - transactionList.add(parseDataToTransaction(s.nextLine())); + String line = s.nextLine(); + if (line.trim().isEmpty()) { + continue; + } + transactionList.add(parseDataToTransaction(line)); } } catch (FileCorruptedException | InvalidCategoryException e) { UserInterface.printFileCorruptedError(); From 95230bf5f3652d52021bc46cda4bb168705c076d Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 00:15:59 +0800 Subject: [PATCH 03/59] Handle duplicate account number while reading account file --- .../java/budgetbuddy/storage/DataStorage.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 37ff3897d9..86d9cc29a6 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -130,7 +130,8 @@ private static void createDataFolderIfNotExists() throws IOException { } } - public ArrayList readAccountFile() throws IOException, FileCorruptedException { + public ArrayList readAccountFile(ArrayList existingAccountNumbers) + throws IOException, FileCorruptedException { File f = new File(ACCOUNTS_FILE_PATH); Scanner s = new Scanner(f); @@ -164,7 +165,12 @@ public ArrayList readAccountFile() throws IOException, FileCorruptedExc throw new FileCorruptedException("Invalid account name"); } + if (existingAccountNumbers.contains(accountNumber)) { + throw new FileCorruptedException("Duplicate account number"); + } + accounts.add(new Account(accountNumber, accountInfo[1], balance)); + existingAccountNumbers.add(accountNumber); } return accounts; } @@ -204,9 +210,10 @@ public AccountManager loadAccounts() { } return createNewAccountManager(); } + ArrayList existingAccountNumbers = new ArrayList<>(); ArrayList accounts = null; try { - accounts = readAccountFile(); + accounts = readAccountFile(existingAccountNumbers); } catch (FileCorruptedException e) { UserInterface.printFileCorruptedError(); return createNewAccountManager(); @@ -214,10 +221,6 @@ public AccountManager loadAccounts() { if (accounts.isEmpty()) { return createNewAccountManager(); } - ArrayList existingAccountNumbers = new ArrayList<>(); - for (Account account : accounts) { - existingAccountNumbers.add(account.getAccountNumber()); - } return new AccountManager(accounts, existingAccountNumbers); } catch (IOException e) { UserInterface.printFileCorruptedError(); From f1280fe435902f53ff4dcc1279355b2b7f9e3094 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 01:26:05 +0800 Subject: [PATCH 04/59] Handle case where transaction refers to non-existing account --- src/main/java/budgetbuddy/BudgetBuddy.java | 2 +- .../java/budgetbuddy/account/AccountManager.java | 4 ++++ .../java/budgetbuddy/storage/DataStorage.java | 15 ++++++++++----- .../java/budgetbuddy/storage/DataStorageTest.java | 6 +++--- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/budgetbuddy/BudgetBuddy.java b/src/main/java/budgetbuddy/BudgetBuddy.java index 1f8a32d6d5..8fd72ac72f 100644 --- a/src/main/java/budgetbuddy/BudgetBuddy.java +++ b/src/main/java/budgetbuddy/BudgetBuddy.java @@ -37,7 +37,7 @@ public class BudgetBuddy { public BudgetBuddy() { DataStorage dataStorage = new DataStorage(); this.accountManager = dataStorage.loadAccounts(); - this.transactions = dataStorage.loadTransactions(); + this.transactions = dataStorage.loadTransactions(accountManager.getExistingAccountNumbers()); } /** diff --git a/src/main/java/budgetbuddy/account/AccountManager.java b/src/main/java/budgetbuddy/account/AccountManager.java index fab82b4352..10e05a8186 100644 --- a/src/main/java/budgetbuddy/account/AccountManager.java +++ b/src/main/java/budgetbuddy/account/AccountManager.java @@ -109,4 +109,8 @@ public void processEditAccount(String input) throws EmptyArgumentException, Ille public void saveAccounts() { dataStorage.saveAccounts(accounts); } + + public ArrayList getExistingAccountNumbers() { + return existingAccountNumbers; + } } diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 37ff3897d9..376529adfb 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -78,7 +78,8 @@ private static String getStringToWrite(Transaction t) { } // description, categoryNum, type, date, amount, accountNumber, accountName - private Transaction parseDataToTransaction(String s) throws FileCorruptedException, InvalidCategoryException { + private Transaction parseDataToTransaction(String s, ArrayList existingAccountNumbers) + throws FileCorruptedException, InvalidCategoryException { String[] transactionInfo = s.split(" ,"); int categoryNum; try { @@ -107,6 +108,10 @@ private Transaction parseDataToTransaction(String s) throws FileCorruptedExcepti throw new FileCorruptedException("Invalid type for transaction amount"); } + if (!existingAccountNumbers.contains(Integer.parseInt(transactionInfo[5]))) { + throw new FileCorruptedException("Invalid account number"); + } + switch (transactionInfo[2]) { case "Income": Income incomeObj = new Income(Integer.parseInt(transactionInfo[5]), transactionInfo[6], transactionInfo[0], @@ -169,7 +174,7 @@ public ArrayList readAccountFile() throws IOException, FileCorruptedExc return accounts; } - public ArrayList readTransactionFile() throws IOException { + public ArrayList readTransactionFile(ArrayList existingAccountNumbers) throws IOException { createDataFolderIfNotExists(); File f = new File(TRANSACTIONS_FILE_PATH); if (!f.exists()) { @@ -184,7 +189,7 @@ public ArrayList readTransactionFile() throws IOException { ArrayList transactionList = new ArrayList<>(); try { while (s.hasNext()) { - transactionList.add(parseDataToTransaction(s.nextLine())); + transactionList.add(parseDataToTransaction(s.nextLine(), existingAccountNumbers)); } } catch (FileCorruptedException | InvalidCategoryException e) { UserInterface.printFileCorruptedError(); @@ -233,9 +238,9 @@ private AccountManager createNewAccountManager() { return accountManager; } - public TransactionList loadTransactions() { + public TransactionList loadTransactions(ArrayList existingAccountNumbers) { try { - ArrayList transactions = readTransactionFile(); + ArrayList transactions = readTransactionFile(existingAccountNumbers); return new TransactionList(transactions); } catch (IOException e) { return new TransactionList(); diff --git a/src/test/java/budgetbuddy/storage/DataStorageTest.java b/src/test/java/budgetbuddy/storage/DataStorageTest.java index 75625cfb4f..59add344d1 100644 --- a/src/test/java/budgetbuddy/storage/DataStorageTest.java +++ b/src/test/java/budgetbuddy/storage/DataStorageTest.java @@ -28,7 +28,7 @@ public void testSaveTransactions() throws IOException, InvalidCategoryException transactionArrayList.add(t); try { - dataStorage.readTransactionFile(); + dataStorage.readTransactionFile(existingAccountNumbers); dataStorage.saveTransactions(transactionArrayList); File file = new File(DataStorage.TRANSACTIONS_FILE_PATH); @@ -48,10 +48,10 @@ public void testReadFromFile() throws IOException, InvalidCategoryException { "25-03-2024", new Account(1)); t.setCategory(Category.fromNumber(1)); expectedTransactions.add(t); - dataStorage.readTransactionFile(); + dataStorage.readTransactionFile(existingAccountNumbers); dataStorage.saveTransactions(expectedTransactions); try { - ArrayList actualTransactions = dataStorage.readTransactionFile(); + ArrayList actualTransactions = dataStorage.readTransactionFile(existingAccountNumbers); // Check if read transactions match the expected transactions assertEquals(expectedTransactions.size(), actualTransactions.size()); From e84fa8502490088cc23f310c606cd472864633d8 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 01:39:31 +0800 Subject: [PATCH 05/59] Update JUnit tests to match code updation --- src/test/java/budgetbuddy/storage/DataStorageTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/budgetbuddy/storage/DataStorageTest.java b/src/test/java/budgetbuddy/storage/DataStorageTest.java index 59add344d1..7ce4310987 100644 --- a/src/test/java/budgetbuddy/storage/DataStorageTest.java +++ b/src/test/java/budgetbuddy/storage/DataStorageTest.java @@ -26,7 +26,8 @@ public void testSaveTransactions() throws IOException, InvalidCategoryException "25-03-2024", new Account(1)); t.setCategory(Category.fromNumber(1)); transactionArrayList.add(t); - + ArrayList existingAccountNumbers = new ArrayList<>(); + existingAccountNumbers.add(1); try { dataStorage.readTransactionFile(existingAccountNumbers); dataStorage.saveTransactions(transactionArrayList); @@ -48,6 +49,8 @@ public void testReadFromFile() throws IOException, InvalidCategoryException { "25-03-2024", new Account(1)); t.setCategory(Category.fromNumber(1)); expectedTransactions.add(t); + ArrayList existingAccountNumbers = new ArrayList<>(); + existingAccountNumbers.add(1); dataStorage.readTransactionFile(existingAccountNumbers); dataStorage.saveTransactions(expectedTransactions); try { From dcc2f9c4596ad6522d7ec43304b8941f1177d03c Mon Sep 17 00:00:00 2001 From: isaaceng7 <110762696+isaaceng7@users.noreply.github.com> Date: Sun, 14 Apr 2024 15:59:12 +0800 Subject: [PATCH 06/59] Add JUnit test for list account and category --- .../transaction/TransactionListTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/test/java/budgetbuddy/transaction/TransactionListTest.java b/src/test/java/budgetbuddy/transaction/TransactionListTest.java index b3c1c78bc1..f2c0da8ff6 100644 --- a/src/test/java/budgetbuddy/transaction/TransactionListTest.java +++ b/src/test/java/budgetbuddy/transaction/TransactionListTest.java @@ -14,6 +14,8 @@ import budgetbuddy.transaction.type.Transaction; import java.io.IOException; +import java.sql.Array; +import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -22,12 +24,14 @@ public class TransactionListTest { private TransactionList transactionList; private Account account; + private Account account2; private AccountManager accountManager; @BeforeEach public void setUp() throws IOException { transactionList = new TransactionList(); account = new Account(1); + account2 = new Account(2); accountManager = new AccountManager(); accountManager.getAccounts().add(account); // need to change this } @@ -122,4 +126,51 @@ public void removeTransaction_withInvalidIndex_throwsNumberFormatException() { assertThrows(NumberFormatException.class, () -> transactionList.removeTransaction( "delete one", accountManager)); } + + @Test + public void getAccountTransactions_filtersCorrectTransactions() throws InvalidCategoryException { + Transaction testTransaction1 = new Income(1, "test","Test1", 100, + "15-03-2024", account); + testTransaction1.setCategory(Category.fromNumber(1)); + Transaction testTransaction2 = new Income(1, "test","Test2", 200, + "16-03-2024", account); + testTransaction2.setCategory(Category.fromNumber(1)); + Transaction testTransaction3 = new Income(2, "test","Test3", 300, + "18-03-2024", account2); + testTransaction3.setCategory(Category.fromNumber(1)); + transactionList.addTransaction(testTransaction1); + transactionList.addTransaction(testTransaction2); + transactionList.addTransaction(testTransaction3); + + ArrayList accountTransactions; + accountTransactions = TransactionList.getAccountTransactions(transactionList.getTransactions(),1); + + assertEquals(2, accountTransactions.size()); + assertEquals(testTransaction1, accountTransactions.get(0)); + assertEquals(testTransaction2, accountTransactions.get(1)); + } + + @Test + public void getCategoryTransactions_filtersCorrectTransactions() throws InvalidCategoryException { + Transaction testTransaction1 = new Income(1, "test","Test1", 100, + "15-03-2024", account); + testTransaction1.setCategory(Category.fromNumber(1)); + Transaction testTransaction2 = new Income(1, "test","Test2", 200, + "16-03-2024", account); + testTransaction2.setCategory(Category.fromNumber(1)); + Transaction testTransaction3 = new Income(1, "test","Test3", 300, + "18-03-2024", account); + testTransaction3.setCategory(Category.fromNumber(5)); + transactionList.addTransaction(testTransaction1); + transactionList.addTransaction(testTransaction2); + transactionList.addTransaction(testTransaction3); + + ArrayList categoryTransactions; + categoryTransactions = TransactionList.getCategoryTransactions(transactionList.getTransactions(), + Category.fromNumber(1)); + + assertEquals(2, categoryTransactions.size()); + assertEquals(testTransaction1, categoryTransactions.get(0)); + assertEquals(testTransaction2, categoryTransactions.get(1)); + } } From 43b433566b219edbfae2aad538155b7abb1c7d39 Mon Sep 17 00:00:00 2001 From: isaaceng7 <110762696+isaaceng7@users.noreply.github.com> Date: Sun, 14 Apr 2024 16:07:21 +0800 Subject: [PATCH 07/59] Update list by account output text --- src/main/java/budgetbuddy/ui/UserInterface.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/budgetbuddy/ui/UserInterface.java b/src/main/java/budgetbuddy/ui/UserInterface.java index 3d537733fe..2cfb491d6e 100644 --- a/src/main/java/budgetbuddy/ui/UserInterface.java +++ b/src/main/java/budgetbuddy/ui/UserInterface.java @@ -300,6 +300,7 @@ public static String getEndDate() { public static void printAccountList(ArrayList accounts) { int maxIndex = accounts.size(); System.out.println(LINE); + System.out.println("Please select an account to view..."); System.out.println(TAB_SPACE + "Your accounts:"); System.out.println(TAB_SPACE + ACCOUNT_TABLE_BORDER); System.out.printf(TAB_SPACE + TAB_SPACE + "%-20s %-30s", "Account Number", @@ -318,7 +319,7 @@ public static void printAccountList(ArrayList accounts) { public static String getSelectedAccountNumber(ArrayList accounts) { printAccountList(accounts); - System.out.print("Select an account number: "); + System.out.print("Account number: "); String data = in.next(); in.nextLine(); return data; From 2406ad30f47dce3cc0f23a45bbb7fb0caa4fd2f1 Mon Sep 17 00:00:00 2001 From: isaaceng7 <110762696+isaaceng7@users.noreply.github.com> Date: Sun, 14 Apr 2024 16:14:05 +0800 Subject: [PATCH 08/59] Remove unused import --- src/test/java/budgetbuddy/transaction/TransactionListTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/budgetbuddy/transaction/TransactionListTest.java b/src/test/java/budgetbuddy/transaction/TransactionListTest.java index f2c0da8ff6..aadb24fe39 100644 --- a/src/test/java/budgetbuddy/transaction/TransactionListTest.java +++ b/src/test/java/budgetbuddy/transaction/TransactionListTest.java @@ -14,7 +14,6 @@ import budgetbuddy.transaction.type.Transaction; import java.io.IOException; -import java.sql.Array; import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; From 15a57e27ef789736061b44981cc6cc02b0780285 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 17:55:45 +0800 Subject: [PATCH 09/59] Create AccountTest class --- src/test/java/budgetbuddy/account/AccountTest.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/test/java/budgetbuddy/account/AccountTest.java diff --git a/src/test/java/budgetbuddy/account/AccountTest.java b/src/test/java/budgetbuddy/account/AccountTest.java new file mode 100644 index 0000000000..1a52d8b4d5 --- /dev/null +++ b/src/test/java/budgetbuddy/account/AccountTest.java @@ -0,0 +1,2 @@ +package budgetbuddy.account;public class AccountTest { +} From bdaa92b9f650d96afa5accf09e267f18c2417e4a Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 17:56:10 +0800 Subject: [PATCH 10/59] Add JUnit Test cases to AccountTest class --- .../java/budgetbuddy/account/AccountTest.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/test/java/budgetbuddy/account/AccountTest.java b/src/test/java/budgetbuddy/account/AccountTest.java index 1a52d8b4d5..41b1f735a8 100644 --- a/src/test/java/budgetbuddy/account/AccountTest.java +++ b/src/test/java/budgetbuddy/account/AccountTest.java @@ -1,2 +1,37 @@ -package budgetbuddy.account;public class AccountTest { +package budgetbuddy.account; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class AccountTest { + + @Test + void creatingAccountWithValidParametersShouldSucceed() { + Account account = new Account(1234, "Test Account", 1000.00); + assertEquals(1234, account.getAccountNumber()); + assertEquals("Test Account", account.getName()); + assertEquals(1000.00, account.getBalance()); + } + + @Test + void settingBalanceShouldUpdateBalance() { + Account account = new Account(1234, "Test Account", 1000.00); + account.setBalance(2000.00); + assertEquals(2000.00, account.getBalance()); + } + + @Test + void settingNameShouldUpdateName() { + Account account = new Account(1234, "Test Account", 1000.00); + account.setName("Updated Account"); + assertEquals("Updated Account", account.getName()); + } + + @Test + void toStringShouldReturnCorrectFormat() { + Account account = new Account(1234, "Test Account", 1000.00); + String expectedString = " Account Number: 1234 | Name: Test Account | Balance: 1000.0"; + assertEquals(expectedString, account.toString()); + } } From b2b387f7211e433ccbc2b908593bdb25a71d932f Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 18:00:23 +0800 Subject: [PATCH 11/59] Create AccountManagerTest class --- src/test/java/budgetbuddy/account/AccountManagerTest.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/test/java/budgetbuddy/account/AccountManagerTest.java diff --git a/src/test/java/budgetbuddy/account/AccountManagerTest.java b/src/test/java/budgetbuddy/account/AccountManagerTest.java new file mode 100644 index 0000000000..28130f10ea --- /dev/null +++ b/src/test/java/budgetbuddy/account/AccountManagerTest.java @@ -0,0 +1,4 @@ +package budgetbuddy.account; + +public class AccountManagerTest { +} From 6a222f39c4bcd23dc1ed15db29ed35b9217a21b6 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 18:30:08 +0800 Subject: [PATCH 12/59] Add JUnit Test cases to AccountManagerTest class --- .../account/AccountManagerTest.java | 51 ++++++++++++++++++- .../java/budgetbuddy/account/AccountTest.java | 2 +- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/test/java/budgetbuddy/account/AccountManagerTest.java b/src/test/java/budgetbuddy/account/AccountManagerTest.java index 28130f10ea..7ecb2b1e38 100644 --- a/src/test/java/budgetbuddy/account/AccountManagerTest.java +++ b/src/test/java/budgetbuddy/account/AccountManagerTest.java @@ -1,4 +1,53 @@ package budgetbuddy.account; +import budgetbuddy.exceptions.EmptyArgumentException; +import budgetbuddy.exceptions.InvalidArgumentSyntaxException; +import budgetbuddy.exceptions.InvalidIndexException; +import budgetbuddy.transaction.TransactionList; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + public class AccountManagerTest { -} + + @Test + void addingAccountShouldIncreaseExistingAccountNumbersSize() { + AccountManager accountManager = new AccountManager(); + accountManager.addAccount("Test Account", 1000.00); + assertEquals(1, accountManager.getExistingAccountNumbers().size()); + } + + @Test + void addingAccountShouldGenerateUniqueAccountNumber() { + AccountManager accountManager = new AccountManager(); + accountManager.addAccount("Test Account", 1000.00); + accountManager.addAccount("Test Account 2", 2000.00); + assertNotEquals(accountManager.getAccount(0).getAccountNumber(), accountManager.getAccount(1).getAccountNumber()); + } + + @Test + void removingAccountShouldDecreaseExistingAccountNumbersSize() throws InvalidIndexException, InvalidArgumentSyntaxException, EmptyArgumentException { + AccountManager accountManager = new AccountManager(); + accountManager.addAccount("Test Account", 1000.00); + accountManager.addAccount("Test Account2", 1000.00); + accountManager.removeAccount("delete-acc " + String.valueOf(accountManager.getAccounts().get(1).getAccountNumber()), new TransactionList()); + assertEquals(1, accountManager.getExistingAccountNumbers().size()); + } + + @Test + void getAccountByAccountNumberShouldReturnCorrectAccount() { + AccountManager accountManager = new AccountManager(); + accountManager.addAccount("Test Account", 1000.00); + int accountNumber = accountManager.getAccount(0).getAccountNumber(); + assertEquals("Test Account", accountManager.getAccountByAccountNumber(accountNumber).getName()); + } + + @Test + void getAccountByInvalidAccountNumberShouldThrowException() { + AccountManager accountManager = new AccountManager(); + accountManager.addAccount("Test Account", 1000.00); + assertThrows(IllegalArgumentException.class, () -> accountManager.getAccountByAccountNumber(9999)); + } + + +} \ No newline at end of file diff --git a/src/test/java/budgetbuddy/account/AccountTest.java b/src/test/java/budgetbuddy/account/AccountTest.java index 41b1f735a8..4092972ac0 100644 --- a/src/test/java/budgetbuddy/account/AccountTest.java +++ b/src/test/java/budgetbuddy/account/AccountTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -class AccountTest { +public class AccountTest { @Test void creatingAccountWithValidParametersShouldSucceed() { From cc966f0a4fd95e2ff4c6352ea44aae12db7d4e3d Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 18:40:49 +0800 Subject: [PATCH 13/59] Create IncomeTest class --- src/test/java/budgetbuddy/transaction/type/IncomeTest.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/test/java/budgetbuddy/transaction/type/IncomeTest.java diff --git a/src/test/java/budgetbuddy/transaction/type/IncomeTest.java b/src/test/java/budgetbuddy/transaction/type/IncomeTest.java new file mode 100644 index 0000000000..61305e8db7 --- /dev/null +++ b/src/test/java/budgetbuddy/transaction/type/IncomeTest.java @@ -0,0 +1,2 @@ +package budgetbuddy.transaction.type;public class IncomeTest { +} From 756af17453ea2afbc1a8067ae2e2782c6cf0882a Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 18:41:07 +0800 Subject: [PATCH 14/59] Add JUnit Test cases to IncomeTest class --- .../transaction/type/IncomeTest.java | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/test/java/budgetbuddy/transaction/type/IncomeTest.java b/src/test/java/budgetbuddy/transaction/type/IncomeTest.java index 61305e8db7..5548805e49 100644 --- a/src/test/java/budgetbuddy/transaction/type/IncomeTest.java +++ b/src/test/java/budgetbuddy/transaction/type/IncomeTest.java @@ -1,2 +1,49 @@ -package budgetbuddy.transaction.type;public class IncomeTest { -} +package budgetbuddy.transaction.type; + +import budgetbuddy.account.Account; +import budgetbuddy.transaction.type.Income; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class IncomeTest { + private Income income; + private Account account; + + @BeforeEach + void setUp() { + account = new Account(1, "Test Account", 0.0); + income = new Income(1, "Test Account", "Test Income", 100.0, "01-01-2023", account); + } + + @Test + void incomeIncreasesAccountBalance() { + assertEquals(100.0, account.getBalance()); + } + + @Test + void incomeHasCorrectType() { + assertEquals("Income", income.getTransactionType()); + } + + @Test + void incomeWithNegativeAmountThrowsAssertionError() { + assertThrows(AssertionError.class, () -> new Income(1, "Test Account", "Test Income", -100.0, "01-01-2023", account)); + } + + @Test + void incomeWithNullDescriptionThrowsAssertionError() { + assertThrows(AssertionError.class, () -> new Income(1, "Test Account", null, 100.0, "01-01-2023", account)); + } + + @Test + void incomeWithEmptyDescriptionThrowsAssertionError() { + assertThrows(AssertionError.class, () -> new Income(1, "Test Account", "", 100.0, "01-01-2023", account)); + } + + @Test + void incomeWithNullAccountThrowsAssertionError() { + assertThrows(AssertionError.class, () -> new Income(1, "Test Account", "Test Income", 100.0, "01-01-2023", null)); + } +} \ No newline at end of file From a180c5bed1c0f138825b3182ee3e04cc2446f633 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 18:44:55 +0800 Subject: [PATCH 15/59] Create IncomeTest class --- src/test/java/budgetbuddy/transaction/type/ExpenseTest.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/test/java/budgetbuddy/transaction/type/ExpenseTest.java diff --git a/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java b/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java new file mode 100644 index 0000000000..e92526e383 --- /dev/null +++ b/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java @@ -0,0 +1,2 @@ +package budgetbuddy.transaction.type;public class ExpenseTest { +} From 248f1a5875b77f7d5a5cea8ba2a4a18988d65c22 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 18:45:20 +0800 Subject: [PATCH 16/59] Add JUnit Test cases to ExpenseTest class --- .../transaction/type/ExpenseTest.java | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java b/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java index e92526e383..f15bb60d57 100644 --- a/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java +++ b/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java @@ -1,2 +1,44 @@ -package budgetbuddy.transaction.type;public class ExpenseTest { -} +package budgetbuddy.transaction.type; + +import budgetbuddy.account.Account; +import budgetbuddy.transaction.type.Expense; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ExpenseTest { + private Expense expense; + private Account account; + + @BeforeEach + void setUp() { + account = new Account(1, "Test Account", 0.0); + expense = new Expense(1, "Test Account", "Test Expense", 100.0, "01-01-2023", account); + } + + @Test + void expenseDecreasesAccountBalance() { + assertEquals(-100.0, account.getBalance()); + } + + @Test + void expenseHasCorrectType() { + assertEquals("Expense", expense.getTransactionType()); + } + + @Test + void expenseWithNullDescriptionThrowsAssertionError() { + assertThrows(AssertionError.class, () -> new Expense(1, "Test Account", null, 100.0, "01-01-2023", account)); + } + + @Test + void expenseWithEmptyDescriptionThrowsAssertionError() { + assertThrows(AssertionError.class, () -> new Expense(1, "Test Account", "", 100.0, "01-01-2023", account)); + } + + @Test + void expenseWithNullAccountThrowsAssertionError() { + assertThrows(AssertionError.class, () -> new Expense(1, "Test Account", "Test Expense", 100.0, "01-01-2023", null)); + } +} \ No newline at end of file From f48d85acb9417724b6f38baed122123a1c1062a1 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 18:47:41 +0800 Subject: [PATCH 17/59] Fix checkStyle issues --- .../budgetbuddy/account/AccountManagerTest.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/test/java/budgetbuddy/account/AccountManagerTest.java b/src/test/java/budgetbuddy/account/AccountManagerTest.java index 7ecb2b1e38..e99f6d993f 100644 --- a/src/test/java/budgetbuddy/account/AccountManagerTest.java +++ b/src/test/java/budgetbuddy/account/AccountManagerTest.java @@ -6,7 +6,9 @@ import budgetbuddy.transaction.TransactionList; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class AccountManagerTest { @@ -22,15 +24,18 @@ void addingAccountShouldGenerateUniqueAccountNumber() { AccountManager accountManager = new AccountManager(); accountManager.addAccount("Test Account", 1000.00); accountManager.addAccount("Test Account 2", 2000.00); - assertNotEquals(accountManager.getAccount(0).getAccountNumber(), accountManager.getAccount(1).getAccountNumber()); + assertNotEquals(accountManager.getAccount(0).getAccountNumber(), accountManager + .getAccount(1).getAccountNumber()); } @Test - void removingAccountShouldDecreaseExistingAccountNumbersSize() throws InvalidIndexException, InvalidArgumentSyntaxException, EmptyArgumentException { + void removingAccountShouldDecreaseExistingAccountNumbersSize() + throws InvalidIndexException, InvalidArgumentSyntaxException, EmptyArgumentException { AccountManager accountManager = new AccountManager(); accountManager.addAccount("Test Account", 1000.00); accountManager.addAccount("Test Account2", 1000.00); - accountManager.removeAccount("delete-acc " + String.valueOf(accountManager.getAccounts().get(1).getAccountNumber()), new TransactionList()); + accountManager.removeAccount("delete-acc " + String.valueOf(accountManager.getAccounts().get(1) + .getAccountNumber()), new TransactionList()); assertEquals(1, accountManager.getExistingAccountNumbers().size()); } @@ -50,4 +55,4 @@ void getAccountByInvalidAccountNumberShouldThrowException() { } -} \ No newline at end of file +} From b11ad9a755555e6a5fdf2b565ff5c858969800fe Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 18:50:13 +0800 Subject: [PATCH 18/59] Fix checkStyle issues --- .../transaction/type/ExpenseTest.java | 18 +++++++++------- .../transaction/type/IncomeTest.java | 21 ++++++++++++------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java b/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java index f15bb60d57..72fc46f1be 100644 --- a/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java +++ b/src/test/java/budgetbuddy/transaction/type/ExpenseTest.java @@ -1,11 +1,11 @@ package budgetbuddy.transaction.type; import budgetbuddy.account.Account; -import budgetbuddy.transaction.type.Expense; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class ExpenseTest { private Expense expense; @@ -14,7 +14,8 @@ class ExpenseTest { @BeforeEach void setUp() { account = new Account(1, "Test Account", 0.0); - expense = new Expense(1, "Test Account", "Test Expense", 100.0, "01-01-2023", account); + expense = new Expense(1, "Test Account", "Test Expense", 100.0, + "01-01-2023", account); } @Test @@ -29,16 +30,19 @@ void expenseHasCorrectType() { @Test void expenseWithNullDescriptionThrowsAssertionError() { - assertThrows(AssertionError.class, () -> new Expense(1, "Test Account", null, 100.0, "01-01-2023", account)); + assertThrows(AssertionError.class, () -> new Expense(1, "Test Account", + null, 100.0, "01-01-2023", account)); } @Test void expenseWithEmptyDescriptionThrowsAssertionError() { - assertThrows(AssertionError.class, () -> new Expense(1, "Test Account", "", 100.0, "01-01-2023", account)); + assertThrows(AssertionError.class, () -> new Expense(1, "Test Account", "", + 100.0, "01-01-2023", account)); } @Test void expenseWithNullAccountThrowsAssertionError() { - assertThrows(AssertionError.class, () -> new Expense(1, "Test Account", "Test Expense", 100.0, "01-01-2023", null)); + assertThrows(AssertionError.class, () -> new Expense(1, "Test Account", + "Test Expense", 100.0, "01-01-2023", null)); } -} \ No newline at end of file +} diff --git a/src/test/java/budgetbuddy/transaction/type/IncomeTest.java b/src/test/java/budgetbuddy/transaction/type/IncomeTest.java index 5548805e49..e6ef40af8e 100644 --- a/src/test/java/budgetbuddy/transaction/type/IncomeTest.java +++ b/src/test/java/budgetbuddy/transaction/type/IncomeTest.java @@ -1,11 +1,11 @@ package budgetbuddy.transaction.type; import budgetbuddy.account.Account; -import budgetbuddy.transaction.type.Income; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class IncomeTest { private Income income; @@ -14,7 +14,8 @@ public class IncomeTest { @BeforeEach void setUp() { account = new Account(1, "Test Account", 0.0); - income = new Income(1, "Test Account", "Test Income", 100.0, "01-01-2023", account); + income = new Income(1, "Test Account", "Test Income", 100.0, + "01-01-2023", account); } @Test @@ -29,21 +30,25 @@ void incomeHasCorrectType() { @Test void incomeWithNegativeAmountThrowsAssertionError() { - assertThrows(AssertionError.class, () -> new Income(1, "Test Account", "Test Income", -100.0, "01-01-2023", account)); + assertThrows(AssertionError.class, () -> new Income(1, "Test Account", + "Test Income", -100.0, "01-01-2023", account)); } @Test void incomeWithNullDescriptionThrowsAssertionError() { - assertThrows(AssertionError.class, () -> new Income(1, "Test Account", null, 100.0, "01-01-2023", account)); + assertThrows(AssertionError.class, () -> new Income(1, "Test Account", + null, 100.0, "01-01-2023", account)); } @Test void incomeWithEmptyDescriptionThrowsAssertionError() { - assertThrows(AssertionError.class, () -> new Income(1, "Test Account", "", 100.0, "01-01-2023", account)); + assertThrows(AssertionError.class, () -> new Income(1, "Test Account", "", + 100.0, "01-01-2023", account)); } @Test void incomeWithNullAccountThrowsAssertionError() { - assertThrows(AssertionError.class, () -> new Income(1, "Test Account", "Test Income", 100.0, "01-01-2023", null)); + assertThrows(AssertionError.class, () -> new Income(1, "Test Account", + "Test Income", 100.0, "01-01-2023", null)); } -} \ No newline at end of file +} From 562a9196ce4ab2540861bc679095921ce84d8e8b Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 21:13:07 +0800 Subject: [PATCH 19/59] Fix clearing of account file if FileCorruptedException thrown --- src/main/java/budgetbuddy/storage/DataStorage.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 0c3934902d..4f3d175d80 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -231,6 +231,7 @@ public AccountManager loadAccounts() { accounts = readAccountFile(existingAccountNumbers); } catch (FileCorruptedException e) { UserInterface.printFileCorruptedError(); + FileWriter fw = new FileWriter(ACCOUNTS_FILE_PATH, false); return createNewAccountManager(); } if (accounts.isEmpty()) { From c1f0de447b242704f0f3393b3ef5bb080f2451f3 Mon Sep 17 00:00:00 2001 From: isaaceng7 <110762696+isaaceng7@users.noreply.github.com> Date: Sun, 14 Apr 2024 21:27:03 +0800 Subject: [PATCH 20/59] Enhance PPP --- docs/team/isaaceng7.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/team/isaaceng7.md b/docs/team/isaaceng7.md index f9e3cc36b8..f844181a04 100644 --- a/docs/team/isaaceng7.md +++ b/docs/team/isaaceng7.md @@ -6,14 +6,24 @@ finances. It allows users to track their income and expenses across multiple acc insights into their financial activities. It is optimized for use via a Command Line Interface (CLI) and is written in Java, and has about 3 kLoC. +## Summary of Contributions Given below are my contributions to the project. +* **Code Contributed**: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=isaaceng7&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) * **List Feature**: Added the ability to view existing transactions. * What it does: allows users to view their existing transactions. * Justification: this feature is key to the BudgetBuddy as users need to be aware of their finances through their transactions. - * Highlights: the list feature is enhanced to support viewing transactions that are of a certain duration, a specific account and category. -* **Code Contributed**: [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=isaaceng7&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) + * Enhancements: users can choose between 6 different types of list to view: + 1. All Transactions + 2. Past Week Transactions + 3. Past Month Transactions + 4. Custom Date Transactions + 5. Account Transactions + 6. Category Transactions * **Documentation**: * User Guide: - * Added documentation for the feature `list`. + * Added documentation for the `list` feature. * Developer Guide: - * Added implementation details for the feature `list`. + * Added implementation details for the `list` feature. + * Added architecture diagram of BudgetBuddy. +* **Community**: + * Reported bugs and suggestions for other teams in class and PE-D. \ No newline at end of file From b673593fdd97d8ef97e3ef3a7fc5c4bca4c41705 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 21:45:00 +0800 Subject: [PATCH 21/59] Add header comments to Account class --- .../java/budgetbuddy/account/Account.java | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/src/main/java/budgetbuddy/account/Account.java b/src/main/java/budgetbuddy/account/Account.java index b2a7d84f22..c8cf84e12b 100644 --- a/src/main/java/budgetbuddy/account/Account.java +++ b/src/main/java/budgetbuddy/account/Account.java @@ -1,46 +1,91 @@ package budgetbuddy.account; +/** + * Represents an account in the budget buddy system. + */ public class Account { private final int accountNumber; private String name; private double balance; + /** + * Creates an account with the given account number, and default name and balance. + * + * @param accountNumber the account number + */ public Account(int accountNumber) { this.accountNumber = accountNumber; this.name = ""; this.balance = 0.00; } + /** + * Creates an account with the given account number, name and balance. + * + * @param accountNumber the account number + * @param name the name + * @param balance the balance + */ public Account(int accountNumber, String name, double balance) { this.accountNumber = accountNumber; this.name = name; this.balance = balance; } + /** + * Returns the current balance of the account. + * + * @return the current balance + */ public double getBalance() { return balance; } + /** + * Sets the balance of the account to the given amount. + * + * @param balance the new balance + */ public void setBalance(double balance) { this.balance = balance; } + /** + * Returns the account number. + * + * @return the account number + */ public int getAccountNumber() { return accountNumber; } + /** + * Returns the name of the account. + * + * @return the name of the account + */ public String getName() { return name; } + /** + * Sets the name of the account to the given name. + * + * @param name the new name + */ public void setName(String name) { this.name = name; } + /** + * Returns a string representation of the account, including the account number, name, and balance. + * + * @return a string representation of the account + */ @Override public String toString() { - return (" Account Number: " + getAccountNumber() + " | " + + return (" Account Number: " + getAccountNumber() + " | " + " Name: " + getName() + " | " + - " Balance: " + getBalance()) ; + " Balance: " + getBalance()); } } From 017e5e6ef8d9ddc2eb0cba14514dc545452088dd Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 21:50:44 +0800 Subject: [PATCH 22/59] Add header comments to AccountManager class --- .../budgetbuddy/account/AccountManager.java | 82 ++++++++++++++++++- 1 file changed, 78 insertions(+), 4 deletions(-) diff --git a/src/main/java/budgetbuddy/account/AccountManager.java b/src/main/java/budgetbuddy/account/AccountManager.java index 10e05a8186..12aa59deec 100644 --- a/src/main/java/budgetbuddy/account/AccountManager.java +++ b/src/main/java/budgetbuddy/account/AccountManager.java @@ -12,6 +12,9 @@ import java.util.ArrayList; import java.util.Random; +/** + * Manages the accounts in the budget buddy system. + */ public class AccountManager { public static final int INDEX_OFFSET = 1; @@ -19,29 +22,49 @@ public class AccountManager { private final ArrayList accounts; private final ArrayList existingAccountNumbers; + /** + * Creates an AccountManager with empty account and account number lists. + */ public AccountManager() { this.accounts = new ArrayList<>(); this.existingAccountNumbers = new ArrayList<>(); } + /** + * Creates an AccountManager with the given account and account number lists. + * + * @param accounts the list of accounts + * @param existingAccountNumbers the list of existing account numbers + */ public AccountManager(ArrayList accounts, ArrayList existingAccountNumbers) { this.accounts = accounts; this.existingAccountNumbers = existingAccountNumbers; } + /** + * Adds an account with the given name and initial balance. + * + * @param name the name of the account + * @param initialBalance the initial balance of the account + */ public void addAccount(String name, double initialBalance) { int newAccountNumber = generateAccountNumber(); accounts.add(new Account(newAccountNumber, name, initialBalance)); existingAccountNumbers.add(newAccountNumber); } + /** + * Generates a unique four-digit account number. + * + * @return the generated account number + */ public int generateAccountNumber() { Random random = new Random(); boolean noMatchFound = true; int fourDigitNumber; do { fourDigitNumber = 1000 + random.nextInt(9000); - for (int accountNumber: existingAccountNumbers) { + for (int accountNumber : existingAccountNumbers) { if (accountNumber == fourDigitNumber) { noMatchFound = false; break; @@ -52,11 +75,19 @@ public int generateAccountNumber() { return fourDigitNumber; } + /** + * Processes the addition of an account from the given input. + * + * @param input the input string + * @throws InvalidArgumentSyntaxException if the input syntax is invalid + * @throws NumberFormatException if the input contains an invalid number + * @throws EmptyArgumentException if the input is empty + */ public void processAddAccount(String input) throws InvalidArgumentSyntaxException, NumberFormatException, EmptyArgumentException { String[] arguments = {"/n/", "/$/"}; - for (String argument: arguments) { + for (String argument : arguments) { if (!input.contains(argument)) { throw new InvalidArgumentSyntaxException("Invalid add account syntax."); } @@ -66,6 +97,16 @@ public void processAddAccount(String input) UserInterface.printAddAccountMessage(getAccount(accounts.size() - INDEX_OFFSET).toString()); } + /** + * Removes an account with the given input and updates the transaction list. + * + * @param input the input string + * @param transactions the transaction list + * @throws NumberFormatException if the input contains an invalid number + * @throws InvalidArgumentSyntaxException if the input syntax is invalid + * @throws EmptyArgumentException if the input is empty + * @throws InvalidIndexException if the input contains an invalid index + */ public void removeAccount(String input, TransactionList transactions) throws NumberFormatException, InvalidArgumentSyntaxException, EmptyArgumentException, InvalidIndexException { @@ -81,12 +122,25 @@ public void removeAccount(String input, TransactionList transactions) UserInterface.printDeleteAccountMessage(accountRemoved.toString(), transactionsRemoved); } - public Account getAccount(int accountId){ + /** + * Returns the account with the given account ID. + * + * @param accountId the account ID + * @return the account + */ + public Account getAccount(int accountId) { return accounts.get(accountId); } + /** + * Returns the account with the given account number. + * + * @param accountNumber the account number + * @return the account + * @throws IllegalArgumentException if the account is not found + */ public Account getAccountByAccountNumber(int accountNumber) { - for (Account account: accounts) { + for (Account account : accounts) { if (account.getAccountNumber() == accountNumber) { return account; } @@ -94,10 +148,22 @@ public Account getAccountByAccountNumber(int accountNumber) { throw new IllegalArgumentException("Account not found."); } + /** + * Returns the list of accounts. + * + * @return the list of accounts + */ public ArrayList getAccounts() { return accounts; } + /** + * Processes the editing of an account from the given input. + * + * @param input the input string + * @throws EmptyArgumentException if the input is empty + * @throws IllegalArgumentException if the input is invalid + */ public void processEditAccount(String input) throws EmptyArgumentException, IllegalArgumentException { int accountNumber = Parser.parseEditAccount(input); Account account = getAccountByAccountNumber(accountNumber); @@ -106,10 +172,18 @@ public void processEditAccount(String input) throws EmptyArgumentException, Ille UserInterface.printUpdatedAccount(account.toString()); } + /** + * Saves the accounts to the data storage. + */ public void saveAccounts() { dataStorage.saveAccounts(accounts); } + /** + * Returns the list of existing account numbers. + * + * @return the list of existing account numbers + */ public ArrayList getExistingAccountNumbers() { return existingAccountNumbers; } From 1feda80f83bf276e508ed530393ed060a022ab21 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 21:55:17 +0800 Subject: [PATCH 23/59] Add header comments to Expense class --- .../budgetbuddy/transaction/type/Expense.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/budgetbuddy/transaction/type/Expense.java b/src/main/java/budgetbuddy/transaction/type/Expense.java index 80ef1e3624..2a74c16305 100644 --- a/src/main/java/budgetbuddy/transaction/type/Expense.java +++ b/src/main/java/budgetbuddy/transaction/type/Expense.java @@ -2,9 +2,25 @@ import budgetbuddy.account.Account; +/** + * Represents an expense transaction in the budget buddy system. + * An expense transaction decreases the balance of an account. + */ public class Expense extends Transaction { private static final String TRANSACTION_TYPE = "Expense"; + /** + * Creates an expense transaction with the given account number, account name, description, amount, date, and account. + * The amount is automatically negated to represent an expense. + * The balance of the account is decreased by the amount of the expense. + * + * @param accountNumber the account number + * @param accountName the name of the account + * @param description the description of the expense + * @param amount the amount of the expense + * @param date the date of the expense + * @param account the account the expense is made from + */ public Expense(int accountNumber, String accountName, String description, double amount, String date, Account account) { super(accountNumber, accountName, description, -amount, date); @@ -16,10 +32,25 @@ public Expense(int accountNumber, String accountName, String description, double account.setBalance(account.getBalance() + this.getAmount()); } + /** + * Creates an expense transaction with the given account number, account name, description, amount, and date. + * The amount is automatically negated to represent an expense. + * + * @param accountNumber the account number + * @param accountName the name of the account + * @param description the description of the expense + * @param amount the amount of the expense + * @param date the date of the expense + */ public Expense(int accountNumber, String accountName, String description, double amount, String date) { super(accountNumber, accountName, description, -amount, date); } + /** + * Returns the type of the transaction. + * + * @return the type of the transaction + */ @Override public String getTransactionType() { return TRANSACTION_TYPE; From ae16cebcbcdb2a68f97aabb2606b67ebabca224e Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 22:00:53 +0800 Subject: [PATCH 24/59] Add header comments to Income class --- .../budgetbuddy/transaction/type/Income.java | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main/java/budgetbuddy/transaction/type/Income.java b/src/main/java/budgetbuddy/transaction/type/Income.java index 70a3c39c22..edc852c6ab 100644 --- a/src/main/java/budgetbuddy/transaction/type/Income.java +++ b/src/main/java/budgetbuddy/transaction/type/Income.java @@ -2,14 +2,30 @@ import budgetbuddy.account.Account; +/** + * Represents an income transaction in the budget buddy system. + * An income transaction increases the balance of an account. + */ public class Income extends Transaction { private static final String TRANSACTION_TYPE = "Income"; //@@author vibes-863 + + /** + * Creates an income transaction with the given account number, account name, description, amount, date, and account. + * The balance of the account is increased by the amount of the income. + * + * @param accountNumber the account number + * @param accountName the name of the account + * @param description the description of the income + * @param amount the amount of the income + * @param date the date of the income + * @param account the account the income is made to + */ public Income(int accountNumber, String accountName, String description, double amount, String date, Account account) { super(accountNumber, accountName, description, amount, date); - assert this.getAmount() > 0: "Income amount must be positive"; + assert this.getAmount() > 0 : "Income amount must be positive"; assert description != null && !description.isEmpty() : "Description cannot be null or empty"; assert date != null : "Date cannot be null"; assert account != null : "Account cannot be null"; @@ -17,10 +33,24 @@ public Income(int accountNumber, String accountName, String description, double account.setBalance(account.getBalance() + this.getAmount()); } + /** + * Creates an income transaction with the given account number, account name, description, amount, and date. + * + * @param accountNumber the account number + * @param accountName the name of the account + * @param description the description of the income + * @param amount the amount of the income + * @param date the date of the income + */ public Income(int accountNumber, String accountName, String description, double amount, String date) { super(accountNumber, accountName, description, amount, date); } - + + /** + * Returns the type of the transaction. + * + * @return the type of the transaction + */ @Override public String getTransactionType() { return TRANSACTION_TYPE; From cb7a464570b73e145204fb680bc91814a14bd156 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Sun, 14 Apr 2024 22:03:52 +0800 Subject: [PATCH 25/59] Fix checkstyle issues --- .../budgetbuddy/transaction/type/Expense.java | 23 ++++++++++--------- .../budgetbuddy/transaction/type/Income.java | 5 ++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/budgetbuddy/transaction/type/Expense.java b/src/main/java/budgetbuddy/transaction/type/Expense.java index 2a74c16305..400a09553c 100644 --- a/src/main/java/budgetbuddy/transaction/type/Expense.java +++ b/src/main/java/budgetbuddy/transaction/type/Expense.java @@ -10,21 +10,22 @@ public class Expense extends Transaction { private static final String TRANSACTION_TYPE = "Expense"; /** - * Creates an expense transaction with the given account number, account name, description, amount, date, and account. + * Creates an expense transaction with the given account number, account name, description, amount, date, + * and account. * The amount is automatically negated to represent an expense. * The balance of the account is decreased by the amount of the expense. * * @param accountNumber the account number - * @param accountName the name of the account - * @param description the description of the expense - * @param amount the amount of the expense - * @param date the date of the expense - * @param account the account the expense is made from + * @param accountName the name of the account + * @param description the description of the expense + * @param amount the amount of the expense + * @param date the date of the expense + * @param account the account the expense is made from */ public Expense(int accountNumber, String accountName, String description, double amount, String date, Account account) { super(accountNumber, accountName, description, -amount, date); - assert this.getAmount() < 0: "Expense amount must be positive"; + assert this.getAmount() < 0 : "Expense amount must be positive"; assert description != null && !description.isEmpty() : "Description cannot be null or empty"; assert date != null : "Date cannot be null"; assert account != null : "Account cannot be null"; @@ -37,10 +38,10 @@ public Expense(int accountNumber, String accountName, String description, double * The amount is automatically negated to represent an expense. * * @param accountNumber the account number - * @param accountName the name of the account - * @param description the description of the expense - * @param amount the amount of the expense - * @param date the date of the expense + * @param accountName the name of the account + * @param description the description of the expense + * @param amount the amount of the expense + * @param date the date of the expense */ public Expense(int accountNumber, String accountName, String description, double amount, String date) { super(accountNumber, accountName, description, -amount, date); diff --git a/src/main/java/budgetbuddy/transaction/type/Income.java b/src/main/java/budgetbuddy/transaction/type/Income.java index edc852c6ab..9430bfd825 100644 --- a/src/main/java/budgetbuddy/transaction/type/Income.java +++ b/src/main/java/budgetbuddy/transaction/type/Income.java @@ -12,7 +12,8 @@ public class Income extends Transaction { //@@author vibes-863 /** - * Creates an income transaction with the given account number, account name, description, amount, date, and account. + * Creates an income transaction with the given account number, account name, description, amount, date, + * and account. * The balance of the account is increased by the amount of the income. * * @param accountNumber the account number @@ -45,7 +46,7 @@ public Income(int accountNumber, String accountName, String description, double public Income(int accountNumber, String accountName, String description, double amount, String date) { super(accountNumber, accountName, description, amount, date); } - + /** * Returns the type of the transaction. * From 8dc4a361541f49d375fe52fbc742c6bb82a0d51a Mon Sep 17 00:00:00 2001 From: isaaceng7 <110762696+isaaceng7@users.noreply.github.com> Date: Sun, 14 Apr 2024 22:46:06 +0800 Subject: [PATCH 26/59] Add architecture diagram into dg --- docs/DeveloperGuide.md | 19 ++++++++++++++++++- docs/uml/uml-images/architectureDiagram.png | Bin 0 -> 22704 bytes 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 docs/uml/uml-images/architectureDiagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1574453f80..dabc2f271a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,7 +7,24 @@ original source as well} ## Design & implementation -{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} + +### Architecture +The **Architecture Diagram** of BudgetBuddy is shown below. It explains the high-level design of the application. +![](./uml/uml-images/architectureDiagram.png) + +**Main components of the architecture:** + +The bulk of BudgetBuddy work is done by these following four components: +* `BudgetBuddy` class: is the main class of the application, in charge of the app launch, +shut down and reading user's inputs. It invokes the loading and saving of data when the app is launched/shut down. +* `ui` package: consists of `Ui` class, which deals with all the printing/output to the user, +and also some reading of user's inputs for additional data. +* `parser` package: consists of the `Parser` class, makes sense of the data input by the user +to provide meaningful data for other methods. +* `storage` package: consists of `DataStorage` class, in charge of saving and loading of the `data` files. + +These components help to manipulate the `Transaction`, `TransactionList`, `Account` and `AccountManager` classes +which drives BudgetBuddy. ### [Implemented] Add Account diff --git a/docs/uml/uml-images/architectureDiagram.png b/docs/uml/uml-images/architectureDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..69d844cbd568c6b8614bbd2aeef8a79eb0c723df GIT binary patch literal 22704 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 literal 0 HcmV?d00001 From f24228c7171744b8ba74ac3d674058a3e0fbeb1a Mon Sep 17 00:00:00 2001 From: isaaceng7 <110762696+isaaceng7@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:07:58 +0800 Subject: [PATCH 27/59] Add user stories to dg --- docs/DeveloperGuide.md | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index dabc2f271a..8dab87f46d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -269,28 +269,40 @@ The following is the class diagram for Insights class ## Product scope -### Target user profile +### Target user profile: +* has a need to manage significant number of day-to-day transactions +* prefer desktop apps over other types +* can type fast +* prefers typing to mouse interactions +* is reasonably comfortable using CLI apps -{Describe the target user profile} - -### Value proposition - -{Describe the value proposition: what problem does it solve?} +### Value proposition: +* manage daily transactions faster than a typical mouse/GUI driven app ## User Stories -| Version | As a ... | I want to ... | So that I can ... | -|---------|----------|---------------------------|-------------------------------------------------------------| -| v1.0 | new user | see usage instructions | refer to them when I forget how to use the application | -| v2.0 | user | find a to-do item by name | locate a to-do without having to go through the entire list | +| Version | As a ... | I want to ... | So that I can ... | +|---------|----------|----------------------------------------------------|-------------------------------------------------------| +| v1.0 | user | Update my daily expense | Manage my transactions | +| v1.0 | user | Exit from the interface | Stop the application | +| v1.0 | user | Know how to communicate with the bot | Use it effectively | +| v1.0 | user | View my past transactions | Keep track of them | +| v1.0 | user | Delete a transaction | Remove a transaction I added by mistake | +| v1.0 | user | Add income as well as expense transactions | Track my balance | +| v2.0 | user | Keep track of my balance | Know how much money I have left | +| v2.0 | user | Choose the date range to view my transactions | View transactions that I am interested in only | +| v2.0 | user | Track multiple balances such as wallet, debit card | Know how much money I have left in all accounts | +| v2.0 | user | Get a quick view of my past week's transactions | Obtain a quick overview of my recent spending history | +| v2.0 | user | Categorize my transactions | Get insights on each category | ## Non-Functional Requirements - -{Give non-functional requirements} +1. Should work on any *mainstream OS* as long as it has Java `11` or above installed. +2. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be +able to accomplish most of the tasks faster using commands than using the mouse. ## Glossary -* *glossary item* - Definition +* **Mainsteam OS**: Windows, Linux, Unix, MacOS ## Instructions for manual testing From 9cf42e4ec556848a5b40ff1f4fc26b7f7a257f8a Mon Sep 17 00:00:00 2001 From: isaaceng7 <110762696+isaaceng7@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:18:00 +0800 Subject: [PATCH 28/59] Update list implementation in dg --- docs/DeveloperGuide.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8dab87f46d..6b44cd9976 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -218,7 +218,8 @@ The following sequence diagram illustrates the sequence of interactions involved ### Description The list feature allows users to view their existing transactions. This feature includes viewing all the transactions, -past week's transactions, past month's transactions and transactions from a specified date range. +past week's transactions, past month's transactions, transactions from a specified date range, transactions from a +specified account and transactions of a particular category. #### Design and Implementation @@ -226,10 +227,14 @@ This feature is facilitated through the `TransactionList#processList`, and it is of the desired list as inputs are required in a bite-sized manner. This method first executes the `UserInterface#printListOptions` to show users the list options and their indexes which -is needed for their inputs. The method will throw an InvalidIndexException if the input is out of the range. -Depending on the list option chosen by the user, different prompts and messages will be output. For options which -require more data by the user, this feature will prompt the user to input the data. Once all required information is -gathered, the method will call on the various methods to build an ArrayList of the desired list and print out the list. +is needed for their inputs. The method will throw an InvalidIndexException if the input is out of the range (range 1-6). +Depending on the list option chosen by the user, the case statement of the `TransactionList#processList` will run, and +execute the method of the corresponding option. Different methods would have different prompts as more information is +required from the user. For the example of custom date transactions, `TransactionList#getCustomDateTransactions` will +call the methods: `UserInterface#getStartDate` and `UserInterface#getEndDate` in order to obtain the desired date range +from the user. Once all the required information is gathered for the particular option, an ArrayList will be created and +the desired transactions will be added into that ArrayList. Then, this ArrayList will be printed out, displaying the +transactions of the chosen option. Sequence Diagram The following sequence diagram illustrates the sequence of interactions involved in the editing of a transaction: From a92d1217605d1afee0837ad44646a342216aaab3 Mon Sep 17 00:00:00 2001 From: isaaceng7 <110762696+isaaceng7@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:20:23 +0800 Subject: [PATCH 29/59] Update list feature in ug --- docs/UserGuide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 9c10365749..2cf92c41ed 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -75,6 +75,8 @@ Example of usage: * `list` followed by `3` to view Past Week Transactions. * `list` followed by `4` followed by the start date `01-01-2024` followed by the end date `31-03-2024` to view Custom Date Transactions from 01-01-2024 to 31-03-2024. +* `list` followed by `5` followed by account number `ACCOUNT_NUMBER` to view transactions from that account. +* `list` followed by `6` followed by category number `CATEGORY_NUMBER` to view transactions of that category. List feature options: ![](./ug/list_options.png) From 805592f08626d89a294663dc5fe4d4ccec6a2432 Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 00:17:19 +0800 Subject: [PATCH 30/59] Add documentation for UserInterface class --- .../java/budgetbuddy/ui/UserInterface.java | 531 +++++++++++++++++- 1 file changed, 506 insertions(+), 25 deletions(-) diff --git a/src/main/java/budgetbuddy/ui/UserInterface.java b/src/main/java/budgetbuddy/ui/UserInterface.java index 2cfb491d6e..48930d86aa 100644 --- a/src/main/java/budgetbuddy/ui/UserInterface.java +++ b/src/main/java/budgetbuddy/ui/UserInterface.java @@ -4,7 +4,6 @@ import budgetbuddy.categories.Category; import budgetbuddy.transaction.type.Transaction; - import java.time.LocalDate; import java.util.ArrayList; import java.util.Scanner; @@ -22,6 +21,11 @@ public class UserInterface { private static final String TAB_SPACE = " "; public static Scanner in = new Scanner(System.in); + /** + * The function `listCategories` prints out the available categories along with + * their corresponding + * category names and numbers. + */ public static void listCategories() { System.out.println(LINE); System.out.println(TAB_SPACE + "Here are the available categories:"); @@ -31,13 +35,34 @@ public static void listCategories() { System.out.println(LINE); } + /** + * The function prompts the user to enter a number between 1 and 9 to categorize + * a transaction and + * returns the input as an integer. + * + * @return The method `getCategoryNum()` returns an integer value representing + * the category number + * input by the user. + */ 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); } - + /** + * The function `printDeleteMessage` takes a transaction string and balance as + * input, splits the + * transaction string, and prints a message confirming the deletion of the + * transaction along with + * the updated account balance. + * + * @param transaction The `transaction` parameter is a string that contains + * information about a + * transaction, with different parts separated by the "|" + * character. + * @param balance The `balance` parameter represents the updated account + */ public static void printDeleteMessage(String transaction, double balance) { String[] parts = transaction.split("\\|"); System.out.println(LINE); @@ -50,6 +75,17 @@ public static void printDeleteMessage(String transaction, double balance) { } //@@author Vavinan + /** + * The function `printAddMessage` takes a transaction string and balance amount, + * formats and prints + * the transaction details along with the updated balance. + * + * @param transaction The `transaction` parameter is a string that contains + * information about a transaction. + * @param balance The `balance` parameter in the `printAddMessage` method + * represents the updated + * account balance after a transaction has been added. + */ public static void printAddMessage(String transaction, double balance) { String[] parts = transaction.split("\\|"); System.out.println(LINE); @@ -61,6 +97,18 @@ public static void printAddMessage(String transaction, double balance) { System.out.println(LINE); } + /** + * The function `printInvalidIndex` prints a message indicating an invalid index + * along with the + * valid index range. + * + * @param message The `message` parameter is a string that contains the error + * message to be + * displayed when an invalid index is provided. + * @param id The `id` parameter in the `printInvalidIndex` method + * represents the upper limit of the + * index range that is valid for the message being displayed. + */ public static void printInvalidIndex(String message, int id) { System.out.println(LINE); System.out.println(TAB_SPACE + message); @@ -68,6 +116,15 @@ public static void printInvalidIndex(String message, int id) { System.out.println(LINE); } + /** + * The function `printExceptionErrorMessage` prints an error message with a + * given message and + * provides guidance on checking command syntax. + * + * @param message The `message` parameter is a string that represents the error + * message associated + * with the exception that occurred. + */ public static void printExceptionErrorMessage(String message) { System.out.println(LINE); System.out.println(TAB_SPACE + "An error occurred with the message: " + message); @@ -76,12 +133,29 @@ public static void printExceptionErrorMessage(String message) { System.out.println(LINE); } + /** + * The function `printInvalidInput` prints an error message surrounded by a line + * to indicate + * invalid input. + * + * @param message The `message` parameter is a String that contains the error + * message to be displayed. + */ public static void printInvalidInput(String message) { System.out.println(LINE); System.out.println(TAB_SPACE + "Error occurred with message: " + message); System.out.println(LINE); } + /** + * The function `printInvalidAddSyntax` prints an error message along with a + * reminder to ensure + * correct argument entry. + * + * @param message The `message` parameter is a string that represents the error + * message to be displayed + * when the syntax for adding an item is invalid. + */ //@@author isaaceng7 public static void printInvalidAddSyntax(String message) { System.out.println(LINE); @@ -90,6 +164,18 @@ public static void printInvalidAddSyntax(String message) { System.out.println(LINE); } + //@@author + + /** + * The function `printTransactionTypeError` prints an error message for an + * invalid transaction type + * in Java. + * + * @param message The `message` parameter is a string that represents the + * specific error message related + * to an invalid transaction type. + */ + //@@author isaaceng7 public static void printTransactionTypeError(String message) { System.out.println(LINE); System.out.println(TAB_SPACE + "Invalid transaction type: " + message); @@ -97,6 +183,18 @@ public static void printTransactionTypeError(String message) { System.out.println(LINE); } + //@@author + + /** + * The function `printNumberFormatError` prints an error message related to + * number format issues in + * Java. + * + * @param message The `message` parameter is a string that represents the error + * message + * related to a number format issue. + */ + //@@author isaaceng7 public static void printNumberFormatError(String message) { System.out.println(LINE); System.out.println(TAB_SPACE + "Error occurred with the input: " + message); @@ -104,6 +202,18 @@ public static void printNumberFormatError(String message) { System.out.println(LINE); } + //@@author + + /** + * The function `printEmptyArgumentError` prints an error message reminding the + * user to include + * proper argument in a command. + * + * @param message The `message` parameter is used to specify the type of + * argument that is + * missing in the command. + */ + //@@author isaaceng7 public static void printEmptyArgumentError(String message) { System.out.println(LINE); System.out.println(TAB_SPACE + "Please include the " + message + "in the command."); @@ -111,6 +221,19 @@ public static void printEmptyArgumentError(String message) { } //@@author + + /** + * The `printAllTransactions` function prints a formatted list of transaction + * details from an + * ArrayList of Transaction objects. + * + * @param transactions The `printAllTransactions` method takes an `ArrayList` of + * `Transaction` + * objects as a parameter. It then iterates over each + * `Transaction` object in the list and prints + * out the details of each transaction in a formatted + * table-like structure. + */ public static void printAllTransactions(ArrayList transactions) { int index = transactions.size(); System.out.println(LINE); @@ -135,7 +258,11 @@ public static void printAllTransactions(ArrayList transactions) { System.out.println(LINE); } - + /** + * The function `printGoodBye` prints a farewell message with a reminder to keep + * track of future + * transactions. + */ public static void printGoodBye() { System.out.println(LINE); System.out.println(TAB_SPACE + @@ -143,6 +270,10 @@ public static void printGoodBye() { System.out.println(LINE); } + /** + * The function `printNoCommandExists` prints a message indicating that no such + * command exists. + */ public static void printNoCommandExists() { System.out.println(LINE); System.out.println(TAB_SPACE + "No such command exists."); @@ -150,6 +281,21 @@ public static void printNoCommandExists() { } //@@author Vavinan + /** + * The function `getEditInformation` prompts the user to edit transaction + * details and returns the + * updated information as a formatted string. + * + * @param string The `getEditInformation` method takes a `String` parameter + * named `string`, which + * represents the transaction information that needs to be edited. + * The method then prompts the user + * to enter new values for the transaction type, description, + * date, amount, and category. + * @return The `getEditInformation` method is returning a formatted string that + * contains the edited + * transaction information. + */ public static String getEditInformation(String string) { System.out.println(LINE); System.out.println(TAB_SPACE + "Please edit the following transaction"); @@ -176,16 +322,32 @@ public static String getEditInformation(String string) { } //@@author + /** + * The function `printUpdatedTransaction` prints a success message along with + * the updated + * transaction details. + * + * @param t The parameter `t` is an object of the `Transaction` class. This + * method is designed to + * print a message indicating that the transaction was updated + * successfully, followed by + * the details of the updated transaction object `t`. + */ public static void printUpdatedTransaction(Transaction t) { System.out.println("\n" + TAB_SPACE + "Updated Successfully"); System.out.println(t.toString()); System.out.println(LINE); } - public static void printAllCommands(){ + /** + * The function `printAllCommands` prints a list of available commands with + * their syntax and + * further help options. + */ + public static void printAllCommands() { System.out.println(HELP_BORDER); System.out.printf("%-20s %-75s %-20s%n", "Command", "Syntax", "Further help"); - System.out.printf("%-20s %-75s %-20s%n","Add","add /t/[TYPE] /n/[DESCRIPTION] /d/[DD-MM-YYYY] " + + System.out.printf("%-20s %-75s %-20s%n", "Add", "add /t/[TYPE] /n/[DESCRIPTION] /d/[DD-MM-YYYY] " + "/$/[AMOUNT] /c/[CATEGORY]", "help add"); System.out.printf("%-20s %-75s %-20s%n", "Edit", "edit [INDEX]", "help edit"); System.out.printf("%-20s %-75s %-20s%n", "Delete", "delete [INDEX]", "help delete"); @@ -194,14 +356,19 @@ public static void printAllCommands(){ } - public static void printAddHelp(){ + /** + * The function `printAddHelp` prints out helpful information and syntax + * examples for adding + * entries with different categories. + */ + public static void printAddHelp() { System.out.println(HELP_BORDER); System.out.println("Method 1:"); System.out.println(TAB_SPACE + "SYNTAX : add /t/[TYPE] /n/[DESCRIPTION] /d/[DD-MM-YYYY]" + "/$/[AMOUNT] \n"); System.out.println("followed by choosing category from the given list:"); - for(Category category : Category.values()) { + for (Category category : Category.values()) { System.out.println(TAB_SPACE + TAB_SPACE + category.getCategoryName() + ": " + category.getCategoryNum()); } @@ -213,15 +380,25 @@ public static void printAddHelp(){ System.out.println(HELP_BORDER); } - public static void printDeleteHelp(){ + /** + * The function `printDeleteHelp` prints out syntax and guidelines for deleting + * an item from a + * transaction list. + */ + public static void printDeleteHelp() { System.out.println(HELP_BORDER); System.out.println(TAB_SPACE + "SYNTAX : delete [INDEX] \n"); - System.out.println( TAB_SPACE + "Make sure the index is above 0 and below or equal to the size of " + + System.out.println(TAB_SPACE + "Make sure the index is above 0 and below or equal to the size of " + "the transaction list"); System.out.println(HELP_BORDER); } - public static void printEditHelp(){ + /** + * The function `printEditHelp` provides guidance on how to use the "edit" + * command in a Java + * program for managing transactions. + */ + public static void printEditHelp() { System.out.println(HELP_BORDER); System.out.println(TAB_SPACE + "SYNTAX : edit [INDEX] \n"); System.out.println("Make sure the index is above 0 and below or equal to the size of the " + @@ -231,14 +408,19 @@ public static void printEditHelp(){ " Enter description: [NEW DESCRIPTION] \n" + " Enter transaction date: [NEW DATE] \n" + " Enter transaction amount: [NEW AMOUNT] \n" + " \n"); - System.out.println("Then you will be given categories to choose from (like as add command). \n"+ + System.out.println("Then you will be given categories to choose from (like as add command). \n" + " In which category do you want to list this transaction? [Enter number between 1 and " + "9]\n" + " Enter Category: [NEW CATEGORY] "); System.out.println(HELP_BORDER); } - public static void printListHelp(){ + /** + * The function `printListHelp` prints out a help message with syntax and + * available options for + * viewing transactions. + */ + public static void printListHelp() { System.out.println(HELP_BORDER); System.out.println(TAB_SPACE + "SYNTAX : list \n"); System.out.println(TAB_SPACE + "This will give some available options to choose from:"); @@ -249,11 +431,16 @@ public static void printListHelp(){ " 4. Custom Date Transactions\n"); System.out.println("From this you can choose 1-4 :"); System.out.println("To print Custom date transaction: \n" + - " 4\n" +"Start Date: [dd-MM-yyyy]\n" + "End Date: [dd-MM-yyyy] "); + " 4\n" + "Start Date: [dd-MM-yyyy]\n" + "End Date: [dd-MM-yyyy] "); System.out.println(HELP_BORDER); } - public static void printUseAvailableHelp(){ + /** + * The function `printUseAvailableHelp` prints out a list of available commands + * for getting help + * related to transactions and accounts. + */ + public static void printUseAvailableHelp() { System.out.println(HELP_BORDER); System.out.println(TAB_SPACE + "Please use the following commands for help"); System.out.println(TAB_SPACE + "To get idea about all commands use: help all"); @@ -266,6 +453,10 @@ public static void printUseAvailableHelp(){ } //@@author isaaceng7 + /** + * The function `printListOptions` displays a menu of transaction viewing + * options. + */ public static void printListOptions() { System.out.println(LINE); System.out.println("What would you like to view?"); @@ -277,12 +468,33 @@ public static void printListOptions() { System.out.println(TAB_SPACE + "6. Category Transactions"); System.out.println(LINE); } + //@@author + + /** + * The function `getListOption` reads a user input as a String and returns it. + * + * @return This method returns a String value that is read from the user input + * using the `Scanner` object `in`. + */ + //@@author isaaceng7 public static String getListOption() { String data = in.next(); in.nextLine(); return data; } + //@@author + + /** + * The function `getStartDate()` prompts the user for a start date input and + * returns the entered + * data as a String. + * + * @return The method `getStartDate()` returns a String value, which is the user + * input for the + * start date. + */ + //@@author isaaceng7 public static String getStartDate() { System.out.print("Start Date: "); String data = in.next(); @@ -290,6 +502,18 @@ public static String getStartDate() { return data; } + //@@author + + /** + * The function `getEndDate()` prompts the user for an end date input and + * returns the entered data + * as a String. + * + * @return The method `getEndDate()` is returning a String value that represents + * the end date + * entered by the user. + */ + //@@author isaaceng7 public static String getEndDate() { System.out.print("End Date: "); String data = in.next(); @@ -297,6 +521,17 @@ public static String getEndDate() { return data; } + //@@author + + /** + * The function `printAccountList` prints a list of account numbers and names in + * a formatted table. + * + * @param accounts An ArrayList of Account objects. Each Account object + * represents an account with + * an account number and a name. + */ + //@@author isaaceng7 public static void printAccountList(ArrayList accounts) { int maxIndex = accounts.size(); System.out.println(LINE); @@ -316,7 +551,19 @@ public static void printAccountList(ArrayList accounts) { System.out.println("\n" + TAB_SPACE + ACCOUNT_TABLE_BORDER); System.out.println(LINE); } + //@@author + /** + * The function `getSelectedAccountNumber` prompts the user to select an account + * number from a list + * of accounts and returns the selected account number as a String. + * + * @param accounts An ArrayList of Account objects. + * @return The method `getSelectedAccountNumber` returns a `String` value, which + * is the account + * number selected by the user from the list of accounts provided. + */ + //@@author isaaceng7 public static String getSelectedAccountNumber(ArrayList accounts) { printAccountList(accounts); System.out.print("Account number: "); @@ -325,17 +572,42 @@ public static String getSelectedAccountNumber(ArrayList accounts) { return data; } + //@@author + + /** + * The function `getSelectedCategory` prompts the user to select a category + * number and returns the + * integer value entered by the user. + * + * @return The method `getSelectedCategory` is returning an integer value + * representing the selected + * category number entered by the user. + */ + //@@author isaaceng7 public static int getSelectedCategory() { System.out.print("Select a category number: "); String data = in.nextLine(); return Integer.parseInt(data); } + //@@author + /** + * The function `printPastTransactions` prints a formatted list of past + * transactions based on a + * specified duration. + * + * @param transactions transactions is an ArrayList that contains Transaction + * objects. + * @param duration The `duration` parameter is a String that represents the + * time period for + * which the user want to display past transactions. + */ + //@@author isaaceng7 public static void printPastTransactions(ArrayList transactions, String duration) { int index = transactions.size(); System.out.println(LINE); - System.out.println(TAB_SPACE + "Displaying transactions from the past " + duration + ":"); + System.out.println(TAB_SPACE + "Displaying transactions from the past " + duration + ":"); System.out.println(TAB_SPACE + TABLE_BORDER); System.out.printf(TAB_SPACE + TAB_SPACE + "%-5s %-10s %-20s %-20s %-30s %-15s %-15s %-15s%n", "ID", "Type", "Account Number", "Account Name", "Transaction", "Date", "Amount", "Category"); @@ -357,6 +629,21 @@ public static void printPastTransactions(ArrayList transactions, St } + //@@author + + /** + * The `printCustomDateTransactions` function prints a formatted list of + * transactions within a + * specified date range. + * + * @param transactions The `printCustomDateTransactions` method takes an + * `ArrayList` of + * `Transaction` objects as input. It then iterates over the + * transactions in the list and prints + * out specific details of each transaction in a formatted + * table-like structure. + */ + //@@author isaaceng7 public static void printCustomDateTransactions(ArrayList transactions) { int index = transactions.size(); System.out.println(LINE); @@ -381,14 +668,35 @@ public static void printCustomDateTransactions(ArrayList transactio System.out.println(LINE); } + //@@author + + /** + * The function `printAccountTransactions` prints a formatted list of + * transactions for a specific + * account. + * + * @param transactions An ArrayList of Transaction objects containing the + * transaction details. + * @param accountName The `accountName` parameter in the + * `printAccountTransactions` method is a + * `String` that represents the name of the account for + * which the user want to display transactions. + * @param accountNumber The `accountNumber` parameter in the + * `printAccountTransactions` method is + * an integer value that represents the account number of + * the account for which the user want to display + * transactions. + */ + //@@author isaaceng7 public static void printAccountTransactions(ArrayList transactions, String accountName, int accountNumber) { int index = transactions.size(); System.out.println(LINE); - System.out.println(TAB_SPACE + "Displaying transactions of account: " + accountName + "(" + accountNumber +")"); + System.out + .println(TAB_SPACE + "Displaying transactions of account: " + accountName + "(" + accountNumber + ")"); System.out.println(TAB_SPACE + TABLE_BORDER); System.out.printf(TAB_SPACE + TAB_SPACE + "%-5s %-10s %-30s %-15s %-15s %-15s%n", "ID", "Type", - "Transaction", "Date", "Amount", "Category"); + "Transaction", "Date", "Amount", "Category"); for (int i = START_INDEX; i < index; i++) { Transaction transaction = transactions.get(i); String type = transaction.getTransactionType(); @@ -404,6 +712,20 @@ public static void printAccountTransactions(ArrayList transactions, System.out.println(LINE); } + //@@author + + /** + * The function `printCategoryTransactions` prints out a formatted list of + * transactions belonging + * to a specific category. + * + * @param transactions transactions is an ArrayList that contains Transaction + * objects. + * @param categoryName Category name is a string representing the name of a + * category for which the + * user want to display transactions. + */ + //@@author isaaceng7 public static void printCategoryTransactions(ArrayList transactions, String categoryName) { int index = transactions.size(); System.out.println(LINE); @@ -427,9 +749,17 @@ public static void printCategoryTransactions(ArrayList transactions System.out.println(LINE); } - //@@author + /** + * The function `printAddAccountMessage` takes a string representing an account, + * splits it into + * parts, and prints each part with proper formatting. + * + * @param account The parameter `account` is expected to contain account + * information separated + * by the pipe character `|`. + */ //@@author vibes-863 public static void printAddAccountMessage(String account) { String[] parts = account.split("\\|"); @@ -441,6 +771,18 @@ public static void printAddAccountMessage(String account) { System.out.println(LINE); } + //@@author + + /** + * The function `printInvalidArgumentSyntax` prints an error message along with + * a reminder to + * ensure correct argument entry. + * + * @param message The `message` parameter is a string that contains the specific + * error message to + * be displayed when the argument syntax is invalid. + */ + //@@author vibes-863 public static void printInvalidArgumentSyntax(String message) { System.out.println(LINE); System.out.println(TAB_SPACE + message); @@ -448,6 +790,16 @@ public static void printInvalidArgumentSyntax(String message) { System.out.println(LINE); } + //@@author + + /** + * The function `printListOfAccounts` prints a formatted list of account details + * including account + * number, name, and balance. + * + * @param accounts An ArrayList of Account objects. + */ + //@@author vibes-863 public static void printListOfAccounts(ArrayList accounts) { int maxIndex = accounts.size(); System.out.println(LINE); @@ -462,12 +814,28 @@ public static void printListOfAccounts(ArrayList accounts) { String name = account.getName(); double balance = account.getBalance(); - System.out.printf("\n" +TAB_SPACE + TAB_SPACE + "%-20d %-30.45s %-15.2f", accountNumber, name, balance); + System.out.printf("\n" + TAB_SPACE + TAB_SPACE + "%-20d %-30.45s %-15.2f", accountNumber, name, balance); } System.out.println("\n" + TAB_SPACE + ACCOUNT_TABLE_BORDER); System.out.println(LINE); } + //@@author + + /** + * The function `printDeleteAccountMessage` prints a message confirming the + * deletion of an account + * and lists the transactions related to that account that have also been + * removed. + * + * @param account The `account` parameter is a string that contains + * account information. + * @param transactionsRemoved The `transactionsRemoved` parameter is an + * ArrayList of + * Transaction objects that represent the + * transactions related to the account + */ + //@@author vibes-863 public static void printDeleteAccountMessage(String account, ArrayList transactionsRemoved) { String[] parts = account.split("\\|"); System.out.println(LINE); @@ -486,7 +854,7 @@ public static void printDeleteAccountMessage(String account, ArrayList transactions, ArrayList indices) { - if(transactions.isEmpty()) { + if (transactions.isEmpty()) { System.out.println("No matching Transactions found"); - } else{ + } else { System.out.println("Search results:"); System.out.println(TAB_SPACE + TABLE_BORDER); System.out.printf(TAB_SPACE + TAB_SPACE + "%-5s %-10s %-20s %-20s %-30s %-15s %-15s %-15s%n", "ID", "Type", "Account Number", "Account Name", "Transaction", "Date", "Amount", "Category"); int i = 0; for (Transaction t : transactions) { - //System.out.println((indices.get(i) + 1) + ". " + transactions.get(i)); + // System.out.println((indices.get(i) + 1) + ". " + transactions.get(i)); System.out.printf(TAB_SPACE + TAB_SPACE + "%-5d %-10s %-20d %-20.45s %-30.45s %-15s %-15.2f %-15s%n", - indices.get(i)+1, t.getTransactionType(),t.getAccountNumber(),t.getAccountName(), + indices.get(i) + 1, t.getTransactionType(), t.getAccountNumber(), t.getAccountName(), t.getDescription(), t.getDate(), t.getAmount(), t.getCategory().getCategoryName()); i++; } @@ -565,24 +1002,56 @@ public static void printSearchResults(ArrayList transactions, Array } + /** + * The function `printInvalidCategoryError` prints an error message for an + * invalid category. + */ + //@@author ShyamKrishna33 public static void printInvalidCategoryError() { System.out.println(LINE); System.out.println(TAB_SPACE + "Invalid Category"); System.out.println(LINE); } + //@@author + + /** + * The function `printInvalidAccountNameError` prints an error message stating + * that the Account + * Name cannot be blank. + */ + //@@author ShyamKrishna33 private static void printInvalidAccountNameError() { System.out.println(LINE); System.out.println(TAB_SPACE + "Account Name cannot be blank"); System.out.println(LINE); } + //@@author + + /** + * The function `printInvalidAccountBalanceError` prints an error message the + * invalid account balance. + */ + //@@author ShyamKrishna33 private static void printInvalidAccountBalanceError() { System.out.println(LINE); System.out.println(TAB_SPACE + "Account Balance cannot be a valid number"); System.out.println(LINE); } + //@@author + + /** + * The function `getInitialAccountName` prompts the user to input a name for + * their account and + * validates it to ensure it is not empty. + * + * @return The method `getInitialAccountName()` returns a `String` value, which + * is the account name + * entered by the user. + */ + //@@author ShyamKrishna33 public static String getInitialAccountName() { System.out.println("Let's first create an account for you! What do you want to call it?"); String accountName = in.nextLine(); @@ -594,6 +1063,18 @@ public static String getInitialAccountName() { return accountName; } + //@@author + + /** + * The function `getInitialAccountBalance` prompts the user to input an initial + * account balance and + * handles any input errors. + * + * @return The method `getInitialAccountBalance()` returns a `Double` value, + * which represents the + * initial account balance entered by the user. + */ + //@@author ShyamKrishna33 public static Double getInitialAccountBalance() { System.out.println("Great! What's the initial balance?"); double initialBalance = 0; From b9ec8ca6a04da004ceb71e76c8db31026bb8f020 Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 00:35:37 +0800 Subject: [PATCH 31/59] Add documentation to Parser class --- src/main/java/budgetbuddy/parser/Parser.java | 50 +++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/main/java/budgetbuddy/parser/Parser.java b/src/main/java/budgetbuddy/parser/Parser.java index 3e94f8b803..3bfb4ded72 100644 --- a/src/main/java/budgetbuddy/parser/Parser.java +++ b/src/main/java/budgetbuddy/parser/Parser.java @@ -21,6 +21,14 @@ public class Parser { public static final int HELP_BEGIN_INDEX = 4; private static final int ADD_ACC_COMMAND_INDEX = 7; + /** + * The function `parseAccountNumber` extracts and returns an account number from a given input + * string following a specific syntax. + * + * @param input The input string that containes the account number to be parsed. + * @return The method is returning an integer value, which is the account number parsed from the + * input string. + */ public static int parseAccountNumber(String input) throws InvalidArgumentSyntaxException { String data = input.substring(ADD_COMMAND_INDEX + 1); String[] parseData = data.split("/"); @@ -32,6 +40,16 @@ public static int parseAccountNumber(String input) throws InvalidArgumentSyntaxE throw new InvalidArgumentSyntaxException("Invalid add syntax."); } + /** + * The function `parseUserInputToTransaction` takes user input, parses it to create a transaction + * object (either income or expense), and handles various exceptions related to invalid input. + * + * @param input takes a user input that contain transaction details in a + * specific format. + * @param account The `account` parameter in this method represents the account to which the transaction belongs. + * @return The method `parseUserInputToTransaction` is returning a `Transaction` object, which can + * be either an `Income` or an `Expense` object based on the type provided in the input. + */ public Transaction parseUserInputToTransaction(String input, Account account) throws InvalidTransactionTypeException, NumberFormatException, EmptyArgumentException, InvalidCategoryException, InvalidAddTransactionSyntax { @@ -102,6 +120,18 @@ public Transaction parseUserInputToTransaction(String input, Account account) } //@@author Vavinan + /** + * The `parseEditTransaction` function in Java parses a new transaction string and creates either + * an Income or Expense object based on the transaction type, validating the category number and + * throwing exceptions for invalid data. + * + * @param newTransaction The `newTransaction` string is expected to be in a specific format + * @param account The `account` parameter in the `parseEditTransaction` method represents the + * account to which the transaction belongs. + * @return The `parseEditTransaction` method is returning a `Transaction` object, which can be + * either an `Income` or `Expense` object based on the type provided in the `newTransaction` + * string. + */ public Transaction parseEditTransaction(String newTransaction, Account account) throws InvalidEditTransactionData, InvalidCategoryException { String[] parts = newTransaction.split(" \\| "); @@ -135,6 +165,13 @@ public String parseHelpCommand(String input) { } //@@author + /** + * The `parseAddAccount` function in Java parses the input and returns the account name and + * balance of the new account that is to added. + * + * @param input It contains details about account name and initial balance + * @return A string array that contains the account name and initial balance + */ public static String[] parseAddAccount(String input) throws NumberFormatException, EmptyArgumentException { String data = input.substring(ADD_ACC_COMMAND_INDEX + 1).trim(); String[] parseData = data.split("/"); @@ -163,6 +200,12 @@ public static String[] parseAddAccount(String input) throws NumberFormatExceptio return new String[]{name, initialBalance}; } + /** + * The `parseRemoveAccount` function in Java parses the input and returns the account + * number that is to be deleted + * @param input It contains details about account number that is to be deleted + * @return A integer value representing the account number + */ public static int parseRemoveAccount(String input) throws NumberFormatException, EmptyArgumentException { if (input.trim().length() < 11) { @@ -175,7 +218,12 @@ public static int parseRemoveAccount(String input) return Integer.parseInt(data); } - + /** + * The `parseEditAccount` function in Java parses the input and returns the account + * number that is to be edited + * @param input It contains details about account number that is to be edited + * @return A integer value representing the account number + */ public static int parseEditAccount(String input) throws EmptyArgumentException { if (input.trim().length() < 9) { throw new EmptyArgumentException("edit-acc index "); From 4fdcca6677a135e3721a7cbdeb4eecc139f76aea Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 00:46:11 +0800 Subject: [PATCH 32/59] Add documentation for the UI and Parser class --- src/main/java/budgetbuddy/parser/Parser.java | 3 +++ src/main/java/budgetbuddy/ui/UserInterface.java | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/main/java/budgetbuddy/parser/Parser.java b/src/main/java/budgetbuddy/parser/Parser.java index 3bfb4ded72..d50bf57d9c 100644 --- a/src/main/java/budgetbuddy/parser/Parser.java +++ b/src/main/java/budgetbuddy/parser/Parser.java @@ -15,6 +15,9 @@ import budgetbuddy.transaction.type.Transaction; import budgetbuddy.ui.UserInterface; +/** + * Parses the user input into data that is easily understandable by other classes and methods. + */ public class Parser { public static final int ADD_COMMAND_INDEX = 3; diff --git a/src/main/java/budgetbuddy/ui/UserInterface.java b/src/main/java/budgetbuddy/ui/UserInterface.java index 48930d86aa..3b9bf87738 100644 --- a/src/main/java/budgetbuddy/ui/UserInterface.java +++ b/src/main/java/budgetbuddy/ui/UserInterface.java @@ -8,6 +8,10 @@ import java.util.ArrayList; import java.util.Scanner; +/** + * Manages Overall interaction between users and the program. + * It handles all the input and output related tasks. + */ public class UserInterface { public static final int START_INDEX = 0; From 739e3dfb812cc11d80d628c1b52f2ceba8a9b43c Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 00:56:15 +0800 Subject: [PATCH 33/59] Fix indentation for Continuation --- src/main/java/budgetbuddy/parser/Parser.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/budgetbuddy/parser/Parser.java b/src/main/java/budgetbuddy/parser/Parser.java index d50bf57d9c..b0c64057fd 100644 --- a/src/main/java/budgetbuddy/parser/Parser.java +++ b/src/main/java/budgetbuddy/parser/Parser.java @@ -28,9 +28,8 @@ public class Parser { * The function `parseAccountNumber` extracts and returns an account number from a given input * string following a specific syntax. * - * @param input The input string that containes the account number to be parsed. - * @return The method is returning an integer value, which is the account number parsed from the - * input string. + * @param input The input string that contains the account number to be parsed. + * @return The method is returning an integer value, which is the account number parsed from the input string. */ public static int parseAccountNumber(String input) throws InvalidArgumentSyntaxException { String data = input.substring(ADD_COMMAND_INDEX + 1); @@ -47,11 +46,10 @@ public static int parseAccountNumber(String input) throws InvalidArgumentSyntaxE * The function `parseUserInputToTransaction` takes user input, parses it to create a transaction * object (either income or expense), and handles various exceptions related to invalid input. * - * @param input takes a user input that contain transaction details in a - * specific format. + * @param input takes a user input that contain transaction details in a specific format. * @param account The `account` parameter in this method represents the account to which the transaction belongs. * @return The method `parseUserInputToTransaction` is returning a `Transaction` object, which can - * be either an `Income` or an `Expense` object based on the type provided in the input. + * be either an `Income` or an `Expense` object based on the type provided in the input. */ public Transaction parseUserInputToTransaction(String input, Account account) throws InvalidTransactionTypeException, NumberFormatException, @@ -130,10 +128,9 @@ public Transaction parseUserInputToTransaction(String input, Account account) * * @param newTransaction The `newTransaction` string is expected to be in a specific format * @param account The `account` parameter in the `parseEditTransaction` method represents the - * account to which the transaction belongs. + * account to which the transaction belongs. * @return The `parseEditTransaction` method is returning a `Transaction` object, which can be - * either an `Income` or `Expense` object based on the type provided in the `newTransaction` - * string. + * either an `Income` or `Expense` object based on the type provided in the `newTransaction` string. */ public Transaction parseEditTransaction(String newTransaction, Account account) throws InvalidEditTransactionData, InvalidCategoryException { From f7ab114de7c2c44a1401c4a5571f09440e5194e0 Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 01:12:23 +0800 Subject: [PATCH 34/59] Fix UG to get multi-word input --- src/main/java/budgetbuddy/ui/UserInterface.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/budgetbuddy/ui/UserInterface.java b/src/main/java/budgetbuddy/ui/UserInterface.java index 3b9bf87738..93572104cf 100644 --- a/src/main/java/budgetbuddy/ui/UserInterface.java +++ b/src/main/java/budgetbuddy/ui/UserInterface.java @@ -306,13 +306,13 @@ public static String getEditInformation(String string) { System.out.println(string); System.out.println(LINE); System.out.print(TAB_SPACE + "Enter transaction type: "); - String type = in.next(); + String type = in.nextLine(); System.out.print(TAB_SPACE + "Enter description: "); - String description = in.next(); + String description = in.nextLine(); System.out.print(TAB_SPACE + "Enter transaction date: "); - String date = in.next(); + String date = in.nextLine(); System.out.print(TAB_SPACE + "Enter transaction amount: "); - String amount = in.next(); + String amount = in.nextLine(); System.out.println(" "); for (Category category : Category.values()) { System.out.println(TAB_SPACE + TAB_SPACE + category.getCategoryName() + ": " + category.getCategoryNum()); From 4e53e0142538d7a606f4dcbe408a5abed9a1f217 Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 01:39:11 +0800 Subject: [PATCH 35/59] Update PPP about search feature --- docs/team/vavinan.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/team/vavinan.md b/docs/team/vavinan.md index 57a4a9b9f9..6ce5bfbe65 100644 --- a/docs/team/vavinan.md +++ b/docs/team/vavinan.md @@ -15,6 +15,12 @@ It is optimized for use via a Command Line Interface (CLI) and is written in Jav * Added implementation details for the feature `delete`. * Added implementation details for the feature `edit`. * Added implementation details for the feature `insights`. + + * Community: + * Reported bugs and suggestions for other teams in class and PE-D. + + * Others: + * Added headers for UserInterface class and Parser class ### Feature 1 - Deleting Transaction 1. Created the `removeTransaction` method to handle deletion of a transaction based on its index in the list. @@ -44,3 +50,19 @@ which has been added with some mistakes and need to be updated.
**Highlights:** Instead of expecting the user to type long command this feature prompts the user to input value for each data +### Feature 3 - Search Transaction + +1. Implemented the `searchTransaction` method to facilitate searching of transactions using a keyword + based on description, date, category or amount. +2. Facilitated by the command `search` followed by the keyword. +3. If the keyword is missing, exception is thrown and the suer will be alerted +4. The keyword is used to search from the list and the matching results will be shows as a table along + with its true **index ID**. If there is no matching transactions, then the user will be notified that there is no matching transactions. + +**What it does:** Allows users to search for transactions
+**Justification:** this feature is key to the BudgetBuddy as if the transaction is history is too long and +a user wants to delete or edit transaction. Then this search functionality will be helpful as the user can +enter a keyword to search for it to get the true index ID of the transaction. Then that ID can be used in +delete or edit command. + + From 8721d4bc103107711fbb1684d74bea649d27c9e8 Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 01:54:43 +0800 Subject: [PATCH 36/59] Add images for sample outputs --- docs/ug/successful_delete_transaction.png | Bin 0 -> 49391 bytes docs/ug/successful_edit_transaction.png | Bin 0 -> 120589 bytes docs/ug/successful_search.png | Bin 0 -> 43372 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/ug/successful_delete_transaction.png create mode 100644 docs/ug/successful_edit_transaction.png create mode 100644 docs/ug/successful_search.png diff --git a/docs/ug/successful_delete_transaction.png b/docs/ug/successful_delete_transaction.png new file mode 100644 index 0000000000000000000000000000000000000000..d68855a401a4f29523a5dd9978762f14fa7cb008 GIT binary patch literal 49391 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

WEr)w%+^|aa;Z%8e9qjAZRE< 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 Yt@r9?$RDqMw2~WKHN8@H`Of420(b*Vx&QzG literal 0 HcmV?d00001 diff --git a/docs/ug/successful_edit_transaction.png b/docs/ug/successful_edit_transaction.png new file mode 100644 index 0000000000000000000000000000000000000000..0efcffacdfeba0c980827868378d8e333c3c8fdb GIT binary patch literal 120589 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 Q9w_;Gy85}Sb4q9e0C`WNU;qFB literal 0 HcmV?d00001 diff --git a/docs/ug/successful_search.png b/docs/ug/successful_search.png new file mode 100644 index 0000000000000000000000000000000000000000..fc52f6bc2e20dfa7a8cce218512e91812c765197 GIT binary patch literal 43372 zcmeFZcUV(t_crQ`g&7sWLX)PVq7)J7H3Jq@ng~b{h!Bc^5JRttBZGi66)94sS3!Cw z4lPn69SI~-1B4JDB#^pKn9+IX{hjYR*LD6p=lk+UuFYoeo&7v(t^2vxz1H4Q_l)$o z51&4~Z{I%dJGXD#-?#6VxqbV7dil#C&Ysf!A;Z$2kBh{=db zzbC_&bWY~rfxKrQ`R#H3`pO5->GJvuCI6J@BqBO$Z=!SK#;1LEpY8ko&&{1syDSa- z_OItxPC5(^{PvB4DwS!ZkIWP{qsRIJ@vA_E+o$)OAN%`LMFX1H*Rzg_3Y?TQT)}o$ z%ICQ~YBFjKqO6V;x{sDxRM>I0js3O$I^0Jh`OM(ASk&A)f?e_OgDeo4A0P1QgI(yv zY0mNA4_<8^*OI0Db^I4m9g)2Yx&64%>X<*6=dXXw^jwJC|MxxY+lSWB5&5zG`S&x& zerzxN#>@3%+w07Kj#uOD{OSAtXCiwO`1j|xV+UYAw$E@qSN*a5YXASa{J#G=ImW;1 zjuoY_DA)kXgo?w+`erfJ#fs8xn2)x-(-GBWVybl2{D*-y6i;*p9zJ!*AnpSG&6&Yo z-|MDCbQKJ`e)r&0u>&yeG`{@@f6V+dxGpdL@;yNfm2ulCVeVwVF6LLX#fIazqEta; zdo!*C2W;i}w>31%)adpP0~t%}q!<2{4Zqo9b9nAaT$2gfg14|#cWlAZMojcEMZe=d z@xKoJ^eS2TLWKj})jS3<2<|cy9MM+)vTkV!gg}pcKkz-GM>f(_Q1RNuCwBbOZIfaT z(d$v70z0=ly0j{Z2G`3Nj5jHojq2tjW1oIafOHEJAjHj#&0e$zdDqqA37wvAS>s`S zRD5gs-mPr6$D?IdC;9-2+Y_w`!H33AqAsLKc77`vl4sz0evy`IQ@?0#QSu>ENLqh3 zUaQh^=#!wO#sz1@M>S|lUtRepdlwTYO3plICz zw9awMN`Ir6;^M2JUsGB&63z?`9h86aZ9|YTyk$xA#b{2|{YjmpG9H_Z#u-m6UM8^n zs#qEWF6&!c%fCH@bf<{b`JP47>qs3_uNbrj|?zr68%0U0m=&}IxinB zjiu+t=3mwIKMlv8t}ZxgG?uhldI+^K=I$_0JAc)rhl-GkhIL3q2p%@?fXp>xAgKI7 zN|%Xw(uWkWXoS>@Gj{Qd(#=-vnwyoyr`}HTdnXOVD!GghOpcngj9LosmpUk0a;WR0 zlk{9y*03+pFWp*PF6M*TLs3(ni@q38`pJ_x%xk(x{$iG$@JYQq0{K-a;Dlj|a$`SM zwzQ1NXQzGBx3EgiasmWOUUZJ4->lTPf-WeLh80Z(lJUUZ{t}jZ*00|OwT!sN1$%im zwG#SP?|>RoE9ptPh|>IvuJ@~}f@Y>CA>(B+$-O_Nc`yoYn1`R~`$S)?ELQ!wFMk3; zo^>**_qiXFsd@3%z&m~g>{sj4XY(zQ9M7y<%qK*6OrOH^O2j>32EYwU#08WTF6zw$ zV;nHEv6XeBY=Sbs5mcDqG0}mzi^Q~J(3gfd zXbhcV>d-%0DIdh{PuW4w@U)+qiCunkQ;Z=;rjj1@XIdoq(t>o3mVPX|drc11!IoP` z(i845UU=jVlRXt4(WV^P$gn`2$^AI1dV|v|lATtsmPa~+ho3%H9 zAg#LO=Yn!wZ&!QIM!v4_)L%kW%8x%0$~c^M)QaJ7BJa`*wE{m|WSvt8E2tQbQi+E6 zBs-nbGkCXQr?%{MMXOie{+?~wB`)7OM6;Azb4-wFQ6_(1uLMysM?EvR z+_-pL&n}j}eoG|qkM=dE%34M1&(ZRM0gH5#Wh>vm+jSfKuBYw>%$GPM;co8~a} z*(WsH?MDA@P754rc(>Li(HC%27&&VD= zyNBa2z{5=>%k781Wr}_cQ#DtTpYLl&@JlaqdqzdqdFP57jwL`g8y!>4g@+}EPjRPcOY^r> zYVxmT2r1bn$x~w|-cT4h+9lF|s0Lkof*H?aGo0j`bVIXCl=+#j%5bTM68DK#PBRFr zdPL!hJ0A7o{x>I={kEIX&qF*Qd zjl5|NyV_%OEByS^FXkO+i~}}()yy{A&8J`OLF1ARk+Y^OW|ii6-cs+p7m{egipqm` zP>1-YBs-ZScNkN$iPvR#zyloL>A%BuSuFpaIR^_bka1M@TQde&ewMXRdy_lD#X_vo zX}8SM)*9JusS29OjMgS0*D%PD?dS)|dR$Y2BTa#ZR(P5V7@oueE6%oxQE`!0i^n7O zme>`)?|}I2>uY1)!kJh0@=xx17+7jcJ3j%7L{pI`9?D(RiJXg+zup{Yc|U}2NUrNu zd!}WZz1h*UFI^4Ch%>YVu=tsm|TQllQHWALJo6r16T0pk}~p zk^}CTrVCc%Jbe&@@O%0eoH)j?#o14RR+er_tKvZVF*1p6E&XE%@7_Rp3!~>s!)~dp z-)`q~vFP3{*NKCXdn?XO@mEVywDazz)SR)C8dK?-lzq29{gtQOX^vBS zPE<&S>x@9Uy1aND?=*3K;Mt$@@0-*QJ>ZG@X@64)yCkY|!yvFT$FGf9qKWHx z=O0%n@ekt}auGz_&~ClIWFI}m^C;~I<6Qir%M{RcX1uQvfYov7qyaiY_=Z-Q4F z2HyK%I^K6tQ?%4?OSb-nT}Y5+7p0_TypxfZ$!eqK53Gn zQLV)r)RqDfD1n(Eu36zlf%LQzxtKK3Qgo8usnw4E9)Md{(|O0IuBHaU?~VzbDtXaW z6BhjDeLIfe@Y}?D-GOw=hllU4MJWl7NVK1NVf-?jgRsg(v1HGRhc?Hy)}qXXU-)|p zYbZRZjW`o0_cHbH*+|{7S1DVr*9NGerc-Q?)8Mj%YmP1c1E(2`cepadB~}$w~5)$K)O9O zpchrPaQk2!t6^Deq7t5?fN|Cse4|zOd1fu(Z zK>dDORc*J6@i980?Y!Y7l_rRD#RwQ|%EA zixIi*7#ak!`-h2qSy*<52DGDWj|=J-490Wg69RqAj&gZSYH2L7G+Z%XCjLP;)~&iT zgU?LlS>ksl^EA39u6R67KNZ&e>mxJ6G;u<&M6y}ce1xIA`_dO5TNuqe46%EEcHdQQ`J6aYoHx7HCl8&C ze3_d)T7&dkO*<&xq8n`gZPYSI+Y0FG|Af8Nl~V6%a}@p&pgN|4z8m-p$no&pDZUpmad$K(I;S8S z^NHYIiAkHulNIS$F#=UCUg(J1{R+iZx8I0wQ&{YRfX&hMN$i8>`N9c@`DD57b|Pnq zWe(Mb|0LlsT~}MVj;Wi<@<$~>(jY5?D?F<&`ZL9)+X7|lz|+Fq5zhW%$DM|s2NWyL z^~I$qEDrSr=9$#Wvtqd`*$d^9esJR_Ad91rCol7xUAj_+688&s@%9`+$RX>N=X)zM zqzqEBVwT_dvc%5*MdO>LJQI#fCwKKi{krSG>JjdoS>z|X5wrn+pF2BRit6{q>fsH~z_%Gku?{ZU~;zLkaCH4LT}j$>F;` z>ct#5@O{2Cg%7~aM9)eKX$9*2khaWpED& zwVZu{F#;6A8^!fTS^0Bex-=KwU6xYq z9sDxi9T{8b_fR90n;)RQTHMGammqaW6kxhOhIUSpenGVsk zemNVifp?e~J)1Fg*c{?80P;LP`v;DvoB4YykBTPY04!51+$mzd=^x?diyp@_$=Xs} z9!4#vC8Q4AIebJr3U_z*h4-eLM-wYhGLpRgAD5{5EYfKOU$)z_E|F92`gB<5P5XNj z`SR`6tSEVhr%kOh?>F@wPn zWFs6c42n+>NX?}UvKrvEm*Yf3B>0VsjK&r(RG_n50d5fivY$w#9HQZb#lv+}#vFZ` zWvmFM)e^}_K54LEQi*H*5*fINAuT8MqQHjN(=Ua#X>9IXSfLt?P|ro07L~+i6efHd z08_{s)u!aj1JWIMl490R36PHLta-1#*2kW7dFqFhSE+l-;oc`8gp&yuw9(v8{IScr zEhDzIyrJv=VhkyYv#k(ud)&I?Vxv~6;_Rb9+FO;!pI$4+ey{;R{MHz`&sTC1xToiAF!C>o}x zB@H=gwmD`j8g@z2n049^1&TE66S!$>8!BTnBACTCJJvhx9v4b}kw+*^?qW+XTAY|^ zIK?Hb(ltl7GEoV>Q}#7b)ksD1r;PCeV~Ab&)!wi(gDVQKt?oqCDi?@Mrh>GyjE%Sk zkFCtX>vu6rIE;g1I0Y?5#-kg67iH`m5jaf(&US#7SzVR9Xqs^_B!$A4Wg*BrogPMNH@y4NGJ4)Cpqh^I-{ z7zYs}8nzg*4PNUVMdG84t-HM?QyHM7Tkl*ww8Vs86cEG@nXqG$#IZ4VZ0&N*iUQ@e z<>IMcwA`D;^weae;SyrUZ7nV9n6=piLIkg`lMQsf_U$kw@;q1lAPWm%r406!pB9ql z!5K`EGGEFnt#GD-fah?LCHR;0khUX;XjeWvd!>LCwrcQ-n@z*E;S;emPsDwl^tQG;<*vC6@kuG|GTEyn14(gN?poH;&a6O5w zGKe(IazpTT(pV!!6=q;0=t}Z9QVpAx=82Z-!=oX<01Z>?h(!rY#aWIfu*Eui=(HaT zW})5{opitbZqD7kFOXe@s4Ja`ThiHg&xUCjZVpw!idT-9pPa8%=<#u(8tB(bj*Oxh z$qBA(R`0S|aN#145Ff-{64iOfRLpv#UiIN&3!7+v=fbdKJbHgL3Nw-mFwv`^rp%DI zky!aUeO{*#m7bag%_TT?6_$px!|!@o!9x0ToKyoCv?Qz^|but+oA<%CfKTxQ%iu=ako z+ub!4{S=pbF)0k|HGo>*0Iz2RQbal%Igo2mFJNd%hKKBKN^Z`UJ7wIG zz1)`M-dE}PZi1)WXpF_j@t&EO$lzofhkn<%O&$3W_wDxk+d%?h_fvs0kuspsvKXf(tMoD=QXV@>RLjE)E&B-v; zt_c+nrn(RxejG377ZhrWI)nNes;_~(U-GHue22_XA7Q@o?n9}Tz+FfSd&mM-r>5q&ZnJx)fXAQ$SIyh$ zI+2Y2ApvP>?d2>INjK;JM06H%fudtans|PdVK4ZdxVO7gCpdgLQbFEMBjFDL`1Hf% z62cw(-iNTdQ|S!?Sx~`uZgPfX%P`dr2aXHS>zRqy_I_-bTxY*IY|#^Wae}9UsQh_2qy72*&4-us zo+@F}O&aU2GQt|RQ=Y5d>^p`vY!`5$cJCf0fQwT3pvihf+Tu)OF_kUa+0y`<8BY zyW|nGb14eN7soOUsuihVxpG|AChf)9Vk(^{l>?qDQ27tTTLSPC7W!Egm#GFHzF=Wi z`ar!-y5@i1Z*fWN3)4jlyrO8#!H(hCaC`k@T^0FHJ6OAJ$HkK z8F`#5DR%i9AYVBPUK~nE<>`9<(+bT$6+RfT2&uhH9oGt)y8A$+Em?-J;4WX)?y@2k zkH)!9{Xf%ygRqw`WR0KmcU}E+0345c_;9?N`BeczZyBrH96+GDFn2H+1^Z1vdAeU7 zbvCI^ryF<^>PI+K(H(;A7cxN7$WE*3sl9&tb$-{CEyP!o6OVr44> z*85Y`Av!X4^%~mjagE{FN#@R+nc6;+o(~03hxsFk z;64RMYT71ipttseEC`jUf0d6decq58gMOtsbj6J7YZiw+?!4-+FL1xglHPEtjnQ|d;;jqnEe&VQ>M}_TP3-F zCX9CzB8*VR77ue52U~YpUZx=obZ8}I(1%(!C(#@D0KXq#wvfAt8rAWpK+ zEm$veIzB!2$N+G;wW_S}jFIa*wGj4j$RUHMa^!I6d%?~)=RK1>Nu|0Qtmig&< zJF2{dfQx|``p-M-d#8s$Z^k?|veM?KJ}_VeD)BL$ z7NNRLO-fO&YTw>Cb-eRz0_u3@ikbh;t&kB_P>J-YHc9jLlGXi`8Ws53m*g6Fv$R_X z32+$?efNYhE~ip3C6*iqI$v)GXeJ$72ZPQZncJxOg3z|28!v;VL0S*DmJtH$(7*;H zNi243{~GjJ;n2u7Q#GE<^F<{S;g}2LfKIFW28*%kkLY2t<~phWa7%hD$*k*O!XxAwhvtcT8RMSgSLeo5e{D zru5^pK_b>#7tI+h!Zr#kvsBqqcg>6^XbqHuesWz@!o}{$E1=O&BM!SsCwq2SbBnwA zyEqLnD)nsK1du2RJNtDdVj=j$=E}=eBcd^br{}qaT5C^ooB}wouo;}Ws|XS zC-aZP%2ED|2VJ)(eD)dV7p~A?VtDcQP)*?TE#M}?RPd@ac2_O%(0CBzE)zmpva|+i z6b#r35q3mk$@K}4rp112%61A+)V>qZcB1pFMMr(63~=d--|=k$F$b;Hi2n9(LX|sf ztUT56t%rv~QH3fmdG1-yg&mBW{d*Mb z>s#Ua7Iy&;?Up*zM`TyvEX@Qjw+kLZXa{o4gPR6Xz{WYi!EZeQqpTf(POBvIXbN$R zQV8TAg&NkLuEffG*zxR|tv&%9$7-BVJ*x=X>)B-Cr)+Df9Mmx;F@)Yi>fEPiitIk#0Df2^~(*@FQr zC0FKjfGahLp!5Ek2<{Qw)*s8DEKQc=Hgr9UULiRI{Ji0)X^4)`Kz!@jU`lAP1XzYM z8iqac!M=$8;-_pmGub$#iX@8iPHW^oF>s5OU2y>R*&NFuaFa8ewkx+*{X%Lk%^10~ z2ENh^!tB6G8$3vvvBdf2EI(#>b&n=gJleNI!+7E^or}U9F*k{xnA^eZ%+pDRu(^$g zl{Ix_!U-uMMfjby-DOLTAgWM~qe+yjsGu52@!c3Xxfql9z}sq>ExN?a-Rx~GkU&M9 zXtV;>klhX#VPHx*5%Ud?KP}TL7h4fsQRD#_ah%oQ%P>;R0G-ss;>5gf@faE6%*W|x z6CR-4x#Cbf$hsO){-x8#Z?wl;=lh zbC<_<#b%*;jtmS<*BzUvQ0}S>gLcmSxhQ)2cgQAxO4PmjP~mia5g6 z{l!&yekK=$>T>tbU8E9sDTN7}u#Wbkz)sC&U^}Z7U<+uGST5HF-WR=NdA0a1_@uXn zXn598K(ey+bHm0slnd13rK^P0#NrU5j^GY(1+EUTOije_xHdTOl0Jp-wT5GS`&vY~ z=K93TJI9h3JsWI);N*Y>+@lmB{h)2*BdGX%AHAMHq)Ak;>pw0$T9K1#HhSp8`nEc{ zJ+nffNyoFeHZ*(ZX)y30I4}b-)yNKSBlMBuHA!Gb5NoFegnTB$FWQhO0^o>osdsT% zCGwSdn+dxc^Tu~USB@1Pg8uIQ&+DeP25LKQ4aVN(wZl)sj;rs&U~cT&o>iR znif>)3gzjO!U`<}$~)yJS(>L+1*W(ql^fn*kZwWbJr!$VlH{E+Er84CrJAc>`u|Da^D*hQ;UvoABorm%&Rz zFzymX*p@I=TbCZMvZ|NoMz#cU+R{N=s|fNhbB<~VPFux3bZHqno)N_EB`{4F=mJ$M z93N;|2UptwS|qgGndr7B2OJ_F5BEvV)gLC{g76M4m29FICljPs$e=-6yDXa3 z*~shVoKiyBo+Zt=-J5w0u%*@^5nD(23giqP$C&055h}+%+yzpoj{w%wi$-?Pm)B$E zy4wHBY|SfaGYOmSGzY3Pr<2Uql`S#eJ?p;cdPOw4HO)eg74uFW^5^R07TbTwr?6oS zG(Y@1pNVaDCc7d)zH<8;aY1mG*)`04XYnKNiN6JmUR{z>}1%Vrl#P0#aaLZ z(q?@7xngA`kx%ZNSMza=87iw8b|G% z=Up}*r512gaij?J@bK@jBeRf`!tVV2Q9TI-oq5IH4zt}m^OIwFK$|z4m13Q(O`z{k zn6E8>hkJYmqfP4Ma=tb1-xI>V%Mt!)(ggPY06Ql*d>Tcz@WhKxAYa`9XCW56fYePo zDG&kw$!gn&O)>$20D*4Lc*vq}ODNIcAz)gT#aEr|88?A!;zwq&FTQn- zTo-RR5swR07CPKYOS9CFnz3tUF&1<-Ge{8ca6dXycPu?%XJX+GM3ucR4d>jMCh!Kq zut$%Y88+{!>+BPA>tmBDpwOK1azJ%3`AQA@q~18UajnaT3J(B2ttQNEdrRvwhr=|f z$ekxcJv89%!zieyio@UH`;|WNJ?&iv0W$7NI^0KEzSA;a!y*IlM}Zi6T(l^T4_x6z z`m=7G!`5Ul6|7q=lxYnfxt|3@BBi@l5P`cLrrB)LkeT|esX^B;b#yKS*!e2KK#Gg& z13MeKyXeQX*@2W%r(Ztn8e*u@;KyM0W0R81J(Q{c8)c0CU0@&$*Yhzdrs}k>ePyE{ z*OQSidvbyPsXe?22EN11+gc!%q2oOapXIn``^HdM@_KxAa(Q>SKCW}=@PwSz1c*S( z&E@b%-Lc3?FPV2}Fekgx`VaP0XCl>C`)DYNoa4v@UOaFb>DTcK=$qQ$DtG3q6IVD!Z{MYk5=fiWvIW7*ti%qN9`LzowK}aA=BjlslSE~}kC_`m zF{M`xv)zJPU~D9ev5uH$YEX))G8EBxoQ8+W{V=Jq_@LSl312ym0@V27QoV2`4irnj zOCeJwRg!j6=UI&_)Hu4=*>~m)Je2*!X$8WH&}Y*MQkEE*wqt@r=9IA}(vi0MtIdtT zU`Zhb?ZsY}if7lWaJ1P$u+@(EC-N!`1X^EVj+sEwpmN07<~EKg$n4sR2?Ux!KJq!I zkc@a>%%CC0UNd^GAu+7?JcP%edeQT@Tv;QWtI#XT(4Z#qCPFmgIl?0uRpX+?^vhri+ZIwe9nz(3Yh)k>IO2 zBM6Z$lVGK>tD!g`2j2>;J^u8{M83|?D`KLi#%iP93+FG3eU||R-s$aeJtE6A6OY4k zs9qHnEP)w3p6`vyI8q5Uw~Y}=x2r&w)DyBO%pr3z7L@c{^(*>sdq|=2s8%h6?-+(0 zPXK=|ui#8C4(W{iS1jcsGXM=N2&dViZ2mB{pcPaq*x7?cEN(I-`bcQ>VI2{#3z1|; z3RTBzsAI4xpXg9Q{}VZ}uASUpxorNQGxWy2lRK*lpeLTttq`{++^%n5o0P zn~xLL857q-^;%nB^EjZJHn8)Ix@+fbg7nyd@xmkt4(gn8afM`5lBP zZiqhHzP%NFu`Cdz&D>4ceL7L~lH=j|z#3x*S%e}%c_^Y36uUZr`AE0;>-wT;2p0qdGd5T%hJ9G5~;CaS8YVHd=bm$`-W+0fv zHsD!RC_{{s^(+Fnk*!vRKf<7d^CJ;>l+_^EmO^FDa~M<)hv}jj6K!@s7*rgPxs4|S z;6@8sgUOSiw{1Wo$83zf0Juy3yzy`N3Vmf`W^k)5NL}dXwVmtkcdx(oHE?Hdtxt0n z7_l83gnc%Z{o$UH0=6kdWIrDFPIx~T_sS!yH97Es5TyJ4@Tp9>8)6rNL#apJ;aRuJ z2s}MEl`2BOL2@etbspDh+-yaza1U_W(5jyx%T(rWYIy>vX@He@#6HuOj&4H$(Lqc$ z^&ZXyu?C8e)8@rL3|SwOb8Ea=e?>h0#aD^@zBjGL_aMKN z1Nqo8Q!#vnCY1vhMgMQ+DfIMnRjr<_?=z#-c81e7^4Pp7V=#zurg5goqD_v66rlLP zoM-LJ?=Fq!7GMD zYK{7j;^^r1zp92?>R>IQ*gir|K@*uNZpT$1{$K9p#U7w@+^ZUpI$9KGKfmfQo}*OB zPV5d~#a;dr)ffLqh8CpG7SBg! z0i3RN2pO3`7mgUuTLPypg{#b?hUuVIPQ{|_2gWvX!MaItBz^E_%;r#zk4DB`oHw^e z4#2kkU>cGYiUC(;CL8M^!xBs6M?h$E>Bz@dJWCoI`MWtG*&&X$$#utyQQ|w}`EG$! z?ynn$D+g>e4~gYd=&voOodTNTNS~k3Q1qgbr%XO>k!$BlBI<;uDY_TkL#h5x$~8kk zv=9KB)MO$v7VnNgLG?pEo|(Zy0NPtzq&f3!qnp_iH9zF`#u_+nyjyRg3H&|chZ5F- zttQ?A#4v)&Vt}_bcd~dQ{%D=>8&J8n_fScE0PpKspg$J~)1*+@m-}ccgq?~@Xm;tF z-+f7m6P0S%v@|I2`oHipJ{b5(vovT8B)-X1CD2Msv6%=PKv&s{BLpE41Mq*RztuP* zd_#1-Xt#vw6wHJA9eoVdOt|RpNx|L(KanvEN*F-ZgF_dk%X+$ z1eO)Ew13QfAQ$YAEa?9F?Lm}#Ek`pV5W^Pyx*~E)fg$UX)=f00U?N4+|7_ZeyE7m)2dMoA|n%y^8E2nEue9^d7jDQwy~&fxgr-9U*E_vWywAmigjuqB(5_CQW~O z(wq??A;tg1h}H^QuHuM2U7Y1ow?`qT5&ZljkvK8fleY!$SUNURh6(Whm4);H^P-YC zn1TR`86FK8%u6-%xHd36iDW|)Pea)r>g4L^^GHe-5LD*f zHpdS6qr2m-WCUCAaEv1id+LktbllVpT+Q_Ec?H=S?50+(1jcgGi1kw#D2o^4HbSoO zd|24Gn6UV8CS7JF>#+IAd@T4)baDX?f5DXg$Wco%u5!td^pINRF+1{BJ*+t(WSXU= zZFyC5OuL47Ye|=;JGU`qUra5doV1e`N7kcnb>t0tgqQqjva=NK$o6lGHB?%e_urVx zg;gs8!mvkQBd<^(4jo8ONnFL!^~(2sV4qW3C4kI8u7HYz^f8?NlJ8dS%iLzoV>7H* zHiERfA)$p0Gw|4If#!cguY+B2;h5I%|I@(QYZHH$)U|%O>T&Qe8W(-59FQtcoPyTPfc-p!`3He; zS18KZzi+1$AJ;h^KH{+baaP{TA@s@awx57H<|F3eDLdN5iMB&)6IE3tBZ-4;r4 zMCG~N*^A(~!~6NWxh&oowJ!T%eswbAAqRW}+CZWxsA5-kce2Cm+B*{qq?9r;_!_)5 zp`YZ833p(GdlWjwSqen-MU6c~X2k7)t%S+WgON>YeGZ}Xco_9oBXKQFzEM|;Wnn)$ zxOInVCt_`$@mHIMjGbnxrhzNX%k=1aP^F^JO_2s`qjUAA;*o}&s(x8fTC3vty7~!F z613eq?br?0x9!b@M)<;uT|LHTFvX{3XKS@6OJ0G~?Fdxe)fvm=rh78I-GoAsdc z7O|YC-B-Ksw2nhpcRI+ABH7cB5E!lu_sL>w`{?y$Ri41MYDUn0ac zXh>zNKIW~UMoypRwM=By-fC-}ghvIYbCOXat+3`;IU?J5FS}f1E6r1IWH$5Xs!K=H zMWGqSnZMU!-CjxrzhR(Uy)8PMwDjhg#0AELmorp7l5sTsuf-UPOTEjw0c(nTi9R2v z2saaZjr8J`^ac`VX?hl+w7;?DV)z9v{ix3JjNdFi7>c9%4}(jnN21nG=~=6dtAbuU zD7x^Wp65+->gM`l9vdsZNg3ZBaJS&Oasc^Nv`^bpDqqr+@sT5hZt2p`kN(}-K>OYO zLVapmRIHqj7=H#Ey3v%|6WcvQf{;J2$B$KNpp)Wrdl7v1{_bzMQY6(l5~A)mxXi9_ ztsalJWZE+=;qlHFkfA%y{Ut^f{>^_X2+!Y8>63%=$bD~X&_)Yawr@C9B123qdnO)^ zM3Kvy7-t(F2RsCi!+)n0QAh-8-~27+EEOm0z5}LZ?H~f}ei=b7gHDFB{*u1&uf9UN zcV;-%w4^KuI<<~Ej5h}D0myeT^WWlvl-UFdt8izsK!a14K~=tJ6122uTTLJ@aVVxO zl)+II@+Mgvd5ARFld)p5Se5?WnB#vLbBe>sM+PZ!+jip|X<-KG+{l&=%H(JZ55fwR zIxQ>`@Q)Iw-PBJDOT{RgZp(0Nx4-)a=lN8Q_}>$$c~jN`-OaXGxe{)j5UVOtydn1I?e~zgeK!-Er*`L`f@fue{J}}%rYy=Yd+E=BSyLIWxu+1^7rU|WPt}7H^WTdeTg%A9*Ds=8c6V%2zT)QVlNgK0 zRcSk<&5t$|=@(C@oU8yp&ay&eBdF_4X}4ePwOByH* zWBH>8-N%|n^RL_-rH{Jll)XQE#}nHkLF2E%R(N?8m0qv z2)|ZgR{7Wgmt}}&lO1)=9(yL(Oed4Xg1@YrjEyf;{9J#b^z)C7bIxfg)w&}!3%f^l zxD|G4l!E_#V#+~2bb3zeXVTQwe!}NNx&O2;b545>3HMTT$2!Pbsy;Fqvi8vOv#6Lh z9zirTULTR%WqtKo2O0C9n%ft7Y$;rw-7i#=2FK(TUp_X)+4s-qx2I)a97Kaxr<*Aw zn@dT`i-v2#)hpk}e5Q0a-L9+c!el|Td$ra`gznjY-YT(g-vLww=lueudWIFJeaO>4 z@ht{n3>1Hy`Ooz^8$bW{@6-0}e&1H%)Wo$ zF=xk5@BcjyoY#Ns3;*$$%--?)e%r?}*k4=Uzy3dR3t_)4$jFSmE>#LTu?tW6NP1auChho9ciVjHAfPZ4VB2jE35Nd~eMRTzLr|RCL3oW2mwk5BB{Ed2HC|OpmF2 z_k;zt9Zb<0#3(BTv1#mf@DSPfhHQp7pR4D1LaLM~=E2)7U*NW-wA^LQ8`IM>jC;W@ z2XT`7&IAWlSC1rsHku3Y`QVN%VjZUYH^BTthgYo1uuuFm0U` zz9I@x#s&2%PE$zN;1F!2`0JiaoxfMM#7>NUnFU??ik-+9ez|hgAoq7&5yz^bOP#;U zmVN2C!dN0BgZ!KmN!+X2I_FQ6-SatW<8Oq}n*)yNo%rSFPqz=6L?%>k{o%5R~KWoQdKTY`bxY$yzd=a5lAl!CFgoe2`z=ZDhsV*Yu$Q< zJgi$q5%*+-ea?D!%?cq*YwmY$0u17_44}~78pH^7x8*qK+=xl!eu?qt*GoM759P)A zBM1vvS!?qagT4vU=unz{ZBy77rdKvKv;F4rTiv~xxzEF+Yd=xODpBh_?;mh+u^7*v zYZ}h)pbm^!M2@hwTkakbuZY@0-n$e&KXG``6(ycAcr6X;-qAmcSy+(WqAp5J`|4K& zul?~^QVZFDt>^uGc;LQCU~RkBpz4HZU?%rv9pLT8%%7I|t-BNe2|R?>WGd(`xN-~naTj6Spb zH3rh-q@hiq#r)wKlYEE52M(M{{aCf72--|VpffDnp5Kt#XAn|Ab8%v?9XW_M>}+waf;QHA{ABSswWV`K!8|Dc>pSeo`!H{z^jnyIl3NC@d8fSY z>Fo1g%aOeJP1wMZZvg|=-sVsTf$Obwcf{{5K_vxOq$XPV@x^)dh_w;sS#9)vAEx=5 z0~-6{_VxT;e#g=c{Ksm;%LktCdv#?*H(jW?BqOa~%Ra*<=_F2BQ6h*nK4*uU8Kt{o zsjP5S{~c-RYy^XkZ~>1~%ko_*p0LBd-2dqLvRvm1(-xI8@noh|i|&!2aL77aO?~$p z*w=r0sIGMSE}};*N7G}q-b>Fx=k2Y*VMg5 z{>(SG4?c^MiDZ&rdarL&gNV|%pJaW=N1Yx!9u2lz{@mWV+uZ`(&{?dw?^MO=xTAz{ z?)72y;GC34SS~?K$Dm--0#;fb3Lm?BJmIHs)!S)&*2N0;_;br$D~Xvam4Sz)%*2J$ z*+U;h6*NbV%N&NixIrGcDm20w{ms?l0L#+@7G&nJOaK))CG{J~Ju#m?h@}xV? zzq+~pVR9&)<9b)GDzoxAogJ~QZggV)@MIdY>>X|eT@Dnp&?Lorxq{P$4v9mG*l^X- zE7VpKA{S25?!%Zx2KqTgc{So^()O9xoSEr=l!~a+jW!$lR>K4K8DwNqt(=;$tNq?k z+}dvp<5QMwshb5DP~Pzcw7~(+qp+lFX+3NOE%>$8*2^PoL(Klp_>`lUI(4SXE)#s| zJ^D(Tq1j+%8kf+6OF`#|K1O*w$712(0Nyh%Too2IS@v_{gX#OkKK@#tP_w+tWvjhe zX6hjJoj{Q3R@*pM0kO;`^DFs>nCZDBx1+@g-Cx73UneiV1DR0UuZgzZ&((uY@kLQ* z#-~a+h)d58Y2B)3)=L0i5+<9F$gS9=L|YRg=E_a1%Ieg*t|7M*q0iR5#C_G|;X-Q( z8amNp|1-vwJifw+9xDl+;U@wK=VWEwLIU&(sUL>co+0Hp?-Ix=P%l1sS)`()2NR5I z<$bw4;j5rEVroBN^I?R$wbIuuI7oh_-nHHaQ7X)pjB52$8T*ZQpFzs0xk+dljT-0e zG0rJqAkH~1{a@U@XH?Vcx9`iciv<-C5dpCwAfh5gTBL}DCSAHplMd2L5|@Z{5D}0X z73n2XLMKtAC`b(uAV36!5CX&y5<=?zfouKC-us-h$GBtcJI>{GMi@_-^OvwZaMZ1nE$_6fK3^(7jIhnGh=9ylm=z4f5EV)K4tr161*oR?6SyKgi=hx;YU0 z-|cfRaAOSGDueMEcJk{*E!8I8xg(3l8z<(@$7l>Dpq|BY2dO;)c&jD~&5KLH)Qn{c zhf&wJ^_)0;@Y)7@HZ8^Z^za903L7Svkds{)DeUi)8x#r)xpg8NJYiYxna3*T=Q+L) z@JrG)R`|(2s|j{5_dHxcs{dW6OYV!=$UkW?An+Z&{l*IgOP>E<-j=qcO)ENXWR@+?-zC7vSL7Sp2M(rm8p6;CW=Q)N7R z*J)zzAf@D5rV4v(#x{|iz_h@0g~RC88Ey6&ZP4>+*}=1G-02s0(b1K9P;R|be)4Vk zWt=0|y81oddHuY%Z6wsg9rsm<_4T^KX%xwncBm7$nhIa$VCDCUApxCOYn2(0`<2Um z9?PY^^C2|KlfE^_7etU3l4sT8jKCVLFa;!cxQ&s5>h?I#>|3LMTcZ`|F%>=e4uOt< z40auzd0^_~*_eN9UFSPFpLIB?wq~F2qF8AyHOK2DHh)l{+qA~H>7XrCK&5gNjpZo6 zl?_jGne*tM3+h#!EQgy}R$Awu>o%`;PfX5X8Zly94&Q{hu1b|V}aqNxo%l~-56t&`jox^lkJ%8Nv+MPMG@ zJ6&G8lF%xTM=-MxQWq}{WXcFM(uNZHLaqJ1QWY&dPe3y|pao?MB+LQ_GTqdPaGTl# zuR8$cejdE@A(Q4^#VzlTU)VrlGp2&O)-`syLn0R+b(03DJ)HLYJeP$Iq(epHgg<|w z;v|Xy%iY<+)|l%v7Fc7fi$l}Lj3@s!VtqSK6qG0Zp*Iq-e_hsI}!D$msR%wdFDdDw`}%V z|DTnR3#)d*JfDJvF0}a~#k}W4`&%BD4RQ)3kIAa4S)R;-b3=Oz54lWF-wIuSXGS_9 zTXa^u_M`oE+d~OP+4OuJmGG&>>o0FJEtZoE9zWD1H>5Jly&CwWnp^5e&{NkqR};8; zWB9jbh4v-on6ZwP6$3S>&n*{eBzpW@2ohiOdDFx<(6={_vXNVO6SJXJ#HWThR@fT z+XnJl1NSa4KZx<7OSF)kCnk@9gBPUPfCe^z#>&Hk($DH;z4In1DIRHBS)v{oDH{XT zD;^08@N{6+a5S@bM=|Z^++@^?cZG2p^SX%4x=7G8l6#x>dDwJF;+n-A-=yN#H3j0@6PIRb#)fAX=4DJ-t6Zok@e4PGj?~U<0o1_c$jg<4 zcPBlYmJ`XtyXDp1K~w16Y1cT?4P|v-+MpUAQ1)l^Z|q_m{4@5hbS5>4#4B4u|vcJgB;Jj+-5P zCfG;S5!yQ)n&Ibl7q8)3t-tKjkbjfp9 zUtA8Dsw;W2-on;KKRb#oJh5ln)0h~WXntWutoi~xt_krKUwwh+vfVCTUm!x)bP2ce zS!$5WMWPChtP`qc(E5_LS_a>8%UREEk`yFU#EXV1Ja6KSzkwvC_SAAcIThS`Z^!xq zY6Ah4ES}2o)c6Un3N%}XNwfXya6_T6+PnsKttrKY-*Ypks5M=O5y&ZoW&I4A_qgcs zc=~|Kqz+4oY!n^wNncvEgt&CYxv(9Zt3li?J3rCTJ&=9+u z>hNCObIDh-EyLU6{&)l+dB&4Qr zDnG1m@8y|&`1X*?kMY5-uHmKYeyQv2@toGQXV7=VLkH0W6wkxhUOOZ<&0vweI|apC_41sN zG8S}SYNI-)b~7chF8Q}mWq%C4Qj9#?c1!%=GkNbqujYVVsNP?s@z*3dKAi)RN=Ik( z&YMqtQoLMRdsa_cwcMrBHK);z7Fk#>ld9d}Q+88g!a?GF^|@k%q5Pp8JpBBXhg?1u z-z*&NUtWW@#2cFa@#Z*-*O#^5B3iC`EjG8w5XskhHd*2IU#qRW96$SvpXI{j(BzVOX{=o0q#Xe`48k0s5qU;oTvL z7R~Gze#BY(z4$ZGV{jK?ck?2>)D`z#+zDY=*~eHQwe&zK5C+qZ2*|FFL&NB^DjCy> z+;<;-o1AL1{=)U2Az1+Az)~>u-Cw#3& zVc|A;f1m1cu!D89oK_R*y2LA57B;H+n}U2;+LMA?PVItKqp5GA#IA4oGgth7@MkV> z7b)M!nufUJwj)E2mgyVW2CQ&%EN=_if%3ezsHA)B7IY;;0Mw)JIEsEnRza4Bs045f z5MH?A!CrB%w)+$*Q$dx$@c;;ds~TgxWmg3yNxk?TYg9Z^8C^OV^sj{r*zejfK#1 zId_&}39$Q?(GJ*qW3x5Ta2pD1JSvUw+M1d{kCl_YW{aEh&0QchRx8r(UNd9@fdPAc zalC`>Iv=SdS3@x@+RZ*I%Qpgao5u)Wgm>0awf zM03B(I5{;1!^ag}V#*Zl3hx-$u}>s1MH1ui)~@?=*JUL_b7h*wM3^~NP*6#%GCtcn zXb4oX?di8uldNh1s}Hfe@DoRn_ZPFc)m2^oEyEcSWQ~uUkili#WvEk^Kl7F}G))Rk z732L+H-44^JP!$U-&a87t+Qm&nQF(Y0!J*mj(A(+nYs6_D0DO)k_f_W59pw=cjwrv zq2<7g%+i&FW;-)a>MnN*pQ6$q9xf4Gg6G#nx{Rk|(tB5%L>~uvg>wOGt__Kr;HZca zZfJyaYqJ-=QOm=s)|w8-tc^KzPMyG;A#JB|HBt|8qmfoXiB6eWSZK#|PGYT#tq5by zi|%#8R0Lf`4iwfnTD7i8?(_dR(lS8il-w=&Faj<4^AyjUuVb9T@yQ#@>2SZ9f-%^o zG1K9d_?yYXQaOtvan4I6f$+&zMzIoy`YF(-c0Sg6fxn@cx_35D#!|d@sFgo-2{}+U zT?ki21L4|n!I`yA0d5hkU(;~HJ#zlBU#bcu(RkB5Hsk0~!=|*Ry{HPGeDl6vm!KVu z#87@BH;*&H4~>wE25f{QAUJ_+RnBcC)<-Ph{JDGzGABwqjx;4J$Om9MwIh%)ms&lZ zH${4sKIvY0m07>A7TUR=+_HPMX(!$N)7d~y*U~M&49b{Zwa~ac#u?~>B|QJe;EM!m z`@(;f#K0_;A7VN^w8d-Lh(g@0T&o z=q$wJ=|?ih?{Y5oJ=iX1PCF^EpOJu4rj3f!y9fCE^0t48XLbmowaYf^6!mbyB`-c= zXuDTxg-t>091%hNdO$6v9^GnT`f3i%i4$ogKqPANitSuzsau(^d+p+<_FeJ~0`O^R zVO2%OvkPsN&YmV__FNJ%AdqWbE_KOxI`+W0ov-czFZsY*Ut&H8Qja$vH6@seiK^VB z#HG<90eb=W_Qo9LaCWNIgeys^jt&Vum*E%_->fFT0wl5Osue?@%Y{vC>NQIhz;HP} ztDLNpE!+gV3o_&yM9+n2QR2<+S&t^#X96W4U!h&!`h#WO%Xpq&AyrivLRA=N*)61m zvU`bQQ5lQz!n|9ck15uwfo$JPs?WkwTOPgz`$hDMjJ`L!X~0}9?Q@ugPa?_qBRKau zAgkES+qj_)#hd9fHd#u|%@_9qZB*Fe*RuTk(mYRF95o3FCx#bdLCXmp>g`s>HCFl9 z#Kl3Jj2mQVp+ht;<+fY`N^cfqB8L>J=Xi&i2R45X-Mtb(s=4b|m*cH%e^l^OGH?=jQdw*kW~MlJ5SToN7*O@A#L@f>)ir?X zrE@q~Ctzjokl`(QZXj5QTg$WK3vbU*tV0s@bIT7J1-bItoNlU8c-r#xmkMP&DB0;^ z#!H~)X-m4L)`T?K(Ax3C+Uq(@LAU*0rx?!%_l`xs(3$gctneb0ckiE{^8ZKxAd^ot z1(x#wY~g3B8}2nT&fxWZfu5wAThty69^dvU_=-$hrIRe^U6fYarOD+!e-B-M#s!H% zy&3qa84y3s8WWquDi8W%!wo`~4j^0UbuH8@Z1yb1DU+85iU!|3<7-(tchlidcVUSs zj#$~knstyZh_Djmx9LQ#?vdhV*O4=G8)3H%9XmlJVsDXSL7nYAHlKtgM`{nj3)OQC zdTd7uRRXAgJR60c@9cAYjO(-tuq5qbiv*#Rh|C6x_HP~#_jf_WRXFa(jxSkz0DoG% zQHoff5E)iaD$1v%C@VKnY3&Y^O6x7=Kb=D64PPT3R3Ef29?0`)I&BLZnwr|eh8A`u zEOD=GyUd~;vJ{{ZU9!VPD+y@mt*|IN`Ju(GBo)Njp3{dubU>;uK&gDnOqfI{4QcH; z2^%^VQ$(JIDTjSD^?NbOExvs&`Jw%Hfp9-P)D*bDLPpIki6-XiI+C|2W#%C>v?e}2 z_G}Lj^lQ`7ol5G>OFO3zuCvA}ERx*)3BPoDbRV*^%|B{HLCTH5xQ#lQP)>PMVfF42 zpobvE6#PP}jj*^l!2GpuvQ#y{>YRP>_#dBwdEW!l1cXm1q}dK$s6XjOS{#n5d#FZd zXV*gItw);k9A4elRpjtWapWFKT=t7wUkJ_zbDqq?6AfBi%g|JlFsfNaUC)E_DClXX zU%kDTTA_7P*6@UY{lw37ptK1pV&m{}0Gu-12pnF(TF!TGe;RY)E6dN|8bmo1A$&kV=%^8I5}pj zhFUVGp97K72l}P{cF|`c-~Io=_Jvw`=iIq$!^#id#N|m>aF^gFy}!J17?ddXw_@Pw z{)Zs7ji4m9zhhEKEdv_+d)mxQCt2%nk-IdpLT)-RMju^`&Y<>~XXtY?T z;Qv3=27k{d-CEcGjOOBjV|O`ph=SwlmN35=W{PDly7I}5G~Pw5ar!7>5{n1zjjy0U z=if|h=Tqw}fvqe?bloA-5t`Sn$lcb3wiXdc`^)}Kr#j)T`+^ALaZ`UP^clDty;9(L zS%D;%GJEaxsY32$6Hg|S?8N-n0|}UbDFV2l#~Qw>D-YnOirbi52t@6o<)m%SB+9D6 zB+6@@nr}|J543@dW5=nhz6p@>(f7}?-(k0Z(nh?U$&f41U!}Xc`Lnp2LIpDDeOhl) z>@`K=9sSfqPwBfGjbUfYQqzx$p7vT^0Rs%^8HpdbvHwtU1kR>Mi=ZaZV-dt_64DzD zXYt*SnbHyCb+v>LFrqizyMMxTT$lzLy$!@TS0*9Y;Ca+lF#BQ08tGq9KvJJDS^BC_ zq|)UhKNCFSPev+zb<8u0=C`{4F3OhHgNIU=zDwbRhrrK{qsscP&6TSZqRx<^Q9D+7 zbW9FKDqWX04DP7lT)C+H0?8(RJjR#2pDf*W=csFQ*`N&<5N#NN4+5Y1El6;g2<+e{ zg@!mJ&Fk+C#NKh-#-lgq*i3NcmP|)>So|rd zz;j0;%!Apf!c8R*`Q(6Kz^Fo@9G6o>KpFqS#%~q?`LoWG)nl%oTicPmL6d_-QI)s! z4|qXLA>@pRWOWt3=s~|X=O2;;Qqq4=B!qXoglyPfc-=~Nk6f*pO)_xF=&3_Iod4yi z*C{J~P50*9Fz>pOpwnb>VI%w03=8z9>Qf^}t7r!&I2wQ=qr=04Zz;R$+|0;VWvrWQ zK`feP@_j6HZEff-j$8-GHkce=nH4dWeP$;;?IFt{(BxlH);PBphG9UkdOl1%Q68L9 zp>W;7A0O4J+=S9QceA_Z5nEJ*+h>hv@8BAi!0BD+k>{zYg&Q%LiLjL-`4O=gJ)Td$ z%63MXVpjlZ>lC{jhk)_qQSkm5f;e|jZtUakXZK^tjdqH zvNA3J3yPM0>mgoaBTcGVz;%H={;(l!(t!o_Zou{Ip>M9RnR4ootIfXw@n!-O`wfs# z#m5%Mbp^oNix;8HPW2wKdCIOmy_>p&Q}6$ex&vboRBR$D)^=$Od&srObnKaj0Ow?2 zZOjePPZt1Uo>5t9wM<*f{b+EhJH}f$^WC7dOz-L$MFb?X4h$9Von&|2UBE%wL%(eV zEyl{A?7~8%4?f+0b!?w6a@1rto@<++Ty<8(D^nmdPeyT)%+|_Biq4!+x-jxWs_s{c z_IaKMk7-$YBdo<-*y-W%+;krU<0gF=CPLEvm{-^idt!eVs0 ztgOG|!$;u`Q_%NsS1pQx$POEf-!!IVI}^m+8v5R~8bAH@U-4_H;+&#`w>I=aA&!JH&uGwxsh-^vF-+&7}_<3YqK zLoQ%t`ZUdKGePFmV_F1>zi?!+G*nC&B}~=&Gbr@sZNScqA4Zxl>Wxai5B3escM0{# zea1W7*(=Fi7)cb`yDV7z{>6^pH=}l zxJWbGjg-6iPLL$Y=R4Ec&cJ~XuSh%e% z=r^4nKw_<|sm(|$)N8l}B#j&RQ!Mm|_4>L6a-g|Nx&(~P|H{;{#o87Xzw-b$l->={ zS96PNwxDh-XDaGFQ1P5n216^Y0^r#9Y^d>v{F@1Uq=g}*e5S~+^>bGq{6L#ZAWlWj z1}KGuk(vZG53?J+3S2^^bd({U4IFdDgO`$+9s+>1S3WR~c0g6mV^s`Z<+0}jx!Pa9 zZ*LTI$CXM8H=|RI&FBH-(*d^5Eb8i+A^-=I4}2b!k<}CqGngu}_<}V+=*&jZXa`#$ zjC-h@iSqm}Hd?y`p!visVlToAzdXsoC%IP3E7BI1cV^0KpLDKb`*z=vOLiSZZK(sm zfeWpf#hFO|bOT&Sfkls+8)<1Ms}Rv>iqvUPzw*HDTA*+4h-d%j5a4;57jgBW`MMx# z6IKg#cz*aj(6@x64ed&%3H#Vp-%wxMc~c3Yh5WOsN=Labg#OQ308dqleFl_$A~s-`$vYu?Zb`* zV`<;)AbRpW+|cm@HE;}HJ4djqb|N5st&MF^1mg=RtO;)nvIdklUby}ojpe2$`;tdr z4i5(&VAM?|4eTS|%yk-dew{stJIv)Q8}hd_L2Yh+X%^T?Aj-D6vMlWje3}ooXCjR- z6LE~RCg$s`j;cW+l=Js4Doc3l5Y40Ibi+z>uE-f%&bta{Nrb^y>J4Ap%2F6i2kua?ZWd5IsNH!OnsNWhOahu4B`l?XrsK*a zXA|Lny|xUxl-%$e`Wpn1Bw8BH=R;-&GX>NX8x=zqrC1KSOr6&0TLvB{H^7Be;6!nr z8^6lRCK+GU6j_xj$a>&V7A=CBQHV2~>SNm}-$#%qTykANvg>+=&h?zx`F*FL^2Qn- z+~4o{6~+rD^WQW)@HY6SDq~N4PR&y60bcH6PlQyCYK=*|pAN}YJs7}%Cfxgoa+3e- z=%v((`vvdiu>lK=($Sdq+$kF75Abxgsjfc|24J247PPmN&WqH_d3Fl{1+U4Q~LP%zB_N>ha?79@0!gK zsl!!Q*=wI9KLoFH8ob2D53%cdlp#1atAl7?Gvs%5yrjfANZ8(jNYA~RdQ_nFaXyWd@tCSEtUIv=cjdor)LmioK&~s$P^}2>#B^ zd$WR@2YmUz!ucJ>RsS7aKcWYt6_C>p%+>^#@8@9Ltn>vAqJLyJ_$&)*M4icH%#SR4$zxd8uxys!nw|g6{bl1SAR>3p*)vT4M@sxh3 zy|}>y*3{g7KqZVL=z?ftE0+GWh;$$xXX_WV%Q{TG+a zBq!nwWdAJxT7}Zu#pfde`=P#0JzS0T$$e?*f+GcLBRk|Fhrez=zK_4)5PmZVlKpVe zlsqn?yoTK;vG-U=nOJNyW*5)pOwO+>o`{qf#{L1>9*Q0*( z`q(XA53%yk0kw^zh7IjQ(m^O$WWvM{L)&=C(vGA{+yUMLCi{N!0VRBlKe-z0xcdzR_f>(IP!$trJ%nu)K zsZDvi#PEYY`ykU0Ft_%X1RfXaj&Se)=HbH?tMFP|6UmZrFZAl+y06vXzJ^|hN*&qp?#PRq3!tuEdrF?FoGd!w7^!kDaH+t&{d*frg@o#QZVaCFxDaKw7NWhQFo8ZBvC3U@G4YtY6 zPeDJ8(gVeN-?pZHE@R~}R02;g4CN0#*HFE-iKm!#><(JJhN?jC`tBT>cQ2f#7c@Us zRO;EQx=!m!%yI_U8|-nm6G**w2wf*<7}ML>`OBV30pz8s?ssdQ1ukL=9EL+D=U6n6 z0rvGiJUz2^^}StVq%mS{ieyvp`s;Dc#(z4sN3+h@-RuD0x?>yRX-9a@S0w`g^gq(` zkcPUJJ1l`3$%giEQ%+ok8EQyneJ^{oF(5L)_lr#*D+Va2eAeU7AgqCYX+KQ51Yb9( zOSOqtLTP~`SHUzRG9jpUt)Ns&XifXQ*}Zp+(JE_dH^wqIkmu=-9-A=BzQ!EC`}J;F zBo`5W?;TjK0u%$CP`qk`W=yQ%zP`N6tv$7BVcAro=8JhSxvYqoDqMc-$-Vu1=Y#*l z&PN1#f8?kS#Q9Qp|Q(Z73p}hpOnRB(<4G(?zpf{zubNK7$71sSO-#xMHSqO zs@Ey@MXziHO|eU=Mr6*^A2`jsKt2Xs>QPKlwYliX+-{NpK}b36xKy(95okh5_O|kg z0E1!uUizd+@rVM<&>_PMI#D(Fm(N-1kCdMx)NWY!F1F^EHu^Y5aMc&%u7_dsn2&$R zHSWA6oP+#=aH1{fl^XeM^b?q&@+j-S;^TuXivl?4eA*C~^F8q& zy8KTsqwSf8Q3m0gQa;N#gL>%C!#Oh3Ng*{x(OTlYj*sRJgm15Q(`~J3MTZ{C8Yw0^ z0j0ii<2#P~C347dn@Pr-=t!jqeHrEQ7hZ*2qEq;L-W&6`f$-=z3!ggZQly=Ehb4ck z;F5Yp<0zdCcjJ@!rKdRg*JB8~ds8@SE|xIOJxn-k_69FEcd6G=r ziqHyOjCU&>7})2#q)uba?FcD1v%baJxXW`~_KU#GeUmgI9@9%7n=~zr z_2x~@;>S&8LiLg!%@#sW_nhUN*hj-h1x*G3Qx&Xn9Z)Uxr^`uMLC<5ppJMQxPIk>| z;l5K|nybML%x4!zFb)tqTi4R}@!alZyf;Ou`b}L%Puk?E?PGhd(E7xFCHy$N4%)R* zI=!QX4et2;Xgo-u|EGnYn8A<%q0gXm54M;RR02#@Obt9AuHgJ2mv^|G^A@{BruX!Y z9-H~zzY^9P^MO526Zfvt@5#;2CKy?gBQFM?n+M`crXt=VZ2UUKV`x~xB{z)e+^H`o z+a^@R2!GPtk5<%4mq*-Jfv6YqgJ8q8nk0bHzLP0gd_o(5g*mqy`tb|VY8+XKq=6Ht zJwN}5kJL94%c-1)Z|@=lWw3@@)b&HN=>lB?bwMvcP-{891-mjZyu#y`fuVV{gLS|_ z4*v6DoHt_or~6e7NhEjWHDtb4LLnx&U|n*N31Lv=tg?gIqujfAyUFosu69_}<~4Kb z%0y@gq$&oKuPQEEDX&%O!UJhAhpOEYSGSLH>O*d2e%=3;`}Ro2NSRtA+Eo^h8VJac z|7At$FtJ*wwg;@~V^v(hPw#b`@$t83+T~O!XREe2c?@&~A_%iS`KItj)M8G^3CKz1 zTW`#{FMwKyh8OpNL+WOBd&_5#!IV?|ha7&h+M%3457@-DuEMvEaQNA?A~UTn;M7b9 zO0#+UY0leQ*!#z3MioqHO3Pwm7*!PQos;sMIruzs<~y%GrY*Q0w5Z=GE^ zKX+YbbMxV{rIHGe$W3wb8s`*(^JbMj&KK%NaZC;htn(cMDQeB7>fb)l_7^)pJ;vKJFfSFvI(a%72)Z&p!W3kJ z_`PhW@0RCI+j8OqFx2xS+*|Ah3C^xthp=Lb+}M3y_76o2rvpYc*2GLtqXBR(-EpM! zH#j%@3!Fa%sYIEEN-lL=?qPTm!}~%WC~abNd=$`eqx+R>`OZV;`pCj1W^orjEZuz^ zdiBd3{Mmy>Hl*X~?*eTB^takL2?niDU>U5XRDQqCBnpl)j#F8-ojZmzgr7~hnEX%~@?XPp$zv3r8&}O~ z%C>=hC|eoB0M1h|N6MT$zN~yy1jOv9#TV*cYjive5{4TbA75cb%97q1sQ-uFT-d$4zNcul2+w|p0@%Bq+{|RH-85{ z?v^)j>rmW|!FhVS`9C3tyi-Ci%5MZWVi|V78cdVq`4rD~oovlBoH$-+k!0XK z^1hyO^BK!B_jrfY1q=PAtl52-#h)t)Qg&8F=cK!9NUeDs)+|;StLELa?>*P?)f`+e z!vp2nycJH~wmVcT?xjaXB);Iw zO-IOM)SNE-wm{SSL@8#Rzzehp^1~yThJ3WPPjBpONq~3#2EnZu^X@cIQ3X4v+V!W@ zzN?#N<0NW4`u7?fuh`(>k(9WjtzlYb2#}CkA$yonPS`do`Y^K4*1iKJ1H49>a)_Bx z2e6N9J-ZpMk}se>+*^D*?dxR`RPDqQbQEG_uLWtNJ^cVr}X> zv+B!6SKni1FbW;AUuw9g_%mwXqrE2s*dLm3J!HMzJa6K_f$w{vOY3q&)+!VQJG99< zKOts`jt5T)rG8(l-B-e$2J{X)#V42R^q+5qse}AOIM_F`oY44srMc}$lLlsLQnr@? zSy4^?o6eqtQf)6bi)!Qal7`l0TqbUrx9BElI z&LPD=HoN)tvrrmy>29X$9RyTfix&KZTfkgrj@2vY!+VS!Kw~dajNLixK7O?@TzTyR zec-=9@mII17v5v`X~i>E<)Tq46BL&wJGF{|{4c`tvXNvztIxYc7ziCI7>}!6*r;2{ z?G?RWstPkSrV5p8^|F(`$oj)qUw5U2PrL5s;s5+&G{1r3a4nGV#3B7j>QAP`uU*|% z^=2SDI0jwdg$SZ9e!+eeWkC$Es7x96sey<5t{UyYiSBshMHUr-*Yt^bvCsp>iU|RY z5H~ooi&`u6-I2*Z2FqhVAzq&hohX~Hpl_2zX&1P1H6*U0=oKRyue~f1kkpX4BRrpM z?kUcAULT+n7KV|m*;|O(nuSetsa9{Wq16V`pn+bS0^IPn3)7ST+*W-fdEYAOzk%J) zL3;j)-6g9uH^!k{lZ%A$(6AsY*x=4hApD@_FzR2h`_VB&SX;1U(x9>>w#BmNa_C0A4$9oa zNTatO(2+GCg?X*U+iMY;spW+&#Z*+lbqD9I`2jcwr~ermpK%)tJBX&%C8N4+2%=Dp zIjDXTitP1|UVGH(6hIUGr<@}TB)uoEvqfUKDrbS3 zMkb&K{AL-_Di=sidN^=pZP`8w5ghFp4b*er-=1|!ooCbmoyMBt2L3GB>-ka1P&KTu zHGJwHJbrSM6aM#kJZK&Z()`9S{4LtAVuL2gg4!HKOYXPCe_snQHz4AMNaq zq^9Ia)EN;dfc8U}PXtyP^D%0Hnm%_FPxe~yB z#QvwL0DwZ$uE5E?ju?fryKuyvnUtGrMNr|;1ZMnkpo(_3gUh?vyyb4V8cFsD$A@U$ z^UD<&w~)Wd?Y~_w|JAVTWZ5b20^rh+FSS)}23Y4^;#XL|?z^m~7k_x1VP1yIo8^X- z){fG-|27Liamw#jc_n9ae_y!BD18_Y#IuIUE8aO1P3MlGF506^Zh60O!1ITVZw^pc z@q-}dq3}#3ZF;wIgG)-9jLgvBt4)#NeSI&xLc)4Z<{W0~BUk%Ok9|hwV=TzHgJ{UP zl$Rk2?bxtK&w6M7Q{)Zb>gRr2HDWWIHTqzv6h#vZE^zSgVO5OmJsnDN+b4MG%@2UH ziHc#Gc@i;iJ7B-LeuxxdS&VrN8r@fYR0Jx}G+JFJK6tOVYUh{~@Z*0T{6JAczt?#}y?qz5w?ocK zxof*vGtd%$o&bXwSiCp5`HIJI zJ5n)|{e#(7j9`>Zb#{<+*!O4AHE@x0=*Szb;TC z!a+xqd9&oP&v+D&TO-NnEm|uZzCwpXy$j7!5>Sry>6bubA|~#pYWeDtLzG4&8A<_ zf()k=u704jX#p|EAfEE$9!uD{tlups2;}a&uENb~HZS^J0!tL!1zZrIPJiagKrQrx z9tNkwx#XA7K~{Xlf)mJ!Q-Affor3(1)iq9)5rhMJ)QW2-CJSv~8i(^_*_zqBo{fjh zUEtMxyNPZ{xZ1vEPo|?Rs33D5sWgYLu~MIGk^%D9 zI`4(vx3tMgS+mONXt${ILL~j)`}`%h`uxR9W*!y*Is&o_IHQ%U{Q6Xf*l(eM zcl1KIp9$_exi{r;N106@Y6~$sM=Dj<)QtQ(gT?}hpc4V(k$ngzkK#L9L9fdcwFx%ljvnH95>%`)XxsArXaSVR`=1d z4#&nckxe6Koz7p1VPjUAHIoe|qw31zZU)HS?3utknww`Rp|fFa*vy0NEZ%)i&Rv=G z+IwxtAht(1qqpmgy|pl6pG9W}IAL<1Df*q0Q``-UGri06xI74YCYYQrK%OpU2@>2D zFLhM*=qhtPLzd{3zvv0wu=agUaRVhqD6`iD_}Uw zpZje4Mz;f7;(%|y&y~-UDctB{fti%9p`}<#gGw4(F%yY9Oey4BWqP@UJBV}KzHowF z=G={}DUXJRWD*nu!^H&mMIz@Nh%?_HcHDcs8FxBKmR~)Tz~?dzRuTfB_Q&Pr1IUYA zp1up1Ry=y(WZ1kQ_x{V`%%KKO?OYuUXGYe1_T3LV6JO#?W0aNQ>+Q%=^J@?U+gFKn zWL4;7zi%qOsB{QZ#pKqiI16%QOxB&Q&DlBNagH|RD+S(O-=P~`9C34f87OpE7}_ga zQJynvF=}wtHbE(M0_7)tVlk-0eHaXFxa-a#-2D{h=I$D+MYKCUbmiRYr!SY?PWVD5 z4)+Bq8jol%w<&c9Pyq`TN<-A2cg)S9NK^g zs;$Fyj(o=n^K=7d6Wb)R5%9Kr8DgUvpc?2MCVi|I(m0bji2g3)GCSU*;=9bk8(F-v zcCv>CxFn|a;S4&21y(B&_KFQ2CMV%-cSmi{y)!U&Mld}&$;&Bg%s5^bACFm=w-Zn8%{9r%I2FLB%$<}x=XP7IUkk#*Etw2%98G&EdmPPWMeC(U{} zdN?ZWm^aa@?K&c#X(#fvtXR4kE~l7tsZ1hB1v9nE&?oSHR-?RInmw6V_7$F>wILpSY8Jn) z`wl{FtB%}vD)fqj)!1Yk#UY8s>=SZ=+p|{&6pJYE2Op`p4|v?|PKi{1)(7&-bI=}? z_XaUf_sqeV_^^$*deaNn6g;G$y%SH5>@}AAsgrG2v8P85djd3f>>0Dt+vwX_J9)_w z_Dfisbt2O4S`42yXCq>RE*&QL+Ov;TeeK{>4~g;x+inqm-n;GFrE41wFf2!NY;*&> z_-K8YrOpk-6RMU!$jUiu>Q&?lch|zAyCbbBI3i26&_W6I!jB`Q!tN=O4X2GsOF8eq zY7jC>&@#mLENdVnYeR(Y0LI*-=7y>0froslOFF=m;Py2H#6HXM}ilA zi2VL8p8F%VbxJsA5m^uXU`F=XF|<^;4gzM=?Tvz5UJSKKep5Vk%;iZZk{{M`6?yUC z(>1jQAE?daZumoeYN<55TwvwvuZeN!v6Zhr7mgVUF+_xRU4@vRpq7%|4Ud8?B!@>< z11?q^QaLdN9eEtK=}3`)BW)qTIazBgVFLZbt3=o}(a=|@H1EDws6@yK-{Vz!!)2r4 z^L;GARNXKKgGg(O180*@sR4FIn4{cbXxZ6cHS6o7*;B~r>XJz7-UzU0xFyrqg#0M8 z`7r)7eY=se`WNXScaA4M@7(&BZEU%mZXaqI20af4Ssq7S;avH2Yy0h=e?~p5xi(V+ z<{HG4th`G*I@?_3jp}HW$MvbG_cI-QBy*1sJB~|ECKWW&otnq1dCc89s+}yH3X?%= zSx~bUA)NnF!BVl& z;iU~sI&$$}UD-Q}RgBjvX29^wL9MjnjkA}2a<=1=&PeA_q_IyJ^&fR5tqCupIxa*i~@@~-=1EbMs^yqb%wu3c`(sA`@EGbQd|TYGD2Czw$FaumJwW{cexuLg~& zG$Dh|+y80_adcWa+^t4RTf<7ornmFFtRlG2EDW=3!che5eTDK?^_^cd7e{moo8ay zLN?mmvxiXQZan%1gaXMw^v3R@ajpbDLm!rS1`F^=lPySO z>!DsCo&hk(V3!vy>PT?6 z9KcyipOVVTh}O*}s!kE=GzI5vX>v&9FmNsm#D8*iV5Cew%0yXVD~kEesk|uz{^>qV zJ7=h+hH}`k?Kq_C9_`g7PGey+E{rR@$%cM$0HesbLR%cZNCRrdaZ32avcct7DAgJq z>YA(~B&Po8+V2TEpuA7ppQ}g;jiiSRy!<+A>HIk9!$p(hvRitnV|_0TS4j9_7Fi}Y z=1lD_MDVmK8M?aFEtSN8(Rn_334Y~J2{%0Q2(_Fm$e=tq6ze{lDfv|>DbcsPiLjws zBcl0)d>MT-Kc#=MY(>pX_3gw%&YCM(jX?ekxTOl3`l+MnG^#l z;Dmn2@=Bs;z#BcxBnejfe zux*=4O3yKTNhFU@XM847CfSx0}ol%5C;rS*cPBMxh5rML;5Mof{1&AVhdiw}Y!wi_>GD>}Axu`3ng{ z6d5bCFc`6i8L4`>0?{xw@-y~WQ9N`2UbaK$eKMINQwIg{5+rshIIzblYh=9*_3V#8 zd7<8uqFAQLYb_>5eul;r8Jp)&EWm%U|0?>`=vUFsaimTxKi=>zy*f?zz>9mOz3X*4 z)(*_OI>D5WDvy+&84$-qz@oklFc;Wqn3SmH>+E`XLTi{nJUJ|0Xeh!@SQOQj>2N@j z=zzDnIc81VQn5L2pi%*;)%_)D*=9nlHAyZ2EyzgT{$$z%`OKr6PX)o_a^$!KS;H@M zJBu4ftJrg7{v0`fHvzo2;X^9J;-f*b@#q7JXP{X+&d?`g1) z>ZYvIg0NxrMy7{&J5tcxz_{>w)O~|bsmf0B%I^1MXBOI}C4?xj;ry9Jp19>$vSkx& zPtMI+!*9QNxum9w6(d}?*0zNPV(`lQP`$QAY0zstL=?^w)!hL$Wp+SlebkNqK1E3@ zme6%W+EE~?+&#-kKlkW8;m%e2uH z0WmD7c8&I&L%OnOwGAf^aSg!b72TL$-+W5g6kZFohK8-NGHu$!!Yj&Jf5 zD*Jv%fgX^*9+x&K6pl8iwDy&U7we4M_%P`!@?QCvyHRrlaGRvdh|1RA*`c4TE_OZx zBOum>pWv$o$}(fEeW{Fn7$8cxSII)h=Nj#p|2m(=J8OL$2*h`Bn@oDgEP;H!~FyrcLco28QtBG6_zq zG?%rvI?Ld~)`O-J`Z)MXNB8vrcdsMw+bs`uD}J09fgfp@g@S0)mNC(1|B}Qvr$g6V zQsHQiPu;?B-dhUn{7eO#C|RsW%W@bUL7&jEXP?(BW%SsBP}YTNmk-vu{V4r&if^BS zedekS(v{jHDvvmsh~P#~pE#kn3l8;Gw^LB8R5r7CMC1sz`Sg5u`?2;T8%||=I8FLN ze&R861XNrz^qp=R03Dquv!fZ7kK5lqiiMPD!TRFDAvyqgHM$!#7%v`J_|{ z6Xp;3rF{y+jSOcX{Kne-)Mgvjn%`-c?k4xCdgUCpB6=y!z6_X zjU~gI2v}>0sod##BLp->H^PbVXcb#pO62Zzfz|}eMgzc$WkwV2T zV%9{Ca}8609_+`^)YcFm>i8K|js!+$R|47GW!=g27}e>ACMoq8qjtcb$XyQ3K^Vq; z8c{|eq!nK_N32aw$-EM#&tiM-VSUsHtB+JNXu zXmQu>Wt|bkpJE#o{50#m6*-dvg>v9{DrR+!7zirwT~{uU)d;Y?Em!0%YG8&(R^VO# zp(U-(P7ZHY*WKGQHws7$`?>NQSMWay&pI?V-@l#@GeO2yl4zurdukL5JxQbaFiCLnPP#H3tD^6BL#-PUAgT4+!S|0+s3T(HYR-JgzGshraBI$m>!mw zSX_ZSblQc%BC206M$s4C1BCCu&tJSedFZ;yQFYjE1yIKUS~9&}$%?-VjIX!PlWx4? zGD`X$8(~>3Y#BZ~I!&E!yeO0k_e!O-S!&IH&Lv?7XW0IhbZJo~XY;tpAzCr&s&ce$ z`jLiPevw0vAVuu#o|At+aVv*@36M^IbR(W2Lppi2>;E(tpI-@v-~LRlp>!ofx>v6# z{L$wzbup?0{_2yfve4Us{(M<2P3{A7k!%`fKI~DQRC7ldXd4uK3nWNeddlDk*N}x# z=(BMgxELj<-I66$G|PV;@r0~>_jMNS#n>Blolj=}GWA@5whg4}zm@^HSQ&@6h!pTX zRpIH>C!1E^=98Ko+mC?12`~5OB@0PoW&c-zrKV%Z{^7-ZCaDX3FKIL#+34NFZyM#aox++$;`KG zwt;;aF2`{Ha<)zj$t-8*;mAl^Ug$nM{P7_g1J++1dx782ElW5vAqu!GMkt%E1;RTs ziN!HHP;Mgm6bjsh(+&cbZCMah2*5HcL$K)!_sN-a)yZTU| zXmX>ZM#WLH0&YYWa|p5+zM)H_7j@~6rG89I?TGjtN;lPqMmpl*D=_srfrs(7Bg5V+ zkE8sl5RU Date: Mon, 15 Apr 2024 01:56:10 +0800 Subject: [PATCH 37/59] Add: Search functionality userguide and images for sample outputs --- docs/UserGuide.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 2cf92c41ed..56dc56b0f5 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -94,6 +94,9 @@ Format: `delete TRANSACTION_ID` Example of usage: `delete 1` +Successful delete feature example: +![](./ug/successful_delete_transaction.png) + ### Edit a transaction: `edit` Edits the details of an existing transaction. @@ -111,6 +114,34 @@ Example of usage: Then the user will be asked to edit each information from that specific transaction one by one. +Successful edit feature example: +![](./ug/successful_edit_transaction.png) + +### Search for a transaction: `search` + +Search for a list of transactions matching the keyword. +Parameters: keyword +Format: `search KEYWORD` + +* The `KEYWORD` can be any value representing transaction description, category, transaction amount or + transaction date. +* Search transaction will list out the matching transactions along with their true **index ID**. This can + be used in `edit` or `delete` command. +* Keywords are case-insensitive so +* If there is no matching transactions, the user will be notified. +* This feature will search from the whole transaction history rather than a specific account to ease the + usage of the budgetbuddy. + +Example of usage: +`search salary` + +Then the user will be asked to edit each information from that specific transaction one by one. + +Successful edit feature example: +![](./ug/successful_search.png) + + + ### Add an account: `add-acc` Adds a new account with a specified initial balance. @@ -187,6 +218,7 @@ the data of your previous BudgetBuddy home folder. * List transactions `list` * Delete transaction `delete TRANSACTION_ID` * Edit transaction `edit TRANSACTION_ID` +* Search transaction `search KEYWORD` * Add account `add-acc /n/ACCOUNT_NAME /$/INITIAL_BALANCE` * List accounts `list-acc` * Delete account `delete-acc ACCOUNT_NUMBER` From 144305852e051eea577ed3fb151d9e7b9aded290 Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 02:01:34 +0800 Subject: [PATCH 38/59] Add command-line userguide for search feature --- .../java/budgetbuddy/transaction/TransactionList.java | 5 +++++ src/main/java/budgetbuddy/ui/UserInterface.java | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/budgetbuddy/transaction/TransactionList.java b/src/main/java/budgetbuddy/transaction/TransactionList.java index d0058b28c8..37ba432afb 100644 --- a/src/main/java/budgetbuddy/transaction/TransactionList.java +++ b/src/main/java/budgetbuddy/transaction/TransactionList.java @@ -39,6 +39,7 @@ public class TransactionList { private static final int DAYS_IN_WEEK = 7; private static final int DAYS_IN_MONTH = 30; private static final int DAYS_OFFSET = 1; + public static final String SEARCH = "search"; private final ArrayList transactions; @@ -285,6 +286,10 @@ public void helpWithUserCommands(String input){ case ACCOUNT: UserInterface.printAccountHelp(); break; + + case SEARCH: + UserInterface.printSearchHelp(); + break; default: UserInterface.printUseAvailableHelp(); break; diff --git a/src/main/java/budgetbuddy/ui/UserInterface.java b/src/main/java/budgetbuddy/ui/UserInterface.java index 93572104cf..5de683d0a8 100644 --- a/src/main/java/budgetbuddy/ui/UserInterface.java +++ b/src/main/java/budgetbuddy/ui/UserInterface.java @@ -450,6 +450,7 @@ public static void printUseAvailableHelp() { System.out.println(TAB_SPACE + "To get idea about all commands use: help all"); System.out.println(TAB_SPACE + "Add transaction: help add"); System.out.println(TAB_SPACE + "Delete transaction: help delete"); + System.out.println(TAB_SPACE + "Search : help search"); System.out.println(TAB_SPACE + "Edit transaction: help edit"); System.out.println(TAB_SPACE + "List transaction: help list"); System.out.println(TAB_SPACE + "Help related to accounts: help acc"); @@ -1090,4 +1091,12 @@ public static Double getInitialAccountBalance() { } return initialBalance; } + + public static void printSearchHelp(){ + System.out.println(HELP_BORDER); + System.out.println(TAB_SPACE + "SYNTAX : search [KEYWORD] \n"); + System.out.println(TAB_SPACE + "The keyword can be anything representing description, date, " + + "category or amount"); + System.out.println(HELP_BORDER); + } } From f17de2ff8ffbdb927797c3fe90929e5e069b48ca Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 02:07:31 +0800 Subject: [PATCH 39/59] Resolve variable definition order --- src/main/java/budgetbuddy/transaction/TransactionList.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/budgetbuddy/transaction/TransactionList.java b/src/main/java/budgetbuddy/transaction/TransactionList.java index 37ba432afb..4497b9c6a4 100644 --- a/src/main/java/budgetbuddy/transaction/TransactionList.java +++ b/src/main/java/budgetbuddy/transaction/TransactionList.java @@ -36,11 +36,10 @@ public class TransactionList { public static final String DELETE = "delete"; public static final String EDIT = "edit"; public static final String LIST = "list"; + public static final String SEARCH = "search"; private static final int DAYS_IN_WEEK = 7; private static final int DAYS_IN_MONTH = 30; private static final int DAYS_OFFSET = 1; - public static final String SEARCH = "search"; - private final ArrayList transactions; private final Parser parser; From e32d44f645080d3fbd52d9ebe0eb861d86c36c08 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Mon, 15 Apr 2024 12:08:11 +0800 Subject: [PATCH 40/59] Add documentation to Transaction.java --- .../transaction/type/Transaction.java | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/main/java/budgetbuddy/transaction/type/Transaction.java b/src/main/java/budgetbuddy/transaction/type/Transaction.java index 68054c3ce4..8b80ebf0bb 100644 --- a/src/main/java/budgetbuddy/transaction/type/Transaction.java +++ b/src/main/java/budgetbuddy/transaction/type/Transaction.java @@ -5,15 +5,39 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; +/** + * Represents a transaction involving a financial account. + * This is an abstract class and must be subclassed to provide specific transaction types. + */ public abstract class Transaction { + // The account number associated with the transaction private final int accountNumber; + + // The name of the account associated with the transaction private final String accountName; + + // A brief description of the transaction private final String description; + + // The amount of money involved in the transaction private final double amount; + + // The category of the transaction private Category category; + + // The date of the transaction private final LocalDate date; - public Transaction(int accountNumber, String accountName, String description, double amount,String date) { + /** + * Constructs a new Transaction object with the specified parameters. + * + * @param accountNumber The account number associated with the transaction. + * @param accountName The name of the account associated with the transaction. + * @param description A brief description of the transaction. + * @param amount The amount of money involved in the transaction. + * @param date The date of the transaction in the format "dd-mm-yyyy". + */ + public Transaction(int accountNumber, String accountName, String description, double amount, String date) { this.accountNumber = accountNumber; this.accountName = accountName; this.description = description; @@ -41,25 +65,34 @@ public LocalDate getDate() { return date; } + /** + * Parses the date string into a LocalDate object. + * + * @param by The date string in the format "dd-MM-yyyy". + * @return The LocalDate object representing the date. + */ private LocalDate parseDate(String by) { return LocalDate.parse(by, DateTimeFormatter.ofPattern("dd-MM-yyyy")); } - + public Category getCategory() { return category; } public abstract String getTransactionType(); + /** + * Returns a string representation of the transaction. + */ @Override public String toString() { - return (" Account Number: " + getAccountNumber() + " | " + + return (" Account Number: " + getAccountNumber() + " | " + " Account Name: " + getAccountName() + " | " + " Transaction Type: " + getTransactionType() + " | " + " Description: " + getDescription() + " | " + " Date: " + getDate() + " | " + " Amount: " + getAmount() + " | " + - " Category: " + getCategory().getCategoryName()) ; + " Category: " + getCategory().getCategoryName()); } public void setCategory(Category category) { From 2ea8daa421fba5bcc424a64169f4e983fbdd0698 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Mon, 15 Apr 2024 12:34:39 +0800 Subject: [PATCH 41/59] Add documentation to TransactionList.java --- .../transaction/TransactionList.java | 106 +++++++++++++++++- 1 file changed, 101 insertions(+), 5 deletions(-) diff --git a/src/main/java/budgetbuddy/transaction/TransactionList.java b/src/main/java/budgetbuddy/transaction/TransactionList.java index 4497b9c6a4..d43a05f4f3 100644 --- a/src/main/java/budgetbuddy/transaction/TransactionList.java +++ b/src/main/java/budgetbuddy/transaction/TransactionList.java @@ -23,6 +23,9 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; +/** + * Represents a list of transactions and provides methods for managing them. + */ public class TransactionList { public static final int DELETE_BEGIN_INDEX = 7; @@ -46,11 +49,19 @@ public class TransactionList { private final DataStorage dataStorage = new DataStorage(); + /** + * Constructs a new TransactionList object with an empty list of transactions and a parser. + */ public TransactionList() { this.transactions = new ArrayList<>(); this.parser = new Parser(); } + /** + * Constructs a new TransactionList object with the specified list of transactions and a parser. + * + * @param transactions The list of transactions. + */ public TransactionList(ArrayList transactions) { this.transactions = transactions; this.parser = new Parser(); @@ -64,6 +75,15 @@ public void printTransactions() { UserInterface.printAllTransactions(transactions); } + /** + * Removes a transaction from the list based on the user input. + * + * @param input The user input specifying the transaction to be removed. + * @param accountManager The account manager for retrieving account information. + * @throws EmptyArgumentException If the input string is empty or does not contain the required parameter. + * @throws NumberFormatException If the index parsed from the input string is not a valid integer. + * @throws InvalidIndexException If the index is out of bounds or invalid. + */ public void removeTransaction(String input, AccountManager accountManager) throws EmptyArgumentException, NumberFormatException, InvalidIndexException { if (input.trim().length() < DELETE_BEGIN_INDEX) { @@ -107,11 +127,21 @@ void addTransaction(Transaction t) { transactions.add(t); } + /** + * Processes a transaction based on the user input and adds it to the transaction list. + * + * @param input The user input specifying the transaction details. + * @param account The account associated with the transaction. + * @throws InvalidTransactionTypeException If the transaction type is invalid. + * @throws InvalidAddTransactionSyntax If the syntax for adding a transaction is invalid. + * @throws EmptyArgumentException If the input string is empty or missing required arguments. + * @throws InvalidCategoryException If the category specified in the transaction is invalid. + */ public void processTransaction(String input, Account account) throws InvalidTransactionTypeException, InvalidAddTransactionSyntax, EmptyArgumentException, InvalidCategoryException { // Check for syntax for add transaction - String[] arguments = {"/a/","/t/", "/n/", "/$/", "/d/"}; + String[] arguments = {"/a/", "/t/", "/n/", "/$/", "/d/"}; for (String argument : arguments) { if (!input.contains(argument)) { throw new InvalidAddTransactionSyntax("Invalid add syntax."); @@ -126,16 +156,27 @@ public void processTransaction(String input, Account account) UserInterface.printAddMessage(fetchData, account.getBalance()); } + /** + * Saves the current list of transactions to a data storage. + * + * @throws IOException If an I/O error occurs while saving the transactions. + */ public void saveTransactionList() throws IOException { dataStorage.saveTransactions(transactions); } + /** + * Retrieves past transactions based on the specified duration. + * + * @param transactions The list of transactions to filter. + * @param duration The duration of past transactions to retrieve ("week" or "month"). + * @return An ArrayList containing past transactions based on the specified duration. + */ //@@author isaaceng7 - public static ArrayList getPastTransactions(ArrayList transactions, String duration) { LocalDate today = LocalDate.now(); LocalDate startDate = null; - switch(duration) { + switch (duration) { case "week": startDate = today.minusDays(DAYS_IN_WEEK + DAYS_OFFSET); break; @@ -154,6 +195,12 @@ public static ArrayList getPastTransactions(ArrayList return pastTransactions; } + /** + * Retrieves transactions within a custom date range. + * + * @param transactions The list of transactions to filter. + * @return An ArrayList containing transactions within the specified custom date range. + */ public static ArrayList getCustomDateTransactions(ArrayList transactions) { String start = UserInterface.getStartDate(); String end = UserInterface.getEndDate(); @@ -169,6 +216,13 @@ public static ArrayList getCustomDateTransactions(ArrayList getAccountTransactions(ArrayList transactions, int accountNumber) { ArrayList accountTransactions = new ArrayList<>(); @@ -180,6 +234,13 @@ public static ArrayList getAccountTransactions(ArrayList getCategoryTransactions(ArrayList transactions, Category category) { ArrayList categoryTransactions = new ArrayList<>(); @@ -191,6 +252,15 @@ public static ArrayList getCategoryTransactions(ArrayList accounts, AccountManager accountManager) throws InvalidIndexException, InvalidCategoryException { UserInterface.printListOptions(); @@ -240,6 +310,17 @@ public void processList(ArrayList accounts, AccountManager accountManag } + /** + * Processes the user input for editing a transaction and updates the transaction accordingly. + * + * @param input The user input specifying the transaction index to be edited. + * @param accountManager The account manager for retrieving account information. + * @throws EmptyArgumentException If the input string is empty or missing required arguments. + * @throws NumberFormatException If the index parsed from the input string is not a valid integer. + * @throws InvalidIndexException If the index is out of bounds or invalid. + * @throws InvalidEditTransactionData If the data for editing the transaction is invalid. + * @throws InvalidCategoryException If the specified category is invalid. + */ //@@author Vavinan public void processEditTransaction(String input, AccountManager accountManager) throws EmptyArgumentException, NumberFormatException, InvalidIndexException, InvalidEditTransactionData, InvalidCategoryException { @@ -264,9 +345,14 @@ public void processEditTransaction(String input, AccountManager accountManager) } } - public void helpWithUserCommands(String input){ + /** + * Provides help messages for user commands. + * + * @param input The user input specifying the command for which help is requested. + */ + public void helpWithUserCommands(String input) { String helpCommand = parser.parseHelpCommand(input); - switch(helpCommand.toLowerCase()){ + switch (helpCommand.toLowerCase()) { case ALL: UserInterface.printAllCommands(); break; @@ -295,6 +381,11 @@ public void helpWithUserCommands(String input){ } } //@@author + + /** + * Displays insights based on transaction categories. + */ + //@@author ShyamKrishna33 public void displayInsights() { Insight.displayCategoryInsight(transactions); } @@ -310,6 +401,11 @@ public ArrayList removeTransactionsByAccountNumber(int accountNumbe return transactionsToRemove; } + /** + * Searches transactions based on a keyword and prints search results. + * + * @param input The user input specifying the keyword to search for transactions. + */ public void searchTransactions(String input) { try { String keyword = input.split(" ")[1]; From 0ad93c2ed39cc00a2fb24329abda406c88c4f60d Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Mon, 15 Apr 2024 12:46:16 +0800 Subject: [PATCH 42/59] Add documentation to DataStorage.java --- .../java/budgetbuddy/storage/DataStorage.java | 64 ++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 4f3d175d80..3b6da13229 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -22,11 +22,23 @@ import java.util.ArrayList; import java.util.Scanner; +/** + * This class provides methods for storing and retrieving data related to transactions and accounts. + * It includes methods for saving and loading transactions and accounts to/from files. + */ public class DataStorage { public static final String TRANSACTIONS_FILE_PATH = "./data/transactions.txt"; public static final String ACCOUNTS_FILE_PATH = "./data/accounts.txt"; public static final String FOLDER_PATH = "./data"; + /** + * Writes the provided string to a file at the given file path. + * + * @param stringToWrite The string to write to the file. + * @param filePath The path of the file to write to. + * @throws IOException If an I/O error occurs while writing to the file. + */ + //@@author ShyamKrishna33 private static void writeToFile(String stringToWrite, String filePath) throws IOException { FileWriter fw = new FileWriter(filePath, true); fw.write(stringToWrite); @@ -47,7 +59,13 @@ private static void createDataFolderIfNotExists() throws IOException { Files.createDirectories(dataFolderPath); } } + //@@author + /** + * Saves the list of accounts to the file in the ACCOUNT_FILE_PATH. + * + * @param accounts The list of accounts to save. + */ public void saveAccounts(ArrayList accounts) { try { File f = new File(ACCOUNTS_FILE_PATH); @@ -69,6 +87,13 @@ public void saveAccounts(ArrayList accounts) { } } + /** + * Saves the list of transactions to a file. + * + * @param transactionArrayList The list of transactions to save. + * @throws IOException If an I/O error occurs while saving the transactions. + */ + //@@author ShyamKrishna33 public void saveTransactions(ArrayList transactionArrayList) throws IOException { File f = new File(TRANSACTIONS_FILE_PATH); @@ -84,7 +109,15 @@ public void saveTransactions(ArrayList transactionArrayList) throws } } - // description, categoryNum, type, date, amount, accountNumber, accountName + /** + * Parses a string representing transaction data into a Transaction object. + * + * @param s The string representing the transaction data. + * @param existingAccountNumbers A list of existing account numbers. + * @return The parsed Transaction object. + * @throws FileCorruptedException If the file containing transaction data is corrupted. + * @throws InvalidCategoryException If the category specified in the transaction data is invalid. + */ private Transaction parseDataToTransaction(String s, ArrayList existingAccountNumbers) throws FileCorruptedException, InvalidCategoryException { String[] transactionInfo = s.split(" ,"); @@ -134,7 +167,16 @@ private Transaction parseDataToTransaction(String s, ArrayList existing return null; } } - + //@@author + + /** + * Reads account data from the accounts file and returns a list of Account objects. + * + * @param existingAccountNumbers A list of existing account numbers. + * @return The list of Account objects read from the file. + * @throws IOException If an I/O error occurs while reading the file. + * @throws FileCorruptedException If the file containing account data is corrupted. + */ public ArrayList readAccountFile(ArrayList existingAccountNumbers) throws IOException, FileCorruptedException { File f = new File(ACCOUNTS_FILE_PATH); @@ -186,6 +228,13 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb return accounts; } + /** + * Reads transaction data from the transactions file and returns a list of Transaction objects. + * + * @param existingAccountNumbers A list of existing account numbers. + * @return The list of Transaction objects read from the file. + * @throws IOException If an I/O error occurs while reading the file. + */ public ArrayList readTransactionFile(ArrayList existingAccountNumbers) throws IOException { createDataFolderIfNotExists(); File f = new File(TRANSACTIONS_FILE_PATH); @@ -215,6 +264,11 @@ public ArrayList readTransactionFile(ArrayList existingAcc return transactionList; } + /** + * Loads the accounts from the accounts file and returns an AccountManager object. + * + * @return The loaded AccountManager object. + */ public AccountManager loadAccounts() { try { File f = new File(ACCOUNTS_FILE_PATH); @@ -252,6 +306,12 @@ private AccountManager createNewAccountManager() { return accountManager; } + /** + * Loads the transactions from the transactions file and returns a TransactionList object. + * + * @param existingAccountNumbers A list of existing account numbers. + * @return The loaded TransactionList object. + */ public TransactionList loadTransactions(ArrayList existingAccountNumbers) { try { ArrayList transactions = readTransactionFile(existingAccountNumbers); From 7c232a9bde81794409a31861c799fd88d7ce8f09 Mon Sep 17 00:00:00 2001 From: isaaceng7 <110762696+isaaceng7@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:21:42 +0800 Subject: [PATCH 43/59] Add successful list feature in ug --- docs/UserGuide.md | 3 +++ docs/ug/successful_list_feature.png | Bin 0 -> 211107 bytes 2 files changed, 3 insertions(+) create mode 100644 docs/ug/successful_list_feature.png diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 56dc56b0f5..769de38402 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -81,6 +81,9 @@ to view Custom Date Transactions from 01-01-2024 to 31-03-2024. List feature options: ![](./ug/list_options.png) +Successful list feature (custom date) example: +![](./ug/successful_list_feature.png) + ### Deleting a transaction: `delete` Removes a transaction from transaction history. diff --git a/docs/ug/successful_list_feature.png b/docs/ug/successful_list_feature.png new file mode 100644 index 0000000000000000000000000000000000000000..6769384e67f031a1014c5cc27dcc410a479a2d7e GIT binary patch literal 211107 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 literal 0 HcmV?d00001 From 1e068cf02ead1d7e8c85f043ff108e5a73356e96 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Mon, 15 Apr 2024 17:48:26 +0800 Subject: [PATCH 44/59] Add assertions and logging to Account class --- src/main/java/budgetbuddy/account/Account.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/budgetbuddy/account/Account.java b/src/main/java/budgetbuddy/account/Account.java index c8cf84e12b..866c176059 100644 --- a/src/main/java/budgetbuddy/account/Account.java +++ b/src/main/java/budgetbuddy/account/Account.java @@ -1,5 +1,7 @@ package budgetbuddy.account; +import java.util.logging.Logger; + /** * Represents an account in the budget buddy system. */ @@ -8,15 +10,19 @@ public class Account { private String name; private double balance; + private static final Logger logger = Logger.getLogger(Account.class.getName()); + /** * Creates an account with the given account number, and default name and balance. * * @param accountNumber the account number */ public Account(int accountNumber) { + assert accountNumber > 0 : "Account number must be positive"; this.accountNumber = accountNumber; this.name = ""; this.balance = 0.00; + logger.info("Account created with default name and balance"); } /** @@ -27,9 +33,12 @@ public Account(int accountNumber) { * @param balance the balance */ public Account(int accountNumber, String name, double balance) { + assert accountNumber > 0 : "Account number must be positive"; + assert name != null : "Name cannot be null"; this.accountNumber = accountNumber; this.name = name; this.balance = balance; + logger.info("Account created with specified name and balance"); } /** @@ -48,6 +57,7 @@ public double getBalance() { */ public void setBalance(double balance) { this.balance = balance; + logger.info("Account balance updated"); } /** @@ -74,7 +84,9 @@ public String getName() { * @param name the new name */ public void setName(String name) { + assert name != null : "Name cannot be null"; this.name = name; + logger.info("Account name updated"); } /** From 4063bebe909a7e194b0717199aa67634d8c5e5fb Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Mon, 15 Apr 2024 18:01:46 +0800 Subject: [PATCH 45/59] Add assertions and logging to AccountManager class --- .../budgetbuddy/account/AccountManager.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/budgetbuddy/account/AccountManager.java b/src/main/java/budgetbuddy/account/AccountManager.java index 12aa59deec..222e630cd3 100644 --- a/src/main/java/budgetbuddy/account/AccountManager.java +++ b/src/main/java/budgetbuddy/account/AccountManager.java @@ -11,6 +11,8 @@ import java.util.ArrayList; import java.util.Random; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Manages the accounts in the budget buddy system. @@ -22,12 +24,16 @@ public class AccountManager { private final ArrayList accounts; private final ArrayList existingAccountNumbers; + private static final Logger logger = Logger.getLogger(AccountManager.class.getName()); + + /** * Creates an AccountManager with empty account and account number lists. */ public AccountManager() { this.accounts = new ArrayList<>(); this.existingAccountNumbers = new ArrayList<>(); + logger.log(Level.INFO, "AccountManager created with empty account and account number lists"); } /** @@ -37,8 +43,11 @@ public AccountManager() { * @param existingAccountNumbers the list of existing account numbers */ public AccountManager(ArrayList accounts, ArrayList existingAccountNumbers) { + assert accounts != null : "Accounts list cannot be null"; + assert existingAccountNumbers != null : "Existing account numbers list cannot be null"; this.accounts = accounts; this.existingAccountNumbers = existingAccountNumbers; + logger.log(Level.INFO, "AccountManager created with specified account and account number lists"); } /** @@ -48,9 +57,11 @@ public AccountManager(ArrayList accounts, ArrayList existingAc * @param initialBalance the initial balance of the account */ public void addAccount(String name, double initialBalance) { + assert name != null : "Name cannot be null"; int newAccountNumber = generateAccountNumber(); accounts.add(new Account(newAccountNumber, name, initialBalance)); existingAccountNumbers.add(newAccountNumber); + logger.log(Level.INFO, "Account added"); } /** @@ -67,11 +78,13 @@ public int generateAccountNumber() { for (int accountNumber : existingAccountNumbers) { if (accountNumber == fourDigitNumber) { noMatchFound = false; + logger.log(Level.WARNING, "Account number already exists. Generating new account number."); break; } } } while (!noMatchFound); + logger.log(Level.INFO, "Account number generated"); return fourDigitNumber; } @@ -85,16 +98,19 @@ public int generateAccountNumber() { */ public void processAddAccount(String input) throws InvalidArgumentSyntaxException, NumberFormatException, EmptyArgumentException { - + assert input != null : "Input cannot be null"; + logger.log(Level.INFO, "Processing add account command"); String[] arguments = {"/n/", "/$/"}; for (String argument : arguments) { if (!input.contains(argument)) { + logger.log(Level.WARNING, "Invalid add account syntax."); throw new InvalidArgumentSyntaxException("Invalid add account syntax."); } } String[] parsedData = Parser.parseAddAccount(input); addAccount(parsedData[0], Double.parseDouble(parsedData[1])); UserInterface.printAddAccountMessage(getAccount(accounts.size() - INDEX_OFFSET).toString()); + logger.log(Level.INFO, "Account added successfully"); } /** @@ -110,16 +126,21 @@ public void processAddAccount(String input) public void removeAccount(String input, TransactionList transactions) throws NumberFormatException, InvalidArgumentSyntaxException, EmptyArgumentException, InvalidIndexException { + assert input != null : "Input cannot be null"; + assert transactions != null : "Transactions cannot be null"; + logger.log(Level.INFO, "Processing remove account command"); int accountNumber = Parser.parseRemoveAccount(input); Account accountRemoved = getAccountByAccountNumber(accountNumber); if (accounts.size() == 1) { UserInterface.printCannotDeleteLastAccountMessage(); + logger.log(Level.WARNING, "Cannot delete last account."); return; } accounts.remove(accountRemoved); existingAccountNumbers.remove(Integer.valueOf(accountNumber)); ArrayList transactionsRemoved = transactions.removeTransactionsByAccountNumber(accountNumber); UserInterface.printDeleteAccountMessage(accountRemoved.toString(), transactionsRemoved); + logger.log(Level.INFO, "Account removed successfully"); } /** @@ -129,6 +150,7 @@ public void removeAccount(String input, TransactionList transactions) * @return the account */ public Account getAccount(int accountId) { + assert accountId >= 0 : "Account ID cannot be negative"; return accounts.get(accountId); } @@ -140,11 +162,13 @@ public Account getAccount(int accountId) { * @throws IllegalArgumentException if the account is not found */ public Account getAccountByAccountNumber(int accountNumber) { + assert accountNumber > 0 : "Account number must be positive"; for (Account account : accounts) { if (account.getAccountNumber() == accountNumber) { return account; } } + logger.log(Level.WARNING, "Account not found."); throw new IllegalArgumentException("Account not found."); } @@ -165,17 +189,21 @@ public ArrayList getAccounts() { * @throws IllegalArgumentException if the input is invalid */ public void processEditAccount(String input) throws EmptyArgumentException, IllegalArgumentException { + assert input != null : "Input cannot be null"; + logger.log(Level.INFO, "Processing edit account command"); int accountNumber = Parser.parseEditAccount(input); Account account = getAccountByAccountNumber(accountNumber); String newName = UserInterface.getNewAccountName(account.toString()); account.setName(newName); UserInterface.printUpdatedAccount(account.toString()); + logger.log(Level.INFO, "Account edited successfully"); } /** * Saves the accounts to the data storage. */ public void saveAccounts() { + assert accounts != null : "Accounts list cannot be null"; dataStorage.saveAccounts(accounts); } From 70997aec27d30c799e5f660067997f45f4594873 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Mon, 15 Apr 2024 18:08:52 +0800 Subject: [PATCH 46/59] Add logging to DataStorage --- src/main/java/budgetbuddy/storage/DataStorage.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 3b6da13229..54d75fed4a 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -21,6 +21,8 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Scanner; +import java.util.logging.Logger; +import java.util.logging.Level; /** * This class provides methods for storing and retrieving data related to transactions and accounts. @@ -31,6 +33,7 @@ public class DataStorage { public static final String ACCOUNTS_FILE_PATH = "./data/accounts.txt"; public static final String FOLDER_PATH = "./data"; + private static final Logger logger = Logger.getLogger(AccountManager.class.getName()); /** * Writes the provided string to a file at the given file path. * @@ -67,11 +70,14 @@ private static void createDataFolderIfNotExists() throws IOException { * @param accounts The list of accounts to save. */ public void saveAccounts(ArrayList accounts) { + logger.log(Level.INFO, "Saving accounts to file"); try { File f = new File(ACCOUNTS_FILE_PATH); if (!f.exists()) { + logger.log(Level.WARNING, "File does not exist. Creating new file."); createDataFolderIfNotExists(); if (!f.createNewFile()) { + logger.log(Level.SEVERE, "Failed to create file"); throw new IOException("Failed to create file"); } } @@ -84,7 +90,9 @@ public void saveAccounts(ArrayList accounts) { fw.close(); } catch (IOException e) { System.out.println("Error saving accounts."); + logger.log(Level.SEVERE, "Error saving accounts"); } + logger.log(Level.INFO, "Accounts saved to file"); } /** @@ -193,7 +201,6 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb double balance; String accountName = accountInfo[1].trim(); - if (accountInfo.length != 3) { throw new FileCorruptedException("Invalid account information format"); } From 25d29f7157659d5c12eb20355b2dc6870d3b6d59 Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 18:13:40 +0800 Subject: [PATCH 47/59] Add implementation details for search feature in DG --- docs/DeveloperGuide.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c7fbea02e6..715e40ca5f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -217,6 +217,47 @@ Sequence Diagram The following sequence diagram illustrates the sequence of interactions involved in the editing of a transaction: ![](./uml/uml-images/processEditTransactionDiagram.png) + +### [Implemented] Search Transactions + +### Description +This method enables users to search for transactions based on a keyword. Users provide a keyword, and the system +searches through transaction descriptions, amounts, categories, and dates to find matches. The search results, +along with their corresponding indices in the transactions list, are displayed to the user. + +#### Design and Implementation +1. **Keyword Extraction:** The method extracts the keyword from the user input. + +2. **Search Process:** It iterates through the list of transactions, checking if any transaction's + description, amount, category, or date contains the keyword. Matches are added to a list of search + results along with their corresponding indices in the transactions list. + +3. **Output Generation:** Once the search process is completed, the method generates output by displaying the + search results along with their indices to the user. + +4. **Exception Handling:** The method handles exceptions such as an empty keyword input or any unexpected + errors during the search process. Proper error messages are displayed to the user in case of exceptions. + +Example Algorithm: +``` +searchTransactions(input) + 1. Extract the keyword from the user input. + 2. Initialize empty lists for search results and indices. + 3. For each transaction in transactions do: + 1. Convert transaction description to lowercase (description_lower). + 2. Convert transaction amount to string (amount_str). + 3. Convert category name to lowercase (category_name). + 4. Convert transaction date to string (date_str). + 5. If keyword is present in description_lower, amount_str, category_name_lower, or date_str then: + - Add the transaction to the search results list. + - Add the index of the transaction in transactions to the indices list. + 4. Display the search results along with their indices to the user. + 5. Catch ArrayIndexOutOfBoundsException: + - Print "Invalid search input." + 6. Catch Exception: + - Print the exception message. +``` + ### [Implemented] List Transactions ### Description From 11e7c47da003f96a4f3be3d8cd9d4565daec784d Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 18:17:25 +0800 Subject: [PATCH 48/59] Update PPP about contributions --- docs/team/vavinan.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/team/vavinan.md b/docs/team/vavinan.md index 6ce5bfbe65..c4fb78011b 100644 --- a/docs/team/vavinan.md +++ b/docs/team/vavinan.md @@ -11,10 +11,12 @@ It is optimized for use via a Command Line Interface (CLI) and is written in Jav * User Guide: * Added documentation for the feature `delete`. * Added documentation for the feature `edit`. + * Added documentation for the feature `search` * Developer Guide: * Added implementation details for the feature `delete`. * Added implementation details for the feature `edit`. * Added implementation details for the feature `insights`. + * Added implementation details for the feature `search`. * Community: * Reported bugs and suggestions for other teams in class and PE-D. From 1adbcd75d29183640a2d73382387aff2d5f571bb Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 18:22:39 +0800 Subject: [PATCH 49/59] Refactor: Reduce complexity of the class diagram --- docs/uml/insightDiagram.puml | 28 ++++++++++++------------- docs/uml/uml-images/insightDiagram.png | Bin 57712 -> 81200 bytes 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/docs/uml/insightDiagram.puml b/docs/uml/insightDiagram.puml index 37fe06cedd..c3e378c63e 100644 --- a/docs/uml/insightDiagram.puml +++ b/docs/uml/insightDiagram.puml @@ -32,26 +32,24 @@ package budgetbuddy.transaction.type { } } -package org.knowm.xchart { - class PieChart - class PieChartBuilder - class XChartPanel - class PieStyler -} +class PieChart +class PieChartBuilder +class XChartPanel +class PieStyler class JFrame { +dispose(): void } class JPanel -Insight ...> Category : " {dependency} " -Insight ..> Transaction: {dependency} -Transaction --> "*" Category: {association} -Insight ..> JFrame :{creates 2} -Insight ..> JPanel: {creates 2} -Insight ..> PieChart: {uses 2} -Insight ..> PieChartBuilder: {uses 2} -Insight ..> XChartPanel :{uses 2} -Insight ..> PieStyler: {uses 2} +Insight ...> Category : " dependency " +Insight ..> Transaction: dependency +Transaction --> "*" Category: association +Insight ..> JFrame :creates 2 +Insight ..> JPanel: creates 2 +Insight ..> PieChart: uses 2 +Insight ..> PieChartBuilder: uses 2 +Insight ..> XChartPanel :uses 2 +Insight ..> PieStyler: uses 2 @enduml diff --git a/docs/uml/uml-images/insightDiagram.png b/docs/uml/uml-images/insightDiagram.png index e3a2f3f4329a52212ced686bc906b34259a7f215..5d047bf795780a7fa7321949e88b2add5fc2e3d9 100644 GIT binary patch literal 81200 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 literal 57712 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 a7adza)~!ZwoV5u58R(km+|}9}_ Date: Mon, 15 Apr 2024 18:14:13 +0800 Subject: [PATCH 50/59] Refactor readAccountFile method --- .../java/budgetbuddy/storage/DataStorage.java | 81 ++++++++++++------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 54d75fed4a..9cea27b6ef 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -34,6 +34,8 @@ public class DataStorage { public static final String FOLDER_PATH = "./data"; private static final Logger logger = Logger.getLogger(AccountManager.class.getName()); + + //@@author ShyamKrishna33 /** * Writes the provided string to a file at the given file path. * @@ -41,7 +43,6 @@ public class DataStorage { * @param filePath The path of the file to write to. * @throws IOException If an I/O error occurs while writing to the file. */ - //@@author ShyamKrishna33 private static void writeToFile(String stringToWrite, String filePath) throws IOException { FileWriter fw = new FileWriter(filePath, true); fw.write(stringToWrite); @@ -95,13 +96,13 @@ public void saveAccounts(ArrayList accounts) { logger.log(Level.INFO, "Accounts saved to file"); } + //@@author ShyamKrishna33 /** * Saves the list of transactions to a file. * * @param transactionArrayList The list of transactions to save. * @throws IOException If an I/O error occurs while saving the transactions. */ - //@@author ShyamKrishna33 public void saveTransactions(ArrayList transactionArrayList) throws IOException { File f = new File(TRANSACTIONS_FILE_PATH); @@ -178,11 +179,11 @@ private Transaction parseDataToTransaction(String s, ArrayList existing //@@author /** - * Reads account data from the accounts file and returns a list of Account objects. + * Reads account data from a file and returns a list of Account objects. * * @param existingAccountNumbers A list of existing account numbers. * @return The list of Account objects read from the file. - * @throws IOException If an I/O error occurs while reading the file. + * @throws IOException If an I/O error occurs while reading the file. * @throws FileCorruptedException If the file containing account data is corrupted. */ public ArrayList readAccountFile(ArrayList existingAccountNumbers) @@ -196,43 +197,65 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb if (line.trim().isEmpty()) { continue; } - String[] accountInfo = line.split(" ,"); - int accountNumber; - double balance; - String accountName = accountInfo[1].trim(); + accounts.add(processAccountLine(line, existingAccountNumbers)); + } + return accounts; + } - if (accountInfo.length != 3) { - throw new FileCorruptedException("Invalid account information format"); - } + /** + * Reads account data from a file and returns a list of Account objects. + * + * @param existingAccountNumbers A list of existing account numbers. + * @return The list of Account objects read from the file. + * @throws IOException If an I/O error occurs while reading the file. + * @throws FileCorruptedException If the file containing account data is corrupted. + */ + private Account processAccountLine(String line, ArrayList existingAccountNumbers) throws FileCorruptedException { + String[] accountInfo = line.split(" ,"); + validateAccountInfo(accountInfo, existingAccountNumbers); - try { - accountNumber = Integer.parseInt(accountInfo[0]); - } catch (NumberFormatException e) { - throw new FileCorruptedException("Invalid type for account number"); - } + int accountNumber = Integer.parseInt(accountInfo[0]); + double balance = Double.parseDouble(accountInfo[2]); + String accountName = accountInfo[1].trim(); - try { - balance = Double.parseDouble(accountInfo[2]); - } catch (NumberFormatException e) { - throw new FileCorruptedException("Invalid type for account balance"); - } + existingAccountNumbers.add(accountNumber); + return new Account(accountNumber, accountName, balance); + } + + /** + * Validates a line of account data. + * + * @param accountInfo The line of account data to validate. + * @param existingAccountNumbers A list of existing account numbers. + * @throws FileCorruptedException If the line of account data is invalid. + */ + private void validateAccountInfo(String[] accountInfo, ArrayList existingAccountNumbers) throws FileCorruptedException { + if (accountInfo.length != 3) { + throw new FileCorruptedException("Invalid account information format"); + } + try { + int accountNumber = Integer.parseInt(accountInfo[0]); if (accountNumber < 1000 || accountNumber > 9999) { throw new FileCorruptedException("Invalid account number"); } - - if (accountName.isEmpty()) { - throw new FileCorruptedException("Invalid account name"); - } - if (existingAccountNumbers.contains(accountNumber)) { throw new FileCorruptedException("Duplicate account number"); } + } catch (NumberFormatException e) { + throw new FileCorruptedException("Invalid type for account number"); + } - accounts.add(new Account(accountNumber, accountInfo[1], balance)); - existingAccountNumbers.add(accountNumber); + try { + double balance = Double.parseDouble(accountInfo[2]); + } catch (NumberFormatException e) { + throw new FileCorruptedException("Invalid type for account balance"); + } + + String accountName = accountInfo[1].trim(); + if (accountName.isEmpty()) { + throw new FileCorruptedException("Invalid account name"); } - return accounts; } /** From 600cfe9af6450a63678589f6382466d3ee4a26b8 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Mon, 15 Apr 2024 18:27:18 +0800 Subject: [PATCH 51/59] Add logging to DataStorage --- .../java/budgetbuddy/storage/DataStorage.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 9cea27b6ef..2306e4b402 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -188,6 +188,7 @@ private Transaction parseDataToTransaction(String s, ArrayList existing */ public ArrayList readAccountFile(ArrayList existingAccountNumbers) throws IOException, FileCorruptedException { + logger.log(Level.INFO, "Reading accounts from file"); File f = new File(ACCOUNTS_FILE_PATH); Scanner s = new Scanner(f); @@ -199,6 +200,7 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb } accounts.add(processAccountLine(line, existingAccountNumbers)); } + logger.log(Level.INFO, "Accounts read from file"); return accounts; } @@ -211,14 +213,18 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb * @throws FileCorruptedException If the file containing account data is corrupted. */ private Account processAccountLine(String line, ArrayList existingAccountNumbers) throws FileCorruptedException { + logger.log(Level.INFO, "Processing account line"); String[] accountInfo = line.split(" ,"); validateAccountInfo(accountInfo, existingAccountNumbers); + logger.log(Level.INFO, "Account line processed"); int accountNumber = Integer.parseInt(accountInfo[0]); double balance = Double.parseDouble(accountInfo[2]); String accountName = accountInfo[1].trim(); existingAccountNumbers.add(accountNumber); + logger.log(Level.INFO, "Account added to existing account numbers list"); + logger.log(Level.INFO, "Account created"); return new Account(accountNumber, accountName, balance); } @@ -231,29 +237,35 @@ private Account processAccountLine(String line, ArrayList existingAccou */ private void validateAccountInfo(String[] accountInfo, ArrayList existingAccountNumbers) throws FileCorruptedException { if (accountInfo.length != 3) { + logger.log(Level.SEVERE, "Invalid account information format"); throw new FileCorruptedException("Invalid account information format"); } try { int accountNumber = Integer.parseInt(accountInfo[0]); if (accountNumber < 1000 || accountNumber > 9999) { + logger.log(Level.SEVERE, "Invalid account number"); throw new FileCorruptedException("Invalid account number"); } if (existingAccountNumbers.contains(accountNumber)) { + logger.log(Level.SEVERE, "Duplicate account number"); throw new FileCorruptedException("Duplicate account number"); } } catch (NumberFormatException e) { + logger.log(Level.SEVERE, "Invalid type for account number"); throw new FileCorruptedException("Invalid type for account number"); } try { double balance = Double.parseDouble(accountInfo[2]); } catch (NumberFormatException e) { + logger.log(Level.SEVERE, "Invalid type for account balance"); throw new FileCorruptedException("Invalid type for account balance"); } String accountName = accountInfo[1].trim(); if (accountName.isEmpty()) { + logger.log(Level.SEVERE, "Invalid account name"); throw new FileCorruptedException("Invalid account name"); } } @@ -300,11 +312,14 @@ public ArrayList readTransactionFile(ArrayList existingAcc * @return The loaded AccountManager object. */ public AccountManager loadAccounts() { + logger.log(Level.INFO, "Loading accounts from file"); try { File f = new File(ACCOUNTS_FILE_PATH); if (!f.exists()) { + logger.log(Level.WARNING, "File does not exist. Creating new file."); createDataFolderIfNotExists(); if (!f.createNewFile()) { + logger.log(Level.SEVERE, "Failed to create file"); throw new IOException("Failed to create file"); } return createNewAccountManager(); @@ -314,16 +329,21 @@ public AccountManager loadAccounts() { try { accounts = readAccountFile(existingAccountNumbers); } catch (FileCorruptedException e) { + logger.log(Level.SEVERE, "File corrupted"); UserInterface.printFileCorruptedError(); FileWriter fw = new FileWriter(ACCOUNTS_FILE_PATH, false); + logger.log(Level.WARNING, "Creating new account manager"); return createNewAccountManager(); } if (accounts.isEmpty()) { + logger.log(Level.WARNING, "Creating new account manager"); return createNewAccountManager(); } return new AccountManager(accounts, existingAccountNumbers); } catch (IOException e) { + logger.log(Level.SEVERE, "Error loading accounts"); UserInterface.printFileCorruptedError(); + logger.log(Level.WARNING, "Creating new account manager"); return createNewAccountManager(); } } From 895fc500e2efdab541cf4bd7b9240bc17d1dd106 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Mon, 15 Apr 2024 18:58:39 +0800 Subject: [PATCH 52/59] Update PPP --- docs/team/shyamkrishna33.md | 61 ++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/docs/team/shyamkrishna33.md b/docs/team/shyamkrishna33.md index 2e824d3d98..c11e63412f 100644 --- a/docs/team/shyamkrishna33.md +++ b/docs/team/shyamkrishna33.md @@ -1,16 +1,75 @@ # Arun Gandhi Shyam Krishna - Project Portfolio Page ## Overview + BudgetBuddy is a desktop financial tracker application that helps users to manage their personal finances. It allows users to track their income and expenses across multiple accounts and provides insights into their financial activities. It is optimized for use via a Command Line Interface (CLI) and is written in Java, and has about 3 kLoC. ## Summary of Contributions + +### Code Contributed: +#### [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=Shyam&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=ShyamKrishna33&tabRepo=AY2324S2-CS2113-T15-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + +### Documentation: + +* User Guide: + * Added documentation of feature `add`. + * Added documentation of feature `insights`. +* Developer Guide: + * Added implementation and details of `Category` feature. + * Added implementation and details of processTransaction method with sequence diagram and class diagram. +* Community: + * Reported bugs and suggestions for other teams in class and PE-D. +* Others: + * Added headers for methods in TransactionList, Transaction and DataStorage classes. + ### Feature 1 - Adding Transaction 1. Initiated the transaction class with appropriate parameters. 2. Created the `Add` command with the basic arguments to add a transaction to a list of available transactions. 3. Added JUnit test cases for all the important methods contributing to this feature. -4. Performed exception handling for many types of edge cases with respect to the input arguments. \ No newline at end of file +4. Performed exception handling for many types of edge cases with respect to the input arguments. + +**What it does:** Allows users to add a transaction.
+**Justification:** This feature is the backbone to the BudgetBuddy as users need to be able to enter a transaction to +use the application. + +### Feature 2 - Data Storage + +1. Initiated file paths and file format to store the data of the list of transactions. +2. Created `saveTransactions` method to take in an array of transactions, convert the objects into string format + ensuring no + information is lost in the process and writing the data in the specified file paths. +3. Enabled reading of saved data back into an array of transaction objects using the method `readTransactionFile`. +4. Performed exception handling to ensure that in all scenarios the data storage works as intended without any runtime + errors. For example, ensuring that the program does not crash when the files get corrupted due to external + intervention. + +**What it does:** Stores all the transactions entered by the user to the database.
+**Justification:** This feature is very important as it allows the user to track all the transactions in previous +sessions as it would be meaningless to not have a data storage. + +### Feature 3 - Insights + +1. Used XChart library to display pie-charts on the available data. +2. Segregated all the available transactions into income and expense type and calculated total amount for each + category in each type. Displayed the proportions of transactions in each category for each type. + +**What it does:** Displays 2 pie-charts, one for each type of transaction, which shows the proportion +of each category in all the transactions.
+**Justification:** This feature is useful since it allows the user to visualize the distribution of +his/her income/expense among the available categories. + +### Exception Handling + +* Performed overall exception handling for many peculiar cases like user deleting the storage when program + is running, user entering special characters in command syntax, user force quitting the program etc. +* Also added JUnit test cases for many crucial methods to ensure robustness. + +### General Contribution + +* Took part regularly in code reviews and team meetings. +* Reviewed around 20 Pull Requests. From 6089b2a4c0c16fb297fac74ab43ee7678746aae3 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Mon, 15 Apr 2024 18:58:48 +0800 Subject: [PATCH 53/59] Add support to log everything into budgetBuddyLog file --- .gitignore | 1 + src/main/java/budgetbuddy/BudgetBuddy.java | 43 ++++++++++++++++--- .../java/budgetbuddy/account/Account.java | 3 +- .../budgetbuddy/account/AccountManager.java | 4 +- .../java/budgetbuddy/storage/DataStorage.java | 11 +++-- .../java/budgetbuddy/ui/UserInterface.java | 11 +++++ 6 files changed, 56 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 157f5ca5a0..81a9513463 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ bin/ text-ui-test/EXPECTED-UNIX.TXT /data/accounts.txt /data/transactions.txt +/logs/ diff --git a/src/main/java/budgetbuddy/BudgetBuddy.java b/src/main/java/budgetbuddy/BudgetBuddy.java index 8fd72ac72f..c21584f547 100644 --- a/src/main/java/budgetbuddy/BudgetBuddy.java +++ b/src/main/java/budgetbuddy/BudgetBuddy.java @@ -15,6 +15,10 @@ import budgetbuddy.transaction.TransactionList; import budgetbuddy.ui.UserInterface; +import java.io.File; +import java.io.IOException; +import java.util.logging.*; + import java.util.Scanner; public class BudgetBuddy { @@ -31,9 +35,13 @@ public class BudgetBuddy { public static final String DELETE_ACC = "delete-acc"; public static final String EDIT_ACC = "edit-acc"; public static final String SEARCH = "search"; + public final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final AccountManager accountManager; private final TransactionList transactions; + /** + * Creates a BudgetBuddy object with the account manager and transaction list. + */ public BudgetBuddy() { DataStorage dataStorage = new DataStorage(); this.accountManager = dataStorage.loadAccounts(); @@ -41,13 +49,36 @@ public BudgetBuddy() { } /** - * Main entry-point for the java.BudgetBuddy application. + * Sets up the logger for the BudgetBuddy application. */ + private static void setupLogger(){ + LogManager.getLogManager().reset(); + logger.setLevel(java.util.logging.Level.ALL); + try { + File logsDir = new File("logs"); + if (!logsDir.exists()){ + logsDir.mkdir(); + } + FileHandler fh = new FileHandler("logs/budgetBuggyLog.log"); + fh.setFormatter(new SimpleFormatter()); + fh.setLevel(Level.INFO); + logger.addHandler(fh); + } catch (IOException e) { + UserInterface.printLoggerSetupError(); + } + } - public static void main(String[] args){ + /** + * Main entry-point for the java.BudgetBuddy application. + */ + public static void main(String[] args) { + setupLogger(); new BudgetBuddy().run(); } + /** + * Runs the BudgetBuddy application. + */ public void run() { Scanner in = UserInterface.in; String logo = "BUDGET BUDDY"; @@ -57,7 +88,7 @@ public void run() { boolean isRunning = true; - + while (isRunning) { String input = in.nextLine(); try { @@ -123,11 +154,11 @@ public void run() { } catch (InvalidIndexException e) { UserInterface.printInvalidIndex("Given index id is out of bound", Integer.parseInt(e.getMessage())); - } catch (IndexOutOfBoundsException ignored){ + } catch (IndexOutOfBoundsException ignored) { UserInterface.printInvalidInput("Please check your command syntax"); - } catch (InvalidEditTransactionData e){ + } catch (InvalidEditTransactionData e) { UserInterface.printInvalidInput(e.getMessage()); - } catch (InvalidArgumentSyntaxException e){ + } catch (InvalidArgumentSyntaxException e) { UserInterface.printInvalidArgumentSyntax(e.getMessage()); } catch (InvalidCategoryException e) { UserInterface.printInvalidCategoryError(); diff --git a/src/main/java/budgetbuddy/account/Account.java b/src/main/java/budgetbuddy/account/Account.java index 866c176059..d556373032 100644 --- a/src/main/java/budgetbuddy/account/Account.java +++ b/src/main/java/budgetbuddy/account/Account.java @@ -6,12 +6,11 @@ * Represents an account in the budget buddy system. */ public class Account { + public final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final int accountNumber; private String name; private double balance; - private static final Logger logger = Logger.getLogger(Account.class.getName()); - /** * Creates an account with the given account number, and default name and balance. * diff --git a/src/main/java/budgetbuddy/account/AccountManager.java b/src/main/java/budgetbuddy/account/AccountManager.java index 222e630cd3..1fda9a98ba 100644 --- a/src/main/java/budgetbuddy/account/AccountManager.java +++ b/src/main/java/budgetbuddy/account/AccountManager.java @@ -19,13 +19,11 @@ */ public class AccountManager { public static final int INDEX_OFFSET = 1; - + public final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final DataStorage dataStorage = new DataStorage(); private final ArrayList accounts; private final ArrayList existingAccountNumbers; - private static final Logger logger = Logger.getLogger(AccountManager.class.getName()); - /** * Creates an AccountManager with empty account and account number lists. diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 2306e4b402..5a704f4936 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -32,8 +32,7 @@ public class DataStorage { public static final String TRANSACTIONS_FILE_PATH = "./data/transactions.txt"; public static final String ACCOUNTS_FILE_PATH = "./data/accounts.txt"; public static final String FOLDER_PATH = "./data"; - - private static final Logger logger = Logger.getLogger(AccountManager.class.getName()); + public final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); //@@author ShyamKrishna33 /** @@ -124,7 +123,7 @@ public void saveTransactions(ArrayList transactionArrayList) throws * @param s The string representing the transaction data. * @param existingAccountNumbers A list of existing account numbers. * @return The parsed Transaction object. - * @throws FileCorruptedException If the file containing transaction data is corrupted. + * @throws FileCorruptedException If the file containing transaction data is corrupted. * @throws InvalidCategoryException If the category specified in the transaction data is invalid. */ private Transaction parseDataToTransaction(String s, ArrayList existingAccountNumbers) @@ -183,7 +182,7 @@ private Transaction parseDataToTransaction(String s, ArrayList existing * * @param existingAccountNumbers A list of existing account numbers. * @return The list of Account objects read from the file. - * @throws IOException If an I/O error occurs while reading the file. + * @throws IOException If an I/O error occurs while reading the file. * @throws FileCorruptedException If the file containing account data is corrupted. */ public ArrayList readAccountFile(ArrayList existingAccountNumbers) @@ -209,7 +208,7 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb * * @param existingAccountNumbers A list of existing account numbers. * @return The list of Account objects read from the file. - * @throws IOException If an I/O error occurs while reading the file. + * @throws IOException If an I/O error occurs while reading the file. * @throws FileCorruptedException If the file containing account data is corrupted. */ private Account processAccountLine(String line, ArrayList existingAccountNumbers) throws FileCorruptedException { @@ -231,7 +230,7 @@ private Account processAccountLine(String line, ArrayList existingAccou /** * Validates a line of account data. * - * @param accountInfo The line of account data to validate. + * @param accountInfo The line of account data to validate. * @param existingAccountNumbers A list of existing account numbers. * @throws FileCorruptedException If the line of account data is invalid. */ diff --git a/src/main/java/budgetbuddy/ui/UserInterface.java b/src/main/java/budgetbuddy/ui/UserInterface.java index 5de683d0a8..04df793689 100644 --- a/src/main/java/budgetbuddy/ui/UserInterface.java +++ b/src/main/java/budgetbuddy/ui/UserInterface.java @@ -1099,4 +1099,15 @@ public static void printSearchHelp(){ "category or amount"); System.out.println(HELP_BORDER); } + + /** + * The function `printLoggerSetupError` prints an error message indicating that + * there was an issue + * setting up the logger. + */ + public static void printLoggerSetupError() { + System.out.println(LINE); + System.out.println(TAB_SPACE + "Error setting up logger"); + System.out.println(LINE); + } } From 31f2e0335e5d02432c7087cefc5abb40982d5575 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Mon, 15 Apr 2024 19:04:03 +0800 Subject: [PATCH 54/59] Fix checkStyle issues --- src/main/java/budgetbuddy/BudgetBuddy.java | 12 ++++++++---- src/main/java/budgetbuddy/account/Account.java | 2 +- .../java/budgetbuddy/account/AccountManager.java | 2 +- src/main/java/budgetbuddy/storage/DataStorage.java | 8 +++++--- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/budgetbuddy/BudgetBuddy.java b/src/main/java/budgetbuddy/BudgetBuddy.java index c21584f547..1c6d6be23e 100644 --- a/src/main/java/budgetbuddy/BudgetBuddy.java +++ b/src/main/java/budgetbuddy/BudgetBuddy.java @@ -17,9 +17,13 @@ import java.io.File; import java.io.IOException; -import java.util.logging.*; import java.util.Scanner; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; public class BudgetBuddy { public static final int LIST_LENGTH = 5; @@ -35,7 +39,7 @@ public class BudgetBuddy { public static final String DELETE_ACC = "delete-acc"; public static final String EDIT_ACC = "edit-acc"; public static final String SEARCH = "search"; - public final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final AccountManager accountManager; private final TransactionList transactions; @@ -51,12 +55,12 @@ public BudgetBuddy() { /** * Sets up the logger for the BudgetBuddy application. */ - private static void setupLogger(){ + private static void setupLogger() { LogManager.getLogManager().reset(); logger.setLevel(java.util.logging.Level.ALL); try { File logsDir = new File("logs"); - if (!logsDir.exists()){ + if (!logsDir.exists()) { logsDir.mkdir(); } FileHandler fh = new FileHandler("logs/budgetBuggyLog.log"); diff --git a/src/main/java/budgetbuddy/account/Account.java b/src/main/java/budgetbuddy/account/Account.java index d556373032..a8d2718b3a 100644 --- a/src/main/java/budgetbuddy/account/Account.java +++ b/src/main/java/budgetbuddy/account/Account.java @@ -6,7 +6,7 @@ * Represents an account in the budget buddy system. */ public class Account { - public final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final int accountNumber; private String name; private double balance; diff --git a/src/main/java/budgetbuddy/account/AccountManager.java b/src/main/java/budgetbuddy/account/AccountManager.java index 1fda9a98ba..9f65b79e34 100644 --- a/src/main/java/budgetbuddy/account/AccountManager.java +++ b/src/main/java/budgetbuddy/account/AccountManager.java @@ -19,7 +19,7 @@ */ public class AccountManager { public static final int INDEX_OFFSET = 1; - public final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final DataStorage dataStorage = new DataStorage(); private final ArrayList accounts; private final ArrayList existingAccountNumbers; diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 5a704f4936..9665b2b7a1 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -32,7 +32,7 @@ public class DataStorage { public static final String TRANSACTIONS_FILE_PATH = "./data/transactions.txt"; public static final String ACCOUNTS_FILE_PATH = "./data/accounts.txt"; public static final String FOLDER_PATH = "./data"; - public final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); //@@author ShyamKrishna33 /** @@ -211,7 +211,8 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb * @throws IOException If an I/O error occurs while reading the file. * @throws FileCorruptedException If the file containing account data is corrupted. */ - private Account processAccountLine(String line, ArrayList existingAccountNumbers) throws FileCorruptedException { + private Account processAccountLine(String line, ArrayList existingAccountNumbers) + throws FileCorruptedException { logger.log(Level.INFO, "Processing account line"); String[] accountInfo = line.split(" ,"); validateAccountInfo(accountInfo, existingAccountNumbers); @@ -234,7 +235,8 @@ private Account processAccountLine(String line, ArrayList existingAccou * @param existingAccountNumbers A list of existing account numbers. * @throws FileCorruptedException If the line of account data is invalid. */ - private void validateAccountInfo(String[] accountInfo, ArrayList existingAccountNumbers) throws FileCorruptedException { + private void validateAccountInfo(String[] accountInfo, ArrayList existingAccountNumbers) + throws FileCorruptedException { if (accountInfo.length != 3) { logger.log(Level.SEVERE, "Invalid account information format"); throw new FileCorruptedException("Invalid account information format"); From d12a134eb96fa2160ca6a56d9d9cc30f2ea94e16 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Mon, 15 Apr 2024 19:46:05 +0800 Subject: [PATCH 55/59] Add logging statements in DataStorage.java --- src/main/java/budgetbuddy/storage/DataStorage.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 9665b2b7a1..580c5ddc33 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -35,6 +35,7 @@ public class DataStorage { public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); //@@author ShyamKrishna33 + /** * Writes the provided string to a file at the given file path. * @@ -96,6 +97,7 @@ public void saveAccounts(ArrayList accounts) { } //@@author ShyamKrishna33 + /** * Saves the list of transactions to a file. * @@ -103,6 +105,7 @@ public void saveAccounts(ArrayList accounts) { * @throws IOException If an I/O error occurs while saving the transactions. */ public void saveTransactions(ArrayList transactionArrayList) throws IOException { + logger.log(Level.INFO, "Saving transactions to file"); File f = new File(TRANSACTIONS_FILE_PATH); assert f.exists() : "File does not exist"; @@ -115,6 +118,7 @@ public void saveTransactions(ArrayList transactionArrayList) throws String stringToWrite = getStringToWrite(transaction); writeToFile(stringToWrite, TRANSACTIONS_FILE_PATH); } + logger.log(Level.INFO, "Transactions saved to file"); } /** @@ -208,7 +212,6 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb * * @param existingAccountNumbers A list of existing account numbers. * @return The list of Account objects read from the file. - * @throws IOException If an I/O error occurs while reading the file. * @throws FileCorruptedException If the file containing account data is corrupted. */ private Account processAccountLine(String line, ArrayList existingAccountNumbers) @@ -271,6 +274,7 @@ private void validateAccountInfo(String[] accountInfo, ArrayList existi } } + //@@author ShyamKrishna33 /** * Reads transaction data from the transactions file and returns a list of Transaction objects. * @@ -279,9 +283,11 @@ private void validateAccountInfo(String[] accountInfo, ArrayList existi * @throws IOException If an I/O error occurs while reading the file. */ public ArrayList readTransactionFile(ArrayList existingAccountNumbers) throws IOException { + logger.log(Level.INFO, "Fetching transactions from storage"); createDataFolderIfNotExists(); File f = new File(TRANSACTIONS_FILE_PATH); if (!f.exists()) { + logger.log(Level.INFO, "File does not exists. Creating a new one."); if (!f.createNewFile()) { throw new IOException("Failed to create file"); } @@ -300,12 +306,15 @@ public ArrayList readTransactionFile(ArrayList existingAcc transactionList.add(parseDataToTransaction(line, existingAccountNumbers)); } } catch (FileCorruptedException | InvalidCategoryException e) { + logger.log(Level.SEVERE, "File got corrupted"); UserInterface.printFileCorruptedError(); FileWriter fw = new FileWriter(TRANSACTIONS_FILE_PATH, false); return new ArrayList<>(); } + logger.log(Level.INFO, "Transactions are fetched successfully"); return transactionList; } + //@@author /** * Loads the accounts from the accounts file and returns an AccountManager object. @@ -357,6 +366,7 @@ private AccountManager createNewAccountManager() { return accountManager; } + //@@author ShyamKrishna33 /** * Loads the transactions from the transactions file and returns a TransactionList object. * @@ -371,4 +381,5 @@ public TransactionList loadTransactions(ArrayList existingAccountNumber return new TransactionList(); } } + //@@author } From c6ec752155953f58f406e5e8ccadbe4c8c34b532 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Mon, 15 Apr 2024 19:46:15 +0800 Subject: [PATCH 56/59] Add logging statements in Parser.java --- src/main/java/budgetbuddy/parser/Parser.java | 37 ++++++++++++++------ 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/budgetbuddy/parser/Parser.java b/src/main/java/budgetbuddy/parser/Parser.java index b0c64057fd..248426df38 100644 --- a/src/main/java/budgetbuddy/parser/Parser.java +++ b/src/main/java/budgetbuddy/parser/Parser.java @@ -15,6 +15,9 @@ import budgetbuddy.transaction.type.Transaction; import budgetbuddy.ui.UserInterface; +import java.util.logging.Level; +import java.util.logging.Logger; + /** * Parses the user input into data that is easily understandable by other classes and methods. */ @@ -24,6 +27,8 @@ public class Parser { public static final int HELP_BEGIN_INDEX = 4; private static final int ADD_ACC_COMMAND_INDEX = 7; + public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + /** * The function `parseAccountNumber` extracts and returns an account number from a given input * string following a specific syntax. @@ -46,14 +51,16 @@ public static int parseAccountNumber(String input) throws InvalidArgumentSyntaxE * The function `parseUserInputToTransaction` takes user input, parses it to create a transaction * object (either income or expense), and handles various exceptions related to invalid input. * - * @param input takes a user input that contain transaction details in a specific format. + * @param input takes a user input that contain transaction details in a specific format. * @param account The `account` parameter in this method represents the account to which the transaction belongs. * @return The method `parseUserInputToTransaction` is returning a `Transaction` object, which can - * be either an `Income` or an `Expense` object based on the type provided in the input. + * be either an `Income` or an `Expense` object based on the type provided in the input. */ public Transaction parseUserInputToTransaction(String input, Account account) throws InvalidTransactionTypeException, NumberFormatException, EmptyArgumentException, InvalidCategoryException, InvalidAddTransactionSyntax { + logger.log(Level.INFO, "Parsing user input."); + String data = input.substring(ADD_COMMAND_INDEX + 1); String[] parseData = data.split("/"); String type = null; @@ -71,6 +78,7 @@ public Transaction parseUserInputToTransaction(String input, Account account) break; case "$": if (TransactionList.isNotDouble(parseData[i + 1].trim())) { + logger.log(Level.SEVERE, "Number format incorrect"); throw new NumberFormatException(parseData[i + 1].trim()); } else { amount = parseData[i + 1].trim(); @@ -90,47 +98,54 @@ public Transaction parseUserInputToTransaction(String input, Account account) assert type != null; if (category == -1) { + logger.log(Level.INFO, "Category not entered. Prompting for category."); UserInterface.listCategories(); category = UserInterface.getCategoryNum(); } if (category < 1 || category > 9) { + logger.log(Level.SEVERE, "Category index out of bounds"); throw new InvalidCategoryException("Category Index out of bounds"); } if (Double.parseDouble(amount) < 0) { + logger.log(Level.SEVERE, "Received negative amount."); throw new InvalidAddTransactionSyntax("Amount cannot be negative"); } if (description.trim().isEmpty() || type.trim().isEmpty()) { + logger.log(Level.SEVERE, "One or more arguments are empty"); throw new EmptyArgumentException("data for the arguments "); } else if (type.equalsIgnoreCase("income")) { Income income = new Income(account.getAccountNumber(), account.getName(), description, Double.parseDouble(amount), date, account); income.setCategory(Category.fromNumber(category)); - + logger.log(Level.INFO, "Successfully created transaction object"); return income; } else if (type.equalsIgnoreCase("expense")) { Expense expense = new Expense(account.getAccountNumber(), account.getName(), description, Double.parseDouble(amount), date, account); expense.setCategory(Category.fromNumber(category)); + logger.log(Level.INFO, "Successfully created transaction object"); return expense; } else { + logger.log(Level.SEVERE, "Received invalid transaction type"); throw new InvalidTransactionTypeException(type); } } //@@author Vavinan + /** * The `parseEditTransaction` function in Java parses a new transaction string and creates either * an Income or Expense object based on the transaction type, validating the category number and * throwing exceptions for invalid data. * * @param newTransaction The `newTransaction` string is expected to be in a specific format - * @param account The `account` parameter in the `parseEditTransaction` method represents the - * account to which the transaction belongs. + * @param account The `account` parameter in the `parseEditTransaction` method represents the + * account to which the transaction belongs. * @return The `parseEditTransaction` method is returning a `Transaction` object, which can be - * either an `Income` or `Expense` object based on the type provided in the `newTransaction` string. + * either an `Income` or `Expense` object based on the type provided in the `newTransaction` string. */ public Transaction parseEditTransaction(String newTransaction, Account account) throws InvalidEditTransactionData, InvalidCategoryException { @@ -167,10 +182,10 @@ public String parseHelpCommand(String input) { /** * The `parseAddAccount` function in Java parses the input and returns the account name and - * balance of the new account that is to added. + * balance of the new account that is to added. * * @param input It contains details about account name and initial balance - * @return A string array that contains the account name and initial balance + * @return A string array that contains the account name and initial balance */ public static String[] parseAddAccount(String input) throws NumberFormatException, EmptyArgumentException { String data = input.substring(ADD_ACC_COMMAND_INDEX + 1).trim(); @@ -203,8 +218,9 @@ public static String[] parseAddAccount(String input) throws NumberFormatExceptio /** * The `parseRemoveAccount` function in Java parses the input and returns the account * number that is to be deleted + * * @param input It contains details about account number that is to be deleted - * @return A integer value representing the account number + * @return A integer value representing the account number */ public static int parseRemoveAccount(String input) throws NumberFormatException, EmptyArgumentException { @@ -221,8 +237,9 @@ public static int parseRemoveAccount(String input) /** * The `parseEditAccount` function in Java parses the input and returns the account * number that is to be edited + * * @param input It contains details about account number that is to be edited - * @return A integer value representing the account number + * @return A integer value representing the account number */ public static int parseEditAccount(String input) throws EmptyArgumentException { if (input.trim().length() < 9) { From 29021ae9b79d9be430b4a1969a2eefcfe5f8cb95 Mon Sep 17 00:00:00 2001 From: vibes-863 Date: Mon, 15 Apr 2024 19:46:24 +0800 Subject: [PATCH 57/59] Rename logger to LOGGER --- src/main/java/budgetbuddy/BudgetBuddy.java | 6 +-- .../java/budgetbuddy/account/Account.java | 10 ++-- .../budgetbuddy/account/AccountManager.java | 30 +++++------ .../java/budgetbuddy/storage/DataStorage.java | 52 +++++++++---------- 4 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/main/java/budgetbuddy/BudgetBuddy.java b/src/main/java/budgetbuddy/BudgetBuddy.java index 1c6d6be23e..667d1c1863 100644 --- a/src/main/java/budgetbuddy/BudgetBuddy.java +++ b/src/main/java/budgetbuddy/BudgetBuddy.java @@ -39,7 +39,7 @@ public class BudgetBuddy { public static final String DELETE_ACC = "delete-acc"; public static final String EDIT_ACC = "edit-acc"; public static final String SEARCH = "search"; - public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final AccountManager accountManager; private final TransactionList transactions; @@ -57,7 +57,7 @@ public BudgetBuddy() { */ private static void setupLogger() { LogManager.getLogManager().reset(); - logger.setLevel(java.util.logging.Level.ALL); + LOGGER.setLevel(java.util.logging.Level.ALL); try { File logsDir = new File("logs"); if (!logsDir.exists()) { @@ -66,7 +66,7 @@ private static void setupLogger() { FileHandler fh = new FileHandler("logs/budgetBuggyLog.log"); fh.setFormatter(new SimpleFormatter()); fh.setLevel(Level.INFO); - logger.addHandler(fh); + LOGGER.addHandler(fh); } catch (IOException e) { UserInterface.printLoggerSetupError(); } diff --git a/src/main/java/budgetbuddy/account/Account.java b/src/main/java/budgetbuddy/account/Account.java index a8d2718b3a..67a12832ce 100644 --- a/src/main/java/budgetbuddy/account/Account.java +++ b/src/main/java/budgetbuddy/account/Account.java @@ -6,7 +6,7 @@ * Represents an account in the budget buddy system. */ public class Account { - public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final int accountNumber; private String name; private double balance; @@ -21,7 +21,7 @@ public Account(int accountNumber) { this.accountNumber = accountNumber; this.name = ""; this.balance = 0.00; - logger.info("Account created with default name and balance"); + LOGGER.info("Account created with default name and balance"); } /** @@ -37,7 +37,7 @@ public Account(int accountNumber, String name, double balance) { this.accountNumber = accountNumber; this.name = name; this.balance = balance; - logger.info("Account created with specified name and balance"); + LOGGER.info("Account created with specified name and balance"); } /** @@ -56,7 +56,7 @@ public double getBalance() { */ public void setBalance(double balance) { this.balance = balance; - logger.info("Account balance updated"); + LOGGER.info("Account balance updated"); } /** @@ -85,7 +85,7 @@ public String getName() { public void setName(String name) { assert name != null : "Name cannot be null"; this.name = name; - logger.info("Account name updated"); + LOGGER.info("Account name updated"); } /** diff --git a/src/main/java/budgetbuddy/account/AccountManager.java b/src/main/java/budgetbuddy/account/AccountManager.java index 9f65b79e34..826b457f01 100644 --- a/src/main/java/budgetbuddy/account/AccountManager.java +++ b/src/main/java/budgetbuddy/account/AccountManager.java @@ -19,7 +19,7 @@ */ public class AccountManager { public static final int INDEX_OFFSET = 1; - public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final DataStorage dataStorage = new DataStorage(); private final ArrayList accounts; private final ArrayList existingAccountNumbers; @@ -31,7 +31,7 @@ public class AccountManager { public AccountManager() { this.accounts = new ArrayList<>(); this.existingAccountNumbers = new ArrayList<>(); - logger.log(Level.INFO, "AccountManager created with empty account and account number lists"); + LOGGER.log(Level.INFO, "AccountManager created with empty account and account number lists"); } /** @@ -45,7 +45,7 @@ public AccountManager(ArrayList accounts, ArrayList existingAc assert existingAccountNumbers != null : "Existing account numbers list cannot be null"; this.accounts = accounts; this.existingAccountNumbers = existingAccountNumbers; - logger.log(Level.INFO, "AccountManager created with specified account and account number lists"); + LOGGER.log(Level.INFO, "AccountManager created with specified account and account number lists"); } /** @@ -59,7 +59,7 @@ public void addAccount(String name, double initialBalance) { int newAccountNumber = generateAccountNumber(); accounts.add(new Account(newAccountNumber, name, initialBalance)); existingAccountNumbers.add(newAccountNumber); - logger.log(Level.INFO, "Account added"); + LOGGER.log(Level.INFO, "Account added"); } /** @@ -76,13 +76,13 @@ public int generateAccountNumber() { for (int accountNumber : existingAccountNumbers) { if (accountNumber == fourDigitNumber) { noMatchFound = false; - logger.log(Level.WARNING, "Account number already exists. Generating new account number."); + LOGGER.log(Level.WARNING, "Account number already exists. Generating new account number."); break; } } } while (!noMatchFound); - logger.log(Level.INFO, "Account number generated"); + LOGGER.log(Level.INFO, "Account number generated"); return fourDigitNumber; } @@ -97,18 +97,18 @@ public int generateAccountNumber() { public void processAddAccount(String input) throws InvalidArgumentSyntaxException, NumberFormatException, EmptyArgumentException { assert input != null : "Input cannot be null"; - logger.log(Level.INFO, "Processing add account command"); + LOGGER.log(Level.INFO, "Processing add account command"); String[] arguments = {"/n/", "/$/"}; for (String argument : arguments) { if (!input.contains(argument)) { - logger.log(Level.WARNING, "Invalid add account syntax."); + LOGGER.log(Level.WARNING, "Invalid add account syntax."); throw new InvalidArgumentSyntaxException("Invalid add account syntax."); } } String[] parsedData = Parser.parseAddAccount(input); addAccount(parsedData[0], Double.parseDouble(parsedData[1])); UserInterface.printAddAccountMessage(getAccount(accounts.size() - INDEX_OFFSET).toString()); - logger.log(Level.INFO, "Account added successfully"); + LOGGER.log(Level.INFO, "Account added successfully"); } /** @@ -126,19 +126,19 @@ public void removeAccount(String input, TransactionList transactions) InvalidIndexException { assert input != null : "Input cannot be null"; assert transactions != null : "Transactions cannot be null"; - logger.log(Level.INFO, "Processing remove account command"); + LOGGER.log(Level.INFO, "Processing remove account command"); int accountNumber = Parser.parseRemoveAccount(input); Account accountRemoved = getAccountByAccountNumber(accountNumber); if (accounts.size() == 1) { UserInterface.printCannotDeleteLastAccountMessage(); - logger.log(Level.WARNING, "Cannot delete last account."); + LOGGER.log(Level.WARNING, "Cannot delete last account."); return; } accounts.remove(accountRemoved); existingAccountNumbers.remove(Integer.valueOf(accountNumber)); ArrayList transactionsRemoved = transactions.removeTransactionsByAccountNumber(accountNumber); UserInterface.printDeleteAccountMessage(accountRemoved.toString(), transactionsRemoved); - logger.log(Level.INFO, "Account removed successfully"); + LOGGER.log(Level.INFO, "Account removed successfully"); } /** @@ -166,7 +166,7 @@ public Account getAccountByAccountNumber(int accountNumber) { return account; } } - logger.log(Level.WARNING, "Account not found."); + LOGGER.log(Level.WARNING, "Account not found."); throw new IllegalArgumentException("Account not found."); } @@ -188,13 +188,13 @@ public ArrayList getAccounts() { */ public void processEditAccount(String input) throws EmptyArgumentException, IllegalArgumentException { assert input != null : "Input cannot be null"; - logger.log(Level.INFO, "Processing edit account command"); + LOGGER.log(Level.INFO, "Processing edit account command"); int accountNumber = Parser.parseEditAccount(input); Account account = getAccountByAccountNumber(accountNumber); String newName = UserInterface.getNewAccountName(account.toString()); account.setName(newName); UserInterface.printUpdatedAccount(account.toString()); - logger.log(Level.INFO, "Account edited successfully"); + LOGGER.log(Level.INFO, "Account edited successfully"); } /** diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 9665b2b7a1..6c4384a721 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -32,7 +32,7 @@ public class DataStorage { public static final String TRANSACTIONS_FILE_PATH = "./data/transactions.txt"; public static final String ACCOUNTS_FILE_PATH = "./data/accounts.txt"; public static final String FOLDER_PATH = "./data"; - public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); //@@author ShyamKrishna33 /** @@ -70,14 +70,14 @@ private static void createDataFolderIfNotExists() throws IOException { * @param accounts The list of accounts to save. */ public void saveAccounts(ArrayList accounts) { - logger.log(Level.INFO, "Saving accounts to file"); + LOGGER.log(Level.INFO, "Saving accounts to file"); try { File f = new File(ACCOUNTS_FILE_PATH); if (!f.exists()) { - logger.log(Level.WARNING, "File does not exist. Creating new file."); + LOGGER.log(Level.WARNING, "File does not exist. Creating new file."); createDataFolderIfNotExists(); if (!f.createNewFile()) { - logger.log(Level.SEVERE, "Failed to create file"); + LOGGER.log(Level.SEVERE, "Failed to create file"); throw new IOException("Failed to create file"); } } @@ -90,9 +90,9 @@ public void saveAccounts(ArrayList accounts) { fw.close(); } catch (IOException e) { System.out.println("Error saving accounts."); - logger.log(Level.SEVERE, "Error saving accounts"); + LOGGER.log(Level.SEVERE, "Error saving accounts"); } - logger.log(Level.INFO, "Accounts saved to file"); + LOGGER.log(Level.INFO, "Accounts saved to file"); } //@@author ShyamKrishna33 @@ -187,7 +187,7 @@ private Transaction parseDataToTransaction(String s, ArrayList existing */ public ArrayList readAccountFile(ArrayList existingAccountNumbers) throws IOException, FileCorruptedException { - logger.log(Level.INFO, "Reading accounts from file"); + LOGGER.log(Level.INFO, "Reading accounts from file"); File f = new File(ACCOUNTS_FILE_PATH); Scanner s = new Scanner(f); @@ -199,7 +199,7 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb } accounts.add(processAccountLine(line, existingAccountNumbers)); } - logger.log(Level.INFO, "Accounts read from file"); + LOGGER.log(Level.INFO, "Accounts read from file"); return accounts; } @@ -213,18 +213,18 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb */ private Account processAccountLine(String line, ArrayList existingAccountNumbers) throws FileCorruptedException { - logger.log(Level.INFO, "Processing account line"); + LOGGER.log(Level.INFO, "Processing account line"); String[] accountInfo = line.split(" ,"); validateAccountInfo(accountInfo, existingAccountNumbers); - logger.log(Level.INFO, "Account line processed"); + LOGGER.log(Level.INFO, "Account line processed"); int accountNumber = Integer.parseInt(accountInfo[0]); double balance = Double.parseDouble(accountInfo[2]); String accountName = accountInfo[1].trim(); existingAccountNumbers.add(accountNumber); - logger.log(Level.INFO, "Account added to existing account numbers list"); - logger.log(Level.INFO, "Account created"); + LOGGER.log(Level.INFO, "Account added to existing account numbers list"); + LOGGER.log(Level.INFO, "Account created"); return new Account(accountNumber, accountName, balance); } @@ -238,35 +238,35 @@ private Account processAccountLine(String line, ArrayList existingAccou private void validateAccountInfo(String[] accountInfo, ArrayList existingAccountNumbers) throws FileCorruptedException { if (accountInfo.length != 3) { - logger.log(Level.SEVERE, "Invalid account information format"); + LOGGER.log(Level.SEVERE, "Invalid account information format"); throw new FileCorruptedException("Invalid account information format"); } try { int accountNumber = Integer.parseInt(accountInfo[0]); if (accountNumber < 1000 || accountNumber > 9999) { - logger.log(Level.SEVERE, "Invalid account number"); + LOGGER.log(Level.SEVERE, "Invalid account number"); throw new FileCorruptedException("Invalid account number"); } if (existingAccountNumbers.contains(accountNumber)) { - logger.log(Level.SEVERE, "Duplicate account number"); + LOGGER.log(Level.SEVERE, "Duplicate account number"); throw new FileCorruptedException("Duplicate account number"); } } catch (NumberFormatException e) { - logger.log(Level.SEVERE, "Invalid type for account number"); + LOGGER.log(Level.SEVERE, "Invalid type for account number"); throw new FileCorruptedException("Invalid type for account number"); } try { double balance = Double.parseDouble(accountInfo[2]); } catch (NumberFormatException e) { - logger.log(Level.SEVERE, "Invalid type for account balance"); + LOGGER.log(Level.SEVERE, "Invalid type for account balance"); throw new FileCorruptedException("Invalid type for account balance"); } String accountName = accountInfo[1].trim(); if (accountName.isEmpty()) { - logger.log(Level.SEVERE, "Invalid account name"); + LOGGER.log(Level.SEVERE, "Invalid account name"); throw new FileCorruptedException("Invalid account name"); } } @@ -313,14 +313,14 @@ public ArrayList readTransactionFile(ArrayList existingAcc * @return The loaded AccountManager object. */ public AccountManager loadAccounts() { - logger.log(Level.INFO, "Loading accounts from file"); + LOGGER.log(Level.INFO, "Loading accounts from file"); try { File f = new File(ACCOUNTS_FILE_PATH); if (!f.exists()) { - logger.log(Level.WARNING, "File does not exist. Creating new file."); + LOGGER.log(Level.WARNING, "File does not exist. Creating new file."); createDataFolderIfNotExists(); if (!f.createNewFile()) { - logger.log(Level.SEVERE, "Failed to create file"); + LOGGER.log(Level.SEVERE, "Failed to create file"); throw new IOException("Failed to create file"); } return createNewAccountManager(); @@ -330,21 +330,21 @@ public AccountManager loadAccounts() { try { accounts = readAccountFile(existingAccountNumbers); } catch (FileCorruptedException e) { - logger.log(Level.SEVERE, "File corrupted"); + LOGGER.log(Level.SEVERE, "File corrupted"); UserInterface.printFileCorruptedError(); FileWriter fw = new FileWriter(ACCOUNTS_FILE_PATH, false); - logger.log(Level.WARNING, "Creating new account manager"); + LOGGER.log(Level.WARNING, "Creating new account manager"); return createNewAccountManager(); } if (accounts.isEmpty()) { - logger.log(Level.WARNING, "Creating new account manager"); + LOGGER.log(Level.WARNING, "Creating new account manager"); return createNewAccountManager(); } return new AccountManager(accounts, existingAccountNumbers); } catch (IOException e) { - logger.log(Level.SEVERE, "Error loading accounts"); + LOGGER.log(Level.SEVERE, "Error loading accounts"); UserInterface.printFileCorruptedError(); - logger.log(Level.WARNING, "Creating new account manager"); + LOGGER.log(Level.WARNING, "Creating new account manager"); return createNewAccountManager(); } } From a62357e24b09851a376c69ba1abefb2d3d940324 Mon Sep 17 00:00:00 2001 From: Vavinan Date: Mon, 15 Apr 2024 20:02:53 +0800 Subject: [PATCH 58/59] Add logger for TransactionList --- .../transaction/TransactionList.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/budgetbuddy/transaction/TransactionList.java b/src/main/java/budgetbuddy/transaction/TransactionList.java index d43a05f4f3..e44f3c29ca 100644 --- a/src/main/java/budgetbuddy/transaction/TransactionList.java +++ b/src/main/java/budgetbuddy/transaction/TransactionList.java @@ -22,6 +22,8 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Represents a list of transactions and provides methods for managing them. @@ -32,6 +34,7 @@ public class TransactionList { public static final int INDEX_OFFSET = 1; public static final int LOWER_BOUND = 0; public static final int EDIT_BEGIN_INDEX = 5; + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); public static final String ACCOUNT = "acc"; public static final String ALL = "all"; @@ -46,7 +49,6 @@ public class TransactionList { private final ArrayList transactions; private final Parser parser; - private final DataStorage dataStorage = new DataStorage(); /** @@ -55,6 +57,8 @@ public class TransactionList { public TransactionList() { this.transactions = new ArrayList<>(); this.parser = new Parser(); + LOGGER.log(Level.INFO, "TransactionList created with empty transactions and parser"); + } /** @@ -65,6 +69,8 @@ public TransactionList() { public TransactionList(ArrayList transactions) { this.transactions = transactions; this.parser = new Parser(); + LOGGER.log(Level.INFO, "TransactionList created with transactions and parser"); + } public ArrayList getTransactions() { @@ -87,6 +93,7 @@ public void printTransactions() { public void removeTransaction(String input, AccountManager accountManager) throws EmptyArgumentException, NumberFormatException, InvalidIndexException { if (input.trim().length() < DELETE_BEGIN_INDEX) { + LOGGER.log(Level.WARNING, "Index id is not given for delete command"); throw new EmptyArgumentException("delete index"); } String data = input.substring(DELETE_BEGIN_INDEX).trim(); @@ -100,7 +107,10 @@ public void removeTransaction(String input, AccountManager accountManager) throw transactions.remove(id); assert transactions.size() == size - 1 : "Transaction list size did not decrease after removal"; UserInterface.printDeleteMessage(itemRemoved, account.getBalance()); + LOGGER.log(Level.INFO, "Transaction is removed successfully"); + } else { + LOGGER.log(Level.WARNING, "Invalid index for delete command"); throw new InvalidIndexException(String.valueOf(size)); } } @@ -144,6 +154,7 @@ public void processTransaction(String input, Account account) String[] arguments = {"/a/", "/t/", "/n/", "/$/", "/d/"}; for (String argument : arguments) { if (!input.contains(argument)) { + LOGGER.log(Level.WARNING, "Invalid add transaction syntax"); throw new InvalidAddTransactionSyntax("Invalid add syntax."); } } @@ -154,6 +165,8 @@ public void processTransaction(String input, Account account) 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)); UserInterface.printAddMessage(fetchData, account.getBalance()); + LOGGER.log(Level.INFO, "Transaction added successfully"); + } /** @@ -192,6 +205,7 @@ public static ArrayList getPastTransactions(ArrayList pastTransactions.add(transaction); } } + LOGGER.log(Level.INFO, "Past transactions loaded successfully"); return pastTransactions; } @@ -213,6 +227,8 @@ public static ArrayList getCustomDateTransactions(ArrayList getAccountTransactions(ArrayList getCategoryTransactions(ArrayList accounts, AccountManager accountManag UserInterface.printCategoryTransactions(categoryTransactions, categoryName); break; default: + LOGGER.log(Level.WARNING, "Invalid index for 'list' command"); throw new InvalidIndexException("6"); } @@ -325,11 +345,13 @@ public void processList(ArrayList accounts, AccountManager accountManag public void processEditTransaction(String input, AccountManager accountManager) throws EmptyArgumentException, NumberFormatException, InvalidIndexException, InvalidEditTransactionData, InvalidCategoryException { if (input.trim().length() < EDIT_BEGIN_INDEX) { + LOGGER.log(Level.WARNING, "Index id is missing for edit command"); throw new EmptyArgumentException("edit index "); } String data = input.substring(EDIT_BEGIN_INDEX).trim(); if (isNotInteger(data)) { + LOGGER.log(Level.WARNING, "Given index id for 'edit' command is not an integer"); throw new NumberFormatException(data); } int index = Integer.parseInt(data) - INDEX_OFFSET; @@ -340,7 +362,10 @@ public void processEditTransaction(String input, AccountManager accountManager) Transaction t = parser.parseEditTransaction(newTransaction, account); transactions.set(index, t); UserInterface.printUpdatedTransaction(t); + LOGGER.log(Level.INFO, "Transaction is edited successfully"); + } else { + LOGGER.log(Level.WARNING, "Given index id for 'edit' command is not valid"); throw new InvalidIndexException(String.valueOf(transactions.size())); } } @@ -398,6 +423,7 @@ public ArrayList removeTransactionsByAccountNumber(int accountNumbe } } transactions.removeAll(transactionsToRemove); + LOGGER.log(Level.INFO, "Transactions were removed successfully from the specified account number"); return transactionsToRemove; } @@ -423,10 +449,13 @@ public void searchTransactions(String input) { } index++; } + LOGGER.log(Level.INFO, "Transactions are filtered out for 'search' command"); UserInterface.printSearchResults(searchResults, indices); } catch (ArrayIndexOutOfBoundsException e) { + LOGGER.log(Level.WARNING, "Keyword is not provided for search command"); UserInterface.printInvalidInput("Please enter a keyword to search for transactions."); } catch (Exception e) { + LOGGER.log(Level.WARNING, "Search command failed"); UserInterface.printExceptionErrorMessage(e.getMessage()); } } From f934aa172cec45f6a7957c310a93b2266ee9aed6 Mon Sep 17 00:00:00 2001 From: ShyamKrishna33 Date: Mon, 15 Apr 2024 20:07:02 +0800 Subject: [PATCH 59/59] Fix checkstyle issues --- src/main/java/budgetbuddy/BudgetBuddy.java | 6 +- .../java/budgetbuddy/account/Account.java | 10 +-- .../budgetbuddy/account/AccountManager.java | 30 ++++----- src/main/java/budgetbuddy/parser/Parser.java | 33 +++++----- .../java/budgetbuddy/storage/DataStorage.java | 64 +++++++++---------- 5 files changed, 72 insertions(+), 71 deletions(-) diff --git a/src/main/java/budgetbuddy/BudgetBuddy.java b/src/main/java/budgetbuddy/BudgetBuddy.java index 1c6d6be23e..667d1c1863 100644 --- a/src/main/java/budgetbuddy/BudgetBuddy.java +++ b/src/main/java/budgetbuddy/BudgetBuddy.java @@ -39,7 +39,7 @@ public class BudgetBuddy { public static final String DELETE_ACC = "delete-acc"; public static final String EDIT_ACC = "edit-acc"; public static final String SEARCH = "search"; - public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final AccountManager accountManager; private final TransactionList transactions; @@ -57,7 +57,7 @@ public BudgetBuddy() { */ private static void setupLogger() { LogManager.getLogManager().reset(); - logger.setLevel(java.util.logging.Level.ALL); + LOGGER.setLevel(java.util.logging.Level.ALL); try { File logsDir = new File("logs"); if (!logsDir.exists()) { @@ -66,7 +66,7 @@ private static void setupLogger() { FileHandler fh = new FileHandler("logs/budgetBuggyLog.log"); fh.setFormatter(new SimpleFormatter()); fh.setLevel(Level.INFO); - logger.addHandler(fh); + LOGGER.addHandler(fh); } catch (IOException e) { UserInterface.printLoggerSetupError(); } diff --git a/src/main/java/budgetbuddy/account/Account.java b/src/main/java/budgetbuddy/account/Account.java index a8d2718b3a..67a12832ce 100644 --- a/src/main/java/budgetbuddy/account/Account.java +++ b/src/main/java/budgetbuddy/account/Account.java @@ -6,7 +6,7 @@ * Represents an account in the budget buddy system. */ public class Account { - public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final int accountNumber; private String name; private double balance; @@ -21,7 +21,7 @@ public Account(int accountNumber) { this.accountNumber = accountNumber; this.name = ""; this.balance = 0.00; - logger.info("Account created with default name and balance"); + LOGGER.info("Account created with default name and balance"); } /** @@ -37,7 +37,7 @@ public Account(int accountNumber, String name, double balance) { this.accountNumber = accountNumber; this.name = name; this.balance = balance; - logger.info("Account created with specified name and balance"); + LOGGER.info("Account created with specified name and balance"); } /** @@ -56,7 +56,7 @@ public double getBalance() { */ public void setBalance(double balance) { this.balance = balance; - logger.info("Account balance updated"); + LOGGER.info("Account balance updated"); } /** @@ -85,7 +85,7 @@ public String getName() { public void setName(String name) { assert name != null : "Name cannot be null"; this.name = name; - logger.info("Account name updated"); + LOGGER.info("Account name updated"); } /** diff --git a/src/main/java/budgetbuddy/account/AccountManager.java b/src/main/java/budgetbuddy/account/AccountManager.java index 9f65b79e34..826b457f01 100644 --- a/src/main/java/budgetbuddy/account/AccountManager.java +++ b/src/main/java/budgetbuddy/account/AccountManager.java @@ -19,7 +19,7 @@ */ public class AccountManager { public static final int INDEX_OFFSET = 1; - public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final DataStorage dataStorage = new DataStorage(); private final ArrayList accounts; private final ArrayList existingAccountNumbers; @@ -31,7 +31,7 @@ public class AccountManager { public AccountManager() { this.accounts = new ArrayList<>(); this.existingAccountNumbers = new ArrayList<>(); - logger.log(Level.INFO, "AccountManager created with empty account and account number lists"); + LOGGER.log(Level.INFO, "AccountManager created with empty account and account number lists"); } /** @@ -45,7 +45,7 @@ public AccountManager(ArrayList accounts, ArrayList existingAc assert existingAccountNumbers != null : "Existing account numbers list cannot be null"; this.accounts = accounts; this.existingAccountNumbers = existingAccountNumbers; - logger.log(Level.INFO, "AccountManager created with specified account and account number lists"); + LOGGER.log(Level.INFO, "AccountManager created with specified account and account number lists"); } /** @@ -59,7 +59,7 @@ public void addAccount(String name, double initialBalance) { int newAccountNumber = generateAccountNumber(); accounts.add(new Account(newAccountNumber, name, initialBalance)); existingAccountNumbers.add(newAccountNumber); - logger.log(Level.INFO, "Account added"); + LOGGER.log(Level.INFO, "Account added"); } /** @@ -76,13 +76,13 @@ public int generateAccountNumber() { for (int accountNumber : existingAccountNumbers) { if (accountNumber == fourDigitNumber) { noMatchFound = false; - logger.log(Level.WARNING, "Account number already exists. Generating new account number."); + LOGGER.log(Level.WARNING, "Account number already exists. Generating new account number."); break; } } } while (!noMatchFound); - logger.log(Level.INFO, "Account number generated"); + LOGGER.log(Level.INFO, "Account number generated"); return fourDigitNumber; } @@ -97,18 +97,18 @@ public int generateAccountNumber() { public void processAddAccount(String input) throws InvalidArgumentSyntaxException, NumberFormatException, EmptyArgumentException { assert input != null : "Input cannot be null"; - logger.log(Level.INFO, "Processing add account command"); + LOGGER.log(Level.INFO, "Processing add account command"); String[] arguments = {"/n/", "/$/"}; for (String argument : arguments) { if (!input.contains(argument)) { - logger.log(Level.WARNING, "Invalid add account syntax."); + LOGGER.log(Level.WARNING, "Invalid add account syntax."); throw new InvalidArgumentSyntaxException("Invalid add account syntax."); } } String[] parsedData = Parser.parseAddAccount(input); addAccount(parsedData[0], Double.parseDouble(parsedData[1])); UserInterface.printAddAccountMessage(getAccount(accounts.size() - INDEX_OFFSET).toString()); - logger.log(Level.INFO, "Account added successfully"); + LOGGER.log(Level.INFO, "Account added successfully"); } /** @@ -126,19 +126,19 @@ public void removeAccount(String input, TransactionList transactions) InvalidIndexException { assert input != null : "Input cannot be null"; assert transactions != null : "Transactions cannot be null"; - logger.log(Level.INFO, "Processing remove account command"); + LOGGER.log(Level.INFO, "Processing remove account command"); int accountNumber = Parser.parseRemoveAccount(input); Account accountRemoved = getAccountByAccountNumber(accountNumber); if (accounts.size() == 1) { UserInterface.printCannotDeleteLastAccountMessage(); - logger.log(Level.WARNING, "Cannot delete last account."); + LOGGER.log(Level.WARNING, "Cannot delete last account."); return; } accounts.remove(accountRemoved); existingAccountNumbers.remove(Integer.valueOf(accountNumber)); ArrayList transactionsRemoved = transactions.removeTransactionsByAccountNumber(accountNumber); UserInterface.printDeleteAccountMessage(accountRemoved.toString(), transactionsRemoved); - logger.log(Level.INFO, "Account removed successfully"); + LOGGER.log(Level.INFO, "Account removed successfully"); } /** @@ -166,7 +166,7 @@ public Account getAccountByAccountNumber(int accountNumber) { return account; } } - logger.log(Level.WARNING, "Account not found."); + LOGGER.log(Level.WARNING, "Account not found."); throw new IllegalArgumentException("Account not found."); } @@ -188,13 +188,13 @@ public ArrayList getAccounts() { */ public void processEditAccount(String input) throws EmptyArgumentException, IllegalArgumentException { assert input != null : "Input cannot be null"; - logger.log(Level.INFO, "Processing edit account command"); + LOGGER.log(Level.INFO, "Processing edit account command"); int accountNumber = Parser.parseEditAccount(input); Account account = getAccountByAccountNumber(accountNumber); String newName = UserInterface.getNewAccountName(account.toString()); account.setName(newName); UserInterface.printUpdatedAccount(account.toString()); - logger.log(Level.INFO, "Account edited successfully"); + LOGGER.log(Level.INFO, "Account edited successfully"); } /** diff --git a/src/main/java/budgetbuddy/parser/Parser.java b/src/main/java/budgetbuddy/parser/Parser.java index 248426df38..c0672f7370 100644 --- a/src/main/java/budgetbuddy/parser/Parser.java +++ b/src/main/java/budgetbuddy/parser/Parser.java @@ -15,8 +15,8 @@ import budgetbuddy.transaction.type.Transaction; import budgetbuddy.ui.UserInterface; -import java.util.logging.Level; import java.util.logging.Logger; +import java.util.logging.Level; /** * Parses the user input into data that is easily understandable by other classes and methods. @@ -25,10 +25,9 @@ public class Parser { public static final int ADD_COMMAND_INDEX = 3; public static final int HELP_BEGIN_INDEX = 4; + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private static final int ADD_ACC_COMMAND_INDEX = 7; - public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); - /** * The function `parseAccountNumber` extracts and returns an account number from a given input * string following a specific syntax. @@ -53,13 +52,14 @@ public static int parseAccountNumber(String input) throws InvalidArgumentSyntaxE * * @param input takes a user input that contain transaction details in a specific format. * @param account The `account` parameter in this method represents the account to which the transaction belongs. - * @return The method `parseUserInputToTransaction` is returning a `Transaction` object, which can - * be either an `Income` or an `Expense` object based on the type provided in the input. + * @return The method `parseUserInputToTransaction` is returning a `Transaction` object, which can + * be either an `Income` or an `Expense` object based on the type provided in the input. */ + public Transaction parseUserInputToTransaction(String input, Account account) throws InvalidTransactionTypeException, NumberFormatException, EmptyArgumentException, InvalidCategoryException, InvalidAddTransactionSyntax { - logger.log(Level.INFO, "Parsing user input."); + LOGGER.log(Level.INFO, "Parsing user input."); String data = input.substring(ADD_COMMAND_INDEX + 1); String[] parseData = data.split("/"); @@ -78,7 +78,7 @@ public Transaction parseUserInputToTransaction(String input, Account account) break; case "$": if (TransactionList.isNotDouble(parseData[i + 1].trim())) { - logger.log(Level.SEVERE, "Number format incorrect"); + LOGGER.log(Level.SEVERE, "Number format incorrect"); throw new NumberFormatException(parseData[i + 1].trim()); } else { amount = parseData[i + 1].trim(); @@ -98,38 +98,38 @@ public Transaction parseUserInputToTransaction(String input, Account account) assert type != null; if (category == -1) { - logger.log(Level.INFO, "Category not entered. Prompting for category."); + LOGGER.log(Level.INFO, "Category not entered. Prompting for category."); UserInterface.listCategories(); category = UserInterface.getCategoryNum(); } if (category < 1 || category > 9) { - logger.log(Level.SEVERE, "Category index out of bounds"); + LOGGER.log(Level.SEVERE, "Category index out of bounds"); throw new InvalidCategoryException("Category Index out of bounds"); } if (Double.parseDouble(amount) < 0) { - logger.log(Level.SEVERE, "Received negative amount."); + LOGGER.log(Level.SEVERE, "Received negative amount."); throw new InvalidAddTransactionSyntax("Amount cannot be negative"); } if (description.trim().isEmpty() || type.trim().isEmpty()) { - logger.log(Level.SEVERE, "One or more arguments are empty"); + LOGGER.log(Level.SEVERE, "One or more arguments are empty"); throw new EmptyArgumentException("data for the arguments "); } else if (type.equalsIgnoreCase("income")) { Income income = new Income(account.getAccountNumber(), account.getName(), description, Double.parseDouble(amount), date, account); income.setCategory(Category.fromNumber(category)); - logger.log(Level.INFO, "Successfully created transaction object"); + LOGGER.log(Level.INFO, "Successfully created transaction object"); return income; } else if (type.equalsIgnoreCase("expense")) { Expense expense = new Expense(account.getAccountNumber(), account.getName(), description, Double.parseDouble(amount), date, account); expense.setCategory(Category.fromNumber(category)); - logger.log(Level.INFO, "Successfully created transaction object"); + LOGGER.log(Level.INFO, "Successfully created transaction object"); return expense; } else { - logger.log(Level.SEVERE, "Received invalid transaction type"); + LOGGER.log(Level.SEVERE, "Received invalid transaction type"); throw new InvalidTransactionTypeException(type); } } @@ -144,9 +144,10 @@ public Transaction parseUserInputToTransaction(String input, Account account) * @param newTransaction The `newTransaction` string is expected to be in a specific format * @param account The `account` parameter in the `parseEditTransaction` method represents the * account to which the transaction belongs. - * @return The `parseEditTransaction` method is returning a `Transaction` object, which can be - * either an `Income` or `Expense` object based on the type provided in the `newTransaction` string. + * @return The `parseEditTransaction` method is returning a `Transaction` object, which can be either + * an `Income` or `Expense` object based on the type provided in the `newTransaction` string. */ + public Transaction parseEditTransaction(String newTransaction, Account account) throws InvalidEditTransactionData, InvalidCategoryException { String[] parts = newTransaction.split(" \\| "); diff --git a/src/main/java/budgetbuddy/storage/DataStorage.java b/src/main/java/budgetbuddy/storage/DataStorage.java index 580c5ddc33..e194af815a 100644 --- a/src/main/java/budgetbuddy/storage/DataStorage.java +++ b/src/main/java/budgetbuddy/storage/DataStorage.java @@ -32,7 +32,7 @@ public class DataStorage { public static final String TRANSACTIONS_FILE_PATH = "./data/transactions.txt"; public static final String ACCOUNTS_FILE_PATH = "./data/accounts.txt"; public static final String FOLDER_PATH = "./data"; - public static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public static final Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); //@@author ShyamKrishna33 @@ -71,14 +71,14 @@ private static void createDataFolderIfNotExists() throws IOException { * @param accounts The list of accounts to save. */ public void saveAccounts(ArrayList accounts) { - logger.log(Level.INFO, "Saving accounts to file"); + LOGGER.log(Level.INFO, "Saving accounts to file"); try { File f = new File(ACCOUNTS_FILE_PATH); if (!f.exists()) { - logger.log(Level.WARNING, "File does not exist. Creating new file."); + LOGGER.log(Level.WARNING, "File does not exist. Creating new file."); createDataFolderIfNotExists(); if (!f.createNewFile()) { - logger.log(Level.SEVERE, "Failed to create file"); + LOGGER.log(Level.SEVERE, "Failed to create file"); throw new IOException("Failed to create file"); } } @@ -91,9 +91,9 @@ public void saveAccounts(ArrayList accounts) { fw.close(); } catch (IOException e) { System.out.println("Error saving accounts."); - logger.log(Level.SEVERE, "Error saving accounts"); + LOGGER.log(Level.SEVERE, "Error saving accounts"); } - logger.log(Level.INFO, "Accounts saved to file"); + LOGGER.log(Level.INFO, "Accounts saved to file"); } //@@author ShyamKrishna33 @@ -105,7 +105,7 @@ public void saveAccounts(ArrayList accounts) { * @throws IOException If an I/O error occurs while saving the transactions. */ public void saveTransactions(ArrayList transactionArrayList) throws IOException { - logger.log(Level.INFO, "Saving transactions to file"); + LOGGER.log(Level.INFO, "Saving transactions to file"); File f = new File(TRANSACTIONS_FILE_PATH); assert f.exists() : "File does not exist"; @@ -118,7 +118,7 @@ public void saveTransactions(ArrayList transactionArrayList) throws String stringToWrite = getStringToWrite(transaction); writeToFile(stringToWrite, TRANSACTIONS_FILE_PATH); } - logger.log(Level.INFO, "Transactions saved to file"); + LOGGER.log(Level.INFO, "Transactions saved to file"); } /** @@ -191,7 +191,7 @@ private Transaction parseDataToTransaction(String s, ArrayList existing */ public ArrayList readAccountFile(ArrayList existingAccountNumbers) throws IOException, FileCorruptedException { - logger.log(Level.INFO, "Reading accounts from file"); + LOGGER.log(Level.INFO, "Reading accounts from file"); File f = new File(ACCOUNTS_FILE_PATH); Scanner s = new Scanner(f); @@ -203,7 +203,7 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb } accounts.add(processAccountLine(line, existingAccountNumbers)); } - logger.log(Level.INFO, "Accounts read from file"); + LOGGER.log(Level.INFO, "Accounts read from file"); return accounts; } @@ -216,18 +216,18 @@ public ArrayList readAccountFile(ArrayList existingAccountNumb */ private Account processAccountLine(String line, ArrayList existingAccountNumbers) throws FileCorruptedException { - logger.log(Level.INFO, "Processing account line"); + LOGGER.log(Level.INFO, "Processing account line"); String[] accountInfo = line.split(" ,"); validateAccountInfo(accountInfo, existingAccountNumbers); - logger.log(Level.INFO, "Account line processed"); + LOGGER.log(Level.INFO, "Account line processed"); int accountNumber = Integer.parseInt(accountInfo[0]); double balance = Double.parseDouble(accountInfo[2]); String accountName = accountInfo[1].trim(); existingAccountNumbers.add(accountNumber); - logger.log(Level.INFO, "Account added to existing account numbers list"); - logger.log(Level.INFO, "Account created"); + LOGGER.log(Level.INFO, "Account added to existing account numbers list"); + LOGGER.log(Level.INFO, "Account created"); return new Account(accountNumber, accountName, balance); } @@ -241,35 +241,35 @@ private Account processAccountLine(String line, ArrayList existingAccou private void validateAccountInfo(String[] accountInfo, ArrayList existingAccountNumbers) throws FileCorruptedException { if (accountInfo.length != 3) { - logger.log(Level.SEVERE, "Invalid account information format"); + LOGGER.log(Level.SEVERE, "Invalid account information format"); throw new FileCorruptedException("Invalid account information format"); } try { int accountNumber = Integer.parseInt(accountInfo[0]); if (accountNumber < 1000 || accountNumber > 9999) { - logger.log(Level.SEVERE, "Invalid account number"); + LOGGER.log(Level.SEVERE, "Invalid account number"); throw new FileCorruptedException("Invalid account number"); } if (existingAccountNumbers.contains(accountNumber)) { - logger.log(Level.SEVERE, "Duplicate account number"); + LOGGER.log(Level.SEVERE, "Duplicate account number"); throw new FileCorruptedException("Duplicate account number"); } } catch (NumberFormatException e) { - logger.log(Level.SEVERE, "Invalid type for account number"); + LOGGER.log(Level.SEVERE, "Invalid type for account number"); throw new FileCorruptedException("Invalid type for account number"); } try { double balance = Double.parseDouble(accountInfo[2]); } catch (NumberFormatException e) { - logger.log(Level.SEVERE, "Invalid type for account balance"); + LOGGER.log(Level.SEVERE, "Invalid type for account balance"); throw new FileCorruptedException("Invalid type for account balance"); } String accountName = accountInfo[1].trim(); if (accountName.isEmpty()) { - logger.log(Level.SEVERE, "Invalid account name"); + LOGGER.log(Level.SEVERE, "Invalid account name"); throw new FileCorruptedException("Invalid account name"); } } @@ -283,11 +283,11 @@ private void validateAccountInfo(String[] accountInfo, ArrayList existi * @throws IOException If an I/O error occurs while reading the file. */ public ArrayList readTransactionFile(ArrayList existingAccountNumbers) throws IOException { - logger.log(Level.INFO, "Fetching transactions from storage"); + LOGGER.log(Level.INFO, "Fetching transactions from storage"); createDataFolderIfNotExists(); File f = new File(TRANSACTIONS_FILE_PATH); if (!f.exists()) { - logger.log(Level.INFO, "File does not exists. Creating a new one."); + LOGGER.log(Level.INFO, "File does not exists. Creating a new one."); if (!f.createNewFile()) { throw new IOException("Failed to create file"); } @@ -306,12 +306,12 @@ public ArrayList readTransactionFile(ArrayList existingAcc transactionList.add(parseDataToTransaction(line, existingAccountNumbers)); } } catch (FileCorruptedException | InvalidCategoryException e) { - logger.log(Level.SEVERE, "File got corrupted"); + LOGGER.log(Level.SEVERE, "File got corrupted"); UserInterface.printFileCorruptedError(); FileWriter fw = new FileWriter(TRANSACTIONS_FILE_PATH, false); return new ArrayList<>(); } - logger.log(Level.INFO, "Transactions are fetched successfully"); + LOGGER.log(Level.INFO, "Transactions are fetched successfully"); return transactionList; } //@@author @@ -322,14 +322,14 @@ public ArrayList readTransactionFile(ArrayList existingAcc * @return The loaded AccountManager object. */ public AccountManager loadAccounts() { - logger.log(Level.INFO, "Loading accounts from file"); + LOGGER.log(Level.INFO, "Loading accounts from file"); try { File f = new File(ACCOUNTS_FILE_PATH); if (!f.exists()) { - logger.log(Level.WARNING, "File does not exist. Creating new file."); + LOGGER.log(Level.WARNING, "File does not exist. Creating new file."); createDataFolderIfNotExists(); if (!f.createNewFile()) { - logger.log(Level.SEVERE, "Failed to create file"); + LOGGER.log(Level.SEVERE, "Failed to create file"); throw new IOException("Failed to create file"); } return createNewAccountManager(); @@ -339,21 +339,21 @@ public AccountManager loadAccounts() { try { accounts = readAccountFile(existingAccountNumbers); } catch (FileCorruptedException e) { - logger.log(Level.SEVERE, "File corrupted"); + LOGGER.log(Level.SEVERE, "File corrupted"); UserInterface.printFileCorruptedError(); FileWriter fw = new FileWriter(ACCOUNTS_FILE_PATH, false); - logger.log(Level.WARNING, "Creating new account manager"); + LOGGER.log(Level.WARNING, "Creating new account manager"); return createNewAccountManager(); } if (accounts.isEmpty()) { - logger.log(Level.WARNING, "Creating new account manager"); + LOGGER.log(Level.WARNING, "Creating new account manager"); return createNewAccountManager(); } return new AccountManager(accounts, existingAccountNumbers); } catch (IOException e) { - logger.log(Level.SEVERE, "Error loading accounts"); + LOGGER.log(Level.SEVERE, "Error loading accounts"); UserInterface.printFileCorruptedError(); - logger.log(Level.WARNING, "Creating new account manager"); + LOGGER.log(Level.WARNING, "Creating new account manager"); return createNewAccountManager(); } }