houdini/lib/queue_donations.rb
2020-06-15 10:26:57 -05:00

177 lines
5.2 KiB
Ruby

# frozen_string_literal: true
# License: AGPL-3.0-or-later WITH WTO-AP-3.0-or-later
# Full license explanation at https://github.com/houdiniproject/houdini/blob/master/LICENSE
module QueueDonations
# def self.execute_for_donation(id)
# donation = Donation.find(id)
# return unless donation
# execute([donation])
# end
# def self.execute_all
# donations = fetch_donations
# return if donations.empty?
# donations_ids = donations.collect(&:id)
# execute(donations)
# end
# def self.dry_execute_all
# puts 'dry push donations to civi'
# donations = fetch_donations
# return if donations.empty?
# donations_ids = donations.collect(&:id)
# dry_execute(donations)
# end
# private
# def self.execute(donations)
# push(donations)
# donations_ids = donations.collect(&:id)
# set_queued_for_import_at(donations_ids)
# rescue Bunny::Exception, Bunny::ClientTimeout, Bunny::ConnectionTimeout
# Rails.logger.warn "Bunny error: QueueDonations.execute failed for ids #{donations_ids}"
# nil
# end
# def self.dry_execute(donations)
# push(donations)
# rescue Bunny::Exception, Bunny::ClientTimeout, Bunny::ConnectionTimeout
# Rails.logger.warn "Bunny error: QueueDonations.dry_execute failed for ids #{donations_ids}"
# nil
# end
# def self.push(donations)
# connection = Bunny.new(
# host: Settings.integration.host,
# vhost: Settings.integration.vhost,
# user: Settings.integration.user,
# password: Settings.integration.password
# )
# connection.start
# channel = connection.create_channel
# exchange = channel.topic(Settings.integration.exchange, durable: true)
# donations.each do |donation|
# exchange.publish(
# prepare_donation_params(donation).to_json,
# routing_key: Settings.integration.routing_key
# )
# end
# connection.close
# end
# def self.set_queued_for_import_at(ids)
# timestamp = Time.current
# Qx.update(:donations)
# .where('id IN ($ids)', ids: ids)
# .set(queued_for_import_at: timestamp)
# .execute
# end
# def self.fetch_donations
# Donation
# .where('queued_for_import_at IS null')
# .includes(:supporter, :nonprofit, :tracking, :payment, :recurring_donation)
# end
# def self.prepare_donation_params(donation)
# nonprofit = donation.nonprofit
# tracking = donation.tracking
# campaign = donation.campaign
# recurring = donation.recurring_donation
# action_type = :donate
# action_technical_type = 'cc.wemove.eu:donate'
# action_name = "undefined_#{donation.supporter.locale}"
# external_id = campaign ? campaign.external_identifier : "cc_default_#{nonprofit.id}"
# data = {
# action_type: action_type,
# action_technical_type: action_technical_type,
# create_dt: donation.created_at,
# action_name: action_name || "slug-#{campaign.id}-#{donation.supporter.locale}",
# external_id: external_id || "cc_#{campaign.id}",
# contact: {},
# donation: {}
# }
# data[:contact] = supporter_data(donation.supporter)
# data[:donation] = donation_data(donation)
# data[:source] = tracking_data(donation.tracking) if donation.tracking
# data[:recurring] = recurring_data(donation.recurring_donation) if donation.recurring_donation
# data
# end
# def self.supporter_data(supporter)
# {
# language: supporter.locale,
# firstname: supporter.first_name,
# lastname: supporter.last_name,
# emails: [
# { email: supporter.email }
# ],
# addresses: [
# { zip: supporter.zip_code, country: supporter.country }
# ]
# }
# end
# def self.donation_data(donation)
# common_data = {
# amount: donation.amount / 100.0,
# currency: donation.nonprofit.currency,
# recurring_id: donation.recurring_donation ? "cc_#{donation.recurring_donation.id}" : nil,
# external_identifier: "cc_#{donation.id}",
# type: donation.recurring ? 'recurring' : 'single'
# }
# if donation.card_id
# data = common_data.merge(
# payment_processor: 'stripe',
# amount_charged: donation.payment.charge.amount / 100.0,
# transaction_id: donation.payment.charge.stripe_charge_id,
# status: donation.payment.charge.paid? ? 'success' : 'not_paid'
# )
# elsif donation.direct_debit_detail_id
# data = common_data.merge(
# payment_processor: 'sepa',
# amount_charged: 0,
# transaction_id: "cc_#{donation.id}",
# iban: donation.direct_debit_detail.iban,
# bic: donation.direct_debit_detail.bic,
# account_holder: donation.direct_debit_detail.account_holder_name,
# status: 'success'
# )
# end
# data
# end
# def self.recurring_data(recurring)
# {
# id: recurring.id,
# start: recurring.start_date,
# time_unit: recurring.time_unit,
# active: recurring.active
# }
# end
# def self.tracking_data(tracking)
# {
# source: tracking.utm_source,
# medium: tracking.utm_medium,
# campaign: tracking.utm_campaign,
# content: tracking.utm_content
# }
# end
end