renalware-core 2.0.0.pre.beta7 → 2.0.0.pre.beta8

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 (204) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/renalware/searchables.js +3 -0
  3. data/app/assets/javascripts/renalware/select2-ajax-search.js +86 -0
  4. data/app/assets/javascripts/renalware/sortable.js +12 -1
  5. data/app/assets/stylesheets/renalware/base/_variables.scss +7 -1
  6. data/app/assets/stylesheets/renalware/modules/_admissions.scss +39 -0
  7. data/app/assets/stylesheets/renalware/modules/_letters.scss +12 -0
  8. data/app/assets/stylesheets/renalware/modules/_messaging.scss +0 -4
  9. data/app/assets/stylesheets/renalware/partials/_animations.scss +12 -0
  10. data/app/assets/stylesheets/renalware/partials/_modal_window.scss +44 -0
  11. data/app/assets/stylesheets/renalware/partials/_tables.scss +6 -0
  12. data/app/controllers/renalware/admissions/requests_controller.rb +100 -0
  13. data/app/controllers/renalware/devise/passwords_controller.rb +6 -0
  14. data/app/controllers/renalware/letters/electronic_receipts_controller.rb +81 -0
  15. data/app/controllers/renalware/letters/letters_controller.rb +18 -3
  16. data/app/controllers/renalware/messaging/internal/messages_controller.rb +75 -0
  17. data/app/controllers/renalware/messaging/internal/receipts_controller.rb +74 -0
  18. data/app/controllers/renalware/patients/patients_controller.rb +11 -1
  19. data/app/controllers/renalware/session_timeout_controller.rb +1 -1
  20. data/app/documents/renalware/hd/profile_document.rb +1 -1
  21. data/app/helpers/renalware/application_helper.rb +5 -0
  22. data/app/helpers/renalware/xhr_helper.rb +7 -0
  23. data/app/models/concerns/renalware/deviseable.rb +1 -1
  24. data/app/models/renalware/admissions.rb +7 -0
  25. data/app/models/renalware/admissions/request.rb +23 -0
  26. data/app/models/renalware/admissions/request_reason.rb +11 -0
  27. data/app/models/renalware/feeds/message_processor.rb +2 -2
  28. data/app/models/renalware/feeds/persist_message.rb +2 -0
  29. data/app/models/renalware/hd/sessions/auditable_session.rb +4 -0
  30. data/app/models/renalware/hd/sessions/auditable_session_collection.rb +5 -0
  31. data/app/models/renalware/hd/update_rolling_patient_statistics.rb +2 -2
  32. data/app/models/renalware/letters/electronic_receipt.rb +35 -0
  33. data/app/models/renalware/letters/electronic_recipient_options.rb +78 -0
  34. data/app/models/renalware/letters/letter.rb +4 -0
  35. data/app/models/renalware/letters/letter_factory.rb +21 -1
  36. data/app/models/renalware/messaging.rb +21 -5
  37. data/app/models/renalware/messaging/internal/author.rb +11 -0
  38. data/app/models/renalware/messaging/internal/message.rb +15 -0
  39. data/app/models/renalware/messaging/internal/message_factory.rb +20 -0
  40. data/app/models/renalware/messaging/internal/message_form.rb +36 -0
  41. data/app/models/renalware/messaging/internal/message_form_builder.rb +52 -0
  42. data/app/models/renalware/messaging/internal/receipt.rb +26 -0
  43. data/app/models/renalware/messaging/internal/recipient.rb +12 -0
  44. data/app/models/renalware/messaging/internal/recipient_options.rb +87 -0
  45. data/app/models/renalware/messaging/internal/send_message.rb +24 -0
  46. data/app/models/renalware/messaging/message.rb +4 -3
  47. data/app/models/renalware/pathology.rb +1 -1
  48. data/app/models/renalware/pathology/message_param_parser.rb +2 -0
  49. data/app/models/renalware/patients/search_filter.rb +32 -0
  50. data/app/models/renalware/patients/search_form.rb +17 -0
  51. data/app/models/renalware/patients/search_query.rb +20 -21
  52. data/app/models/renalware/patients/summary.rb +1 -1
  53. data/app/models/renalware/user.rb +18 -2
  54. data/app/policies/renalware/admissions/request_policy.rb +8 -0
  55. data/app/policies/renalware/letters/electronic_receipt_policy.rb +23 -0
  56. data/app/policies/renalware/messaging/{message_policy.rb → internal/message_policy.rb} +2 -3
  57. data/app/policies/renalware/messaging/internal/receipt_policy.rb +25 -0
  58. data/app/presenters/renalware/dashboard/dashboard_presenter.rb +9 -2
  59. data/app/presenters/renalware/hd/station_presenter.rb +0 -1
  60. data/app/presenters/renalware/letters/electronic_receipt_presenter.rb +15 -0
  61. data/app/presenters/renalware/letters/letter_presenter.rb +5 -0
  62. data/app/presenters/renalware/mdm_presenter.rb +2 -0
  63. data/app/presenters/renalware/messaging/internal/message_presenter.rb +21 -0
  64. data/app/presenters/renalware/messaging/internal/receipt_presenter.rb +13 -0
  65. data/app/presenters/renalware/pathology/observation_presenter.rb +4 -0
  66. data/app/presenters/renalware/ukrdc/patient_presenter.rb +5 -0
  67. data/app/views/renalware/admissions/requests/_create_request_link.html.slim +10 -0
  68. data/app/views/renalware/admissions/requests/_form.html.slim +31 -0
  69. data/app/views/renalware/admissions/requests/_modal_dialog_placeholder.html.slim +2 -0
  70. data/app/views/renalware/admissions/requests/_request.html.slim +34 -0
  71. data/app/views/renalware/admissions/requests/_table.html.slim +19 -0
  72. data/app/views/renalware/admissions/requests/create.js.erb +3 -0
  73. data/app/views/renalware/admissions/requests/destroy.js.erb +3 -0
  74. data/app/views/renalware/admissions/requests/edit.html.slim +4 -0
  75. data/app/views/renalware/admissions/requests/edit.js.erb +4 -0
  76. data/app/views/renalware/admissions/requests/index.html.slim +3 -0
  77. data/app/views/renalware/admissions/requests/new.html.slim +4 -0
  78. data/app/views/renalware/admissions/requests/new.js.erb +4 -0
  79. data/app/views/renalware/admissions/requests/update.js.erb +9 -0
  80. data/app/views/renalware/api/ukrdc/patients/_allergies.xml.builder +1 -1
  81. data/app/views/renalware/api/ukrdc/patients/_clinical_relationships.xml.builder +0 -1
  82. data/app/views/renalware/api/ukrdc/patients/_lab_orders.xml.builder +7 -2
  83. data/app/views/renalware/api/ukrdc/patients/_observations.xml.builder +1 -1
  84. data/app/views/renalware/api/ukrdc/patients/_patient.xml.builder +2 -0
  85. data/app/views/renalware/api/ukrdc/patients/_sending_facility.xml.builder +1 -1
  86. data/app/views/renalware/api/ukrdc/patients/lab_orders/_lab_order.xml.builder +46 -0
  87. data/app/views/renalware/api/ukrdc/patients/lab_orders/_result_item.xml.builder +14 -0
  88. data/app/views/renalware/clinical/allergies/_mini.html.slim +1 -0
  89. data/app/views/renalware/dashboard/dashboards/_content.html.slim +6 -2
  90. data/app/views/renalware/dashboard/letters/_letter.html.slim +7 -7
  91. data/app/views/renalware/dashboard/letters/_table.html.slim +2 -2
  92. data/app/views/renalware/devise/passwords/edit.html.erb +27 -0
  93. data/app/views/renalware/devise/passwords/new.html.erb +18 -0
  94. data/app/views/renalware/devise/registrations/new.html.slim +25 -0
  95. data/app/views/renalware/letters/electronic_receipts/_table.html.slim +45 -0
  96. data/app/views/renalware/letters/electronic_receipts/mark_as_read.js.erb +6 -0
  97. data/app/views/renalware/letters/electronic_receipts/read.html.slim +5 -0
  98. data/app/views/renalware/letters/electronic_receipts/sent.html.slim +40 -0
  99. data/app/views/renalware/letters/electronic_receipts/unread.html.slim +5 -0
  100. data/app/views/renalware/letters/formatted_letters/_letter.html.slim +12 -1
  101. data/app/views/renalware/letters/letters/_actions.html.slim +1 -1
  102. data/app/views/renalware/letters/letters/_electronic_ccs.html.slim +16 -0
  103. data/app/views/renalware/letters/letters/_form.html.slim +8 -3
  104. data/app/views/renalware/letters/letters/edit.html.slim +7 -1
  105. data/app/views/renalware/letters/letters/new.html.slim +6 -1
  106. data/app/views/renalware/letters/shared/_electronic_cc_type_tabs.html.slim +7 -0
  107. data/app/views/renalware/messaging/{messages → internal/messages}/_form.html.slim +2 -1
  108. data/app/views/renalware/messaging/{messages → internal/messages}/_modal_dialog_placeholder.html.slim +0 -0
  109. data/app/views/renalware/messaging/{messages → internal/messages}/_send_message_link.html.slim +1 -1
  110. data/app/views/renalware/messaging/{messages → internal/messages}/_send_reply_link.html.slim +3 -3
  111. data/app/views/renalware/messaging/{messages → internal/messages}/create.js.erb +0 -0
  112. data/app/views/renalware/messaging/{messages → internal/messages}/new.html.slim +0 -0
  113. data/app/views/renalware/messaging/{messages → internal/messages}/new.js.erb +0 -0
  114. data/app/views/renalware/messaging/{receipts → internal/receipts}/_receipt.html.slim +2 -2
  115. data/app/views/renalware/messaging/{messages/_message.html.slim → internal/receipts/_sent_receipt.html.slim} +2 -1
  116. data/app/views/renalware/messaging/internal/receipts/_sent_table.html.slim +12 -0
  117. data/app/views/renalware/messaging/{receipts → internal/receipts}/_table.html.slim +2 -2
  118. data/app/views/renalware/messaging/{receipts → internal/receipts}/mark_as_read.js.erb +0 -0
  119. data/app/views/renalware/messaging/{receipts → internal/receipts}/read.html.slim +2 -1
  120. data/app/views/renalware/messaging/internal/receipts/sent.html.slim +7 -0
  121. data/app/views/renalware/messaging/{receipts → internal/receipts}/unread.html.slim +2 -1
  122. data/app/views/renalware/messaging/shared/_messages_type_tabs.html.slim +3 -3
  123. data/app/views/renalware/navigation/_main.html.slim +1 -1
  124. data/app/views/renalware/navigation/_patients_admin.html.slim +2 -0
  125. data/app/views/renalware/navigation/_user.html.slim +2 -1
  126. data/app/views/renalware/patients/_search_form.html.slim +12 -0
  127. data/app/views/renalware/patients/side_menu/_actions.html.slim +6 -2
  128. data/app/views/renalware/renal/profiles/_form.html.slim +0 -1
  129. data/app/views/renalware/renal/profiles/_mini.html.slim +1 -0
  130. data/app/views/renalware/{snippets/snippets → shared}/_modal_close_link.html.slim +0 -0
  131. data/app/views/renalware/snippets/snippets/_list.html.slim +1 -1
  132. data/app/views/renalware/transplants/donations/_form.html.slim +17 -16
  133. data/config/initializers/simple_form_foundation.rb +0 -1
  134. data/config/locales/renalware/admissions/requests.en.yml +12 -0
  135. data/config/locales/renalware/letters/contact.en.yml +3 -0
  136. data/config/locales/renalware/messaging/internal/messages.en.yml +33 -0
  137. data/config/locales/renalware/patients/search_form.en.yml +5 -0
  138. data/config/locales/renalware/patients/side_menu.en.yml +1 -0
  139. data/config/routes.rb +32 -10
  140. data/db/migrate/20170908155011_add_shortfall_column_to_hd_patient_statistics.rb +7 -0
  141. data/db/migrate/20170908160250_update_hd_overall_audit_to_version4.rb +8 -0
  142. data/db/migrate/20170911133224_add_type_to_messaging_messages.rb +16 -0
  143. data/db/migrate/20170912092135_create_letters_electronic_receipts.rb +11 -0
  144. data/db/migrate/20170920113628_create_admissions_requests.rb +31 -0
  145. data/db/seeds/default/reporting/audits.yml +1 -0
  146. data/db/views/reporting_hd_overall_audit_v04.sql +13 -0
  147. data/lib/renalware/version.rb +1 -1
  148. data/lib/subscription_registry.rb +1 -1
  149. data/spec/factories/accesses/plans.rb +2 -3
  150. data/spec/factories/accesses/profiles.rb +1 -2
  151. data/spec/factories/admissions/request_reasons.rb +8 -0
  152. data/spec/factories/admissions/requests.rb +9 -0
  153. data/spec/factories/clinical/body_compositions.rb +2 -5
  154. data/spec/factories/clinical/dry_weights.rb +2 -3
  155. data/spec/factories/clinics/clinic_visits.rb +2 -3
  156. data/spec/factories/directory/people.rb +1 -2
  157. data/spec/factories/events/events.rb +1 -2
  158. data/spec/factories/hd/preference_sets.rb +1 -2
  159. data/spec/factories/hd/profiles.rb +2 -3
  160. data/spec/factories/hd/sessions.rb +4 -3
  161. data/spec/factories/letters/electronic_receipts.rb +6 -0
  162. data/spec/factories/letters/letters.rb +3 -3
  163. data/spec/factories/medications/prescription.rb +1 -2
  164. data/spec/factories/medications/prescription_terminations.rb +1 -2
  165. data/spec/factories/messaging/internal/authors.rb +5 -0
  166. data/spec/factories/messaging/{message.rb → internal/messages.rb} +1 -1
  167. data/spec/factories/messaging/internal/receipts.rb +7 -0
  168. data/spec/factories/messaging/internal/recipients.rb +5 -0
  169. data/spec/factories/modalities/modalities.rb +1 -3
  170. data/spec/factories/pathology/requests/request.rb +1 -3
  171. data/spec/factories/patients/alerts.rb +1 -2
  172. data/spec/factories/patients/patients.rb +5 -3
  173. data/spec/factories/pd/assessments.rb +1 -2
  174. data/spec/factories/pd/fluid_descriptions.rb +0 -1
  175. data/spec/factories/pd/training_sessions.rb +1 -2
  176. data/spec/factories/problems/problems.rb +1 -2
  177. data/spec/factories/shared/accountable.rb +35 -0
  178. data/spec/factories/system/roles.rb +2 -4
  179. data/spec/factories/system/users.rb +30 -15
  180. data/spec/factories/transplants/donor_stage.rb +1 -2
  181. data/spec/factories/transplants/registration_statuses.rb +2 -4
  182. data/spec/support/login_macros.rb +1 -1
  183. metadata +108 -40
  184. data/app/controllers/renalware/messaging/messages_controller.rb +0 -73
  185. data/app/controllers/renalware/messaging/receipts_controller.rb +0 -55
  186. data/app/controllers/renalware/messaging/sent_messages_controller.rb +0 -22
  187. data/app/models/renalware/messaging/author.rb +0 -9
  188. data/app/models/renalware/messaging/message_factory.rb +0 -18
  189. data/app/models/renalware/messaging/message_form.rb +0 -34
  190. data/app/models/renalware/messaging/message_form_builder.rb +0 -50
  191. data/app/models/renalware/messaging/receipt.rb +0 -19
  192. data/app/models/renalware/messaging/recipient.rb +0 -10
  193. data/app/models/renalware/messaging/recipient_options.rb +0 -85
  194. data/app/models/renalware/messaging/send_message.rb +0 -22
  195. data/app/policies/renalware/messaging/receipt_policy.rb +0 -19
  196. data/app/presenters/renalware/messaging/internal_message_presenter.rb +0 -19
  197. data/app/presenters/renalware/messaging/receipt_presenter.rb +0 -11
  198. data/app/views/renalware/devise/registrations/new.html.erb +0 -46
  199. data/app/views/renalware/messaging/messages/_table.html.slim +0 -13
  200. data/app/views/renalware/messaging/messages/sent.html.slim +0 -4
  201. data/config/locales/renalware/messaging/messages.en.yml +0 -29
  202. data/spec/factories/messaging/authors.rb +0 -5
  203. data/spec/factories/messaging/receipt.rb +0 -7
  204. data/spec/factories/messaging/recipients.rb +0 -5
