renalware-core 2.0.0.pre.rc3 → 2.0.0.pre.rc4

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 (281) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +1 -0
  4. data/app/assets/images/renalware/chosen-sprite.png +0 -0
  5. data/app/assets/images/renalware/chosen-sprite@2x.png +0 -0
  6. data/app/assets/images/renalware/nhs_a4_letter_logo_black.png +0 -0
  7. data/app/assets/images/renalware/nhs_a4_letter_logo_blue.png +0 -0
  8. data/app/assets/javascripts/renalware/session_timeout_redirect.js.erb +3 -1
  9. data/app/assets/stylesheets/renalware/base/_variables.scss +2 -0
  10. data/app/assets/stylesheets/renalware/modules/_admissions.scss +21 -25
  11. data/app/assets/stylesheets/renalware/modules/_feeds.scss +27 -0
  12. data/app/assets/stylesheets/renalware/modules/_letters.scss +4 -0
  13. data/app/assets/stylesheets/renalware/modules/_patients.scss +18 -17
  14. data/app/assets/stylesheets/renalware/modules/_pd.scss +8 -0
  15. data/app/assets/stylesheets/renalware/partials/_lists.scss +3 -0
  16. data/app/assets/stylesheets/renalware/partials/_modal_window.scss +7 -1
  17. data/app/assets/stylesheets/renalware/partials/_navigation.scss +2 -2
  18. data/app/assets/stylesheets/renalware/partials/_tables.scss +20 -0
  19. data/app/assets/stylesheets/renalware/partials/_typography.scss +4 -0
  20. data/app/controllers/renalware/admin/feeds/files_controller.rb +49 -0
  21. data/app/controllers/renalware/admissions/admissions_controller.rb +101 -0
  22. data/app/controllers/renalware/admissions/patient_admissions_controller.rb +20 -0
  23. data/app/controllers/renalware/devise/sessions_controller.rb +29 -0
  24. data/app/controllers/renalware/letters/approved_letters_controller.rb +9 -1
  25. data/app/controllers/renalware/letters/contacts_controller.rb +29 -0
  26. data/app/controllers/renalware/low_clearance/base_controller.rb +13 -0
  27. data/app/controllers/renalware/low_clearance/dashboards_controller.rb +21 -0
  28. data/app/controllers/renalware/low_clearance/mdm_controller.rb +13 -0
  29. data/app/controllers/renalware/low_clearance/mdm_patients_controller.rb +27 -0
  30. data/app/controllers/renalware/low_clearance/profiles_controller.rb +45 -0
  31. data/app/controllers/renalware/patients/primary_care_physicians_controller.rb +4 -3
  32. data/app/controllers/renalware/pd/exit_site_infections_controller.rb +2 -1
  33. data/app/controllers/renalware/transplants/donor_workups_controller.rb +5 -2
  34. data/app/documents/renalware/low_clearance/profile_document.rb +26 -0
  35. data/app/documents/renalware/renal/profile_document.rb +0 -21
  36. data/app/helpers/renalware/application_helper.rb +5 -0
  37. data/app/helpers/renalware/attribute_name_helper.rb +0 -24
  38. data/app/helpers/renalware/infection_organisms_helper.rb +0 -20
  39. data/app/helpers/renalware/mdm_helper.rb +1 -1
  40. data/app/helpers/renalware/pd_regimes_helper.rb +1 -5
  41. data/app/mailers/renalware/admin/user_mailer.rb +1 -3
  42. data/app/mailers/renalware/letters/delivery/errors.rb +9 -0
  43. data/app/mailers/renalware/letters/delivery/practice_mailer.rb +55 -0
  44. data/app/mailers/{previews → renalware/previews}/user_mailer_preview.rb +0 -0
  45. data/app/models/concerns/renalware/feeds/job.rb +30 -0
  46. data/app/models/concerns/renalware/letters/letter_pathology.rb +31 -8
  47. data/app/models/concerns/renalware/patients_ransack_helper.rb +9 -9
  48. data/app/models/concerns/renalware/personable.rb +8 -3
  49. data/app/models/concerns/renalware/string_logging.rb +11 -0
  50. data/app/models/renalware/admissions/admission.rb +42 -0
  51. data/app/models/renalware/admissions/admission_query.rb +38 -0
  52. data/app/models/renalware/admissions/admission_search_form.rb +51 -0
  53. data/app/models/renalware/clinics/clinic_visit.rb +1 -0
  54. data/app/models/renalware/feeds/file.rb +31 -0
  55. data/app/models/renalware/feeds/file_type.rb +13 -0
  56. data/app/models/renalware/feeds/files/create_feed_file.rb +51 -0
  57. data/app/models/renalware/feeds/files/enqueue_file_for_background_processing.rb +18 -0
  58. data/app/models/renalware/feeds/files/exceptions.rb +12 -0
  59. data/app/models/renalware/feeds/files/file_upload_form.rb +24 -0
  60. data/app/models/renalware/feeds/files/import_job_factory.rb +15 -0
  61. data/app/models/renalware/feeds/files/practice_memberships/import_csv.rb +30 -0
  62. data/app/models/renalware/feeds/files/practice_memberships/import_job.rb +49 -0
  63. data/app/models/renalware/feeds/files/practices/convert_xml_to_csv.rb +145 -0
  64. data/app/models/renalware/feeds/files/practices/country_map.rb +33 -0
  65. data/app/models/renalware/feeds/files/practices/csv_file.rb +23 -0
  66. data/app/models/renalware/feeds/files/practices/csv_organisation.rb +35 -0
  67. data/app/models/renalware/feeds/files/practices/import_csv.rb +30 -0
  68. data/app/models/renalware/feeds/files/practices/import_job.rb +58 -0
  69. data/app/models/renalware/feeds/files/primary_care_physicians/import_csv.rb +28 -0
  70. data/app/models/renalware/feeds/files/primary_care_physicians/import_job.rb +44 -0
  71. data/app/models/renalware/feeds/files/tissue_typing/import.rb +12 -0
  72. data/app/models/renalware/feeds/hl7_message.rb +15 -0
  73. data/app/models/renalware/hd/sessions/auditable_session.rb +1 -1
  74. data/app/models/renalware/hospitals/unit.rb +2 -1
  75. data/app/models/renalware/hospitals/ward.rb +1 -1
  76. data/app/models/renalware/letters/approve_letter.rb +15 -9
  77. data/app/models/renalware/letters/delivery/deliver_letter.rb.dead +41 -0
  78. data/app/models/renalware/letters/delivery/delivery_policy.rb +28 -0
  79. data/app/models/renalware/letters/delivery/email_letter_to_practice.rb +46 -0
  80. data/app/models/renalware/letters/delivery/practice_email.rb +28 -0
  81. data/app/models/renalware/letters/draft_letter.rb +1 -1
  82. data/app/models/renalware/letters/part/recent_pathology_results.rb +43 -4
  83. data/app/models/renalware/letters/pdf_letter_cache.rb +2 -3
  84. data/app/models/renalware/letters/recipient_params_processor.rb +1 -1
  85. data/app/models/renalware/letters/relevant_observation_description.rb +2 -3
  86. data/app/models/renalware/letters/revise_letter.rb +3 -1
  87. data/app/models/renalware/letters.rb +3 -0
  88. data/app/models/renalware/low_clearance/mdm_patients_query.rb +62 -0
  89. data/app/models/renalware/low_clearance/modality_description.rb +11 -0
  90. data/app/models/renalware/low_clearance/patient.rb +14 -0
  91. data/app/models/renalware/low_clearance/profile.rb +15 -0
  92. data/app/models/renalware/low_clearance/version.rb +9 -0
  93. data/app/models/renalware/low_clearance.rb +15 -0
  94. data/app/models/renalware/patient.rb +3 -0
  95. data/app/models/renalware/patients/patient_hospital_identifiers.rb +8 -0
  96. data/app/models/renalware/patients/practice.rb +4 -1
  97. data/app/models/renalware/patients/practice_membership.rb +12 -0
  98. data/app/models/renalware/patients/primary_care_physician.rb +24 -5
  99. data/app/models/renalware/pd/exit_site_infection.rb +6 -0
  100. data/app/models/renalware/pd/regime_bag.rb +1 -1
  101. data/app/models/renalware/problems/note.rb +1 -1
  102. data/app/models/renalware/renal/registry/preflight_checks/deaths_query.rb +1 -1
  103. data/app/models/renalware/renal.rb +0 -4
  104. data/app/models/renalware/system/update_user.rb +1 -1
  105. data/app/models/renalware/transplants/recipient_operation.rb +3 -8
  106. data/app/models/renalware/user.rb +3 -3
  107. data/app/models/renalware/zip_archive.rb +48 -0
  108. data/app/policies/renalware/admissions/admission_policy.rb +8 -0
  109. data/app/policies/renalware/feeds/file_policy.rb +25 -0
  110. data/app/policies/renalware/letters/letter_policy.rb +2 -0
  111. data/app/policies/renalware/low_clearance/profile_policy.rb +13 -0
  112. data/app/presenters/renalware/admissions/admission_presenter.rb +49 -0
  113. data/app/presenters/renalware/dashboard/dashboard_presenter.rb +1 -1
  114. data/app/presenters/renalware/hd/session_access_presenter.rb +1 -1
  115. data/app/presenters/renalware/letters/letter_form_presenter.rb +1 -1
  116. data/app/presenters/renalware/letters/letter_presenter.rb +6 -1
  117. data/app/presenters/renalware/letters/practice_email_meta_data.rb +85 -0
  118. data/app/presenters/renalware/low_clearance/dashboard_presenter.rb +19 -0
  119. data/app/presenters/renalware/low_clearance/mdm_presenter.rb +12 -0
  120. data/app/presenters/renalware/pathology/observation_set_presenter.rb +1 -1
  121. data/app/presenters/renalware/pathology/observations_diff.rb +1 -1
  122. data/app/presenters/renalware/renal/clinical_summary_presenter.rb +17 -1
  123. data/app/validators/renalware/patients/height_validator.rb +17 -0
  124. data/app/views/renalware/admin/feeds/files/index.html.slim +61 -0
  125. data/app/views/renalware/admissions/admissions/_filters.html.slim +24 -0
  126. data/app/views/renalware/admissions/admissions/_form.html.slim +56 -0
  127. data/app/views/renalware/admissions/admissions/_table.html.slim +65 -0
  128. data/app/views/renalware/admissions/admissions/edit.html.slim +6 -0
  129. data/app/views/renalware/admissions/admissions/index.html.slim +12 -0
  130. data/app/views/renalware/admissions/admissions/new.html.slim +6 -0
  131. data/app/views/renalware/admissions/consults/_form.html.slim +2 -3
  132. data/app/views/renalware/admissions/consults/_table.html.slim +1 -3
  133. data/app/views/renalware/admissions/patient_admissions/index.html.slim +10 -0
  134. data/app/views/renalware/clinics/clinic_visits/_table.html.slim +2 -1
  135. data/app/views/renalware/clinics/clinic_visits/_table_row.html.slim +1 -0
  136. data/app/views/renalware/drugs/drugs/index.html.slim +3 -2
  137. data/app/views/renalware/hd/current_profile/_summary.html.slim +8 -8
  138. data/app/views/renalware/hd/diary_slots/_form.html.slim +4 -4
  139. data/app/views/renalware/hd/mdm_patients/_patient.html.slim +0 -1
  140. data/app/views/renalware/hd/protocols/_profile.html.slim +4 -4
  141. data/app/views/renalware/letters/contacts/_contact.html.slim +5 -1
  142. data/app/views/renalware/letters/contacts/_edit.html.slim +30 -0
  143. data/app/views/renalware/letters/contacts/_form.html.slim +1 -1
  144. data/app/views/renalware/letters/contacts/_table.html.slim +6 -5
  145. data/app/views/renalware/letters/contacts/edit.html.slim +8 -0
  146. data/app/views/renalware/letters/contacts/edit.js.erb +9 -0
  147. data/app/views/renalware/letters/contacts/index.html.slim +9 -3
  148. data/app/views/renalware/letters/contacts/index.js.erb +1 -1
  149. data/app/views/renalware/letters/contacts/update.js.erb +10 -0
  150. data/app/views/renalware/letters/delivery/practice_mailer/patient_letter.text.erb +3 -0
  151. data/app/views/renalware/letters/electronic_receipts/_table.html.slim +3 -1
  152. data/app/views/renalware/letters/electronic_receipts/sent.html.slim +6 -9
  153. data/app/views/renalware/letters/formatted_letters/_letter.html.slim +26 -13
  154. data/app/views/renalware/letters/letters/_cc_recipient_form.html.slim +1 -1
  155. data/app/views/renalware/letters/letters/_form.html.slim +0 -1
  156. data/app/views/renalware/letters/letters/_pathology.html.slim +1 -2
  157. data/app/views/renalware/letters/letters/_preview.html.slim +14 -5
  158. data/app/views/renalware/letters/parts/_clinical_observations.html.slim +2 -2
  159. data/app/views/renalware/letters/parts/_recent_pathology_results.html.slim +1 -7
  160. data/app/views/renalware/low_clearance/dashboards/_page_actions.html.slim +19 -0
  161. data/app/views/renalware/low_clearance/dashboards/show.html.slim +7 -0
  162. data/app/views/renalware/{renal/low_clearance → low_clearance}/mdm/_bottom.html.slim +0 -0
  163. data/app/views/renalware/{renal/low_clearance → low_clearance}/mdm/_low_clearance_profile.html.slim +0 -0
  164. data/app/views/renalware/{renal/low_clearance → low_clearance}/mdm/_top.html.slim +0 -0
  165. data/app/views/renalware/low_clearance/mdm_patients/_filters.html.slim +9 -0
  166. data/app/views/renalware/low_clearance/profiles/_summary.html.slim +125 -0
  167. data/app/views/renalware/low_clearance/profiles/edit.html.slim +39 -0
  168. data/app/views/renalware/medications/prescriptions/_table.html.slim +1 -1
  169. data/app/views/renalware/messaging/internal/receipts/_receipt.html.slim +2 -1
  170. data/app/views/renalware/messaging/internal/receipts/_sent_receipt.html.slim +3 -2
  171. data/app/views/renalware/messaging/internal/receipts/_sent_table.html.slim +2 -1
  172. data/app/views/renalware/messaging/internal/receipts/_table.html.slim +1 -0
  173. data/app/views/renalware/navigation/_mdms.html.slim +1 -1
  174. data/app/views/renalware/navigation/_patients_admin.html.slim +1 -0
  175. data/app/views/renalware/navigation/_renalware_admin.html.slim +12 -22
  176. data/app/views/renalware/patients/_side_menu.html.slim +0 -1
  177. data/app/views/renalware/patients/clinical_summaries/_admissions.html.slim +11 -0
  178. data/app/views/renalware/patients/clinical_summaries/show.html.slim +7 -0
  179. data/app/views/renalware/patients/primary_care_physicians/_form.html.slim +1 -3
  180. data/app/views/renalware/patients/primary_care_physicians/_primary_care_physician.html.slim +1 -3
  181. data/app/views/renalware/patients/primary_care_physicians/index.html.slim +0 -1
  182. data/app/views/renalware/patients/side_menu/_actions.html.slim +1 -1
  183. data/app/views/renalware/patients/side_menu/_general.html.slim +3 -0
  184. data/app/views/renalware/patients/side_menu/_modalities.html.slim +4 -0
  185. data/app/views/renalware/pd/_pet_adequacies.html.slim +1 -1
  186. data/app/views/renalware/pd/dashboards/show/_page_actions.html.slim +3 -1
  187. data/app/views/renalware/pd/exit_site_infections/_details.html.slim +6 -1
  188. data/app/views/renalware/pd/exit_site_infections/_fields.html.slim +7 -0
  189. data/app/views/renalware/pd/exit_site_infections/_form.html.slim +6 -7
  190. data/app/views/renalware/pd/regime_bags/_regime_bag.html.slim +1 -1
  191. data/app/views/renalware/pd/regime_bags/_regime_bags.html.slim +1 -1
  192. data/app/views/renalware/pd/regimes/_current_regime.html.slim +6 -1
  193. data/app/views/renalware/pd/regimes/_glucose.html.slim +1 -3
  194. data/app/views/renalware/renal/profiles/_form.html.slim +0 -21
  195. data/app/views/renalware/renal/profiles/show.html.slim +0 -5
  196. data/app/views/renalware/research/study_participants/_form.html.slim +2 -2
  197. data/app/views/renalware/shared/_attributes_list.html.slim +4 -4
  198. data/app/views/renalware/snippets/snippets/_table.html.slim +10 -5
  199. data/app/views/renalware/transplants/donations/_form.html.slim +6 -6
  200. data/app/views/renalware/transplants/live_donors/_filters.html.slim +5 -5
  201. data/app/views/renalware/transplants/recipient_dashboards/_page_actions.html.slim +5 -1
  202. data/config/cucumber.yml +2 -2
  203. data/config/initializers/client_side_validations.rb +8 -10
  204. data/config/initializers/devise_security_extension.rb +1 -1
  205. data/config/initializers/inflections.rb +6 -1
  206. data/config/initializers/renalware.rb +6 -6
  207. data/config/locales/renalware/admissions/admissions.yml +37 -0
  208. data/config/locales/renalware/clinics/visit.yml +3 -0
  209. data/config/locales/renalware/feeds/file.en.yml +17 -0
  210. data/config/locales/renalware/low_clearance/dashboard.en.yml +11 -0
  211. data/config/locales/renalware/low_clearance/low_clearance.en.yml +14 -0
  212. data/config/locales/renalware/low_clearance/profile.en.yml +71 -0
  213. data/config/locales/renalware/messaging/internal/messages.en.yml +3 -2
  214. data/config/locales/renalware/patients/side_menu.en.yml +2 -0
  215. data/config/locales/renalware/pd/dashboard.en.yml +1 -0
  216. data/config/locales/renalware/pd/exit_site_infection.en.yml +10 -0
  217. data/config/locales/renalware/renal/profile.en.yml +0 -46
  218. data/config/locales/renalware/transplants/recipient_dashboards.en.yml +1 -0
  219. data/config/routes.rb +19 -9
  220. data/db/migrate/20170523125610_add_esi_fields.rb +9 -0
  221. data/db/migrate/20170615130714_add_deleted_at_to_practices.rb +7 -0
  222. data/db/migrate/20170615144802_add_name_to_patient_primary_care_physicians.rb +9 -0
  223. data/db/migrate/20170620121255_create_patient_practice_memberships.rb +24 -0
  224. data/db/migrate/20170621102157_add_unique_index_on_practice_code.rb +6 -0
  225. data/db/migrate/20170627110058_create_feed_file_types.rb +15 -0
  226. data/db/migrate/20170627110619_create_feed_files.rb +20 -0
  227. data/db/migrate/20171009181615_add_columns_to_drug_drugs.rb +8 -0
  228. data/db/migrate/20171127082158_add_region_to_addresses.rb +5 -0
  229. data/db/migrate/20171127092158_create_function_to_import_practices.rb +123 -0
  230. data/db/migrate/20171127092359_create_fn_to_insert_gps.rb +145 -0
  231. data/db/migrate/20171206140738_create_fn_to_load_practice_memberships_csv.rb +62 -0
  232. data/db/migrate/20171211131918_remove_email_from_primary_care_physicians.rb +7 -0
  233. data/db/migrate/20171219154529_create_admission_admissions.rb +28 -0
  234. data/db/migrate/20171222153815_add_unique_constraint_to_patient_practice_memberships.rb +8 -0
  235. data/db/migrate/20180102155055_update_patient_summaries_to_version_5.rb +5 -0
  236. data/db/migrate/20180105132358_add_emailed_at_to_letter_recipients.rb +6 -0
  237. data/db/migrate/20180108185400_remove_null_constraint_from_letters_pathology_snapshot.rb +5 -0
  238. data/db/migrate/20180112151706_create_low_clearance_profiles.rb +49 -0
  239. data/db/migrate/20180112151813_create_low_clearance_versions.rb +14 -0
  240. data/db/seeds/default/feeds/import_file_types.rb +35 -0
  241. data/db/seeds/default/feeds/seeds.rb +1 -0
  242. data/db/seeds/default/modalities/descriptions.rb +1 -2
  243. data/db/seeds/default/practices/nhs_practices_sample.csv +26 -26
  244. data/db/seeds/default/practices/practices.rb +1 -2
  245. data/db/seeds/default/practices/primary_care_physicians.rb +3 -4
  246. data/db/seeds/default/practices/primary_care_physicians_sample.csv +193 -193
  247. data/db/seeds/default/seeds.rb +1 -0
  248. data/db/views/patient_summaries_v05.sql +17 -0
  249. data/lib/dropdown_button_item.rb +1 -1
  250. data/lib/renalware/configuration.rb +19 -1
  251. data/lib/renalware/engine.rb +6 -2
  252. data/lib/renalware/version.rb +1 -1
  253. data/lib/tasks/feeds/files.rake +34 -0
  254. data/lib/xml_parser.rb +84 -0
  255. data/spec/factories/admissions/admissions.rb +11 -0
  256. data/spec/factories/clinics/clinic_visits.rb +2 -2
  257. data/spec/factories/feeds/file.rb +14 -0
  258. data/spec/factories/feeds/file_types.rb +17 -0
  259. data/spec/factories/low_clearance/modality_descriptions.rb +8 -0
  260. data/spec/factories/low_clearance/patients.rb +3 -0
  261. data/spec/factories/low_clearance/profiles.rb +3 -0
  262. data/spec/factories/modalities/modality_descriptions.rb +1 -1
  263. data/spec/factories/patients/practice_memberships.rb +7 -0
  264. data/spec/factories/patients/primary_care_physicians.rb +2 -4
  265. data/spec/factories/system/users.rb +1 -1
  266. data/spec/support/factory_bot.rb +1 -1
  267. data/spec/support/shared_examples/paranoia_examples.rb +14 -0
  268. metadata +172 -40
  269. data/app/controllers/renalware/renal/low_clearance/mdm_controller.rb +0 -15
  270. data/app/controllers/renalware/renal/low_clearance/mdm_patients_controller.rb +0 -29
  271. data/app/helpers/renalware/section_helper.rb +0 -10
  272. data/app/models/renalware/renal/low_clearance/mdm_patients_query.rb +0 -64
  273. data/app/models/renalware/renal/low_clearance/modality_description.rb +0 -13
  274. data/app/presenters/renalware/renal/low_clearance/mdm_presenter.rb +0 -14
  275. data/app/views/renalware/renal/low_clearance/mdm_patients/_filters.html.slim +0 -9
  276. data/app/views/renalware/transplants/registrations/_sections_nav.html.slim +0 -15
  277. data/config/initializers/application_controller_renderer.rb +0 -13
  278. data/config/initializers/assets.rb +0 -10
  279. data/config/initializers/renalware_core.rb +0 -15
  280. data/config/locales/renalware/renal/low_clearance.en.yml +0 -15
  281. data/spec/factories/renal/lcc_modality_description.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c3c267233dd81ec4b3886e524d833d785dc3a371
