renalware-core 2.0.113 → 2.0.115

Sign up to get free protection for your applications and to get access to all the features.
Files changed (194) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -2
  3. data/app/assets/javascripts/renalware/application.js.erb +0 -1
  4. data/app/assets/javascripts/renalware/feed_only_inputs.js.erb +26 -0
  5. data/app/assets/javascripts/renalware/feeds.js +50 -0
  6. data/app/assets/javascripts/renalware/person_ajax_search.js +43 -0
  7. data/app/assets/stylesheets/renalware/application.scss +0 -1
  8. data/app/assets/stylesheets/renalware/modules/_admin.scss +7 -0
  9. data/app/assets/stylesheets/renalware/modules/_pathology.scss +1 -1
  10. data/app/assets/stylesheets/renalware/modules/_patients.scss +6 -0
  11. data/app/assets/stylesheets/renalware/modules/_snippets.scss +2 -2
  12. data/app/assets/stylesheets/renalware/partials/_forms.scss +5 -1
  13. data/app/assets/stylesheets/renalware/partials/_layout.scss +4 -0
  14. data/app/{views/renalware/patients/_side_menu.html.slim → components/renalware/patients/side_menu_component.html.slim} +0 -0
  15. data/app/components/renalware/patients/side_menu_component.rb +18 -0
  16. data/app/controllers/renalware/clinical/body_compositions_controller.rb +6 -0
  17. data/app/controllers/renalware/feeds/hl7_test_messages_controller.rb +60 -0
  18. data/app/controllers/renalware/hd/mdm_patients_controller.rb +16 -6
  19. data/app/controllers/renalware/hd/scheduling/diaries_controller.rb +91 -0
  20. data/app/controllers/renalware/hd/scheduling/diary_slots_controller.rb +169 -0
  21. data/app/controllers/renalware/hd/session_forms/batches_controller.rb +1 -1
  22. data/app/controllers/renalware/pathology/observation_requests_controller.rb +23 -4
  23. data/app/controllers/renalware/pathology/requests/requests_controller.rb +0 -4
  24. data/app/controllers/renalware/patients/abridgements_controller.rb +39 -0
  25. data/app/controllers/renalware/pd/regimes_controller.rb +26 -0
  26. data/app/controllers/renalware/problems/problems_controller.rb +2 -2
  27. data/app/helpers/renalware/application_helper.rb +9 -0
  28. data/app/helpers/renalware/article_helper.rb +18 -0
  29. data/app/helpers/renalware/form_helper.rb +3 -2
  30. data/app/helpers/renalware/users_helper.rb +5 -1
  31. data/app/javascript/controllers/clipboard_controller.js +16 -0
  32. data/app/javascript/packs/renalware_core.js +20 -0
  33. data/app/jobs/feed_job.rb +1 -3
  34. data/app/jobs/hl7_message_example.yml +2 -2
  35. data/app/models/renalware/feeds/files/practice_memberships/import_job.rb +3 -0
  36. data/app/models/renalware/feeds/files/primary_care_physicians/import_job.rb +2 -0
  37. data/app/models/renalware/feeds/hl7_message.rb +57 -6
  38. data/app/models/renalware/feeds/hl7_test_form.rb +10 -0
  39. data/app/models/renalware/feeds/hl7_test_message.rb +11 -0
  40. data/app/models/renalware/feeds/message_parser.rb +6 -2
  41. data/app/models/renalware/feeds/message_processor.rb +44 -32
  42. data/app/models/renalware/feeds/persist_message.rb +9 -3
  43. data/app/models/renalware/feeds.rb +2 -0
  44. data/app/models/renalware/hd/scheduling/archive_arguments.rb +19 -0
  45. data/app/models/renalware/hd/scheduling/diary.rb +54 -0
  46. data/app/models/renalware/hd/scheduling/diary_housekeeping_job.rb +84 -0
  47. data/app/models/renalware/hd/scheduling/diary_range.rb +69 -0
  48. data/app/models/renalware/hd/scheduling/diary_slot.rb +88 -0
  49. data/app/models/renalware/hd/scheduling/find_or_create_diary_by_week_query.rb +52 -0
  50. data/app/models/renalware/hd/scheduling/find_or_create_master_diary.rb +27 -0
  51. data/app/models/renalware/hd/scheduling/master_diary.rb +35 -0
  52. data/app/models/renalware/hd/scheduling/weekly_diary.rb +47 -0
  53. data/app/models/renalware/pathology/message_listener.rb +2 -2
  54. data/app/models/renalware/pathology/requests/global_rule/latest_crf_older_than_weeks.rb +38 -0
  55. data/app/models/renalware/pathology/requests/global_rule/patient_is_diabetic.rb +1 -1
  56. data/app/models/renalware/patient.rb +1 -1
  57. data/app/models/renalware/patients/abridgement.rb +18 -0
  58. data/app/models/renalware/patients/abridgement_search_form.rb +12 -0
  59. data/app/models/renalware/patients/ingestion/command.rb +25 -0
  60. data/app/models/renalware/patients/ingestion/command_factory.rb +135 -0
  61. data/app/models/renalware/patients/ingestion/commands/add_or_update_patient.rb +65 -0
  62. data/app/models/renalware/patients/ingestion/message_listener.rb +21 -0
  63. data/app/models/renalware/patients/ingestion/message_mapper.rb +26 -0
  64. data/app/models/renalware/patients/ingestion/message_mappers/patient.rb +73 -0
  65. data/app/models/renalware/patients/ingestion/update_master_patient_index.rb +60 -0
  66. data/app/models/renalware/patients/ingestion/update_master_patient_index_job.rb.dead +20 -0
  67. data/app/models/renalware/patients.rb +4 -3
  68. data/app/models/renalware/problems/problem.rb +6 -2
  69. data/app/models/renalware/ukrdc/incoming/paths.rb +6 -7
  70. data/app/policies/renalware/admin/devops_policy.rb +18 -0
  71. data/app/policies/renalware/hd/{diary_policy.rb → scheduling/diary_policy.rb} +3 -1
  72. data/app/presenters/renalware/clinical/profile_presenter.rb +2 -1
  73. data/app/presenters/renalware/directory/person_auto_complete_presenter.rb +1 -1
  74. data/app/presenters/renalware/hd/scheduling/diary_presenter.rb +84 -0
  75. data/app/presenters/renalware/hd/scheduling/diary_slot_presenter.rb +74 -0
  76. data/app/presenters/renalware/hd/scheduling/null_slot.rb +42 -0
  77. data/app/presenters/renalware/pd/dashboard_presenter.rb +3 -2
  78. data/app/views/renalware/accesses/procedures/_form.html.slim +5 -1
  79. data/app/views/renalware/accesses/procedures/_list.html.slim +11 -4
  80. data/app/views/renalware/accesses/procedures/show.html.slim +17 -19
  81. data/app/views/renalware/addresses/_form.html.slim +17 -12
  82. data/app/views/renalware/admin/cache/show.html.slim +24 -0
  83. data/app/views/renalware/clinical/body_compositions/_list.html.slim +7 -43
  84. data/app/views/renalware/clinical/body_compositions/_table.html.slim +42 -0
  85. data/app/views/renalware/clinical/body_compositions/index.html.slim +9 -0
  86. data/app/views/renalware/clinical/dry_weights/_list.html.slim +2 -8
  87. data/app/views/renalware/clinical/dry_weights/_table.html.slim +7 -0
  88. data/app/views/renalware/clinical/profiles/show.html.slim +4 -2
  89. data/app/views/renalware/feeds/hl7_test_messages/create.js.erb +10 -0
  90. data/app/views/renalware/feeds/hl7_test_messages/new.slim +18 -0
  91. data/app/views/renalware/hd/mdm_patients/_filters.html.slim +0 -11
  92. data/app/views/renalware/hd/mdm_patients/_page_actions.html.slim +29 -0
  93. data/app/views/renalware/hd/mdm_patients/index.html.slim +7 -4
  94. data/app/views/renalware/hd/{diaries → scheduling/diaries}/_page_actions.html.slim +4 -4
  95. data/app/views/renalware/hd/{diaries → scheduling/diaries}/_table.html.slim +0 -0
  96. data/app/views/renalware/hd/{diaries → scheduling/diaries}/_weekly_diary.html.slim +1 -1
  97. data/app/views/renalware/hd/{diaries → scheduling/diaries}/edit.html.slim +6 -6
  98. data/app/views/renalware/hd/{diaries → scheduling/diaries}/index.html.slim +0 -0
  99. data/app/views/renalware/hd/{diaries → scheduling/diaries}/show.pdf.slim +0 -0
  100. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/_form.html.slim +15 -6
  101. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/_slot.html.slim +2 -2
  102. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/_tab.html.slim +1 -1
  103. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/create.js.erb +1 -1
  104. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/destroy.js.erb +1 -1
  105. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/edit.html.slim +2 -2
  106. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/new.html.slim +0 -0
  107. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/new.js.erb +0 -0
  108. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/show.js.erb +0 -0
  109. data/app/views/renalware/hd/{diary_slots → scheduling/diary_slots}/update.js.erb +1 -1
  110. data/app/views/renalware/hospitals/units/index.html.slim +2 -2
  111. data/app/views/renalware/layouts/_patient.html.slim +2 -1
  112. data/app/views/renalware/letters/contacts/_form.html.slim +10 -13
  113. data/app/views/renalware/letters/letters/_form.html.slim +2 -9
  114. data/app/views/renalware/navigation/_developer.html.slim +4 -0
  115. data/app/views/renalware/navigation/_menu.html.slim +2 -0
  116. data/app/views/renalware/pathology/observation_requests/_filters.html.slim +17 -0
  117. data/app/views/renalware/pathology/observation_requests/index.html.slim +2 -1
  118. data/app/views/renalware/patients/_layout.html.slim +1 -1
  119. data/app/views/renalware/patients/_side_menu.html.slim.dead +7 -0
  120. data/app/views/renalware/patients/abridgements/_abridgement.html.slim +8 -0
  121. data/app/views/renalware/patients/abridgements/_table.html.slim +12 -0
  122. data/app/views/renalware/patients/abridgements/index.html.slim +22 -0
  123. data/app/views/renalware/patients/alerts/create.json +3 -0
  124. data/app/views/renalware/patients/patients/_form.html.slim +36 -17
  125. data/app/views/renalware/patients/patients/edit.html.slim +1 -1
  126. data/app/views/renalware/patients/patients/new.html.slim +1 -1
  127. data/app/views/renalware/patients/side_menu/_actions.html.slim +2 -0
  128. data/app/views/renalware/pd/_apd_regimes.html.slim +1 -1
  129. data/app/views/renalware/pd/_capd_regimes.html.slim +1 -1
  130. data/app/views/renalware/pd/dashboards/show/_apd_regimes.html.slim +11 -2
  131. data/app/views/renalware/pd/dashboards/show/_capd_regimes.html.slim +11 -2
  132. data/app/views/renalware/pd/regimes/index.html.slim +7 -0
  133. data/app/views/renalware/renal/profiles/_form.html.slim +7 -24
  134. data/app/views/renalware/shared/documents/_binary_marker_input.html.slim +2 -2
  135. data/app/views/renalware/shared/documents/_blood_group_input.html.slim +4 -2
  136. data/app/views/renalware/transplants/registrations/_form.html.slim +22 -17
  137. data/config/locales/renalware/clinical/body_composition.yml +6 -3
  138. data/config/locales/renalware/clinical/dry_weight.en.yml +4 -3
  139. data/config/locales/renalware/hd/diary_slots.en.yml +3 -2
  140. data/config/locales/renalware/letters/contact.en.yml +0 -2
  141. data/config/routes/feeds.rb +5 -0
  142. data/config/routes/hd.rb +11 -7
  143. data/config/routes/letters.rb +0 -5
  144. data/config/routes/patients.rb +1 -0
  145. data/config/routes/pd.rb +2 -2
  146. data/config/routes/renal.rb +0 -5
  147. data/config/routes.rb +1 -0
  148. data/config/webpack/development.js +5 -0
  149. data/config/webpack/environment.js +3 -0
  150. data/config/webpack/production.js +5 -0
  151. data/config/webpack/test.js +5 -0
  152. data/config/webpacker.yml +103 -0
  153. data/db/functions/hd_diary_archive_elapsed_master_slots_v01.sql +40 -0
  154. data/db/migrate/20190322120025_create_feed_hl7_test_messages.rb +12 -0
  155. data/db/migrate/20190325134823_create_patients_master_index.rb +24 -0
  156. data/db/migrate/20190327100851_add_handled_to_feed_messages.rb +5 -0
  157. data/db/migrate/20191012121433_add_consultant_to_users.rb +7 -0
  158. data/db/migrate/20191018143635_create_hd_diary_matrix_view.rb +7 -0
  159. data/db/migrate/20191018144917_create_fn_to_archive_master_slots.rb +9 -0
  160. data/db/views/hd_diary_matrix_v01.sql +38 -0
  161. data/lib/core_extensions/active_record/sort.rb +27 -9
  162. data/lib/renalware/configuration.rb +3 -0
  163. data/lib/renalware/engine.rb +31 -0
  164. data/lib/renalware/version.rb +1 -1
  165. data/lib/renalware/week_period.rb +8 -7
  166. data/lib/renalware.rb +13 -1
  167. data/lib/tasks/hd.rake +7 -0
  168. data/lib/tasks/pathology.rake +1 -1
  169. data/lib/tasks/renalware.rake +89 -4
  170. data/spec/factories/hd/scheduling/diaries.rb +18 -0
  171. data/spec/factories/hd/{slots.rb → scheduling/slots.rb} +1 -1
  172. data/spec/factories/patients/abridgements.rb +9 -0
  173. data/spec/support/hl7_helpers.rb +13 -0
  174. data/spec/support/pages/letters/form.rb +4 -1
  175. metadata +126 -50
  176. data/app/assets/javascripts/renalware/auto_complete.js +0 -63
  177. data/app/controllers/renalware/hd/diaries_controller.rb +0 -89
  178. data/app/controllers/renalware/hd/diary_slots_controller.rb +0 -175
  179. data/app/controllers/renalware/letters/descriptions_controller.rb +0 -22
  180. data/app/controllers/renalware/renal/prd_descriptions_controller.rb +0 -15
  181. data/app/models/renalware/hd/archive_yesterdays_slots_job.rb +0 -69
  182. data/app/models/renalware/hd/diary.rb +0 -41
  183. data/app/models/renalware/hd/diary_slot.rb +0 -83
  184. data/app/models/renalware/hd/find_or_create_diary_by_week_query.rb +0 -50
  185. data/app/models/renalware/hd/find_or_create_master_diary.rb +0 -26
  186. data/app/models/renalware/hd/master_diary.rb +0 -32
  187. data/app/models/renalware/hd/weekly_diary.rb +0 -45
  188. data/app/models/renalware/renal/prd_descriptions/search_query.rb +0 -35
  189. data/app/presenters/renalware/hd/diary_presenter.rb +0 -79
  190. data/app/presenters/renalware/hd/diary_slot_presenter.rb +0 -72
  191. data/app/presenters/renalware/hd/null_slot.rb +0 -40
  192. data/app/views/renalware/renal/prd_descriptions/search.json.jbuilder +0 -6
  193. data/lib/test_support/autocomplete_helpers.rb +0 -14
  194. data/spec/factories/hd/diaries.rb +0 -14
