solidus_afterpay 0.1.0 → 0.3.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +9 -0
  3. data/Gemfile +6 -3
  4. data/README.md +55 -23
  5. data/app/assets/javascripts/solidus_afterpay/afterpay_checkout.js +11 -11
  6. data/app/assets/javascripts/solidus_afterpay/afterpay_checkout_button.js +85 -0
  7. data/app/assets/javascripts/solidus_afterpay/afterpay_init.js +12 -0
  8. data/app/assets/javascripts/solidus_afterpay/backend/afterpay_autocomplete.js +9 -0
  9. data/app/assets/javascripts/spree/backend/solidus_afterpay.js +3 -1
  10. data/app/assets/javascripts/spree/frontend/solidus_afterpay.js +2 -0
  11. data/app/controllers/solidus_afterpay/callbacks_controller.rb +5 -1
  12. data/app/controllers/solidus_afterpay/checkouts_controller.rb +8 -2
  13. data/app/controllers/solidus_afterpay/express_callbacks_controller.rb +65 -0
  14. data/app/decorators/controllers/solidus_afterpay/spree/orders_controller_decorator.rb +13 -0
  15. data/app/helpers/solidus_afterpay/afterpay_helper.rb +5 -4
  16. data/app/models/solidus_afterpay/gateway.rb +37 -10
  17. data/app/models/solidus_afterpay/order_component_builder.rb +34 -5
  18. data/app/models/solidus_afterpay/payment_method.rb +43 -10
  19. data/app/models/solidus_afterpay/payment_source.rb +1 -1
  20. data/app/presentes/solidus_afterpay/order_presenter.rb +17 -0
  21. data/app/presentes/solidus_afterpay/shipping_rate_presenter.rb +28 -0
  22. data/app/services/solidus_afterpay/base_service.rb +13 -0
  23. data/app/services/solidus_afterpay/shipping_rate_builder_service.rb +32 -0
  24. data/app/services/solidus_afterpay/update_order_addresses_service.rb +45 -0
  25. data/app/services/solidus_afterpay/update_order_attributes_service.rb +49 -0
  26. data/app/views/solidus_afterpay/_afterpay_checkout_button.html.erb +9 -0
  27. data/app/views/solidus_afterpay/_afterpay_javascript.html.erb +4 -1
  28. data/app/views/spree/api/payments/source_views/_afterpay.json.jbuilder +1 -1
  29. data/app/views/spree/shared/_afterpay_messaging.html.erb +14 -12
  30. data/bin/sandbox +1 -1
  31. data/config/locales/en.yml +4 -0
  32. data/config/routes.rb +2 -0
  33. data/lib/generators/solidus_afterpay/install/templates/initializer.rb +12 -0
  34. data/lib/solidus_afterpay/configuration.rb +29 -0
  35. data/lib/solidus_afterpay/engine.rb +1 -1
  36. data/lib/solidus_afterpay/testing_support/factories.rb +20 -0
  37. data/lib/solidus_afterpay/version.rb +1 -1
  38. data/solidus_afterpay.gemspec +4 -4
  39. metadata +23 -73
  40. data/spec/fixtures/vcr_casettes/create_checkout/invalid.yml +0 -65
  41. data/spec/fixtures/vcr_casettes/create_checkout/valid.yml +0 -64
  42. data/spec/fixtures/vcr_casettes/credit/invalid.yml +0 -61
  43. data/spec/fixtures/vcr_casettes/credit/valid.yml +0 -63
  44. data/spec/fixtures/vcr_casettes/deferred/authorize/declined_payment.yml +0 -120
  45. data/spec/fixtures/vcr_casettes/deferred/authorize/invalid.yml +0 -61
  46. data/spec/fixtures/vcr_casettes/deferred/authorize/valid.yml +0 -120
  47. data/spec/fixtures/vcr_casettes/deferred/capture/invalid.yml +0 -61
  48. data/spec/fixtures/vcr_casettes/deferred/capture/valid.yml +0 -140
  49. data/spec/fixtures/vcr_casettes/deferred/void/invalid.yml +0 -61
  50. data/spec/fixtures/vcr_casettes/deferred/void/valid.yml +0 -137
  51. data/spec/fixtures/vcr_casettes/find_payment/invalid.yml +0 -61
  52. data/spec/fixtures/vcr_casettes/find_payment/valid.yml +0 -140
  53. data/spec/fixtures/vcr_casettes/immediate/capture/declined_payment.yml +0 -120
  54. data/spec/fixtures/vcr_casettes/immediate/capture/invalid.yml +0 -61
  55. data/spec/fixtures/vcr_casettes/immediate/capture/valid.yml +0 -134
  56. data/spec/fixtures/vcr_casettes/retrieve_configuration/valid.yml +0 -67
  57. data/spec/helpers/solidus_afterpay/afterpay_helper_spec.rb +0 -23
  58. data/spec/models/solidus_afterpay/gateway_spec.rb +0 -418
  59. data/spec/models/solidus_afterpay/order_component_builder_spec.rb +0 -137
  60. data/spec/models/solidus_afterpay/payment_method_spec.rb +0 -143
  61. data/spec/models/solidus_afterpay/payment_source_spec.rb +0 -61
  62. data/spec/models/solidus_afterpay/user_agent_generator_spec.rb +0 -22
  63. data/spec/models/spree/order_spec.rb +0 -158
  64. data/spec/requests/solidus_afterpay/callbacks_controller_spec.rb +0 -127
  65. data/spec/requests/solidus_afterpay/checkouts_controller_spec.rb +0 -190
  66. data/spec/spec_helper.rb +0 -31
  67. data/spec/support/auth.rb +0 -15
  68. data/spec/support/preferences.rb +0 -33
  69. data/spec/support/vcr.rb +0 -18
