spree_emerchantpay_genesis 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9deca475addd04cfdc51f7185d69c3d6fd031b8ee69becf096905f883f34ef5b
4
- data.tar.gz: 3543891820d71bf926c0d33d9ef4b9dd2b960a320ac1475d9a80aed3d73ffb3b
3
+ metadata.gz: d2dbd23a908a23677fb4ee2bea0a49cc739052aa5d882e57b7c532d57c480602
4
+ data.tar.gz: d6b2c2fbbe86dcc820946edda7c79d7ff34b83ba702e0b678226ad5c87667306
5
5
  SHA512:
6
- metadata.gz: 4ea32ec52afa0ad5c3189381d87f18bfed25478ab2cca31e967e6f7d67baf4f83d4275477e2a8b20a564ac572d63f466400774e8f8b2ce2b72b15e3834c99efa
7
- data.tar.gz: ed907c1c11536ca5ec89980e1535f91a9638b84db018cb8fe7c01a87c6047f855bc31611863eb9493f6ce40f59cf0a164ab7a375699beb7ef7995560aefbff15
6
+ metadata.gz: '0487117b7c98132dd864200b76d52c9b9c2b678244726bb6386a3c4c2c3220de2b729dc3c6f8d767abc46bf460c6655e158c301664777b10cf71d6a22f9268a9'
7
+ data.tar.gz: 861e78025ac386920634ddacb4c130d2d6285067fb693ddad00da2b9fc897a3e0011999d567795cd385931aada42d280e0e105225c07652bd618d786e282cfbf
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ 0.1.5
2
+ -----
3
+ **Features**:
4
+
5
+ * Added `emerchantpay Checkout` Description field handling
6
+ * Updated Genesis Ruby SDK to version 0.1.6
7
+ * Updated project dependencies
8
+ * Added `emerchantpay Checkout` Custom Attributes handling
9
+ * Added `emerchantpay Checkout` Language support
10
+
1
11
  0.1.4
2
12
  -----
3
13
  **Features**:
data/README.md CHANGED
@@ -7,7 +7,7 @@ This is a Payment Module for Spree eCommerce that gives you the ability to proce
7
7
  * Spree FrontEnd - Optional (Tested up to 4.4.0)
8
8
  * Ruby >= 2.7
9
9
  * Ruby on Rails >= 6.1.4
