# 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.new("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']]) return result end end