@@ -4,17 +4,20 @@ require 'afterpay'
4
4
 
5
5
  module SolidusAfterpay
6
6
  class OrderComponentBuilder
7
- attr_reader :order, :redirect_confirm_url, :redirect_cancel_url
7
+ attr_reader :order, :mode, :redirect_confirm_url, :redirect_cancel_url, :popup_origin_url
8
8
 
9
- def initialize(order:, redirect_confirm_url:, redirect_cancel_url:)
9
+ def initialize(order:, mode: nil, redirect_confirm_url: nil, redirect_cancel_url: nil, popup_origin_url: nil)
10
10
  @order = order
11
+ @mode = mode
11
12
  @redirect_confirm_url = redirect_confirm_url
12
13
  @redirect_cancel_url = redirect_cancel_url
14
+ @popup_origin_url = popup_origin_url
13
15
  end
14
16
 
15
17
  def call
16
18
  ::Afterpay::Components::Order.new(
17
19
  amount: amount,
20
+ mode: mode,
18
21
  consumer: consumer,
19
22
  billing: address(order.billing_address),
20
23
  shipping: address(order.shipping_address),
@@ -27,6 +30,8 @@ module SolidusAfterpay
27
30
  private
28
31
 
29
32
  def address(address)
33
+ return unless address
34
+
30
35
  name = if SolidusSupport.combined_first_and_last_name_in_address?
31
36
  address.name
32
37
  else
@@ -45,6 +50,8 @@ module SolidusAfterpay
45
50
  end
46
51
 
47
52
  def consumer
53
+ return unless order.billing_address
54
+
48
55
  if SolidusSupport.combined_first_and_last_name_in_address?
49
56
  name_components = ::Spree::Address::Name.new(order.billing_address.name)
50
57
  first_name = name_components.first_name
@@ -55,7 +62,7 @@ module SolidusAfterpay
55
62
  end
56
63
 
57
64
  ::Afterpay::Components::Consumer.new(
58
- email: order.user&.email || order.email,
65
+ email: order.user&.email || order.email || 'afterpay@guest.com',
59
66
  given_names: first_name,
60
67
  surname: last_name,
61
68
  phone: order.billing_address.phone
@@ -72,7 +79,8 @@ module SolidusAfterpay
72
79
  def merchant
73
80
  ::Afterpay::Components::Merchant.new(
74
81
  redirect_confirm_url: redirect_confirm_url,
75
- redirect_cancel_url: redirect_cancel_url
82
+ redirect_cancel_url: redirect_cancel_url,
83
+ popup_origin_url: popup_origin_url
76
84
  )
77
85
  end
78
86
 
@@ -90,8 +98,29 @@ module SolidusAfterpay
90
98
  price: ::Afterpay::Components::Money.new(
91
99
  amount: line_item.price.to_s,
92
100
  currency: line_item.currency
93
- )
101
+ ),
102
+ preorder: pre_order?(line_item),
103
+ estimated_shipment_date: estimated_shipment_date(line_item)
94
104
  )
