//
/* * 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; //
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;
//