effective_orders 4.3.2 → 4.4.0

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
  SHA256:
3
- metadata.gz: cbc56753acb82a9f43d3c6cd058e4351cf54ee58d4df9fad0f266bb88d40af19
4
- data.tar.gz: 4537fe9ccd27a6aeb1d659bedbe620e8e85d17f78f76609396c5fb05a4e79dc8
3
+ metadata.gz: a3c5dc28f41342a9aaa1a3bb051ffba863a967ad6ffc29f4b7e314b699a8a840
4
+ data.tar.gz: a79cb8afd1238efee7e12fd2817900e6f68244bd420b5d0fa0a41d4bad634193
5
5
  SHA512:
6
- metadata.gz: 46733ccd15b8de247c865c88df956deb0e66234ca614aab1db0b79e60fade92c7b18c98b06ab508e6776d55cbf83c9dae6c7bf17b6598747f8739d019b17e382
7
- data.tar.gz: bb9b03c81ed435ffd7dfe7320c975f0d76d86e45ec6e149b0667e6094107505cb0e9abcbefaa9cb8e2af3707e77aa29b1a2b1466dfc65dbc8fc5cc1ade3f8f81
6
+ metadata.gz: 86af0e572fc9e7dbfec253786dd984f342bd926e5b4ecf5edc7ed7cc90a29478c8de6ee353c936aa0b87c9602cdbb99e136f53ed28da3a3818e260c7293f2e12
7
+ data.tar.gz: 2cafc367de7ffaedd679581bc969e3a98637ce4125ad3641b52c721743ef0b89a2c3abedd3fa31a73173cea2b04727d2bdcc866ac7c29eed63e56d06588b8248
@@ -11,12 +11,12 @@ module Effective
11
11
 
12
12
  Effective::Cart.where(user_id: @order.user_id).destroy_all
13
13
 
14
- if EffectiveOrders.mailer[:send_order_receipt_to_buyer] && email
15
- flash[:success] = "Payment successful! A receipt has been sent to #{@order.user.email}"
16
- elsif @order.free?
17
- # Nothing
18
- else
19
- flash[:success] = 'Payment successful! An email receipt has not been sent.'
14
+ unless flash[:success]
15
+ if EffectiveOrders.mailer[:send_order_receipt_to_buyer] && email
16
+ flash[:success] = "Payment successful! A receipt has been sent to #{@order.user.email}"
17
+ else
18
+ flash[:success] = "Payment successful! An email receipt has not been sent."
19
+ end
20
20
  end
21
21
 
22
22
  redirect_to (purchased_url.presence || effective_orders.purchased_order_path(':id')).gsub(':id', @order.to_param.to_s)
@@ -8,7 +8,7 @@ module Effective
8
8
  include Providers::Moneris if EffectiveOrders.moneris?
9
9
  include Providers::Paypal if EffectiveOrders.paypal?
10
10
  include Providers::Pretend if EffectiveOrders.pretend?
11
- include Providers::Refund if EffectiveOrders.refunds?
11
+ include Providers::Refund if EffectiveOrders.refund?
12
12
  include Providers::Stripe if EffectiveOrders.stripe?
13
13
 
14
14
  layout (EffectiveOrders.layout.kind_of?(Hash) ? EffectiveOrders.layout[:orders] : EffectiveOrders.layout)
@@ -18,14 +18,14 @@ module Effective
18
18
  payment: 'free order. no payment required.',
19
19
  provider: 'free',
20
20
  card: 'none',
21
- purchased_url: params[:purchased_url],
22
- declined_url: params[:declined_url],
21
+ purchased_url: free_params[:purchased_url],
22
+ declined_url: free_params[:declined_url],
23
23
  email: false
24
24
  )
25
25
  end
26
26
 
27
27
  def free_params
28
- params.require(:effective_order).permit(:purchased_url, :declined_url)
28
+ params.require(:free).permit(:purchased_url, :declined_url)
29
29
  end
30
30
 