95
105
  end
106
+
107
+ def estimated_shipment_date_product(line_item)
108
+ line_item.product.property("estimatedShipmentDate")
109
+ end
110
+
111
+ def estimated_shipment_date_variant(line_item)
112
+ line_item.variant.variant_properties.find{ |prop| prop.property.name == "estimatedShipmentDate" }&.value
113
+ end
114
+
115
+ def estimated_shipment_date(line_item)
116
+ @estimated_shipment_date ||=
117
+ estimated_shipment_date_variant(line_item) || estimated_shipment_date_product(line_item)
118
+ end
119
+
120
+ def pre_order?(line_item)
121
+ return false if estimated_shipment_date(line_item).nil?
122
+
123
+ Time.zone.local(*estimated_shipment_date(line_item).split("-")) > Time.zone.now
124
+ end
96
125
  end
97
126
  end
@@ -4,11 +4,9 @@ module SolidusAfterpay
4
4
  class PaymentMethod < SolidusSupport.payment_method_parent_class
5
5
  preference :merchant_id, :string
6
6
  preference :secret_key, :string
7
- preference :deferred, :boolean
8
7
  preference :popup_window, :boolean
9
- preference :minimum_amount, :decimal
10
- preference :maximum_amount, :decimal
11
- preference :currency, :string
8
+ preference :merchant_key, :string
9
+ preference :excluded_products, :string
12
10
 
13
11
  def gateway_class
14
12
  SolidusAfterpay::Gateway
@@ -33,24 +31,59 @@ module SolidusAfterpay
33
31
  end
34
32
 
35
33
  def available_for_order?(order)
34
+ return false if order.line_items.any?{ |item| excluded_product_ids.include? item.variant.product_id }
35
+
36
36
  available_payment_currency == order.currency && available_payment_range.include?(order.total)
37
37
  end
38
38
 
39
+ def excluded_product?(product)
40
+ excluded_product_ids.include? product.id
41
+ end
42
+
39
43
  private
40
44
 
41
- def available_payment_range
42
- min = preferred_minimum_amount || configuration&.minimumAmount&.amount.to_f
43
- max = preferred_maximum_amount || configuration&.maximumAmount&.amount.to_f
45
+ def excluded_product_ids
46
+ return [] if preferred_excluded_products.nil?
44
47
 
45
- min..max
48
+ preferred_excluded_products.split(",").map(&:to_i)
46
49
  end
47
50
 
48
- def available_payment_currency
49
- preferred_currency || configuration&.maximumAmount&.currency
51
+ def available_payment_range
52
+ minimum_amount..maximum_amount
50
53
  end
51
54
 
52
55
  def configuration
53
56
  @configuration ||= gateway.retrieve_configuration
54
57
  end
