houdini/lib/insert/insert_disputes.rb
2019-08-02 19:07:29 +02:00

55 lines
2 KiB
Ruby

# frozen_string_literal: true
# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
require 'psql'
require 'qexpr'
require 'calculate/calculate_fees'
require 'active_support/core_ext'
module InsertDisputes
# A new dispute takes a charge id and dispute id and creates:
# A dispute row with the charge gross amount and the dispute id
# A payment row negative gross and net, just like a refund, but with kind "Dispute"
def self.create_record(stripe_charge_id, stripe_dispute_id)
# Find the existing charge
ch = Qx.select('*').from('charges').where('stripe_charge_id=$id', id: stripe_charge_id).ex.first
raise ArgumentError, 'Charge not found' if ch.nil?
result = {}
now = Time.current
result[:payment] = Psql.execute(
Qexpr.new.insert(:payments, [{
gross_amount: -ch['amount'],
fee_total: 0,
net_amount: -ch['amount'],
kind: 'Dispute',
refund_total: 0,
nonprofit_id: ch['nonprofit_id'],
supporter_id: ch['supporter_id'],
donation_id: ch['donation_id'],
date: now
}]).returning('*')
).first
# Create a dispute record
result[:dispute] = Psql.execute(
Qexpr.new.insert(:disputes, [{
gross_amount: ch['amount'],
status: :needs_response,
charge_id: ch['id'],
reason: :unrecognized,
payment_id: result[:payment]['id'],
stripe_dispute_id: stripe_dispute_id
}]).returning('*')
).first
# Prevent refunds from being able to happen on the payment
Qx.update(:payments).set(refund_total: ch['amount']).where(id: ch['payment_id']).ex
# Insert an activity record
InsertActivities.for_disputes([result[:payment]['id']])
result
end
end