# 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 require 'qx' require 'format/csv' require 'format/currency' module HealthReport # Send an email report about what has happend on the servers and database in the last 24hrs, and how things are running # Returns a hash of metrics data def self.query_data # Transaction metrics charges = Qx.select('COUNT(charges.id), SUM(charges.amount), SUM(charges.fee) as fees') .from('charges') .where('created_at > $d', d: 24.hours.ago) .and_where("charges.status != 'failed'") .ex.last # Recurring donation metrics rec_dons = Qx.select('COUNT(id), SUM(amount)') .from('recurring_donations') .where('active=TRUE') .ex.last # Info about disabled nonprofit accounts due to ident verification disabled_nps = Qx.select('nonprofits.id', 'nonprofits.name', 'nonprofits.stripe_account_id') .from('nonprofits') .where("verification_status != 'verified'") .and_where('created_at > $d', d: 3.months.ago) .ex(format: 'csv') { charges_count: charges['count'], charges_sum: charges['sum'], charges_fees: charges['fees'], recently_disabled_nps: disabled_nps, active_rec_don_count: rec_dons['count'], active_rec_don_amount: rec_dons['sum'] } end # Given a hash of data, formats it into a multi-line string def self.format_data(data) disabled_nps = Format::Csv.from_array(data[:recently_disabled_nps]) %( Transaction Metrics for the last 24hrs: Total count: #{data[:charges_count]} Total amount: $#{Format::Currency.cents_to_dollars(data[:charges_sum])} Total fees processed: $#{Format::Currency.cents_to_dollars(data[:charges_fees])} Active recurring donation metrics: Total active count: #{data[:active_rec_don_count]} Total active amount: $#{Format::Currency.cents_to_dollars(data[:active_rec_don_amount])} Recent nonprofit accounts that are disabled due to identity verification: #{disabled_nps} ) end end