eligible 2.5.0 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
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