Sylar Sylar - 7 months ago 31
Ruby Question

Sum of all amount if charge dates are the same in Stripe

I'm iterating over a stripe charge object and I want to sum up the

amount
total for each day.

# Returns an array object of charges for a customer
@customer_charges = Stripe::Charge.all(:customer => current_user.stripeid)


Views:

<% @customer_charges.map do |c| %>
On Monday, you were charged a total of <%= c.amount %>
<% end %>


Surely the above does nothing more than output lines of each charges but not the sum for the day. The difficulty I face is to sum up all charges for each day. Could someone point me in the right direction?

The output would be like:

"On Monday, you were charged a total of 200000"
"On Tueesday, you were charged a total of 500000"
etc...


Instead of:

On Monday, you were charged a total of 100000"
On Monday, you were charged a total of 100000"
etc...


My
view
looks messy with lines of
if statements
to compare dates and that does not look right.

Answer

You'll need to iterate through each charge object in Stripe, storing the amount and the parsed date for each charge:

# Fetch charges in batches of 100 records from Stripe API, yield each individual charge to a block.
def each_stripe_charge_for_customer(customer_id)
  starting_after = nil
  loop do
    charges = Stripe::Charge.all(customer: customer_id, limit: 100, starting_after: starting_after)
    break if charges.data.length == 0
    charges.each do |charge|
      yield charge
    end
    starting_after = charges.data.last.id
  end
end

charges_by_date = Hash.new(0)

# For each Stripe charge, store the date and amount into a hash.
each_stripe_charge_for_customer(current_user.stripeid) do |stripe_charge|
  # Parses Stripe's timestamp to a Ruby date object. `to_date` converts a DateTime object to a date (daily resolution).
  charge_date = Time.at(stripe_charge.created).to_date
  charge_amount = stripe_charge.amount

  charges_by_date[charge_date] += charge_amount
end