updox 0.10.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4abb521919676bd819a0befcc39c3838aad082ecd92df242fee2777b6cc23d07
4
- data.tar.gz: cf2d5d00d9534f305a5e3a5d198cf7f1b8290c389b8634d4711cdce6f23d1e80
3
+ metadata.gz: 6049aac6b73ee5ff489628158400adeb752a25f5688b7edf199f3e29a3adcefe
4
+ data.tar.gz: c4dfa73f09d4ee510f2d8cf7b6b7a4ae63ab63ac9df61dbfdccec437b8ad6f89
5
5
  SHA512:
6
- metadata.gz: 06e31ade821c10501af34cb8c83215006644d2c043d773126340f3953c9ed441bd5352ddd8e1f3556e5361d05547de9bcb0017f72e10c5aabb987d5dfd481a35
7
- data.tar.gz: 7ec78a84d960acc48a3fab2110a73ec1bff0b70d0b462b0a9f44b689e9a3f290f9e82b046bbec8d0928d212a41b36e17819dfc241766f434bc39ca23528ef678
6
+ metadata.gz: 58056e6ae6d7382fc1c47ee8099ced74f57edc6e1804057535853ad4d9ebc4af9acb5d51afbc984da5e454a8635f1631eb0f52673b240d3da53748b03e1e648c
7
+ data.tar.gz: '09d340be087a5a2b25dbce98459f9e4f5068f2564cd1c2b3b001130af04d292bb6a649644bdf13a87e298c353477ba0b52398a5ce7e18769769ffa2297a01deb'
@@ -4,7 +4,37 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [0.10.0] - [UNRELEASED]
7
+ ## [1.0.2] - [2020-12-29]
8
+ ### Fixed
9
+ - Bug where we serialized an `updox_status`
10
+
11
+ ## [1.0.1] - [2020-03-27]
12
+ ### Added
13
+ - Patient#reminderMethodId to set reminder preferences
14
+
15
+ ## [1.0.0] - [2020-02-25]
16
+ ### Added
17
+ - Aliases canceled to cancelled
18
+ - Patient#exists?
19
+
20
+ ### Fixed
21
+ - `failure_action = :raise` works better
22
+ - README fix for `failure_action` method
23
+
24
+ ## [0.12.0] - [2020-02-21]
25
+ ### Added
26
+ - Configuration to `raise` on non-success response
27
+ - Configuration to call a lambda on non-success response
28
+
29
+ ### Fixed
30
+ - Bug with `as_json` method
31
+ - Bug when no date returns on statuses
32
+
33
+ ## [0.11.0] - [2020-02-19]
34
+ ### Added
35
+ - More fields to User model
36
+
37
+ ## [0.10.0] - [2020-02-19]
8
38
  ### Fixed
9
39
  - Bug with User#exists? always returning true
10
40
 
@@ -76,7 +106,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
76
106
  ### Added
77
107
  - Initial Release with ability to ping Updox api
78
108
 
79
- [0.10.0]: https://github.com/WeInfuse/updox/compare/v0.9.0...HEAD
109
+ [1.0.2]: https://github.com/WeInfuse/updox/compare/v1.0.1...HEAD
110
+ [1.0.1]: https://github.com/WeInfuse/updox/compare/v1.0.0...v1.0.1
111
+ [1.0.0]: https://github.com/WeInfuse/updox/compare/v0.12.0...v1.0.0
112
+ [0.12.0]: https://github.com/WeInfuse/updox/compare/v0.11.0...v0.12.0
113
+ [0.11.0]: https://github.com/WeInfuse/updox/compare/v0.10.0...v0.11.0
114
+ [0.10.0]: https://github.com/WeInfuse/updox/compare/v0.9.0...v0.10.0
80
115
  [0.9.0]: https://github.com/WeInfuse/updox/compare/v0.8.0...v0.9.0
81
116
  [0.8.0]: https://github.com/WeInfuse/updox/compare/v0.7.0...v0.8.0
82
117
  [0.7.0]: https://github.com/WeInfuse/updox/compare/v0.6.0...v0.7.0
data/README.md CHANGED
@@ -146,9 +146,9 @@ response.practices # Has the practices as Updox::Models::Practice model
146
146
  response.items # Same as practices, always exists on any model if alias is broken
147
147
  response.item # If there is no array, we populate this object
148
148
 
