//ATM Simulation interface - the Bank

ATM Simulation interface - the Bank


/*
 * Example ATM simulation - file bank.h
 *
 * This file declares the class that manages communication with the bank
 *
 * Copyright (c) 1996 - Russell C. Bjork
 *
 */

// One important data type that is used in banking is Money.  We will
// represent money amounts as an unsigned integer (the number of cents).

typedef unsigned long Money;

//

Interface for class Bank

class Bank
  {
    /* 
     *PURPOSE: Manage dialogue between the ATM and the bank
     */

    public:

	Bank();

	// The different types of account that can be linked to a card

	enum AccountType 
	  { CHECKING, SAVINGS, MONEY_MARKET };

	// When the bank is asked to approve a transaction, it returns one
	// of these.  Any value other than APPROVED denotes rejection

	enum ApprovalCode
	  { APPROVED,
	    UNKNOWN_CARD, INVALID_PIN, NO_SUCH_ACCOUNT,
	    CANT_WITHDRAW_FROM_ACCOUNT, INSUFFICIENT_AVAILABLE_BALANCE,
	    DAILY_WITHDRAWL_LIMIT_EXCEEDED
	  };

	// Withdrawls and deposits are done in two stages - first the 
	// transaction is approved, then the bank is notified as to whether
	// or not if was physically completed

	ApprovalCode initiateWithdrawl(int cardNumber,
				      int PIN,
				      int ATMnumber,
				      int serialNumber,
				      AccountType from,
				      Money amount,
				      Money & newBalance,
				      Money & availableBalance);

	void	      finishWithdrawl(int ATMnumber, 
				      int serialNumber,
				      bool succeeded);

	ApprovalCode  initiateDeposit(int cardNumber,
				      int PIN,
				      int ATMnumber,
				      int serialNumber,
				      AccountType to,
				      Money amount,
				      Money & newBalance,
				      Money & availableBalance);

	void		finishDeposit(int ATMnumber, 
				      int serialNumber,
				      bool succeeded);

	// Each of these approves and does a transaction.  No notice of
	// physical completion is needed.

	ApprovalCode       doTransfer(int cardNumber,
				      int PIN,
				      int ATMnumber,
				      int serialNumber,
				      AccountType from,
				      AccountType to,
				      Money amount,
				      Money & newBalance,
				      Money & availableBalance);

	ApprovalCode        doInquiry(int cardNumber,
				      int PIN,
				      int ATMnumber,
				      int serialNumber,
				      AccountType from,
				      Money & newBalance,
				      Money & availableBalance);

	const char * accountName(AccountType type) const;

	const char * rejectionDescription(ApprovalCode code) const;
  };

extern Bank theBank;

//