effective_orders 1.4.1 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6b26185e33ab463b2de7422b06b0c014c861277d
4
- data.tar.gz: 98cc75f935177564e5853aafdc9d605f8ec221a9
3
+ metadata.gz: f869116475dda7d252b6202a1384be1bb181f7bf
4
+ data.tar.gz: d0288050d30d8915e2a3b255c5405e8ef9ed8567
5
5
  SHA512:
6
- metadata.gz: f862dd06f8e47396576195ddeaf9b39174370bf2f6342223cd390954feab6a6bf5164bad14321216d636646438c3b3b74d1cff117fa345d8f2cb75ede69d3c0c
7
- data.tar.gz: 668344bd424d1c3b828824329a21c653f3c6ce62a614107554c6e6883e486fed660ad5e8f7faf3953d920ba5c2198d38d4ec65035419430c2aaa209b4dc1b024
6
+ metadata.gz: 81e62b3d4520668550b0d993c4c14f0c0c26d80bd6f8be7c26537e4555af3376d3e1a061948cf1132045a684fd0a81f2cf2a0ca4b935a170176b5a8485cf684c
7
+ data.tar.gz: b35df012dc37eb2b2391c661947d6238b5333839c7d777ca2cdff0573b0c476b5c248043be21503deb3460d1150259ed7a5db6222fb4aae5d27de5410de3fbf0
@@ -1,5 +1,5 @@
1
1
  hideShippingAddressFields = (shipping_address) ->
2
- shipping_address.hide().find('input,select').prop('required', false)
2
+ shipping_address.hide().find('input,select').removeProp('required')
3
3
 
4
4
  showShippingAddressFields = (shipping_address) ->
5
5
  shipping_address.show().find("input:not([name$='[address2]']),select:not([name$='[state_code]'])").prop('required', true)
@@ -1,6 +1,7 @@
1
1
  module Effective
2
2
  class CartsController < ApplicationController
3
3
  include EffectiveCartsHelper
4
+ acts_as_active_admin_controller('carts') if defined?(ActiveAdmin) && EffectiveOrders.use_active_admin == true
4
5
  layout (EffectiveOrders.layout.kind_of?(Hash) ? EffectiveOrders.layout[:carts] : EffectiveOrders.layout)
5
6
 
6
7
  def show
@@ -1,6 +1,7 @@
1
1
  module Effective
2
2
  class OrdersController < ApplicationController
3
3
  include EffectiveCartsHelper
4
+ acts_as_active_admin_controller('orders') if defined?(ActiveAdmin) && EffectiveOrders.use_active_admin == true
4
5
 
5
6
  include Providers::Moneris if EffectiveOrders.moneris_enabled
6
7
  include Providers::Paypal if EffectiveOrders.paypal_enabled
@@ -34,7 +35,12 @@ module Effective
34
35
  def create
35
36
  @order ||= Order.new(current_cart, current_user)
36
37
  @order.attributes = order_params
37
- @order.shipping_address = @order.billing_address if @order.shipping_address_same_as_billing?
38
+
39
+ if EffectiveOrders.require_shipping_address
40
+ if @order.shipping_address_same_as_billing? && @order.billing_address.present?
41
+ @order.shipping_address ||= @order.billing_address
42
+ end
43
+ end
38
44
 
39
45
  EffectiveOrders.authorized?(self, :create, @order)
40
46
 
@@ -75,7 +81,6 @@ module Effective
75
81
  @page_title = 'Checkout'
76
82
  render(:checkout) and return
77
83
  end
78
-
79
84
  end
80
85
 
81
86
  def index
@@ -113,17 +118,13 @@ module Effective
113
118
  @order = Effective::Order.find(params[:id])
114
119
  EffectiveOrders.authorized?(self, :show, @order)
115
120
 
116
- if (Effective::OrdersMailer.order_receipt_to_buyer(@order).deliver rescue false)
121
+ if @order.send_order_receipt_to_buyer!
117
122
  flash[:success] = "Successfully resent order receipt to #{@order.user.email}"
118
123
  else
119
124
  flash[:danger] = "Unable to send order receipt"
120
125
  end
121
126
 
122
- begin
123
- redirect_to :back
124
- rescue => e
125
- redirect_to effective_orders.admin_orders_path
126
- end
127
+ redirect_to(:back) rescue effective_orders.order_path(@order)
127
128
  end
128
129
 
129
130
  def pretend_purchase