4
- data.tar.gz: cdcad7175c0fe8258a43f4dced4e0d3f159683bc
2
+ SHA256:
3
+ metadata.gz: 2adae7283349900967b688b6e5540a25f5f92bedfd851bc4c1ee4867d714cb9c
4
+ data.tar.gz: 1f294a120860167a97636ff519da463df2503391821c9ca8129dc60177796dcc
5
5
  SHA512:
6
- metadata.gz: f0ec0bdf814791b21874625beaa39075fdee412a80e615bb30c61b206ebcf90f79f7bae00a6c898c83b72af690be3d4a0f65b94fca139aba357fab10af1193c1
7
- data.tar.gz: a06f5d25faccc97b6374a910b9d3cd4ecf8c23a493bf329dc85e3ab8920cd0c203fbfecb251d60c3ac833b7dce6adb510a7fbf54db9403807c2eab14bbbc6abe
6
+ metadata.gz: df23ef342eff7ef9344655965caae92a6bb1350936ffef3dacbf4f5889db2a2cfeb7453349383d6f58c3d0f9df8c0a4397cbf9cd0d1d9e8413c3581a051dcdc7
7
+ data.tar.gz: 7b618ddc3af4f1b0359001feaad0c3ae535b49dd1f5072a967e920f267038e6fdc6e7bd879cdf234c05d3a41183c6fd1d1ee3f4bc41aef163c5d95f9e2ae18e1
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2016 Airslie Ltd
1
+ Copyright (c) 2017 Airslie Ltd
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -215,3 +215,4 @@ docker build -t renalware .
215
215
  docker-compose run web rake db:create