58
+
59
+ def minimum_amount
60
+ @minimum_amount ||= fetch_configuration(:minimumAmount, :amount).to_f
61
+ end
62
+
63
+ def maximum_amount
64
+ @maximum_amount ||= fetch_configuration(:maximumAmount, :amount).to_f
65
+ end
66
+
67
+ def available_payment_currency
68
+ @available_payment_currency = fetch_configuration(:maximumAmount, :currency)
69
+ end
70
+
71
+ def fetch_configuration(*keys)
72
+ cache_key = "solidus_afterpay_configuration_#{keys.join('_')}"
73
+
74
+ return Rails.cache.read(cache_key) if Rails.cache.exist?(cache_key)
75
+
76
+ value = configuration&.dig(*keys)
77
+
78
+ unless configuration.nil?
79
+ Rails.cache.write(
80
+ cache_key,
81
+ value,
82
+ expires_in: SolidusAfterpay.config.cache_expiry
83
+ )
84
+ end
85
+
86
+ value
87
+ end
55
88
  end
56
89
  end
@@ -13,7 +13,7 @@ module SolidusAfterpay
13
13
  def can_void?(payment)
14
14
  payment_method = payment.payment_method
15
15
 
16
- return false unless payment_method.preferred_deferred
16
+ return false if payment_method.auto_capture
17
17
 
18
18
  payment_state = payment_method.gateway.find_payment(order_id: payment.response_code).try(:[], :paymentState)
