allscripts_unity_client 1.0.3

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.
Files changed (67) hide show
  1. data/.gitignore +20 -0
  2. data/.travis.yml +3 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE +22 -0
  5. data/README.md +180 -0
  6. data/Rakefile +7 -0
  7. data/allscripts_unity_client.gemspec +39 -0
  8. data/lib/allscripts_unity_client.rb +43 -0
  9. data/lib/allscripts_unity_client/client.rb +594 -0
  10. data/lib/allscripts_unity_client/client_driver.rb +95 -0
  11. data/lib/allscripts_unity_client/json_client_driver.rb +110 -0
  12. data/lib/allscripts_unity_client/json_unity_request.rb +33 -0
  13. data/lib/allscripts_unity_client/json_unity_response.rb +27 -0
  14. data/lib/allscripts_unity_client/soap_client_driver.rb +128 -0
  15. data/lib/allscripts_unity_client/timezone.rb +99 -0
  16. data/lib/allscripts_unity_client/unity_request.rb +63 -0
  17. data/lib/allscripts_unity_client/unity_response.rb +110 -0
  18. data/lib/allscripts_unity_client/utilities.rb +66 -0
  19. data/lib/allscripts_unity_client/version.rb +3 -0
  20. data/spec/allscripts_unity_client_spec.rb +57 -0
  21. data/spec/client_driver_spec.rb +71 -0
  22. data/spec/client_spec.rb +406 -0
  23. data/spec/factories/allscripts_unity_client_parameters_factory.rb +13 -0
  24. data/spec/factories/client_driver_factory.rb +14 -0
  25. data/spec/factories/client_factory.rb +7 -0
  26. data/spec/factories/json_client_driver_factory.rb +3 -0
  27. data/spec/factories/json_unity_request_factory.rb +3 -0
  28. data/spec/factories/json_unity_response_factory.rb +3 -0
  29. data/spec/factories/magic_request_factory.rb +33 -0
  30. data/spec/factories/soap_client_driver_factory.rb +3 -0
  31. data/spec/factories/timezone_factory.rb +7 -0
  32. data/spec/factories/unity_request_factory.rb +10 -0
  33. data/spec/factories/unity_response_factory.rb +8 -0
  34. data/spec/fixtures/attributes_hash.yml +15 -0
  35. data/spec/fixtures/date_hash.yml +8 -0
  36. data/spec/fixtures/date_string_hash.yml +8 -0
  37. data/spec/fixtures/error.json +3 -0
  38. data/spec/fixtures/get_providers.json +69 -0
  39. data/spec/fixtures/get_providers.xml +119 -0
  40. data/spec/fixtures/get_providers_json.yml +65 -0
  41. data/spec/fixtures/get_providers_xml.yml +270 -0
  42. data/spec/fixtures/get_security_token.json +1 -0
  43. data/spec/fixtures/get_security_token.xml +7 -0
  44. data/spec/fixtures/get_server_info.json +10 -0
  45. data/spec/fixtures/get_server_info.xml +40 -0
  46. data/spec/fixtures/get_server_info_json.yml +8 -0
  47. data/spec/fixtures/get_server_info_xml.yml +55 -0
  48. data/spec/fixtures/no_attributes_hash.yml +7 -0
  49. data/spec/fixtures/retire_security_token.json +1 -0
  50. data/spec/fixtures/retire_security_token.xml +5 -0
  51. data/spec/fixtures/soap_fault.xml +13 -0
  52. data/spec/fixtures/string_keyed_hash.yml +8 -0
  53. data/spec/fixtures/symbol_keyed_hash.yml +8 -0
  54. data/spec/json_client_driver_spec.rb +209 -0
  55. data/spec/json_unity_request_spec.rb +37 -0
  56. data/spec/json_unity_response_spec.rb +44 -0
  57. data/spec/soap_client_driver_spec.rb +201 -0
  58. data/spec/spec_helper.rb +44 -0
  59. data/spec/support/fixture_loader.rb +22 -0
  60. data/spec/support/shared_examples_for_client_driver.rb +139 -0
  61. data/spec/support/shared_examples_for_unity_request.rb +94 -0
  62. data/spec/support/shared_examples_for_unity_response.rb +26 -0
  63. data/spec/timezone_spec.rb +161 -0
  64. data/spec/unity_request_spec.rb +37 -0
  65. data/spec/unity_response_spec.rb +36 -0
  66. data/spec/utilities_spec.rb +69 -0
  67. metadata +323 -0
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ gembuild.txt
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
19
+ .idea
20
+ logs
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 healthfinch, Inc
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,180 @@
1
+ # Allscripts Unity Client [![Build Status](https://travis-ci.org/healthfinch/allscripts-unity-client.png?branch=version1)](https://travis-ci.org/healthfinch/allscripts-unity-client) [![Coverage Status](https://coveralls.io/repos/healthfinch/allscripts-unity-client/badge.png?branch=version1)](https://coveralls.io/r/healthfinch/allscripts-unity-client?branch=version1)
2
+
3
+ The `allscripts_unity_client` gem is a Ruby client for the Allscripts Unity API. See http://asdn.unitysandbox.com/UnitySDK/SDK/ for more documentation on the API.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem "allscripts_unity_client"
10
+
11
+ And then execute:
12
+
13
+ $ bundle install
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install allscripts_unity_client
18
+
19
+ ## Usage
20
+
21
+ ### Creating clients
22
+
23
+ The Allscripts Unity API has three endpoints: GetSecurityToken, Magic, and RetireSecurityToken and supports both SOAP and JSON.
24
+ A Unity API client can be created using the `AllscriptsUnityClient#create` factory:
25
+
26
+ ```ruby
27
+ unity_client = AllscriptsUnityClient.create(:base_unity_url => "http://unity.base.url", :appname => "appname", :username => "username", :password => "password")
28
+ ```
29
+
30
+ A JSON client can also be created using the `:mode` option:
31
+
32
+ ```ruby
33
+ # Mode defaults to :soap
34
+ unity_client = AllscriptsUnityClient.create(:mode => :json, :base_unity_url => "http://unity.base.url", :appname => "appname", :username => "username", :password => "password")
35
+ ```
36
+
37
+ ### Security token management
38
+
39
+ The `create` factory will request a security token from Unity when created. The token can be accessed using the `security_token` accessor:
40
+
41
+ ```ruby
42
+ unity_client.security_token
43
+ ```
44
+
45
+ Existence of a security token can also be checked:
46
+
47
+ ```ruby
48
+ unity_client.security_token?
49
+ ```
50
+
51
+ Security tokens can be manually requested using the `get_security_token!` method:
52
+
53
+ ```ruby
54
+ unity_client.get_security_token! # Fetches a new security token and stores it in security_token
55
+ ```
56
+
57
+ Security tokens can be retired using the `retire_security_token!` method:
58
+
59
+ ```ruby
60
+ unity_client.retire_security_token! # Retires the security token with Unity and sets security_token to nil
61
+ ```
62
+
63
+ After calling `get_security_token!`, each call to `magic` will automatically send `security_token` with the request. If a security token is
64
+ no longer valid, an exception will be raised by Unity.
65
+
66
+ ### Executing Magic calls
67
+
68
+ The endpoint used to make API calls in Unity is called Magic. Magic can be accessed with the client:
69
+
70
+ ```ruby
71
+ unity_client.magic({
72
+ :action => "action",
73
+ :userid => "userid",
74
+ :appname => "appname", # Only use to override default. Default: unity_client.appname
75
+ :patientid => "patientid",
76
+ :token => "token", # Only use to override default. Default: unity_client.security_token
77
+ :parameter1 => "parameter1",
78
+ :parameter2 => "parameter2",
79
+ :parameter3 => "parameter3",
80
+ :parameter4 => "parameter4",
81
+ :parameter5 => "parameter5",
82
+ :parameter6 => "parameter6",
83
+ :data => "data"
84
+ })
85
+ ```
86
+
87
+ All keys in the hash given to magic are optional. See the Allscripts Unity API documentation for more information
88
+ about which API calls are supported
89
+
90
+ ### Magic call helpers
91
+
92
+ A number of helper methods exist that abstract away the details of the Magic operation:
93
+
94
+ - `get_changed_patients(since = nil)`
95
+ - `get_chart_item_details(userid, patientid, section)`
96
+ - `get_clinical_summary(userid, patientid)`
97
+ - `get_dictionary(dictionary_name, userid = nil, site = nil)`
98
+ - `get_encounter_list(userid, patientid, encounter_type, when_param = nil, nostradamus = nil, show_past_flag = nil, billing_provider_user_name = nil)`
99
+ - `get_medication_by_trans_id(userid, patientid, transaction_id)`
100
+ - `get_patient(userid, patientid, includepix = nil)`
101
+ - `get_patient_activity(userid, patientid)`
102
+ - `get_patient_problems(patientid, show_by_encounter_flag = nil, assessed = nil, encounter_id = nil, medcin_id = nil)`
103
+ - `get_patients_by_icd9(icd9, start = nil, end_param = nil)`
104
+ - `get_provider(provider_id = nil, user_name = nil)`
105
+ - `get_providers(security_filter = nil, name_filter = nil)`
106
+ - `get_server_info`
107
+ - `get_task(userid, transaction_id)`
108
+ - `get_task_list(userid = nil, since = nil)`
109
+ - `save_rx(userid, patientid, rxxml)`
110
+ - `save_task(userid, patientid, task_type = nil, target_user = nil, work_object_id = nil, comments = nil)`
111
+ - `save_task_status(userid, transaction_id = nil, param = nil, delegate_id = nil, comment = nil)`
112
+ - `search_meds(userid, patientid, search = nil)`
113
+
114
+ All magic helper methods not on this list currently raise `NotImplementedError`. More helper methods will be added in future releases. Pull requests welcome.
115
+
116
+ ## Timezone
117
+
118
+ All times and dates coming from Unity are in local timezones. When creating the client, the `:timezone` option can be used to configure
119
+ automatic timezone conversion. If no `:timezone` is given, then it will default to `UTC`. Timezones must be given in `TZInfo` zone identifier
120
+ format. See [TZInfo](http://tzinfo.github.io/) for more information:
121
+
122
+ ```ruby
123
+ unity_client = AllscriptsUnityClient.create(:timezone => "America/New_York", :base_unity_url => "http://unity.base.url", :appname => "appname", :username => "username", :password => "password")
124
+ ```
125
+
126
+ Any `magic` action that takes in a date needs to be given in UTC. Dates can be `Date`, `DateTime`, `Time`, or a string. Dates will be processed and formatted in the correct
127
+ [ISO8601](http://en.wikipedia.org/wiki/ISO_8601) format that Unity requires.
128
+
129
+ ## Logging
130
+
131
+ By default Ruby's Logger is used and logs to STDOUT with level Logger::INFO. Custom loggers can be configured:
132
+
133
+ ```ruby
134
+ unity_client = AllscriptsUnityClient.create(:base_unity_url => "http://unity.base.url", :appname => "appname", :username => "username", :password => "password", :logger => Rails.logger)
135
+ ```
136
+
137
+ Logging can also be disabled:
138
+
139
+ ```ruby
140
+ unity_client = AllscriptsUnityClient.create(:base_unity_url => "http://unity.base.url", :appname => "appname", :username => "username", :password => "password", :log => false)
141
+ ```
142
+
143
+ Magic action is the only parameter logged with requests and responses are not logged. This is done to prevent logging PHI.
144
+
145
+ ## Contributing
146
+
147
+ 1. Fork it
148
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
149
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
150
+ 4. Push to the branch (`git push origin my-new-feature`)
151
+ 5. Create new Pull Request
152
+
153
+ ## Additional Information
154
+
155
+ Maintainer(s): Ash Gupta (https://github.com/incomethax), Neil Goodman (https://github.com/posco2k8)
156
+
157
+ ## License:
158
+
159
+ Copyright (c) 2013 healthfinch, Inc
160
+
161
+ MIT License
162
+
163
+ Permission is hereby granted, free of charge, to any person obtaining
164
+ a copy of this software and associated documentation files (the
165
+ "Software"), to deal in the Software without restriction, including
166
+ without limitation the rights to use, copy, modify, merge, publish,
167
+ distribute, sublicense, and/or sell copies of the Software, and to
168
+ permit persons to whom the Software is furnished to do so, subject to
169
+ the following conditions:
170
+
171
+ The above copyright notice and this permission notice shall be
172
+ included in all copies or substantial portions of the Software.
173
+
174
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
175
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
176
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
177
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
178
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
179
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
180
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,7 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task default: :spec
7
+ task test: :spec
@@ -0,0 +1,39 @@
1
+ lib = File.expand_path('../lib/', __FILE__)
2
+ $:.unshift lib unless $:.include?(lib)
3
+
4
+ require "allscripts_unity_client/version"
5
+ require "date"
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = "allscripts_unity_client"
9
+ gem.version = AllscriptsUnityClient::VERSION
10
+ gem.date = Date.today
11
+ gem.required_ruby_version = "~> 1.9"
12
+ gem.license = "MIT"
13
+ gem.homepage = "https://github.com/healthfinch/allscripts-unity-client"
14
+
15
+ gem.summary = "Allscripts Unity API client"
16
+ gem.description = "Provides a simple interface to the Allscripts Unity API using JSON or SOAP. Developed at healthfinch, Inc. http://healthfinch.com"
17
+
18
+ gem.authors = ["Ash Gupta", "Neil Goodman"]
19
+ gem.email = ["ash.gupta@healthfinch.com", "neil@healthfinch.com"]
20
+
21
+ gem.require_paths = ["lib"]
22
+
23
+ gem.files = `git ls-files`.split("\n")
24
+
25
+ gem.add_runtime_dependency "savon", "~> 2.3.0"
26
+ gem.add_runtime_dependency "httpi", "~> 2.1.0"
27
+ gem.add_runtime_dependency "net-http-persistent", "~> 2.9.0"
28
+ gem.add_runtime_dependency "tzinfo", "~> 0.3.29"
29
+ gem.add_runtime_dependency "tzinfo-data", "~> 1.2013.7"
30
+ gem.add_runtime_dependency "nokogiri", "~> 1.5.0"
31
+
32
+ gem.add_development_dependency "factory_girl", "~> 4.2.0"
33
+ gem.add_development_dependency "rake", "~> 10.1.0"
34
+ gem.add_development_dependency "faker", "~> 1.2.0"
35
+ gem.add_development_dependency "rspec", "~> 2.14.1"
36
+ gem.add_development_dependency "simplecov", "~> 0.7.1"
37
+ gem.add_development_dependency "webmock", "~> 1.15.0"
38
+ gem.add_development_dependency "coveralls", "~> 0.7.0"
39
+ end
@@ -0,0 +1,43 @@
1
+ require "allscripts_unity_client/utilities"
2
+ require "allscripts_unity_client/timezone"
3
+ require "allscripts_unity_client/unity_request"
4
+ require "allscripts_unity_client/json_unity_request"
5
+ require "allscripts_unity_client/unity_response"
6
+ require "allscripts_unity_client/json_unity_response"
7
+ require "allscripts_unity_client/client"
8
+ require "allscripts_unity_client/client_driver"
9
+ require "allscripts_unity_client/soap_client_driver"
10
+ require "allscripts_unity_client/json_client_driver"
11
+
12
+ module AllscriptsUnityClient
13
+ class APIError < RuntimeError
14
+ end
15
+
16
+ def self.create(parameters = {})
17
+ parameters[:mode] ||= :soap
18
+ parameters[:log] = true unless parameters[:log] === false
19
+ raise_if_parameters_invalid parameters
20
+
21
+ case parameters[:mode]
22
+ when :json
23
+ client_driver = JSONClientDriver.new(parameters[:base_unity_url], parameters[:username], parameters[:password], parameters[:appname], parameters[:proxy], parameters[:timezone], parameters[:logger], parameters[:log])
24
+ when :soap
25
+ client_driver = SOAPClientDriver.new(parameters[:base_unity_url], parameters[:username], parameters[:password], parameters[:appname], parameters[:proxy], parameters[:timezone], parameters[:logger], parameters[:log])
26
+ end
27
+
28
+ client = Client.new(client_driver)
29
+ client.get_security_token!
30
+ client
31
+ end
32
+
33
+ private
34
+
35
+ def self.raise_if_parameters_invalid(parameters)
36
+ raise ArgumentError, ":mode must be :json or :soap" if ![:json, :soap].include?(parameters[:mode])
37
+ raise ArgumentError, ":base_unity_url required" if parameters[:base_unity_url].nil?
38
+ raise ArgumentError, ":username required" if parameters[:username].nil?
39
+ raise ArgumentError, ":password required" if parameters[:password].nil?
40
+ raise ArgumentError, ":appname required" if parameters[:appname].nil?
41
+ end
42
+ end
43
+
@@ -0,0 +1,594 @@
1
+ require "nokogiri"
2
+
3
+ module AllscriptsUnityClient
4
+ class Client
5
+ attr_accessor :client_driver
6
+
7
+ def initialize(client_driver)
8
+ raise ArgumentError, "client_driver can not be nil" if client_driver.nil?
9
+
10
+ @client_driver = client_driver
11
+ end
12
+
13
+ def magic(parameters = {})
14
+ @client_driver.magic(parameters)
15
+ end
16
+
17
+ def get_security_token!(parameters = {})
18
+ @client_driver.get_security_token!(parameters)
19
+ end
20
+
21
+ def retire_security_token!(parameters = {})
22
+ @client_driver.retire_security_token!(parameters)
23
+ end
24
+
25
+ def security_token?
26
+ @client_driver.security_token?
27
+ end
28
+
29
+ def client_type
30
+ return @client_driver.client_type
31
+ end
32
+
33
+ def commit_charges
34
+ raise NotImplementedError, "CommitCharges magic action not implemented"
35
+ end
36
+
37
+ def echo(echo_text)
38
+ magic_parameters = {
39
+ :action => "Echo",
40
+ :userid => echo_text,
41
+ :appname => echo_text,
42
+ :patientid => echo_text,
43
+ :parameter1 => echo_text,
44
+ :parameter2 => echo_text,
45
+ :parameter3 => echo_text,
46
+ :parameter4 => echo_text,
47
+ :parameter5 => echo_text,
48
+ :parameter6 => echo_text
49
+ }
50
+ response = magic(magic_parameters)
51
+ response[:userid]
52
+ end
53
+
54
+ def get_account
55
+ raise NotImplementedError, "GetAccount magic action not implemented"
56
+ end
57
+
58
+ def get_changed_patients(since = nil)
59
+ magic_parameters = {
60
+ :action => "GetChangedPatients",
61
+ :parameter1 => since
62
+ }
63
+ magic(magic_parameters)
64
+ end
65
+
66
+ def get_charge_info_by_username
67
+ raise NotImplementedError, "GetChargeInfoByUsername magic action not implemented"
68
+ end
69
+
70
+ def get_charges
71
+ raise NotImplementedError, "GetCharges magic action not implemented"
72
+ end
73
+
74
+ def get_chart_item_details(userid, patientid, section)
75
+ magic_parameters = {
76
+ :action => "GetChartItemDetails",
77
+ :userid => userid,
78
+ :patientid => patientid,
79
+ :parameter1 => section
80
+ }
81
+ magic(magic_parameters)
82
+ end
83
+
84
+ def get_clinical_summary(userid, patientid)
85
+ magic_parameters = {
86
+ :action => "GetClinicalSummary",
87
+ :userid => userid,
88
+ :patientid => patientid
89
+ }
90
+ magic(magic_parameters)
91
+ end
92
+
93
+ def get_delegates
94
+ raise NotImplementedError, "GetDelegates magic action not implemented"
95
+ end
96
+
97
+ def get_dictionary(dictionary_name, userid = nil, site = nil)
98
+ magic_parameters = {
99
+ :action => "GetDictionary",
100
+ :userid => userid,
101
+ :parameter1 => dictionary_name,
102
+ :parameter2 => site
103
+ }
104
+ magic(magic_parameters)
105
+ end
106
+
107
+ def get_dictionary_sets
108
+ raise NotImplementedError, "GetDictionarySets magic action not implemented"
109
+ end
110
+
111
+ def get_doc_template
112
+ raise NotImplementedError, "GetDocTemplate magic action not implemented"
113
+ end
114
+
115
+ def get_document_by_accession
116
+ raise NotImplementedError, "GetDocumentByAccession magic action not implemented"
117
+ end
118
+
119
+ def get_document_image
120
+ raise NotImplementedError, "GetDocumentImage magic action not implemented"
121
+ end
122
+
123
+ def get_documents
124
+ raise NotImplementedError, "GetDocuments magic action not implemented"
125
+ end
126
+
127
+ def get_document_type
128
+ raise NotImplementedError, "GetDocumentType magic action not implemented"
129
+ end
130
+
131
+ def get_dur
132
+ raise NotImplementedError, "GetDUR magic action not implemented"
133
+ end
134
+
135
+ def get_encounter
136
+ raise NotImplementedError, "GetEncounter magic action not implemented"
137
+ end
138
+
139
+ def get_encounter_date
140
+ raise NotImplementedError, "GetEncounterDate magic action not implemented"
141
+ end
142
+
143
+ def get_encounter_list(userid, patientid, encounter_type, when_param = nil, nostradamus = nil, show_past_flag = nil, billing_provider_user_name = nil)
144
+ magic_parameters = {
145
+ :action => "GetEncounterList",
146
+ :userid => userid,
147
+ :patientid => patientid,
148
+ :parameter1 => encounter_type,
149
+ :parameter2 => when_param,
150
+ :parameter3 => nostradamus,
151
+ :parameter4 => show_past_flag,
152
+ :parameter5 => billing_provider_user_name
153
+ }
154
+ response = magic(magic_parameters)
155
+
156
+ # Remove nil encounters
157
+ response.delete_if do |value|
158
+ value[:id] == "0" && value[:patientid] == "0"
159
+ end
160
+ end
161
+
162
+ def get_hie_document
163
+ raise NotImplementedError, "GetHIEDocument magic action not implemented"
164
+ end
165
+
166
+ def get_last_patient
167
+ raise NotImplementedError, "GetLastPatient magic action not implemented"
168
+ end
169
+
170
+ def get_list_of_dictionaries
171
+ raise NotImplementedError, "GetListOfDictionaries magic action not implemented"
172
+ end
173
+
174
+ def get_medication_by_trans_id(userid, patientid, transaction_id)
175
+ magic_parameters = {
176
+ :action => "GetMedicationByTransID",
177
+ :userid => userid,
178
+ :patientid => patientid,
179
+ :parameter1 => transaction_id
180
+ }
181
+ magic(magic_parameters)
182
+ end
183
+
184
+ def get_order_history
185
+ raise NotImplementedError, "GetOrderHistory magic action not implemented"
186
+ end
187
+
188
+ def get_organization_id
189
+ raise NotImplementedError, "GetOrganizationID magic action not implemented"
190
+ end
191
+
192
+ def get_packages
193
+ raise NotImplementedError, "GetPackages magic action not implemented"
194
+ end
195
+
196
+ def get_patient(userid, patientid, includepix = nil)
197
+ magic_parameters = {
198
+ :action => "GetPatient",
199
+ :userid => userid,
200
+ :patientid => patientid,
201
+ :parameter1 => includepix
202
+ }
203
+ magic(magic_parameters)
204
+ end
205
+
206
+ def get_patient_activity(userid, patientid)
207
+ magic_parameters = {
208
+ :action => "GetPatientActivity",
209
+ :userid => userid,
210
+ :patientid => patientid
211
+ }
212
+ magic(magic_parameters)
213
+ end
214
+
215
+ def get_patient_by_mrn
216
+ raise NotImplementedError, "GetPatientByMRN magic action not implemented"
217
+ end
218
+
219
+ def get_patient_cda
220
+ raise NotImplementedError, "GetPatientCDA magic action not implemented"
221
+ end
222
+
223
+ def get_patient_diagnosis
224
+ raise NotImplementedError, "GetPatientDiagnosis magic action not implemented"
225
+ end
226
+
227
+ def get_patient_full
228
+ raise NotImplementedError, "GetPatientFull magic action not implemented"
229
+ end
230
+
231
+ def get_patient_ids
232
+ raise NotImplementedError, "GetPatientIDs magic action not implemented"
233
+ end
234
+
235
+ def get_patient_list
236
+ raise NotImplementedError, "GetPatientList magic action not implemented"
237
+ end
238
+
239
+ def get_patient_locations
240
+ raise NotImplementedError, "GetPatientLocations magic action not implemented"
241
+ end
242
+
243
+ def get_patient_pharmacies
244
+ raise NotImplementedError, "GetPatientPharmacies magic action not implemented"
245
+ end
246
+
247
+ def get_patient_problems(patientid, show_by_encounter_flag = nil, assessed = nil, encounter_id = nil, medcin_id = nil)
248
+ magic_parameters = {
249
+ :action => "GetPatientProblems",
250
+ :patientid => patientid,
251
+ :parameter1 => show_by_encounter_flag,
252
+ :parameter2 => assessed,
253
+ :parameter3 => encounter_id,
254
+ :parameter4 => medcin_id
255
+ }
256
+ magic(magic_parameters)
257
+ end
258
+
259
+ def get_patients_by_icd9(icd9, start = nil, end_param = nil)
260
+ magic_parameters = {
261
+ :action => "GetPatientsByICD9",
262
+ :parameter1 => icd9,
263
+ :parameter2 => start,
264
+ :parameter3 => end_param
265
+ }
266
+ magic(magic_parameters)
267
+ end
268
+
269
+ def get_patient_sections
270
+ raise NotImplementedError, "GetPatientSections magic action not implemented"
271
+ end
272
+
273
+ def get_procedures
274
+ raise NotImplementedError, "GetProcedures magic action not implemented"
275
+ end
276
+
277
+ def get_provider(provider_id = nil, user_name = nil)
278
+ if provider_id.nil? && user_name.nil?
279
+ raise ArgumentError, "provider_id or user_name must be given"
280
+ end
281
+
282
+ magic_parameters = {
283
+ :action => "GetProvider",
284
+ :parameter1 => provider_id,
285
+ :parameter2 => user_name
286
+ }
287
+ magic(magic_parameters)
288
+ end
289
+
290
+ def get_providers(security_filter = nil, name_filter = nil)
291
+ magic_parameters = {
292
+ :action => "GetProviders",
293
+ :parameter1 => security_filter,
294
+ :parameter2 => name_filter
295
+ }
296
+ magic(magic_parameters)
297
+ end
298
+
299
+ def get_ref_providers_by_specialty
300
+ raise NotImplementedError, "GetRefProvidersBySpecialty magic action not implemented"
301
+ end
302
+
303
+ def get_rounding_list_entries
304
+ raise NotImplementedError, "GetRoundingListEntries magic action not implemented"
305
+ end
306
+
307
+ def get_rounding_lists
308
+ raise NotImplementedError, "GetRoundingLists magic action not implemented"
309
+ end
310
+
311
+ def get_rx_favs
312
+ raise NotImplementedError, "GetRXFavs magic action not implemented"
313
+ end
314
+
315
+ def get_schedule
316
+ raise NotImplementedError, "GetSchedule magic action not implemented"
317
+ end
318
+
319
+ def get_server_info
320
+ magic_parameters = {
321
+ :action => "GetServerInfo"
322
+ }
323
+ magic(magic_parameters)
324
+ end
325
+
326
+ def get_sigs
327
+ raise NotImplementedError, "GetSigs magic action not implemented"
328
+ end
329
+
330
+ def get_task(userid, transaction_id)
331
+ magic_parameters = {
332
+ :action => "GetTask",
333
+ :userid => userid,
334
+ :parameter1 => transaction_id
335
+ }
336
+ magic(magic_parameters)
337
+ end
338
+
339
+ def get_task_list(userid = nil, since = nil)
340
+ magic_parameters = {
341
+ :action => "GetTaskList",
342
+ :userid => userid,
343
+ :parameter1 => since
344
+ }
345
+ magic(magic_parameters)
346
+ end
347
+
348
+ def get_user_authentication
349
+ raise NotImplementedError, "GetUserAuthentication magic action not implemented"
350
+ end
351
+
352
+ def get_user_id
353
+ raise NotImplementedError, "GetUserID magic action not implemented"
354
+ end
355
+
356
+ def get_user_security
357
+ raise NotImplementedError, "GetUserSecurity magic action not implemented"
358
+ end
359
+
360
+ def get_vaccine_manufacturers
361
+ raise NotImplementedError, "GetVaccineManufacturers magic action not implemented"
362
+ end
363
+
364
+ def get_vitals
365
+ raise NotImplementedError, "GetVitals magic action not implemented"
366
+ end
367
+
368
+ def make_task
369
+ raise NotImplementedError, "MakeTask magic action not implemented"
370
+ end
371
+
372
+ def save_admin_task
373
+ raise NotImplementedError, "SaveAdminTask magic action not implemented"
374
+ end
375
+
376
+ def save_allergy
377
+ raise NotImplementedError, "SaveAllergy magic action not implemented"
378
+ end
379
+
380
+ def save_ced
381
+ raise NotImplementedError, "SaveCED magic action not implemented"
382
+ end
383
+
384
+ def save_charge
385
+ raise NotImplementedError, "SaveCharge magic action not implemented"
386
+ end
387
+
388
+ def save_chart_view_audit
389
+ raise NotImplementedError, "SaveChartViewAudit magic action not implemented"
390
+ end
391
+
392
+ def save_diagnosis
393
+ raise NotImplementedError, "SaveDiagnosis magic action not implemented"
394
+ end
395
+
396
+ def save_document_image
397
+ raise NotImplementedError, "SaveDocumentImage magic action not implemented"
398
+ end
399
+
400
+ def save_er_note
401
+ raise NotImplementedError, "SaveERNote magic action not implemented"
402
+ end
403
+
404
+ def save_hie_document
405
+ raise NotImplementedError, "SaveHIEDocument magic action not implemented"
406
+ end
407
+
408
+ def save_history
409
+ raise NotImplementedError, "SaveHistory magic action not implemented"
410
+ end
411
+
412
+ def save_immunization
413
+ raise NotImplementedError, "SaveImmunization magic action not implemented"
414
+ end
415
+
416
+ def save_note
417
+ raise NotImplementedError, "SaveNote magic action not implemented"
418
+ end
419
+
420
+ def save_patient
421
+ raise NotImplementedError, "SavePatient magic action not implemented"
422
+ end
423
+
424
+ def save_patient_location
425
+ raise NotImplementedError, "SavePatientLocation magic action not implemented"
426
+ end
427
+
428
+ def save_problem
429
+ raise NotImplementedError, "SaveProblem magic action not implemented"
430
+ end
431
+
432
+ def save_problems_data
433
+ raise NotImplementedError, "SaveProblemsData magic action not implemented"
434
+ end
435
+
436
+ def save_ref_provider
437
+ raise NotImplementedError, "SaveRefProvider magic action not implemented"
438
+ end
439
+
440
+ def save_result
441
+ raise NotImplementedError, "SaveResult magic action not implemented"
442
+ end
443
+
444
+ def save_rx(userid, patientid, rxxml)
445
+ # Generate XML structure for rxxml
446
+ builder = Nokogiri::XML::Builder.new do |xml|
447
+ xml.saverx {
448
+ xml.field("name" => "transid", "value" => rxxml[:transid]) unless rxxml[:transid].nil?
449
+ xml.field("name" => "PharmID", "value" => rxxml[:pharmid]) unless rxxml[:pharmid].nil?
450
+ xml.field("name" => "DDI", "value" => rxxml[:ddi]) unless rxxml[:ddi].nil?
451
+ xml.field("name" => "GPPCCode", "value" => rxxml[:gppccode]) unless rxxml[:gppccode].nil?
452
+ xml.field("name" => "GPPCText", "value" => rxxml[:gppctext]) unless rxxml[:gppctext].nil?
453
+ xml.field("name" => "GPPCCustom", "value" => rxxml[:gppccustom]) unless rxxml[:gppccustom].nil?
454
+ xml.field("name" => "Sig", "value" => rxxml[:sig]) unless rxxml[:sig].nil?
455
+ xml.field("name" => "QuanPresc", "value" => rxxml[:quanpresc]) unless rxxml[:quanpresc].nil?
456
+ xml.field("name" => "Refills", "value" => rxxml[:refills]) unless rxxml[:refills].nil?
457
+ xml.field("name" => "DAW", "value" => rxxml[:daw]) unless rxxml[:daw].nil?
458
+ xml.field("name" => "DaysSupply", "value" => rxxml[:dayssupply]) unless rxxml[:dayssupply].nil?
459
+ xml.field("name" => "startdate", "value" => utc_to_local(Date.parse(rxxml[:startdate].to_s))) unless rxxml[:startdate].nil?
460
+ xml.field("name" => "historicalflag", "value" => rxxml[:historicalflag]) unless rxxml[:historicalflag].nil?
461
+ }
462
+ end
463
+
464
+ magic_parameters = {
465
+ :action => "SaveRX",
466
+ :userid => userid,
467
+ :patientid => patientid,
468
+ :parameter1 => nokogiri_to_string(builder)
469
+ }
470
+ magic(magic_parameters)
471
+ end
472
+
473
+ def save_simple_encounter
474
+ raise NotImplementedError, "SaveSimpleEncounter magic action not implemented"
475
+ end
476
+
477
+ def save_simple_rx
478
+ raise NotImplementedError, "SaveSimpleRX magic action not implemented"
479
+ end
480
+
481
+ def save_specialist
482
+ raise NotImplementedError, "SaveSpecialist magic action not implemented"
483
+ end
484
+
485
+ def save_task(userid, patientid, task_type = nil, target_user = nil, work_object_id = nil, comments = nil)
486
+ if task_type.nil? && target_user.nil? && work_object_id.nil? && comments.nil?
487
+ raise ArugmentError, "task_type, target_user, work_object_id, and comments can not all be nil"
488
+ end
489
+
490
+ magic_parameters = {
491
+ :action => "SaveTask",
492
+ :userid => userid,
493
+ :patientid => patientid,
494
+ :parameter1 => task_type,
495
+ :parameter2 => target_user,
496
+ :parameter3 => work_object_id,
497
+ :parameter4 => comments
498
+ }
499
+ magic(magic_parameters)
500
+ end
501
+
502
+ def save_task_status(userid, transaction_id = nil, status = nil, delegate_id = nil, comment = nil)
503
+ if transaction_id.nil? && param.nil? && delegate_id.nil? && comment.nil?
504
+ raise ArugmentError, "task_type, target_user, work_object_id, and comments can not all be nil"
505
+ end
506
+
507
+ magic_parameters = {
508
+ :action => "SaveTaskStatus",
509
+ :userid => userid,
510
+ :parameter1 => transaction_id,
511
+ :parameter2 => status,
512
+ :parameter3 => delegate_id,
513
+ :parameter4 => comment
514
+ }
515
+ magic(magic_parameters)
516
+ end
517
+
518
+ def save_tiff
519
+ raise NotImplementedError, "SaveTiff magic action not implemented"
520
+ end
521
+
522
+ def save_unstructured_document
523
+ raise NotImplementedError, "SaveUnstructuredDocument magic action not implemented"
524
+ end
525
+
526
+ def save_v10_doc_signature
527
+ raise NotImplementedError, "SaveV10DocSignature magic action not implemented"
528
+ end
529
+
530
+ def save_v11_note
531
+ raise NotImplementedError, "SaveV11Note magic action not implemented"
532
+ end
533
+
534
+ def save_vitals
535
+ raise NotImplementedError, "SaveVitals magic action not implemented"
536
+ end
537
+
538
+ def save_vitals_data
539
+ raise NotImplementedError, "SaveVitalsData magic action not implemented"
540
+ end
541
+
542
+ def search_charge_codes
543
+ raise NotImplementedError, "SearchChargeCodes magic action not implemented"
544
+ end
545
+
546
+ def search_diagnosis_codes
547
+ raise NotImplementedError, "SearchDiagnosisCodes magic action not implemented"
548
+ end
549
+
550
+ def search_meds(userid, patientid, search = nil)
551
+ magic_parameters = {
552
+ :action => "SearchMeds",
553
+ :userid => userid,
554
+ :patientid => patientid,
555
+ :parameter1 => search
556
+ }
557
+ magic(magic_parameters)
558
+ end
559
+
560
+ def search_patients
561
+ raise NotImplementedError, "SearchPatients magic action not implemented"
562
+ end
563
+
564
+ def search_patients_rxhub5
565
+ raise NotImplementedError, "SearchPatientsRXHub5 magic action not implemented"
566
+ end
567
+
568
+ def search_pharmacies
569
+ raise NotImplementedError, "SearchPharmacies magic action not implemented"
570
+ end
571
+
572
+ def search_problem_codes
573
+ raise NotImplementedError, "SearchProblemCodes magic action not implemented"
574
+ end
575
+
576
+ def update_encounter
577
+ raise NotImplementedError, "UpdateEncounter magic action not implemented"
578
+ end
579
+
580
+ def update_order
581
+ raise NotImplementedError, "UpdateOrder magic action not implemented"
582
+ end
583
+
584
+ def update_referral_order_status
585
+ raise NotImplementedError, "UpdateReferralOrderStatus magic action not implemented"
586
+ end
587
+
588
+ private
589
+
590
+ def nokogiri_to_string(builder)
591
+ builder.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip
592
+ end
593
+ end
594
+ end