@@ -1,5 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ def ensure_log_goes_to_stdout
4
+ old_logger = Webpacker.logger
5
+ Webpacker.logger = ActiveSupport::Logger.new(STDOUT)
6
+ yield
7
+ ensure
8
+ Webpacker.logger = old_logger
9
+ end
10
+
3
11
  namespace :renalware do
4
12
  desc "Install package.json dependencies with yarn for the renalware-core engine - "\
5
13
  "without this <path to installed gem>/renalware-core/node_modules is not populated "\
@@ -10,17 +18,94 @@ namespace :renalware do
10
18
  system "yarn install --no-progress --production"
11
19
  end
12
20
  end
21
+
22
+ desc "Cleans the Webpack output folder (public/renalware-core-packs)"
23
+ task :clean_webpack_output_folder do
24
+ puts "Destroying packs output folder ..."
25
+ Dir.chdir(File.join(__dir__, "..", "..")) do
26
+ # TODO : Load packs output from config/webpacker.yml
27
+ system "rm -rf public/renalware-core-packs"
28
+ end
29
+ end
30
+
31
+ # I have found that it is necessary to force remove public/renalware-core-packs with the
32
+ # clean_webpack_output_folder task above before compiling, otherwise webpack does not
33
+ # always find changes in js/controllers/*.js. I think this is safe to do in a capistrano deploy
34
+ # because the symlink to public is only applied after a successful execution of (among other
35
+ # things) assets:precompile.
36
+ desc "Compile JavaScript packs using webpack for production with digests"
37
+ task webpacker_compile: %i(clean_webpack_output_folder yarn_install environment) do
38
+ puts "Compiling renalware-core packs with webpack.."
39
+ if Rails.env.development? || Rails.env.test?
40
+ compile_webpacker_output
41
+ else
42
+ temporarily_point_webpacker_config_public_root_path_to_rails_app_root do
43
+ compile_webpacker_output
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ def compile_webpacker_output
50
+ Webpacker.with_node_env("production") do
51
+ ensure_log_goes_to_stdout do
52
+ if Renalware.webpacker.commands.compile
53
+ # Successful compilation!
54
+ else
55
+ # Failed compilation
56
+ exit!
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ # This is something of a hack to get webpacker to compile the renalware-core-packs in the
63
+ # host Rails app's public folder. We change out config/webpacker.yml to point to the host app's
64
+ # public path, do the compile, then revert out change.
65
+ # The downside of this approach is that if running staging or production env locally without
66
+ # nginx to find and serve public/renalware-core-packs, the pack files will not be found by the host
67
+ # because the Rack::Static middleware we setup in engine.rb will not find them.
68
+ # An alternative is for us to do the compile inside the engine and then cp -R or rsync (better
69
+ # if we are symlinking renawlare-core-packs to shared in deploy.rb) the
70
+ # folder into the host's public app where it can be served by nginx (if configured).
71
+ # This has the advantage that the same files are available in the engine's public folder (so they
72
+ # can be servered by Rack::Static - see engine.rb) and also in the host apps public folder
73
+ # where nginx can server them if we are in a real 'environment'
74
+ def temporarily_point_webpacker_config_public_root_path_to_rails_app_root
75
+ engine_config_folder = Renalware::Engine.root.join("config")
76
+ find = "public_root_path: .*$"
77
+ replace = "public_root_path: #{Rails.root.join('public')}"
78
+
79
+ # This changes the contents of file, creating a backup in webpacker.yml.bak
80
+ `ruby -pi.bak -e "gsub(/#{find}/, '#{replace}')" #{engine_config_folder}/webpacker.yml`
81
+
82
+ yield if block_given?
83
+ ensure
84
+ # Ensure that we always restore the backup webpacker.yml
85
+ FileUtils.mv(
86
+ engine_config_folder.join("webpacker.yml.bak"),
87
+ engine_config_folder.join("webpacker.yml")
88
+ )
13
89
  end
