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
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_trial ⇒ Object
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
|