effective_orders 1.4.1 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
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
-