Class: Pay::Subscription

Inherits:
ApplicationRecord show all
Defined in:
app/models/pay/subscription.rb

Constant Summary collapse

STATUSES =
%w[incomplete incomplete_expired trialing active past_due canceled unpaid paused]

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.find_by_processor_and_id(processor, processor_id) ⇒ Object



48
49
50
# File 'app/models/pay/subscription.rb', line 48

def self.find_by_processor_and_id(processor, processor_id)
  joins(:customer).find_by(processor_id: processor_id, pay_customers: {processor: processor})
end

Instance Method Details

#active?Boolean

If you cancel during a trial, you should still retain access until the end of the trial Otherwise a subscription is active unless it has ended or is currently paused Check the subscription status so we don’t accidentally consider “incomplete”, “unpaid”, or other statuses as active



99
100
101
102
# File 'app/models/pay/subscription.rb', line 99

def active?
  ["trialing", "active"].include?(status) &&
    (!(canceled? || paused?) || on_trial? || on_grace_period?)
end

#canceled?Boolean



80
81
82
# File 'app/models/pay/subscription.rb', line 80

def canceled?
  ends_at?
end

#cancelled?Boolean



84
85
86
# File 'app/models/pay/subscription.rb', line 84

def cancelled?
  canceled?
end

#ended?Boolean



88
89
90
# File 'app/models/pay/subscription.rb', line 88

def ended?
  ends_at? && ends_at <= Time.current
end

#generic_trial?Boolean



61
62
63
# File 'app/models/pay/subscription.rb', line 61

def generic_trial?
  fake_processor? && trial_ends_at?
end

#has_incomplete_payment?Boolean



116
117
118
# File 'app/models/pay/subscription.rb', line 116

def has_incomplete_payment?
  past_due? || incomplete?
end

#has_trial?Boolean



65
66
67
# File 'app/models/pay/subscription.rb', line 65

def has_trial?
  trial_ends_at?
end

#incomplete?Boolean



112
113
114
# File 'app/models/pay/subscription.rb', line 112

def incomplete?
  status == "incomplete"
end

#on_grace_period?Boolean



92
93
94
# File 'app/models/pay/subscription.rb', line 92

def on_grace_period?
  ends_at? && ends_at > Time.current
end

#on_trial?Boolean

Does not include the last second of the trial



70
71
72
73
# File 'app/models/pay/subscription.rb', line 70

def on_trial?
  return false if ended?
  trial_ends_at? && trial_ends_at > Time.current
end

#past_due?Boolean



104
105
106
# File 'app/models/pay/subscription.rb', line 104

def past_due?
  status == "past_due"
end

#skip_trialObject



57
58
59
# File 'app/models/pay/subscription.rb', line 57

def skip_trial
  self.trial_ends_at = nil
end

#swap_and_invoice(plan) ⇒ Object



120
121
122
123
# File 'app/models/pay/subscription.rb', line 120

def swap_and_invoice(plan)
  swap(plan)
  customer.invoice!(subscription: processor_id)
end

#sync!(**options) ⇒ Object



52
53
54
55
# File 'app/models/pay/subscription.rb', line 52

def sync!(**options)
  self.class.sync(processor_id, **options)
  reload
end

#trial_ended?Boolean



75
76
77
78
# File 'app/models/pay/subscription.rb', line 75

def trial_ended?
  return true if ended?
  trial_ends_at? && trial_ends_at <= Time.current
end

#unpaid?Boolean



108
109
110
# File 'app/models/pay/subscription.rb', line 108

def unpaid?
  status == "unpaid"
end