149
- resposne.successful? # Indicates Updox successful indication
150
- resposne.response_code? # Indicates Updox response code
151
- resposne.response_message? # Indicates Updox response message
149
+ response.successful? # Indicates Updox successful indication
150
+ response.response_code? # Indicates Updox response code
151
+ response.response_message? # Indicates Updox response message
152
152
 
153
153
  response.response # Raw HTTParty response is here
154
154
  ```
@@ -159,8 +159,9 @@ response.response # Raw HTTParty response is here
159
159
  Updox.configure do |c|
160
160
  c.application_id = ENV['UPDOX_APP_ID']
161
161
  c.application_password = ENV['UPDOX_APP_PASS']
162
- c.api_endpoint = 'http://hello.com' # Defaults to Updox endpoint
162
+ c.api_endpoint = Updox::Connection::PROD_ENDPOINT # Defaults to Updox QA endpoint
163
163
  c.parse_responses = false # Defaults to true
164
+ c.failure_action = :raise # Defaults to do nothing and allows lambdas
164
165
  end
165
166
  ```
166
167
 
@@ -4,6 +4,8 @@ require 'updox/version'
4
4
  require 'updox/updox_exception'
5
5
  require 'updox/connection'
6
6
  require 'updox/models/model'
7
+ require 'updox/models/extensions/exists'
8
+ require 'updox/models/extensions/sync'
7
9
  require 'updox/models/auth'
8
10
  require 'updox/models/application'
9
11
  require 'updox/models/appointment'
@@ -11,6 +13,7 @@ require 'updox/models/appointment_status'
11
13
  require 'updox/models/calendar'
12
14
  require 'updox/models/location'
13
15
  require 'updox/models/patient'
16
+ require 'updox/models/patient_message'
14
17
  require 'updox/models/practice'
15
18
  require 'updox/models/reminder'
16
19
  require 'updox/models/status'
@@ -19,6 +22,7 @@ require 'updox/models/user'
19
22
  module Updox
20
23
  class Configuration
21
24
  attr_accessor :application_id, :application_password, :parse_responses
25
+ attr_reader :failure_action
22
26
 
23
27
  alias_method :parse_responses?, :parse_responses
24
28
 
@@ -26,6 +30,12 @@ module Updox
26
30
  @application_id = nil
27
31
  @application_password = nil
28
32
  @parse_responses = true
33
+ @failure_action = nil
34
+ end
35
+
36
+ def failure_action=(value)
37
+ raise "Failure action must be 'nil', ':raise' or callable object!" unless value.nil? || value.respond_to?(:call) || :raise == value
38
+ @failure_action = value
29
39
  end
30
40
 
31
41
  def api_endpoint=(endpoint)
@@ -41,7 +51,8 @@ module Updox
41
51
  application_id: @application_id,
42
52
  application_password: @application_password,
43
53
  api_endpoint: api_endpoint,
44
- parse_responses: @parse_responses
54
+ parse_responses: @parse_responses,
55
+ failure_action: @failure_action
45
56
  }
46
57
  end
47
58
 
@@ -50,6 +61,7 @@ module Updox
50
61
  self.application_password = h[:application_password]
51
62
  self.api_endpoint = h[:api_endpoint]
52
63
  self.parse_responses = h[:parse_responses]
64
+ self.failure_action = h[:failure_action]
53
65
 
54
66
  return self
55
67
  end
@@ -1,11 +1,13 @@
1
1
  module Updox
2
2
  class Connection
3
- TEST_HOST = 'updoxqa.com'
4
- PROD_HOST = 'xxxxxxx.com'
3
+ URI_BUILDER = ->(host) { "https://#{host}/api/io/".freeze }
4
+
5
+ QA_ENDPOINT = URI_BUILDER.call('updoxqa.com')
6
+ PROD_ENDPOINT = URI_BUILDER.call('myupdox.com')
5
7
 
6
8
  include HTTParty
7
9
 
8
- base_uri "https://#{TEST_HOST}/api/io/".freeze
10
+ base_uri QA_ENDPOINT
9
11
 
10
12
  headers 'Content-Type' => 'application/json'
11
13
 