14
90
 
15
- def enhance_assets_precompile_with_engine_yarn_install
16
- Rake::Task["assets:precompile"].enhance(["renalware:yarn_install"])
91
+ def enhance_assets_precompile_with_renalware_webpacker_compile
92
+ Rake::Task["assets:precompile"].enhance(["renalware:webpacker_compile"])
17
93
  end
18
94
 
19
95
  # When a host app runs rake assets:precompile, hook into this and enhance the
20
- # task so it runs yarn install for (and relative to) the engine, wherever it is installed.
96
+ # task so it runs webpacker install for (and relative to) the engine, wherever it is installed.
21
97
  # Without that, assets:precompile will fail because the engine references various js and css files
22
98
  # in ./node_modules, and these are not included in the source, but need to be installed with yarn
23
99
  # at deploy time.
100
+ #
101
+ # Note that when runnning in the engine in development, we need to set the ENV
102
+ # var WEBPACKER_PRECOMPILE=no (e.g. in ./.env) otherwise wepacker will enhance the
103
+ # 'assets:precompile' task with 'webpacker:compile' task, and the latter task does not exist
104
+ # in out context (for us its called app:webpacker:compile).
105
+ # A possible downside of this is that webpacker compilation in the dummy app, if ever required, may
106
+ # not work, I'm not sure.
24
107
  if Rake::Task.task_defined?("assets:precompile")
