Phase III

-   Added:
    -   AccountInterface
    -   CheckingAccount
    -   SavingsAccount
-   Converted Account to abstract class
-   All instance variables are validated via exception handling
This commit is contained in:
ds.731 2025-01-02 15:48:07 -06:00
parent 65963450ab
commit 4973d45198
15 changed files with 535 additions and 239 deletions

21
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,21 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Current File",
"request": "launch",
"mainClass": "${file}"
},
{
"type": "java",
"name": "BankAcctApp",
"request": "launch",
"mainClass": "bankAcctApp.BankAcctApp",
"projectName": "Bank Account App_b3cd1e26"
}
]
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,80 +1,102 @@
/* Phase II */ /* Phase III */
package bankAcctApp; package bankAcctApp;
public class Account { import java.util.ArrayList;
private String accountNumber; // Abstract class defining the structure for account types
private String accountType; public abstract class Account implements AccountInterface {
private Double svcFee; private String accountNumber; // Account number for each account
private Double interestRate; private String accountType; // Type of account (CHK or SAV)
private Double overDraftFee; private double svcFee; // Service fee for transactions
private Double balance = 0.00; private double interestRate; // Interest rate for the account
private double overDraftFee; // Overdraft fee for checking accounts
private double balance = 0.00; // Initial balance of the account
// Transaction history stored as strings
private ArrayList<String> transactionHistory = new ArrayList<>();
// Getter and Setter for Account Number info. // Getter for account number
public String getAccountNumber() { public String getAccountNumber() {
return accountNumber; return accountNumber;
} }
// Setter for account number
public void setAccountNumber(String accountNumber) { public void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber; this.accountNumber = accountNumber;
} }
// Getter for account type
// Getter and Setter for Customer ID info.
public String getAccountType() { public String getAccountType() {
return accountType; return accountType;
} }
// Setter for account type
public void setAccountType(String accountType) { public void setAccountType(String accountType) {
this.accountType = accountType; this.accountType = accountType;
} }
// Getter for service fee
// Getter and Setter for Service Fee info. public double getSvcFee() {
public Double getSvcFee() {
return svcFee; return svcFee;
} }
public void setSvcFee(Double svcFee) {
// Setter for service fee
public void setSvcFee(double svcFee) {
this.svcFee = svcFee; this.svcFee = svcFee;
} }
// Getter for interest rate
// Getter and Setter for Interest Rate info. public double getInterestRate() {
public Double getInterestRate() {
return interestRate; return interestRate;
} }
public void setInterestRate(Double interestRate) {
// Setter for interest rate
public void setInterestRate(double interestRate) {
this.interestRate = interestRate; this.interestRate = interestRate;
} }
// Getter for overdraft fee
// Getter and Setter for Overdraft Fee info. public double getOverDraftFee() {
public Double getOverDraftFee() {
return overDraftFee; return overDraftFee;
} }
public void setOverDraftFee(Double overDraftFee) {
// Setter for overdraft fee
public void setOverDraftFee(double overDraftFee) {
this.overDraftFee = overDraftFee; this.overDraftFee = overDraftFee;
} }
// Getter for account balance
// Getter and Setter for Balance info. public double getBalance() {
public Double getBalance() {
return balance; return balance;
} }
public void setBalance(Double balance) {
// Setter for account balance
public void setBalance(double balance) {
this.balance = balance; this.balance = balance;
} }
// Getter for transaction history
public ArrayList<String> getTransactionHistory() {
return transactionHistory;
}
// Override the toString() method that is inherited by default in Java. // Method to log a transaction and store it in the transaction history
// Then use the custom-written toString() method to return Account Info public String logTransaction(String date, String type, double amount) {
@Override String transaction = String.format(
public String toString() { "Date: %s | Type: %s | Amount: $%.2f | Balance: $%.2f",
return String.format( date, type, amount, this.balance
"Acct#: Type: Svc Fee: Int Rate: Ovdft Fee: Balance: \n" +
"------ ----- -------- --------- ---------- -------- \n" +
"%-8s %-8s $%-10.2f %-12.1f $%-12.2f $%-9.2f",
accountNumber, accountType, svcFee, interestRate, overDraftFee, balance
); );
transactionHistory.add(transaction); // Add transaction to history
return transaction; // Return the formatted transaction string
} }
// Abstract method for withdrawals, to be implemented in subclasses
public abstract void withdrawal(double amount);
// Abstract method for deposits, to be implemented in subclasses
public abstract void deposit(double amount);
// Abstract method for applying accrued interest
public abstract double applyAccruedInterest(String transactionDate);
} }