10
- * [GenesisRuby v0.1.5](https://github.com/GenesisGateway/genesis_ruby/releases/tag/0.1.5)
10
+ * [GenesisRuby v0.1.6](https://github.com/GenesisGateway/genesis_ruby/releases/tag/0.1.6)
11
11
  * PCI-certified server in order to use emerchantpay Direct
12
12
 
13
13
  ## Installation
@@ -216,7 +216,30 @@ curl --request 'POST' \
216
216
 
217
217
  #### Create Checkout Payment
218
218
 
219
- The Checkout Gateway doesn't require `source_attributes` (see [p.4 Update Order](#payment-point-4)). Upon Order Update or Payment Create the only required parameter is `payment_method_id`.
219
+ The Checkout Gateway doesn't require `source_attributes` by default (see [p.4 Update Order](#payment-point-4)). Upon Order Update or Payment Create the only required parameter is `payment_method_id`.
220
+
221
+ In some cases, the Gateway Web Payment Form may require Custom Attributes. Those attributes can be passed to the gateway via `api/v2/storefront/checkout/create_payment`.
222
+ public_metadata contains a list with custom attributes where the key is the transaction type chosen on the payment method configuration inside the administration backend.
223
+
224
+ ```bash
225
+ curl --request 'POST' \
226
+ --header 'Accept: application/vnd.api+json' \
227
+ --header 'X-Spree-Order-Token: EsDjq1oXEgKI6kuujgfvFw1694531383712' \
228
+ --header 'Content-Type: application/vnd.api+json' \
229
+ --url 'http://localhost:4000/api/v2/storefront/checkout/create_payment' \
230
+ --data '{
231
+ "payment_method_id": "8",
232
+ "source_attributes": {
233
+ "consumer_id":"123456",
234
+ "consumer_email": "travis@example.com",
235
+ "public_metadata": {
236
+ "sale3d": { "bin": "401200", "tail": "0085"},
237
+ "trustly_sale": {"return_success_url_target": "top"}
238
+ }
239
+ }
240
+ }'
241
+ ```
242
+ Full list with the available Custom Attributes for every Transaction Type can be found [here](https://emerchantpay.github.io/gateway-api-docs/#wpf-transaction-types).
220
243
 
221
244
  The payment can be finished and a request to the Gateway will be sent with one of the Order Next or Complete endpoints.
222
245
 
@@ -75,16 +75,15 @@ module SpreeEmerchantpayGenesis
75
75
  end
76
76
 
77
77
  # Map WPF request
78
- def map_wpf(order, _source, options)
78
+ def map_wpf(order, source, options)
79
79
  common_attributes order, support_ip: false
80
+ description_attribute order
80
81
  billing_attributes order
81
82
  shipping_attributes order
82
- asyn_attributes options
83
- transaction_types_attributes options
83
+ asyn_attributes options, is_wpf: true
84
+ transaction_types_attributes options, source
84
85
  threeds_wpf_attributes order, options if ActiveModel::Type::Boolean.new.cast options[:threeds_allowed]
85
-
86
- @context.return_cancel_url = options[:return_cancel_url]
87
- @context.return_pending_url = options[:return_pending_url]
86
+ wpf_locale_attributes options
88
87
 
89
88
  self
90
89
  end
@@ -181,11 +180,16 @@ module SpreeEmerchantpayGenesis
181
180
  end
182
181
 
183
182
  # Asynchronous attributes
184
- def asyn_attributes(options)
183
+ def asyn_attributes(options, is_wpf: false)
185
184
  @context.notification_url = "#{options[:hostname]}#{api_v2_storefront_emerchantpay_notification_path}"
186
185
  @context.return_success_url = options[:return_success_url]
187
186
  @context.return_failure_url = options[:return_failure_url]
188
187
 
188
+ if is_wpf
189
+ @context.return_cancel_url = options[:return_cancel_url]
190
+ @context.return_pending_url = options[:return_pending_url]
191
+ end
192
+
189
193
  nil
190
194
  end
191
195
 
@@ -209,12 +213,41 @@ module SpreeEmerchantpayGenesis
209
213
  end
210
214
 
211
215
  # Map WPF Transaction Types
212
- def transaction_types_attributes(options)
213
- options[:transaction_types].each do |type|
214
- @context.add_transaction_type type unless type.empty?
216
+ def transaction_types_attributes(options, source)
217
+ custom_attributes = source.public_metadata
218
+ transaction_types = PaymentMethodHelper.select_options_value options, :transaction_types
219
+
220
+ transaction_types.each do |type|
221
+ next if type.empty?
222
+
223
+ if custom_attributes.key?(type.to_s) && custom_attributes[type.to_s].is_a?(Hash)
224
+ @context.add_transaction_type type, custom_attributes[type.to_s].deep_symbolize_keys
225
+
226
+ next
227
+ end
228
+
229
+ @context.add_transaction_type type
215
230
  end
216
231
  end
217
232
 
233
+ # Map WPF Description field
234
+ def description_attribute(order)
235
+ items_description = order.line_items.map { |item| ["#{item[:product_name]} x #{item[:quantity]}"] }
236
+
237
+ @context.description = items_description.join("\n")
238
+
239
+ nil
240
+ end
241
+
242
+ # Map WPF language attributes
243
+ def wpf_locale_attributes(options)
244
+ locale = PaymentMethodHelper.select_options_value options, :language
245
+
246
+ return unless locale.is_a? String
247
+
248
+ @context.locale = locale.delete_prefix('\'').delete_suffix('\'')
249
+ end
250
+
218
251
  end
219
252
  end
220
253
  end
@@ -5,11 +5,10 @@ module SpreeEmerchantpayGenesis
5
5
 
6
6
  NESTED_NODES = %w(billing_address shipping_address line_items user).freeze
7
7
  ORDER_ALLOWED_ATTRIBUTES = %w(
8
- id currency item_total total user_id token item_count email shipment_total
9
- bill_address_id ship_address_id last_ip_address adjustment_total additional_tax_total included_tax_total number
10
- customer ip order_id shipping tax subtotal discount name address1 address2 city
11
- state zip country phone digital
12
- created_at updated_at
8
+ id currency item_total total user_id token item_count email shipment_total bill_address_id ship_address_id
9
+ last_ip_address adjustment_total additional_tax_total included_tax_total number customer ip order_id shipping
10
+ tax subtotal discount name address1 address2 city state zip country phone digital created_at updated_at
11
+ product_name
13
12
  ) + NESTED_NODES
14
13
 
15
14
  # Prepare Order data used from the Order mapper
@@ -17,7 +16,11 @@ module SpreeEmerchantpayGenesis
17
16
  order.attributes.symbolize_keys.merge(
18
17
  gateway_options,
19
18
  { digital: order.digital? },
20
- { line_items: order.line_items.map { |line_item| line_item.attributes.symbolize_keys } },
19
+ {
20
+ line_items: order.line_items.map do |line_item|
21
+ line_item.attributes.symbolize_keys.merge({ product_name: line_item.product.name })
22
+ end
23
+ },
21
24
  { user: (user ? user.attributes.symbolize_keys : {}) }
22
25
  )
23
26
  end
@@ -71,7 +71,8 @@ module SpreeEmerchantpayGenesis
71
71
 
72
72
  @context.threeds_v2_control_challenge_window_size =
73
73
  fetch_threeds_constant('Control::ChallengeWindowSizes::FULLSCREEN')
74
- @context.threeds_v2_control_challenge_indicator = options[:challenge_indicator]
74
+ @context.threeds_v2_control_challenge_indicator =
75
+ PaymentMethodHelper.select_options_value options, :challenge_indicator
75
76
 
76
77
  nil
77
78
  end
@@ -28,6 +28,13 @@ module SpreeEmerchantpayGenesis
28
28
  default_attr
29
29
  end
30
30
 
31
+ # Get default values for select options
32
+ def select_options_value(options, key)
33
+ return options[key][:selected] if options[key].is_a? Hash
34
+
35
+ options[key]
36
+ end
37
+
31
38
  end
32
39
 
33
40
  end
@@ -3,10 +3,19 @@ module Spree
3
3
  class Gateway::EmerchantpayCheckout < SpreeEmerchantpayGenesis::Base::Gateway # rubocop:disable Style/ClassAndModuleChildren
4
4
 
5
5
  preference :transaction_types, :multi_select, default: lambda {
6
- { values: GenesisRuby::Utils::Transactions::WpfTypes.all }
6
+ {
7
+ values: GenesisRuby::Utils::Transactions::WpfTypes.all,
8
+ selected: [GenesisRuby::Api::Constants::Transactions::SALE_3D]
9
+ }
7
10
  }
8
11
  preference :return_cancel_url, :string, default: 'http://localhost:4000/checkout/payment'
9
12
  preference :return_pending_url, :string, default: 'http://localhost:4000/orders/|:ORDER:|'
13
+ preference :language, :select, default: lambda {
14
+ {
15
+ values: GenesisRuby::Api::Constants::I18n.all,
16
+ selected: GenesisRuby::Api::Constants::I18n::EN
17
+ }
18
+ }
10
19
 
11
20
  delegate :load_data, :load_source, :load_payment, to: :provider
12
21
 
@@ -9,7 +9,12 @@ module SpreeEmerchantpayGenesis
9
9
  preference :return_failure_url, :string, default: 'http://localhost:4000/checkout/payment?order_number=|:ORDER:|'
10
10
  preference :threeds_allowed, :boolean_select, default: true
11
11
  preference :challenge_indicator, :select, default: lambda {
12
- { values: [:no_preference, :no_challenge_requested, :preference, :mandate] }
12
+ {
13
+ values: GenesisRuby::Api::Constants::Transactions::Parameters::Threeds::Version2::Control::
14
+ ChallengeIndicators.all,
15
+ selected: GenesisRuby::Api::Constants::Transactions::Parameters::Threeds::Version2::Control::
16
+ ChallengeIndicators::NO_PREFERENCE
17
+ }
13
18
  }
14
19
  preference :hostname, :string, default: 'http://127.0.0.1:4000'
15
20
  preference :test_mode, :boolean_select, default: true
@@ -1,5 +1,3 @@
1
- require 'spree/gateway/emerchantpay_direct'
2
-
3
1
  module SpreeEmerchantpayGenesis
4
2
  module Notifications
5
3
  # Notification Handler Service
@@ -1,5 +1,3 @@
1
- require 'spree/gateway/emerchantpay_direct'
2
-
3
1
  module SpreeEmerchantpayGenesis
4
2
  module Threeds
5
3
  # Method Continue service
@@ -14,6 +14,31 @@
14
14
  <th><%= I18n.t('emerchantpay.payments_table.source_consumer_email') %>:</th>
15
15
  <td><%= payment.source.consumer_email %></td>
16
16
  </tr>
17
+ <% unless payment.source.public_metadata.empty? %>
18
+ <tr>
19
+ <td colspan="2" class="text-center">
20
+ <h3><%= I18n.t('emerchantpay.payments_table.source_custom_attributes') %></h3>
21
+ <table class="table border-top-0">
22
+ <% payment.source.public_metadata.each do |transaction_type, custom_attributes| %>
23
+ <% next unless custom_attributes.is_a? Hash %>
24
+ <tr>
25
+ <th class="col-2"><%= transaction_type %></th>
26
+ <td class="text-left col-10">
27
+ <table class="table">
28
+ <% custom_attributes .each do |attribute, value| %>
29
+ <tr>
30
+ <td class="col-5"><%= attribute %></td>
31
+ <td class="col-7"><%= value %></td>
32
+ </tr>
33
+ <% end %>
34
+ </table>
35
+ </td>
36
+ </tr>
37
+ <% end %>
38
+ </table>
39
+ </td>
40
+ </tr>
41
+ <% end %>
17
42
  </table>
18
43
  </div>
19
44
  </fieldset>
@@ -75,6 +75,32 @@ en:
75
75
  webmoney: Webmoney
76
76
  webpay: Webpay
77
77
  wechat: Wechat
78
+ ar: Arabic
79
+ bg: Bulgarian
80
+ de: German
81
+ en: English
82
+ es: Spanish
83
+ fr: French
84
+ hi: Hindu
85
+ ja: Japanese
86
+ is: Icelandic
87
+ it: Italian
88
+ nl: Dutch
89
+ pt: Portuguese
90
+ pl: Polish
91
+ ru: Russian
92
+ tr: Turkish
93
+ zh: Mandarin Chinese
94
+ id: Indonesian
95
+ ms: Malay
96
+ th: Thai
97
+ cs: Czech
98
+ hr: Croatian
99
+ sl: Slovenian
100
+ fi: Finnish
101
+ "no": Norwegian
102
+ da: Danish
103
+ sv: Swedish
78
104
  payment:
79
105
  usage: Electronic transaction via Spree eCommerce platform
80
106
  reference: Reference transaction via Spree eCommerce platform
@@ -96,6 +122,7 @@ en:
96
122
  source_name: Name
97
123
  source_consumer_id: Consumer ID
98
124
  source_consumer_email: Consumer Email
125
+ source_custom_attributes: Custom Attributes
99
126
  spree:
100
127
  token: Token
101
128
  username: Username
@@ -1,7 +1,7 @@
1
1
  # :nocov:
2
2
  module SpreeEmerchantpayGenesis
3
3
 
4
- VERSION = '0.1.4'.freeze
4
+ VERSION = '0.1.5'.freeze
5
5
 
6
6
  end
7
7
  # :nocov:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_emerchantpay_genesis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - emerchantpay ltd.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-19 00:00:00.000000000 Z
11
+ date: 2024-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: genesis_ruby
@@ -16,49 +16,32 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.1.5
19
+ version: 0.1.6
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.1.5
27
- - !ruby/object:Gem::Dependency
28
- name: rails
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '6.0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '6.0'
26
+ version: 0.1.6
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: securerandom
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
- - - "~>"
31
+ - - ">="
46
32
  - !ruby/object:Gem::Version
47
- version: 0.2.2
33
+ version: '0'
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
- - - "~>"
38
+ - - ">="
53
39
  - !ruby/object:Gem::Version
54
- version: 0.2.2
40
+ version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: spree_backend
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '4.4'
62
45
  - - ">="
63
46
  - !ruby/object:Gem::Version
64
47
  version: 4.4.0
@@ -66,9 +49,6 @@ dependencies:
66
49
  prerelease: false
67
50
  version_requirements: !ruby/object:Gem::Requirement
68
51
  requirements:
69
- - - "~>"
70
- - !ruby/object:Gem::Version
71
- version: '4.4'
72
52
  - - ">="
73
53
  - !ruby/object:Gem::Version
74
54
  version: 4.4.0
@@ -76,9 +56,6 @@ dependencies:
76
56
  name: spree_core
77
57
  requirement: !ruby/object:Gem::Requirement
78
58
  requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: '4.4'
82
59
  - - ">="
83
60
  - !ruby/object:Gem::Version
84
61
  version: 4.4.0
@@ -86,9 +63,6 @@ dependencies:
86
63
  prerelease: false
87
64
  version_requirements: !ruby/object:Gem::Requirement
88
65
  requirements:
89
- - - "~>"
90
- - !ruby/object:Gem::Version
91
- version: '4.4'
92
66
  - - ">="
93
67
  - !ruby/object:Gem::Version
94
68
  version: 4.4.0
@@ -96,16 +70,16 @@ dependencies:
96
70
  name: spree_extension
97
71
  requirement: !ruby/object:Gem::Requirement
98
72
  requirements:
99
- - - '='
73
+ - - ">="
100
74
  - !ruby/object:Gem::Version
101
- version: 0.1.0
75
+ version: '0'
102
76
  type: :runtime
103
77
  prerelease: false
104
78
  version_requirements: !ruby/object:Gem::Requirement
105
79
  requirements:
106
- - - '='
80
+ - - ">="
107
81
  - !ruby/object:Gem::Version
108
- version: 0.1.0
82
+ version: '0'
109
83
  - !ruby/object:Gem::Dependency
110
84
  name: appraisal
111
85
  requirement: !ruby/object:Gem::Requirement
@@ -264,16 +238,16 @@ dependencies:
264
238
  name: rspec-rails
265
239
  requirement: !ruby/object:Gem::Requirement
266
240
  requirements:
267
- - - "~>"
241
+ - - ">="
268
242
  - !ruby/object:Gem::Version
269
- version: '4.0'
243
+ version: '0'
270
244
  type: :development
271
245
  prerelease: false
272
246
  version_requirements: !ruby/object:Gem::Requirement
273
247
  requirements:
274
- - - "~>"
248
+ - - ">="
275
249
  - !ruby/object:Gem::Version
276
- version: '4.0'
250
+ version: '0'
277
251
  - !ruby/object:Gem::Dependency
278
252
  name: rubocop
279
253
  requirement: !ruby/object:Gem::Requirement