workarea-kount 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +20 -0
  3. data/.eslintrc +24 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  5. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  7. data/.github/workflows/ci.yml +58 -0
  8. data/.gitignore +14 -0
  9. data/.rubocop.yml +2 -0
  10. data/CHANGELOG.md +212 -0
  11. data/CODE_OF_CONDUCT.md +3 -0
  12. data/CONTRIBUTING.md +3 -0
  13. data/Gemfile +17 -0
  14. data/LICENSE.md +3 -0
  15. data/README.md +98 -0
  16. data/Rakefile +53 -0
  17. data/app/controllers/workarea/admin/orders_controller.decorator +5 -0
  18. data/app/controllers/workarea/storefront/checkout/place_order_controller.decorator +11 -0
  19. data/app/controllers/workarea/storefront/kount_controller.rb +19 -0
  20. data/app/controllers/workarea/storefront/kount_orders_controller.rb +40 -0
  21. data/app/lib/active_shipping/rate_estimate.decorator +10 -0
  22. data/app/mailers/workarea/storefront/order_mailer.decorator +14 -0
  23. data/app/models/workarea/checkout.decorator +37 -0
  24. data/app/models/workarea/checkout/fraud/kount_analyzer.rb +71 -0
  25. data/app/models/workarea/kount/ens_event.rb +13 -0
  26. data/app/models/workarea/kount/order.rb +14 -0
  27. data/app/models/workarea/order.decorator +62 -0
  28. data/app/models/workarea/order/fraud_decision.decorator +9 -0
  29. data/app/models/workarea/order/item.decorator +8 -0
  30. data/app/models/workarea/order/status/review.rb +13 -0
  31. data/app/models/workarea/payment/credit_card.decorator +13 -0
  32. data/app/models/workarea/payment/payment.decorator +11 -0
  33. data/app/models/workarea/payment/status/kount_declined.rb +13 -0
  34. data/app/models/workarea/payment/status/kount_review.rb +13 -0
  35. data/app/models/workarea/payment/tender/credit_card.decorator +10 -0
  36. data/app/models/workarea/search/admin.decorator +12 -0
  37. data/app/models/workarea/search/admin/order.decorator +7 -0
  38. data/app/models/workarea/shipping/rate_lookup.decorator +26 -0
  39. data/app/models/workarea/shipping/service.decorator +9 -0
  40. data/app/models/workarea/shipping/service_selection.decorator +7 -0
  41. data/app/models/workarea/shipping_option.decorator +27 -0
  42. data/app/services/workarea/kount/cancel_order_under_review.rb +28 -0
  43. data/app/services/workarea/kount/event.rb +43 -0
  44. data/app/services/workarea/kount/event/dmc_event.rb +9 -0
  45. data/app/services/workarea/kount/event/risk_change_event.rb +21 -0
  46. data/app/services/workarea/kount/event/special_alert_event.rb +21 -0
  47. data/app/services/workarea/kount/event/workflow_event.rb +25 -0
  48. data/app/services/workarea/kount/event_batch.rb +37 -0
  49. data/app/services/workarea/kount/order_fraud_update_service.rb +42 -0
  50. data/app/services/workarea/kount/ris_inquiry.rb +120 -0
  51. data/app/services/workarea/kount/ris_inquiry/product.rb +53 -0
  52. data/app/services/workarea/kount/ris_request.rb +84 -0
  53. data/app/services/workarea/kount/ris_update.rb +39 -0
  54. data/app/view_models/workarea/admin/order_view_model.decorator +35 -0
  55. data/app/view_models/workarea/storefront/order_view_model.decorator +11 -0
  56. data/app/views/workarea/admin/orders/_kount.html.haml +28 -0
  57. data/app/views/workarea/admin/orders/kount.html.haml +46 -0
  58. data/app/views/workarea/storefront/checkouts/_kount_data_collector.html.haml +4 -0
  59. data/app/views/workarea/storefront/order_mailer/hold_denial.html.haml +14 -0
  60. data/app/workers/workarea/kount/process_review_order.rb +75 -0
  61. data/app/workers/workarea/kount/update_ris_inquiry.rb +31 -0
  62. data/bin/rails +18 -0
  63. data/config/initializers/appends.rb +11 -0
  64. data/config/initializers/workarea.rb +26 -0
  65. data/config/locales/en.yml +26 -0
  66. data/config/routes.rb +14 -0
  67. data/doc/Kount Technical Specification Guide 5.5.5.pdf +0 -0
  68. data/lib/workarea/kount.rb +87 -0
  69. data/lib/workarea/kount/address.rb +39 -0
  70. data/lib/workarea/kount/bogus_gateway.rb +415 -0
  71. data/lib/workarea/kount/engine.rb +8 -0
  72. data/lib/workarea/kount/errors.rb +2 -0
  73. data/lib/workarea/kount/gateway.rb +50 -0
  74. data/lib/workarea/kount/mappings.rb +195 -0
  75. data/lib/workarea/kount/payment_types.rb +50 -0
  76. data/lib/workarea/kount/response.rb +141 -0
  77. data/lib/workarea/kount/security_mash.rb +79 -0
  78. data/lib/workarea/kount/user_defined_fields.rb +16 -0
  79. data/lib/workarea/kount/version.rb +5 -0
  80. data/lib/workarea/mailer_previews/storefront/order_mailer_preview.rb +10 -0
  81. data/test/dummy/Rakefile +6 -0
  82. data/test/dummy/app/assets/config/manifest.js +4 -0
  83. data/test/dummy/app/assets/images/.keep +0 -0
  84. data/test/dummy/app/assets/javascripts/application.js +13 -0
  85. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  86. data/test/dummy/app/controllers/application_controller.rb +3 -0
  87. data/test/dummy/app/controllers/concerns/.keep +0 -0
  88. data/test/dummy/app/helpers/application_helper.rb +2 -0
  89. data/test/dummy/app/jobs/application_job.rb +2 -0
  90. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  91. data/test/dummy/app/models/concerns/.keep +0 -0
  92. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  93. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  94. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  95. data/test/dummy/bin/bundle +3 -0
  96. data/test/dummy/bin/rails +4 -0
  97. data/test/dummy/bin/rake +4 -0
  98. data/test/dummy/bin/setup +34 -0
  99. data/test/dummy/bin/update +29 -0
  100. data/test/dummy/config.ru +5 -0
  101. data/test/dummy/config/application.rb +23 -0
  102. data/test/dummy/config/boot.rb +5 -0
  103. data/test/dummy/config/cable.yml +9 -0
  104. data/test/dummy/config/environment.rb +5 -0
  105. data/test/dummy/config/environments/development.rb +56 -0
  106. data/test/dummy/config/environments/production.rb +86 -0
  107. data/test/dummy/config/environments/test.rb +44 -0
  108. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  109. data/test/dummy/config/initializers/assets.rb +11 -0
  110. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  111. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  112. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  113. data/test/dummy/config/initializers/inflections.rb +16 -0
  114. data/test/dummy/config/initializers/mime_types.rb +4 -0
  115. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  116. data/test/dummy/config/initializers/session_store.rb +3 -0
  117. data/test/dummy/config/initializers/workarea.rb +5 -0
  118. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  119. data/test/dummy/config/locales/en.yml +23 -0
  120. data/test/dummy/config/puma.rb +47 -0
  121. data/test/dummy/config/routes.rb +6 -0
  122. data/test/dummy/config/secrets.yml +22 -0
  123. data/test/dummy/config/spring.rb +6 -0
  124. data/test/dummy/db/seeds.rb +2 -0
  125. data/test/dummy/lib/assets/.keep +0 -0
  126. data/test/dummy/log/.keep +0 -0
  127. data/test/dummy/public/404.html +67 -0
  128. data/test/dummy/public/422.html +67 -0
  129. data/test/dummy/public/500.html +66 -0
  130. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  131. data/test/dummy/public/apple-touch-icon.png +0 -0
  132. data/test/dummy/public/favicon.ico +0 -0
  133. data/test/factories/kount.rb +164 -0
  134. data/test/integration/workarea/api/admin/payment_transactions_integration_test.decorator +29 -0
  135. data/test/integration/workarea/kount_moneris_integration_test.rb +37 -0
  136. data/test/integration/workarea/storefront/kount_integration_test.rb +37 -0
  137. data/test/integration/workarea/storefront/kount_orders_integration_test.rb +89 -0
  138. data/test/lib/workarea/kount/response_test.rb +95 -0
  139. data/test/lib/workarea/kount/security_mash_test.rb +62 -0
  140. data/test/models/workarea/checkout/fraud/kount_analyzer_test.rb +44 -0
  141. data/test/models/workarea/checkout_test.decorator +22 -0
  142. data/test/models/workarea/order/queries_test.decorator +28 -0
  143. data/test/models/workarea/order_test.decorator +25 -0
  144. data/test/models/workarea/payment/payment_test.rb +106 -0
  145. data/test/models/workarea/payment/saved_credit_card_test.rb +24 -0
  146. data/test/models/workarea/payment_test.decorator +54 -0
  147. data/test/models/workarea/shipping_option_test.rb +29 -0
  148. data/test/services/workarea/kount/event_batch_test.rb +95 -0
  149. data/test/services/workarea/kount/event_test.rb +51 -0
  150. data/test/services/workarea/kount/order_fraud_update_service_test.rb +48 -0
  151. data/test/support/workarea/kount_api_config.rb +27 -0
  152. data/test/system/workarea/kount_system_test.rb +72 -0
  153. data/test/system/workarea/storefront/kount_guest_checkout_system_test.rb +32 -0
  154. data/test/system/workarea/storefront/kount_logged_in_checkout_system_test.rb +102 -0
  155. data/test/test_helper.rb +16 -0
  156. data/test/vcr_cassettes/kount/basic_fraud_test.yml +43 -0
  157. data/test/vcr_cassettes/kount/integration/moneris_new_credit_card.yml +84 -0
  158. data/test/vcr_cassettes/kount/integration/moneris_saved_credit_card.yml +84 -0
  159. data/test/vcr_cassettes/kount/order_fraud_update.yml +82 -0
  160. data/test/workers/workarea/kount/clean_orders_test.rb +40 -0
  161. data/test/workers/workarea/kount/process_review_order_test.rb +100 -0
  162. data/workarea-kount.gemspec +17 -0
  163. metadata +238 -0