31
31
  end
@@ -7,31 +7,25 @@ module Effective
7
7
  @order ||= Order.find(params[:id])
8
8
 
9
9
  EffectiveOrders.authorize!(self, :update, @order)
10
- EffectiveOrders.authorize!(self, :admin, :effective_orders)
11
10
 
12
11
  unless @order.refund?
13
- flash[:danger] = 'Unable to process refund with a non-negative total'
14
- redirect_to effective_orders.admin_order_path(@order)
12
+ flash[:danger] = 'Unable to process refund order with a positive total'
13
+ redirect_to effective_orders.order_path(@order)
15
14
  return
16
15
  end
17
16
 
18
- @order.assign_attributes(refund_params.except(:payment, :payment_provider, :payment_card))
17
+ flash[:success] = EffectiveOrders.refund[:success].presence
19
18
 
20
19
  order_purchased(
21
- payment: refund_params[:payment],
22
- provider: refund_params[:payment_provider],
23
- card: refund_params[:payment_card],
24
- email: @order.send_mark_as_paid_email_to_buyer?,
25
- skip_buyer_validations: true,
26
- purchased_url: params[:purchased_url].presence || effective_orders.admin_order_path(@order),
27
- declined_url: params[:declined_url].presence || effective_orders.admin_order_path(@order)
20
+ payment: 'refund. no payment required.',
21
+ provider: 'refund',
22
+ purchased_url: refund_params[:purchased_url],
23
+ declined_url: refund_params[:declined_url]
28
24
  )
29
25
  end
30
26
 
31
27
  def refund_params
32
- params.require(:effective_order).permit(
33
- :payment, :payment_provider, :payment_card, :note_to_buyer, :send_mark_as_paid_email_to_buyer
34
- )
28
+ params.require(:refund).permit(:purchased_url, :declined_url)
35
29
  end
36
30
 
37
31
  end
@@ -49,7 +49,7 @@ module EffectiveOrdersHelper
49
49
  when :pretend
50
50
  'Purchase Order (skip payment processor)'
51
51
  when :refund
52
- 'Complete Refund'
52
+ 'Accept Refund'
53
53
  when :stripe
54
54
  'Checkout with Credit Card'
55
55
  else
@@ -52,6 +52,16 @@ module Effective
52
52
  mail(to: @order.user.email, subject: @subject)
53
53
  end
54
54
 
55
+ # This is sent to admin when someone Accepts Refund
56
+ def refund_notification_to_admin(order_param)
57
+ @order = (order_param.kind_of?(Effective::Order) ? order_param : Effective::Order.find(order_param))
58
+ @user = @order.user
59
+
60
+ @subject = subject_for(@order, :refund_notification_to_admin, "New Refund: ##{@order.to_param}")
61
+
62
+ mail(to: EffectiveOrders.mailer[:admin_email], subject: @subject)
63
+ end
64
+
55
65
  # Sent by the invoice.payment_succeeded webhook event
56
66
  def subscription_payment_succeeded(customer_param)
57
67
  return true unless EffectiveOrders.mailer[:send_subscription_payment_succeeded]
@@ -76,7 +76,7 @@ module Effective
76
76
  validates :total, presence: true, numericality: {
77
77
  greater_than_or_equal_to: EffectiveOrders.minimum_charge.to_i,
78
78
  message: "must be $#{'%0.2f' % (EffectiveOrders.minimum_charge.to_i / 100.0)} or more. Please add additional items."
79
- }, unless: -> { (free? && EffectiveOrders.free?) || (refund? && EffectiveOrders.refunds?) }
79
+ }, unless: -> { (free? && EffectiveOrders.free?) || (refund? && EffectiveOrders.refund?) }
80
80
  end
81
81
 
82
82
  # User validations -- An admin skips these when working in the admin/ namespace
@@ -343,6 +343,7 @@ module Effective
343
343
 
344
344
  raise "Failed to purchase order: #{error || errors.full_messages.to_sentence}" unless error.nil?