View File

@ -0,0 +1,10 @@
/* Phase III */
package bankAcctApp;
public interface AccountInterface {
void withdrawal(double amount);
void deposit(double amount);
double applyAccruedInterest(String date);
double balance();
}

View File

@ -1,182 +1,344 @@
/* Phase II */ /* Phase III */
package bankAcctApp; package bankAcctApp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.InputMismatchException;
public class BankAcctApp { public class BankAcctApp {
public static void main(String[] args) { public static void main(String[] args) {
// Create ArrayLists for the Customer and Account classes. Each ArrayList will store the instances
// created of its respective class, appending each new instance to the end of the list.
ArrayList<Customer> customers = new ArrayList<>(); ArrayList<Customer> customers = new ArrayList<>();
ArrayList<Account> accounts = new ArrayList<>(); ArrayList<Account> accounts = new ArrayList<>();
boolean moreCustomers = true; boolean moreCustomers = true;
// Create the loop that keeps adding Customer and Account instances until // Add customers and accounts
// the user chooses to quit.
while (moreCustomers) { while (moreCustomers) {
// Create instances of the both the Customer and Account classes.
// These will be stored in their respective class' ArrayList.
Customer customer = new Customer(); Customer customer = new Customer();
Account account = new Account(); Account account = null;
int inputCount = 0;
// Customer Information:
System.out.println("Enter details for new customer:\n"); System.out.println("Enter details for new customer:\n");
// Collect and validate user input for Customer ID info. // Collect and validate customer ID
while (inputCount == 0) {
try { try {
customer.setID(DataEntry.inputStringWithLimit("Customer ID (max 5 chars): ", 5)); customer.setID(DataEntry.inputStringWithLimit("Customer ID (max 5 chars): ", 5));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.out.println("Customer ID must be 5 alphanumeric characters only. Try again."); System.out.println("Customer ID must be 5 alphanumeric characters only. Try again.");
continue; // retry input if invalid
}
inputCount++;
} }
// Collect and validate user input for Social Security Number (SSN). // Collect and validate SSN
while (inputCount == 1) {
try { try {
customer.setSSN(DataEntry.inputNumericString("SSN (9 numeric chars): ", 9)); customer.setSSN(DataEntry.inputNumericString("SSN (9 numeric chars): ", 9));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.out.println("SSN must be exactly 9 digits. Try again."); System.out.println("SSN must be exactly 9 digits. Try again.");
continue;
}
inputCount++;
} }
// Collect and validate user input for Last Namee. // Collect and validate Last Name
while (inputCount == 2) {
try { try {
customer.setLastName(DataEntry.inputStringWithLimit("Last Name (max 20 chars): ", 20)); customer.setLastName(DataEntry.inputStringWithLimit("Last Name (max 20 chars): ", 20));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.out.println("Last Name must not contain numbers (0-9) or special characters " System.out.println("Last Name must not contain numbers or special characters. Try again.");
+ "(!@#$%^&*(){}[]|). Try again."); continue;
}
inputCount++;
} }
// Collect and validate user input for First Name. // Collect and validate First Name
while (inputCount == 3) {
try { try {
customer.setFirstName(DataEntry.inputStringWithLimit("First Name (max 15 chars): ", 15)); customer.setFirstName(DataEntry.inputStringWithLimit("First Name (max 15 chars): ", 15));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.out.println("First Name must not contain numbers (0-9) " System.out.println("First Name must not contain numbers or special characters. Try again.");
+ "or special characters (!@#$%^&*(){}[]|). Try again."); continue;
}
inputCount++;
} }
// Collect and validate Street Address
// Collect and validate user input for Street Address. while (inputCount == 4) {
try { try {
customer.setStreet(DataEntry.inputStringWithLimit("Street (max 20 chars): ", 20)); customer.setStreet(DataEntry.inputStringWithLimit("Street (max 20 chars): ", 20));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.out.println("Street must be no more than 20 characters consisting of " System.out.println("Street must be no more than 20 valid characters. Try again.");
+ "numbers, letters, spaces, and \" . , - ' \". Try again."); continue;
}
inputCount++;
} }
// Collect and validate user input for City. // Collect and validate City
while (inputCount == 5) {
try { try {
customer.setCity(DataEntry.inputStringWithLimit("City (max 20 chars): ", 20)); customer.setCity(DataEntry.inputStringWithLimit("City (max 20 chars): ", 20));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.out.println("City must not contain numbers (0-9) or special characters " System.out.println("City must not contain numbers or special characters. Try again.");
+ "(!@#$%^&*(){}[]|). Try again."); continue;
}
inputCount++;
} }
// Collect and validate user input for State. // Collect and validate State
while (inputCount == 6) {
try { try {
customer.setState(DataEntry.inputStringWithLimit("State (2 chars): ", 2)); customer.setState(DataEntry.inputStringWithLimit("State (2 chars): ", 2));
} catch (InputMismatchException e) { } catch (IllegalArgumentException e) {
System.out.println("State must be 2 letters only. Try again."); System.out.println("State must be 2 letters only. Try again.");
continue;
}
inputCount++;
} }
// Collect and validate user input for Zip Code. // Collect and validate ZIP code
while (inputCount == 7) {
try { try {
customer.setZip(DataEntry.inputNumericString("Zip (5 numeric chars): ", 5)); customer.setZip(DataEntry.inputNumericString("Zip (5 numeric chars): ", 5));
} catch (NumberFormatException e) { } catch (IllegalArgumentException e) {
System.out.println("Zip Code must only contain 5 digits. Try again."); System.out.println("Zip must be exactly 5 digits. Try again.");
continue;
}
inputCount++;
} }
// Collect and validate user input for Phone Number. // Collect and validate Phone Number
while (inputCount == 8) {
try { try {
customer.setPhone(DataEntry.inputNumericString("Phone (10 numeric chars): ", 10)); customer.setPhone(DataEntry.inputNumericString("Phone (10 numeric chars): ", 10));
} catch (NumberFormatException e) { } catch (IllegalArgumentException e) {
System.out.println("Phone Number must only contain 9 digits."); System.out.println("Phone number must be 10 digits only. Try again.");
continue;
}
inputCount++;
} }
// Store Customer information to the Customer instance. // Add customer instance to customers ArrayList
customers.add(customer); customers.add(customer);
// Account Information: // Collect and validate Account Type
// Collect and validate user input for Account Number. while (inputCount == 9) {
try {
String accountType = DataEntry.inputStringWithLimit("Account type ('CHK' or 'SAV' only): ", 3).toUpperCase();
if (accountType.equals("CHK")) {
account = new CheckingAccount();
account.setAccountType("CHK");
} else if (accountType.equals("SAV")) {
account = new SavingsAccount();
account.setAccountType("SAV");
} else {
throw new IllegalArgumentException("Account type must be 'CHK' or 'SAV'.");
}
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
continue;
}
inputCount++;
}
// Collect and validate Account Number
while (inputCount == 10) {
try { try {
account.setAccountNumber(DataEntry.inputNumericString("Account Number (5 numeric chars): ", 5)); account.setAccountNumber(DataEntry.inputNumericString("Account Number (5 numeric chars): ", 5));
} catch (NumberFormatException e) { } catch (IllegalArgumentException e) {
System.out.println("Account Number can only be 5 digits. Try again."); System.out.println("Account number must be exactly 5 digits. Try again.");
continue;
}
inputCount++;
} }
// Collect and validate user input for Account Type. // Collect and validate Service Fee Amount
while (inputCount == 11) {
try { try {
boolean validAcctType = false; account.setSvcFee(DataEntry.inputDecimalInRange("Service Fee (0.00 to 10.00): $", 0.00, 10.00));
while (!validAcctType) { } catch (IllegalArgumentException e) {
String input = DataEntry.inputStringWithLimit("Account type ('CHK' or 'SVG' only): ", 3); System.out.println(e.getMessage());
continue;
if (input.equalsIgnoreCase("CHK") || input.equalsIgnoreCase("SAV")) {
account.setAccountType(input.toUpperCase());
validAcctType = true;
} else {
System.out.println("Input for Account Type can only be 'CHK' or 'SVG'. Try again.");
} }
} inputCount++;
} catch (InputMismatchException e) {
System.out.println("Invalid input. Please try again.");
} }
// Collect and validate user input for Service Fee. // Collect and validate Interest Rate Amount
while (inputCount == 12) {
try { try {
account.setSvcFee(DataEntry.inputDecimalInRange("Service Fee Amount (in dollars and cents): $", 0.00, 10.00)); account.setInterestRate(DataEntry.inputDecimalInRange("Interest Rate (0.0% to 10.0%): ", 0.0, 10.0));
} catch (InputMismatchException e) { } catch (IllegalArgumentException e) {
System.out.println("Input must be a dollar amount between $0.00 - $10.00. Try again."); System.out.println(e.getMessage());
continue;
}
inputCount++;
} }
// Collect and validate user input for Interest Rate. // Collect and validate Overdraft Fee Amount
while (inputCount == 13) {
try { try {
account.setInterestRate(DataEntry.inputDecimalInRange("Interest Rate (percent between 0.0% and 10.0%: ", 0.0, 10.0)); account.setOverDraftFee(DataEntry.inputDecimal("Overdraft Fee (dollars and cents): $"));
} catch (InputMismatchException e) { } catch (IllegalArgumentException e) {
System.out.println("Interest Rate must be entered as a decimial between 0.0% - 10.0%. Try again."); System.out.println(e.getMessage());
continue;
}
inputCount++;
} }
// Collect and validate user input for Overdraft Fee. // Collect and validate Starting Balance
while (inputCount == 14) {
try { try {
account.setOverDraftFee(DataEntry.inputDecimal("Overdraft Fee Amount (in dollars and cents): $")); account.setBalance(DataEntry.inputDecimal("Starting Balance (dollars and cents): $"));
} catch (InputMismatchException e) { } catch (IllegalArgumentException e) {
System.out.println("Input must be a dollar amount between $0.00 and $10.00"); System.out.println(e.getMessage());
continue;
}
inputCount++;
} }
// Collect and validate user input for Current Balance. // Add account instance to accounts ArrayList
try {
account.setBalance(DataEntry.inputDecimal("Starting Balance (in dollars and cents): $"));
} catch (InputMismatchException e) {
System.out.println("Current Balance must be in dollars and cents. Try again.");
}
// Add the Account class instance to the accounts ArrayList
accounts.add(account); accounts.add(account);
// Prompt user to add additional customers or quit. // Ask if more customers should be added
String more = DataEntry.inputStringWithLimit("\nAdd another customer? (y/n): ", 1); String more = DataEntry.inputStringWithLimit("\nAdd another customer? (y/n): ", 1);
if (more.equalsIgnoreCase("n")) { moreCustomers = more.equalsIgnoreCase("y");
moreCustomers = false; System.out.println();
}
// Handle transactions
boolean addTransactionDetails = true;
// Start do-while loop add transaction details to any accounts
do {
String promptAddTransactions = DataEntry.inputStringWithLimit("Would you like to enter transaction details for an account? (y/n): ", 1).toUpperCase();
if (!promptAddTransactions.equals("Y") && !promptAddTransactions.equals("N")) {
System.out.println("Please enter 'Y' or 'N' only.");
continue; // Prompt again if invalid input
} else if (promptAddTransactions.equalsIgnoreCase("N")) {
addTransactionDetails = false; // Exit the loop and proceed to report generation
} else if (promptAddTransactions.equalsIgnoreCase("Y")) {
boolean addTransactionsToAcct = true;
// Start do-while loop to add transaction entries to a specified account
do {
// Prompt for account number
String accountNumber = DataEntry.inputNumericString("Enter Account Number (5 digits): ", 5);
// Find account and corresponding customer
Account selectedAccount = null;
Customer selectedCustomer = null;
for (int i = 0; i < accounts.size(); i++) {
if (accounts.get(i).getAccountNumber().equals(accountNumber)) {
selectedAccount = accounts.get(i);
selectedCustomer = customers.get(i);
break;
} }
} }
// Print out the results so that each Customer instance and its corresponding Account instance are if (selectedAccount == null) {
// printed together, and so the program iterates through all of the instance pairs in their respective ArrayLists. System.out.println("Account not found. Please try again.\n");
System.out.println("\n========================================\n"); continue; // Prompt for account number again if not found
for (int i = 0; i < customers.size(); i++) { }
// Use [int i] for both ArrayLists to ensure the correct Accounts instance is // Display customer details for verification
// printed with the corresponding Customer instance. System.out.println("Customer Information:");
System.out.println(selectedCustomer);
// Add transactions for the selected account
boolean newTransaction = true;
// Start do-while loop for "newTransactions
do {
String transaction = null;
int transactionStep = 0;
String transactionType = "";
String transactionDate = "";
try {
while (transactionStep == 0) {
transactionType = DataEntry.inputStringWithLimit("\nTransaction Type ('DEP', 'WTH', or 'INT'): ", 3).toUpperCase();
if (!transactionType.equals("DEP") && !transactionType.equals("WTH") && !transactionType.equals("INT")) {
System.out.println("Invalid transaction type. Please try again.");
} else {
transactionStep++;
}
}
} catch (IllegalArgumentException e) {
System.out.println("Type must be 'DEP', 'WTH', or 'INT' only. Try again");
}
while (transactionStep == 1) {
transactionDate = DataEntry.inputDate("Enter the transaction date (MM/DD/YYYY): ");
transactionStep++;
}
while (transactionStep == 2) {
double amount = 0;
if (!transactionType.equals("INT")) {
amount = DataEntry.inputDecimal("Transaction Amount: $");
}
try {
if (transactionType.equals("DEP")) {
selectedAccount.deposit(amount);
transaction = selectedAccount.logTransaction(transactionDate, "DEP", amount);
} else if (transactionType.equals("WTH")) {
selectedAccount.withdrawal(amount);
transaction = selectedAccount.logTransaction(transactionDate, "WTH", amount);
} else if (transactionType.equals("INT")) {
double interest = selectedAccount.applyAccruedInterest(transactionDate);
transaction = selectedAccount.logTransaction(transactionDate, "INT", interest);
}
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
continue;
}
System.out.println(transaction + "\n");
// Ask if another transaction should be entered for this account
String anotherNewTransaction = DataEntry.inputStringWithLimit("Add another transaction for this account? (y/n): ", 1);
if (!anotherNewTransaction.equalsIgnoreCase("N") && !anotherNewTransaction.equalsIgnoreCase("Y")) {
System.out.println("Please enter 'Y' or 'N' only.");
continue;
}else if (anotherNewTransaction.equalsIgnoreCase("N")) {
newTransaction = false;
break;
}else if (anotherNewTransaction.equalsIgnoreCase("Y")) {
transactionStep = 0;
}
}
}while (newTransaction);
// Ask if another account's transactions should be entered
String otherAcctTransactions = DataEntry.inputStringWithLimit("Enter transactions for another account? (y/n): ", 1);
if (!otherAcctTransactions.equalsIgnoreCase("N") && !otherAcctTransactions.equalsIgnoreCase("y")) {
System.out.println("Please enter 'Y' or 'N' only.");
continue;
} else if (otherAcctTransactions.equalsIgnoreCase("N")) {
addTransactionsToAcct = false;
break;
}
} while (addTransactionsToAcct);
}
} while (addTransactionDetails);
// Generate final report (this part should be in your existing code)
System.out.println("\n------------------------------|Final Report|-------------------------------");
for (int i = 0; i < accounts.size(); i++) {
Customer customer = customers.get(i); Customer customer = customers.get(i);
Account account = accounts.get(i); Account account = accounts.get(i);
System.out.println(customer + "\n"); System.out.println(customer);
System.out.println(account);
System.out.println("---------------------------------------------------------"
+ "----------------------------------------------------------------------------");
System.out.println("Account Details:");
System.out.println(account);
System.out.println("Transactions:");
for (String transaction : account.getTransactionHistory()) {
System.out.println(transaction);
}
System.out.println("------------------------------|End Report|-------------------------------");
} }
} }
} }

