com.greenpepper.samples.application.bank.BankAccount Maven / Gradle / Ivy
package com.greenpepper.samples.application.bank;
/**
* Abstract BankAccount class.
*
* @author oaouattara
* @version $Id: $Id
*/
public abstract class BankAccount
{
private AccountType type;
private Money balance = Money.ZERO;
private String number;
private Owner owner;
public boolean frozen;
/**
* Constructor for BankAccount.
*
* @param accountType a {@link com.greenpepper.samples.application.bank.AccountType} object.
* @param number a {@link java.lang.String} object.
* @param owner a {@link com.greenpepper.samples.application.bank.Owner} object.
*/
public BankAccount(AccountType accountType, String number, Owner owner)
{
this.number = number;
this.type = accountType;
this.owner = owner;
}
/**
* checkFunds.
*
* @param amount a {@link com.greenpepper.samples.application.bank.Money} object.
* @throws java.lang.Exception if any.
*/
public abstract void checkFunds(Money amount) throws Exception;
/**
* withdraw.
*
* @param amount a {@link com.greenpepper.samples.application.bank.Money} object.
* @param withdrawType a {@link com.greenpepper.samples.application.bank.WithdrawType} object.
* @return a {@link com.greenpepper.samples.application.bank.Money} object.
* @throws java.lang.Exception if any.
*/
public Money withdraw(Money amount, WithdrawType withdrawType) throws Exception {
Money limit = type.limitFor(withdrawType);
if (!AccountType.isNoLimit(limit) && amount.strictlyGreaterThan(limit))
{
throw new Exception("Limit overpassed");
}
Money fees = type.feesFor(withdrawType);
return withdraw(amount.plus(fees));
}
/**
* withdraw.
*
* @param amount a {@link com.greenpepper.samples.application.bank.Money} object.
* @return a {@link com.greenpepper.samples.application.bank.Money} object.
* @throws java.lang.Exception if any.
*/
public Money withdraw(Money amount) throws Exception
{
checkNotFrozen();
checkFunds(amount);
balance = balance.minus(amount);
return balance;
}
private void checkNotFrozen() throws Exception
{
if (frozen) throw new Exception("Acccount frozen!");
}
/**
* Getter for the field number
.
*
* @return a {@link java.lang.String} object.
*/
public String getNumber()
{
return number;
}
/**
* deposit.
*
* @param amount a {@link com.greenpepper.samples.application.bank.Money} object.
* @return a {@link com.greenpepper.samples.application.bank.Money} object.
*/
public Money deposit(Money amount)
{
balance = balance.plus(amount);
return balance;
}
/**
* Getter for the field balance
.
*
* @return a {@link com.greenpepper.samples.application.bank.Money} object.
*/
public Money getBalance()
{
return balance;
}
/**
* isFrozen.
*
* @return a boolean.
*/
public boolean isFrozen()
{
return frozen;
}
/**
* freeze.
*/
public void freeze()
{
frozen = true;
}
/**
* Getter for the field type
.
*
* @return a {@link com.greenpepper.samples.application.bank.AccountType} object.
*/
public AccountType getType()
{
return type;
}
/**
* Getter for the field owner
.
*
* @return a {@link com.greenpepper.samples.application.bank.Owner} object.
*/
public Owner getOwner()
{
return owner;
}
/**
* getOwnerName.
*
* @return a {@link java.lang.String} object.
*/
public String getOwnerName()
{
return owner.getFullName();
}
}