solidus_paypal_commerce_platform 0.2.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/CHANGELOG.md +88 -3
  4. data/LICENSE +1 -1
  5. data/README.md +4 -0
  6. data/app/controllers/solidus_paypal_commerce_platform/orders_controller.rb +2 -1
  7. data/app/decorators/models/solidus_paypal_commerce_platform/spree/address_decorator.rb +17 -0
  8. data/app/jobs/solidus_paypal_commerce_platform/webhook_job.rb +3 -3
  9. data/app/models/solidus_paypal_commerce_platform/payment_method.rb +4 -1
  10. data/app/models/solidus_paypal_commerce_platform/paypal_address.rb +19 -20
  11. data/app/models/solidus_paypal_commerce_platform/paypal_order.rb +29 -8
  12. data/app/models/solidus_paypal_commerce_platform/pricing_options.rb +1 -1
  13. data/app/models/solidus_paypal_commerce_platform/state_guesser.rb +1 -1
  14. data/bin/sandbox +1 -1
  15. data/lib/solidus_paypal_commerce_platform/configuration.rb +3 -3
  16. data/lib/solidus_paypal_commerce_platform/engine.rb +2 -1
  17. data/lib/solidus_paypal_commerce_platform/version.rb +1 -1
  18. data/lib/views/frontend/solidus_paypal_commerce_platform/shared/_javascript_sdk_tag.html.erb +3 -1
  19. data/solidus_paypal_commerce_platform.gemspec +5 -5
  20. data/spec/features/frontend/cart_spec.rb +6 -0
  21. data/spec/features/frontend/checkout_spec.rb +6 -0
  22. data/spec/features/frontend/product_spec.rb +6 -0
  23. data/spec/lib/solidus_paypal_commerce_platform/client_spec.rb +1 -1
  24. data/spec/lib/solidus_paypal_commerce_platform/configuration_spec.rb +4 -4
  25. data/spec/models/solidus_paypal_commerce_platform/payment_method_spec.rb +8 -0
  26. data/spec/models/solidus_paypal_commerce_platform/paypal_address_spec.rb +17 -5
  27. data/spec/models/solidus_paypal_commerce_platform/paypal_order_spec.rb +33 -0
  28. data/spec/requests/solidus_paypal_commerce_platform/orders_controller_spec.rb +2 -2
  29. data/spec/requests/solidus_paypal_commerce_platform/shipping_rates_controller_spec.rb +3 -3
  30. data/spec/requests/solidus_paypal_commerce_platform/wizard_controller_spec.rb +1 -1
  31. data/spec/spec_helper.rb +1 -1
  32. metadata +23 -15
  33. data/app/decorators/solidus_paypal_commerce_platform/remove_required_phone_from_address.rb +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e33941522d8f8b2364c0ff2d374034c9dd4fb1e097902945ef39646ba5c1010a
4
- data.tar.gz: 661106b06c08efb525dc3e869646f4ece38cabf4a92a895b923066f234d8dfd6
3
+ metadata.gz: f0a234ec6a201a2b7e7a4f9e3c65359c70acaea23995134f7de9513a96530fc4
4
+ data.tar.gz: b94786018f9da41a5e5915db8c87b87c2eaa767580e8739c11ae472fb248d782
5
5
  SHA512:
6
- metadata.gz: 007ff9cf231887d503172920a7585a832f3a109cab7557f72eaeb2f8493bc1c54dcac442ad2ba7c2c881b6bc71e7ac23dc5ece0a47290fc0af96d471812bb4b6
7
- data.tar.gz: 25e7205d4bfa71b754660dab04ca2f627bbbab92d7ee8a751243aeae13df318ebe017139a024484411921c94d92974a0690e862cfdcb16ff6a1f73ac1d57cc98
6
+ metadata.gz: 825f4bcff61bbb9ff666391607dc657383d67b2635454375bc12df1a8bef1c02e2cff334b0474ce53dd9d7e04c4d8885dcc9a85ccb729d31a641ab5b9ccaa84c
7
+ data.tar.gz: 7589bcb66e13a57e5154227ef9212b209177f1a3f76338c67c852ca837c9df60670e8ce1730153b7121db364034f191170f59d95a863b563663ba47fcfde6b35
data/.rubocop.yml CHANGED
@@ -43,6 +43,10 @@ RSpec/VerifiedDoubles:
43
43
  # Sometimes you really need an "anything" double
44
44
  IgnoreSymbolicNames: true
45
45
 
46
+ Rspec/Naming/VariableNumber:
47
+ # PayPal uses snake_case, we use normal_case ¯\_(ツ)_/¯
48
+ Enabled: false
49
+
46
50
  Style/FrozenStringLiteralComment:
47
51
  Exclude:
48
52
  - spec/**/*
data/CHANGELOG.md CHANGED
@@ -1,8 +1,62 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/tree/HEAD)
3
+ ## [v0.3.0](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/tree/v0.3.0) (2021-03-16)
4
4
 
