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

Sign up to get free protection for your applications and to get access to all the features.
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