spree_braintree_vzero 3.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +15 -0
  3. data/.gitignore +19 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +63 -0
  6. data/Appraisals +45 -0
  7. data/CONTRIBUTING.md +28 -0
  8. data/Gemfile +14 -0
  9. data/LICENSE +26 -0
  10. data/README.md +83 -0
  11. data/Rakefile +21 -0
  12. data/app/assets/images/credit_cards/icons/jcb.png +0 -0
  13. data/app/assets/javascripts/spree/backend/payments.js +19 -0
  14. data/app/assets/javascripts/spree/backend/spree_braintree_vzero.js +81 -0
  15. data/app/assets/javascripts/spree/frontend/spree_braintree_vzero.js +68 -0
  16. data/app/assets/stylesheets/spree/backend/spree_braintree_vzero.css +5 -0
  17. data/app/controllers/spree/admin/payments_controller_decorator.rb +43 -0
  18. data/app/controllers/spree/api/v1/braintree_client_token_controller.rb +31 -0
  19. data/app/controllers/spree/checkout_controller_decorator.rb +38 -0
  20. data/app/controllers/spree/orders_controller_decorator.rb +62 -0
  21. data/app/controllers/spree/user_sessions_controller_decorator.rb +15 -0
  22. data/app/helpers/spree/admin/decorated_navigation_helper.rb +10 -0
  23. data/app/helpers/spree/admin/payment_methods_helper.rb +101 -0
  24. data/app/helpers/spree/braintree_helper.rb +27 -0
  25. data/app/models/braintree/successful_result_decorator.rb +21 -0
  26. data/app/models/spree/address_decorator.rb +18 -0
  27. data/app/models/spree/braintree_checkout.rb +105 -0
  28. data/app/models/spree/gateway/braintree_vzero_base.rb +168 -0
  29. data/app/models/spree/gateway/braintree_vzero_base/address.rb +33 -0
  30. data/app/models/spree/gateway/braintree_vzero_base/braintree_user.rb +25 -0
  31. data/app/models/spree/gateway/braintree_vzero_base/purchase_data.rb +48 -0
  32. data/app/models/spree/gateway/braintree_vzero_base/transaction.rb +39 -0
  33. data/app/models/spree/gateway/braintree_vzero_base/utils.rb +108 -0
  34. data/app/models/spree/gateway/braintree_vzero_drop_in_ui.rb +24 -0
  35. data/app/models/spree/gateway/braintree_vzero_hosted_fields.rb +28 -0
  36. data/app/models/spree/gateway/braintree_vzero_paypal_express.rb +36 -0
  37. data/app/models/spree/order_decorator.rb +153 -0
  38. data/app/models/spree/payment_decorator.rb +10 -0
  39. data/app/models/spree/payment_processing_decorator.rb +61 -0
  40. data/app/models/spree/preferences/preferable_decorator.rb +54 -0
  41. data/app/overrides/spree/admin/orders/customer_details/_form.rb +8 -0
  42. data/app/overrides/spree/admin/payment_methods/_form.rb +10 -0
  43. data/app/overrides/spree/admin/shared/_order_summary.rb +23 -0
  44. data/app/overrides/spree/admin/shared/_refunds.rb +13 -0
  45. data/app/overrides/spree/checkout/_new_user.rb +6 -0
  46. data/app/overrides/spree/checkout/_payment.rb +20 -0
  47. data/app/overrides/spree/checkout/registration.rb +6 -0
  48. data/app/overrides/spree/orders/edit.rb +6 -0
  49. data/app/overrides/spree/shared/_order_details.rb +13 -0
  50. data/app/overrides/spree/shared/_payment.rb +28 -0
  51. data/app/views/spree/admin/payment_methods/_braintree_vzero_form.html.erb +83 -0
  52. data/app/views/spree/admin/payments/source_forms/_braintree_vzero_dropin_ui.html.erb +1 -0
  53. data/app/views/spree/admin/payments/source_forms/_braintree_vzero_hosted_fields.html.erb +1 -0
  54. data/app/views/spree/admin/payments/source_forms/_braintree_vzero_paypal_express.html.erb +1 -0
  55. data/app/views/spree/admin/payments/source_forms/braintree_vzero/_payments.html.erb +87 -0
  56. data/app/views/spree/admin/payments/source_views/_braintree_vzero_dropin_ui.html.erb +1 -0
  57. data/app/views/spree/admin/payments/source_views/_braintree_vzero_hosted_fields.html.erb +1 -0
  58. data/app/views/spree/admin/payments/source_views/_braintree_vzero_paypal_express.html.erb +1 -0
  59. data/app/views/spree/admin/payments/source_views/braintree_vzero/_payment.html.erb +17 -0
  60. data/app/views/spree/braintree_vzero/_paypal_checkout.html.erb +87 -0
  61. data/app/views/spree/checkout/payment/_braintree_vzero_dropin_ui.html.erb +4 -0
  62. data/app/views/spree/checkout/payment/_braintree_vzero_hosted_fields.html.erb +4 -0
  63. data/app/views/spree/checkout/payment/_braintree_vzero_paypal_express.html.erb +4 -0
  64. data/app/views/spree/checkout/payment/braintree_vzero/_buttons.html.erb +11 -0
  65. data/app/views/spree/checkout/payment/braintree_vzero/_dropin_on_error_callback.js.erb +3 -0
  66. data/app/views/spree/checkout/payment/braintree_vzero/_dropin_on_ready_callback.js.erb +1 -0
  67. data/app/views/spree/checkout/payment/braintree_vzero/_hosted_fields_on_field_event_callback.js.erb +12 -0
  68. data/app/views/spree/checkout/payment/braintree_vzero/_hosted_fields_styles.js.erb +29 -0
  69. data/app/views/spree/checkout/payment/braintree_vzero/_payment.html.erb +84 -0
  70. data/app/views/spree/checkout/payment/braintree_vzero/_three_d_secure.html.erb +218 -0
  71. data/app/views/spree/shared/braintree_vzero/_dropin.js.erb +70 -0
  72. data/app/views/spree/shared/braintree_vzero/_hosted.js.erb +66 -0
  73. data/app/views/spree/shared/braintree_vzero/_paypal.js.erb +39 -0
  74. data/bin/rails +7 -0
  75. data/config/initializers/extend_spree_permitted_checkout_attributes.rb +5 -0
  76. data/config/initializers/prepend_helpers.rb +1 -0
  77. data/config/locales/en.yml +79 -0
  78. data/config/routes.rb +7 -0
  79. data/db/migrate/20150904143013_create_spree_braintree_checkouts.rb +9 -0
  80. data/db/migrate/20151002094655_add_braintree_id_to_spree_addresses.rb +5 -0
  81. data/db/migrate/20151018123907_add_braintree_token_and_nonce_to_spree_payments.rb +6 -0
  82. data/db/migrate/20151027135109_add_paypal_email_to_spree_braintree_checkout.rb +5 -0
  83. data/db/migrate/20151028095515_add_advanced_fraud_data_to_spree_braintree_checkout.rb +5 -0
  84. data/db/migrate/20151202095956_add_risk_id_and_risk_decision_to_spree_braintree_checkouts.rb +6 -0
  85. data/db/migrate/20151211100203_add_braintree_last_digits_and_braintree_card_type_to_spree_braintree_checkouts.rb +6 -0
  86. data/db/migrate/20160112153422_add_admin_payment_to_spree_braintree_checkout.rb +5 -0
  87. data/gemfiles/spree_3_5.gemfile +12 -0
  88. data/gemfiles/spree_3_5_spree_auth_devise.gemfile +13 -0
  89. data/gemfiles/spree_3_7.gemfile +12 -0
  90. data/gemfiles/spree_3_7_spree_auth_devise.gemfile +13 -0
  91. data/gemfiles/spree_4_0.gemfile +11 -0
  92. data/gemfiles/spree_4_0_spree_auth_devise.gemfile +12 -0
  93. data/gemfiles/spree_master.gemfile +11 -0
  94. data/gemfiles/spree_master_spree_auth_devise.gemfile +12 -0
  95. data/lib/generators/spree_braintree_vzero/install/install_generator.rb +34 -0
  96. data/lib/spree_braintree_vzero.rb +6 -0
  97. data/lib/spree_braintree_vzero/engine.rb +28 -0
  98. data/lib/spree_braintree_vzero/factories.rb +10 -0
  99. data/lib/spree_braintree_vzero/railtie.rb +8 -0
  100. data/lib/spree_braintree_vzero/version.rb +17 -0
  101. data/lib/tasks/spree_braintree_vzero.rake +6 -0
  102. data/spec/controllers/spree/api/v1/braintree_client_token_controller_spec.rb +49 -0
  103. data/spec/controllers/spree/checkout_controller_spec.rb +85 -0
  104. data/spec/controllers/spree/orders_controller_spec.rb +97 -0
  105. data/spec/factories/braintree_checkout_factory.rb +7 -0
  106. data/spec/factories/braintree_gateway_factory.rb +35 -0
  107. data/spec/factories/payment_factory_decorator.rb +28 -0
  108. data/spec/features/spree/admin/log_entries_spec.rb +63 -0
  109. data/spec/models/gateway/braintree_vzero_base/address_spec.rb +28 -0
  110. data/spec/models/gateway/braintree_vzero_base/purchase_data_spec.rb +57 -0
  111. data/spec/models/gateway/braintree_vzero_base_spec.rb +346 -0
  112. data/spec/models/gateway/braintree_vzero_dropin_ui_spec.rb +35 -0
  113. data/spec/models/gateway/braintree_vzero_hosted_fields_spec.rb +35 -0
  114. data/spec/models/spree/order_spec.rb +186 -0
  115. data/spec/spec_helper.rb +100 -0
  116. data/spec/support/vcr.rb +10 -0
  117. data/spec/vcr/Log_entries/with_a_failed_log_entry/shows_a_failed_attempt.yml +91 -0
  118. data/spec/vcr/Log_entries/with_a_successful_log_entry/shows_a_successful_attempt.yml +113 -0
  119. data/spec/vcr/Spree_Api_V1_BraintreeClientTokenController/POST_create/guest_checkout/returns_proper_json_data_when_gateway_not_specified.yml +90 -0
  120. data/spec/vcr/Spree_Api_V1_BraintreeClientTokenController/POST_create/guest_checkout/returns_proper_json_data_when_gateway_specified.yml +90 -0
  121. data/spec/vcr/Spree_Api_V1_BraintreeClientTokenController/POST_create/user_checkout/returns_proper_json_data_when_gateway_not_specified.yml +191 -0
  122. data/spec/vcr/Spree_Api_V1_BraintreeClientTokenController/POST_create/user_checkout/returns_proper_json_data_when_gateway_specified.yml +191 -0
  123. data/spec/vcr/Spree_CheckoutController/_update/braintree_payment/advanced_fraud_data_in_source_should_be_updated.yml +71 -0
  124. data/spec/vcr/Spree_CheckoutController/_update/braintree_payment/when_token_credit_card_data_in_source_should_be_updated_from_Braintree_Vault.yml +139 -0
  125. data/spec/vcr/Spree_CheckoutController/_update/braintree_paypal_express_payment/amount_in_payment_should_be_updated.yml +280 -0
  126. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_capture/captures_authorized_amount/updates_Payment_state.yml +206 -0
  127. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_credit/with_refundable_state/should_be_a_success.yml +211 -0
  128. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_credit/with_unrefundable_state/should_not_be_a_success.yml +177 -0
  129. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/data_from_admin_panel/should_include_only_essential_data.yml +78 -0
  130. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/does_not_store_Transaction_in_Vault_by_default.yml +111 -0
  131. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/returns_false_with_invalid_nonce.yml +88 -0
  132. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/returns_false_with_invalid_token.yml +88 -0
  133. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/returns_success_with_valid_token.yml +113 -0
  134. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/returns_suceess_with_valid_nonce.yml +111 -0
  135. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/using_Vault/saves_Braintree_Address_id_to_Spree_Address_when_address_is_being_saved.yml +130 -0
  136. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/using_Vault/saves_unique_Braintree_Addresses_ids.yml +143 -0
  137. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/using_Vault/sends_empty_address_id_when_address_is_already_in_vault.yml +553 -0
  138. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/using_Vault/stores_Transaction.yml +181 -0
  139. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/with_3DSecure_option_turned_on/performs_3DSecure_check.yml +112 -0
  140. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/with_3DSecure_option_turned_on/returns_error.yml +112 -0
  141. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/with_advanced_fraud_tool_enabled/returns_fraud_data.yml +111 -0
  142. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_purchase/with_advanced_fraud_tool_enabled/returns_success.yml +111 -0
  143. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_settle/settles_authorized_amount/does_not_update_Order_payment_state.yml +204 -0
  144. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_settle/settles_authorized_amount/prepares_Checkout_for_status_updating.yml +204 -0
  145. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_settle/settles_authorized_amount/submits_Transaction_for_settlement.yml +377 -0
  146. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_settle/settles_authorized_amount/updates_Payment_state.yml +203 -0
  147. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_update_states/does_not_update_completed_Checkout_on_subsequent_runs.yml +202 -0
  148. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_update_states/updates_Order_payment_state_when_Checkout_is_updated.yml +202 -0
  149. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_update_states/updates_Payment_state_when_Checkout_is_updated.yml +202 -0
  150. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_update_states/updates_payment_State.yml +202 -0
  151. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_void/with_unvoidable_state/should_not_change_payment_source_state.yml +178 -0
  152. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/_void/with_voidable_state/should_change_payment_source_state_to_voided.yml +199 -0
  153. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/generates_token_for_User_registered_in_Braintree.yml +356 -0
  154. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/generates_token_for_new_User.yml +189 -0
  155. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/valid_credentials/generates_token_without_User.yml +89 -0
  156. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase/with_invalid_credentials/raises_Braintree_error.yml +62 -0
  157. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase_Address/_create/creates_Braintree_Address.yml +84 -0
  158. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase_Address/_create/deletes_Braintree_Address.yml +141 -0
  159. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase_Address/_create/finds_Braintree_Address.yml +148 -0
  160. data/spec/vcr/Spree_Gateway_BraintreeVzeroBase_Address/_create/updates_Braintree_Address.yml +154 -0
  161. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/with_auto_capture/should_complete_payment.yml +116 -0
  162. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/with_auto_capture/should_update_payment_s_response_code.yml +111 -0
  163. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/with_auto_capture/should_update_payment_s_source_state_and_transaction_id.yml +111 -0
  164. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/without_auto_capture/should_pend_payment.yml +111 -0
  165. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/without_auto_capture/should_update_payment_s_response_code.yml +111 -0
  166. data/spec/vcr/Spree_Order/complete_with_braintree_vzero_standard_payment/without_auto_capture/should_update_payment_s_source_state_and_transaction_id.yml +110 -0
  167. data/spree_braintree_vzero.gemspec +52 -0
  168. data/vendor/assets/javascripts/maskedinput/jquery.maskedinput.min.js +7 -0
  169. metadata +643 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 771cd46e87b5da70e1d9145ea38a084154a2329002598538b01da3f116409526