@@ -0,0 +1,60 @@
1
+ module Updox
2
+ ERROR_CODES = {
3
+ "2000"=>"OK",
4
+ "4000"=>"Bad Request",
5
+ "4010"=>"Unauthorized",
6
+ "4011"=>"Unauthorized [Practice does not exist or is inactive]",
7
+ "4012"=>"Unauthorized [User does not exist or is inactive]",
8
+ "4060"=>"A validation error in the request. For example not including a required field, an invalid e-mail address, too long of a value, etc. A list of the errors is included in the message.",
9
+ "5000"=>"an unknown error has occurred",
10
+ "5100"=>"an unknown server error has occurred",
11
+ "5110"=>"an unknown server error has occurred",
12
+ "4130"=>"account already exists",
13
+ "4110"=>"no practice ID",
14
+ "4160"=>"direct domain is invalid",
15
+ "4621"=>"direct address error: domain does not match the direct domain for this vendor",
16
+ "4150"=>"direct domain is already taken",
17
+ "4163"=>"direct domain is unavailable",
18
+ "4610"=>"direct address error: direct address is taken",
19
+ "4161"=>"web address is invalid",
20
+ "4131"=>"account does not exist",
21
+ "4140"=>"web address is already taken",
22
+ "4230"=>"user already exists",
23
+ "4210"=>"no user ID",
24
+ "4241"=>"invalid user ID, user IDs starting with '@' are reserved for practice users",
25
+ "4251"=>"invalid NPI",
26
+ "4252"=>"invalid taxonomy code",
27
+ "4630"=>"direct address error: account does not have a direct domain configured",
28
+ "4232"=>"user password is required",
29
+ "4240"=>"user does not exist, use practice methods instead",
30
+ "4231"=>"user does not exist",
31
+ "4641"=>"direct address error: sending user does not have a direct address configured",
32
+ "4642"=>"direct address error: identity verification required to send to this address",
33
+ "4640"=>"direct address error: invalid direct address",
34
+ "4650"=>"direct error: send failed",
35
+ "4651"=>"direct error: send failed and/or invalid direct address",
36
+ "4430"=>"message type does not have any MDNs",
37
+ "4410"=>"message not found",
38
+ "4652"=>"direct error: either from or patientDemographics is required",
39
+ "4071"=>"Recipient not found",
40
+ "4070"=>"Invalid recipient",
41
+ "4831"=>"portal account does not exist",
42
+ "4830"=>"portal account already exists",
43
+ "4832"=>"patient has opted out of portal communications",
44
+ "4731"=>"patient account does not exist",
45
+ "4960"=>"image not found",
46
+ "4331"=>"contact does not exist",
47
+ "4931"=>"you sent zero bulk faxes with this bulkFaxId",
48
+ "4021"=>"Invalid date format",
49
+ "4930"=>"no fax found for this ID",
50
+ "4932"=>"fax number does not appear to be available",
51
+ "4933"=>"invalid fax number",
52
+ "4330"=>"contact already exists",
53
+ "6212"=>"at least one id must be specified for the request",
54
+ "4162"=>"ip is invalid",
55
+ "4165"=>"port is invalid",
56
+ "6210"=>"at least one value must be provided",
57
+ "6213"=>"record does not exist for ID",
58
+ "9010"=>"the date format must be in the format is yyyy-MM-dd"
59
+ }
60
+ end
@@ -1,6 +1,8 @@
1
1
  module Updox
2
2
  module Models
3
3
  class Appointment < Model
4
+ extend Updox::Models::Extensions::Sync
5
+
4
6
  SYNC_ENDPOINT = '/AppointmentsSync'.freeze
5
7
 
6
8
  SYNC_LIST_TYPE = 'appointments'.freeze
@@ -14,8 +16,8 @@ module Updox
14
16
  property :typeId, from: :type_id
15
17
  property :summary
16
18
  property :details
17
- property :blocked, required: true, transform_with: ->(v) { true == v }, default: false
18
- property :cancelled, required: true, transform_with: ->(v) { true == v }, default: false
19
+ property :blocked, required: true, default: false
20
+ property :cancelled, required: true, from: :canceled, default: false
19
21
  property :locationId, from: :location_id
20
22
  property :reminderTokens, from: :reminder_tokens
21
23
 
@@ -25,6 +27,7 @@ module Updox
25
27
  alias_method :type_id, :typeId
26
28
  alias_method :location_id, :locationId
27
29
  alias_method :reminder_tokens, :reminderTokens
30
+ alias_method :canceled, :cancelled
28
31
 
29
32
  def to_h
30
33
  result = super.to_h
@@ -33,7 +36,6 @@ module Updox
33
36
 
34
37
  result
35
38
  end
36
- alias_method :as_json, :to_h
37
39
 
38
40
  def save(account_id: )
