Skip to content

Instantly share code, notes, and snippets.

@gruntruk
Created March 29, 2016 14:12
Show Gist options
  • Save gruntruk/ebf091532d9b96e84531 to your computer and use it in GitHub Desktop.
Save gruntruk/ebf091532d9b96e84531 to your computer and use it in GitHub Desktop.
class WeeklyAuditJob < JobBase
def self.queue
JobBase::JOB_QUEUE_MISC
end
def initialize
@vertical_codes = Vertical.where(requires_payment: true).pluck(:code)
end
def perform
audit_report = generate_audit_report(users.to_a)
send_emails(audit_report)
end
def salesforce_api
@salesforce_api ||= SalesforceApi.new
end
private
def empty_report
{ :no_subscriptions => [], :no_stripe_tokens => [], :invalid_subscriptions => [] }
end
def generate_audit_report(user_collection)
user_collection.each_with_object(empty_report) do |user, report|
begin
populate_report_for_user!(report, user)
rescue Databasedotcom::SalesForceError
report[:invalid_subscriptions] << user
end
report
end
end
def populate_report_for_user(report, user)
contact = salesforce_api.find(:user, user.salesforce_id)
if user.subscription.nil?
report[:no_subscriptions] << user
elsif user.subscription && subscription.stripe_customer_token.blank? && !pays_by_check?(contact)
report[:no_stripe_tokens] << user
end
mark_as_pay_by_check(user) if pays_by_check?(contact)
end
def mark_as_pay_by_check(user, contact)
ensure_contact_renewal_date!(contact)
mark_subscription_as_pay_by_check!(user.subscription)
end
def pays_by_check?(contact)
contact["Pays_By_Check__c"] || contact["Group_Card_Payment__c"]
end
attr_accessor :vertical_codes
def users
User.unscoped.where(:build_status.ne => 6,
:vertical_code.in => vertical_codes,
:coupon.ne => "MMAPPEMPLOYEE",
:email => /(@(?!cardtapp\.com).*)$/i)
end
def ensure_contact_renewal_date!(contact)
return unless contact["Renewal_Check_Date__c"].blank?
contact["Renewal_Check_Date__c"] = contact["Sign_Up_Date__c"] + 1.year
contact.save
end
def mark_subscription_as_pay_by_check!(subscription, contact)
stripe_billing_info = subscription.stripe_billing_info
stripe_billing_info[:current_period_end] = contact["Renewal_Check_Date__c"].to_time.to_i
stripe_billing_info[:interval] = "year"
stripe_billing_info[:interval_count] = 1
subscription.update_attributes(stripe_customer_token: Subscription::CHECK_STRIPE_TOKEN,
stripe_billing_info: stripe_billing_info)
end
def send_emails(audit_report)
mail_error = send_mail(:invalid_stripe_subscriptions, audit_report[:invalid_subscriptions])
mail_error ||= send_mail(:no_stripe_subscriptions, audit_report[:no_stripe_tokens])
mail_error ||= send_mail(:no_subscriptions, audit_report[:no_subscriptions])
raise mail_error if mail_error
end
def send_mail(mail_function, subscriptions_array)
begin
SystemMailer.public_send(mail_function, subscriptions_array, vertical_codes).deliver!
rescue StandardError => e
Honeybadger.notify(e, context: { mail_function: mail_function })
return e
end
nil
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment