//
/* * Example ATM simulation - file transaction.h * * This file declares the classes that represent the various kinds of * transactions that the ATM can perform. The class Transaction serves as * an abstract base class for the other classes. Each concrete class * basically serves to implement the corresponding use case. * * Copyright (c) 1996 - Russell C. Bjork * */ //
class Transaction
  {
    /*
     * PURPOSE: Serve as base class for specific types of transactions
     */
    public:
	Transaction(Session & session);
	// This value is returned by the keyboard to specify the particular
	// type of transaction the customer chose
	enum TransactionType
	  { WITHDRAWL, DEPOSIT, TRANSFER, INQUIRY };
	// Create a transaction object of a specified type, acting on behalf
	// of the specified session
	static Transaction * makeTransaction(TransactionType type,
					     Session & session);
	// Perform a particular transaction use case.  The card number and
	// PIN are obtained from the session; other information is obtained
	// from the customer
	void doTransactionUseCase();
	// Individual steps in carrying out a transaction.  Each must be
	// implemented individually for each type of transaction.  If
	// either of the first two steps returns in failure, the transaction 
	// is aborted.
	virtual bool getTransactionSpecificsFromCustomer() = 0;
	virtual Bank::ApprovalCode sendToBank() = 0;
	virtual void finishApprovedTransaction() = 0;
    protected:
	Session &	_session;
	// Every transaction is assigned a unique serial number that is used
	// to identify it in communications with the bank and on the receipt.
	int		_serialNumber;
	// Every transaction gets both the updated balance and available
	// balance for printing on the receipt.
	Money		_newBalance,
			_availableBalance;
    private:
	static int	_lastSerialNumberAssigned;
  };
//
class WithdrawlTransaction : public Transaction
  {
    public:
	WithdrawlTransaction(Session & session);
	bool getTransactionSpecificsFromCustomer();
	Bank::ApprovalCode sendToBank();
	void finishApprovedTransaction();
    private:
	Bank::AccountType	_fromAccount;
	Money			_amount;
  };
//
class DepositTransaction : public Transaction
  {
    public:
	DepositTransaction(Session & session);
	bool getTransactionSpecificsFromCustomer();
	Bank::ApprovalCode sendToBank();
	void finishApprovedTransaction();
    private:
	Bank::AccountType	_toAccount;
	Money			_amount;
  };
//
class TransferTransaction : public Transaction
  {
    public:
	TransferTransaction(Session & session);
	bool getTransactionSpecificsFromCustomer();
	Bank::ApprovalCode sendToBank();
	void finishApprovedTransaction();
    private:
	Bank::AccountType	_fromAccount,
				_toAccount;
	Money			_amount;
  };
//
class InquiryTransaction : public Transaction
  {
    public:
	InquiryTransaction(Session & session);
	bool getTransactionSpecificsFromCustomer();
	Bank::ApprovalCode sendToBank();
	void finishApprovedTransaction();
    private:
	Bank::AccountType	_fromAccount;
  };
//