39
41
  self.class.sync([self], account_id: account_id)
@@ -1,6 +1,8 @@
1
1
  module Updox
2
2
  module Models
3
3
  class AppointmentStatus < Model
4
+ extend Updox::Models::Extensions::Exists
5
+
4
6
  LIST_ENDPOINT = '/AppointmentStatusesGetByIds'.freeze
5
7
 
6
8
  LIST_TYPE = 'appointmentStatuses'
@@ -1,6 +1,8 @@
1
1
  module Updox
2
2
  module Models
3
3
  class Calendar < Model
4
+ extend Updox::Models::Extensions::Exists
5
+
4
6
  SYNC_ENDPOINT = '/CalendarsSync'.freeze
5
7
  LIST_ENDPOINT = '/PracticeCalendarsRetrieve'.freeze
6
8
 
@@ -0,0 +1,17 @@
1
+ module Updox
2
+ module Models
3
+ module Extensions
4
+ module Exists
5
+ def exists?(item_id, account_id: , cached_query: nil)
6
+ raise UpdoxException.new('Not implemented on this model.') unless self.respond_to?(:find)
7
+ opts = { account_id: account_id }
8
+ opts[:cached_query] = cached_query unless cached_query.nil?
9
+
10
+ response = self.find(item_id, **opts)
11
+
12
+ false == response.nil?
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ module Updox
2
+ module Models
3
+ module Extensions
4
+ module Sync
5
+ RECOMMENDED_BATCH_SIZE = 200
6
+
7
+ def sync(items, account_id: , batch_size: RECOMMENDED_BATCH_SIZE, endpoint: self.const_get(:SYNC_ENDPOINT))
8
+ response = nil
9
+ list_type = self.const_get(:SYNC_LIST_TYPE)
10
+
11
+ if 0 >= batch_size
12
+ response = request(endpoint: endpoint, body: { list_type => items }, auth: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_ACCT)
13
+ else
14
+ items.each_slice(batch_size) do |batch|
15
+ r = request(endpoint: endpoint, body: { list_type => batch }, auth: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_ACCT)
16
+
17
+ return r unless r.successful?
18
+
19
+ if response
20
+ response.items += r.items
21
+ else
22
+ response = r
23
+ end
24
+ end
25
+ end
26
+
27
+ return response
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,6 +1,9 @@
1
1
  module Updox
2
2
  module Models
3
3
  class Location < Model
4
+ extend Updox::Models::Extensions::Exists
5
+ extend Updox::Models::Extensions::Sync
6
+
4
7
  SYNC_ENDPOINT = '/LocationsSync'.freeze
5
8
  LIST_ENDPOINT = '/PracticeLocationsRetrieve'.freeze
6
9
 
@@ -1,69 +1,43 @@
1
1
  module Updox
2
2
  module Models
3
3
  DATETIME_FORMAT = '%Y-%m-%d %H:%M'.freeze
4
- DATETIME_OTHER_FORMAT = '%m/%d/%Y %H:%M:%s %z'.freeze
5
-
6
- RECOMMENDED_BATCH_SIZE = 200
4
+ DATETIME_TZ_FORMAT = '%m/%d/%Y %H:%M:%s %z'.freeze
7
5
 
8
6
  class Model < Hashie::Trash
9
7
  include Hashie::Extensions::IgnoreUndeclared
10
8
  include Hashie::Extensions::IndifferentAccess
11
9
 
10
+ attr_writer :updox_status
11
+
12
12
  LIST_TYPE = 'undefined'
13
13
  LIST_NAME = 'models'
14
14
  ITEM_TYPE = 'model'
15
15
 
16
16
  property :item, required: false
17
17
  property :items, required: false
18
- property :updox_status, default: {}
19
18
 
20
19
  def successful?
21
- self[:updox_status].dig('successful')
20
+ @updox_status['successful']
22
21
  end
23
22
 
24
23
  def response_code
25
- self[:updox_status].dig('responseCode')
24
+ @updox_status['responseCode']
26
25
  end
27
26
 
28
27
  def response_message
29
- self[:updox_status].dig('responseMessage')
28
+ @updox_status['responseMessage']
30
29
  end
31
30
 
32
- def error_message
33
- "#{response_code}: #{response_message}"
31
+ def updox_status
32
+ @updox_status ||= {}
34
33
  end
35
34
 