25
- enhance_assets_precompile_with_engine_yarn_install
108
+ enhance_assets_precompile_with_renalware_webpacker_compile
109
+ else
110
+ Rake::Task.define_task("assets:precompile" => "renalware:webpacker:compile")
26
111
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :hd_weekly_diary, class: "Renalware::HD::Scheduling::WeeklyDiary" do
5
+ accountable
6
+ year { 2017 }
7
+ week_number { 2 }
8
+ master { false }
9
+ hospital_unit_id { nil }
10
+ association :master_diary, factory: :hd_master_diary
11
+ end
12
+
13
+ factory :hd_master_diary, class: "Renalware::HD::Scheduling::MasterDiary" do
14
+ accountable
15
+ master { true }
16
+ hospital_unit_id { nil }
17
+ end
18
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  FactoryBot.define do
4
- factory :hd_diary_slot, class: "Renalware::HD::DiarySlot" do
4
+ factory :hd_diary_slot, class: "Renalware::HD::Scheduling::DiarySlot" do
5
5
  association :diurnal_period_code_id, :am, factory: :hd_diurnal_period_code
6
6
  association :patient
7
7
  association :station, factory: :hd_station
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :abridged_patient, class: "Renalware::Patients::Abridgement" do
5
+ hospital_number { "KCH99999" }
6
+ given_name { "Aaron" }
7
+ family_name { "BALLARD" }
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module HL7Helpers
4
+ def hl7_message_from_file(filename, patient)
5
+ result = parse_hl7_file(filename, patient)
6
+ Renalware::Feeds::HL7Message.new(::HL7::Message.new(result.lines))
7
+ end
8
+
9
+ def parse_hl7_file(filename, patient, pid = nil)
10
+ body = file_fixture("hl7/#{filename}.hl7.erb").read
11
+ ERB.new(body).result(binding)
12
+ end
13
+ end
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rails_helper"
3
4
  require_relative "../page_object"
4
5
 
5
6
  # rubocop disable Metrics/LineLength
6
7
  module Pages
7
8
  module Letters
8
9
  class Form < PageObject
10
+ include CapybaraSelect2
11
+
9
12
  PERSON_ROLE_TO_RADIO_ID_MAP = {
10
13
  patient: :letter_main_recipient_attributes_person_role_patient,
11
14
  primary_care_physician: :letter_main_recipient_attributes_person_role_primary_care_physician,
@@ -26,7 +29,7 @@ module Pages
26
29
  end
27
30
 
28
31
  def description=(value)
29
- fill_in "Description", with: value
32
+ select2 value, css: ".letter_description"
30
33
  end
31
34
 
32
35
  def main_recipient=(main_recipient_role)