Skip to content
30 changes: 14 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,24 +73,23 @@ Create an `Account` class which should have the following functionality:
**Account ID** - (Fixnum) a unique identifier corresponding to an account
**Owner ID** - (Fixnum) a unique identifier corresponding to an owner

<!--
## Wave 3
Create a `SavingsAccount` class which should inherit behavior from the `Account` class. It should include updated logic with the following functionality:
- An updated `initialize` method:
- The initial balance cannot be less than $10. If it is, this will `raise` an `ArgumentError`
- An updated `withdraw` method:
Create a `SavingsAccount` class which should inherit behavior from the `Account` class. It should include the following updated functionality:
- The initial balance cannot be less than $10. If it is, this will `raise` an `ArgumentError`
- Updated withdrawal functionality:
- Each withdrawal 'transaction' incurs a fee of $2 that is taken out of the balance.
- Does not allow the account to go below the $10 minimum balance - Will output a warning message and return the original un-modified balance

It should include the following new methods:
It should include the following new method:
- `#add_interest(rate)`: Calculate the interest on the balance and add the interest to the balance. Return the **interest** that was calculated and added to the balance (not the updated balance).
- Input rate is assumed to be a percentage (i.e. 0.25).
- The formula for calculating interest is `balance * rate/100`
- Example: If the interest rate is 0.25% and the balance is $10,000, then the interest that is returned is $25 and the new balance becomes $10,025.

Create a `CheckingAccount` class which should inherit behavior from the `Account` class. It should include updated logic with the following functionality:
- `#withdraw(amount)`: The input amount gets taken out of the account as result of an ATM transaction. Each withdrawal 'transaction' incurs a fee of $1 that is taken out of the balance. Returns the updated account balance.
- Does not allow the account to go negative. Will output a warning message and return the original un-modified balance.
Create a `CheckingAccount` class which should inherit behavior from the `Account` class. It should include the following updated functionality:
- Updated withdrawal functionality:
- Each withdrawal 'transaction' incurs a fee of $1 that is taken out of the balance. Returns the updated account balance.
- Does not allow the account to go negative. Will output a warning message and return the original un-modified balance.
- `#withdraw_using_check(amount)`: The input amount gets taken out of the account as a result of a check withdrawal. Returns the updated account balance.
- Allows the account to go into overdraft up to -$10 but not any lower
- The user is allowed three free check uses in one month, but any subsequent use adds a $2 transaction fee
Expand All @@ -101,16 +100,15 @@ Create a `CheckingAccount` class which should inherit behavior from the `Account

## Optional:

Create a `MoneyMarketAccount` class with a minimum of 6 specs. The class should inherit behavior from the `Account` class.
Create a `MoneyMarketAccount` class which should inherit behavior from the `Account` class.
- A maximum of 6 transactions (deposits or withdrawals) are allowed per month on this account type
- `self.new(id, initial_balance)`: creates a new instance with the instance variable `id` and 'initial_balance' assigned
- The initial balance cannot be less than $10,000 - this will `raise` an `ArgumentError`
- `#withdraw(amount)`: The input amount gets taken out of the account as result of an ATM transaction. Returns the updated account balance.
- The initial balance cannot be less than $10,000 - this will `raise` an `ArgumentError`
- Updated withdrawal logic:
- If a withdrawal causes the balance to go below $10,000, a fee of $100 is imposed and no more transactions are allowed until the balance is increased using a deposit transaction.
- Each transaction will be counted against the maximum number of transactions
- `#deposit(amount)`. Returns the updated account balance.
- Updated deposit logic:
- Each transaction will be counted against the maximum number of transactions
- Exception to the above: A deposit performed to reach or exceed the minimum balance of $10,000 is not counted as part of the 6 transactions.
- `#add_interest(rate)`: Calculate the interest on the balance and add the interest to the balance. Return the interest that was calculated and added to the balance (not the updated balance). Note** This is the same as the `SavingsAccount` interest.
- `#add_interest(rate)`: Calculate the interest on the balance and add the interest to the balance. Return the interest that was calculated and added to the balance (not the updated balance).
- Note** This is the same as the `SavingsAccount` interest.
- `#reset_transactions`: Resets the number of transactions to zero
-->
12 changes: 8 additions & 4 deletions bank.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ module Bank
class Account
attr_reader :balance, :owner, :account_id, :owner_id

