houdini/lib/update/update_nonprofit.rb
Bradley M. Kuhn 6772312ea7 Relicense all .rb files under new project license.
The primary license of the project is changing to:
  AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later

with some specific files to be licensed under the one of two licenses:
   CC0-1.0
   LGPL-3.0-or-later

This commit is one of the many steps to relicense the entire codebase.

Documentation granting permission for this relicensing (from all past
contributors who hold copyrights) is on file with Software Freedom
Conservancy, Inc.
2018-03-25 15:10:40 -04:00

78 lines
3.5 KiB
Ruby

# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
require 'query/query_payments'
require 'fetch/stripe/fetch_stripe_account'
module UpdateNonprofit
# See the stripe docs for reference: => https://stripe.com/docs/connect/identity-verification
def self.verify_identity(np_id, legal_entity, tos=nil)
np = Qx.select("*").from(:nonprofits).where(id: np_id).execute.first
legal_entity[:address][:country] = 'US' if legal_entity[:address]
acct = FetchStripeAccount.with_account_id(np['stripe_account_id'])
acct.legal_entity.phone_number = acct.support_phone = legal_entity[:phone_number] if legal_entity[:phone_number]
acct.legal_entity.business_tax_id = legal_entity[:business_tax_id] if legal_entity[:business_tax_id]
acct.legal_entity.address = legal_entity[:address] if legal_entity[:address]
acct.legal_entity.first_name = legal_entity[:first_name] if legal_entity[:first_name]
acct.legal_entity.last_name = legal_entity[:last_name] if legal_entity[:last_name]
acct.legal_entity.dob = legal_entity[:dob] if legal_entity[:dob]
acct.legal_entity.ssn_last_4 = legal_entity[:ssn_last_4] if legal_entity[:ssn_last_4]
acct.legal_entity.personal_id_number = legal_entity[:personal_id_number] if legal_entity[:personal_id_number]
acct.legal_entity.type = 'company'
acct.legal_entity.business_name = np['name']
if tos
acct.tos_acceptance = tos
end
acct.save
# Might as well update the nonprofit info
if legal_entity[:address] && legal_entity[:business_tax_id]
np = Qx.update(:nonprofits).set({
address: legal_entity[:address][:line1],
city: legal_entity[:address][:city],
state_code: legal_entity[:address][:state],
zip_code: legal_entity[:address][:postal_code],
ein: legal_entity[:business_tax_id],
verification_status: 'pending',
phone: legal_entity[:phone_number]
})
.where(id: np_id)
.returning('*')
.execute.first
else
np = Qx.update(:nonprofits).set(verification_status: 'pending').where(id: np_id).returning('*').first
end
return np
end
# Update charges from pending to available if the nonprofit's balance on stripe can accommodate them
# First, get net balance on Stripe, then get net balance on CC
# Take the difference of those two, and mark as many oldest pending charges as 'available' as are less than or equal to that difference
def self.mark_available_charges(npo_id)
stripe_account_id = Qx.select("stripe_account_id").from(:nonprofits).where(id: npo_id).ex.first['stripe_account_id']
stripe_net_balance = Stripe::Balance.retrieve(stripe_account: stripe_account_id).available.first.amount
cc_net_balance = QueryPayments.get_payout_totals(QueryPayments.ids_for_payout(npo_id))['net_amount']
pending_payments = Qx.select("payments.net_amount", "charges.id AS charge_id")
.from(:payments)
.where("charges.status='pending'")
.and_where("payments.nonprofit_id=$id", id: npo_id)
.join("charges", "charges.payment_id=payments.id")
.order_by("payments.date ASC")
.execute
return if pending_payments.empty?
remaining_balance = stripe_net_balance - cc_net_balance
charge_ids = pending_payments.take_while do |payment|
if payment['net_amount'] <= remaining_balance
remaining_balance -= payment['net_amount']
true
end
end.map{|h| h['charge_id']}
Qx.update(:charges).set(status: 'available').where("id IN ($ids)", ids: charge_ids).execute if charge_ids.any?
end
end