36
- def self.exists?(item_id, account_id: , cached_query: nil)
37
- raise UpdoxException.new('Not implemented on this model.') unless self.respond_to?(:find)
38
- opts = { account_id: account_id }
39
- opts[:cached_query] = cached_query unless cached_query.nil?
40
-
41
- response = self.find(item_id, **opts)
42
-
43
- false == response.nil? && (false == self.const_defined?(:FIND_ENDPOINT) || response.successful?)
35
+ def error_message
36
+ "#{response_code}: #{response_message}"
44
37
  end
45
38
 
46
- def self.sync(items, account_id: , batch_size: RECOMMENDED_BATCH_SIZE, endpoint: self.const_get(:SYNC_ENDPOINT))
47
- response = nil
48
- list_type = self.const_get(:SYNC_LIST_TYPE)
49
-
50
- if 0 >= batch_size
51
- response = request(endpoint: endpoint, body: { list_type => items }, auth: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_ACCT)
52
- else
53
- items.each_slice(batch_size) do |batch|
54
- r = request(endpoint: endpoint, body: { list_type => batch }, auth: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_ACCT)
55
-
56
- return r unless r.successful?
57
-
58
- if response
59
- response.items += r.items
60
- else
61
- response = r
62
- end
63
- end
64
- end
65
-
66
- return response
39
+ def as_json(options = nil)
40
+ self.to_h
67
41
  end
68
42
 
69
43
  def self.request(**kwargs)
@@ -88,22 +62,32 @@ module Updox
88
62
  model.item = klazz.new(data.dig(klazz.const_get(:ITEM_TYPE)))
89
63
  model.define_singleton_method(klazz.const_get(:ITEM_TYPE)) { self.item }
90
64
  else
91
- k = data&.keys&.find {|k| k.to_s.downcase.end_with?('statuses') }
92
- c = 'Updox::Models::' + k[0..-3].capitalize if k
65
+ status_key = data&.keys&.find {|k| k.to_s.downcase.end_with?('statuses') }
66
+ status_class = 'Updox::Models::' + status_key[0..-3].capitalize if status_key
93
67
 
94
- if k.nil? || false == Module.const_defined?(c)
68
+ if status_key.nil? || false == Module.const_defined?(status_class)
95
69
  model.items = [data]
96
70
  else
97
- statuses = data.delete(k)
71
+ statuses = data.delete(status_key)
98
72
 
99
- model.items = statuses.map {|status| Object.const_get(c).new(status) }
73
+ model.items = statuses.map {|status| Object.const_get(status_class).new(status) }
100
74
  model.define_singleton_method(:statuses) { self.items }
101
75
  end
102
76
 
103
77
  model.item = data
104
78
  end
105
79
 
106
- model.updox_status = data&.select {|k,v| ['successful', 'responseMessage', 'responseCode'].include?(k)} || {}
80
+ if (data.is_a?(Hash))
81
+ model.updox_status = data&.select {|k,v| ['successful', 'responseMessage', 'responseCode'].include?(k)} || {}
82
+
83
+ if false == model.successful? && false == Updox.configuration.failure_action.nil?
84
+ if Updox.configuration.failure_action.respond_to?(:call)
85
+ Updox.configuration.failure_action.call(model)
86
+ elsif :raise == Updox.configuration.failure_action
87
+ raise UpdoxException.from_response(response, msg: 'request')
88
+ end
89
+ end
90
+ end
107
91
  else
108
92
  raise UpdoxException.from_response(response)
109
93
  end
@@ -1,9 +1,20 @@
1
1
  module Updox
2
2
  module Models
3
3
  class Patient < Model
4
+ extend Updox::Models::Extensions::Sync
5
+
4
6
  SYNC_ENDPOINT = '/PatientsSync'.freeze
5
7
  SYNC_LIST_TYPE = 'patients'.freeze
6
8
 
9
+ REMINDER_PREFERENCES = {
10
+ practice: 0,
11
+ email: 1,
12
+ home_phone: 2,
13
+ mobile_phone: 3,
14
+ mobile_text: 4,
15
+ off: 5
16
+ }
17
+
7
18
  property :id
8
19
  property :internalId, required: true, from: :internal_id
9
20
  property :firstName, from: :first_name
@@ -15,6 +26,7 @@ module Updox
15
26
  property :workPhone, from: :work_phone
16
27
  property :mobileNumber, from: :mobile_number
17
28
  property :mobileNumber, from: :mobile_phone