345
345
 
346
+ send_refund_notification! if email && refund?
346
347
  send_order_receipts! if email
347
348
 
348
349
  run_purchasable_callbacks(:after_purchase)
@@ -405,6 +406,10 @@ module Effective
405
406
  send_email(:pending_order_invoice_to_buyer, to_param) unless purchased?
406
407
  end
407
408
 
409
+ def send_refund_notification!
410
+ send_email(:refund_notification_to_admin, to_param) if purchased? && refund?
411
+ end
412
+
408
413
  def skip_qb_sync!
409
414
  defined?(EffectiveQbSync) ? EffectiveQbSync.skip_order!(self) : true
410
415
  end
@@ -10,8 +10,8 @@
10
10
  - if EffectiveOrders.free? && order.free?
11
11
  = render partial: '/effective/orders/free/form', locals: provider_locals
12
12
 
13
- - elsif EffectiveOrders.refunds? && order.refund?
14
- -# Nothing
13
+ - elsif EffectiveOrders.refund? && order.refund?
14
+ = render partial: '/effective/orders/refund/form', locals: provider_locals
15
15
 
16
16
  - else
17
17
  - if EffectiveOrders.pretend? && EffectiveOrders.pretend_message.present?
@@ -33,10 +33,7 @@
33
33
  = render partial: '/effective/orders/cheque/form', locals: provider_locals
34
34
 
35
35
  - if EffectiveOrders.authorized?(controller, :admin, :effective_orders) && order.user != current_user
36
- - if EffectiveOrders.refunds? && order.refund?
37
- .effective-order-admin-purchase-actions
38
- = render partial: '/effective/orders/refund/form', locals: provider_locals
39
- - elsif EffectiveOrders.mark_as_paid?
36
+ - if EffectiveOrders.mark_as_paid?
40
37
  .effective-order-admin-purchase-actions
41
38
  = render partial: '/effective/orders/mark_as_paid/form', locals: provider_locals
42
39
 
@@ -1,5 +1,5 @@
1
1
  = effective_form_with(scope: :free, url: effective_orders.free_order_path(order), method: :post) do |f|
2
- = hidden_field_tag(:purchased_url, purchased_url)
3
- = hidden_field_tag(:declined_url, declined_url)
2
+ = f.hidden_field :purchased_url, value: purchased_url
3
+ = f.hidden_field :declined_url, value: declined_url
4
4
 
5
- = f.submit order_checkout_label(:free), border: false
5
+ = f.submit order_checkout_label(:free), center: true, border: false
@@ -1,26 +1,5 @@
1
- .card
2
- .card-body
3
- %h2 Admin: Complete Refund
1
+ = effective_form_with(scope: :refund, url: effective_orders.refund_order_path(order), method: :post) do |f|
2
+ = f.hidden_field :purchased_url, value: purchased_url
3
+ = f.hidden_field :declined_url, value: declined_url
4
4
 