@@ -0,0 +1,59 @@
1
+ module ActsAsActiveAdmin
2
+ extend ActiveSupport::Concern
3
+
4
+ module ActionController
5
+ def acts_as_active_admin_controller(key)
6
+ @active_admin_resource_element_lookup_key = key
7
+ include ::ActsAsActiveAdmin
8
+ end
9
+ end
10
+
11
+ included do
12
+ include ::ActiveAdmin::BaseController::Menu
13
+ include ::ActiveAdmin::BaseController::Authorization
14
+
15
+ helper ::ActiveAdmin::ViewHelpers
16
+ helper_method :active_admin_config, :active_admin_namespace, :current_active_admin_user
17
+
18
+ resource_key = @active_admin_resource_element_lookup_key.to_s
19
+ self.send(:define_method, :active_admin_resource_element_key) { resource_key }
20
+
21
+ resource_ivar = '@' + resource_key.singularize
22
+ self.send(:define_method, :resource) { instance_variable_get(resource_ivar) }
23
+
24
+ resource_path = "effective_orders.#{resource_key.singularize}_path"
25
+
26
+ if resource_path == 'effective_orders.cart_path'
27
+ self.send(:define_method, :resource_path) { |resource| effective_orders.cart_path }
28
+ else
29
+ self.send(:define_method, :resource_path) { |resource| public_send(resource_path, resource) }
30
+ end
31
+
32
+ helper_method :resource, :resource_path
33
+
34
+ end
35
+
36
+ module ClassMethods
37
+ end
38
+
39
+ def active_admin_namespace
40
+ ActiveAdmin.application.namespaces[EffectiveOrders.active_admin_namespace || :root]
41
+ end
42
+
43
+ def active_admin_config
44
+ active_admin_namespace.resources[active_admin_resource_key]
45
+ end
46
+
47
+ def active_admin_resource_key
48
+ @active_admin_resource_key ||= begin
49
+ namespace = ActiveAdmin.application.namespaces[EffectiveOrders.active_admin_namespace || :root]
50
+ namespace.resources.keys.find { |resource| resource.element == active_admin_resource_element_key }
51
+ end
52
+ end
53
+
54
+ def current_active_admin_user
55
+ send(active_admin_namespace.current_user_method) if active_admin_namespace.current_user_method
56
+ end
57
+
58
+ end
59
+
@@ -91,6 +91,10 @@ module ActsAsPurchasable
91
91
  @is_purchased ||= orders.any? { |order| order.purchased? }
92
92
  end
93
93
 
94
+ def purchased_at
95
+ @purchased_at ||= orders.map { |order| order.purchased_at if order.purchased? }.compact.sort.first
96
+ end
97
+
94
98
  def purchased_by?(user)
95
99
  orders.any? { |order| order.purchased? && order.user_id == user.id }
96
100
  end
@@ -118,12 +122,12 @@ module ActsAsPurchasable
118
122
  # end
119
123
 
120
124
  after_purchase(order, order_item) if self.respond_to?(:after_purchase)
121
- self.save!
125
+ save!
122
126
  end
123
127
 
124
128
  def declined!(order = nil, order_item = nil)
125
129
  after_decline(order, order_item) if self.respond_to?(:after_decline)
126
- self.save!
130
+ save!
127
131
  end
128
132
 
129
133
  # Override me if this is a digital purchase.
@@ -47,7 +47,8 @@ module Effective
47
47
  scope :purchased_by, lambda { |user| purchased.where(:user_id => user.try(:id)) }
48
48
  scope :declined, -> { where(:purchase_state => EffectiveOrders::DECLINED) }
49
49
 
50
- def initialize(cart = {}, user = nil)
50
+ # Can be an Effective::Cart, a single acts_as_purchasable, or an array of acts_as_purchasables
51
+ def initialize(items = {}, user = nil)
51
52
  super() # Call super with no arguments
52
53
 
53
54
  # Set up defaults
@@ -55,8 +56,7 @@ module Effective
55
56
  self.save_shipping_address = true
56
57
  self.shipping_address_same_as_billing = true
57
58
 
58
- add_to_order(cart) if cart.present?
59
-
59
+ add_to_order(items) if items.present?
60
60
  self.user = user if user.present?
61
61
  end
62
62
 
@@ -193,62 +193,46 @@ module Effective
193
193
 
194
194
  # :validate => false, :email => false
195
195
  def purchase!(payment_details = nil, opts = {})
196
- opts = {:validate => true, :email => true}.merge(opts)
196
+ opts = {validate: true, email: true}.merge(opts)
197
197
 
