//
/* * Example ATM simulation - file transaction.cc * * This file implements the classes that represent the various kinds of * transactions that the ATM can perform, declared in transaction.h * * Copyright (c) 1996 - Russell C. Bjork * */ #include#include "sysdep.h" #include "bank.h" #include "session.h" #include "transaction.h" #include "atm.h" //
Transaction::Transaction(Session & session)
: _session(session),
_serialNumber(++ _lastSerialNumberAssigned)
{ }
//int Transaction::_lastSerialNumberAssigned = 0; //
Transaction * Transaction::makeTransaction(TransactionType type,
Session & session)
{
switch (type)
{
case WITHDRAWL: return new WithdrawlTransaction(session);
case DEPOSIT: return new DepositTransaction(session);
case TRANSFER: return new TransferTransaction(session);
case INQUIRY: return new InquiryTransaction(session);
}
}
//
void Transaction::doTransactionUseCase()
{
if (! getTransactionSpecificsFromCustomer())
return;
Bank::ApprovalCode code = sendToBank();
if (code == Bank::INVALID_PIN)
code = _session.doInvalidPINExtension();
if (code == Bank::APPROVED)
finishApprovedTransaction();
else if (code != Bank::INVALID_PIN)
theATM.reportRejection(theBank.rejectionDescription(code));
}
//
// getTransactionSpecificsFromCustomer() is abstract for class Transaction::
bool WithdrawlTransaction::getTransactionSpecificsFromCustomer()
{
_fromAccount = theATM.getAccountChoice("withdraw from");
_amount = theATM.getWithdrawlAmountChoice();
return theATM.checkIfCashAvailable(_amount);
}
bool DepositTransaction::getTransactionSpecificsFromCustomer()
{
_toAccount = theATM.getAccountChoice("deposit to");
_amount = theATM.getAmountEntry();
return true;
}
bool TransferTransaction::getTransactionSpecificsFromCustomer()
{
_fromAccount = theATM.getAccountChoice("transfer from");
_toAccount = theATM.getAccountChoice("transfer to");
_amount = theATM.getAmountEntry();
return true;
}
bool InquiryTransaction::getTransactionSpecificsFromCustomer()
{
_fromAccount = theATM.getAccountChoice("balance for");
return true;
}
//
// sendToBank() is abstract for class Transaction::
Bank::ApprovalCode WithdrawlTransaction::sendToBank()
{
return theBank.initiateWithdrawl(_session.cardNumber(),
_session.PIN(),
theATM.number(),
_serialNumber,
_fromAccount,
_amount,
_newBalance,
_availableBalance);
}
Bank::ApprovalCode DepositTransaction::sendToBank()
{
return theBank.initiateDeposit(_session.cardNumber(),
_session.PIN(),
theATM.number(),
_serialNumber,
_toAccount,
_amount,
_newBalance,
_availableBalance);
}
Bank::ApprovalCode TransferTransaction::sendToBank()
{
return theBank.doTransfer(_session.cardNumber(),
_session.PIN(),
theATM.number(),
_serialNumber,
_fromAccount,
_toAccount,
_amount,
_newBalance,
_availableBalance);
}
Bank::ApprovalCode InquiryTransaction::sendToBank()
{
return theBank.doInquiry(_session.cardNumber(),
_session.PIN(),
theATM.number(),
_serialNumber,
_fromAccount,
_newBalance,
_availableBalance);
}
//
// finishApprovedTransaction() is abstract in class Transaction::
void WithdrawlTransaction::finishApprovedTransaction()
{
theATM.dispenseCash(_amount);
theBank.finishWithdrawl(theATM.number(), _serialNumber, true);
char description[26];
sprintf(description, "WITHDRAWL FROM %s",theBank.accountName(_fromAccount));
theATM.issueReceipt(_session.cardNumber(),
_serialNumber,
description,
_amount,
_newBalance,
_availableBalance);
}
void DepositTransaction::finishApprovedTransaction()
{
bool envelopeAccepted = theATM.acceptEnvelope();
if (envelopeAccepted)
{
char description[26];
sprintf(description, "DEPOSIT TO %s", theBank.accountName(_toAccount));
theATM.issueReceipt(_session.cardNumber(),
_serialNumber,
description,
_amount,
_newBalance,
_availableBalance);
}
theBank.finishDeposit(theATM.number(), _serialNumber, envelopeAccepted);
}
void TransferTransaction::finishApprovedTransaction()
{
char description[26];
sprintf(description,"TRANSFER %s TO %s",theBank.accountName(_fromAccount),
theBank.accountName(_toAccount));
theATM.issueReceipt(_session.cardNumber(),
_serialNumber,
description,
_amount,
_newBalance,
_availableBalance);
}
void InquiryTransaction::finishApprovedTransaction()
{
char description[26];
sprintf(description, "INQUIRY FROM %s", theBank.accountName(_fromAccount));
theATM.issueReceipt(_session.cardNumber(),
_serialNumber,
description,
0, // will cause this line to be omitted
_newBalance,
_availableBalance);
}
//
WithdrawlTransaction::WithdrawlTransaction(Session & session)
: Transaction(session)
{ }
//
DepositTransaction::DepositTransaction(Session & session)
: Transaction(session)
{ }
//
TransferTransaction::TransferTransaction(Session & session)
: Transaction(session)
{ }
//
InquiryTransaction::InquiryTransaction(Session & session)
: Transaction(session)
{ }
//