19
19
 
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAfterpay
4
+ class OrderPresenter
5
+ def initialize(order:)
6
+ @order = order
7
+ end
8
+
9
+ def line_items_tax_amount
10
+ order.line_item_adjustments.tax.eligible.sum(&:amount)
11
+ end
12
+
13
+ private
14
+
15
+ attr_reader :order
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAfterpay
4
+ class ShippingRatePresenter
5
+ def initialize(shipping_rate:)
6
+ @shipping_rate = shipping_rate
7
+ end
8
+
9
+ def order_amount
10
+ shipping_rate.order.item_total.to_f +
11
+ shipping_rate.cost +
12
+ shipping_rate.taxes.sum(&:amount) +
13
+ order_presenter.line_items_tax_amount
14
+ end
15
+
16
+ def amount_with_taxes
17
+ shipping_rate.cost.to_f + shipping_rate.taxes.sum(&:amount)
18
+ end
19
+
20
+ private
21
+
22
+ def order_presenter
23
+ @order_presenter ||= SolidusAfterpay::OrderPresenter.new(order: shipping_rate.order)
24
+ end
25
+
26
+ attr_reader :shipping_rate
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAfterpay
4
+ class BaseService
5
+ def self.call(*args, **kws, &block)
6
+ new(*args, **kws, &block).call
7
+ end
8
+
9
+ def call
10
+ raise NotImplementedError
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAfterpay
4
+ class ShippingRateBuilderService < BaseService
5
+ def initialize(order:)
6
+ @order = order
7
+
8
+ super()
9
+ end
10
+
11
+ def call
12
+ order.shipments.map do |shipment|
13
+ shipment.shipping_rates.map do |rate|
14
+ shipping_rate_presenter = SolidusAfterpay::ShippingRatePresenter.new(shipping_rate: rate)
15
+
16
+ {
17
+ id: rate.id.to_s,
18
+ name: rate.name,
19
+ description: rate.display_price,
20
+ shipping_amount: shipping_rate_presenter.amount_with_taxes.round(4).to_s,
21
+ currency: rate.currency,
22
+ order_amount: shipping_rate_presenter.order_amount.round(4).to_s
23
+ }
24
+ end
25
+ end.flatten
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :order
31
+ end
32
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAfterpay
4
+ class UpdateOrderAddressesService < BaseService
5
+ def initialize(order:, address_params:)
6
+ @order = order
7
+ @address_params = address_params
8
+
9
+ super()
10
+ end
11
+
12
+ def call
13
+ order.state = 'address'
14
+ order.email = SolidusAfterpay.configuration.dummy_email if order.email.blank?
15
+ order.ship_address_attributes = address_object
16
+ order.bill_address_attributes = address_object
17
+ order.save
18
+ end
19
+
20
+ private
21
+
22
+ def address_object
23
+ {
24
+ address1: address_params[:address1],
25
+ address2: address_params[:address2],
26
+ name: address_params[:name],
27
+ city: address_params[:suburb],
28
+ zipcode: address_params[:postcode],
29
+ phone: address_params[:phoneNumber],
30
+ country: country,
31
+ state: state
32
+ }
33
+ end
34
+
35
+ def country
36
+ @country ||= ::Spree::Country.find_by(iso: address_params[:countryCode])
37
+ end
38
+
39
+ def state
40
+ @state ||= ::Spree::State.find_by(country_id: country.id, abbr: address_params[:state])
41
+ end
42
+
43
+ attr_reader :order, :address_params
44
+ end
45
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAfterpay
4
+ class UpdateOrderAttributesService < BaseService
5
+ def initialize(order:, afterpay_order_token:, payment_method:, request_env:)
6
+ @order = order
7
+ @afterpay_order_token = afterpay_order_token
8
+ @payment_method = payment_method
9
+ @request_env = request_env
10
+
11
+ super()
12
+ end
13
+
14
+ def call
15
+ return false if afterpay_order.nil?
16
+
17
+ ::Spree::OrderUpdateAttributes.new(order, update_params, request_env: request_env).apply
18
+ end
19
+
20
+ private
21
+
22
+ def afterpay_order
23
+ @afterpay_order ||= payment_method.gateway.find_order(token: afterpay_order_token)
24
+ end
25
+
26
+ def shipping_rate
27
+ @shipping_rate ||= ::Spree::ShippingRate.find(afterpay_order.shippingOptionIdentifier.to_i)
28
+ end
29
+
30
+ def update_params
31
+ {
32
+ email: afterpay_order.consumer.email,
33
+ shipments_attributes: [{
34
+ selected_shipping_rate_id: shipping_rate.id,
35
+ id: shipping_rate.shipment.id
36
+ }],
37
+ payments_attributes: [{
38
+ payment_method_id: payment_method.id,
39
+ amount: afterpay_order.amount.amount,
40
+ source_attributes: {
41
+ token: afterpay_order_token
42
+ }
43
+ }]
44
+ }
45
+ end
46
+
47
+ attr_reader :order, :afterpay_order_token, :payment_method, :request_env
48
+ end
49
+ end
@@ -0,0 +1,9 @@
1
+ <% payment_method = SolidusAfterpay::PaymentMethod.active.first unless local_assigns[:payment_method] %>
2
+
3
+ <%= render partial: 'solidus_afterpay/afterpay_javascript', locals: { payment_method: payment_method } if Rails.env != "test" %>
4
+
5
+ <% if payment_method.present? && payment_method.available_for_order?(@order) %>
6
+ <button type="button" id="afterpay-button" data-afterpay-entry-point="cart" data-order-number="<%= @order.number %>" data-payment-method-id="<%= payment_method.id %>">
7
+ <%= I18n.t('solidus_afterpay.express_checkout.button') %>
8
+ </button>
9
+ <% end %>
@@ -1,5 +1,8 @@
1
+ <% payment_method = SolidusAfterpay::PaymentMethod.active.first unless local_assigns[:payment_method] %>
1
2
  <% if payment_method.present? %>
2
3
  <% content_for :head do %>
3
- <%= include_afterpay_js(test_mode: payment_method.preferred_test_mode) %>
4
+ <%= include_afterpay_js(
5
+ test_mode: payment_method.preferred_test_mode,
6
+ merchant_key: payment_method.preferred_merchant_key) %>
4
7
  <% end %>
5
8
  <% end %>
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- json.nil!
3
+ json.call(payment_source, :id, :token, :created_at)
@@ -1,13 +1,15 @@
1
- <% content_for :head do %>
2
- <script
3
- src="https://js.afterpay.com/afterpay-1.x.js"
4
- data-analytics-enabled
5
- async
6
- <% if max %>
7
- data-min="<%= min %>"
8
- data-max="<%= max %>"
9
- <% end %>
10
- ></script>
11
- <% end %>
1
+ <% if products.none? { |product| ::SolidusAfterpay::PaymentMethod.active.first.excluded_product?(product) } %>
2
+ <% content_for :head do %>
3
+ <script
4
+ src="https://js.afterpay.com/afterpay-1.x.js"
5
+ data-analytics-enabled
6
+ async
7
+ <% if max %>
8
+ data-min="<%= min %>"
9
+ data-max="<%= max %>"
10
+ <% end %>
11
+ ></script>
12
+ <% end %>
12
13
 