198
- raise EffectiveOrders::AlreadyPurchasedException.new('order already purchased') if self.purchased?
199
- raise EffectiveOrders::AlreadyDeclinedException.new('order already declined') if (self.declined? && opts[:validate])
198
+ return true if purchased?
199
+ raise EffectiveOrders::AlreadyDeclinedException.new('order already declined') if (declined? && opts[:validate])
200
200
 
201
- Order.transaction do
202
- self.purchase_state = EffectiveOrders::PURCHASED
203
- self.purchased_at ||= Time.zone.now
204
- self.payment = payment_details.kind_of?(Hash) ? payment_details : {:details => (payment_details || 'none').to_s}
201
+ success = false
205
202
 
206
- self.save!(:validate => opts[:validate])
207
- order_items.each { |item| item.purchasable.purchased!(self, item) }
203
+ Order.transaction do
204
+ begin
205
+ self.purchase_state = EffectiveOrders::PURCHASED
206
+ self.purchased_at ||= Time.zone.now
207
+ self.payment = payment_details.kind_of?(Hash) ? payment_details : {:details => (payment_details || 'none').to_s}
208
208
 
209
- if EffectiveOrders.mailer[:send_order_receipt_to_admin] && opts[:email]
210
- if Rails.env.production?
211
- (OrdersMailer.order_receipt_to_admin(self).deliver rescue false)
212
- else
213
- OrdersMailer.order_receipt_to_admin(self).deliver
214
- end
215
- end
209
+ save!(validate: opts[:validate])
216
210
 
217
- if EffectiveOrders.mailer[:send_order_receipt_to_buyer] && opts[:email]
218
- if Rails.env.production?
219
- (OrdersMailer.order_receipt_to_buyer(self).deliver rescue false)
220
- else
221
- OrdersMailer.order_receipt_to_buyer(self).deliver
222
- end
223
- end
211
+ order_items.each { |item| (item.purchasable.purchased!(self, item) rescue nil) }
224
212
 
225
- if EffectiveOrders.mailer[:send_order_receipt_to_seller] && self.purchased?(:stripe_connect) && opts[:email]
226
- self.order_items.group_by(&:seller).each do |seller, order_items|
227
- if Rails.env.production?
228
- (OrdersMailer.order_receipt_to_seller(self, seller, order_items).deliver rescue false)
229
- else
230
- OrdersMailer.order_receipt_to_seller(self, seller, order_items).deliver
231
- end
232
- end
213
+ success = true
214
+ rescue => e
215
+ raise ActiveRecord::Rollback
233
216
  end
234
-
235
- return true
236
217
  end
237
218
 
238
- false
219
+ send_order_receipts! if success && opts[:email]
220
+
221
+ success
239
222
  end
240
223
 
241
224
  def decline!(payment_details = nil)
242
- raise EffectiveOrders::AlreadyPurchasedException.new('order already purchased') if self.purchased?
243
- raise EffectiveOrders::AlreadyDeclinedException.new('order already declined') if self.declined?
225
+ return true if declined?
226
+
227
+ raise EffectiveOrders::AlreadyPurchasedException.new('order already purchased') if purchased?
244
228
 
245
229
  Order.transaction do
246
230
  self.purchase_state = EffectiveOrders::DECLINED
247
231
  self.payment = payment_details.kind_of?(Hash) ? payment_details : {:details => (payment_details || 'none').to_s}
248
232
 
249
- order_items.each { |item| item.purchasable.declined!(self, item) }
233
+ order_items.each { |item| (item.purchasable.declined!(self, item) rescue nil) }
250
234
 
251
- self.save!
235
+ save!
252
236
  end
253
237
  end
254
238
 
@@ -276,5 +260,44 @@ module Effective
276
260
  def declined?
277
261
  purchase_state == EffectiveOrders::DECLINED
278
262
  end
