active_merchant_first_data 1.0.0 → 1.1.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.
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- First Data gateway for Active Merchant
2
- ======================================
1
+ First Data Latvia gateway for Active Merchant
2
+ =============================================
3
3
 
4
4
  [![Continuous Integration status](https://secure.travis-ci.org/ebeigarts/active_merchant_first_data.png)](http://travis-ci.org/ebeigarts/active_merchant_first_data)
5
5
 
@@ -32,14 +32,16 @@ require "active_merchant_first_data"
32
32
 
33
33
  3. Copy the 3 files you received in e-mail to `spec/certs/`:
34
34
 
35
- * 1234567.pem
36
- * 1234567_certificate_chain.p7.pem
37
- * ECOMM.pem
35
+ ```
36
+ 1234567.pem
37
+ 1234567_certificate_chain.p7.pem
38
+ ECOMM.pem
39
+ ```
38
40
 
39
41
  4. Convert the certificates and keys to `1234567_keystore.pem`
40
42
 
41
43
  ```bash
42
- $ openssl pkcs12 -export -in 1234567.pem -out spec/certs/1234567_keystore.p12 -certfile spec/certs/ECOMM.pem -inkey spec/certs/1234567_key.pem
44
+ $ openssl pkcs12 -export -in spec/certs/1234567.pem -out spec/certs/1234567_keystore.p12 -certfile spec/certs/ECOMM.pem -inkey spec/certs/1234567_key.pem
43
45
  Enter pass phrase for 1234567_key.pem: 81f174259v45
44
46
  Enter Export Password: <empty>
45
47
  ```
@@ -18,15 +18,60 @@ module ActiveMerchant #:nodoc:
18
18
  self.default_currency = '428' # LVL (http://en.wikipedia.org/wiki/ISO_4217)
19
19
  self.money_format = :cents
20
20
 
21
+ CURRENCY_CODES = {
22
+ 'ADP' => '020', 'AED' => '784', 'AFA' => '004', 'ALL' => '008', 'AMD' => '051',
23
+ 'ANG' => '532', 'AOA' => '973', 'ARS' => '032', 'AUD' => '036', 'AWG' => '533',
24
+ 'AZM' => '031', 'BAM' => '977', 'BBD' => '052', 'BDT' => '050', 'BGL' => '100',
25
+ 'BGN' => '975', 'BHD' => '048', 'BIF' => '108', 'BMD' => '060', 'BND' => '096',
26
+ 'BOB' => '068', 'BOV' => '984', 'BRL' => '986', 'BSD' => '044', 'BTN' => '064',
27
+ 'BWP' => '072', 'BYR' => '974', 'BZD' => '084', 'CAD' => '124', 'CDF' => '976',
28
+ 'CHF' => '756', 'CLF' => '990', 'CLP' => '152', 'CNY' => '156', 'COP' => '170',
29
+ 'CRC' => '188', 'CUP' => '192', 'CVE' => '132', 'CYP' => '196', 'CZK' => '203',
30
+ 'DJF' => '262', 'DKK' => '208', 'DOP' => '214', 'DZD' => '012', 'ECS' => '218',
31
+ 'ECV' => '983', 'EEK' => '233', 'EGP' => '818', 'ERN' => '232', 'ETB' => '230',
32
+ 'EUR' => '978', 'FJD' => '242', 'FKP' => '238', 'GBP' => '826', 'GEL' => '981',
33
+ 'GHC' => '288', 'GIP' => '292', 'GMD' => '270', 'GNF' => '324', 'GTQ' => '320',
34
+ 'GWP' => '624', 'GYD' => '328', 'HKD' => '344', 'HNL' => '340', 'HRK' => '191',
35
+ 'HTG' => '332', 'HUF' => '348', 'IDR' => '360', 'ILS' => '376', 'INR' => '356',
36
+ 'IQD' => '368', 'IRR' => '364', 'ISK' => '352', 'JMD' => '388', 'JOD' => '400',
37
+ 'JPY' => '392', 'KES' => '404', 'KGS' => '417', 'KHR' => '116', 'KMF' => '174',
38
+ 'KPW' => '408', 'KRW' => '410', 'KWD' => '414', 'KYD' => '136', 'KZT' => '398',
39
+ 'LAK' => '418', 'LBP' => '422', 'LKR' => '144', 'LRD' => '430', 'LSL' => '426',
40
+ 'LTL' => '440', 'LVL' => '428', 'LYD' => '434', 'MAD' => '504', 'MDL' => '498',
41
+ 'MGF' => '450', 'MKD' => '807', 'MMK' => '104', 'MNT' => '496', 'MOP' => '446',
42
+ 'MRO' => '478', 'MTL' => '470', 'MUR' => '480', 'MVR' => '462', 'MWK' => '454',
43
+ 'MXN' => '484', 'MXV' => '979', 'MYR' => '458', 'MZM' => '508', 'NAD' => '516',
44
+ 'NGN' => '566', 'NIO' => '558', 'NOK' => '578', 'NPR' => '524', 'NZD' => '554',
45
+ 'OMR' => '512', 'PAB' => '590', 'PEN' => '604', 'PGK' => '598', 'PHP' => '608',
46
+ 'PKR' => '586', 'PLN' => '985', 'PYG' => '600', 'QAR' => '634', 'ROL' => '642',
47
+ 'RUB' => '643', 'RUR' => '810', 'RWF' => '646', 'SAR' => '682', 'SBD' => '090',
48
+ 'SCR' => '690', 'SDD' => '736', 'SEK' => '752', 'SGD' => '702', 'SHP' => '654',
49
+ 'SIT' => '705', 'SKK' => '703', 'SLL' => '694', 'SOS' => '706', 'SRG' => '740',
50
+ 'STD' => '678', 'SVC' => '222', 'SYP' => '760', 'SZL' => '748', 'THB' => '764',
51
+ 'TJS' => '972', 'TMM' => '795', 'TND' => '788', 'TOP' => '776', 'TPE' => '626',
52
+ 'TRL' => '792', 'TRY' => '949', 'TTD' => '780', 'TWD' => '901', 'TZS' => '834',
53
+ 'UAH' => '980', 'UGX' => '800', 'USD' => '840', 'UYU' => '858', 'UZS' => '860',
54
+ 'VEB' => '862', 'VND' => '704', 'VUV' => '548', 'XAF' => '950', 'XCD' => '951',
55
+ 'XOF' => '952', 'XPF' => '953', 'YER' => '886', 'YUM' => '891', 'ZAR' => '710',
56
+ 'ZMK' => '894', 'ZWD' => '716'
57
+ }
58
+
59
+ class Error < StandardError
60
+ attr_reader :response
61
+
62
+ def initialize(response, msg=nil)
63
+ @response = response
64
+ super(msg || response[:error])
65
+ end
66
+ end
67
+
21
68
  # Creates a new FirstDataGateway
22
69
  #
23
70
  # The gateway requires that a valid pem and password be passed
24
71
  # in the +options+ hash.
25
72
  #
26
- # Options:
27
- #
28
- # * <tt>:pem</tt> -- The First Data cert/key (REQUIRED)
29
- # * <tt>:pem_password</tt> -- The First Data password. (REQUIRED)
73
+ # @option options [String] :pem First Data cert/key (REQUIRED)
74
+ # @option options [String] :pem_password First Data cert password (REQUIRED)
30
75
  #
31
76
  def initialize(options = {})
32
77
  requires!(options, :pem, :pem_password)
@@ -37,12 +82,13 @@ module ActiveMerchant #:nodoc:
37
82
  # Perform a purchase, which is essentially an authorization and capture in a single operation.
38
83
  #
39
84
  # Registering of SMS transaction
40
- # @param int $amount transaction amount in minor units, mandatory
41
- # @param int $currency transaction currency code, mandatory
42
- # @param string $ip clientís IP address, mandatory
43
- # @param string $desc description of transaction, optional
44
- # @param string $language authorization language identificator, optional
45
- # @return string TRANSACTION_ID
85
+ #
86
+ # @param [Integer] amount transaction amount in minor units, mandatory
87
+ # @option params [Integer, String] :currency transaction currency code, mandatory
88
+ # @option params [String] :client_ip_addr client's IP address, mandatory
89
+ # @option params [String] :description description of transaction, optional
90
+ # @option params [String] :language authorization language identificator, optional
91
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID
46
92
  #
47
93
  def purchase(amount, params = {})
48
94
  params = params.reverse_merge(
@@ -50,6 +96,7 @@ module ActiveMerchant #:nodoc:
50
96
  :amount => amount,
51
97
  :currency => default_currency
52
98
  )
99
+ lookup_currency(params)
53
100
  requires!(params, :amount, :currency, :client_ip_addr)
54
101
  commit(params)
55
102
  end
@@ -58,12 +105,13 @@ module ActiveMerchant #:nodoc:
58
105
  # charge the card.
59
106
  #
60
107
  # Registering of DMS authorisation
61
- # @param int $amount transaction amount in minor units, mandatory
62
- # @param int $currency transaction currency code, mandatory
63
- # @param string $ip clientís IP address, mandatory
64
- # @param string $desc description of transaction, optional
65
- # @param string $language authorization language identificator, optional
66
- # @return string TRANSACTION_ID
108
+ #
109
+ # @param [Integer] amount transaction amount in minor units, mandatory
110
+ # @option params [Integer, String] :currency transaction currency code, mandatory
111
+ # @option params [String] :client_ip_addr client's IP address, mandatory
112
+ # @option params [String] :description description of transaction, optional
113
+ # @option params [String] :language authorization language identificator, optional
114
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID
67
115
  #
68
116
  def authorize(amount, params = {})
69
117
  params = params.reverse_merge(
@@ -72,6 +120,7 @@ module ActiveMerchant #:nodoc:
72
120
  :amount => amount,
73
121
  :currency => default_currency
74
122
  )
123
+ lookup_currency(params)
75
124
  requires!(params, :amount, :currency, :client_ip_addr, :msg_type)
76
125
  commit(params)
77
126
  end
@@ -79,12 +128,13 @@ module ActiveMerchant #:nodoc:
79
128
  # Captures the funds from an authorized transaction.
80
129
  #
81
130
  # Making of DMS transaction
82
- # @param int $auth_id id of previously made successeful authorisation
83
- # @param int $amount transaction amount in minor units, mandatory
84
- # @param int $currency transaction currency code, mandatory
85
- # @param string $ip clientís IP address, mandatory
86
- # @param string $desc description of transaction, optional
87
- # @return string RESULT, RESULT_CODE, RRN, APPROVAL_CODE
131
+ #
132
+ # @param [Integer] amount transaction amount in minor units, mandatory
133
+ # @param [Integer] trans_id id of previously made successeful authorisation
134
+ # @option params [Integer, String] :currency transaction currency code, mandatory
135
+ # @option params [String] :client_ip_addr client's IP address, mandatory
136
+ # @option params [String] :description description of transaction, optional
137
+ # @return [ActiveSupport::HashWithIndifferentAccess] RESULT, RESULT_CODE, RRN, APPROVAL_CODE
88
138
  #
89
139
  def capture(amount, trans_id, params = {})
90
140
  params = params.reverse_merge(
@@ -94,15 +144,16 @@ module ActiveMerchant #:nodoc:
94
144
  :amount => amount,
95
145
  :currency => default_currency
96
146
  )
147
+ lookup_currency(params)
97
148
  requires!(params, :trans_id, :amount, :currency, :client_ip_addr)
98
149
  commit(params)
99
150
  end
100
151
 
101
152
  # Transaction result
102
153
  #
103
- # @param int $trans_id transaction identifier, mandatory
104
- # @param string $ip clientís IP address, mandatory
105
- # @return string RESULT, RESULT_CODE, 3DSECURE, AAV, RRN, APPROVAL_CODE
154
+ # @param [Integer] trans_id transaction identifier, mandatory
155
+ # @option params [String] :client_ip_addr client's IP address, mandatory
156
+ # @return [ActiveSupport::HashWithIndifferentAccess] RESULT, RESULT_CODE, 3DSECURE, AAV, RRN, APPROVAL_CODE
106
157
  #
107
158
  def result(trans_id, params = {})
108
159
  params = params.reverse_merge(
@@ -113,14 +164,15 @@ module ActiveMerchant #:nodoc:
113
164
  commit(params)
114
165
  end
115
166
 
116
- # credit() allows you to return money to a card that was previously billed.
167
+ # refund() allows you to return money to a card that was previously billed.
117
168
  #
118
169
  # Transaction reversal
119
- # @param int $trans_id transaction identifier, mandatory
120
- # @param int $amount transaction amount in minor units, mandatory
121
- # @return string RESULT, RESULT_CODE
122
170
  #
123
- def credit(amount, trans_id = nil)
171
+ # @param [Integer] amount transaction amount in minor units, mandatory
172
+ # @param [Integer] trans_id transaction identifier, mandatory
173
+ # @return [ActiveSupport::HashWithIndifferentAccess] RESULT, RESULT_CODE
174
+ #
175
+ def refund(amount, trans_id = nil)
124
176
  params = {
125
177
  :command => :r,
126
178
  :trans_id => trans_id,
@@ -130,6 +182,95 @@ module ActiveMerchant #:nodoc:
130
182
  commit(params)
131
183
  end
132
184
 
185
+ def credit(amount, trans_id = nil)
186
+ deprecated CREDIT_DEPRECATION_MESSAGE
187
+ refund(amount, trans_id)
188
+ end
189
+
190
+ # Register new recurring payment along with the first payment
191
+ #
192
+ # @param [Integer] amount transaction amount in minor units, mandatory (up to 12 digits)
193
+ # @option params [Integer, String] :currency transaction currency code, mandatory
194
+ # @option params [String] :client_ip_addr client's IP address, mandatory
195
+ # @option params [String] :description transaction details, mandatory (up to 125 characters)
196
+ # @option params [String] :biller_client_id recurring payment identifier, mandatory (up to 30 characters)
197
+ # @option params [String] :perspayee_expiry preferred deadline for a Recurring payment, mandatory (MMYY)
198
+ # (system will compare two expiry dates - recurring payment expiry date provided by Merchant and
199
+ # card expiry date provided by Cardholder. In response Merchant will receive back the earliest expiry dates of both).
200
+ # For example, Recurring payment date is 1214 but card expiry date 1213 then Merchant will receive back 1213.
201
+ # First Data system will save the earliest expiry date as Recurring payment expiry date.
202
+ # @option params [Integer] :perspayee_overwrite set to 1 to overwrite existing recurring payment card data
203
+ # together with payment, optional
204
+ # @option params [String] :language authorization language identificator, optional
205
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID
206
+ #
207
+ # Afterwards when transaction result is requested then result response includes also RECC_PMNT_ID and RECC_PMNT_EXPIRY
208
+ #
209
+ def recurring(amount, params = {})
210
+ params = params.reverse_merge(
211
+ :command => :z,
212
+ :amount => amount,
213
+ :currency => default_currency,
214
+ :msg_type => 'SMS',
215
+ :perspayee_gen => 1
216
+ )
217
+ lookup_currency(params)
218
+ requires!(params, :amount, :currency, :client_ip_addr, :description, :biller_client_id, :perspayee_expiry)
219
+ commit(params)
220
+ end
221
+
222
+ # Execute subsequent recurring payment
223
+ #
224
+ # @param [Integer] amount transaction amount in minor units, mandatory (up to 12 digits)
225
+ # @option params [Integer, String] :currency transaction currency code, mandatory
226
+ # @option params [String] :client_ip_addr client's IP address, mandatory
227
+ # (the same IP address which was provided when registered recurring payment)
228
+ # @option params [String] :description transaction details, mandatory (up to 125 characters)
229
+ # @option params [String] :biller_client_id recurring payment identifier, mandatory (up to 30 characters)
230
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID, RESULT, RESULT_CODE, RRN, APPROVAL_CODE
231
+ #
232
+ def execute_recurring(amount, params = {})
233
+ params = params.reverse_merge(
234
+ :command => :e,
235
+ :amount => amount,
236
+ :currency => default_currency
237
+ )
238
+ lookup_currency(params)
239
+ requires!(params, :amount, :currency, :client_ip_addr, :description, :biller_client_id)
240
+ commit(params)
241
+ end
242
+
243
+ # Overwriting existing recurring payment card data without payment
244
+ #
245
+ # @option params [Integer, String] :currency transaction currency code, mandatory
246
+ # @option params [String] :client_ip_addr client's IP address, mandatory
247
+ # @option params [String] :description transaction details, mandatory (up to 125 characters)
248
+ # @option params [String] :biller_client_id existing recurring payment identifier, mandatory (up to 30 characters)
249
+ # @option params [String] :perspayee_expiry preferred deadline for a Recurring payment, mandatory (MMYY)
250
+ # (system will compare two expiry dates - recurring payment expiry date provided by Merchant and
251
+ # card expiry date provided by Cardholder. In response Merchant will receive back the earliest expiry dates of both).
252
+ # For example, Recurring payment date is 1214 but card expiry date 1213 then Merchant will receive back 1213.
253
+ # First Data system will save the earliest expiry date as Recurring payment expiry date.
254
+ # @option params [String] :language authorization language identificator, optional
255
+ # @return [ActiveSupport::HashWithIndifferentAccess] TRANSACTION_ID
256
+ #
257
+ # Afterwards when transaction result is requested then result response includes also RECC_PMNT_ID and RECC_PMNT_EXPIRY
258
+ #
259
+ def update_recurring(params = {})
260
+ params = params.reverse_merge(
261
+ :command => :p,
262
+ :amount => 0,
263
+ :currency => default_currency,
264
+ :msg_type => 'SMS',
265
+ :msg_type => 'AUTH',
266
+ :perspayee_gen => 1,
267
+ :perspayee_overwrite => 1
268
+ )
269
+ lookup_currency(params)
270
+ requires!(params, :currency, :client_ip_addr, :description, :biller_client_id, :perspayee_expiry)
271
+ commit(params)
272
+ end
273
+
133
274
  # Close business day.
134
275
  def close_day
135
276
  commit({ :command => :b })
@@ -139,12 +280,18 @@ module ActiveMerchant #:nodoc:
139
280
  test? ? test_url : live_url
140
281
  end
141
282
 
142
- def redirect_url
143
- test? ? test_redirect_url : live_redirect_url
283
+ def redirect_url(trans_id = nil)
284
+ url = test? ? test_redirect_url : live_redirect_url
285
+ url += "?trans_id=#{CGI.escape trans_id}" if trans_id
286
+ url
144
287
  end
145
288
 
146
289
  private
147
290
 
291
+ def lookup_currency(params)
292
+ params[:currency] = CURRENCY_CODES[params[:currency]] || params[:currency]
293
+ end
294
+
148
295
  # Convert HTTP response body to a Ruby Hash.
149
296
  def parse(body)
150
297
  results = ActiveSupport::HashWithIndifferentAccess.new
@@ -157,7 +304,9 @@ module ActiveMerchant #:nodoc:
157
304
 
158
305
  def commit(params = {})
159
306
  response = parse(ssl_post(endpoint_url, post_data(params)))
160
- raise response[:error] unless response[:error].blank?
307
+ # FIXME: test cases 17 and 19 return unnecessary error even when result and result_code are present
308
+ # should be removed when this issue is fixed on gataway side
309
+ raise Error.new(response) if !response[:error].blank? && response[:result_code].blank?
161
310
  response
162
311
  end
163
312
 
metadata CHANGED
@@ -1,73 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_merchant_first_data
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
4
  prerelease:
5
+ version: 1.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Edgars Beigarts
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-07-08 00:00:00.000000000 +03:00
13
- default_executable:
12
+ date: 2013-02-09 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
- name: activemerchant
17
- requirement: &2152366380 !ruby/object:Gem::Requirement
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.15.0
18
20
  none: false
21
+ prerelease: false
22
+ name: activemerchant
23
+ requirement: !ruby/object:Gem::Requirement
19
24
  requirements:
20
25
  - - ! '>='
21
26
  - !ruby/object:Gem::Version
22
27
  version: 1.15.0
28
+ none: false
23
29
  type: :runtime
24
- prerelease: false
25
- version_requirements: *2152366380
26
30
  - !ruby/object:Gem::Dependency
27
- name: rake
28
- requirement: &2152366000 !ruby/object:Gem::Requirement
31
+ version_requirements: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
29
36
  none: false
37
+ prerelease: false
38
+ name: rake
39
+ requirement: !ruby/object:Gem::Requirement
30
40
  requirements:
31
41
  - - ! '>='
32
42
  - !ruby/object:Gem::Version
33
43
  version: '0'
44
+ none: false
34
45
  type: :development
35
- prerelease: false
36
- version_requirements: *2152366000
37
46
  - !ruby/object:Gem::Dependency
38
- name: rspec
39
- requirement: &2152365440 !ruby/object:Gem::Requirement
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ~>
50
+ - !ruby/object:Gem::Version
51
+ version: '2.10'
40
52
  none: false
53
+ prerelease: false
54
+ name: rspec
55
+ requirement: !ruby/object:Gem::Requirement
41
56
  requirements:
42
57
  - - ~>
43
58
  - !ruby/object:Gem::Version
44
- version: 2.6.0
59
+ version: '2.10'
60
+ none: false
45
61
  type: :development
46
- prerelease: false
47
- version_requirements: *2152365440
48
62
  - !ruby/object:Gem::Dependency
49
- name: vcr
50
- requirement: &2152365020 !ruby/object:Gem::Requirement
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: '1.11'
51
68
  none: false
69
+ prerelease: false
70
+ name: vcr
71
+ requirement: !ruby/object:Gem::Requirement
52
72
  requirements:
53
- - - ! '>='
73
+ - - ~>
54
74
  - !ruby/object:Gem::Version
55
- version: '0'
75
+ version: '1.11'
76
+ none: false
56
77
  type: :development
57
- prerelease: false
58
- version_requirements: *2152365020
59
78
  - !ruby/object:Gem::Dependency
60
- name: fakeweb
61
- requirement: &2152364560 !ruby/object:Gem::Requirement
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: '1.3'
62
84
  none: false
85
+ prerelease: false
86
+ name: fakeweb
87
+ requirement: !ruby/object:Gem::Requirement
63
88
  requirements:
64
- - - ! '>='
89
+ - - ~>
65
90
  - !ruby/object:Gem::Version
66
- version: '0'
91
+ version: '1.3'
92
+ none: false
67
93
  type: :development
68
- prerelease: false
69
- version_requirements: *2152364560
70
- description: First Data gateway for Active Merchant
94
+ description: First Data Latvia gateway for Active Merchant
71
95
  email:
72
96
  - edgars.beigarts@makit.lv
73
97
  executables: []
@@ -78,7 +102,6 @@ files:
78
102
  - lib/active_merchant_first_data.rb
79
103
  - README.md
80
104
  - LICENSE
81
- has_rdoc: true
82
105
  homepage: https://github.com/ebeigarts/active_merchant_first_data
83
106
  licenses: []
84
107
  post_install_message:
@@ -86,21 +109,27 @@ rdoc_options: []
86
109
  require_paths:
87
110
  - lib
88
111
  required_ruby_version: !ruby/object:Gem::Requirement
89
- none: false
90
112
  requirements:
91
113
  - - ! '>='
92
114
  - !ruby/object:Gem::Version
93
115
  version: '0'
94
- required_rubygems_version: !ruby/object:Gem::Requirement
116
+ segments:
117
+ - 0
118
+ hash: 4550487914721957976
95
119
  none: false
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
121
  requirements:
97
122
  - - ! '>='
98
123
  - !ruby/object:Gem::Version
99
124
  version: '0'
125
+ segments:
126
+ - 0
127
+ hash: 4550487914721957976
128
+ none: false
100
129
  requirements: []
101
130
  rubyforge_project:
102
- rubygems_version: 1.6.2
131
+ rubygems_version: 1.8.24
103
132
  signing_key:
104
133
  specification_version: 3
105
- summary: First Data gateway for Active Merchant
134
+ summary: First Data Latvia gateway for Active Merchant
106
135
  test_files: []