View File

@ -0,0 +1,42 @@
/* Phase III */
package bankAcctApp;
// Class representing checking accounts
public class CheckingAccount extends Account {
// Overridden method for withdrawals in checking accounts
@Override
public void withdrawal(double amount) {
double newBalance = getBalance() - amount - getSvcFee(); // Deduct amount and service fee
if (newBalance < 0) { // Check for overdraft
newBalance -= getOverDraftFee(); // Apply overdraft fee if balance is negative
}
setBalance(newBalance); // Update balance
}
// Overridden method for deposits in checking accounts
@Override
public void deposit(double amount) {
setBalance(getBalance() + amount - getSvcFee()); // Add amount and deduct service fee
}
// Overridden method for applying accrued interest in checking accounts
@Override
public double applyAccruedInterest(String transactionDate) {
double interest = 0.0;
if (getBalance() <= 0.0) { // Ensure balance is positive for interest accrual
System.out.println("This account has an insufficient balance for interest to apply.");
} else {
interest = getBalance() * (getInterestRate() / 100); // Calculate interest
setBalance(getBalance() + interest); // Add interest to the balance
logTransaction(transactionDate, "INT", interest); // Log the interest transaction
}
return interest;
}
// Implementation of balance() method from AccountInterface
@Override
public double balance() {
return getBalance(); // Return the current balance
}
}