29
+ property :reminderMethodId, from: :reminder_method_id
18
30
  property :active, default: true
19
31
 
20
32
  alias_method :email, :emailAddress
@@ -27,13 +39,24 @@ module Updox
27
39
  alias_method :work_phone, :workPhone
28
40
  alias_method :mobile_number, :mobileNumber
29
41
  alias_method :mobile_phone, :mobileNumber
42
+ alias_method :reminder_preference, :reminderMethodId
43
+
44
+ def reminder_preference=(value)
45
+ if Updox::Models::Patient::REMINDER_PREFERENCES.include?(value)
46
+ self[:reminderMethodId] = Updox::Models::Patient::REMINDER_PREFERENCES[value]
47
+ else
48
+ self[:reminderMethodId] = value
49
+ end
50
+
51
+ self
52
+ end
30
53
 
31
54
  def save(account_id: )
32
55
  self.class.sync([self], account_id: account_id)
33
56
  end
34
57
 
35
58
  def self.exists?(patient_id, account_id: )
36
- request(endpoint: MESSAGE_COUNT_ENDPOINT, body: { patientId: patient_id }, auth: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_ACCT).successful?
59
+ Updox::Models::PatientMessage.exists?(patient_id, account_id: account_id)
37
60
  end
38
61
  end
39
62
  end
@@ -0,0 +1,15 @@
1
+ module Updox
2
+ module Models
3
+ class PatientMessage < Model
4
+ LIST_ENDPOINT = '/PatientMessageCountSince'.freeze
5
+
6
+ def self.query(patient_id, account_id: )
7
+ request(endpoint: LIST_ENDPOINT, body: { patientId: patient_id }, auth: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_ACCT)
8
+ end
9
+
10
+ def self.exists?(patient_id, account_id: )
11
+ request(endpoint: LIST_ENDPOINT, body: { patientId: patient_id }, auth: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_ACCT).successful?
12
+ end
13
+ end
14
+ end
15
+ end
@@ -40,11 +40,17 @@ module Updox
40
40
  end
41
41
 
42
42
  def self.exists?(account_id)
43
- self.find(account_id).successful?
43
+ false == self.find(account_id).nil?
44
44
  end
45
45
 
46
46
  def self.find(account_id)
47
- request(endpoint: FIND_ENDPOINT, body: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_APP)
47
+ response = request(endpoint: FIND_ENDPOINT, body: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_APP)
48
+
49
+ if response.successful?
50
+ response
51
+ else
52
+ nil
53
+ end
48
54
  end
49
55
 
50
56
  def self.query
@@ -3,7 +3,7 @@ module Updox
3
3
  class Reminder < Model
4
4
  property :reminderId
5
5
  property :reminderStatus
6
- property :reminderStatusDate, transform_with: ->(v) { DateTime.strptime(v, DATETIME_OTHER_FORMAT) }
6
+ property :reminderStatusDate, transform_with: ->(v) { DateTime.strptime(v, DATETIME_TZ_FORMAT) unless v.nil? || v.empty? }
7
7
  property :reminderType
8
8
 
9
9
  alias_method :reminder_id, :reminderId
@@ -1,6 +1,8 @@
1
1
  module Updox
2
2
  module Models
3
3
  class User < Model
4
+ extend Updox::Models::Extensions::Exists
5
+
4
6
  SAVE_ENDPOINT = '/UserSave'.freeze
5
7
  QUERY_ENDPOINT = '/UserList'.freeze
6
8
  FIND_ENDPOINT = '/UserGet'.freeze
@@ -21,21 +23,37 @@ module Updox
21
23
  property :city
22
24
  property :state
23
25
  property :postal
26
+ property :timeZone, from: :time_zone
27
+ property :metadata
28
+ property :vetted
29
+ property :active, default: true
30
+ property :searchOptOut, from: :search_opt_out, default: true
31
+ property :npi
32
+ property :providerTaxonomyCode, from: :provider_taxonomy_code
33
+ property :directAddress, from: :direct_address
24
34
  property :provider, default: false
25
35
  property :admin, default: false
26
- property :searchOptOut, from: :search_opt_out, default: true
27
36
 
28
37
  alias_method :user_id, :userId
29
38
  alias_method :first_name, :firstName
30
39
  alias_method :last_name, :lastName
31
40
  alias_method :login_password, :loginPassword
41
+ alias_method :time_zone, :timeZone
42
+ alias_method :provider_taxonomy_code, :providerTaxonomyCode
43
+ alias_method :direct_address, :directAddress
32
44
 
33
45
  def create(account_id: )
34
46
  self.class.request(endpoint: SAVE_ENDPOINT, body: self.to_h, auth: {accountId: account_id}, required_auths: Updox::Models::Auth::AUTH_ACCT)
35
47
  end
36
48
 
37
49
  def self.find(user_id, account_id: )
38
- request(endpoint: FIND_ENDPOINT, account_id: account_id, body: { userId: user_id}, required_auths: Updox::Models::Auth::AUTH_ACCT)
50
+ response = request(endpoint: FIND_ENDPOINT, account_id: account_id, body: { userId: user_id}, required_auths: Updox::Models::Auth::AUTH_ACCT)
51
+
52
+ if response.successful?
53
+ response
54
+ else
55
+ nil
56
+ end
39
57
  end
40
58
 
41
59
  def self.query
@@ -1,27 +1,30 @@
1
1
  module Updox
2
2
  class UpdoxException < Exception
3
3
  def self.from_response(response, msg: nil)
4
+ data = {}
4
5
  exception_msg = "Failed #{msg}:"
5
- exception_msg << " HTTP code: #{response.code}"
6
+ data['HTTP_CODE'] = response.code
6
7
 
7
8
  begin
8
9
  error_response = JSON.parse(response.body)
9
10
 
10
11
  if error_response.is_a?(Hash)
11
12
  if error_response.include?('responseMessage')
12
- exception_msg << " MSG: #{error_response['responseMessage']}"
13
+ data['MSG'] = error_response['responseMessage']
13
14
  end
14
15
 
15
16
  if error_response.include?('responseCode')
16
- exception_msg << " UPDOX CODE: #{error_response['responseCode']}"
17
+ data['UPDOX_CODE'] = error_response['responseCode']
17
18
  end
18
19
  else
19
- exception_msg << " MSG: #{error_response}"
20
+ data['MSG'] = error_response
20
21
  end
21
22
  rescue JSON::ParserError
22
- exception_msg << " MSG: #{response.body}"
23
+ data['MSG'] = response.body
23
24
  end
24
25
 
26
+ data.each {|k,v| exception_msg << " #{k} '#{v}'" }
27
+
25
28
  return UpdoxException.new(exception_msg)
26
29
  end
27
30
  end
@@ -1,3 +1,3 @@
1
1
  module Updox
2
- VERSION = '0.10.0'.freeze
2
+ VERSION = '1.0.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: updox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Crockett
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-19 00:00:00.000000000 Z
11
+ date: 2020-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -128,7 +128,7 @@ dependencies:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
130
  version: '0.9'
131
- description:
131
+ description:
132
132
  email:
133
133
  - mike.crockett@weinfuse.com
134
134
  executables: []
@@ -142,14 +142,18 @@ files:
142
142
  - Rakefile
143
143
  - lib/updox.rb
144
144
  - lib/updox/connection.rb
145
+ - lib/updox/error_message.rb
145
146
  - lib/updox/models/application.rb
146
147
  - lib/updox/models/appointment.rb
147
148
  - lib/updox/models/appointment_status.rb
148
149
  - lib/updox/models/auth.rb
149
150
  - lib/updox/models/calendar.rb
151
+ - lib/updox/models/extensions/exists.rb
152
+ - lib/updox/models/extensions/sync.rb
150
153
  - lib/updox/models/location.rb
151
154
  - lib/updox/models/model.rb
152
155
  - lib/updox/models/patient.rb
156
+ - lib/updox/models/patient_message.rb
153
157
  - lib/updox/models/practice.rb
154
158
  - lib/updox/models/reminder.rb
155
159
  - lib/updox/models/status.rb
@@ -162,7 +166,7 @@ licenses:
162
166
  - MIT
163
167
  metadata:
164
168
  allowed_push_host: https://rubygems.org
165
- post_install_message:
169
+ post_install_message:
166
170
  rdoc_options: []
167
171
  require_paths:
168
172
  - lib
@@ -177,9 +181,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
181
  - !ruby/object:Gem::Version
178
182
  version: '0'
179
183
  requirements: []
180
- rubyforge_project:
184
+ rubyforge_project:
181
185
  rubygems_version: 2.7.6
182
- signing_key:
186
+ signing_key:
183
187
  specification_version: 4
184
188
  summary: Ruby wrapper for the Updox API
185
189
  test_files: []