Created
August 11, 2020 21:57
-
-
Save petercowan/d80c0ac9c3cd9679f77ffe67fde5ef91 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'date' | |
points_ledger = [ | |
{ amount: 5, expires_at: DateTime.new(2020,8,1)}, | |
{ amount: 10, expires_at: DateTime.new(2020,8,2)}, | |
{ amount: 2, expires_at: DateTime.new(2020,8,3)}, | |
] | |
def add_points(ledger, amount, exp_date) | |
puts "Adding #{amount} points" | |
ledger.push({ amount: amount, expires_at: exp_date}) | |
end | |
def debit_points(ledger, amount) | |
puts "Debiting #{amount} points" | |
ledger.push({ amount: -amount, exp_date: nil}) | |
end | |
def ledger_balance(ledger) | |
ledger.map { |item| item[:amount] }.sum | |
end | |
def expired_credits_amount(ledger, exp_date) | |
ledger.filter { |item| item[:amount] > 0 && item[:expires_at] < exp_date }.map { |item| item[:amount] }.sum | |
end | |
def expire_points(ledger, exp_date) | |
balance = ledger_balance(ledger) | |
expired_credits = expired_credits_amount(ledger, exp_date) | |
debit_amount = [balance, expired_credits].min | |
puts | |
puts "Expires At: #{exp_date}" | |
puts "Ledger Balance: #{balance}" | |
puts "Expired Credits: #{expired_credits}" | |
puts "Debiting #{debit_amount}" | |
if debit_amount > 0 | |
debit_points(ledger, debit_amount) | |
end | |
end | |
def display_balance(ledger) | |
puts | |
puts "Ledger Balance: #{ledger_balance(ledger)}" | |
end | |
display_balance(points_ledger) | |
debit_points(points_ledger, 7) | |
display_balance(points_ledger) | |
add_points(points_ledger, 8, DateTime.new(2020,8,5)) | |
display_balance(points_ledger) | |
expire_points(points_ledger, DateTime.new(2020,8,2)) | |
display_balance(points_ledger) | |
debit_points(points_ledger, 4) | |
display_balance(points_ledger) | |
debit_points(points_ledger, 3) | |
display_balance(points_ledger) | |
expire_points(points_ledger, DateTime.new(2020,8,5)) | |
display_balance(points_ledger) | |
add_points(points_ledger, 5, DateTime.new(2020,8,8)) | |
display_balance(points_ledger) | |
add_points(points_ledger, 2, DateTime.new(2020,8,9)) | |
display_balance(points_ledger) | |
expire_points(points_ledger, DateTime.new(2020,8,9)) | |
display_balance(points_ledger) | |
add_points(points_ledger, 12, DateTime.new(2020,8,10)) | |
display_balance(points_ledger) | |
debit_points(points_ledger, 8) | |
display_balance(points_ledger) | |
add_points(points_ledger, 5, DateTime.new(2020,8,12)) | |
display_balance(points_ledger) | |
add_points(points_ledger, 5, DateTime.new(2020,8,13)) | |
display_balance(points_ledger) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment