Skip to Content Skip to Search
Namespace
Methods
A
C
E
N
S
U

Attributes

[R] error
[R] member
[R] site
[R] status
[R] subscription

Class Public methods

cancel(subscription:, reason:, at_period_end: nil)

# File app/services/service/subscription_manager.rb, line 3
def self.cancel(subscription:, reason:, at_period_end: nil)
  new(subscription:).cancel(reason, at_period_end:)
end

new(args = {})

# File app/services/service/subscription_manager.rb, line 9
def initialize(args = {})
  @subscription = args.fetch(:subscription)
  @member = @subscription.member
  @site = @member.site
end

Instance Public methods

apply_discount_coupon()

# File app/services/service/subscription_manager.rb, line 70
def apply_discount_coupon
  with_error_handling do
    coupon = DB::Coupon.find(site_settings.retention_coupon_id)
    sub = remote_subscription

    sub.coupon = coupon.code
    sub.save

    reference_coupon_used(coupon)

    Member::FailedPaymentRecorderJob.perform_later(
      member,
      subscription,
      "recovered_coupon"
    )
  end
end

cancel(reason, at_period_end: nil)

# File app/services/service/subscription_manager.rb, line 15
def cancel(reason, at_period_end: nil)
  return false unless cancelable?(reason)

  with_error_handling do
    cancel_at_period_end = cancel_at_period_end?(at_period_end:)
    result = cancel_stripe_subscription(cancel_at_period_end)

    member.failed_payments.where(subscription:).destroy_all

    if cancel_at_period_end && result.current_period_end.present?
      updated = subscription.update(
        canceled_reason: reason,
        cancels_on: DateTime.strptime(result.current_period_end.to_s, "%s")
      )

      Emailer.admin_subscription_will_cancel(
        "admin",
        member_id: member.id,
        plan_id: plan.id,
        subscription_id: subscription.id
      ).deliver_later
    else
      updated = subscription.update(status: "canceled", canceled_reason: reason)

      if member.of_memberspace? && updated
        TransactionFeeUpdatorJob.perform_later(member_id: member.id)
      end
    end

    updated
  end
end

cancel_at_period_end?(at_period_end: nil)

# File app/services/service/subscription_manager.rb, line 48
def cancel_at_period_end?(at_period_end: nil)
  !incomplete? && !trial_with_billing_anchor? && !plan.multi_payment_plan_type? &&
    (at_period_end.nil? ? site_settings.cancel_at_period_end? : at_period_end)
end

contact_support(email_content)

# File app/services/service/subscription_manager.rb, line 88
def contact_support(email_content)
  Emailer.admin_member_contacted_support(
    "admin",
    site: member.site,
    first_name: member.first_name,
    last_name: member.last_name,
    email_address: member.email,
    email_content: email_content,
    member_id: member.id
  ).deliver_later

  unless contacted_support_recently?
    Member::FailedPaymentRecorderJob.perform_later(
      member,
      subscription,
      "recovered_support"
    )
  end
end

extend_trial()

# File app/services/service/subscription_manager.rb, line 53
def extend_trial
  with_error_handling do
    sub = remote_subscription

    number_extra_days = site_settings.extended_trial_days
    new_trial_end = sub.trial_end + number_extra_days.to_i.days.to_i
    sub.trial_end = new_trial_end
    sub.save

    Member::FailedPaymentRecorderJob.perform_later(
      member,
      subscription,
      "recovered_trial_extension"
    )
  end
end

send_cancelation_emails()

# File app/services/service/subscription_manager.rb, line 108
def send_cancelation_emails
  unless payments_completed?
    Emailer.plan_cancellation(site, {member_id: member.id, plan_id: plan.id}).deliver_later

    data = {member_id: member.id, plan_id: plan.id, subscription_id: subscription.id}

    if cancelation_email_turned_on && site.active?
      Emailer.admin_subscription_canceled("admin", data).deliver_later
    end
  end
end

update_payments()

# File app/services/service/subscription_manager.rb, line 120
def update_payments
  process_payments if plan.multi_payment_plan_type? && !(trialing? || canceled?)
end