Module: SlackRubyBotServer::Stripe::Models::Methods

Extended by:
ActiveModel::Callbacks, ActiveSupport::Concern
Included in:
ActiveRecord, Mongoid
Defined in:
lib/slack-ruby-bot-server-stripe/models/methods.rb

Instance Method Summary collapse

Instance Method Details

#active_stripe_subscriptionObject



118
119
120
121
122
123
124
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 118

def active_stripe_subscription
  return unless stripe_customer

  stripe_customer.subscriptions.detect do |subscription|
    subscription.status == 'active' && !subscription.cancel_at_period_end
  end
end

#active_stripe_subscription?Boolean

Returns:

  • (Boolean)


114
115
116
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 114

def active_stripe_subscription?
  !active_stripe_subscription.nil?
end

#check_stripe!Object



205
206
207
208
209
210
211
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 205

def check_stripe!
  if subscribed? && active_stripe_subscription?
    check_subscription!
  elsif !subscribed?
    check_trial!
  end
end

#check_subscription!Object



187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 187

def check_subscription!
  raise Errors::NotSubscribedError unless subscribed?
  raise Errors::MissingStripeCustomerError unless stripe_customer

  if stripe_customer.subscriptions.none?
    subscription_expired!
  else
    stripe_customer.subscriptions.each do |subscription|
      case subscription.status
      when 'past_due'
        subscription_past_due!
      when 'canceled', 'unpaid'
        subscription_expired!
      end
    end
  end
end

#check_trial!Object



180
181
182
183
184
185
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 180

def check_trial!
  raise Errors::AlreadySubscribedError if subscribed?
  return if remaining_trial_days > 3

  trial_expiring!
end

#remaining_trial_daysObject



138
139
140
141
142
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 138

def remaining_trial_days
  raise Errors::AlreadySubscribedError if subscribed?

  [0, (trial_ends_at.to_date - Time.now.utc.to_date).to_i].max
end

#stripe_subscriptionsObject



126
127
128
129
130
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 126

def stripe_subscriptions
  return unless stripe_customer

  stripe_customer.subscriptions
end

#subscribe!(params) ⇒ Object

params:

  • stripe_token

  • stripe_email

  • subscription_plan_id



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 64

def subscribe!(params)
  raise Errors::AlreadySubscribedError if subscribed?
  raise Errors::StripeCustomerExistsError if stripe_customer_id

  customer = ::Stripe::Customer.create(
    source: params[:stripe_token],
    plan: params[:subscription_plan_id] || SlackRubyBotServer::Stripe.config.subscription_plan_id,
    email: params[:stripe_email],
    metadata: {
      id: id,
      team_id: team_id,
      name: name,
      domain: domain
    }
  )

  update_attributes!(
    subscribed: true,
    subscribed_at: Time.now.utc,
    stripe_customer_id: customer['id'],
    subscription_expired_at: nil,
    subscription_past_due_at: nil,
    subscription_past_due_informed_at: nil
  )

  customer
end

#subscribed_textObject



162
163
164
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 162

def subscribed_text
  'Your team has been subscribed.'
end

#subscription_expired?Boolean

Returns:

  • (Boolean)


26
27
28
29
30
31
32
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 26

def subscription_expired?
  return false if subscribed?
  return true if subscription_expired_at

  time_limit = Time.now - trial_duration
  created_at < time_limit
end

#subscription_expired_textObject



166
167
168
169
170
171
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 166

def subscription_expired_text
  [
    'Your subscription has expired.',
    subscribe_text
  ].join(' ')
end

#subscription_past_due_textObject



173
174
175
176
177
178
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 173

def subscription_past_due_text
  [
    'Your subscription is past due.',
    update_cc_text
  ].join(' ')
end

#subscription_text(options = { include_admin_info: false }) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 38

def subscription_text(options = { include_admin_info: false })
  subscription_text = []
  if stripe_customer
    subscription_text << stripe_customer_text
    if stripe_subscriptions&.any?
      subscription_text.concat(stripe_customer_subscriptions_info)
      if options[:include_admin_info]
        subscription_text.concat(stripe_customer_invoices_info)
        subscription_text.concat(stripe_customer_sources_info)
        subscription_text << update_cc_text
      end
    else
      subscription_text << 'No active subscriptions.'
    end
  elsif subscribed && subscribed_at
    subscription_text << subscriber_text
  else
    subscription_text << trial_text
  end
  subscription_text.compact.join("\n")
end

#tagsObject



19
20
21
22
23
24
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 19

def tags
  [
    subscribed? ? 'subscribed' : 'trial',
    stripe_customer_id? ? 'paid' : nil
  ].compact
end

#trial_ends_atObject



132
133
134
135
136
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 132

def trial_ends_at
  raise Errors::AlreadySubscribedError if subscribed?

  created_at + trial_duration
end

#trial_expired?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 34

def trial_expired?
  remaining_trial_days <= 0
end

#trial_textObject



144
145
146
147
148
149
150
151
152
153
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 144

def trial_text
  raise Errors::AlreadySubscribedError if subscribed?

  [
    remaining_trial_days.zero? ?
      'Your trial subscription has expired.' :
      "Your trial subscription expires in #{remaining_trial_days} day#{remaining_trial_days == 1 ? '' : 's'}.",
    subscribe_text
  ].join(' ')
end

#unsubscribe!Object



104
105
106
107
108
109
110
111
112
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 104

def unsubscribe!
  raise Errors::NotSubscribedError unless subscribed?
  raise Errors::MissingStripeCustomerError unless active_stripe_subscription?

  run_callbacks :unsubscribed do
    active_stripe_subscription.delete(at_period_end: true)
    update_attributes!(subscribed: false, stripe_customer_id: nil)
  end
end

#unsubscribed_textObject



155
156
157
158
159
160
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 155

def unsubscribed_text
  [
    'Your team has been unsubscribed.',
    subscribe_text
  ].join(' ')
end

#update_subscription!(params) ⇒ Object

params:

  • stripe_token



94
95
96
97
98
99
100
101
102
# File 'lib/slack-ruby-bot-server-stripe/models/methods.rb', line 94

def update_subscription!(params)
  raise Errors::NotSubscribedError unless subscribed?
  raise Errors::MissingStripeCustomerError unless active_stripe_subscription?

  stripe_customer.source = params[:stripe_token]
  stripe_customer.save

  stripe_customer
end