MIN_BALANCE = 0

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like that you used constants for this purpose

WITHDRAWAL_FEE = 0

def initialize (id, initial_balance, open_date)
@account_id = id
raise ArgumentError.new("You can't start an account with a negative balance.") if initial_balance <= 0
raise ArgumentError.new("That's not enough money to start your account.") if initial_balance <= self.class::MIN_BALANCE

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice job using the class info to retrieve the relevant constant

@balance = initial_balance # in cents
open_date = open_date.to_s
@open_date = DateTime.strptime(open_date, "%Y-%m-%d %H:%M:%S %z")
end

Expand Down Expand Up @@ -44,10 +48,10 @@ def withdraw(amount)
new_balance = @balance - amount

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On line 36 above it seems like you should re-use the find method rather than re-writing the same logic.

if amount < 0
puts "You can't withdraw a negative amount."
elsif new_balance < 0
puts "You don't have that much money. You can withdraw up to #{@balance} dollars."
elsif new_balance < self.class::MIN_BALANCE
puts "You don't have that much money. You can withdraw up to #{@balance - self.class::MIN_BALANCE - self.class::WITHDRAWAL_FEE} cents."
else
@balance = new_balance
@balance = new_balance - self.class::WITHDRAWAL_FEE
return @balance
end
end
Expand Down
33 changes: 33 additions & 0 deletions checking_account.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
module Bank
class CheckingAccount < Account
attr_reader :used_checks, :balance, :account_id, :owner_id

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need all of these readers in this class since some of them are already in the Account class


MIN_BALANCE = 0
WITHDRAWAL_FEE= 100

def initialize(id, initial_balance, open_date)
super
@used_checks = 0
end

# The input amount gets taken out of the account as a result of a check withdrawal. Returns the updated account balance.
# Allows the account to go into overdraft up to -$10 but not any lower
# The user is allowed three free check uses in one month, but any subsequent use adds a $2 transaction fee
#reset_checks: Resets the number of checks used to zero

def withdraw_using_check(amount)
if @used_checks >= 3
@balance = @balance - 200
end
new_balance = @balance - amount
raise ArgumentError.new("You don't have enough money for that.") if new_balance <= @balance - 1000
@used_checks += 1
@balance = new_balance
end

def reset_checks
@used_checks = 0
end

end
end
53 changes: 53 additions & 0 deletions money_market_account.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
module Bank

class MoneyMarketAccount < Account
attr_reader :balance, :owner, :account_id, :owner_id, :good_standing, :max_trans

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment re: Account class already having some of these


MIN_BALANCE = 1000000

def initialize(id, initial_balance, open_date)
super
@max_trans = 0
@good_standing = true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like that you're using this boolean to track this concept

end

def withdraw(amount)
new_balance = @balance - amount
if @max_trans >= 6 || @good_standing == false
puts "No more transactions available."
elsif amount < 0
puts "You can't withdraw a negative amount."
elsif new_balance < self.class::MIN_BALANCE
@balance = @balance - amount - 10000
@good_standing = false
puts "Next time you need to deposit enough money to bring your account up to #{self.class::MIN_BALANCE}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice use of this constant!

@max_trans += 1
elsif new_balance < 0
puts "That will make your balance negative. Please try a smaller amount."
return @balance
else
@max_trans += 1
@balance = new_balance
return @balance
end
end

def deposit(amount)
if @balance < 1000000
super(amount)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since both of these conditionals are doing super(amount) I think you could abstract this out of your conditional and then simplify to do only the @max_trans += 1 operation

else
super(amount)
@max_trans += 1
end
if @balance > 1000000
@good_standing == true
end
end

def reset_transactions
@max_trans
end

end

end
4 changes: 4 additions & 0 deletions run_bank.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
require "./bank.rb"
require "./savings_account.rb"
require "./checking_account.rb"
require "./money_market_account.rb"
22 changes: 22 additions & 0 deletions savings_account.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

module Bank

class SavingsAccount < Account
attr_reader :balance, :owner, :account_id, :owner_id

MIN_BALANCE = 1000
WITHDRAWAL_FEE = 200

def add_interest(rate)
if rate < 0
puts "Please select a positive interest rate."
else
@interest = @balance * rate/100
@balance += @interest
return @interest
end
end

end

end