public class Withdrawal extends Transaction { private int amount; // amount to withdraw private Keypad keypad; // references to keypad private CashDispenser cashDispenser; // references to cash dispenser // constant corresponding to menu option to cancel private final static int CANCELED = 6; // Withdrawal constructor public Withdrawal(int userAccountNumber, Screen atmScreen, BankDatabase atmBankDatabase, Keypad atmKeypad, CashDispenser atmCashDispenser){ // initializes superclass variables super(userAccountNumber, atmScreen, atmBankDatabase); // initializes references to keypad and cash dispenser keypad = atmKeypad; cashDispenser = atmCashDispenser; } // end Withdrawal constructor // perform transaction @Override public void execute(){ boolean cashDispensed = false; // cash was not dispensed yet double availableBalance; // amount available for withdrawal // get references to bank database and screen BankDatabase bankDatabase = getBankDatabase(); Screen screen = getScreen(); // loop until cash is dispensed or the user cancels do{ // obtain a chosen withdrawal amount from the user amount = displayMenuOfAmounts(); // check whether user choose a withdrawal amount or canceled if(amount != CANCELED){ // get available balance of account involved availableBalance = bankDatabase.getAvailableBalance(getAccountNumber()); // check whether the user has enough money in the account if(amount <= availableBalance){ // check whether the cash dispenser has enough money if(cashDispenser.isSufficientCashAvailable(amount)){ // update the account involved to reflect the withdrawal bankDatabase.debit(getAccountNumber(), amount); cashDispenser.dispenseCash(amount); // dispense cash cashDispensed = true; // cash was dispensed // instructs user to take cash screen.displayMessageLine("\nYour cash has been dispensed. Please take your cash now."); } // end if else{ // cash dispenser does not have enough cash screen.displayMessageLine("\nInsufficient cash available in the ATM."); screen.displayMessageLine("\nPlease choose a smaller amount."); } // end if } // end if else{ // not enough money available in user's account screen.displayMessageLine("\nInsufficient funds in your account."); screen.displayMessageLine("\nPlease choose a smaller amount."); } // end if } // end if else{ // user choose cancel menu option screen.displayMessageLine("\nCancelling transactions..."); return; // return to main menu because user canceled } // end if } while(!cashDispensed); } // end method execute // display a menu of withdrawal amounts and the options to cancel // return the chosen amount or 0 if the user chooses to cancel private int displayMenuOfAmounts(){ int userChoice = 0; // local variable to store return value Screen screen = getScreen(); // get screen references // array of amounts to correspond to menu numbers int[] amounts = {0, 20, 40, 60, 100, 200}; // loop while no valid choice has been made while(userChoice == 0){ // display the withdrawal menu screen.displayMessageLine("\nWithdrawal Menu : "); screen.displayMessageLine("1 - $20"); screen.displayMessageLine("2 - $40"); screen.displayMessageLine("3 - $60"); screen.displayMessageLine("4 - $100"); screen.displayMessageLine("5 - $200"); screen.displayMessageLine("6 - Cancel Transaction"); screen.displayMessage("\nChoose a withdrawal amount : "); int input = keypad.getInput(); // get user input through keypad // determine how to proceed based on the input value switch(input){ // if the user choose a withdrawal amount // i.e choose option 1, 2, 3, 4 or 5 // return the corresponding amount from amounts's array case 1 : case 2 : case 3 : case 4 : case 5 : userChoice = amounts[input]; // save user's choice break; case CANCELED : // the user choose to cancel userChoice = CANCELED; // save user's choice break; default : // the user did not enter value between 1-6 screen.displayMessageLine("\nInvalid selection."); screen.displayMessageLine("Try again."); } // end switch } // end while return userChoice; // return withdrawal amount or CANCELED } // end method displayMenuOfAmounts } // end class Withdrawal