5
- [Full Changelog](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/compare/v0.1.0...HEAD)
5
+ [Full Changelog](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/compare/v0.2.2...v0.3.0)
6
+
7
+ **Closed issues:**
8
+
9
+ - Prepare Solidus Paypal Commerce Platform for Solidus 3.0 [\#115](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/115)
10
+
11
+ **Merged pull requests:**
12
+
13
+ - Use new factories loading method [\#118](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/118) ([kennyadsl](https://github.com/kennyadsl))
14
+ - Update extension for Solidus 3.0 [\#117](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/117) ([seand7565](https://github.com/seand7565))
15
+
16
+ ## [v0.2.2](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/tree/v0.2.2) (2020-11-20)
17
+
18
+ [Full Changelog](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/compare/v0.2.1...v0.2.2)
19
+
20
+ **Implemented enhancements:**
21
+
22
+ - Make the PayPal messaging component a bit more modular [\#112](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/112)
23
+ - Implement and QA Paypal credit solutions [\#99](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/99)
24
+
25
+ **Closed issues:**
26
+
27
+ - Simulated Address Info in Live Order [\#104](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/104)
28
+
29
+ **Merged pull requests:**
30
+
31
+ - Relax SolidusWebhooks dependency [\#114](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/114) ([kennyadsl](https://github.com/kennyadsl))
32
+ - Add information about paypal credit messaging to readme [\#113](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/113) ([seand7565](https://github.com/seand7565))
33
+
34
+ ## [v0.2.1](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/tree/v0.2.1) (2020-11-09)
35
+
36
+ [Full Changelog](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/compare/v0.2.0...v0.2.1)
37
+
38
+ **Closed issues:**
39
+
40
+ - There was a problem connecting with paypal. [\#107](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/107)
41
+ - Bad Request \(400\) when opening PayPal Payment Popup \(eg clicking Pay with PayPal during checkout\) [\#103](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/103)
42
+
43
+ **Merged pull requests:**
44
+
45
+ - Move and rename address decorator [\#111](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/111) ([seand7565](https://github.com/seand7565))
46
+ - Constrain solidus\_support to 0.5.1 or greater [\#110](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/110) ([seand7565](https://github.com/seand7565))
47
+ - Add currency to PayPal SDK URL [\#108](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/108) ([seand7565](https://github.com/seand7565))
48
+ - Update specs to comply with new rubocop regulations [\#106](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/106) ([seand7565](https://github.com/seand7565))
49
+ - Add address only to initial PayPal request [\#105](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/105) ([seand7565](https://github.com/seand7565))
50
+
51
+ ## [v0.2.0](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/tree/v0.2.0) (2020-10-13)
52
+
53
+ [Full Changelog](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/compare/v0.1.0...v0.2.0)
54
+
55
+ **Closed issues:**
56
+
57
+ - README lists two different types of PayPal credentials [\#97](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/97)
58
+ - `paypal\_email\_confirmed` is not an actual preference [\#96](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/96)
59
+ - Make this extension the default option for Solidus [\#88](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/88)
6
60
 
7
61
  **Merged pull requests:**
8
62
 
@@ -21,7 +75,6 @@
21
75
  **Merged pull requests:**
22
76
 
23
77
  - Temporarily switch from apparition to cuprite [\#92](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/92) ([elia](https://github.com/elia))
24
- - Update links after moving the repo to solidusio-contrib [\#91](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/91) ([elia](https://github.com/elia))
25
78
  - Add a configurable state\_guesser class to guess states [\#90](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/90) ([seand7565](https://github.com/seand7565))
26
79
  - Add better error handling to button\_actions.js [\#89](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/89) ([seand7565](https://github.com/seand7565))
27
80
 
@@ -31,6 +84,8 @@
31
84
 
32
85
  **Implemented enhancements:**
33
86
 
87
+ - Frontend users should be able to check out using PayPal [\#6](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/6)
88
+ - Admin users should be able to style the PayPal buttons on the payment\_method show page [\#5](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/5)
34
89
  - Webhooks [\#83](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/83) ([elia](https://github.com/elia))
35
90
  - Display paypal email to customer on confirmation [\#54](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/54) ([seand7565](https://github.com/seand7565))
36
91
  - Use an env accessor to control live/sandbox urls and classes [\#31](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/31) ([elia](https://github.com/elia))
@@ -38,12 +93,42 @@
38
93
 
39
94
  **Fixed bugs:**
40
95
 
96
+ - Users can check out with invalid payment [\#19](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/19)
41
97
  - Have different nonce for every click of the wizard button [\#87](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/87) ([elia](https://github.com/elia))
42
98
  - Correctly communicate errors when updating shipping rates [\#86](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/86) ([elia](https://github.com/elia))
43
99
  - Add deface to deps [\#57](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/57) ([elia](https://github.com/elia))
44
100
 
101
+ **Closed issues:**
102
+
103
+ - Add something to the README about backend payments [\#75](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/75)
104
+ - Explore enabling the payment method by default [\#71](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/71)
105
+ - Explore subscribing to webhooks [\#70](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/70)
106
+ - We're using the wrong ID for paypal\_order\_id [\#69](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/69)
107
+ - Handle instrument declined errors [\#68](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/68)
108
+ - Extend lightbox during customer payment [\#63](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/63)
109
+ - Add this extension to demo store for integration team walkthrough [\#49](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/49)
110
+ - Store PayPal Debug ID [\#48](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/48)
111
+ - PayPal email address needs to be included on the confirm step [\#47](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/47)
112
+ - Digital goods should be set as not requiring shipment [\#46](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/46)
113
+ - Allow checkout on product/cart page to complete the order [\#44](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/44)
114
+ - PayPal uses different states than Solidus for some countries [\#38](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/38)
115
+ - Validate amount charged with PayPal [\#37](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/37)
116
+ - Allow order simulator to be a configurable class [\#36](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/36)
117
+ - Admin users have the option to edit payment amount [\#29](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/29)
118
+ - Add PayPal button to product page [\#27](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/27)
119
+ - Add PayPal button to cart page [\#26](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/26)
120
+ - Add `commit=false` to javascript SDK URL [\#18](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/18)
121
+ - Explore using Rails secrets to encode and decrypt PayPal client id and secret [\#17](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/17)
122
+ - Backend users should be able to checkout & admin payments [\#15](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/15)
123
+ - Change static sandbox URL and objects to dynamic [\#14](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/14)
124
+ - PayPal response address change [\#13](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/13)
125
+ - Ensure the email is verified before activating the payment method [\#9](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/9)
126
+ - Add a URL generator for the PayPal JS SDK [\#8](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/8)
127
+ - Allow users to onboard with PayPal [\#1](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/issues/1)
128
+
45
129
  **Merged pull requests:**
46
130
 
131
+ - Update links after moving the repo to solidusio-contrib [\#91](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/91) ([elia](https://github.com/elia))
47
132
  - Use live partner ids [\#85](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/85) ([elia](https://github.com/elia))
48
133
  - Update README to account for checkouts without a confirmation step [\#84](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/84) ([seand7565](https://github.com/seand7565))
49
134
  - Replace order simulator with something simpler [\#82](https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/pull/82) ([seand7565](https://github.com/seand7565))
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2020 Nebulab srls
1
+ Copyright (c) 2021 Nebulab srls
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
data/README.md CHANGED
@@ -71,6 +71,10 @@ When you return to your app, your payment method should be set up and ready to g
71
71
  A confirmed email is required to get paid by PayPal. You'll need to check `Paypal Email Confirmed` on your new
72
72
  payment method before being able to select `Available To Users`.
73
73
 
74
+ ### Messaging Component
75
+
76
+ PayPal offers a messaging component that displays credit messaging to the user. You can find more information [here.](https://www.paypal.com/us/webapps/mpp/on-site-messaging) This messaging is enabled by default on all pages that use the paypal payment buttons, but can be disabled via preferences. PayPal recommends that this messaging be displayed near product or order totals, so please keep that in mind during implementation.
77
+
74
78
  ## Wizards
75
79
 
76
80
  This gem adds support for payment method wizards to be set up. Payment wizards can be used to automatically set up
@@ -11,7 +11,8 @@ module SolidusPaypalCommercePlatform
11
11
 
12
12
  @order = ::Spree::Order.create!(
13
13
  user: try_spree_current_user,
14
- store: current_store
14
+ store: current_store,
15
+ currency: current_pricing_options.currency
15
16
  )
16
17
 
17
18
  if @order.contents.update_cart order_params
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusPaypalCommercePlatform
4
+ module Spree
5
+ module AddressDecorator
6
+ # PayPal doesn't use the phone number, so in cases where the user checks out via
7
+ # PayPal, this field will be unpopulated. If you want to require phone numbers,
8
+ # you'll need to turn off cart & product page displays on the payment method edit
9
+ # page.
10
+ def require_phone?
11
+ super && false
12
+ end
13
+
14
+ ::Spree::Address.prepend self
15
+ end
16
+ end
17
+ end
@@ -6,15 +6,15 @@ module SolidusPaypalCommercePlatform
6
6
  case payload["resource_type"]
7
7
  when "checkout-order"
8
8
  payment_source = PaymentSource.find_by!(paypal_order_id: payload.dig("resource", "id"))
9
- payment = Spree::Payment.where(source: payment_source).last!
9
+ payment = ::Spree::Payment.where(source: payment_source).last!
10
10
  payment.log_entries.create!(details: payload.to_yaml)
11
11
  when "capture"
12
12
  payment_source = PaymentSource.find_by!(capture_id: payload.dig("resource", "id"))
13
- payment = Spree::Payment.where(source: payment_source).last!
13
+ payment = ::Spree::Payment.where(source: payment_source).last!
14
14
  payment.log_entries.create!(details: payload.to_yaml)
15
15
  when "refund"
16
16
  payment_source = PaymentSource.find_by!(refund_id: payload.dig("resource", "id"))
17
- payment = Spree::Payment.where(source: payment_source).last!
17
+ payment = ::Spree::Payment.where(source: payment_source).last!
18
18
  payment.log_entries.create!(details: payload.to_yaml)
19
19
  end
20
20
  end
@@ -58,7 +58,7 @@ module SolidusPaypalCommercePlatform
58
58
  }
59
59
  end
60
60
 
61
- def javascript_sdk_url(order: nil)
61
+ def javascript_sdk_url(order: nil, currency: nil)
62
62
  # Both instance and class respond to checkout_steps.
63
63
  step_names = order ? order.checkout_steps : ::Spree::Order.checkout_steps.keys
64
64
 
@@ -69,8 +69,11 @@ module SolidusPaypalCommercePlatform
69
69
  intent: auto_capture ? "capture" : "authorize",
70
70
  commit: commit_immediately ? "false" : "true",
71
71
  components: options[:display_credit_messaging] ? "buttons,messages" : "buttons",
72
+ currency: currency
72
73
  }
73
74
 
75
+ parameters[:shipping_preference] = 'NO_SHIPPING' if step_names.exclude? 'delivery'
76
+
74
77
  "https://www.paypal.com/sdk/js?#{parameters.to_query}"
75
78
  end
76
79
  end
@@ -19,7 +19,7 @@ module SolidusPaypalCommercePlatform
19
19
  end
20
20
 
21
21
  def update(paypal_address)
22
- formatted_address = format_address(paypal_address)
22
+ formatted_address = address_attributes(paypal_address[:updated_address], paypal_address[:recipient])
23
23
  new_address = @order.ship_address.dup || ::Spree::Address.new
24
24
  new_address.assign_attributes(formatted_address)
25
25
 
@@ -51,36 +51,35 @@ module SolidusPaypalCommercePlatform
51
51
  end
52
52
 
53
53
  def format_simulated_address(paypal_address)
54
- country = ::Spree::Country.find_by(iso: paypal_address[:country_code])
55
- # Also adds fake information for a few fields, so validations can run
54
+ # Adds fake information for a few fields, so validations can run
55
+ paypal_address[:address_line_1] = "123 Fake St."
56
+
56
57
  ::Spree::Address.new(
57
- city: paypal_address[:city],
58
- state: find_state(paypal_address[:state], country),
59
- state_name: paypal_address[:state],
60
- zipcode: paypal_address[:postal_code],
61
- country: country,
62
- address1: "123 Fake St.",
63
- phone: "123456789",
64
- firstname: "Fake"
58
+ address_attributes(paypal_address, { name: { given_name: "Fake" } })
65
59
  )
66
60
  end
67
61
 
68
- def format_address(paypal_address)
69
- address = paypal_address[:updated_address]
70
- recipient = paypal_address[:recipient]
62
+ def address_attributes(address, recipient)
71
63
  country = ::Spree::Country.find_by(iso: address[:country_code])
72
64
 
73
- {
65
+ attributes = {
74
66
  address1: address[:address_line_1],
75
67
  address2: address[:address_line_2],
76
- state: find_state(address[:admin_area_1], country),
77
- state_name: address[:admin_area_1],
78
- city: address[:admin_area_2],
68
+ state: find_state(address[:admin_area_1] || address[:state], country),
69
+ state_name: address[:admin_area_1] || address[:state],
70
+ city: address[:admin_area_2] || address[:city],
79
71
  country: country,
80
72
  zipcode: address[:postal_code],
81
- firstname: recipient[:name][:given_name],
82
- lastname: recipient[:name][:surname]
83
73
  }
74
+
75
+ if SolidusSupport.combined_first_and_last_name_in_address?
76
+ attributes[:name] = "#{recipient[:name][:given_name]} #{recipient[:name][:surname]}"
77
+ else
78
+ attributes[:firstname] = recipient[:name][:given_name]
79
+ attributes[:lastname] = recipient[:name][:surname]
80
+ end
81
+
82
+ attributes
84
83
  end
85
84
  end
86
85
  end
@@ -18,7 +18,7 @@ module SolidusPaypalCommercePlatform
18
18
  {
19
19
  op: 'replace',
20
20
  path: '/purchase_units/@reference_id==\'default\'',
21
- value: purchase_units[0]
21
+ value: purchase_units(include_shipping_address: false)[0]
22
22
  }
23
23
  end
24
24
 
@@ -44,18 +44,27 @@ module SolidusPaypalCommercePlatform
44
44
  end
45
45
 
46
46
  def name(address)
47
- {
48
- given_name: address.firstname,
49
- surname: address.lastname
50
- }
47
+ if greater_than_2_10?
48
+ name = ::Spree::Address::Name.new @order.ship_address.name
49
+
50
+ {
51
+ given_name: name.first_name,
52
+ surname: name.last_name
53
+ }
54
+ else
55
+ {
56
+ given_name: address.firstname,
57
+ surname: address.lastname
58
+ }
59
+ end
51
60
  end
52
61
 
53
- def purchase_units
62
+ def purchase_units(include_shipping_address: true)
54
63
  [
55
64
  {
56
65
  amount: amount,
57
66
  items: line_items,
58
- shipping: (shipping_info if @order.ship_address)
67
+ shipping: (shipping_info if @order.ship_address && include_shipping_address)
59
68
  }
60
69
  ]
61
70
  end
@@ -63,13 +72,21 @@ module SolidusPaypalCommercePlatform
63
72
  def shipping_info
64
73
  {
65
74
  name: {
66
- full_name: @order.ship_address.full_name
75
+ full_name: full_name,
67
76
  },
68
77
  email_address: @order.email,
69
78
  address: get_address(@order.ship_address)
70
79
  }
71
80
  end
72
81
 
82
+ def full_name
83
+ if greater_than_2_10?
84
+ @order.ship_address.name
85
+ else
86
+ @order.ship_address.full_name
87
+ end
88
+ end
89
+
73
90
  def line_items
74
91
  @order.line_items.map{ |line_item|
75
92
  {
@@ -103,5 +120,9 @@ module SolidusPaypalCommercePlatform
103
120
  value: amount
104
121
  }
105
122
  end
123
+
124
+ def greater_than_2_10?
125
+ ::Spree.solidus_gem_version >= Gem::Version.new('2.11')
126
+ end
106
127
  end
107
128
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusPaypalCommercePlatform
4
- class PricingOptions < Spree::Variant::PricingOptions
4
+ class PricingOptions < ::Spree::Variant::PricingOptions
5
5
  def cache_key
6
6
  SolidusPaypalCommercePlatform::PaymentMethod.active.map(&:cache_key_with_version).sort + [super]
7
7
  end
@@ -22,7 +22,7 @@ module SolidusPaypalCommercePlatform
22
22
  end
23
23
 
24
24
  def spree_state(name)
25
- Spree::State.find_by(name: name)
25
+ ::Spree::State.find_by(name: name)
26
26
  end
27
27
  end
28
28
  end
data/bin/sandbox CHANGED
@@ -67,7 +67,7 @@ unbundled bundle install --gemfile Gemfile
67
67
 
68
68
  unbundled bundle exec rake db:drop db:create
69
69
 
70
- unbundled bundle exec rails generate spree:install \
70
+ unbundled bundle exec rails generate solidus:install \
71
71
  --auto-accept \
72
72
  --user_class=Spree::User \
73
73
  --enforce_available_locales=true \
@@ -39,7 +39,7 @@ module SolidusPaypalCommercePlatform
39
39
  end
40
40
 
41
41
  def default_env
42
- return ENV['PAYPAL_ENV'] if ENV['PAYPAL_ENV']
42
+ return ENV['PAYPAL_ENV'] if ENV['PAYPAL_ENV'] # rubocop:disable Rails/EnvironmentVariableAccess
43
43
 
44
44
  case Rails.env
45
45
  when 'production'
@@ -60,11 +60,11 @@ module SolidusPaypalCommercePlatform
60
60
  end
61
61
 
62
62
  def partner_id
63
- @partner_id ||= ENV['PAYPAL_PARTNER_ID'] || DEFAULT_PARTNER_ID[env.to_sym]
63
+ @partner_id ||= ENV['PAYPAL_PARTNER_ID'] || DEFAULT_PARTNER_ID[env.to_sym] # rubocop:disable Rails/EnvironmentVariableAccess
64
64
  end
65
65
 
66
66
  def partner_client_id
67
- @partner_client_id ||= ENV['PAYPAL_PARTNER_CLIENT_ID'] || DEFAULT_PARTNER_CLIENT_ID[env.to_sym]
67
+ @partner_client_id ||= ENV['PAYPAL_PARTNER_CLIENT_ID'] || DEFAULT_PARTNER_CLIENT_ID[env.to_sym] # rubocop:disable Rails/EnvironmentVariableAccess
68
68
  end
69
69
 
70
70
  def partner_code
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'deface'
4
- require 'spree/core'
4
+ require 'solidus_core'
5
5
  require 'solidus_paypal_commerce_platform'
6
6
  require 'solidus_webhooks'
7
+ require 'solidus_support'
7
8
 
8
9
  module SolidusPaypalCommercePlatform
9
10
  class Engine < Rails::Engine
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusPaypalCommercePlatform
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.2'
5
5
  end
@@ -1,4 +1,6 @@
1
+ <% currency = @order ? @order.currency : current_pricing_options.currency %>
2
+
1
3
  <script
2
- src="<%= payment_method.javascript_sdk_url(order: @order) %>"
4
+ src="<%= payment_method.javascript_sdk_url(order: @order, currency: currency) %>"
3
5
  data-partner-attribution-id="<%= SolidusPaypalCommercePlatform.config.partner_code %>">
4
6
  </script>
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.metadata['source_code_uri'] = 'https://github.com/solidusio-contrib/solidus_paypal_commerce_platform'
17
17
  spec.metadata['changelog_uri'] = 'https://github.com/solidusio-contrib/solidus_paypal_commerce_platform/releases'
18
18
 
19
- spec.required_ruby_version = Gem::Requirement.new('~> 2.5')
19
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.5')
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.
@@ -29,12 +29,12 @@ Gem::Specification.new do |spec|
29
29
  spec.require_paths = ["lib"]
30
30
 
31
31
  spec.add_dependency 'deface', '~> 1.5'
32
- spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 3']
33
- spec.add_dependency 'solidus_support', '~> 0.5'
34
- spec.add_dependency 'solidus_webhooks', '~> 0.2.0'
32
+ spec.add_dependency 'solidus_core', ['>= 2.0.0', '< 4']
33
+ spec.add_dependency 'solidus_support', [">= 0.8.0", "< 1"]
34
+ spec.add_dependency 'solidus_webhooks', '~> 0.2'
35
35
 
36
36
  spec.add_dependency 'paypal-checkout-sdk'
37
37
 
38
38
  spec.add_development_dependency 'cuprite'
39
- spec.add_development_dependency 'solidus_dev_support', '~> 2.1'
39
+ spec.add_development_dependency 'solidus_dev_support', '~> 2.5'
40
40
  end
@@ -27,6 +27,12 @@ RSpec.describe "Cart page" do
27
27
  expect(js_sdk_script_partner_id).to eq("Solidus_PCP_SP")
28
28
  end
29
29
 
30
+ it "generates a URL with the correct currency" do
31
+ allow(order).to receive(:currency).and_return "EUR"
32
+ visit '/cart'
33
+ expect(js_sdk_script_query).to include("currency=EUR")
34
+ end
35
+
30
36
  context "when auto-capture is set to true" do
31
37
  it "generates a url with intent capture" do
32
38
  paypal_payment_method.update(auto_capture: true)
@@ -28,6 +28,12 @@ RSpec.describe "Checkout" do
28
28
  expect(js_sdk_script_partner_id).to eq("Solidus_PCP_SP")
29
29
  end
30
30
 
31
+ it "generates a URL with the correct currency" do
32
+ allow(order).to receive(:currency).and_return "EUR"
33
+ visit '/checkout/payment'
34
+ expect(js_sdk_script_query).to include("currency=EUR")
35
+ end
36
+
31
37
  context "when auto-capture is set to true" do
32
38
  it "generates a url with intent capture" do
33
39
  paypal_payment_method.update(auto_capture: true)
@@ -23,6 +23,12 @@ RSpec.describe "Product page", js: true do
23
23
  expect(js_sdk_script_partner_id).to eq("Solidus_PCP_SP")
24
24
  end
25
25
 
26
+ it "generates a URL with the correct currency" do
27
+ allow_any_instance_of(SolidusPaypalCommercePlatform::PricingOptions).to receive(:currency).and_return "EUR"
28
+ visit "/products/#{product.slug}"
29
+ expect(js_sdk_script_query).to include("currency=EUR")
30
+ end
31
+
26
32
  context "when auto-capture is set to true" do
27
33
  it "generates a url with intent capture" do
28
34
  paypal_payment_method.update(auto_capture: true)
@@ -10,7 +10,7 @@ RSpec.describe SolidusPaypalCommercePlatform::Client do
10
10
  let(:status_code) { 201 }
11
11
 
12
12
  it 'forwards to the upstream client adding i18n response messages' do
13
- expect_any_instance_of(PayPal::PayPalHttpClient)
13
+ allow_any_instance_of(PayPal::PayPalHttpClient)
14
14
  .to receive(:execute).with(paypal_request).and_return(paypal_response)
15
15
 
16
16
  response = subject.execute_with_response(paypal_request)
@@ -12,16 +12,16 @@ RSpec.describe SolidusPaypalCommercePlatform::Configuration do
12
12
  it "falls back to Rails.env if ENV['PAYPAL_ENV'] is not set" do
13
13
  expect(ENV).to receive(:[]).with("PAYPAL_ENV").and_return(nil).at_least(:once)
14
14
 
15
- expect(Rails).to receive(:env).and_return("development".inquiry)
15
+ allow(Rails).to receive(:env).and_return("development".inquiry)
16
16
  expect(subject.default_env).to eq("sandbox")
17
17
 
18
- expect(Rails).to receive(:env).and_return("test".inquiry)
18
+ allow(Rails).to receive(:env).and_return("test".inquiry)
19
19
  expect(subject.default_env).to eq("sandbox")
20
20
 
21
- expect(Rails).to receive(:env).and_return("production".inquiry)
21
+ allow(Rails).to receive(:env).and_return("production".inquiry)
22
22
  expect(subject.default_env).to eq("live")
23
23
 
24
- expect(Rails).to receive(:env).and_return("staging".inquiry)
24
+ allow(Rails).to receive(:env).and_return("staging".inquiry)
25
25
  expect{ subject.default_env }.to raise_error(described_class::InvalidEnvironment)
26
26
  end
27
27
  end
@@ -93,6 +93,14 @@ RSpec.describe SolidusPaypalCommercePlatform::PaymentMethod, type: :model do
93
93
  end
94
94
  end
95
95
 
96
+ context 'when checkout_steps does not include "delivery"' do
97
+ let(:order) { instance_double(Spree::Order, checkout_steps: { "foo" => "bar" }) }
98
+
99
+ it 'disables autocommit' do
100
+ expect(url.query.split("&")).to include("shipping_preference=NO_SHIPPING")
101
+ end
102
+ end
103
+
96
104
  context 'when messaging is turned on' do
97
105
  let(:order) { instance_double(Spree::Order, checkout_steps: { "foo" => "bar" }) }
98
106
 
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  RSpec.describe SolidusPaypalCommercePlatform::PaypalAddress, type: :model do
4
4
  let(:order) { create(:order) }
5
5
  let(:original_address) { create(:address) }
6
- let(:address) { create(:address) }
6
+ let(:address) { create(:address, name_attributes) }
7
7
  let(:params) {
8
8
  {
9
9
  updated_address: {
@@ -16,8 +16,8 @@ RSpec.describe SolidusPaypalCommercePlatform::PaypalAddress, type: :model do
16
16
  },
17
17
  recipient: {
18
18
  name: {
19
- given_name: address.firstname,
20
- surname: address.lastname
19
+ given_name: "Alexander",
20
+ surname: "Hamilton"
21
21
  }
22
22
  }
23
23
  }
@@ -37,8 +37,12 @@ RSpec.describe SolidusPaypalCommercePlatform::PaypalAddress, type: :model do
37
37
  expect(subject.address2).to eq address.address2
38
38
  expect(subject.zipcode).to eq address.zipcode
39
39
  expect(subject.country).to eq address.country
40
- expect(subject.firstname).to eq address.firstname
41
- expect(subject.lastname).to eq address.lastname
40
+ if SolidusSupport.combined_first_and_last_name_in_address?
41
+ expect(subject.name).to eq address.name
42
+ else
43
+ expect(subject.firstname).to eq address.firstname
44
+ expect(subject.lastname).to eq address.lastname
45
+ end
42
46
  expect(subject.phone).to eq original_address.phone
43
47
  end
44
48
 
@@ -52,4 +56,12 @@ RSpec.describe SolidusPaypalCommercePlatform::PaypalAddress, type: :model do
52
56
  end
53
57
  end
54
58
  end
59
+
60
+ def name_attributes
61
+ if SolidusSupport.combined_first_and_last_name_in_address?
62
+ { name: "Alexander Hamilton" }
63
+ else
64
+ { firstname: "Alexander", lastname: "Hamilton" }
65
+ end
66
+ end
55
67
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusPaypalCommercePlatform::PaypalOrder, type: :model do
6
+ describe '#to_json' do
7
+ subject(:to_json) { described_class.new(order).to_json('intent') }
8
+
9
+ let(:order) { create(:order_ready_to_complete) }
10
+
11
+ it { expect { to_json }.not_to raise_error }
12
+
13
+ if Spree.solidus_gem_version >= Gem::Version.new('2.11')
14
+ it 'returns the name of the user' do
15
+ expect(to_json).to match hash_including(
16
+ purchase_units: array_including(
17
+ hash_including(shipping: hash_including(name: { full_name: 'John Von Doe' }))
18
+ ),
19
+ payer: hash_including(name: { given_name: 'John', surname: 'Von Doe' })
20
+ )
21
+ end
22
+ else
23
+ it 'returns the name and surname of the user' do
24
+ expect(to_json).to match hash_including(
25
+ purchase_units: array_including(
26
+ hash_including(shipping: hash_including(name: { full_name: 'John' }))
27
+ ),
28
+ payer: hash_including(name: { given_name: 'John', surname: nil })
29
+ )
30
+ end
31
+ end
32
+ end
33
+ end
@@ -15,7 +15,7 @@ RSpec.describe SolidusPaypalCommercePlatform::OrdersController, type: :request d
15
15
 
16
16
  get solidus_paypal_commerce_platform.verify_total_path, params: params
17
17
 
18
- expect(response).to have_http_status(200)
18
+ expect(response).to have_http_status(:ok)
19
19
  end
20
20
  end
21
21
 
@@ -29,7 +29,7 @@ RSpec.describe SolidusPaypalCommercePlatform::OrdersController, type: :request d
29
29
 
30
30
  get solidus_paypal_commerce_platform.verify_total_path, params: params
31
31
 
32
- expect(response).to have_http_status(400)
32
+ expect(response).to have_http_status(:bad_request)
33
33
  end
34
34
  end
35
35
  end
@@ -23,9 +23,9 @@ RSpec.describe SolidusPaypalCommercePlatform::ShippingRatesController, type: :re
23
23
  }
24
24
  end
25
25
 
26
- it "returns a paypal_order with the new address" do
27
- expect(response.body).to include new_address.state.abbr
28
- expect(response.body).not_to include order.ship_address.state.abbr
26
+ it "returns a paypal_order without the simulated address" do
27
+ expect(response.body).not_to include "admin_area_1\":\"#{new_address.state.abbr}\""
28
+ expect(response.body).not_to include "admin_area_1\":\"#{order.ship_address.state.abbr}\""
29
29
  end
30
30
 
31
31
  it "does not modify original address" do
@@ -38,7 +38,7 @@ RSpec.describe SolidusPaypalCommercePlatform::WizardController, type: :request d
38
38
 
39
39
  expect(payment_method.preferred_client_id).to eq("CLIENT-ID")
40
40
  expect(payment_method.preferred_client_secret).to eq("CLIENT-SECRET")
41
- expect(response).to have_http_status(201)
41
+ expect(response).to have_http_status(:created)
42
42
  end
43
43
  end
44
44
  end
data/spec/spec_helper.rb CHANGED
@@ -20,7 +20,7 @@ require 'spree/testing_support/order_walkthrough'
20
20
  Dir["#{__dir__}/support/**/*.rb"].sort.each { |f| require f }
21
21
 
22
22
  # Requires factories defined in lib/solidus_paypal_commerce_platform/testing_support/factories.rb
23
- require 'solidus_paypal_commerce_platform/testing_support/factories'
23
+ SolidusDevSupport::TestingSupport::Factories.load_for(SolidusPaypalCommercePlatform::Engine)
24
24
 
25
25
  RSpec.configure do |config|
26
26
  config.infer_spec_type_from_file_location!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_paypal_commerce_platform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Denny
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-10-13 00:00:00.000000000 Z
12
+ date: 2021-05-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: deface
@@ -34,7 +34,7 @@ dependencies:
34
34
  version: 2.0.0
35
35
  - - "<"
36
36
  - !ruby/object:Gem::Version
37
- version: '3'
37
+ version: '4'
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -44,35 +44,41 @@ dependencies:
44
44
  version: 2.0.0
45
45
  - - "<"
46
46
  - !ruby/object:Gem::Version
47
- version: '3'
47
+ version: '4'
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: solidus_support
50
50
  requirement: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0.5'
54
+ version: 0.8.0
55
+ - - "<"
56
+ - !ruby/object:Gem::Version
57
+ version: '1'
55
58
  type: :runtime
56
59
  prerelease: false
57
60
  version_requirements: !ruby/object:Gem::Requirement
58
61
  requirements:
59
- - - "~>"
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.8.0
65
+ - - "<"
60
66
  - !ruby/object:Gem::Version
61
- version: '0.5'
67
+ version: '1'
62
68
  - !ruby/object:Gem::Dependency
63
69
  name: solidus_webhooks
64
70
  requirement: !ruby/object:Gem::Requirement
65
71
  requirements:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: 0.2.0
74
+ version: '0.2'
69
75
  type: :runtime
70
76
  prerelease: false
71
77
  version_requirements: !ruby/object:Gem::Requirement
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: 0.2.0
81
+ version: '0.2'
76
82
  - !ruby/object:Gem::Dependency
77
83
  name: paypal-checkout-sdk
78
84
  requirement: !ruby/object:Gem::Requirement
@@ -107,14 +113,14 @@ dependencies:
107
113
  requirements:
108
114
  - - "~>"
109
115
  - !ruby/object:Gem::Version
110
- version: '2.1'
116
+ version: '2.5'
111
117
  type: :development
112
118
  prerelease: false
113
119
  version_requirements: !ruby/object:Gem::Requirement
114
120
  requirements:
115
121
  - - "~>"
116
122
  - !ruby/object:Gem::Version
117
- version: '2.1'
123
+ version: '2.5'
118
124
  description:
119
125
  email: contact@solidus.io
120
126
  executables: []
@@ -147,7 +153,7 @@ files:
147
153
  - app/controllers/solidus_paypal_commerce_platform/paypal_orders_controller.rb
148
154
  - app/controllers/solidus_paypal_commerce_platform/shipping_rates_controller.rb
149
155
  - app/controllers/solidus_paypal_commerce_platform/wizard_controller.rb
150
- - app/decorators/solidus_paypal_commerce_platform/remove_required_phone_from_address.rb
156
+ - app/decorators/models/solidus_paypal_commerce_platform/spree/address_decorator.rb
151
157
  - app/helpers/solidus_paypal_commerce_platform/button_options_helper.rb
152
158
  - app/jobs/solidus_paypal_commerce_platform/application_job.rb
153
159
  - app/jobs/solidus_paypal_commerce_platform/webhook_job.rb
@@ -220,6 +226,7 @@ files:
220
226
  - spec/models/solidus_paypal_commerce_platform/payment_method_spec.rb
221
227
  - spec/models/solidus_paypal_commerce_platform/payment_source_spec.rb
222
228
  - spec/models/solidus_paypal_commerce_platform/paypal_address_spec.rb
229
+ - spec/models/solidus_paypal_commerce_platform/paypal_order_spec.rb
223
230
  - spec/models/solidus_paypal_commerce_platform/state_guesser_spec.rb
224
231
  - spec/models/solidus_paypal_commerce_platform/wizard_spec.rb
225
232
  - spec/requests/solidus_paypal_commerce_platform/orders_controller_spec.rb
@@ -241,7 +248,7 @@ require_paths:
241
248
  - lib
242
249
  required_ruby_version: !ruby/object:Gem::Requirement
243
250
  requirements:
244
- - - "~>"
251
+ - - ">="
245
252
  - !ruby/object:Gem::Version
246
253
  version: '2.5'
247
254
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -250,7 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
250
257
  - !ruby/object:Gem::Version
251
258
  version: '0'
252
259
  requirements: []
253
- rubygems_version: 3.1.2
260
+ rubygems_version: 3.1.4
254
261
  signing_key:
255
262
  specification_version: 4
256
263
  summary: Integrate Solidus with Paypal Commerce Platform
@@ -273,6 +280,7 @@ test_files:
273
280
  - spec/models/solidus_paypal_commerce_platform/payment_method_spec.rb
274
281
  - spec/models/solidus_paypal_commerce_platform/payment_source_spec.rb
275
282
  - spec/models/solidus_paypal_commerce_platform/paypal_address_spec.rb
283
+ - spec/models/solidus_paypal_commerce_platform/paypal_order_spec.rb
276
284
  - spec/models/solidus_paypal_commerce_platform/state_guesser_spec.rb
277
285
  - spec/models/solidus_paypal_commerce_platform/wizard_spec.rb
278
286
  - spec/requests/solidus_paypal_commerce_platform/orders_controller_spec.rb
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RemoveRequiredPhoneFromAddress
4
- # PayPal doesn't use the phone number, so in cases where the user checks out via
5
- # PayPal, this field will be unpopulated. If you want to require phone numbers,
6
- # you'll need to turn off cart & product page displays on the payment method edit
7
- # page.
8
- def require_phone?
9
- super && false
10
- end
11
-
12
- ::Spree::Address.prepend self
13
- end