spree_affirm 0.2.22 → 0.2.30
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 +5 -5
- data/Gemfile +4 -4
- data/LICENSE +25 -22
- data/README.md +6 -2
- data/app/controllers/spree/affirm_controller.rb +2 -61
- data/app/models/spree/affirm_checkout.rb +0 -109
- data/app/models/spree/gateway/affirm.rb +5 -12
- data/app/views/spree/checkout/payment/_affirm.html.erb +34 -29
- data/config/locales/en.yml +0 -2
- data/lib/spree_affirm/factories/affirm_checkout_factory.rb +1 -9
- data/lib/spree_affirm/version.rb +1 -1
- data/spec/models/spree_affirm_checkout_spec.rb +0 -21
- data/spec/models/spree_gateway_affirm_spec.rb +0 -3
- data/spree_affirm.gemspec +5 -5
- metadata +30 -27
- data/app/models/affirm/address_validator.rb +0 -25
- data/app/views/spree/checkout/affirm/_learn_more.html.erb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 65cad531f525308a5dc67e738afc77b388e2a611e15890ea215e9854772f1c45
|
4
|
+
data.tar.gz: ac0b662dddaf01d3bc79041001bf2809212a54f5a68b41f31827f10a2e748f70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5545ba5abc61022425b0831401417630cfc0a62a0bef664a240a2824babd4e380852c91f37dd7c53c012c0b41713716491e149203d81489764ea04c0041c05d3
|
7
|
+
data.tar.gz: 220c681e146b9861c7aed937b7c834a76e7727688671faee3c90656d5a21f09a1fcc9ed1620c1c0cc099c723866aea60162ee25406f6d6b3c557190e8ad69c97
|
data/Gemfile
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'spree', github: 'spree/spree',
|
4
|
-
gem 'spree_gateway', github: 'spree/spree_gateway',
|
5
|
-
gem 'spree_auth_devise', github: 'spree/spree_auth_devise',
|
3
|
+
gem 'spree', github: 'spree/spree', tag: 'v0.2.25'
|
4
|
+
gem 'spree_gateway', github: 'spree/spree_gateway', tag: 'v0.2.25'
|
5
|
+
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', tag: 'v0.2.25'
|
6
6
|
|
7
7
|
group :test do
|
8
8
|
gem 'coffee-rails'
|
9
9
|
gem 'sass-rails', '~> 4.0.3'
|
10
|
-
gem 'money', '6.
|
10
|
+
gem 'money', '6.5.1'
|
11
11
|
gem 'rspec-rails', '~> 2.10'
|
12
12
|
gem 'shoulda-matchers', '2.2.0'
|
13
13
|
gem 'simplecov', :require => false
|
data/LICENSE
CHANGED
@@ -1,26 +1,29 @@
|
|
1
|
-
|
1
|
+
BSD 3-Clause License
|
2
|
+
|
3
|
+
Copyright (c) 2019, Affirm
|
2
4
|
All rights reserved.
|
3
5
|
|
4
|
-
Redistribution and use in source and binary forms, with or without
|
5
|
-
are permitted provided that the following conditions are met:
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
8
|
+
|
9
|
+
* Redistributions of source code must retain the above copyright notice, this
|
10
|
+
list of conditions and the following disclaimer.
|
11
|
+
|
12
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
14
|
+
and/or other materials provided with the distribution.
|
6
15
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
this list of conditions and the following disclaimer in the documentation
|
11
|
-
and/or other materials provided with the distribution.
|
12
|
-
* Neither the name Spree nor the names of its contributors may be used to
|
13
|
-
endorse or promote products derived from this software without specific
|
14
|
-
prior written permission.
|
16
|
+
* Neither the name of the copyright holder nor the names of its
|
17
|
+
contributors may be used to endorse or promote products derived from
|
18
|
+
this software without specific prior written permission.
|
15
19
|
|
16
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
21
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
22
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
23
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
24
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
25
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
26
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
27
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
28
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
CHANGED
@@ -18,6 +18,10 @@ Installation
|
|
18
18
|
|
19
19
|
4. Restart your server
|
20
20
|
|
21
|
+
Documentation
|
22
|
+
------------------
|
23
|
+
https://docs.affirm.com/Spree
|
24
|
+
|
21
25
|
## Contributing
|
22
26
|
|
23
27
|
1. Fork it
|
@@ -37,11 +41,11 @@ bundle exec rake test_app
|
|
37
41
|
bundle exec rspec spec
|
38
42
|
```
|
39
43
|
|
40
|
-
When testing your applications integration with this extension you may use
|
44
|
+
When testing your applications integration with this extension you may use its factories.
|
41
45
|
Simply add this require statement to your spec_helper:
|
42
46
|
|
43
47
|
```ruby
|
44
48
|
require 'spree_affirm/factories'
|
45
49
|
```
|
46
50
|
|
47
|
-
Copyright (c)
|
51
|
+
Copyright (c) 2019 Affirm, released under the New BSD License
|
@@ -24,31 +24,7 @@ module Spree
|
|
24
24
|
payment_method: payment_method
|
25
25
|
)
|
26
26
|
|
27
|
-
|
28
|
-
unless _affirm_checkout.valid?
|
29
|
-
|
30
|
-
_affirm_checkout.errors.each do |field, error|
|
31
|
-
case field
|
32
|
-
when :billing_address
|
33
|
-
# FIXME(brian): pass the phone number to the |order| in a better place
|
34
|
-
phone = order.bill_address.phone
|
35
|
-
order.bill_address = generate_spree_address(_affirm_checkout.details['billing'])
|
36
|
-
order.bill_address.phone = phone
|
37
|
-
|
38
|
-
when :shipping_address
|
39
|
-
# FIXME(brian): pass the phone number to the |order| in a better place
|
40
|
-
phone = order.shipping_address.phone
|
41
|
-
order.ship_address = generate_spree_address(_affirm_checkout.details['shipping'])
|
42
|
-
order.ship_address.phone = phone
|
43
|
-
|
44
|
-
when :billing_email
|
45
|
-
order.email = _affirm_checkout.details["billing"]["email"]
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
order.save
|
51
|
-
end
|
27
|
+
order.save
|
52
28
|
|
53
29
|
_affirm_checkout.save
|
54
30
|
|
@@ -59,7 +35,7 @@ module Spree
|
|
59
35
|
})
|
60
36
|
|
61
37
|
# transition to confirm or complete
|
62
|
-
|
38
|
+
order.next
|
63
39
|
|
64
40
|
if order.completed?
|
65
41
|
session[:order_id] = nil
|
@@ -88,40 +64,5 @@ module Spree
|
|
88
64
|
def completion_route(order)
|
89
65
|
spree.order_path(order)
|
90
66
|
end
|
91
|
-
|
92
|
-
def generate_spree_address(affirm_address)
|
93
|
-
# find the state and country in spree
|
94
|
-
_state = Spree::State.find_by_abbr(affirm_address["address"]["region1_code"]) or
|
95
|
-
Spree::State.find_by_name(affirm_address["address"]["region1_code"])
|
96
|
-
_country = Spree::Country.find_by_iso3(affirm_address["address"]["country_code"]) or
|
97
|
-
Spree::Country.find_by_iso(affirm_address["address"]["country_code"])
|
98
|
-
|
99
|
-
# try to get the name from first and last
|
100
|
-
_firstname = affirm_address["name"]["first"] if affirm_address["name"]["first"].present?
|
101
|
-
_lastname = affirm_address["name"]["last"] if affirm_address["name"]["last"].present?
|
102
|
-
|
103
|
-
# fall back to using the full name if available
|
104
|
-
if _firstname.nil? and _lastname.nil? and affirm_address["name"]["full"].present?
|
105
|
-
_name_parts = affirm_address["name"]["full"].split " "
|
106
|
-
_lastname = _name_parts.pop
|
107
|
-
_firstname = _name_parts.join " "
|
108
|
-
end
|
109
|
-
|
110
|
-
# create new address
|
111
|
-
_spree_address = Spree::Address.new(
|
112
|
-
city: affirm_address["address"]["city"],
|
113
|
-
phone: affirm_address["phone_number"],
|
114
|
-
zipcode: affirm_address["address"]["postal_code"],
|
115
|
-
address1: affirm_address["address"]["street1"],
|
116
|
-
address2: affirm_address["address"]["street2"],
|
117
|
-
state: _state,
|
118
|
-
country: _country,
|
119
|
-
lastname: _lastname,
|
120
|
-
firstname: _firstname
|
121
|
-
)
|
122
|
-
|
123
|
-
_spree_address.save
|
124
|
-
_spree_address
|
125
|
-
end
|
126
67
|
end
|
127
68
|
end
|
@@ -3,8 +3,6 @@ module Spree
|
|
3
3
|
belongs_to :payment_method
|
4
4
|
belongs_to :order
|
5
5
|
|
6
|
-
validate :validate_checkout_matches_order
|
7
|
-
|
8
6
|
scope :with_payment_profile, -> { all }
|
9
7
|
|
10
8
|
def name
|
@@ -15,71 +13,6 @@ module Spree
|
|
15
13
|
@details ||= payment_method.provider.get_checkout token
|
16
14
|
end
|
17
15
|
|
18
|
-
def validate_checkout_matches_order
|
19
|
-
return if self.id
|
20
|
-
|
21
|
-
check_valid_products
|
22
|
-
check_matching_shipping_address
|
23
|
-
check_matching_billing_address
|
24
|
-
check_matching_billing_email
|
25
|
-
check_matching_product_key
|
26
|
-
end
|
27
|
-
|
28
|
-
def check_valid_products
|
29
|
-
# ensure the number of line items matches
|
30
|
-
if details["items"].size != order.line_items.size
|
31
|
-
errors.add :line_items, "Order size mismatch"
|
32
|
-
end
|
33
|
-
|
34
|
-
# iterate through the line items of the checkout
|
35
|
-
order.line_items.each do |line_item|
|
36
|
-
|
37
|
-
# check that the line item sku exists in the affirm checkout
|
38
|
-
if !(_item = details["items"][line_item.variant.sku])
|
39
|
-
errors.add :line_items, "Line Item not in checkout details"
|
40
|
-
|
41
|
-
# check quantity & price
|
42
|
-
elsif _item["qty"].to_i != line_item.quantity.to_i
|
43
|
-
errors.add :line_items, "Quantity mismatch"
|
44
|
-
|
45
|
-
elsif _item["unit_price"].to_i != (line_item.price*100).to_i
|
46
|
-
errors.add :line_items, "Price mismatch"
|
47
|
-
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# all products match
|
52
|
-
true
|
53
|
-
end
|
54
|
-
|
55
|
-
def check_matching_billing_address
|
56
|
-
# ensure we have a standardized address format
|
57
|
-
details['billing']['address'] = normalize_affirm_address details['billing']['address']
|
58
|
-
|
59
|
-
# validate address
|
60
|
-
check_address_match details["billing"], order.bill_address, :billing_address
|
61
|
-
end
|
62
|
-
|
63
|
-
def check_matching_shipping_address
|
64
|
-
# ensure we have a standardized address format
|
65
|
-
details['shipping']['address'] = normalize_affirm_address details['shipping']['address']
|
66
|
-
|
67
|
-
# validate address
|
68
|
-
check_address_match details["shipping"], order.ship_address, :shipping_address
|
69
|
-
end
|
70
|
-
|
71
|
-
def check_matching_billing_email
|
72
|
-
if details["billing"]["email"].present? and details["billing"]["email"].casecmp(order.email) != 0
|
73
|
-
errors.add :billing_email, "Billing email mismatch"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def check_matching_product_key
|
78
|
-
if details["config"]["financial_product_key"] != payment_method.preferred_product_key
|
79
|
-
errors.add :financial_product_key, "Product key mismatch"
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
16
|
def actions
|
84
17
|
%w{capture void credit}
|
85
18
|
end
|
@@ -101,47 +34,5 @@ module Spree
|
|
101
34
|
return false unless payment.order.payment_state == 'credit_owed'
|
102
35
|
payment.credit_allowed > 0
|
103
36
|
end
|
104
|
-
|
105
|
-
private
|
106
|
-
|
107
|
-
|
108
|
-
def normalize_affirm_address(affirm_address_details)
|
109
|
-
Affirm::AddressValidator.normalize_affirm_address(affirm_address_details)
|
110
|
-
end
|
111
|
-
|
112
|
-
def check_address_match(affirm_address, spree_address, field)
|
113
|
-
# mapping from affirm address keys to spree address values
|
114
|
-
_key_mapping = {
|
115
|
-
city: spree_address.city,
|
116
|
-
street1: spree_address.address1,
|
117
|
-
street2: spree_address.address2,
|
118
|
-
postal_code: spree_address.zipcode,
|
119
|
-
region1_code: spree_address.state.abbr
|
120
|
-
|
121
|
-
# check that each value from affirm matches the spree address
|
122
|
-
}.each do |affirm_key, spree_val|
|
123
|
-
if affirm_address["address"][affirm_key.to_s].present? and
|
124
|
-
affirm_address["address"][affirm_key.to_s] != spree_val
|
125
|
-
|
126
|
-
errors.add field, "#{affirm_key.to_s} mismatch"
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
# test affirm names with first and last
|
131
|
-
if affirm_address["name"]["first"].present? and affirm_address["name"]["last"].present? and
|
132
|
-
(affirm_address["name"]["first"].casecmp(spree_address.firstname) != 0 or
|
133
|
-
affirm_address["name"]["last"].casecmp(spree_address.lastname) != 0)
|
134
|
-
|
135
|
-
errors.add field, "First/Last name mismatch"
|
136
|
-
|
137
|
-
# test affirm names with full name
|
138
|
-
elsif affirm_address["name"]["full"].present? and
|
139
|
-
!(affirm_address["name"]["full"].downcase.include?(spree_address.firstname.downcase) and
|
140
|
-
affirm_address["name"]["full"].downcase.include?(spree_address.lastname.downcase))
|
141
|
-
|
142
|
-
errors.add field, "Full name mismatch"
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
37
|
end
|
147
38
|
end
|
@@ -2,8 +2,8 @@ module Spree
|
|
2
2
|
class Gateway::Affirm < Gateway
|
3
3
|
preference :api_key, :string
|
4
4
|
preference :secret_key, :string
|
5
|
-
preference :
|
6
|
-
preference :
|
5
|
+
preference :test_mode, :boolean, default: true
|
6
|
+
preference :server, :string, default: 'sandbox.affirm.com'
|
7
7
|
|
8
8
|
def provider_class
|
9
9
|
ActiveMerchant::Billing::Affirm
|
@@ -36,22 +36,15 @@ module Spree
|
|
36
36
|
def cancel(charge_ari)
|
37
37
|
_payment = Spree::Payment.valid.where(
|
38
38
|
response_code: charge_ari,
|
39
|
-
source_type:
|
39
|
+
source_type: payment_source_class.to_s
|
40
40
|
).first
|
41
41
|
|
42
42
|
return if _payment.nil?
|
43
43
|
|
44
44
|
if _payment.pending?
|
45
45
|
_payment.void_transaction!
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
# create adjustment
|
50
|
-
_payment.order.adjustments.create label: "Refund - Canceled Order", amount: -_payment.credit_allowed.to_f
|
51
|
-
_payment.order.update!
|
52
|
-
|
53
|
-
_payment.credit!
|
54
|
-
|
46
|
+
elsif _payment.completed? && _payment.can_credit?
|
47
|
+
provider.refund(_payment.credit_allowed.to_money.cents, charge_ari)
|
55
48
|
end
|
56
49
|
end
|
57
50
|
end
|
@@ -1,7 +1,3 @@
|
|
1
|
-
<div class="affirm-learn-more-section">
|
2
|
-
<%= render partial: 'spree/checkout/affirm/learn_more' %>
|
3
|
-
</div>
|
4
|
-
|
5
1
|
<script>
|
6
2
|
(function(){
|
7
3
|
/* only include this setup once */
|
@@ -12,7 +8,7 @@
|
|
12
8
|
\*****************************************************/
|
13
9
|
var _affirm_config = {
|
14
10
|
public_api_key: "<%= payment_method.preferred_api_key %>",
|
15
|
-
script: "https://<%= payment_method.
|
11
|
+
script: "https://<%= payment_method.preferences[:test_mode] ? 'cdn1-sandbox.affirm.com' : 'cdn1.affirm.com' %>/js/v2/affirm.js"
|
16
12
|
};
|
17
13
|
(function(l,g,m,e,a,f,b){var d,c=l[m]||{},h=document.createElement(f),n=document.getElementsByTagName(f)[0],k=function(a,b,c){return function(){a[b]._.push([c,arguments])}};c[e]=k(c,e,"set");d=c[e];c[a]={};c[a]._=[];d._=[];c[a][b]=k(c,a,b);a=0;for(b="set add save post open empty reset on off trigger ready setProduct".split(" ");a<b.length;a++)d[b[a]]=k(c,e,b[a]);a=0;for(b=["get","token","url","items"];a<b.length;a++)d[b[a]]=function(){};h.async=!0;h.src=g[f];n.parentNode.insertBefore(h,n);delete g[f];d(g);l[m]=c})(window,_affirm_config,"affirm","checkout","ui","script","ready");
|
18
14
|
|
@@ -23,9 +19,9 @@
|
|
23
19
|
total: <%= (@order.total * 100).to_i %>,
|
24
20
|
currency: "USD",
|
25
21
|
tax_amount: <%= (@order.additional_tax_total * 100).to_i %>,
|
26
|
-
|
22
|
+
order_id: "<%= @order.number %>",
|
27
23
|
discount_code: "<%= @order.coupon_code %>",
|
28
|
-
shipping_type: "<%= @order.shipments.first.shipping_method.name if @order.shipments %>",
|
24
|
+
shipping_type: "<%= @order.shipments.first.shipping_method.name if @order.shipments.exists? %>",
|
29
25
|
shipping_amount: <%= (@order.shipment_total * 100).to_i %>,
|
30
26
|
|
31
27
|
shipping: {
|
@@ -58,10 +54,14 @@
|
|
58
54
|
},
|
59
55
|
|
60
56
|
|
57
|
+
metadata: {
|
58
|
+
"platform_type": "Spree Commerce",
|
59
|
+
"platform_version": "<%= Spree.version %>",
|
60
|
+
"platform_affirm": "<%= Spree::Gateway::Affirm.version %>",
|
61
|
+
},
|
62
|
+
|
61
63
|
meta: {
|
62
64
|
source: {
|
63
|
-
client_name: "spree_affirm",
|
64
|
-
version: "<%= Spree::Gateway::Affirm.version %>",
|
65
65
|
data: {
|
66
66
|
<% if spree_current_user %>
|
67
67
|
order_count: "<%= spree_current_user.orders.complete.count %>",
|
@@ -73,7 +73,6 @@
|
|
73
73
|
|
74
74
|
<% end %>
|
75
75
|
is_logged_in: <%= !!spree_current_user %>,
|
76
|
-
spree_version: "<%= Spree.version %>"
|
77
76
|
}
|
78
77
|
}
|
79
78
|
},
|
@@ -123,28 +122,28 @@
|
|
123
122
|
affirm.ui.ready(function(){
|
124
123
|
$(function() {
|
125
124
|
|
125
|
+
/*****************************************************\
|
126
|
+
change the payment method name
|
127
|
+
\*****************************************************/
|
128
|
+
|
129
|
+
$( ".payment-option" ).each(function() {
|
130
|
+
|
131
|
+
if($( this )[0].innerText === "Affirm"){
|
132
|
+
|
133
|
+
$( this )[0].lastChild.data = "Affirm Monthly Payments";
|
134
|
+
}
|
135
|
+
});
|
136
|
+
|
126
137
|
/*****************************************************\
|
127
138
|
setup loading and cancel events for the form
|
128
139
|
\*****************************************************/
|
140
|
+
|
129
141
|
affirm.checkout.on("cancel", function(){
|
130
142
|
$("#checkout_form_payment input.disabled")
|
131
143
|
.attr("disabled", false)
|
132
144
|
.removeClass("disabled");
|
133
145
|
});
|
134
146
|
|
135
|
-
var button_text = $("#checkout_form_payment input").val();
|
136
|
-
|
137
|
-
$("#checkout_form_payment input[type='submit']").on("loading", function(){
|
138
|
-
button_text = $(this).val();
|
139
|
-
$(this).val("Loading...");
|
140
|
-
})
|
141
|
-
|
142
|
-
.on("done_loading", function(){
|
143
|
-
$(this).val(button_text);
|
144
|
-
});
|
145
|
-
|
146
|
-
|
147
|
-
|
148
147
|
/*****************************************************\
|
149
148
|
handle continue button clicks with .open()
|
150
149
|
\*****************************************************/
|
@@ -152,14 +151,12 @@
|
|
152
151
|
var checkedPaymentMethod = $('div[data-hook="checkout_payment_step"] input[type="radio"]:checked').val();
|
153
152
|
|
154
153
|
if (window.AffirmPaymentMethods[checkedPaymentMethod]) {
|
154
|
+
|
155
155
|
var $submit_button = $(this).find("input[type='submit']");
|
156
156
|
|
157
157
|
// update with checkout method details
|
158
158
|
affirm.checkout(window.AffirmPaymentMethods[checkedPaymentMethod]);
|
159
159
|
|
160
|
-
// show the loading message
|
161
|
-
$submit_button.trigger("loading");
|
162
|
-
|
163
160
|
// submit the checkout
|
164
161
|
affirm.checkout.open({
|
165
162
|
target: $submit_button
|
@@ -170,6 +167,15 @@
|
|
170
167
|
}
|
171
168
|
});
|
172
169
|
});
|
170
|
+
|
171
|
+
/*****************************************************\
|
172
|
+
remove the payment source empty box from UI
|
173
|
+
\*****************************************************/
|
174
|
+
$(document).on('click', '#checkout_form_payment'
|
175
|
+
, function (event) {
|
176
|
+
if($('div[data-hook="checkout_payment_step"] input[type="radio"]:checked')[0].parentNode.outerText === "Affirm Monthly Payments") $('.payment-sources').hide();
|
177
|
+
}
|
178
|
+
)
|
173
179
|
});
|
174
180
|
|
175
181
|
window.AffirmPaymentMethods = {};
|
@@ -182,9 +188,8 @@
|
|
182
188
|
clicked
|
183
189
|
\*****************************************************/
|
184
190
|
window.AffirmPaymentMethods["<%= payment_method.id %>"] = {
|
185
|
-
public_api_key: "<%= payment_method.preferred_api_key %>"
|
186
|
-
financial_product_key: "<%= payment_method.preferred_product_key %>"
|
191
|
+
public_api_key: "<%= payment_method.preferred_api_key %>"
|
187
192
|
};
|
188
|
-
|
189
193
|
}());
|
194
|
+
|
190
195
|
</script>
|
data/config/locales/en.yml
CHANGED
@@ -12,7 +12,6 @@ en:
|
|
12
12
|
"Quantity mismatch": "Quantity mismatch"
|
13
13
|
"Price mismatch": "Price mismatch"
|
14
14
|
"Billing email mismatch": "Billing email mismatch"
|
15
|
-
"Product key mismatch": "Product key mismatch"
|
16
15
|
"city mismatch": "city mismatch"
|
17
16
|
"street1 mismatch": "street1 mismatch"
|
18
17
|
"street2 mismatch": "street2 mismatch"
|
@@ -27,5 +26,4 @@ en:
|
|
27
26
|
billing_address: "billing address"
|
28
27
|
shipping_address: "shipping address"
|
29
28
|
billing_email: "email"
|
30
|
-
financial_product_key: "Affirm Financial Product"
|
31
29
|
|
@@ -62,8 +62,6 @@ def BASE_CHECKOUT_DETAILS
|
|
62
62
|
"misc_fee_amount"=> 0,
|
63
63
|
"shipping_type"=> "Free National UPS",
|
64
64
|
"config"=> {
|
65
|
-
"financial_product_key"=> "XXXXXXXXXXXXXXX",
|
66
|
-
"financial_product_type"=> "splitpay",
|
67
65
|
"required_billing_fields"=> [
|
68
66
|
"name",
|
69
67
|
"address",
|
@@ -82,9 +80,8 @@ FactoryGirl.define do
|
|
82
80
|
association(:order, factory: :order_with_line_items)
|
83
81
|
|
84
82
|
|
85
|
-
|
83
|
+
transient do
|
86
84
|
stub_details true
|
87
|
-
product_key_mismatch false
|
88
85
|
shipping_address_mismatch false
|
89
86
|
billing_address_mismatch false
|
90
87
|
alternate_billing_address_format false
|
@@ -101,11 +98,6 @@ FactoryGirl.define do
|
|
101
98
|
|
102
99
|
_details = BASE_CHECKOUT_DETAILS()
|
103
100
|
|
104
|
-
# product keys
|
105
|
-
unless evaluator.product_key_mismatch
|
106
|
-
_details['config']['financial_product_key'] = checkout.payment_method.preferred_product_key
|
107
|
-
end
|
108
|
-
|
109
101
|
# case mismatch
|
110
102
|
unless evaluator.full_name_case_mismatch
|
111
103
|
_details['billing']['name'] = {
|
data/lib/spree_affirm/version.rb
CHANGED
@@ -180,27 +180,6 @@ describe Spree::AffirmCheckout do
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
-
|
184
|
-
describe "check_matching_product_key" do
|
185
|
-
context "with a matching product key" do
|
186
|
-
it "does not set an error for the financial_product_key" do
|
187
|
-
valid_checkout.check_matching_product_key
|
188
|
-
expect(valid_checkout.errors[:financial_product_key]).to be_empty
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
|
193
|
-
context "with a mistmatched product key" do
|
194
|
-
it "adds an error for financial_product_key" do
|
195
|
-
_checkout = FactoryGirl.build(:affirm_checkout, product_key_mismatch: true)
|
196
|
-
_checkout.check_matching_product_key
|
197
|
-
expect(_checkout.errors[:financial_product_key]).not_to be_empty
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
|
203
|
-
|
204
183
|
describe "actions" do
|
205
184
|
|
206
185
|
describe "#actions" do
|
@@ -75,9 +75,6 @@ describe Spree::Gateway::Affirm do
|
|
75
75
|
expect(affirm_payment).to receive(:credit!).and_return false
|
76
76
|
_payment_amount = affirm_payment.credit_allowed
|
77
77
|
affirm_payment.payment_method.cancel affirm_payment.response_code
|
78
|
-
|
79
|
-
expect(affirm_payment.order.adjustments.count).to be > 0
|
80
|
-
expect(affirm_payment.order.adjustments.last.amount).to eq(-_payment_amount)
|
81
78
|
end
|
82
79
|
end
|
83
80
|
|
data/spree_affirm.gemspec
CHANGED
@@ -7,19 +7,19 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.name = 'spree_affirm'
|
8
8
|
s.version = SpreeAffirm::VERSION
|
9
9
|
s.summary = 'Affirm Spree Payment Gateway'
|
10
|
-
s.description = 'Affirm payment Gateway for
|
10
|
+
s.description = 'Affirm payment Gateway for Spree'
|
11
11
|
s.required_ruby_version = '>= 1.9.3'
|
12
12
|
|
13
|
-
s.author = '
|
14
|
-
s.email = '
|
15
|
-
s.homepage = 'http://www.
|
13
|
+
s.author = 'Affirm'
|
14
|
+
s.email = 'mts@affirm.com'
|
15
|
+
s.homepage = 'http://www.affirm.com'
|
16
16
|
|
17
17
|
s.files = `git ls-files`.split("\n")
|
18
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
19
|
s.require_path = 'lib'
|
20
20
|
s.requirements << 'none'
|
21
21
|
|
22
|
-
s.add_dependency 'spree_core', '>= 2.2.0'
|
22
|
+
s.add_dependency 'spree_core', '~> 2.2', '>= 2.2.0'
|
23
23
|
|
24
24
|
s.add_development_dependency 'factory_girl', '~> 4.2'
|
25
25
|
s.add_development_dependency 'ffaker', '~> 1.16'
|
metadata
CHANGED
@@ -1,120 +1,126 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_affirm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.30
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Affirm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spree_core
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.2'
|
20
|
+
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
22
|
version: 2.2.0
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- -
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.2'
|
30
|
+
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
32
|
version: 2.2.0
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: factory_girl
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - ~>
|
37
|
+
- - "~>"
|
32
38
|
- !ruby/object:Gem::Version
|
33
39
|
version: '4.2'
|
34
40
|
type: :development
|
35
41
|
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
|
-
- - ~>
|
44
|
+
- - "~>"
|
39
45
|
- !ruby/object:Gem::Version
|
40
46
|
version: '4.2'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: ffaker
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
|
-
- - ~>
|
51
|
+
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
53
|
version: '1.16'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
|
-
- - ~>
|
58
|
+
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
60
|
version: '1.16'
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: rspec-rails
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
58
64
|
requirements:
|
59
|
-
- - ~>
|
65
|
+
- - "~>"
|
60
66
|
- !ruby/object:Gem::Version
|
61
67
|
version: '2.13'
|
62
68
|
type: :development
|
63
69
|
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
|
-
- - ~>
|
72
|
+
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
74
|
version: '2.13'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
76
|
name: simplecov
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
72
78
|
requirements:
|
73
|
-
- - ~>
|
79
|
+
- - "~>"
|
74
80
|
- !ruby/object:Gem::Version
|
75
81
|
version: '0.9'
|
76
82
|
type: :development
|
77
83
|
prerelease: false
|
78
84
|
version_requirements: !ruby/object:Gem::Requirement
|
79
85
|
requirements:
|
80
|
-
- - ~>
|
86
|
+
- - "~>"
|
81
87
|
- !ruby/object:Gem::Version
|
82
88
|
version: '0.9'
|
83
89
|
- !ruby/object:Gem::Dependency
|
84
90
|
name: simplecov-rcov
|
85
91
|
requirement: !ruby/object:Gem::Requirement
|
86
92
|
requirements:
|
87
|
-
- - ~>
|
93
|
+
- - "~>"
|
88
94
|
- !ruby/object:Gem::Version
|
89
95
|
version: '0.2'
|
90
96
|
type: :development
|
91
97
|
prerelease: false
|
92
98
|
version_requirements: !ruby/object:Gem::Requirement
|
93
99
|
requirements:
|
94
|
-
- - ~>
|
100
|
+
- - "~>"
|
95
101
|
- !ruby/object:Gem::Version
|
96
102
|
version: '0.2'
|
97
103
|
- !ruby/object:Gem::Dependency
|
98
104
|
name: sqlite3
|
99
105
|
requirement: !ruby/object:Gem::Requirement
|
100
106
|
requirements:
|
101
|
-
- - ~>
|
107
|
+
- - "~>"
|
102
108
|
- !ruby/object:Gem::Version
|
103
109
|
version: '1.3'
|
104
110
|
type: :development
|
105
111
|
prerelease: false
|
106
112
|
version_requirements: !ruby/object:Gem::Requirement
|
107
113
|
requirements:
|
108
|
-
- - ~>
|
114
|
+
- - "~>"
|
109
115
|
- !ruby/object:Gem::Version
|
110
116
|
version: '1.3'
|
111
|
-
description: Affirm payment Gateway for
|
112
|
-
email:
|
117
|
+
description: Affirm payment Gateway for Spree
|
118
|
+
email: mts@affirm.com
|
113
119
|
executables: []
|
114
120
|
extensions: []
|
115
121
|
extra_rdoc_files: []
|
116
122
|
files:
|
117
|
-
- .gitignore
|
123
|
+
- ".gitignore"
|
118
124
|
- Gemfile
|
119
125
|
- LICENSE
|
120
126
|
- README.md
|
@@ -125,14 +131,12 @@ files:
|
|
125
131
|
- app/assets/stylesheets/spree/backend/spree_affirm.css
|
126
132
|
- app/assets/stylesheets/spree/frontend/spree_affirm.css
|
127
133
|
- app/controllers/spree/affirm_controller.rb
|
128
|
-
- app/models/affirm/address_validator.rb
|
129
134
|
- app/models/spree/affirm_checkout.rb
|
130
135
|
- app/models/spree/gateway/affirm.rb
|
131
136
|
- app/views/spree/admin/log_entries/_affirm.html.erb
|
132
137
|
- app/views/spree/admin/log_entries/index.html.erb
|
133
138
|
- app/views/spree/admin/payments/source_forms/_affirm.html.erb
|
134
139
|
- app/views/spree/admin/payments/source_views/_affirm.html.erb
|
135
|
-
- app/views/spree/checkout/affirm/_learn_more.html.erb
|
136
140
|
- app/views/spree/checkout/payment/_affirm.html.erb
|
137
141
|
- bin/rails
|
138
142
|
- config/locales/en.yml
|
@@ -154,7 +158,7 @@ files:
|
|
154
158
|
- spec/models/spree_gateway_affirm_spec.rb
|
155
159
|
- spec/spec_helper.rb
|
156
160
|
- spree_affirm.gemspec
|
157
|
-
homepage: http://www.
|
161
|
+
homepage: http://www.affirm.com
|
158
162
|
licenses: []
|
159
163
|
metadata: {}
|
160
164
|
post_install_message:
|
@@ -163,18 +167,17 @@ require_paths:
|
|
163
167
|
- lib
|
164
168
|
required_ruby_version: !ruby/object:Gem::Requirement
|
165
169
|
requirements:
|
166
|
-
- -
|
170
|
+
- - ">="
|
167
171
|
- !ruby/object:Gem::Version
|
168
172
|
version: 1.9.3
|
169
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
174
|
requirements:
|
171
|
-
- -
|
175
|
+
- - ">="
|
172
176
|
- !ruby/object:Gem::Version
|
173
177
|
version: '0'
|
174
178
|
requirements:
|
175
179
|
- none
|
176
|
-
|
177
|
-
rubygems_version: 2.2.2
|
180
|
+
rubygems_version: 3.1.2
|
178
181
|
signing_key:
|
179
182
|
specification_version: 4
|
180
183
|
summary: Affirm Spree Payment Gateway
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Affirm
|
2
|
-
class AddressValidator
|
3
|
-
def self.normalize_affirm_address(affirm_address_details)
|
4
|
-
_address_mapping = {
|
5
|
-
"city" => 'city',
|
6
|
-
"street1" => 'line1',
|
7
|
-
"street2" => 'line2',
|
8
|
-
"postal_code" => 'zipcode',
|
9
|
-
"region1_code" => 'state',
|
10
|
-
"country_code" => 'country'
|
11
|
-
}
|
12
|
-
|
13
|
-
_address_mapping.each do |key, mapped_key|
|
14
|
-
|
15
|
-
unless affirm_address_details[key].present?
|
16
|
-
affirm_address_details[key] = affirm_address_details[mapped_key]
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
affirm_address_details
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
File without changes
|