@@ -0,0 +1,17 @@
1
+ require_dependency "renalware/patients"
2
+
3
+ # A form object for use behind a form (see to_partial_path) which can add a patient filter
4
+ # to a page. See Letters/ElectronicReceiptsController for an example.
5
+ # Works in concert with Patients::SearchQuery.
6
+ module Renalware
7
+ module Patients
8
+ class SearchForm
9
+ include ActiveModel::Model
10
+ attr_accessor :term, :url
11
+
12
+ def to_partial_path
13
+ "renalware/patients/search_form"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,37 +1,36 @@
1
+ # A generic patient search that returns an AR relation that can used directly or merged into other
2
+ # queries if required in order to use the extensive patient search criteria added by the
3
+ # `identity_match` ransacker. See also a corresponding Patients::SearchForm form object and its
4
+ # partial.
5
+ #
6
+ # Example usage to find letters relating to any patient with rabbit in their surname:
7
+ # Letter
8
+ # .joins(:patients)
9
+ # .merge(
10
+ # Patients::SearchQuery.new(term: "rabbit").call
11
+ # )
12
+ #
1
13
  module Renalware
2
14
  module Patients
3
15
  class SearchQuery
4
- attr_reader :term, :page, :per_page
16
+ attr_reader :term
5
17
 