13
- <%= content_tag("afterpay-placement", nil, data: data) %>
14
+ <%= content_tag("afterpay-placement", nil, data: data) %>
15
+ <% end %>
data/bin/sandbox CHANGED
@@ -22,7 +22,7 @@ if [ ! -z $SOLIDUS_BRANCH ]
22
22
  then
23
23
  BRANCH=$SOLIDUS_BRANCH
24
24
  else
25
- BRANCH="master"
25
+ BRANCH="main"
26
26
  fi
27
27
 
28
28
  extension_name="solidus_afterpay"
@@ -10,3 +10,7 @@ en:
10
10
  resource_not_found: The resource you were looking for could not be found.
11
11
  order_token_not_found: Invalid order confirmation data passed in.
12
12
  unauthorized: You are not authorized to perform that action.
13
+ express_checkout:
14
+ errors:
15
+ unable_place_order: 'Unable to place the order!'
16
+ button: Checkout with Afterpay
data/config/routes.rb CHANGED
@@ -4,4 +4,6 @@ SolidusAfterpay::Engine.routes.draw do
4
4
  match '/callbacks/confirm', to: '/solidus_afterpay/callbacks#confirm', via: %i[get post]
5
5
  get '/callbacks/cancel', to: '/solidus_afterpay/callbacks#cancel'
6
6
  post '/checkouts', to: '/solidus_afterpay/checkouts#create'
7
+ patch '/express_callbacks/:order_number', to: '/solidus_afterpay/express_callbacks#update'
8
+ post '/express_callbacks/:order_number', to: '/solidus_afterpay/express_callbacks#create'
7
9
  end
@@ -2,4 +2,16 @@
2
2
 
3
3
  SolidusAfterpay.configure do |config|
4
4
  config.use_solidus_api = false
5
+ # A class that extend SolidusAfterpay::BaseService, respond to .call, accepting a Spree::Order
6
+ # and return an Afterpay shipping rate object (check the Afterpay documentation)
7
+ # config.shipping_rate_builder_service_class = 'SolidusAfterpay::ShippingRateBuilderService'
8
+
9
+ # A class that extend SolidusAfterpay::BaseService, respond to .call, accepting a Spree::Order
10
+ # and return true or false
11
+ # config.update_order_attributes_service_class = 'SolidusAfterpay::UpdateOrderAttributesService'
12
+
13
+ # There is a cache for retrieving the minimum amount, maximum amount and the currency from Afterpay
14
+ # the default value us set to 1.day, this is also recommended by Afterpay itself. If you prefer a shorter
15
+ # or longer time simply uncomment config.cache_expiry and add the preferred value.
16
+ # config.cache_expiry = 1.day
5
17
  end
@@ -3,6 +3,25 @@
3
3
  module SolidusAfterpay
4
4
  class Configuration
5
5
  attr_accessor :use_solidus_api
6
+ attr_writer :shipping_rate_builder_service_class, :cache_expiry
7
+
8
+ def dummy_email
9
+ 'afterpay@dummy.com'
10
+ end
11
+
12
+ def shipping_rate_builder_service_class
13
+ @shipping_rate_builder_service_class ||= 'SolidusAfterpay::ShippingRateBuilderService'
14
+ @shipping_rate_builder_service_class.constantize
15
+ end
16
+
17
+ def update_order_attributes_service_class
18
+ @update_order_attributes_service_class ||= 'SolidusAfterpay::UpdateOrderAttributesService'
19
+ @update_order_attributes_service_class.constantize
20
+ end
21
+
22
+ def cache_expiry
23
+ @cache_expiry ||= 1.day
24
+ end
6
25
  end