263
+
264
+ def send_order_receipts!
265
+ send_order_receipt_to_admin!
266
+ send_order_receipt_to_buyer!
267
+ send_order_receipt_to_seller!
268
+ end
269
+
270
+ def send_order_receipt_to_admin!
271
+ return false unless purchased? && EffectiveOrders.mailer[:send_order_receipt_to_admin]
272
+
273
+ if Rails.env.production?
274
+ (OrdersMailer.order_receipt_to_admin(self).deliver rescue false)
275
+ else
276
+ OrdersMailer.order_receipt_to_admin(self).deliver
277
+ end
278
+ end
279
+
280
+ def send_order_receipt_to_buyer!
281
+ return false unless purchased? && EffectiveOrders.mailer[:send_order_receipt_to_buyer]
282
+
283
+ if Rails.env.production?
284
+ (OrdersMailer.order_receipt_to_buyer(self).deliver rescue false)
285
+ else
286
+ OrdersMailer.order_receipt_to_buyer(self).deliver
287
+ end
288
+ end
289
+
290
+ def send_order_receipt_to_seller!
291
+ return false unless purchased?(:stripe_connect) && EffectiveOrders.mailer[:send_order_receipt_to_seller]
292
+
293
+ order_items.group_by(&:seller).each do |seller, order_items|
294
+ if Rails.env.production?
295
+ (OrdersMailer.order_receipt_to_seller(self, seller, order_items).deliver rescue false)
296
+ else
297
+ OrdersMailer.order_receipt_to_seller(self, seller, order_items).deliver
298
+ end
299
+ end
300
+ end
301
+
279
302
  end
280
303
  end
@@ -1,4 +1,10 @@
1
1
  %h2 Order Items
2
2
 
3
- = render_datatable @datatable do
4
- %p There are no orders items
3
+ - if @datatable.nil?
4
+ %p
5
+ Please install
6
+ = link_to 'effective_datatables', 'https://github.com/code-and-effect/effective_datatables'
7
+ to see this page.
8
+ - else
9
+ = render_datatable @datatable do
10
+ %p There are no order items
@@ -1,4 +1,10 @@
1
1
  %h2 Orders
2
2
 
3
- = render_datatable @datatable do
4
- %p There are no orders
3
+ - if @datatable.nil?
4
+ %p
5
+ Please install
6
+ = link_to 'effective_datatables', 'https://github.com/code-and-effect/effective_datatables'
7
+ to see this page.
8
+ - else
9
+ = render_datatable @datatable do
10
+ %p There are no orders
@@ -3,7 +3,7 @@
3
3
  = render :partial => 'effective/orders/order_payment_details', :locals => {:order => @order}
4
4
 
5
5
  %hr
6
- = link_to 'Back', effective_orders.admin_orders_path, :class => 'btn btn-primary'
6
+ = link_to 'Back', :back, :class => 'btn btn-primary'
7
7
  - if @order.purchased?
8
8
  = '-'
9
9
  = link_to 'Resend Receipt', effective_orders.resend_buyer_receipt_path(@order), 'data-confirm' => 'This action will email the buyer a copy of the original email receipt. Send receipt now?', :class => 'btn btn-default'
data/config/routes.rb CHANGED
@@ -35,7 +35,6 @@ EffectiveOrders::Engine.routes.draw do
35
35
  match 'orders/:id/pretend_purchase', :to => 'orders#pretend_purchase', :as => 'pretend_purchase', :via => [:get, :post]
36
36
  end
37
37
 
38
- # This must be below the other routes defined above.
39
38
  resources :orders, :only => [:new, :create, :show, :index]
40
39
 
41
40
  match 'cart', :to => 'carts#show', :as => 'cart', :via => :get
@@ -48,7 +47,7 @@ EffectiveOrders::Engine.routes.draw do
48
47
  match 'webhooks/stripe', :to => 'webhooks#stripe', :via => [:post, :put]
49
48
  end
50
49
 
51
- if defined?(EffectiveDatatables)
50
+ if defined?(EffectiveDatatables) && !EffectiveOrders.use_active_admin == true
52
51
  namespace :admin do
53
52
  resources :customers, :only => [:index]
54
53
  resources :orders, :only => [:index, :show]
@@ -2,6 +2,7 @@ require 'effective_addresses'
2
2
  require 'effective_obfuscation'
3
3
  require "effective_orders/engine"
4
4
  require 'migrant' # Required for rspec to run properly
5
+ require 'simple_form'
5
6
 
6
7
  module EffectiveOrders
7
8
  PURCHASED = 'purchased'
@@ -20,7 +21,10 @@ module EffectiveOrders
20
21
 
21
22
  mattr_accessor :layout
22
23
  mattr_accessor :simple_form_options
24
+
23
25
  mattr_accessor :use_active_admin
26
+ mattr_accessor :active_admin_namespace
27
+
24
28
  mattr_accessor :obfuscate_order_ids
25
29
  mattr_accessor :silence_deprecation_warnings
26
30
 
@@ -45,6 +45,7 @@ module EffectiveOrders
45
45
  initializer 'effective_orders.active_admin' do
46
46
  if defined?(ActiveAdmin) && EffectiveOrders.use_active_admin == true
