Module: EffectiveOrders

Defined in:
lib/effective_orders.rb,
lib/effective_orders/engine.rb,
lib/effective_orders/version.rb,
lib/generators/effective_orders/install_generator.rb

Defined Under Namespace

Modules: Generators Classes: AlreadyPurchasedException, Engine, SoldOutException

Constant Summary collapse

PENDING =

New orders are created in a pending state

'pending'.freeze
CONFIRMED =

Once the order has passed checkout step 1

'confirmed'.freeze
DEFERRED =

Deferred providers. Cheque or Phone was selected.

'deferred'.freeze
PURCHASED =

Purchased by provider

'purchased'.freeze
DECLINED =

Declined by provider

'declined'.freeze
STATES =
{ PENDING => PENDING, CONFIRMED => CONFIRMED, DEFERRED => DEFERRED, PURCHASED => PURCHASED, DECLINED => DECLINED }
ACTIVE =

Subscription statuses (as per stripe)

'active'.freeze
PAST_DUE =
'past_due'.freeze
TRIALING =
'trialing'.freeze
CANCELED =
'canceled'.freeze
STATUSES =
{ ACTIVE => ACTIVE, PAST_DUE => PAST_DUE, CANCELED => CANCELED, TRIALING => TRIALING }
VERSION =
'4.6.2'.freeze

Class Method Summary collapse

Class Method Details

.authorize!(controller, action, resource) ⇒ Object



86
87
88
# File 'lib/effective_orders.rb', line 86

def self.authorize!(controller, action, resource)
  raise Effective::AccessDenied.new('Access Denied', action, resource) unless authorized?(controller, action, resource)
end

.authorized?(controller, action, resource) ⇒ Boolean

Returns:

  • (Boolean)


73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/effective_orders.rb', line 73

def self.authorized?(controller, action, resource)
  @_exceptions ||= [Effective::AccessDenied, (CanCan::AccessDenied if defined?(CanCan)), (Pundit::NotAuthorizedError if defined?(Pundit))].compact

  return !!authorization_method unless authorization_method.respond_to?(:call)
  controller = controller.controller if controller.respond_to?(:controller)

  begin
    !!(controller || self).instance_exec((controller || self), action, resource, &authorization_method)
  rescue *@_exceptions
    false
  end
end

.can_skip_checkout_step1? ⇒ Boolean

Returns:

  • (Boolean)


172
173
174
175
176
177
178
# File 'lib/effective_orders.rb', line 172

def self.can_skip_checkout_step1?
  return false if require_billing_address
  return false if require_shipping_address
  return false if collect_note
  return false if terms_and_conditions
  true
end

.cheque? ⇒ Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/effective_orders.rb', line 99

def self.cheque?
  cheque.kind_of?(Hash)
end

.deferred? ⇒ Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/effective_orders.rb', line 107

def self.deferred?
  deferred_providers.present?
end

.deferred_providers ⇒ Object



168
169
170
# File 'lib/effective_orders.rb', line 168

def self.deferred_providers
  [('cheque' if cheque?), ('phone' if phone?)].compact
end

.free? ⇒ Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/effective_orders.rb', line 103

def self.free?
  free_enabled == true
end

.mark_as_paid? ⇒ Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/effective_orders.rb', line 111

def self.mark_as_paid?
  mark_as_paid_enabled == true
end

.moneris? ⇒ Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/effective_orders.rb', line 115

def self.moneris?
  moneris.kind_of?(Hash)
end

.payment_providers ⇒ Object

The Effective::Order.payment_provider value must be in this collection



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/effective_orders.rb', line 152

def self.payment_providers
  [
    ('cheque' if cheque?),
    ('credit card' if mark_as_paid?),
    ('free' if free?),
    ('moneris' if moneris?),
    ('paypal' if paypal?),
    ('phone' if phone?),
    ('pretend' if pretend?),
    ('refund' if refund?),
    ('stripe' if stripe?),
    ('other' if mark_as_paid?),
    'none'
  ].compact
end

.paypal? ⇒ Boolean

Returns:

  • (Boolean)


119
120
121
# File 'lib/effective_orders.rb', line 119

def self.paypal?
  paypal.kind_of?(Hash)
end

.permitted_params ⇒ Object



