eligible 2.5.0 → 2.6.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/ChangeLog CHANGED
@@ -1,3 +1,11 @@
1
+ 2016-02-23 Eligible <support@eligible.com>
2
+
3
+ * 2.6.0
4
+ - Added new endpoints customer, original signature pdf and payer.
5
+ - Added specs
6
+ - Bumped api version to 1.5
7
+ - Fixed few bugs
8
+
1
9
  2016-01-07 Eligible <support@eligible.com>
2
10
 
3
11
  * 2.5.0
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Eligible
2
2
 
3
- [![Circle CI](https://circleci.com/gh/eligible/eligible-ruby.svg?style=svg)](https://circleci.com/gh/eligible/eligible-ruby)
3
+ [![Circle CI](https://circleci.com/gh/eligible/eligible-ruby.svg?style=svg)](https://circleci.com/gh/eligible/eligible-ruby) [![Code Climate](https://codeclimate.com/github/eligible/eligible-ruby/badges/gpa.svg)](https://codeclimate.com/github/eligible/eligible-ruby)
4
4
 
5
5
  Ruby bindings for the [Eligible API](https://eligible.com/rest)
6
6
 
data/Rakefile CHANGED
@@ -12,3 +12,9 @@ RuboCop::RakeTask.new(:rubocop) do |task|
12
12
  end
13
13
 
14
14
  task default: [:rubocop, :spec]
15
+
16
+ desc 'Runs code coverage'
17
+ task :rcov do
18
+ ENV['COVERAGE'] = 'true'
19
+ Rake::Task[:spec].invoke
20
+ end
@@ -12,6 +12,7 @@ require 'eligible/util'
12
12
  require 'eligible/json'
13
13
  require 'eligible/eligible_object'
14
14
  require 'eligible/api_resource'
15
+ require 'eligible/coverage_resource'
15
16
  require 'eligible/demographic'
16
17
  require 'eligible/claim'
17
18
  require 'eligible/enrollment'
@@ -20,6 +21,9 @@ require 'eligible/payment'
20
21
  require 'eligible/x12'
21
22
  require 'eligible/medicare'
22
23
  require 'eligible/ticket'
24
+ require 'eligible/customer'
25
+ require 'eligible/original_signature_pdf'
26
+ require 'eligible/payer'
23
27
 
24
28
  # Errors
25
29
  require 'eligible/errors/eligible_error'
@@ -28,11 +32,10 @@ require 'eligible/errors/authentication_error'
28
32
  require 'eligible/errors/api_error'
29
33
  require 'eligible/errors/invalid_request_error'
30
34
 
31
- # rubocop:disable Metrics/ModuleLength, Style/ClassVars
32
35
  module Eligible
33
36
  @@api_key = nil
34
37
  @@test = false
35
- @@api_version = 1.1
38
+ @@api_version = '1.5'
36
39
  @@api_base = "https://gds.eligibleapi.com/v#{@@api_version}"
37
40
  @@fingerprints = %w(79d62e8a9d59ae687372f8e71345c76d92527fac 4b2c6888ede79d0ee47339dc6fab5a6d0dc3cb0e)
38
41
 
@@ -81,7 +84,10 @@ module Eligible
81
84
  @@fingerprints << digest
82
85
  end
83
86
 
84
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
87
+ def self.direct_response?(params)
88
+ params[:format].is_a?(String) && params[:format].downcase == 'x12'
89
+ end
90
+
85
91
  def self.request(method, url, api_key, params = {}, headers = {})
86
92
  api_key ||= @@api_key
87
93
  test = self.test
@@ -104,7 +110,7 @@ module Eligible
104
110
  # POST requests, parameters as json in the body
105
111
  url = api_url(url)
106
112
  case method.to_s.downcase.to_sym
107
- when :get, :head
113
+ when :get, :head, :delete
108
114
  url += "?api_key=#{api_key}"
109
115
  if params && params.count > 0
110
116
  query_string = Util.flatten_params(params).collect { |key, value| "#{key}=#{Util.url_encode(value)}" }.join('&')
@@ -113,7 +119,8 @@ module Eligible
113
119
  url += "&test=#{test}"
114
120
  payload = nil
115
121
  else
116
- payload = Eligible::JSON.dump(params.merge!('api_key' => api_key, 'test' => test))
122
+ params.merge!('api_key' => api_key, 'test' => test)
123
+ payload = params.key?(:file) ? params : Eligible::JSON.dump(params)
117
124
  end
118
125
 
119
126
  begin
@@ -145,43 +152,44 @@ module Eligible
145
152
 
146
153
  begin
147
154
  response = execute_request(opts)
155
+
148
156
  rescue SocketError => e
149
157
  handle_restclient_error(e)
158
+
150
159
  rescue NoMethodError => e
151
160
  # Work around RestClient bug
152
- if e.message =~ /\WRequestFailed\W/
153
- e = APIConnectionError.new('Unexpected HTTP response code')
154
- handle_restclient_error(e)
155
- else
156
- raise
157
- end
158
- # rubocop:disable Lint/AssignmentInCondition, Style/AndOr
161
+ raise unless e.message =~ /\WRequestFailed\W/
162
+
163
+ e = APIConnectionError.new('Unexpected HTTP response code')
164
+ handle_restclient_error(e)
165
+
159
166
  rescue RestClient::ExceptionWithResponse => e
160
- if rcode = e.http_code and rbody = e.http_body
161
- handle_api_error(rcode, rbody)
167
+ err_rcode = e.http_code
168
+ err_rbody = e.http_body
169
+
170
+ if err_rcode && err_rbody
171
+ handle_api_error(err_rcode, err_rbody)
162
172
  else
163
173
  handle_restclient_error(e)
164
174
  end
175
+
165
176
  rescue RestClient::Exception, Errno::ECONNREFUSED => e
166
177
  handle_restclient_error(e)
167
178
  end
168
179
 
169
180
  rbody = response.body
170
181
  rcode = response.code
182
+
171
183
  begin
172
184
  # Would use :symbolize_names => true, but apparently there is
173
185
  # some library out there that makes symbolize_names not work.
174
- resp = if params[:format] && params[:format].downcase == 'x12' || url[-4..-1].downcase == '/x12'
175
- rbody
176
- else
177
- Eligible::JSON.load(rbody)
178
- end
186
+ resp = direct_response?(params) ? rbody : Eligible::JSON.load(rbody)
179
187
  rescue MultiJson::DecodeError
180
188
  raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})", rcode, rbody)
181
189
  end
182
190
 
183
191
  resp = Util.symbolize_names(resp)
184
- [resp, api_key]
192
+ return [ resp, api_key ]
185
193
  end
186
194
 
187
195
  def self.verify_certificate
@@ -208,7 +216,12 @@ module Eligible
208
216
  RestClient::Request.execute(opts)
209
217
  end
210
218
 
211
- # rubocop:disable Style/SignalException
219
+ def self.error_message(error)
220
+ return error.to_s unless error.is_a?(Hash)
221
+ result = error[:details] || error[:reject_reason_description] || error
222
+ return result.to_s
223
+ end
224
+
212
225
  def self.handle_api_error(rcode, rbody)
213
226
  begin
214
227
  error_obj = Eligible::JSON.load(rbody)
@@ -219,7 +232,7 @@ module Eligible
219
232
  raise APIError.new("Invalid response object from API: #{rbody.inspect} (HTTP response code was #{rcode})", rcode, rbody)
220
233
  end
221
234
 
222
- error_msg = error[:details] || error[:reject_reason_description]
235
+ error_msg = error_message(error)
223
236
 
224
237
  case rcode
225
238
  when 400, 404 then
@@ -10,5 +10,15 @@ module Eligible
10
10
  end
11
11
  "/#{CGI.escape(class_name.downcase)}/"
12
12
  end
13
+
14
+ def self.require_param(value, name)
15
+ fail ArgumentError, "#{name} of the claim is required" if value.nil? || (value.is_a?(String) && value.empty?)
16
+ end
17
+
18
+ def self.send_request(method, url, api_key, params, required_param_name = nil)
19
+ require_param(params[required_param_name], required_param_name) unless required_param_name.nil?
20
+ response, api_key = Eligible.request(method, url, api_key, params)
21
+ Util.convert_to_eligible_object(response, api_key)
22
+ end
13
23
  end
14
24
  end
@@ -1,22 +1,25 @@
1
1
  module Eligible
2
2
  class Claim < APIResource
3
- def self.get(params, api_key = nil)
4
- response, api_key = Eligible.request(:get, "/claims/acknowledgements/#{params[:reference_id]}.json", api_key, params)
5
- Util.convert_to_eligible_object(response, api_key)
3
+ def self.ack(params, api_key = nil)
4
+ send_request(:get, "/claims/#{params[:reference_id]}/acknowledgements.json", api_key, params, :reference_id)
6
5
  end
7
6
 
8
7
  def self.post(params, api_key = nil)
9
- response, api_key = Eligible.request(:post, '/claims.json', api_key, params)
10
- Util.convert_to_eligible_object(response, api_key)
8
+ send_request(:post, '/claims.json', api_key, params)
11
9
  end
12
10
 
13
- def self.all(api_key = nil)
14
- response, api_key = Eligible.request(:get, '/claims/acknowledgements.json', api_key)
15
- Util.convert_to_eligible_object(response, api_key)
11
+ def self.acks(params, api_key = nil)
12
+ send_request(:get, '/claims/acknowledgements.json', api_key, params)
16
13
  end
17
14
 
18
- def status
19
- error ? nil : to_hash
15
+ def self.payment_report(params, api_key = nil)
16
+ require_param(params[:reference_id], 'Reference id')
17
+ url = params.key?(:id) ? "/claims/#{params[:reference_id]}/payment_reports/#{params[:id]}" : "/claims/#{params[:reference_id]}/payment_reports"
18
+ send_request(:get, url, api_key, params)
19
+ end
20
+
21
+ def self.payment_reports(params, api_key = nil)
22
+ send_request(:get, '/claims/payment_reports.json', api_key, params)
20
23
  end
21
24
  end
22
25
  end
@@ -1,23 +1,19 @@
1
1
  module Eligible
2
- class Coverage < APIResource
3
- def self.get(params, api_key = nil)
4
- response, api_key = Eligible.request(:get, '/coverage/all.json', api_key, params)
5
- Util.convert_to_eligible_object(response, api_key)
2
+ class Coverage < CoverageResource
3
+ def self.get_uri
4
+ return '/coverage/all.json'
6
5
  end
7
6
 
8
- def self.cost_estimate(params, api_key = nil)
9
- response, api_key = Eligible.request(:get, '/coverage/cost_estimate.json', api_key, params)
10
- Util.convert_to_eligible_object(response, api_key)
7
+ def self.post_uri
8
+ return '/coverage/all/batch.json'
11
9
  end
12
10
 
13
- def self.batch_post(params, api_key = nil)
14
- response, api_key = Eligible.request(:post, '/coverage/all/batch.json', api_key, params)
15
- Util.convert_to_eligible_object(response, api_key)
11
+ def self.cost_estimate(params, api_key = nil)
12
+ send_request(:get, '/coverage/cost_estimates.json', api_key, params)
16
13
  end
17
14
 
18
15
  def self.batch_medicare_post(params, api_key = nil)
19
- response, api_key = Eligible.request(:post, '/medicare/coverage/batch.json', api_key, params)
20
- Util.convert_to_eligible_object(response, api_key)
16
+ send_request(:post, '/medicare/coverage/batch.json', api_key, params)
21
17
  end
22
18
  end
23
19
  end
@@ -0,0 +1,19 @@
1
+ module Eligible
2
+ class CoverageResource < APIResource
3
+ def self.get(params, api_key = nil)
4
+ send_request(:get, get_uri, api_key, params)
5
+ end
6
+
7
+ def self.batch_post(params, api_key = nil)
8
+ send_request(:post, post_uri, api_key, params)
9
+ end
10
+
11
+ def self.get_uri
12
+ fail NotImplementedError, "Please implement class method #{self}.get_uri"
13
+ end
14
+
15
+ def self.post_uri
16
+ fail NotImplementedError, "Please implement class method #{self}.post_uri"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Eligible
2
+ class Customer < APIResource
3
+ def self.get(params, api_key = nil)
4
+ send_request(:get, "/customers/#{params[:customer_id]}.json", api_key, params, :customer_id)
5
+ end
6
+
7
+ def self.post(params, api_key = nil)
8
+ send_request(:post, '/customers.json', api_key, params)
9
+ end
10
+
11
+ def self.update(params, api_key = nil)
12
+ send_request(:put, "/customers/#{params[:customer_id]}.json", api_key, params, :customer_id)
13
+ end
14
+
15
+ def self.all(params, api_key = nil)
16
+ send_request(:get, '/customers.json', api_key, params)
17
+ end
18
+ end
19
+ end
@@ -1,13 +1,11 @@
1
1
  module Eligible
2
- class Demographic < APIResource
3
- def self.get(params, api_key = nil)
4
- response, api_key = Eligible.request(:get, '/demographic/all.json', api_key, params)
5
- Util.convert_to_eligible_object(response, api_key)
2
+ class Demographic < CoverageResource
3
+ def self.get_uri
4
+ return '/demographic/all.json'
6
5
  end
7
6
 
8
- def self.batch_post(params, api_key = nil)
9
- response, api_key = Eligible.request(:post, '/demographic/all/batch.json', api_key, params)
10
- Util.convert_to_eligible_object(response, api_key)
7
+ def self.post_uri
8
+ return '/demographic/all/batch.json'
11
9
  end
12
10
  end
13
11
  end
@@ -4,7 +4,7 @@ module Eligible
4
4
 
5
5
  attr_accessor :api_key
6
6
  attr_accessor :eligible_id
7
- # rubocop:disable Style/ClassVars
7
+
8
8
  @@permanent_attributes = Set.new([:api_key, :error, :balance, :address, :dob])
9
9
 
10
10
  # The default :id method is deprecated and isn't useful to us
@@ -26,7 +26,6 @@ module Eligible
26
26
  obj
27
27
  end
28
28
 
29
- # rubocop:disable Metrics/AbcSize
30
29
  def refresh_from(values, api_key, partial = false)
31
30
  @api_key = api_key
32
31
 
@@ -1,18 +1,19 @@
1
1
  module Eligible
2
2
  class Enrollment < APIResource
3
3
  def self.get(params, api_key = nil)
4
- response, api_key = Eligible.request(:get, "/enrollment_npis/#{params[:enrollment_npi_id]}.json", api_key, params)
5
- Util.convert_to_eligible_object(response, api_key)
4
+ send_request(:get, "/enrollment_npis/#{params[:enrollment_npi_id]}.json", api_key, params, :enrollment_npi_id)
5
+ end
6
+
7
+ def self.list(params, api_key = nil)
8
+ send_request(:get, '/enrollment_npis.json', api_key, params)
6
9
  end
7
10
 
8
11
  def self.post(params, api_key = nil)
9
- response, api_key = Eligible.request(:post, '/enrollment_npis.json', api_key, params)
10
- Util.convert_to_eligible_object(response, api_key)
12
+ send_request(:post, '/enrollment_npis.json', api_key, params)
11
13
  end
12
14
 
13
15
  def self.update(params, api_key = nil)
14
- response, api_key = Eligible.request(:put, "/enrollment_npis/#{params[:enrollment_npi_id]}.json", api_key, params)
15
- Util.convert_to_eligible_object(response, api_key)
16
+ send_request(:put, "/enrollment_npis/#{params[:enrollment_npi_id]}.json", api_key, params, :enrollment_npi_id)
16
17
  end
17
18
 
18
19
  def enrollment_npis
@@ -1,13 +1,11 @@
1
1
  module Eligible
2
- class Medicare < APIResource
3
- def self.get(params, api_key = nil)
4
- response, api_key = Eligible.request(:get, '/medicare/coverage.json', api_key, params)
5
- Util.convert_to_eligible_object(response, api_key)
2
+ class Medicare < CoverageResource
3
+ def self.get_uri
4
+ return '/medicare/coverage.json'
6
5
  end
7
6
 
8
- def self.batch_post(params, api_key = nil)
9
- response, api_key = Eligible.request(:post, '/medicare/coverage/batch.json', api_key, params)
10
- Util.convert_to_eligible_object(response, api_key)
7
+ def self.post_uri
8
+ return '/medicare/coverage/batch.json'
11
9
  end
12
10
  end
13
11
  end
@@ -0,0 +1,29 @@
1
+ module Eligible
2
+ class OriginalSignaturePdf < APIResource
3
+ def self.get(params, api_key = nil)
4
+ send_request(:get, "/enrollment_npis/#{params[:enrollment_npi_id]}/original_signature_pdf", api_key, params, :enrollment_npi_id)
5
+ end
6
+
7
+ def self.post(params, api_key = nil)
8
+ send_request(:post, "/enrollment_npis/#{params[:enrollment_npi_id]}/original_signature_pdf", api_key, params, :enrollment_npi_id)
9
+ end
10
+
11
+ def self.update(params, api_key = nil)
12
+ send_request(:put, "/enrollment_npis/#{params[:enrollment_npi_id]}/original_signature_pdf", api_key, params, :enrollment_npi_id)
13
+ end
14
+
15
+ def self.delete(params, api_key = nil)
16
+ send_request(:delete, "/enrollment_npis/#{params[:enrollment_npi_id]}/original_signature_pdf", api_key, params, :enrollment_npi_id)
17
+ end
18
+
19
+ def self.download(params, api_key = nil)
20
+ require_param(params[:enrollment_npi_id], 'Enrollment Npi id')
21
+ params[:format] = 'x12'
22
+ response = Eligible.request(:get, "/enrollment_npis/#{params[:enrollment_npi_id]}/original_signature_pdf/download", api_key, params)[0]
23
+ filename = params[:filename] || '/tmp/original_signature_pdf.pdf'
24
+ file = File.new(filename, 'w')
25
+ file.write response
26
+ file.close
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module Eligible
2
+ class Payer < APIResource
3
+ def self.list(params, api_key = nil)
4
+ send_request(:get, '/payers.json', api_key, params)
5
+ end
6
+
7
+ def self.get(params, api_key = nil)
8
+ send_request(:get, "/payers/#{params[:payer_id]}.json", api_key, params, :payer_id)
9
+ end
10
+
11
+ def self.search_options(params, api_key = nil)
12
+ url = params.key?(:payer_id) ? "/payers/#{params[:payer_id]}/search_options" : '/payers/search_options'
13
+ send_request(:get, url, api_key, params)
14
+ end
15
+ end
16
+ end
@@ -1,8 +1,7 @@
1
1
  module Eligible
2
2
  class Payment < APIResource
3
3
  def self.get(params, api_key = nil)
4
- response, api_key = Eligible.request(:get, '/payment/status.json', api_key, params)
5
- Util.convert_to_eligible_object(response, api_key)
4
+ send_request(:get, '/payment/status.json', api_key, params)
6
5
  end
7
6
  end
8
7
  end
@@ -1,33 +1,27 @@
1
1
  module Eligible
2
2
  class Ticket < APIResource
3
3
  def self.create(params, api_key = nil)
4
- response, api_key = Eligible.request(:post, '/tickets', api_key, params)
5
- Util.convert_to_eligible_object(response, api_key)
4
+ send_request(:post, '/tickets', api_key, params)
6
5
  end
7
6
 
8
7
  def self.comments(params, api_key = nil)
9
- response, api_key = Eligible.request(:post, "/tickets/#{params[:id]}/comments", api_key, params)
10
- Util.convert_to_eligible_object(response, api_key)
8
+ send_request(:post, "/tickets/#{params[:id]}/comments", api_key, params, :id)
11
9
  end
12
10
 
13
- def self.all
14
- response, api_key = Eligible.request(:get, '/tickets', api_key)
15
- Util.convert_to_eligible_object(response, api_key)
11
+ def self.all(params, api_key = nil)
12
+ send_request(:get, '/tickets', api_key, params)
16
13
  end
17
14
 
18
15
  def self.get(params, api_key = nil)
19
- response, api_key = Eligible.request(:get, "/tickets/#{params[:id]}", api_key, params)
20
- Util.convert_to_eligible_object(response, api_key)
16
+ send_request(:get, "/tickets/#{params[:id]}", api_key, params, :id)
21
17
  end
22
18
 
23
19
  def self.delete(params, api_key = nil)
24
- response, api_key = Eligible.request(:delete, "/tickets/#{params[:id]}", api_key, params)
25
- Util.convert_to_eligible_object(response, api_key)
20
+ send_request(:delete, "/tickets/#{params[:id]}", api_key, params, :id)
26
21
  end
27
22
 
28
23
  def self.update(params, api_key = nil)
29
- response, api_key = Eligible.request(:put, "/tickets/#{params[:id]}", api_key, params)
30
- Util.convert_to_eligible_object(response, api_key)
24
+ send_request(:put, "/tickets/#{params[:id]}", api_key, params, :id)
31
25
  end
32
26
  end
33
27
  end