47
47
  ActiveAdmin.application.load_paths.unshift Dir["#{config.root}/active_admin"]
48
+ ActionController::Base.extend(ActsAsActiveAdmin::ActionController)
48
49
  end
49
50
  end
50
51
 
@@ -1,3 +1,3 @@
1
1
  module EffectiveOrders
2
- VERSION = '1.4.1'.freeze
2
+ VERSION = '1.4.2'.freeze
3
3
  end
@@ -31,7 +31,10 @@ EffectiveOrders.setup do |config|
31
31
  config.authorization_method = Proc.new { |controller, action, resource| true }
32
32
 
33
33
  # Register Effective::Order with ActiveAdmin if ActiveAdmin is present
34
+ # You must have authorization to authorized?(:manage, Effective::Order)
35
+ # For the activeadmin menu to item to show up
34
36
  config.use_active_admin = true
37
+ config.active_admin_namespace = :admin # Passed internally to ActiveAdmin.register
35
38
 
36
39
  # Use effective_obfuscation gem to change order.id into a seemingly random 10-digit number
37
40
  config.obfuscate_order_ids = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_orders
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.1
4
+ version: 1.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-30 00:00:00.000000000 Z
11
+ date: 2015-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -122,20 +122,6 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: 1.1.0
125
- - !ruby/object:Gem::Dependency
126
- name: effective_datatables
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: 2.0.0
132
- type: :runtime
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: 2.0.0
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: effective_obfuscation
141
127
  requirement: !ruby/object:Gem::Requirement
@@ -352,6 +338,7 @@ files:
352
338
  - app/helpers/effective_paypal_helper.rb
353
339
  - app/helpers/effective_stripe_helper.rb
354
340
  - app/mailers/effective/orders_mailer.rb
341
+ - app/models/concerns/acts_as_active_admin.rb
355
342
  - app/models/concerns/acts_as_purchasable.rb
356
343
  - app/models/effective/access_denied.rb
357
344
  - app/models/effective/cart.rb
@@ -370,7 +357,6 @@ files:
370
357
  - app/models/inputs/price_input.rb
371
358
  - app/models/inputs/price_simple_form_input.rb
372
359
  - app/models/validators/effective/sold_out_validator.rb
373
- - app/views/active_admin/effective_orders/orders/_show.html.haml
374
360
  - app/views/admin/customers/_actions.html.haml
375
361
  - app/views/admin/customers/index.html.haml
376
362
  - app/views/admin/order_items/index.html.haml
@@ -1,70 +0,0 @@
1
- .panel
2
- %h3= "Order ##{order.to_param} Details"
3
- .panel_contents
4
- .attributes_table
5
- %table
6
- %tbody
7
- %tr
8
- %th order
9
- %td= "##{order.to_param}"
10
- %tr
11
- %th buyer
12
- %td= link_to order.user, admin_user_path(order.user)
13
- %tr
14
- %th purchase state
15
- %td= order.purchase_state
16
- - if order.purchased?
17
- %tr
18
- %th purchased
19
- %td= order.purchased_at.strftime("%Y-%m-%d %H:%M")
20
- - if order.billing_address.present?
21
- %tr
22
- %th billing address
23
- %td= order.billing_address.to_html
24
- - if order.shipping_address.present?
25
- %tr
26
- %th shipping address
27
- %td= order.shipping_address.to_html
28
-
29
- .panel
30
- %h3 Order Items
31
- .panel_contents
32
- .attributes_table
33
- - has_seller = order.purchased?(:stripe_connect)
34
- %table.table
35
- %thead
36
- %tr
37
- %th Items
38
- %th Price
39
- - if has_seller
40
- %th Seller
41
- %tbody
42
- - order.order_items.each do |item|
43
- %tr
44
- %td
45
- - if item.quantity > 1
46
- = "#{item.quantity}x "
47
- = item.title
48
- %td= price_to_currency(item.subtotal)
49
- - if has_seller
50
- %td= link_to item.seller.user, admin_user_path(item.seller.user)
51
- %tfoot
52
- %tr
53
- %th Subtotal
54
- %td= price_to_currency(order.subtotal)
55
- %tr
56
- %th Tax
57
- %td= price_to_currency(order.tax)
58
- %tr
59
- %th Total
60
- %td= price_to_currency(order.total)
61
-
62
- - if order.payment.present?
63
- .panel
64
- %h3 Payment
65
- .panel_contents
66
- .attributes_table
67
- = order_payment_to_html(order) rescue order.payment
68
-
69
-
70
-