216
216
  docker-compose run web rake app:db:create
217
217
  ```
218
+
@@ -18,7 +18,9 @@ $(document).ready(function() {
18
18
  if(window.location.pathname != login_path) {
19
19
  $.getScript("<%= Renalware::Engine.routes.url_helpers.session_timed_out_path %>")
20
20
  .fail(function(jqxhr, settings, exception) {
21
- console.log("Failed to query for session timeout");
21
+ <% unless Rails.env.test? %>
22
+ console.log("Failed to query for session timeout");
23
+ <% end %>
22
24
  });
23
25
  }
24
26
  };
@@ -53,6 +53,8 @@ $mid-grey: #999;
53
53
  $very-light-grey: #f5f5f5;
54
54
  $error-background: $off-white;
55
55
  $almost-white: rgb(252, 252, 252);
56
+ $light-yellow: #fff066;
57
+ $light-green: #00e658;
56
58
 
57
59
  // Drug type colours
58
60
  $drug-type-default-colour: none;
@@ -1,3 +1,24 @@
1
+ .admissions-table table {
2
+ td, th {
3
+ vertical-align: top;
4
+ }
5
+
6
+ th.subhead {
7
+ color: $black;
8
+ text-align: center;
9
+
10
+ &.admission {
11
+ background-color: $light-yellow;
12
+ text-shadow: lighten($light-yellow, 20) .05rem .05rem;
13
+ }
14
+
15
+ &.discharge {
16
+ background-color: $light-green;
17
+ text-shadow: lighten($light-green, 20) .05rem .05rem
18
+ }
19
+ }
20
+ }
21
+
1
22
  #admissions-request-modal {
2
23
  .admissions-request-patient {
3
24
  margin-bottom: 1rem;
@@ -38,28 +59,3 @@
38
59
  }
39
60
  }
40
61
 
41
- .admissions-consults-table {
42
- tbody tr td:last-child {
43
- padding-top: 0.3rem;
44
- padding-bottom: 0.3rem;
45
- padding-right: 0;
46
- }
47
-
48
- td {
49
- .button.dropdown {
50
- padding: .2rem 2.3rem .2rem .4rem;
51
- margin: 0;
52
- }
53
- .f-dropdown {
54
- margin-left: -110px;
55
-
56
- &.open::before,
57
- &.open::after {
58
- left: 160px;
59
- }
60
- }
61
- .button-group {
62
-
63
- }
64
- }
65
- }
@@ -0,0 +1,27 @@
1
+ .feeds-files {
2
+ td {
3
+ vertical-align: top;
4
+ }
5
+
6
+ .status span {
7
+ color: $white;
8
+ border-radius: 0.3rem;
9
+ padding: .2rem .5rem;
10
+ }
11
+
12
+ .waiting .status span {
13
+ background-color: $muted-dark-grey;
14
+ }
15
+
16
+ .processing .status span {
17
+ background-color: $nhs-warm-yellow;
18
+ }
19
+
20
+ .failure .status span {
21
+ background-color: $nhs-red;
22
+ }
23
+
24
+ .success .status span {
25
+ background-color: $nhs-green;
26
+ }
27
+ }
@@ -1,3 +1,7 @@
1
+ table.contacts tbody td{
2
+ vertical-align: top;
3
+ }
4
+
1
5
  .electronic-ccs {
2
6
  ul.actions {
3
7
  list-style: none;
@@ -118,7 +118,7 @@ ul.provider {
118
118
 
119
119
  .page-heading {
120
120
  float: left;
121
- margin: 1rem 0 1.5rem;
121
+ margin: 0.5rem 0 1rem;
122
122
  width: 100%;
123
123
 
124
124
  & > li {
@@ -299,16 +299,19 @@ ul.provider {
299
299
  clear: both;
300
300
  height: 2rem;
301
301
  padding: 0.4em 0.2em 0.5em 0.6em;
302
- background-color: $table-toggled-content-colour;
303
- border-bottom: dotted 1px $light-grey;
302
+ background-color: $nhs-orange;
303
+ color: $white;
304
304
 
305
305
  &:hover {
306
- background-color: lighten($table-toggled-content-colour, 5);
306
+ background-color: lighten($nhs-orange, 5);
307
+ }
308
+
309
+ td, td.actions a {
310
+ color: inherit;
307
311
  }
308
312
 
309
313
  td {
310
314
  border: 0;
311
- border-top: dotted 1px $light-grey;
312
315
  }
313
316
 
314
317
  .icon {
@@ -320,6 +323,10 @@ ul.provider {
320
323
  overflow: hidden;
321
324
  text-overflow: ellipsis;
322
325
  white-space: nowrap;
326
+
327
+ &:before {
328
+ content: "Alert: ";
329
+ }
323
330
  }
324
331
 
325
332
  .author {
@@ -330,26 +337,20 @@ ul.provider {
330
337
  .actions {
331
338
  width: 3rem;
332
339
  padding-right: 1rem;
333
-
334
- a {
335
- color: $dark-grey;
336
- }
337
340
  }
338
341
 
339
342
  &.urgent {
340
- background-color: $nhs-yellow;
343
+ background-color: $nhs-red;
341
344
 
342
345
  &:hover {
343
- background-color: lighten($nhs-yellow, 5);
346
+ background-color: lighten($nhs-red, 5);
344
347
  }
345
348
  }
346
349
 
347
- &.urgent {
348
- .icon {
349
- @extend .fa;
350
- @extend .fa-warning;
351
- display: table-cell;
352
- }
350
+ .icon {
351
+ @extend .fa;
352
+ @extend .fa-warning;
353
+ display: table-cell;
353
354
  }
354
355
  }
355
356
 
@@ -1,3 +1,11 @@
1
+ .current-regime {
2
+ h3 {
3
+ font-size: 1rem;
4
+ font-weight: bold;
5
+ margin: 0.5rem 0 0.2em;
6
+ }
7
+ }
8
+
1
9
  .regime-bags {
2
10
  dl {
3
11
  display: inline;
@@ -46,6 +46,9 @@
46
46
  dt {
47
47
  width: $dl-horizontal-dt-width + 5.5rem;
48
48
  }
49
+ dd {
50
+ margin-left: $dl-horizontal-dt-width + 6.5rem;
51
+ }
49
52
  }
50
53
 
51
54
  &.xxlarge {
@@ -3,10 +3,16 @@
3
3
  border-bottom: solid 1px $winter-sky;
4
4
  margin-bottom: 10px;
5
5
 
6
- h1, h2 {
6
+ h1, h2, h3 {
7
7
  margin: 0 0 0.5rem 0;
8
8
  font-size: 1.3rem;
9
9
  color: $dark-grey;
10
+ display: inline-block;
11
+ }
12
+
13
+ h3 {
14
+ font-weight: normal;
15
+ color: $dashboard-muted-color;
10
16
  }
11
17
 
12
18
  .reveal-modal-close {
@@ -65,7 +65,7 @@ dd.patient-name {
65
65
  .patient-side-nav {
66
66
  background-color: $patient-menu-background-colour;
67
67
  padding: 0.6rem 0;
68
- padding-bottom: 8rem;
68
+ padding-bottom: 11rem;
69
69
  position: absolute;
70
70
  width: $patient-side-nav-width;
71
71
  overflow-y: auto;
@@ -87,7 +87,7 @@ dd.patient-name {
87
87
 
88
88
  a {
89
89
  border-radius: 3px;
90
- padding: 0.2rem 0.5rem;
90
+ padding: 0.1rem 0.5rem;
91
91
  text-decoration: underline;
92
92
  color: $nhs-blue;
93
93
  }
@@ -1,4 +1,24 @@
1
1
 
2
+ table td.actions-dropdown {
3
+ padding-top: 0.3rem;
4
+ padding-bottom: 0.3rem;
5
+ padding-right: 0;
6
+
7
+ .button.dropdown {
8
+ padding: .2rem 2.3rem .2rem .4rem;
9
+ margin: 0;
10
+ }
11
+
12
+ .f-dropdown {
13
+ margin-left: -110px;
14
+
15
+ &.open::before,
16
+ &.open::after {
17
+ left: 160px;
18
+ }
19
+ }
20
+ }
21
+
2
22
  table {
3
23
  // This will have to be removed at some point to comply with NHS table guidelines
4
24
  width: 100%;
@@ -61,3 +61,7 @@ span.note {
61
61
  padding: 0;
62
62
  font-size: 1rem;
63
63
  }
64
+
65
+ .muted {
66
+ color: $dashboard-muted-color;
67
+ }
@@ -0,0 +1,49 @@
1
+ require "fileutils"
2
+
3
+ module Renalware
4
+ module Admin
5
+ module Feeds
6
+ class FilesController < BaseController
7
+ include Renalware::Concerns::Pageable
8
+
9
+ def index
10
+ authorize files
11
+ render locals: {
12
+ files: files,
13
+ uploaded_file: Renalware::Feeds::Files::FileUploadForm.new
14
+ }
15
+ end
16
+
17
+ def create
18
+ authorize Renalware::Feeds::File, :create?
19
+ form = Renalware::Feeds::Files::FileUploadForm.new(file_upload_params)
20
+
21
+ if form.valid?
22
+ file = Renalware::Feeds::Files::CreateFeedFile.call(
23
+ uploaded_file: Pathname.new(form.file.path),
24
+ file_type: Renalware::Feeds::FileType.find(form.file_type_id),
25
+ user: current_user
26
+ )
27
+ Renalware::Feeds::Files::EnqueueFileForBackgroundProcessing.call(file)
28
+ redirect_to(
29
+ admin_feeds_files_path,
30
+ notice: "File #{form.file.original_filename} queued for processing"
31
+ )
32
+ else
33
+ render :index, locals: { files: files, uploaded_file: form }
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def files
40
+ @files ||= Renalware::Feeds::File.ordered.page(page).per(per_page)
41
+ end
42
+
43
+ def file_upload_params
44
+ params.require(:file_upload).permit(:file, :file_type_id)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,101 @@
1
+ require "renalware/admissions"
2
+ require "collection_presenter"
3
+
4
+ module Renalware
5
+ module Admissions
6
+ class AdmissionsController < BaseController
7
+ include Renalware::Concerns::Pageable
8
+
9
+ def index
10
+ admissions = search_form.submit.page(page).per(per_page)
11
+ authorize admissions
12
+
13
+ render locals: {
14
+ admissions: CollectionPresenter.new(admissions, AdmissionPresenter),
15
+ form: search_form
16
+ }
17
+ end
18
+
19
+ def new
20
+ admission = Admission.new(admitted_on: Time.zone.today)
21
+ authorize admission
22
+ render_new(admission)
23
+ end
24
+
25
+ def create
26
+ admission = build_admission
27
+ authorize admission
28
+ if admission.save_by(current_user)
29
+ redirect_to admissions_admissions_path, notice: success_msg_for("admission")
30
+ else
31
+ render_new(admission)
32
+ end
33
+ end
34
+
35
+ def edit
36
+ render_edit(find_and_authorize_admission)
37
+ end
38
+
39
+ def update
40
+ admission = find_and_authorize_admission
41
+ if admission.update_by(current_user, admission_params)
42
+ redirect_to admissions_admissions_path, notice: success_msg_for("admission")
43
+ else
44
+ render_edit(admission)
45
+ end
46
+ end
47
+
48
+ def destroy
49
+ find_and_authorize_admission.destroy!
50
+ redirect_to admissions_admissions_path, notice: success_msg_for("admission")
51
+ end
52
+
53
+ private
54
+
55
+ def build_admission
56
+ patient = Patient.find_by(id: admission_params[:patient_id])
57
+ args = admission_params.merge(modality_at_admission: patient&.current_modality)
58
+ Admission.new(args)
59
+ end
60
+
61
+ def search_form
62
+ @search_form ||= begin
63
+ options = params.key?(:query) ? search_params : {}
64
+ AdmissionSearchForm.new(options)
65
+ end
66
+ end
67
+
68
+ def find_and_authorize_admission
69
+ Admission.find(params[:id]).tap do |admission|
70
+ authorize admission
71
+ end
72
+ end
73
+
74
+ def render_new(admission)
75
+ render :new, locals: { admission: admission }
76
+ end
77
+
78
+ def render_edit(admission)
79
+ render :edit, locals: { admission: admission }
80
+ end
81
+
82
+ def search_params
83
+ params
84
+ .require(:query) {}
85
+ .permit(:hospital_unit_id, :hospital_ward_id, :status, :term)
86
+ end
87
+
88
+ def admission_params
89
+ params
90
+ .require(:admissions_admission)
91
+ .permit(
92
+ :hospital_ward_id, :patient_id, :q,
93
+ :admitted_on, :admission_type, :consultant, :modality,
94
+ :reason_for_admission, :notes, :transferred_on, :transferred_to,
95
+ :discharged_on, :discharge_destination, :destination_notes,
96
+ :discharge_summary, :summarised_on, :summarised_by_id, :modality_at_admission
97
+ )
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,20 @@
1
+ require "renalware/admissions"
2
+ require "collection_presenter"
3
+
4
+ module Renalware
5
+ module Admissions
6
+ class PatientAdmissionsController < BaseController
7
+ include Renalware::Concerns::Pageable
8
+
9
+ def index
10
+ admissions = Admission
11
+ .where(patient_id: patient.id).page(page).per(per_page)
12
+ .order(admitted_on: :desc)
13
+ authorize admissions
14
+ render locals: {
15
+ admissions: CollectionPresenter.new(admissions, AdmissionPresenter)
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -19,6 +19,35 @@ module Renalware
19
19
  max_duration_has_passed ? dashboard_path : super
20
20
  end
21
21
 
22
+ # Important note: Since Devise 4.4.0 the gem's SessionsController#create will do an implicit
23
+ # check to see if the resource (User signing-in) is valid (or rather, I think it checks for the
24
+ # presence of anything in resource.errors). If the user is not valid it now
25
+ # skips the redirect to the path specified in .after_sign_in_path_for.
26
+ # The result for us was that the user _could_ log on, but they stayed on the login screen
27
+ # (the appearance of the menu indicated they were in fact logged in). The redirect was not
28
+ # happening because the user was invalid (ie there were validation errors and
29
+ # user.valid? == false).
30
+ # The reason for the validation errors is that we have some conditional validation in User;
31
+ # for instance only validate #signature during an update, not on
32
+ # a create - after all #signature is something they set up later in their 'profile'.
33
+ # So what we have to do here is stop Devise from thinking the user in invalid by skipping
34
+ # validations.
35
+ # See https://github.com/plataformatec/devise/issues/4742#issuecomment-355154023
36
+ # Note that ideally we should move signature, professional position etc to a Profile model
37
+ # and then we could remove the conditional validation.
38
+ def create
39
+ super do |resource|
40
+ # This first line clears any existing errors that prevent Devise redirecting on successful
41
+ # login. It does not negate any password validations however. Its just a workaround to get
42
+ # the redirect to work.
43
+ resource.errors.clear
44
+ # This second line means resource.valid? returns true ie conditional on: :update validations
45
+ # are skipped. This line is not necessary (clearing the error above actually solves the
46
+ # problem) but does no harm and is belt and braces.
47
+ resource.skip_validation = true
48
+ end
49
+ end
50
+
22
51
  private
23
52
 
24
53
  def last_sign_in_at
@@ -8,7 +8,15 @@ module Renalware
8
8
  def create
9
9
  letter = @patient.letters.pending_review.find(params[:letter_id])
10
10
 
11
- ApproveLetter.build(letter).call(by: current_user)
11
+ # See config.broadcast_subscription_map for ApproveLetter event subscribers
12
+ # We use an event subscription pattern to drive the delivery of letters at this point
13
+ # rather than hard-wiring in a call to DeliverLetter.call etc. This is because letter
14
+ # delivery is hospital-specific, and each might want to plumb in different or many classes
15
+ # to handle different aspects of letter processing - not just delivery but also EPR etc.
16
+ ApproveLetter
17
+ .build(letter)
18
+ .broadcasting_to_configured_subscribers
19
+ .call(by: current_user)
12
20
 
13
21
  redirect_to patient_clinical_summary_path(@patient), notice: t(".success")
14
22
  end
@@ -23,8 +23,31 @@ module Renalware
23
23
  end
24
24
  end
25
25
 
26
+ def edit
27
+ contact = patient.contacts.find(params[:id])
28
+ render_edit(contact)
29
+ end
30
+
31
+ def update
32
+ contact = patient.contacts.find(params[:id])
33
+ if contact.update(update_contact_params)
34
+ flash.now[:notice] = success_msg_for("contact")
35
+ render locals: { patient: patient, contact: ContactPresenter.new(contact) }
36
+ else
37
+ render_edit(contact)
38
+ end
39
+ end
40
+
26
41
  private
27
42
 
43
+ def render_edit(contact)
44
+ render :edit, locals: {
45
+ patient: patient,
46
+ contact: contact,
47
+ contact_descriptions: find_contact_descriptions
48
+ }, layout: false
49
+ end
50
+
28
51
  def build_contact
29
52
  Contact.new.tap(&:build_person)
30
53
  end
@@ -55,6 +78,12 @@ module Renalware
55
78
  .tap { |p| try_merge_person_creator(p) }
56
79
  end
57
80
 
81
+ def update_contact_params
82
+ params
83
+ .require(:letters_contact)
84
+ .permit(:default_cc, :description_id, :other_description, :notes)
85
+ end
86
+
58
87
  def contact_attributes
59
88
  [
60
89
  :person_id, :default_cc, :description_id, :other_description,
@@ -0,0 +1,13 @@
1
+ require_dependency "renalware/low_clearance"
2
+
3
+ module Renalware
4
+ module LowClearance
5
+ class BaseController < Renalware::BaseController
6
+ protected
7
+
8
+ def patient
9
+ LowClearance.cast_patient(super)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ require_dependency "renalware/low_clearance"
2
+
3
+ module Renalware
4
+ module LowClearance
5
+ class DashboardsController < LowClearance::BaseController
6
+ def show
7
+ authorize patient
8
+ render :show, locals: {
9
+ patient: patient,
10
+ dashboard: dashboard_presenter
11
+ }
12
+ end
13
+
14
+ private
15
+
16
+ def dashboard_presenter
17
+ DashboardPresenter.new(user: current_user, patient: patient)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ require_dependency "renalware/renal"
2
+
3
+ module Renalware
4
+ module LowClearance
5
+ class MDMController < Renalware::MDMController
6
+ def show
7
+ authorize patient
8
+ presenter = LowClearance::MDMPresenter.new(patient: patient, view_context: view_context)
9
+ render_show(mdm_presenter: presenter)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ require_dependency "renalware/renal"
2
+
3
+ module Renalware
4
+ module LowClearance
5
+ class MDMPatientsController < Renalware::MDMPatientsController
6
+ def index
7
+ render_index(query: query,
8
+ page_title: t(".page_title"),
9
+ view_proc: ->(patient) { patient_low_clearance_mdm_path(patient) })
10
+ end
11
+
12
+ private
13
+
14
+ def query
15
+ LowClearance::MDMPatientsQuery.new(query: q, named_filter: named_filter)
16
+ end
17
+
18
+ def named_filter
19
+ params[:named_filter]
20
+ end
21
+
22
+ def q
23
+ params[:q]
24
+ end
25
+ end
26
+ end
27
+ end