6
- def initialize(term:, page: 1, per_page: 20)
18
+ def initialize(term:)
7
19
  @term = term
8
- @page = page
9
- @per_page = per_page
10
20
  end
11
21
 
12
22
  def call
13
- search
14
- .result.page(page).per(per_page)
15
- .select(fields)
16
- .map do |patient|
17
- {
18
- id: patient.id,
19
- label: patient.to_s(:long)
20
- }
21
- end
23
+ search.result
22
24
  end
23
25
 
24
- private
25
-
26
26
  def search
27
- @search ||= Patient.search(family_name_cont: term).tap do |srch|
28
- srch.sorts = %w(family_name given_name)
27
+ @search ||= begin
28
+ Patient
29
+ .search(identity_match: term).tap do |search|
30
+ search.sorts = %w(family_name given_name)
31
+ end
29
32
  end
30
33
  end
31
-
32
- def fields
33
- %i(id family_name given_name nhs_number)
34
- end
35
34
  end
36
35
  end
37
36
  end
@@ -1,7 +1,7 @@
1
1
  require_dependency "renalware"
2
2
 
3
3
  ##
4
- # Backed by a SQL view, the patient summary is principally a set of counts fo various entities
4
+ # Backed by a SQL view, the patient summary is principally a set of counts for various entities
5
5
  # which hang off a patient, for example prescriptions_count, problems_count etc.