5
- = effective_form_with(model: order, url: effective_orders.refund_order_path(order), method: :post) do |f|
6
- = hidden_field_tag(:purchased_url, purchased_url)
7
- = hidden_field_tag(:declined_url, declined_url)
8
-
9
- = f.select :payment_provider, EffectiveOrders.payment_providers, required: true
10
-
11
- = f.text_field :payment_card,
12
- label: 'Payment card type, cheque or transaction number',
13
- placeholder: 'visa',
14
- hint: 'Full credit card numbers should not be entered here, or anywhere.'
15
-
16
- = f.text_area :payment,
17
- label: 'Additional details',
18
- input_html: { value: f.object.payment.kind_of?(Hash) ? f.object.payment[:details] : f.object.payment.presence }
19
-
20
- = f.check_box :send_mark_as_paid_email_to_buyer,
21
- label: 'Yes, send an refund receipt email to the buyer.',
22
- input_html: { checked: (f.object.send_mark_as_paid_email_to_buyer.nil? ? EffectiveOrders.mailer[:send_order_receipts_when_mark_as_paid] : f.object.send_mark_as_paid_email_to_buyer?) }
23
-
24
- = f.text_area :note_to_buyer, hint: 'This is displayed to the buyer on all order receipts.'
25
-
26
- = f.submit order_checkout_label(:refund)
5
+ = f.submit order_checkout_label(:refund), center: true, border: false
@@ -0,0 +1,15 @@
1
+ %p.effective-orders-receipt-info A new refund has been created!
2
+
3
+ %p Please sign in to your payment processor and issue the following refund:
4
+
5
+ %p
6
+ Refund
7
+ = price_to_currency(@order.total)
8
+ to
9
+ = @order.billing_name
10
+ = @order.user.email
11
+
12
+
13
+ %p Thanks and have a great day!
14
+
15
+ = render(@order, no_order_actions: true)
@@ -98,11 +98,6 @@ EffectiveOrders.setup do |config|
98
98
  # This is accessed via the admin screens only. Must have can?(:admin, :effective_orders)
99
99
  config.mark_as_paid_enabled = false
100
100
 
101
- # Refunds
102
- # Allow admins to create orders with a negative total
103
- # Refunds don't perform any kind of refund action with the payment processor. This just changes the validations.
104
- config.refunds_enabled = false
105
-
106
101
  # Pretend Purchase
107
102
  # Display a 'Purchase order' button on the Checkout screen allowing the user
108
103
  # to purchase an Order without going through the payment processor.
@@ -150,6 +145,7 @@ EffectiveOrders.setup do |config|
150
145
  subject_for_order_receipt_to_buyer: '',
151
146
  subject_for_payment_request_to_buyer: '',
152
147
  subject_for_pending_order_invoice_to_buyer: '',
148
+ subject_for_refund_notification_to_admin: '',
153
149
 
154
150
  # Procs yield an Effective::Customer object
155
151
  subject_for_subscription_created: '',
@@ -165,7 +161,7 @@ EffectiveOrders.setup do |config|
165
161
  layout: 'effective_orders_mailer_layout',
166
162
 
167
163
  default_from: 'info@example.com',
168
- admin_email: 'admin@example.com',
164
+ admin_email: 'admin@example.com', # Refund notifications will also be sent here
169
165
 
170
166
  deliver_method: nil # When nil, will use deliver_later if active_job is configured, otherwise deliver_now
171
167
  }
@@ -228,6 +224,17 @@ EffectiveOrders.setup do |config|
228
224
  # }
229
225
  # end
230
226
 
227
+
228
+ # Refunds
229
+ # This does not issue a refund with the payment processor at all.
230
+ # Instead, we mark the order as purchased, create a refund object to track it, and
231
+ # send an email to notify_email with instructions to issue a refund
232
+ config.refund = false
233
+
234
+ # config.refund = {
235
+ # success: 'Thank you! Your refund will be processed in the next few business days.'
236
+ # }
237
+
231
238
  # Stripe
232
239
  config.stripe = false
233
240
 
@@ -10,7 +10,7 @@ EffectiveOrders::Engine.routes.draw do
10
10
  post :mark_as_paid if EffectiveOrders.mark_as_paid?
11
11
  post :pay_by_cheque if EffectiveOrders.cheque?
12
12
  post :pretend if EffectiveOrders.pretend?
13
- post :refund if EffectiveOrders.refunds?
13
+ post :refund if EffectiveOrders.refund?
14
14
  post :stripe if EffectiveOrders.stripe?
15
15
  end
16
16
 
@@ -54,7 +54,6 @@ module EffectiveOrders
54
54
  # Features
55
55
  mattr_accessor :free_enabled
56
56
  mattr_accessor :mark_as_paid_enabled
57
- mattr_accessor :refunds_enabled
58
57
  mattr_accessor :pretend_enabled
59
58
  mattr_accessor :pretend_message
60
59
 
