eligible 2.5.0 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +29 -0
- data/.rspec +1 -0
- data/.rubocop.yml +1156 -2
- data/ChangeLog +8 -0
- data/README.md +1 -1
- data/Rakefile +6 -0
- data/lib/eligible.rb +35 -22
- data/lib/eligible/api_resource.rb +10 -0
- data/lib/eligible/claim.rb +13 -10
- data/lib/eligible/coverage.rb +8 -12
- data/lib/eligible/coverage_resource.rb +19 -0
- data/lib/eligible/customer.rb +19 -0
- data/lib/eligible/demographic.rb +5 -7
- data/lib/eligible/eligible_object.rb +1 -2
- data/lib/eligible/enrollment.rb +7 -6
- data/lib/eligible/medicare.rb +5 -7
- data/lib/eligible/original_signature_pdf.rb +29 -0
- data/lib/eligible/payer.rb +16 -0
- data/lib/eligible/payment.rb +1 -2
- data/lib/eligible/ticket.rb +7 -13
- data/lib/eligible/util.rb +14 -10
- data/lib/eligible/version.rb +1 -1
- data/lib/eligible/x12.rb +2 -2
- metadata +8 -3
data/ChangeLog
CHANGED
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
data/lib/eligible.rb
CHANGED
@@ -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.
|
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
|
-
|
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
|
-
|
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
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
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
|
-
|
161
|
-
|
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 =
|
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
|
-
|
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
|
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
|
data/lib/eligible/claim.rb
CHANGED
@@ -1,22 +1,25 @@
|
|
1
1
|
module Eligible
|
2
2
|
class Claim < APIResource
|
3
|
-
def self.
|
4
|
-
|
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
|
-
|
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.
|
14
|
-
|
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
|
19
|
-
|
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
|
data/lib/eligible/coverage.rb
CHANGED
@@ -1,23 +1,19 @@
|
|
1
1
|
module Eligible
|
2
|
-
class Coverage <
|
3
|
-
def self.
|
4
|
-
|
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.
|
9
|
-
|
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.
|
14
|
-
|
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
|
-
|
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
|
data/lib/eligible/demographic.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
module Eligible
|
2
|
-
class Demographic <
|
3
|
-
def self.
|
4
|
-
|
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.
|
9
|
-
|
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
|
-
|
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
|
|
data/lib/eligible/enrollment.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
module Eligible
|
2
2
|
class Enrollment < APIResource
|
3
3
|
def self.get(params, api_key = nil)
|
4
|
-
|
5
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/eligible/medicare.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
module Eligible
|
2
|
-
class Medicare <
|
3
|
-
def self.
|
4
|
-
|
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.
|
9
|
-
|
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
|
data/lib/eligible/payment.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
module Eligible
|
2
2
|
class Payment < APIResource
|
3
3
|
def self.get(params, api_key = nil)
|
4
|
-
|
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
|
data/lib/eligible/ticket.rb
CHANGED
@@ -1,33 +1,27 @@
|
|
1
1
|
module Eligible
|
2
2
|
class Ticket < APIResource
|
3
3
|
def self.create(params, api_key = nil)
|
4
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|