90
91
92
93
94
95
96
97
# File 'lib/effective_orders.rb', line 90

def self.permitted_params
  [
    :cc, :note, :terms_and_conditions, :confirmed_checkout,
    billing_address: EffectiveAddresses.permitted_params,
    shipping_address: EffectiveAddresses.permitted_params,
    subscripter: [:stripe_plan_id, :stripe_token]
  ]
end

.phone? ⇒ Boolean

Returns:

  • (Boolean)


123
124
125
# File 'lib/effective_orders.rb', line 123

def self.phone?
  phone.kind_of?(Hash)
end

.pretend? ⇒ Boolean

Returns:

  • (Boolean)


127
128
129
# File 'lib/effective_orders.rb', line 127

def self.pretend?
  pretend_enabled == true
end

.refund? ⇒ Boolean

Returns:

  • (Boolean)


131
132
133
# File 'lib/effective_orders.rb', line 131

def self.refund?
  refund.kind_of?(Hash)
end

.setup {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:



69
70
71
# File 'lib/effective_orders.rb', line 69

def self.setup
  yield self
end

.single_payment_processor? ⇒ Boolean

Returns:

  • (Boolean)


147
148
149
# File 'lib/effective_orders.rb', line 147

def self.single_payment_processor?
  [moneris?, paypal?, stripe?].select { |enabled| enabled }.length == 1
end

.stripe? ⇒ Boolean

Returns:

  • (Boolean)


135
136
137
# File 'lib/effective_orders.rb', line 135

def self.stripe?
  stripe.kind_of?(Hash)
end

.stripe_plans ⇒ Object



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/effective_orders.rb', line 180

def self.stripe_plans
  return [] unless (stripe? && subscriptions?)

  @stripe_plans ||= (
    Rails.logger.info '[STRIPE] index plans'

    plans = begin
      Stripe::Plan.respond_to?(:all) ? Stripe::Plan.all : Stripe::Plan.list
    rescue => e
      raise e if Rails.env.production?
      Rails.logger.info "[STRIPE ERROR]: #{e.message}"
      Rails.logger.info "[STRIPE ERROR]: effective_orders continuing with empty stripe plans. This would fail loudly in Rails.env.production."
      []
    end

    plans = plans.map do |plan|
      description = ("$#{'%0.2f' % (plan.amount / 100.0)}" + ' ' + plan.currency.upcase + '/' +  plan.interval.to_s)

      {
        id: plan.id,
        product_id: plan.product,
        name: plan.nickname || description,
        description: description,
        amount: plan.amount,
        currency: plan.currency,
        interval: plan.interval,
        interval_count: plan.interval_count,
        trial_period_days: (plan.trial_period_days if plan.respond_to?(:trial_period_days))
      }
    end.sort do |x, y|
      val ||= (x[:interval] <=> y[:interval])
      val = nil if val == 0

      val ||= (x[:amount] <=> y[:amount])
      val = nil if val == 0

      val ||= (x[:name] <=> y[:name])
      val = nil if val == 0

      val || (x[:id] <=> y[:id])
    end

    # Calculate savings for any yearly per user plans, based on their matching monthly plans
    plans.select { |plan| plan[:interval] == 'year' }.each do |yearly|
      monthly_name = yearly[:name].downcase.gsub('year', 'month')
      monthly = plans.find { |plan| plan[:interval] == 'month' && plan[:name].downcase == monthly_name }
      next unless monthly

      savings = (monthly[:amount].to_i * 12) - yearly[:amount].to_i
      next unless savings > 0

      yearly[:savings] = savings
    end

    plans
  )
end

.stripe_plans_collection ⇒ Object



238
239
240
# File 'lib/effective_orders.rb', line 238

def self.stripe_plans_collection
  stripe_plans.map { |plan| [plan[:name], plan[:id]] }
end

.subscriptions? ⇒ Boolean

Returns:

  • (Boolean)


139
140
141
# File 'lib/effective_orders.rb', line 139

def self.subscriptions?
  subscriptions.kind_of?(Hash)
end

.trial? ⇒ Boolean

Returns:

  • (Boolean)


143
144
145
# File 'lib/effective_orders.rb', line 143

def self.trial?
  trial.kind_of?(Hash)
end