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