//Diego Zamudio
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Account> accounts = new ArrayList<>();
// Infinite loop to display menu
while (true) {
System.out.println("Main Menu:");
System.out.println("1.) Create Account");
System.out.println("2.) Log In");
System.out.println("3.) Exit");
int choice = Transactions.getInput(scanner, 3);
// Switch case for user choices
switch (choice) {
case 1:
createAccount(scanner, accounts);
break;
case 2:
login(scanner, accounts);
break;
case 3:
System.out.println("Thank you for choosing our bank, have a nice day!");
System.exit(0);
break;
}
}
}
private static void createAccount(Scanner scanner, List<Account> accounts) {
// Create Account
System.out.print("Enter username: ");
String username = scanner.nextLine(); // USERNAME
boolean validPassword = false;
String password = ""; // PASSWORD
while (!validPassword) {
System.out.println("Password must be at least 12 characters long, include one uppercase letter, two numbers, and two special characters (!@#$%^&*()).");
System.out.print("Enter password: ");
password = scanner.nextLine();
validPassword = isValidPassword(password);
if (!validPassword) {
System.out.println("ERROR: Password does not meet the requirements. Please try again.");
}
}
Account newAccount = new Account(username); // NEW ACCOUNT
User user = new User(username, password); // ASSIGN CREDENTIALS
newAccount.setUser(user);
accounts.add(newAccount);
System.out.println("Account created successfully!");
System.out.println("Account Number: " + newAccount.getAccountNumber()); // ASSIGN ACCOUNT NUMBER
System.out.println("Routing Number: " + newAccount.getRoutingNumber()); // ASSIGN ROUTING NUMBER
}
private static void login(Scanner scanner, List<Account> accounts) {
System.out.print("Enter username: ");
String username = scanner.nextLine();
System.out.print("Enter password: ");
String password = scanner.nextLine();
Account account = null;
// Check accounts list
for (Account acc : accounts) {
// FIND MATCHING ACCOUNTS AND VERIFY CREDENTIALS
if (acc.getUser() != null && acc.getUser().getUsername().equals(username) && acc.getUser().isValidCredentials(username, password)) {
account = acc;
break;
}
}
// Account not found
if (account != null) {
loggedInMenu(scanner, account, accounts);
} else {
System.out.println("ERROR: Login failed. Username or password incorrect.");
}
}
// LOGGED IN MENU METHOD
public static void loggedInMenu(Scanner scanner, Account account, List<Account> accounts) {
while (true) {
// LOGGED IN MENU
System.out.println("\nLogged In Menu:");
System.out.println("1.) Deposit Money");
System.out.println("2.) Withdraw Money");
System.out.println("3.) Check Balance");
System.out.println("4.) Wire Transfer");
System.out.println("5.) Log Out");
int choice = Transactions.getInput(scanner, 5);
// Switch case for user choices
switch (choice) {
case 1:
Transactions.depositMoney(scanner, account);
break;
case 2:
Transactions.withdrawMoney(scanner, account);
break;
case 3:
System.out.println("Your current balance is: " + account.checkBalance());
break;
case 4:
Transactions.wireTransfer(scanner, accounts, account);
break;
case 5:
// LOG OUT
return;
}
}
}
// PASSWORD VERIFICATION METHOD
public static boolean isValidPassword(String password) {
return password.length() >= 12 && // 12 CHARACTERS LONG
password.matches(".*[A-Z].*") && // ONE UPPER CASE LETTER
password.matches(".*\\d.*\\d.*") && // TWO NUMBERS
password.matches(".*[!@#$%^&*()].*[!@#$%^&*()].*"); // TWO SPECIAL CHARACTERS
}
}
//Project 2 CSC3020
//Diego Zamudio
//hh7246
public class Account {
private static int accountCounter = 0;
private int accountNumber;
private static int routingCounter = 0;
private int routingNumber;
private String accountHolderName;
private User currentUser;
private double balance;
//Create new account
public Account(String accountHolderName) {
this.accountHolderName = accountHolderName; //NAME
this.accountNumber = ++accountCounter; //ACCOUNT NUMBER
this.routingNumber = ++routingCounter; //ROUTING NUMBER
this.balance = 0.0;//BALANCE
}
public int getAccountNumber() {
return accountNumber;
}
public int getRoutingNumber() {
return routingNumber;
}
public User getUser() {
return currentUser;
}
public void setUser(User user) {
this.currentUser = user;
}
//DEPOSIT METHOD
public void deposit(double amount) {
balance += amount;
System.out.println("Deposit of " + amount + " successful.");
}
//WITHDRAW METHOD
public void withdraw(double amount) {
//Amount available
if (amount <= balance) {
balance -= amount;
System.out.println("Withdrawal of " + amount + " successful.");
}
//Amount unavailable
else {
System.out.println("Insufficient funds. Withdrawal failed.");
}
}
//BALANCE METHOD
public double checkBalance() {
return balance;
}
}
//Project 2 CSC3020
//Diego Zamudio
//hh7246
import java.util.List;
import java.util.Scanner;
public class Transactions {
// DEPOSIT METHOD
public static void depositMoney(Scanner scanner, Account account) {
System.out.println("Choose deposit method: 1) Direct Deposit 2) Cash Deposit");
int choice = getInput(scanner, 2);
String prompt = choice == 2 ? "Cash amount: " : "Amount: ";
double amount = getValidAmount(scanner, prompt);
account.deposit(amount);
System.out.println("Deposit successful.");
}
// WITHDRAW METHOD
public static void withdrawMoney(Scanner scanner, Account account) {
System.out.println("Choose withdrawal method: 1) Direct Withdraw 2) Cash Withdraw");
int choice = getInput(scanner, 2);
String prompt = choice == 2 ? "Cash amount: " : "Amount: ";
double amount = getValidAmount(scanner, prompt);
if (account.checkBalance() >= amount) {
account.withdraw(amount);
System.out.println("Withdrawal successful.");
}
else {
System.out.println("ERROR: Insufficient funds. Withdrawal failed.");
}
}
// WIRE TRANSFER METHOD
public static void wireTransfer(Scanner scanner, List<Account> accounts, Account loggedInAccount) {
System.out.println("Wire Transfer Menu:");
System.out.println("1.) Direct Deposit");
System.out.println("2.) Direct Withdraw");
int choice = getInput(scanner, 2);
System.out.print("Enter the target account number: ");
int targetAccNum = scanner.nextInt(); // Get the target account number
scanner.nextLine(); // Consume the newline left after the integer input
System.out.print("Enter the target routing number: ");
int targetRoutingNum = scanner.nextInt(); // Get the target routing number
scanner.nextLine(); // Consume the newline left after the integer input
Account targetAccount = findAccountByNumberAndRouting(targetAccNum, targetRoutingNum, accounts);
if (targetAccount == null) {
System.out.println("ERROR: Target account not found.");
return;
}
// Amount Verification
double amount = getValidAmount(scanner, "Please provide amount: ");
if (choice == 1) {
// DIRECT DEPOSIT
if (loggedInAccount.checkBalance() >= amount) {
loggedInAccount.withdraw(amount);
targetAccount.deposit(amount);
System.out.println("Direct deposit successful.");
}
else {
System.out.println("ERROR: Insufficient funds for the transfer.");
}
}
else if (choice == 2) {
// DIRECT WITHDRAW
if (targetAccount.checkBalance() >= amount) {
targetAccount.withdraw(amount);
loggedInAccount.deposit(amount);
System.out.println("Direct withdraw successful.");
}
else {
System.out.println("ERROR: Insufficient funds in the target account.");
}
}
}
// AMOUNT VERIFICATION METHOD
private static double getValidAmount(Scanner scanner, String message) {
double amount = 0.0;
boolean valid = false;
while (!valid) {
System.out.print(message);
if (scanner.hasNextDouble()) {
amount = scanner.nextDouble();
if (amount > 0) {
valid = true;
}
else {
System.out.println("ERROR: Amount must be greater than zero. Please try again.");
}
}
else {
System.out.println("ERROR: Invalid input. Please enter a valid amount.");
scanner.next();
}
}
scanner.nextLine();
return amount;
}
// INPUT VERIFICATION METHOD
public static int getInput(Scanner scanner, int maxOption) {
int choice = 0;
boolean validInput = false;
while (!validInput) {
System.out.print("Enter number to proceed: ");
if (scanner.hasNextInt()) {
choice = scanner.nextInt();
if (choice >= 1 && choice <= maxOption) {
validInput = true;
}
else {
System.out.println("ERROR: Invalid choice. Please select a valid option.");
}
}
else {
System.out.println("ERROR: Invalid input. Please enter a number.");
scanner.next();
}
}
scanner.nextLine();
return choice;
}
// ACCOUNT NUMBER VERIFICATION METHOD
private static Account findAccountByNumber(int accountNumber, List<Account> accounts) {
for (Account acc : accounts) {
if (acc.getAccountNumber() == accountNumber) {
return acc;
}
}
return null;
}
// ACCOUNT AND ROUTING NUMBER VERIFICATION METHOD
private static Account findAccountByNumberAndRouting(int accountNumber, int routingNumber, List<Account> accounts) {
for (Account acc : accounts) {
if (acc.getAccountNumber() == accountNumber && acc.getRoutingNumber() == routingNumber) {
return acc;
}
}
return null;
}
}
//Project 2 CSC3020
//Diego Zamudio
//hh7246
public class User {
private String username;
private String password;
private Account account;
//Create new user
public User(String username, String password) {
this.username = username; // Initialize username
this.password = password; // Initialize password
}
public String getUsername() {
return username;
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
//CREDENTIAL CHECKER
public boolean isValidCredentials(String username, String password) {
return this.username.equals(username) && this.password.equals(password);
}
//PASSWORD VALIDATION
public boolean isValidPassword(String password) {
return password.length() >= 12 &&
password.matches(".*[A-Z].*") &&
password.matches(".*\\d.*\\d.*") &&
password.matches(".*[!@#$%^&*()].*[!@#$%^&*()].*");
}
}