@@ -62,6 +61,7 @@ module EffectiveOrders
62
61
  mattr_accessor :cheque
63
62
  mattr_accessor :moneris
64
63
  mattr_accessor :paypal
64
+ mattr_accessor :refund
65
65
  mattr_accessor :stripe
66
66
  mattr_accessor :subscriptions # Stripe subscriptions
67
67
  mattr_accessor :trial # Trial mode
@@ -121,8 +121,8 @@ module EffectiveOrders
121
121
  pretend_enabled == true
122
122
  end
123
123
 
124
- def self.refunds?
125
- refunds_enabled == true
124
+ def self.refund?
125
+ refund.kind_of?(Hash)
126
126
  end
127
127
 
128
128
  def self.stripe?
@@ -144,11 +144,12 @@ module EffectiveOrders
144
144
  # The Effective::Order.payment_provider value must be in this collection
145
145
  def self.payment_providers
146
146
  [
147
- ('cheque' if cheque?),
147
+ ('cheque' if cheque? || mark_as_paid?),
148
148
  ('free' if free?),
149
149
  ('moneris' if moneris?),
150
150
  ('paypal' if paypal?),
151
151
  ('pretend' if pretend?),
152
+ ('refund' if refund?),
152
153
  ('stripe' if stripe?),
153
154
  ('credit card' if mark_as_paid?),
154
155
  ('other' if mark_as_paid?),
@@ -27,6 +27,14 @@ module EffectiveOrders
27
27
  Rails.application.config.assets.precompile += ['effective_orders/*']
28
28
  end
29
29
 
30
+ initializer 'effective_orders.refund', after: :load_config_initializers do
31
+ if EffectiveOrders.refund?
32
+ unless (EffectiveOrders.mailer[:admin_email].to_s.include?('@') rescue false)
33
+ raise("config.mailer[:admin_email] must be present when refunds enabled.")
34
+ end
35
+ end
36
+ end
37
+
30
38
  initializer 'effective_orders.stripe', after: :load_config_initializers do
31
39
  if EffectiveOrders.stripe?
32
40
  begin
@@ -1,3 +1,3 @@
1
1
  module EffectiveOrders
2
- VERSION = '4.3.2'.freeze
2
+ VERSION = '4.4.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_orders
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.2
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
@@ -162,7 +162,6 @@ files:
162
162
  - app/models/effective/order.rb
163
163
  - app/models/effective/order_item.rb
164
164
  - app/models/effective/product.rb
165
- - app/models/effective/providers/stripe_charge.rb
166
165
  - app/models/effective/sold_out_validator.rb
167
166
  - app/models/effective/subscripter.rb
168
167
  - app/models/effective/subscription.rb
@@ -225,6 +224,7 @@ files:
225
224
  - app/views/effective/orders_mailer/order_receipt_to_buyer.html.haml
226
225
  - app/views/effective/orders_mailer/payment_request_to_buyer.html.haml
227
226
  - app/views/effective/orders_mailer/pending_order_invoice_to_buyer.html.haml
227
+ - app/views/effective/orders_mailer/refund_notification_to_admin.html.haml
228
228
  - app/views/effective/orders_mailer/subscription_canceled.html.haml
229
229
  - app/views/effective/orders_mailer/subscription_created.html.haml
230
230
  - app/views/effective/orders_mailer/subscription_event_to_admin.html.haml
@@ -1,24 +0,0 @@
1
- # This is an object for the stripe charge form
2
- module Effective::Providers
3
- class StripeCharge
4
- include ActiveModel::Model
5
-
6
- attr_accessor :effective_order_id, :order, :stripe_token # For our form
7
-
8
- validates :effective_order_id, presence: true
9
- validates :stripe_token, presence: true
10
-
11
- def persisted?
12
- false
13
- end
14
-
15
- def effective_order_id
16
- @effective_order_id || (order.to_param if order)
17
- end
18
-
19
- def order_items
20
- order.order_items if order
21
- end
22
-
23
- end
24
- end