6
6
  # These can be used for instance when building the patient navigation.
7
7
  #
@@ -9,8 +9,12 @@ module Renalware
9
9
  validates_presence_of :given_name
10
10
  validates_presence_of :family_name
11
11
  validate :approval_with_roles, on: :update
12
- validates_presence_of :professional_position, on: :update, unless: :super_admin_update
13
- validates_presence_of :signature, on: :update, unless: :super_admin_update
12
+ validates_presence_of :professional_position,
13
+ on: :update,
14
+ unless: :skip_validation
15
+ validates_presence_of :signature,
16
+ on: :update,
17
+ unless: :skip_validation
14
18
 
15
19
  scope :unapproved, -> { where(approved: [nil, false]) }
16
20
  scope :inactive, lambda {
@@ -22,6 +26,10 @@ module Renalware
22
26
  # Non-persistent attribute to signify an update by an admin (bypassing some validations)
23
27
  attr_accessor :super_admin_update
24
28
 
29
+ def skip_validation
30
+ super_admin_update || reset_password_token
31
+ end
32
+
25
33
  def self.policy_class
26
34
  UserPolicy
27
35
  end
@@ -38,6 +46,14 @@ module Renalware
38
46
  @role_names ||= roles.pluck(:name)
39
47
  end
40
48
 
49
+ # Official name for use when displaying e.g. on a letter. For example:
50
+ # Dr Isaac Newton (Consultant Gravitationalist)
51
+ def professional_signature
52
+ signed = signature || full_name
53
+ signed += " (#{professional_position})" if professional_position?
54
+ signed
55
+ end
56
+
41
57
  private
42
58
 
43
59
  def approval_with_roles
@@ -0,0 +1,8 @@
1
+ require_dependency "renalware/admissions"
2
+
3
+ module Renalware
4
+ module Admissions
5
+ class RequestPolicy < BasePolicy
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ require_dependency "renalware/letters/letter_policy"
2
+
3
+ module Renalware
4
+ module Letters
5
+ class ElectronicReceiptPolicy < BasePolicy
6
+ def mark_as_read?
7
+ !record.read? && record.letter.approved?
8
+ end
9
+
10
+ def unread?
11
+ index?
12
+ end
13
+
14
+ def read?
15
+ index?
16
+ end
17
+
18
+ def sent?
19
+ index?
20
+ end
21
+ end
22
+ end
23
+ end
@@ -2,9 +2,8 @@ require_dependency "renalware/messaging"
2
2
 
3
3
  module Renalware
4
4
  module Messaging
5
- class MessagePolicy < BasePolicy
6
- def sent?
7
- index?
5
+ module Internal
6
+ class MessagePolicy < BasePolicy
8
7
  end
9
8
  end
10
9
  end
@@ -0,0 +1,25 @@
1
+ require_dependency "renalware/messaging"
2
+
3
+ module Renalware
4
+ module Messaging
5
+ module Internal
6
+ class ReceiptPolicy < BasePolicy
7
+ def mark_as_read?
8
+ update?
9
+ end
10
+
11
+ def unread?
12
+ index?
13
+ end
14
+
15
+ def read?
16
+ index?
17
+ end
18
+
19
+ def sent?
20
+ index?
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -33,8 +33,15 @@ module Renalware
33
33
 
34
34
  def unread_messages_receipts
35
35
  @unread_messages_receipts ||= begin
36
- receipts = Messaging.cast_recipient(user).receipts.unread
37
- CollectionPresenter.new(receipts, Messaging::ReceiptPresenter)
36
+ receipts = Messaging::Internal.cast_recipient(user).receipts.unread
37
+ CollectionPresenter.new(receipts, Messaging::Internal::ReceiptPresenter)
38
+ end
39
+ end
40
+
41
+ def unread_electronic_ccs
42
+ @unread_electronic_ccs ||= begin
43
+ receipts = Letters::ElectronicReceipt.unread.for_recipient(user.id).ordered
44
+ CollectionPresenter.new(receipts, Letters::ElectronicReceiptPresenter)
38
45
  end
39
46
  end
40
47
 
@@ -7,4 +7,3 @@ module Renalware
7
7
  end
8
8
  end
9
9
  end
10
-
@@ -0,0 +1,15 @@
1
+ require_dependency "renalware/letters"
2
+
3
+ module Renalware
4
+ module Letters
5
+ class ElectronicReceiptPresenter < DumbDelegator
6
+ def html_identifier
7
+ "electronic-receipt-#{id}"
8
+ end
9
+
10
+ def html_preview_identifier
11
+ "electronic-receipt-preview-#{id}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -28,6 +28,11 @@ module Renalware
28
28
  end
29
29
  end
30
30
 
31
+ def electronic_cc_receipts
32
+ @electronic_cc_receipts ||=
33
+ CollectionPresenter.new(super, Letters::ElectonicReceiptPresenter)
34
+ end
35
+
31
36
  def description
32
37
  "(#{letterhead.site_code}) #{super}"
33
38
  end
@@ -55,6 +55,7 @@ module Renalware
55
55
  # to sorting by drug name
56
56
  def current_prescriptions
57
57
  @current_prescriptions ||= begin
58
+ # TODO: maybe use #sort_by(:prescribed_on) here
58
59
  execute_prescriptions_query(patient.prescriptions.current)
59
60
  .sort{ |presc1, presc2| presc2.prescribed_on <=> presc1.prescribed_on }
60
61
  end
@@ -81,6 +82,7 @@ module Renalware
81
82
  # to sorting by drug name
82
83
  def esa_prescriptions
83
84
  @esa_prescriptions ||= begin
85
+ # TODO: maybe use #sort_by(:prescribed_on) here
84
86
  execute_prescriptions_query(
85
87
  patient.prescriptions.having_drug_of_type("esa")
86
88
  ).sort{ |presc1, presc2| presc2.prescribed_on <=> presc1.prescribed_on }
@@ -0,0 +1,21 @@
1
+ require_dependency "renalware/messaging"
2
+
3
+ module Renalware
4
+ module Messaging
5
+ module Internal
6
+ class MessagePresenter < SimpleDelegator
7
+ def age_in_days
8
+ (Time.zone.now.to_date - sent_at.to_date).to_i
9
+ end
10
+
11
+ def html_identifier
12
+ "message-#{id}"
13
+ end
14
+
15
+ def html_preview_identifier
16
+ "message-preview-#{id}"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ require_dependency "renalware/messaging"
2
+
3
+ module Renalware
4
+ module Messaging
5
+ module Internal
6
+ class ReceiptPresenter < SimpleDelegator
7
+ def message
8
+ @message ||= Renalware::Messaging::Internal::MessagePresenter.new(super)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -3,6 +3,10 @@ require_dependency "renalware/pathology"
3
3
  module Renalware
4
4
  module Pathology
5
5
  class ObservationPresenter < SimpleDelegator
6
+ delegate :name, to: :description, prefix: true, allow_nil: true
7
+ delegate :measurement_unit, to: :description
8
+ delegate :name, to: :measurement_unit, prefix: true
9
+
6
10
  def html_class
7
11
  description.to_s.downcase
8
12
  end
@@ -5,6 +5,7 @@ module Renalware
5
5
  class PatientPresenter < SimpleDelegator
6
6
  delegate :allergies, to: :clinical_patient
7
7
  delegate :clinic_visits, to: :clinics_patient
8
+ delegate :observation_requests, to: :pathology_patient
8
9
 
9
10
  def smoking_history
10
11
  @smoking_history ||= document.history&.smoking&.upcase
@@ -34,6 +35,10 @@ module Renalware
34
35
  def letters_patient
35
36
  @letters_patient ||= Renalware::Letters.cast_patient(__getobj__)
36
37
  end
38
+
39
+ def pathology_patient
40
+ @pathology_patient ||= Renalware::Pathology.cast_patient(__getobj__)
41
+ end
37
42
  end
38
43
  end
39
44
  end
@@ -0,0 +1,10 @@
1
+ / This partial is pulled in when the whole page renders, and creates the link and
2
+ / associated modal dialog wiring for creating an admission request (TCI).
3
+ - url = new_admissions_request_path(patient_id: patient, format: :html)
4
+
5
+ / Link to launch the modal dialog
6
+ =link_to(url,
7
+ id: "create-admissions-request",
8
+ data: { "reveal-id" => "admissions-request-modal", "reveal-ajax" => "true" }) do
9
+ i.fa.fa-link-annotation.fa-hand-o-right
10
+ = link_text
@@ -0,0 +1,31 @@
1
+ .modal
2
+ .modal__header
3
+ h2= "#{controller.action_name.capitalize} Request Admission (TCI)"
4
+ = render "renalware/shared/modal_close_link"
5
+
6
+ .modal__body
7
+ = render "renalware/shared/errors", model: request
8
+
9
+ = simple_form_for(request,
10
+ remote: true,
11
+ wrapper: :horizontal_form) do |f|
12
+
13
+ .row.admissions-request-patient
14
+ .small-12.medium-4.large-3.columns
15
+ label.right.inline Patient
16
+ .small-12.medium-8.large-9.columns
17
+ strong= request.patient.to_s(:long)
18
+
19
+ = f.input :patient_id, as: :hidden
20
+ = f.input :reason_id, collection: reasons, wrapper: :horizontal_medium
21
+ = f.input :priority, wrapper: :horizontal_small
22
+ = f.input :hospital_unit_id, collection: hospital_units, wrapper: :horizontal_medium
23
+ = f.input :notes, as: :text, wrapper: :horizontal_large, input_html: { rows: 5 }
24
+ = f.submit class: :button
25
+ span= " or "
26
+ =link_to "Cancel",
27
+ "#",
28
+ "aria-label" => "Close",
29
+ class: "reveal-modal-close"
30
+
31
+ .modal__footer
@@ -0,0 +1,2 @@
1
+ / The modal dialog container for internal message sending
2
+ #admissions-request-modal.reveal-modal.medium(data-reveal)
@@ -0,0 +1,34 @@
1
+ - patient = request.patient
2
+ - unit = Renalware::Hospitals::Unit.find_by(id: request.hospital_unit_id)
3
+ - editing_history = "Created #{l(request.created_at)} by #{request.created_by}\n"\
4
+ "Updated #{l(request.updated_at)} by #{request.updated_by}"
5
+ = content_tag_for(:tr,
6
+ request,
7
+ class: "sortable priority-#{request.priority}") do
8
+ td(class="sortable-position-for-model-id-#{request.id}")= request.position
9
+ td.priority
10
+ span= request.priority.text
11
+ td= request.reason.description
12
+ td= default_patient_link(patient)
13
+ td= patient.nhs_number
14
+ td= patient.hospital_identifiers
15
+ td= unit&.name
16
+ td.col-width-medium-with-ellipsis(title=request.notes)
17
+ = request.notes
18
+ td(title=editing_history)= l(request.created_at)
19
+ td
20
+ = link_to admissions_request_path(request),
21
+ remote: true,
22
+ method: :delete,
23
+ class: "remove",
24
+ data: { confirm: "Are you sure you want to remove this item?" } do
25
+ i.fa.fa-trash.fa-link-annotation
26
+ | &nbsp;|&nbsp;&nbsp;
27
+ = link_to "Edit",
28
+ edit_admissions_request_path(request, format: :html),
29
+ remote: true,
30
+ method: :get,
31
+ data: { "reveal-id" => "admissions-request-modal", "reveal-ajax" => "true" }
32
+ td.handle
33
+ i.fa.fa-reorder
34
+
@@ -0,0 +1,19 @@
1
+ table.admissions_requests
2
+ thead
3
+ th Rank
4
+ th Priority
5
+ th Reason
6
+ th Patient
7
+ th.col-width-nhs-no NHS Number
8
+ th Hospital Nos.
9
+ th Location
10
+ th Notes
11
+ th.col-width-date-time Created
12
+ th.col-width-small
13
+ th
14
+ = content_tag(:tbody,
15
+ class: "sortables",
16
+ data: { rel: sort_admissions_requests_path }) do
17
+ = render requests
18
+
19
+ = render "modal_dialog_placeholder"