4
+ data.tar.gz: 84ab1f12fd88cce62738419cc2de7cde03f73c1999d1b4b26c8160ce41fba489
5
+ SHA512:
6
+ metadata.gz: 177d2a5421ae0e22794b8b8e5333b0ee0788f2f97654ee9f48c2571a6dcb07c3ee423be13f0ca84a624d8cc7edf0012fa2e6ac0ec5577632b2efacd4045ea63a
7
+ data.tar.gz: e10a7db15dfa14c87648c1e8b26954442dd3471456bd25418f81d2fb5c0db72f7bc1557cd1c2e2e904eb997092958188182200e2148e54a4b2974e39a44114e5
@@ -0,0 +1,15 @@
1
+ ---
2
+ engines:
3
+ rubocop:
4
+ enabled: true
5
+ ratings:
6
+ paths:
7
+ - "**.rb"
8
+ exclude_paths:
9
+ - config/**/*
10
+ - db/**/*
11
+ - spec/**/*
12
+ - vendor/**/*
13
+ - bin/*
14
+ - Gemfile
15
+ - Rakefile
@@ -0,0 +1,19 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ .idea
6
+ .project
7
+ .sass-cache
8
+ coverage
9
+ Gemfile.lock
10
+ tmp
11
+ nbproject
12
+ pkg
13
+ *.swp
14
+ spec/dummy
15
+ .pt
16
+ .ruby-gemset
17
+ .ruby-version
18
+ gemfiles/*.gemfile.lock
19
+ .byebug_history
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,63 @@
1
+ sudo: required
2
+ dist: trusty
3
+
4
+ language: ruby
5
+
6
+ env:
7
+ - DB=postgres
8
+ - DB=mysql
9
+
10
+ gemfile:
11
+ - gemfiles/spree_3_5.gemfile
12
+ - gemfiles/spree_3_5_spree_auth_devise.gemfile
13
+ - gemfiles/spree_3_7.gemfile
14
+ - gemfiles/spree_3_7_spree_auth_devise.gemfile
15
+ - gemfiles/spree_4_0.gemfile
16
+ - gemfiles/spree_4_0_spree_auth_devise.gemfile
17
+ - gemfiles/spree_master.gemfile
18
+ - gemfiles/spree_master_spree_auth_devise.gemfile
19
+
20
+ script:
21
+ - bundle exec rake test_app
22
+ - bundle exec rake spec
23
+ - bundle exec codeclimate-test-reporter
24
+
25
+ rvm:
26
+ - 2.3.8
27
+ - 2.4.4
28
+ - 2.5.1
29
+
30
+ matrix:
31
+ allow_failures:
32
+ - gemfile: gemfiles/spree_master.gemfile
33
+ - gemfile: gemfiles/spree_master_spree_auth_devise.gemfile
34
+ exclude:
35
+ - rvm: 2.3.8
36
+ gemfile: gemfiles/spree_4_0.gemfile
37
+ - rvm: 2.3.8
38
+ gemfile: gemfiles/spree_4_0_spree_auth_devise.gemfile
39
+ - rvm: 2.3.8
40
+ gemfile: gemfiles/spree_master.gemfile
41
+ - rvm: 2.3.8
42
+ gemfile: gemfiles/spree_master_spree_auth_devise.gemfile
43
+ - rvm: 2.4.4
44
+ gemfile: gemfiles/spree_4_0.gemfile
45
+ - rvm: 2.4.4
46
+ gemfile: gemfiles/spree_4_0_spree_auth_devise.gemfile
47
+ - rvm: 2.4.4
48
+ gemfile: gemfiles/spree_master.gemfile
49
+ - rvm: 2.4.4
50
+ gemfile: gemfiles/spree_master_spree_auth_devise.gemfile
51
+ - rvm: 2.5.1
52
+ gemfile: gemfiles/spree_3_5.gemfile
53
+ - rvm: 2.5.1
54
+ gemfile: gemfiles/spree_3_5_spree_auth_devise.gemfile
55
+
56
+
57
+ addons:
58
+ apt:
59
+ packages:
60
+ - mysql-server-5.6
61
+ - mysql-client-core-5.6
62
+ - mysql-client-5.6
63
+ postgresql: 9.4
@@ -0,0 +1,45 @@
1
+ appraise 'spree-3-5' do
2
+ ENV['WITHOUT_SPREE_AUTH_DEVISE'] = 'true'
3
+
4
+ gem 'spree', '~> 3.5.0'
5
+ end
6
+
7
+ appraise 'spree-3-5-spree-auth-devise' do
8
+ gem 'spree', '~> 3.5.0'
9
+ gem 'spree_auth_devise', '~> 3.3.0'
10
+ end
11
+
12
+ appraise 'spree-3-7' do
13
+ ENV['WITHOUT_SPREE_AUTH_DEVISE'] = 'true'
14
+
15
+ gem 'spree', '~> 3.7.1'
16
+ end
17
+
18
+ appraise 'spree-3-7-spree-auth-devise' do
19
+ gem 'spree', '~> 3.7.1'
20
+ gem 'spree_auth_devise', '~> 3.3.0'
21
+ end
22
+
23
+ appraise 'spree-4-0' do
24
+ ENV['WITHOUT_SPREE_AUTH_DEVISE'] = 'true'
25
+
26
+ gem 'spree', '~> 4.0.0'
27
+ end
28
+
29
+ appraise 'spree-4-0-spree-auth-devise' do
30
+ gem 'spree', '~> 4.0.0'
31
+ gem 'spree_auth_devise', '~> 4.0.0'
32
+ end
33
+
34
+ appraise 'spree-master' do
35
+ ENV['WITHOUT_SPREE_AUTH_DEVISE'] = 'true'
36
+
37
+ gem 'spree', github: 'spree/spree', branch: 'master'
38
+ gem 'rails-controller-testing'
39
+ end
40
+
41
+ appraise 'spree-master-spree-auth-devise' do
42
+ gem 'spree', github: 'spree/spree', branch: 'master'
43
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
44
+ gem 'rails-controller-testing'
45
+ end
@@ -0,0 +1,28 @@
1
+ # Contributing
2
+
3
+ In the spirit of [free software][1], **everyone** is encouraged to help improve this project.
4
+
5
+ Here are some ways *you* can contribute:
6
+
7
+ * by using prerelease versions
8
+ * by reporting [bugs][2]
9
+ * by suggesting new features
10
+ * by writing or editing documentation
11
+ * by writing specifications
12
+ * by writing code (*no patch is too small*: fix typos, add comments, clean up inconsistent whitespace)
13
+ * by refactoring code
14
+ * by resolving [issues][2]
15
+ * by reviewing patches
16
+
17
+ Starting point:
18
+
19
+ * Fork the repo
20
+ * Clone your repo
21
+ * Run `bundle install`
22
+ * Run `bundle exec rake test_app` to create the test application in `spec/dummy`
23
+ * Make your changes
24
+ * Ensure specs pass by running `bundle exec rspec spec`
25
+ * Submit your pull request
26
+
27
+ [1]: http://www.fsf.org/licensing/essays/free-sw.html
28
+ [2]: https://github.com/spark-solutions/spree_braintree_vzero/issues
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source 'https://rubygems.org'
2
+ gem 'spree', github: 'spree/spree', branch: 'master'
3
+
4
+ # Provides basic authentication functionality for testing parts of your engine
5
+ unless ENV['WITHOUT_SPREE_AUTH_DEVISE'] == 'true'
6
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
7
+ end
8
+
9
+ gem 'pg'
10
+ gem 'mysql2'
11
+ gem 'webmock', '>= 2.3.1'
12
+ gem 'rails-controller-testing'
13
+
14
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2015-2019 Spark Solutions Sp. z o.o.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
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.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,83 @@
1
+ # Braintree v.zero extension for Spree Commerce
2
+
3
+ [![Build Status](https://travis-ci.org/spree-contrib/spree_braintree_vzero.svg?branch=master)](https://travis-ci.org/spree-contrib/spree_braintree_vzero) [![Code Climate](https://codeclimate.com/repos/560308aa6956801375000a4e/badges/9874199a656054d613cd/gpa.svg)](https://codeclimate.com/repos/560308aa6956801375000a4e/feed)
4
+
5
+ This is the official Braintree v.zero extension for [Spree](https://spreecommerce.org). It supports:
6
+ * [Braintree Hosted Fields](https://github.com/spree-contrib/spree_braintree_vzero/wiki/1.-Hosted-Fields) - style the credit card form to match your UI with full PCI compliance
7
+ * [PayPal Express Checkout](https://github.com/spree-contrib/spree_braintree_vzero/wiki/2.-PayPal-Express) - the fastest way for buyers to pay with PayPal - available on Spree for the first time
8
+ * [Braintree Drop-in UI](http://github.com/spree-contrib/spree_braintree_vzero/wiki/3.-Drop-in-UI) - start accepting payments ASAP
9
+
10
+ Behind-the-scenes, this extension uses [Braintree Ruby SDK](https://github.com/braintree/braintree_ruby).
11
+
12
+
13
+ ## Installation
14
+
15
+ 1. Add this extension to your Gemfile with this line:
16
+
17
+ #### Spree >= 3.1
18
+
19
+ ```ruby
20
+ gem 'spree_braintree_vzero', '~> 3.5'
21
+ ```
22
+
23
+ #### Spree 3.0 and Spree 2.x
24
+
25
+ ```ruby
26
+ gem 'spree_braintree_vzero', github: 'spree-contrib/spree_braintree_vzero', branch: 'X-X-stable'
27
+ ```
28
+
29
+ The `branch` option is important: it must match the version of Spree you're using.
30
+ For example, use `3-0-stable` if you're using Spree `3-0-stable` or any `3.0.x` version.
31
+
32
+ 2. Install the gem using Bundler:
33
+ ```ruby
34
+ bundle install
35
+ ```
36
+
37
+ 3. Copy & run migrations
38
+ ```ruby
39
+ bundle exec rails g spree_braintree_vzero:install
40
+ ```
41
+
42
+ 4. Restart your server
43
+
44
+ If your server was running, restart it so that it can find the assets properly.
45
+
46
+
47
+
48
+ ## Heroku installation (optional)
49
+
50
+ Additional to migrations the gem adds a cron task (via the [Whenever gem](https://github.com/javan/whenever)) which is needed for updating transaction states from _submited for settlement_ to _settled_ ([Braintree v.zero transaction states](https://developers.braintreepayments.com/guides/transactions/ruby#status)). To run on Heroku you have to add a task to [Heroku Scheduler](https://devcenter.heroku.com/articles/scheduler):
51
+
52
+ ```
53
+ rake spree_braintree_vzero:update_states
54
+ ```
55
+
56
+ Recommended frequency is every 6 hours.
57
+
58
+
59
+ ## Contributing
60
+
61
+ If you'd like to contribute, please take a look at the
62
+ [instructions](CONTRIBUTING.md) for installing dependencies and crafting a good
63
+ pull request.
64
+
65
+ ## License
66
+
67
+ Spree Braintree V.zero is copyright © 2015-2020
68
+ [Spark Solutions Sp. z o.o.][spark]. It is free software,
69
+ and may be redistributed under the terms specified in the
70
+ [LICENCE](LICENSE) file.
71
+
72
+ [LICENSE]: https://github.com/spark-solutions/spree_braintree_vzero/blob/master/LICENSE
73
+
74
+ ## About Spark Solutions
75
+ [![Spark Solutions](http://sparksolutions.co/wp-content/uploads/2015/01/logo-ss-tr-221x100.png)][spark]
76
+
77
+ Spree Braintree V.zero is maintained by [Spark Solutions Sp. z o.o.](http://sparksolutions.co?utm_source=github) and funded by [PayPal, Inc.](http://paypal.com)
78
+ The names and logos are trademarks of PayPal, inc.
79
+
80
+ We are passionate about open source software.
81
+ We are [available for hire][spark].
82
+
83
+ [spark]:http://sparksolutions.co?utm_source=github
@@ -0,0 +1,21 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ require 'spree/testing_support/extension_rake'
6
+
7
+ RSpec::Core::RakeTask.new
8
+
9
+ task :default do
10
+ if Dir['spec/dummy'].empty?
11
+ Rake::Task[:test_app].invoke
12
+ Dir.chdir('../../')
13
+ end
14
+ Rake::Task[:spec].invoke
15
+ end
16
+
17
+ desc 'Generates a dummy app for testing'
18
+ task :test_app do
19
+ ENV['LIB_NAME'] = 'spree_braintree_vzero'
20
+ Rake::Task['extension:test_app'].invoke
21
+ end
@@ -0,0 +1,19 @@
1
+ $(function() {
2
+ var SpreePayments = {
3
+ init: function() {
4
+ this.applyMaskOnDescriptorName()
5
+ this.toggleAdvancedPreferences()
6
+ },
7
+ applyMaskOnDescriptorName: function() {
8
+ $('[id*="_preferred_descriptor_name"]').mask('***/*?*****************')
9
+ },
10
+ toggleAdvancedPreferences: function() {
11
+ $('#advanced-preferences-heading').on('click', function() {
12
+ $('#advanced-preferences').slideToggle()
13
+ $('#advanced-preferences').toggleClass('collapsed')
14
+ $('span.icon', $(this)).toggleClass('icon-chevron-down')
15
+ })
16
+ }
17
+ }
18
+ SpreePayments.init()
19
+ })
@@ -0,0 +1,81 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/backend/all.js'
3
+ //= require maskedinput/jquery.maskedinput.min
4
+ //= require spree/backend/payments
5
+
6
+ SpreeBraintreeVzero = {
7
+ updateSaveAndContinueVisibility: function() {
8
+ if (this.isButtonHidden()) {
9
+ $(this).trigger('hideSaveAndContinue')
10
+ } else {
11
+ $(this).trigger('showSaveAndContinue')
12
+ }
13
+ },
14
+ isButtonHidden: function () {
15
+ if(this.paypal) return false;
16
+ paymentMethod = this.checkedPaymentMethod();
17
+ return (!$('#use_existing_card_yes:checked').length && SpreeBraintreeVzero.paymentMethodID && paymentMethod.val() == SpreeBraintreeVzero.paymentMethodID);
18
+ },
19
+ checkedPaymentMethod: function() {
20
+ return $('form#new_payment input[type="radio"][name="payment[payment_method_id]"]:checked');
21
+ },
22
+ hideSaveAndContinue: function() {
23
+ $("[data-hook=buttons]").hide();
24
+ $(".new-braintree-payment-method").show();
25
+ $(".show-new-payment").hide();
26
+ },
27
+ showSaveAndContinue: function() {
28
+ $("[data-hook=buttons]").show();
29
+ $(".new-braintree-payment-method").hide();
30
+ $(".show-new-payment").show();
31
+ },
32
+ setSaveAndContinueVisibility: function() {
33
+ if($('#saved_payment_methods_for_' + SpreeBraintreeVzero.paymentMethodID).val())
34
+ SpreeBraintreeVzero.showSaveAndContinue();
35
+ else
36
+ SpreeBraintreeVzero.updateSaveAndContinueVisibility();
37
+ },
38
+ enableSubmitButton: function() {
39
+ $('.braintree-submit:disabled').attr('disabled', false).removeClass('disabled').addClass('primary');
40
+ },
41
+ setPaypalButtonDispay: function() {
42
+ submitButton = $('button[type="submit"]:not(.braintree-submit)');
43
+ paymentMethod = this.checkedPaymentMethod();
44
+ submitButton.attr('disabled', false);
45
+ if(!SpreeBraintreeVzero.paymentMethodID || (paymentMethod.val() != SpreeBraintreeVzero.paymentMethodID))
46
+ return;
47
+ if(SpreeBraintreeVzero.paypal && SpreeBraintreeVzero.paypal_empty)
48
+ submitButton.attr('disabled', true);
49
+ }
50
+ }
51
+
52
+ $(document).ready(function() {
53
+ SpreeBraintreeVzero.checkedPaymentMethod().trigger('click');
54
+ paymentMethods = $('form#new_payment input[type="radio"]').click(function (e) {
55
+ SpreeBraintreeVzero.setSaveAndContinueVisibility();
56
+ SpreeBraintreeVzero.setPaypalButtonDispay();
57
+ });
58
+ $('.saved-payment-methods').change(function (e) {
59
+ if($(this).val())
60
+ SpreeBraintreeVzero.showSaveAndContinue();
61
+ else {
62
+ if(!SpreeBraintreeVzero.paypal)
63
+ SpreeBraintreeVzero.hideSaveAndContinue();
64
+ }
65
+ });
66
+ $('#show-new-payment').click(function (e) {
67
+ e.preventDefault();
68
+ $('#saved_payment_methods_for_' + SpreeBraintreeVzero.paymentMethodID).val('')
69
+ SpreeBraintreeVzero.updateSaveAndContinueVisibility();
70
+ });
71
+ $('button[name="button"]:not(.braintree-submit)').click(function (e) {
72
+ if($('form#new_payment').length) {
73
+ e.preventDefault();
74
+ token = $('#saved_payment_methods_for_' + SpreeBraintreeVzero.paymentMethodID).val()
75
+ if(token)
76
+ $('form#new_payment').append("<input type='hidden' name='payment_method_token]' value=" + token + ">");
77
+ $('form#new_payment').submit();
78
+ }
79
+ });
80
+ SpreeBraintreeVzero.setSaveAndContinueVisibility();
81
+ })
@@ -0,0 +1,68 @@
1
+ //= require spree/frontend
2
+
3
+ SpreeBraintreeVzero = {
4
+ updateSaveAndContinueVisibility: function() {
5
+ if (this.isButtonHidden()) {
6
+ $(this).trigger('hideSaveAndContinue')
7
+ } else {
8
+ $(this).trigger('showSaveAndContinue')
9
+ }
10
+ },
11
+ isButtonHidden: function () {
12
+ paymentMethod = this.checkedPaymentMethod();
13
+ return (!$('#use_existing_card_yes:checked').length && SpreeBraintreeVzero.paymentMethodID && paymentMethod.val() == SpreeBraintreeVzero.paymentMethodID);
14
+ },
15
+ checkedPaymentMethod: function() {
16
+ return $('div[data-hook="checkout_payment_step"] input[type="radio"][name="order[payments_attributes][][payment_method_id]"]:checked');
17
+ },
18
+ hideSaveAndContinue: function() {
19
+ this.enableSubmitButton();
20
+ if(!$('div[data-hook="checkout_payment_step"]').length) return
21
+ $(SpreeBraintreeVzero.checkoutFormId + ' .form-buttons .btn').hide();
22
+ $("[method_id='" + SpreeBraintreeVzero.paymentMethodID + "']").show();
23
+ $(".new-braintree-payment-method").show();
24
+ $(".show-new-payment").hide();
25
+ },
26
+ showSaveAndContinue: function() {
27
+ this.enableSubmitButton();
28
+ if(!$('div[data-hook="checkout_payment_step"]').length) return
29
+ $("[method_id='" + SpreeBraintreeVzero.paymentMethodID + "']").hide();
30
+ $('[name="commit"]:not(.braintree-submit)').show();
31
+ $(".new-braintree-payment-method").hide();
32
+ $(".show-new-payment").show();
33
+ },
34
+ setSaveAndContinueVisibility: function() {
35
+ if($('#saved_payment_methods_for_' + SpreeBraintreeVzero.paymentMethodID).val())
36
+ SpreeBraintreeVzero.showSaveAndContinue();
37
+ else
38
+ SpreeBraintreeVzero.updateSaveAndContinueVisibility();
39
+ },
40
+ enableSubmitButton: function() {
41
+ $('.btn:disabled').attr('disabled', false).removeClass('disabled').addClass('primary');
42
+ },
43
+ addDeviceData: function() {
44
+ if(SpreeBraintreeVzero.deviceData)
45
+ $(SpreeBraintreeVzero.checkoutFormId).append("<input type='hidden' name='device_data' value=" + SpreeBraintreeVzero.deviceData + ">");
46
+ }
47
+ }
48
+
49
+ $(document).ready(function() {
50
+ paymentMethods = $('div[data-hook="checkout_payment_step"] input[type="radio"]').click(function (e) {
51
+ SpreeBraintreeVzero.setSaveAndContinueVisibility();
52
+ });
53
+ $('.saved-payment-methods').change(function (e) {
54
+ if($(this).val())
55
+ SpreeBraintreeVzero.showSaveAndContinue();
56
+ else
57
+ SpreeBraintreeVzero.hideSaveAndContinue();
58
+ });
59
+ $('#show-new-payment').click(function (e) {
60
+ e.preventDefault();
61
+ $('#saved_payment_methods_for_' + SpreeBraintreeVzero.paymentMethodID).val('')
62
+ SpreeBraintreeVzero.updateSaveAndContinueVisibility();
63
+ });
64
+ $('.braintree-submit, [name="commit"]').click(function(e) {
65
+ SpreeBraintreeVzero.addDeviceData();
66
+ });
67
+ SpreeBraintreeVzero.setSaveAndContinueVisibility();
68
+ })