houdini/lib/update/update_payouts.rb

42 lines
1.7 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
module UpdatePayouts
def self.reverse_with_stripe(payout_id, status, failure_message)
ParamValidation.new({ payout_id: payout_id, status: status, failure_message: failure_message },
payout_id: { required: true, is_integer: true },
status: { included_in: %w[pending paid canceled failed], required: true },
failure_message: { not_blank: true, required: true })
payout = Payout.where('id = ?', payout_id).first
unless payout
raise ParamValidation::ValidationError.new("No payout with id number: #{payout_id} ", [{ key: :payout_id }])
end
payment_ids = payout.payments.select('payments.id').map(&:id).to_a
if payment_ids.count < 1
raise ArgumentError, 'No payments are available to reverse.'
end
now = Time.current
Psql.transaction do
# Retrieve all payments with available charges and undisbursed refunds
# Mark all the above payments as disbursed
UpdateCharges.reverse_disburse_all_with_payments(payment_ids)
# Mark all the above refunds as disbursed
UpdateRefunds.reverse_disburse_all_with_payments(payment_ids)
# Mark all disputes as lost_and_paid
# UpdateDisputes.disburse_all_with_payments(payment_ids)
# Get gross total, total fees, net total, and total count
# Create the payout record (whether it succeeded on Stripe or not)
payout.status = status
payout.failure_message = failure_message
payout.save!
# NonprofitMailer.delay.pending_payout_notification(payout['id'].to_i)
payout
end
end
end