Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wave 3 Program #63

Open
wants to merge 9 commits into
base: rrs/master
Choose a base branch
from
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

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

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

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

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

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

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}"

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)

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