View File

@ -1,4 +1,4 @@
/* Phase II */ /* Phase III */
package bankAcctApp; package bankAcctApp;
@ -101,7 +101,6 @@ public class Customer {
@Override @Override
public String toString() { public String toString() {
return String.format( return String.format(
"Customer Information:\n" +
"---------------------\n" + "---------------------\n" +
"ID: Last Name: First Name: SSN: Phone: Street: City: ST: ZIP: \n" + "ID: Last Name: First Name: SSN: Phone: Street: City: ST: ZIP: \n" +
"--- ---------- ----------- ---- ------ ------- ----- --- ---- \n" + "--- ---------- ----------- ---- ------ ------- ----- --- ---- \n" +

View File

@ -1,4 +1,4 @@
/* Phase II */ /* Phase III */
package bankAcctApp; package bankAcctApp;
@ -110,16 +110,15 @@ public class DataEntry {
Pattern patternDate = Pattern.compile("^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/(\\d{4})$"); Pattern patternDate = Pattern.compile("^(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01])/(\\d{4})$");
String date = ""; String date = "";
System.out.print(prompt); System.out.print(prompt);
do { while (date.isEmpty()) {
String input = in.nextLine(); String input = in.nextLine();
if (patternDate.matcher(input).matches()) { if (patternDate.matcher(input).matches()) {
return input; date = input;
return date;
} else { } else {
System.out.print("Invalid date. Please try again: "); System.out.print("Invalid date. Please try again: ");
in.next();
} }
in.nextLine(); }
} while (date.isEmpty());
return date; return date;
} }
} }

View File

@ -0,0 +1,41 @@
/* Phase III */
package bankAcctApp;
// Class representing savings accounts
public class SavingsAccount extends Account {
// Overridden method for withdrawals in savings accounts
@Override
public void withdrawal(double amount) {
if (getBalance() >= amount + getSvcFee()) { // Ensure sufficient balance
setBalance(getBalance() - amount - getSvcFee()); // Deduct amount and service fee
} else {
throw new IllegalArgumentException("Insufficient funds for withdrawal. Savings accounts cannot overdraft.");
}
}
// Overridden method for deposits in savings accounts
@Override
public void deposit(double amount) {
setBalance(getBalance() + amount - getSvcFee()); // Add amount and deduct service fee
}
// Overridden method for applying accrued interest in savings accounts
@Override
public double applyAccruedInterest(String transactionDate) {
if (getBalance() <= 0) { // Ensure balance is positive for interest accrual
throw new IllegalArgumentException("The account has an insufficient balance for interest to apply.");
}
double interest = getBalance() * (getInterestRate() / 100); // Calculate interest
setBalance(getBalance() + interest); // Add interest to the balance
logTransaction(transactionDate, "INT", interest); // Log the interest transaction
return interest;
}
// Implementation of balance() method from AccountInterface
@Override
public double balance() {
return getBalance(); // Return the current balance
}
}