7
26
 
8
27
  class << self
@@ -21,5 +40,15 @@ module SolidusAfterpay
21
40
 
22
41
  SolidusAfterpay::BaseController
23
42
  end
43
+
44
+ # rubocop:disable Rails/Delegate
45
+ def shipping_rate_builder_service_class
46
+ configuration.shipping_rate_builder_service_class
47
+ end
48
+
49
+ def update_order_attributes_service_class
50
+ configuration.update_order_attributes_service_class
51
+ end
52
+ # rubocop:enable Rails/Delegate
24
53
  end
25
54
  end
@@ -19,7 +19,7 @@ module SolidusAfterpay
19
19
  initializer "spree.payment_methods.register_afterpay_payment_method",
20
20
  after: "spree.register.payment_methods" do |app|
21
21
  app.config.spree.payment_methods << "SolidusAfterpay::PaymentMethod"
22
- Spree::PermittedAttributes.source_attributes.concat [:token]
22
+ Spree::PermittedAttributes.source_attributes.push :token
23
23
  end
24
24
  end
25
25
  end
@@ -18,3 +18,23 @@ FactoryBot.define do
18
18
  token { "12345678910" }
19
19
  end
20
20
  end
21
+
22
+ FactoryBot.define do
23
+ factory :order_with_variant_property, class: "Spree::Order", parent: :order_with_line_items do
24
+ after(:build) do |order|
25
+ variant_property_rule_value = create(:variant_property_rule_value, value: "2021-09-19",
26
+ property: create(:property, name: "estimatedShipmentDate"))
27
+ order.line_items.first.variant.product.variant_property_rules << variant_property_rule_value.variant_property_rule
28
+ order.line_items.first.variant.option_values << variant_property_rule_value.variant_property_rule
29
+ .option_values.first
30
+ end
31
+ end
32
+ end
33
+
34
+ FactoryBot.define do
35
+ factory :order_with_product_property, class: "Spree::Order", parent: :order_with_line_items do
36
+ after(:build) do |order|
37
+ order.line_items.first.product.set_property("estimatedShipmentDate", "2025-10-25")
38
+ end
39
+ end
40
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusAfterpay
4
- VERSION = '0.1.0'
4
+ VERSION = '0.3.0'
5
5
  end
@@ -16,23 +16,23 @@ Gem::Specification.new do |spec|
16
16
  spec.metadata['source_code_uri'] = 'https://github.com/solidusio-contrib/solidus_afterpay'
17
17
  spec.metadata['changelog_uri'] = 'https://github.com/solidusio-contrib/solidus_afterpay/blob/master/CHANGELOG.md'
18
18
 
19
- spec.required_ruby_version = Gem::Requirement.new('~> 2.5')
19
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.5', '< 4')
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
23
  files = Dir.chdir(__dir__) { `git ls-files -z`.split("\x0") }
24
24
 
25
25
  spec.files = files.grep_v(%r{^(test|spec|features)/})
26
- spec.test_files = files.grep(%r{^(test|spec|features)/})
27
26
  spec.bindir = "exe"
28
27
  spec.executables = files.grep(%r{^exe/}) { |f| File.basename(f) }
29
28
  spec.require_paths = ["lib"]
30
29
 
31
- spec.add_dependency 'afterpay', '~> 0.2.0'
32
- spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 4']
30
+ spec.add_dependency 'afterpay', '~> 0.6.0'
31
+ spec.add_dependency 'solidus_core', ['>= 2.0.0']
33
32
  spec.add_dependency 'solidus_support', '~> 0.5'
34
33
 
35
34
  spec.add_development_dependency 'solidus_dev_support', '~> 2.5'
36
35
  spec.add_development_dependency 'vcr', '~> 6.0'
37
36
  spec.add_development_dependency 'webmock', '~> 3.14'
37
+ spec.metadata['rubygems_mfa_required'] = 'true'
38
38
  end