@@ -0,0 +1,11 @@
1
+ module Workarea
2
+ Plugin.append_partials(
3
+ 'storefront.checkout_payment_top',
4
+ 'workarea/storefront/checkouts/kount_data_collector'
5
+ )
6
+
7
+ Plugin.append_partials(
8
+ 'admin.order_cards',
9
+ 'workarea/admin/orders/kount'
10
+ )
11
+ end
@@ -0,0 +1,26 @@
1
+ Workarea.configure do |config|
2
+ config.order_status_calculators.insert(0, 'Workarea::Order::Status::Review')
3
+
4
+ config.kount ||= ActiveSupport::Configurable::Configuration.new
5
+
6
+ config.kount.enabled = true
7
+
8
+ config.payment_status_calculators.insert_before(
9
+ "Workarea::Payment::Status::NotApplicable",
10
+ "Workarea::Payment::Status::KountDeclined"
11
+ )
12
+
13
+ config.payment_status_calculators.insert_after(
14
+ "Workarea::Payment::Status::NotApplicable",
15
+ "Workarea::Payment::Status::KountReview"
16
+ )
17
+
18
+ config.status_state_indicators = config.status_state_indicators.merge(
19
+ kount_review: 'pending',
20
+ kount_declined: 'danger',
21
+ )
22
+
23
+ unless Rails.env.test?
24
+ config.fraud_analyzer = 'Workarea::Checkout::Fraud::KountAnalyzer'
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ en:
2
+ workarea:
3
+ admin:
4
+ orders:
5
+ cards:
6
+ kount:
7
+ button: View Kount Details
8
+ credit_cards: Cards
9
+ decision: Decision
10
+ devices: Devices
11
+ email_addresses: Email Addresses
12
+ score: Score
13
+ title: Kount
14
+ kount:
15
+ title: Kount
16
+ rules_triggered: Rules Triggered
17
+ no_rules_triggered: No rules triggered
18
+ view_order_in_kount: View Order in Kount
19
+ storefront:
20
+ email:
21
+ hold_denial:
22
+ heading: Order %{order_id} Cancellation
23
+ info_html: Apologies, but your order could not be processed due to a payment issue.
24
+ subject: Order %{order_id} Cancellation
25
+ flash_messages:
26
+ kount_order_denied: We are unable to process your payment at this time. Please contact your credit card issuer or bank or try re-entering your information.
@@ -0,0 +1,14 @@
1
+ Workarea::Storefront::Engine.routes.draw do
2
+ get 'logo.htm', to: 'kount#data_collector', as: 'kount_data_collector_htm'
3
+ get 'logo.gif', to: 'kount#data_collector', as: 'kount_data_collector_gif'
4
+
5
+ post 'kount_orders', to: 'kount_orders#bulk'
6
+ end
7
+
8
+ Workarea::Admin::Engine.routes.draw do
9
+ resources :orders, only: [] do
10
+ member do
11
+ get :kount
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,87 @@
1
+ require 'workarea/kount/engine'
2
+ require 'workarea/kount/version'
3
+
4
+ require 'rest_client'
5
+ require 'digest/sha1'
6
+ require 'workarea/kount/address'
7
+ require 'workarea/kount/bogus_gateway'
8
+ require 'workarea/kount/errors'
9
+ require 'workarea/kount/gateway'
10
+ require 'workarea/kount/mappings'
11
+ require 'workarea/kount/response'
12
+ require 'workarea/kount/user_defined_fields'
13
+ require 'workarea/kount/payment_types'
14
+ require 'workarea/kount/security_mash'
15
+
16
+
17
+ module Workarea
18
+ module Kount
19
+ def self.config
20
+ Workarea.config.kount
21
+ end
22
+
23
+ def self.enabled?
24
+ !!config.enabled
25
+ end
26
+
27
+ def self.credentials
28
+ (Rails.application.secrets.kount || {}).deep_symbolize_keys
29
+ end
30
+
31
+ def self.ksalt
32
+ credentials[:ksalt]
33
+ end
34
+
35
+ def self.merchant_id
36
+ credentials[:merchant_id]
37
+ end
38
+
39
+ def self.key
40
+ credentials[:key]
41
+ end
42
+
43
+ def self.kount_site
44
+ credentials[:kount_site] || 'DEFAULT'
45
+ end
46
+
47
+ def self.kount_api_version
48
+ credentials[:version]
49
+ end
50
+
51
+ def self.data_collector_url
52
+ return config[:data_collector_url] if config[:data_collector_url].present?
53
+
54
+ if Rails.env.production?
55
+ 'https://ssl.kaptcha.com/'
56
+ else
57
+ 'https://tst.kaptcha.com/'
58
+ end
59
+ end
60
+
61
+ def self.kount_order_url_base
62
+ if credentials.fetch(:is_test, false)
63
+ "https://awc.test.kount.net/workflow/detail.html?id="
64
+ else
65
+ "https://awc.kount.net/workflow/detail.html?id="
66
+ end
67
+ end
68
+
69
+ def self.gateway
70
+ if credentials.present?
71
+ Workarea::Kount::Gateway.new(
72
+ credentials.slice(:merchant_id, :version, :key, :ksalt, :is_test)
73
+ )
74
+ else
75
+ Workarea::Kount::BogusGateway.new
76
+ end
77
+ end
78
+
79
+ def self.log_error(error)
80
+ if defined?(::Raven)
81
+ Raven.capture_exception error
82
+ else
83
+ Rails.logger.warn error
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,39 @@
1
+ module Workarea
2
+ module Kount
3
+ class Address
4
+ attr_reader :prefix
5
+ # @param Workarea::Address
6
+ #
7
+ # @return [Hash]
8
+ #
9
+ def self.for_shipping(address)
10
+ new('S', address).to_hash
11
+ end
12
+
13
+ # @param Workarea::Address
14
+ #
15
+ # @return [Hash]
16
+ #
17
+ def self.for_billing(address)
18
+ new('B', address).to_hash
19
+ end
20
+
21
+ def initialize(prefix, address)
22
+ @prefix = prefix
23
+ @address = address
24
+ end
25
+
26
+ def to_hash
27
+ {
28
+ "#{prefix}2A1": @address.street,
29
+ "#{prefix}2A2": @address.street_2,
30
+ "#{prefix}2CI": @address.city,
31
+ "#{prefix}2ST": @address.region,
32
+ "#{prefix}2PC": @address.postal_code,
33
+ "#{prefix}2CC": @address.country.gec,
34
+ "#{prefix}2PN": @address.phone_number
35
+ }
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,415 @@
1
+ module Workarea
2
+ module Kount
3
+ class BogusGateway
4
+ def call(inquiry)
5
+ mode = inquiry[:MODE]
6
+
7
+ body =
8
+ if mode == "U"
9
+ update_response
10
+ else
11
+ type = inquiry[:PTYP]
12
+ number = inquiry[:PTOK]
13
+ email = inquiry[:EMAL]
14
+
15
+
16
+ case type
17
+ when 'CARD', 'TOKEN'
18
+ credit_card(number, email: email)
19
+ when 'PYPL'
20
+ paypal
21
+ when 'GIFT'
22
+ gift_card
23
+ when 'NONE'
24
+ store_credit
25
+ else
26
+ raise Workarea::Kount::Errors::PaymentNotSupportedError, "#{type} is not supported by Kount."
27
+ end
28
+ end
29
+
30
+ Kount::Response.new(body)
31
+ end
32
+
33
+ private
34
+
35
+ def credit_card_decline
36
+ {
37
+ "VERSION" => "0630",
38
+ "MODE" => "Q",
39
+ "TRANSACTION_ID" => "6V100HV36D98",
40
+ "MERCHANT_ID" => "158000",
41
+ "SESSION_ID" => "1",
42
+ "ORDER_ID" => "1",
43
+ "AUTO" => "D",
44
+ "SCOR" => "42",
45
+ "WORST_CONTRY_ASSOCIATED" => "NG",
46
+ "PAYMENT_BRAND" => "VISA",
47
+ "REGION" => "ID",
48
+ "NETWORK" => "A",
49
+ "CARDS" => 2,
50
+ "DEVICES" => 1,
51
+ "EMAILS" => 3,
52
+ "VELOCITY" => 4,
53
+ "VMAX" => 4,
54
+ "SITE" => "DEFAULT",
55
+ "DEVICE_LAYERS" => "D67BC18BAD.6EF0902E51.8C96FA9E7B.61FD602D96.940A6D1454",
56
+ "FINGERPRINT" => "00482B9BED15A272730FCB590FFEBDDD",
57
+ "TIMEZONE" => 420,
58
+ "LOCALTIME" => "2015-11-12 12:15",
59
+ "COUNTRY" => "US",
60
+ "PROXY" => "N",
61
+ "JAVASCRIPT" => "Y",
62
+ "FLASH" => "Y",
63
+ "COOKIES" => "Y",
64
+ "HTTP_COUNTRY" => "US",
65
+ "LANGUAGE" => "EN",
66
+ "MOBILE_DEVICE" => "N",
67
+ "MOBILE_TYPE" => "",
68
+ "MOBILE_FORWARDER" => "N",
69
+ "VOICE_DEVICE" => "N",
70
+ "PC_REMOTE" => "N",
71
+ "RULES_TRIGGERED" => 0,
72
+ "COUNTERS_TRIGGERED" => 0,
73
+ "IL" => "Kount Inc.",
74
+ "WARNING_COUNT" => 0,
75
+ "RULES" => nil,
76
+ "ERRORS_KOUNT" => [],
77
+ "WARNINGS" => []
78
+ }
79
+ end
80
+
81
+ def credit_card_review
82
+ {
83
+ "VERSION" => "0630",
84
+ "MODE" => "Q",
85
+ "TRANSACTION_ID" => "6V100HV36D98",
86
+ "MERCHANT_ID" => "158000",
87
+ "SESSION_ID" => "1",
88
+ "ORDER_ID" => "1",
89
+ "AUTO" => "R",
90
+ "SCOR" => 50,
91
+ "WORST_CONTRY_ASSOCIATED" => "US",
92
+ "PAYMENT_BRAND" => "VISA",
93
+ "REGION" => "ID",
94
+ "NETWORK" => "A",
95
+ "CARDS" => 2,
96
+ "DEVICES" => 1,
97
+ "EMAILS" => 3,
98
+ "VELOCITY" => 4,
99
+ "VMAX" => 4,
100
+ "SITE" => "DEFAULT",
101
+ "DEVICE_LAYERS" => "D67BC18BAD.6EF0902E51.8C96FA9E7B.61FD602D96.940A6D1454",
102
+ "FINGERPRINT" => "00482B9BED15A272730FCB590FFEBDDD",
103
+ "TIMEZONE" => 420,
104
+ "LOCALTIME" => "2015-11-12 12:15",
105
+ "COUNTRY" => "US",
106
+ "PROXY" => "N",
107
+ "JAVASCRIPT" => "Y",
108
+ "FLASH" => "Y",
109
+ "COOKIES" => "Y",
110
+ "HTTP_COUNTRY" => "US",
111
+ "LANGUAGE" => "EN",
112
+ "MOBILE_DEVICE" => "N",
113
+ "MOBILE_TYPE" => "",
114
+ "MOBILE_FORWARDER" => "N",
115
+ "VOICE_DEVICE" => "N",
116
+ "PC_REMOTE" => "N",
117
+ "RULES_TRIGGERED" => 0,
118
+ "COUNTERS_TRIGGERED" => 0,
119
+ "IL" => "Kount Inc.",
120
+ "WARNING_COUNT" => 0,
121
+ "RULES" => nil,
122
+ "ERRORS_KOUNT" => [],
123
+ "WARNINGS" => []
124
+ }
125
+ end
126
+
127
+ def credit_card_approve
128
+ {
129
+ "VERSION" => "0630",
130
+ "MODE" => "Q",
131
+ "TRANSACTION_ID" => "6V100HV36D98",
132
+ "MERCHANT_ID" => "158000",
133
+ "SESSION_ID" => "1",
134
+ "ORDER_ID" => "1",
135
+ "AUTO" => "A",
136
+ "SCORE" => 50,
137
+ "WORST_CONTRY_ASSOCIATED" => "US",
138
+ "PAYMENT_BRAND" => "VISA",
139
+ "REGION" => "ID",
140
+ "NETWORK" => "A",
141
+ "CARDS" => 2,
142
+ "DEVICES" => 1,
143
+ "EMAILS" => 3,
144
+ "VELOCITY" => 4,
145
+ "VMAX" => 4,
146
+ "SITE" => "DEFAULT",
147
+ "DEVICE_LAYERS" => "D67BC18BAD.6EF0902E51.8C96FA9E7B.61FD602D96.940A6D1454",
148
+ "FINGERPRINT" => "00482B9BED15A272730FCB590FFEBDDD",
149
+ "TIMEZONE" => 420,
150
+ "LOCALTIME" => "2015-11-12 12:15",
151
+ "COUNTRY" => "US",
152
+ "PROXY" => "N",
153
+ "JAVASCRIPT" => "Y",
154
+ "FLASH" => "Y",
155
+ "COOKIES" => "Y",
156
+ "HTTP_COUNTRY" => "US",
157
+ "LANGUAGE" => "EN",
158
+ "MOBILE_DEVICE" => "N",
159
+ "MOBILE_TYPE" => "",
160
+ "MOBILE_FORWARDER" => "N",
161
+ "VOICE_DEVICE" => "N",
162
+ "PC_REMOTE" => "N",
163
+ "RULES_TRIGGERED" => 0,
164
+ "COUNTERS_TRIGGERED" => 0,
165
+ "IL" => "Kount Inc.",
166
+ "WARNING_COUNT" => 0,
167
+ "RULES" => nil,
168
+ "ERRORS_KOUNT" => [],
169
+ "WARNINGS" => []
170
+ }
171
+ end
172
+
173
+ def credit_card_other
174
+ {
175
+ "VERSION" => "0630",
176
+ "MODE" => "Q",
177
+ "TRANSACTION_ID" => "6V100HV36D98",
178
+ "MERCHANT_ID" => "158000",
179
+ "SESSION_ID" => "1",
180
+ "ORDER_ID" => "1",
181
+ "AUTO" => "A",
182
+ "SCORE" => 50,
183
+ "WORST_CONTRY_ASSOCIATED" => "US",
184
+ "PAYMENT_BRAND" => "VISA",
185
+ "REGION" => "ID",
186
+ "NETWORK" => "A",
187
+ "CARDS" => 2,
188
+ "DEVICES" => 1,
189
+ "EMAILS" => 3,
190
+ "VELOCITY" => 4,
191
+ "VMAX" => 4,
192
+ "SITE" => "DEFAULT",
193
+ "DEVICE_LAYERS" => "D67BC18BAD.6EF0902E51.8C96FA9E7B.61FD602D96.940A6D1454",
194
+ "FINGERPRINT" => "00482B9BED15A272730FCB590FFEBDDD",
195
+ "TIMEZONE" => 420,
196
+ "LOCALTIME" => "2015-11-12 12:15",
197
+ "COUNTRY" => "US",
198
+ "PROXY" => "N",
199
+ "JAVASCRIPT" => "Y",
200
+ "FLASH" => "Y",
201
+ "COOKIES" => "Y",
202
+ "HTTP_COUNTRY" => "US",
203
+ "LANGUAGE" => "EN",
204
+ "MOBILE_DEVICE" => "N",
205
+ "MOBILE_TYPE" => "",
206
+ "MOBILE_FORWARDER" => "N",
207
+ "VOICE_DEVICE" => "N",
208
+ "PC_REMOTE" => "N",
209
+ "RULES_TRIGGERED" => 0,
210
+ "COUNTERS_TRIGGERED" => 0,
211
+ "IL" => "Kount Inc.",
212
+ "WARNING_COUNT" => 0,
213
+ "RULES" => nil,
214
+ "ERRORS_KOUNT" => [],
215
+ "WARNINGS" => []
216
+ }
217
+ end
218
+
219
+ def credit_card(number, email: nil)
220
+ if email.present?
221
+ case email
222
+ when "approve@workarea.com"
223
+ return credit_card_approve
224
+ when "review@workarea.com"
225
+ return credit_card_review
226
+ when "decline@workarea.com"
227
+ return credit_card_decline
228
+ end
229
+ end
230
+
231
+ case number
232
+ when /21$/ # decline
233
+ credit_card_decline
234
+ when /31$/ # review
235
+ credit_card_review
236
+ when /1$/ # approve
237
+ credit_card_approve
238
+ else
239
+ credit_card_other
240
+ end
241
+ end
242
+
243
+ def paypal
244
+ {
245
+ :version => "0630",
246
+ :mode => "Q",
247
+ :transaction_id => "6V100HV36D98",
248
+ :merchant_id => "158000",
249
+ :session_id => "1",
250
+ :order_id => "1",
251
+ :auto => "A",
252
+ :score => 50,
253
+ :worst_contry_associated => "US",
254
+ :payment_brand => "VISA",
255
+ :region => "ID",
256
+ :network => "A",
257
+ :cards => 2,
258
+ :devices => 1,
259
+ :emails => 3,
260
+ :velocity => 4,
261
+ :vmax => 4,
262
+ :site => "DEFAULT",
263
+ :device_layers => "D67BC18BAD.6EF0902E51.8C96FA9E7B.61FD602D96.940A6D1454",
264
+ :fingerprint => "00482B9BED15A272730FCB590FFEBDDD",
265
+ :timezone => 420,
266
+ :localtime => "2015-11-12 12:04",
267
+ :country => "US",
268
+ :proxy => "N",
269
+ :javascript => "Y",
270
+ :flash => "Y",
271
+ :cookies => "Y",
272
+ :http_country => "US",
273
+ :language => "EN",
274
+ :mobile_device => "N",
275
+ :mobile_type => "",
276
+ :mobile_forwarder => "N",
277
+ :voice_device => "N",
278
+ :pc_remote => "N",
279
+ :rules_triggered => 0,
280
+ :counters_triggered => 0,
281
+ nil => "Kount Inc.",
282
+ :warning_count => 0,
283
+ :rules => nil,
284
+ :errors_kount => [],
285
+ :warnings => []
286
+ }
287
+ end
288
+
289
+ def gift_card
290
+ {
291
+ :version => "0630",
292
+ :mode => "Q",
293
+ :transaction_id => "6V100HV36D98",
294
+ :merchant_id => "158000",
295
+ :session_id => "1",
296
+ :order_id => "1",
297
+ :auto => "A",
298
+ :score => 50,
299
+ :worst_contry_associated => "US",
300
+ :payment_brand => "VISA",
301
+ :region => "ID",
302
+ :network => "A",
303
+ :cards => 2,
304
+ :devices => 1,
305
+ :emails => 3,
306
+ :velocity => 4,
307
+ :vmax => 4,
308
+ :site => "DEFAULT",
309
+ :device_layers => "D67BC18BAD.6EF0902E51.8C96FA9E7B.61FD602D96.940A6D1454",
310
+ :fingerprint => "00482B9BED15A272730FCB590FFEBDDD",
311
+ :timezone => 420,
312
+ :localtime => "2015-11-12 12:15",
313
+ :country => "US",
314
+ :proxy => "N",
315
+ :javascript => "Y",
316
+ :flash => "Y",
317
+ :cookies => "Y",
318
+ :http_country => "US",
319
+ :language => "EN",
320
+ :mobile_device => "N",
321
+ :mobile_type => "",
322
+ :mobile_forwarder => "N",
323
+ :voice_device => "N",
324
+ :pc_remote => "N",
325
+ :rules_triggered => 0,
326
+ :counters_triggered => 0,
327
+ nil => "Kount Inc.",
328
+ :warning_count => 0,
329
+ :rules => nil,
330
+ :errors_kount => [],
331
+ :warnings => []
332
+ }
333
+ end
334
+
335
+ def store_credit
336
+ {
337
+ AUTO: "A",
338
+ BRND: "NONE",
339
+ BROWSER: nil,
340
+ CARDS: "1",
341
+ COOKIES: nil,
342
+ COUNTERS_TRIGGERED: 0,
343
+ COUNTRY: nil,
344
+ DDFS: nil,
345
+ DEVICES: "1",
346
+ DEVICE_LAYERS: "....",
347
+ DSR: nil,
348
+ EMAILS: "1",
349
+ FINGERPRINT: nil,
350
+ FLASH: nil,
351
+ GEOX: "US",
352
+ HTTP_COUNTRY: nil,
353
+ IP_CITY: nil,
354
+ IP_COUNTRY: nil,
355
+ IP_IPAD: nil,
356
+ IP_LAT: nil,
357
+ IP_LON: nil,
358
+ IP_ORG: nil,
359
+ IP_REGION: nil,
360
+ JAVASCRIPT: nil,
361
+ KAPT: "N",
362
+ LANGUAGE: nil,
363
+ LOCALTIME: "",
364
+ MASTERCARD: "",
365
+ MERC: "200755",
366
+ MOBILE_DEVICE: nil,
367
+ MOBILE_FORWARDER: nil,
368
+ MOBILE_TYPE: nil,
369
+ MODE: "Q",
370
+ NETW: "N",
371
+ ORDR: "214EAF647E",
372
+ OS: nil,
373
+ PC_REMOTE: nil,
374
+ PIP_CITY: nil,
375
+ PIP_COUNTRY: nil,
376
+ PIP_IPAD: nil,
377
+ PIP_LAT: nil,
378
+ PIP_LON: nil,
379
+ PIP_ORG: nil,
380
+ PIP_REGION: nil,
381
+ PROXY: nil,
382
+ REASON_CODE: nil,
383
+ REGION: nil,
384
+ REGN: "US_PA",
385
+ RULES_TRIGGERED: 0,
386
+ SCOR: "29",
387
+ SESS: "12345666",
388
+ SITE: "DEFAULT",
389
+ TIMEZONE: nil,
390
+ TRAN: "7K700MYCC250",
391
+ UAS: nil,
392
+ VELO: "0",
393
+ VERS: "0630",
394
+ VMAX: "0",
395
+ VOICE_DEVICE: nil,
396
+ WARNING_COUNT: 0
397
+ }
398
+ end
399
+
400
+ def update_response
401
+ {
402
+ "VERSION" => '0630',
403
+ "MODE" => 'U',
404
+ "TRANSACTION_ID" => '6V100HV36D98',
405
+ "MERCHANT_ID" => '158000',
406
+ "SESSION_ID" => '1',
407
+ "RULES_TRIGGERED" => '0',
408
+ "COUNTERS_TRIGGERED" => '0',
409
+ "REASON_CODE" => nil,
410
+ "WARNING_COUNT" => 0
411
+ }
412
+ end
413
+ end
414
+ end
415
+ end