Class: Pay::Subscription
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
52
53
54
|
# File 'app/models/pay/subscription.rb', line 52
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
105
106
107
108
|
# File 'app/models/pay/subscription.rb', line 105
def active?
["trialing", "active"].include?(status) &&
(!(canceled? || paused?) || on_trial? || on_grace_period?)
end
|
#canceled? ⇒ Boolean
86
87
88
|
# File 'app/models/pay/subscription.rb', line 86
def canceled?
ends_at?
end
|
#cancelled? ⇒ Boolean
90
91
92
|
# File 'app/models/pay/subscription.rb', line 90
def cancelled?
canceled?
end
|
#ended? ⇒ Boolean
94
95
96
|
# File 'app/models/pay/subscription.rb', line 94
def ended?
ends_at? && ends_at <= Time.current
end
|
#generic_trial? ⇒ Boolean
69
70
71
|
# File 'app/models/pay/subscription.rb', line 69
def generic_trial?
fake_processor? && trial_ends_at?
end
|
#has_incomplete_payment? ⇒ Boolean
122
123
124
|
# File 'app/models/pay/subscription.rb', line 122
def has_incomplete_payment?
past_due? || incomplete?
end
|
#has_trial? ⇒ Boolean
73
74
75
|
# File 'app/models/pay/subscription.rb', line 73
def has_trial?
trial_ends_at?
end
|
#incomplete? ⇒ Boolean
118
119
120
|
# File 'app/models/pay/subscription.rb', line 118
def incomplete?
status == "incomplete"
end
|
#no_prorate ⇒ Object
61
62
63
|
# File 'app/models/pay/subscription.rb', line 61
def no_prorate
self.prorate = false
end
|
#on_grace_period? ⇒ Boolean
98
99
100
|
# File 'app/models/pay/subscription.rb', line 98
def on_grace_period?
ends_at? && ends_at > Time.current
end
|
#on_trial? ⇒ Boolean
Does not include the last second of the trial
78
79
80
|
# File 'app/models/pay/subscription.rb', line 78
def on_trial?
trial_ends_at? && trial_ends_at > Time.current
end
|
#past_due? ⇒ Boolean
110
111
112
|
# File 'app/models/pay/subscription.rb', line 110
def past_due?
status == "past_due"
end
|
#skip_trial ⇒ Object
65
66
67
|
# File 'app/models/pay/subscription.rb', line 65
def skip_trial
self.trial_ends_at = nil
end
|
#swap_and_invoice(plan) ⇒ Object
126
127
128
129
|
# File 'app/models/pay/subscription.rb', line 126
def swap_and_invoice(plan)
swap(plan)
customer.invoice!(subscription: processor_id)
end
|
#sync!(**options) ⇒ Object
56
57
58
59
|
# File 'app/models/pay/subscription.rb', line 56
def sync!(**options)
self.class.sync(processor_id, **options)
reload
end
|
#trial_ended? ⇒ Boolean
82
83
84
|
# File 'app/models/pay/subscription.rb', line 82
def trial_ended?
trial_ends_at? && trial_ends_at <= Time.current
end
|
#unpaid? ⇒ Boolean
114
115
116
|
# File 'app/models/pay/subscription.rb', line 114
def unpaid?
status == "unpaid"
end
|