renalware-core 2.0.41 → 2.0.42

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/renalware/aki_alerts.js +27 -0
  3. data/app/assets/javascripts/renalware/application.js.erb +1 -1
  4. data/app/assets/javascripts/renalware/behaviours.js +5 -0
  5. data/app/assets/stylesheets/renalware/modules/_hd.scss +9 -0
  6. data/app/assets/stylesheets/renalware/partials/_button.scss +4 -0
  7. data/app/assets/stylesheets/renalware/partials/_tables.scss +6 -0
  8. data/app/controllers/renalware/events/events_controller.rb +3 -15
  9. data/app/controllers/renalware/hd/transmission_logs_controller.rb +32 -0
  10. data/app/controllers/renalware/renal/aki_alerts_controller.rb +2 -2
  11. data/app/controllers/renalware/research/study_participants_controller.rb +5 -0
  12. data/app/documents/renalware/hd/session_document.rb +13 -0
  13. data/app/jobs/feed_job.rb +4 -1
  14. data/app/models/concerns/renalware/patients_ransack_helper.rb +4 -0
  15. data/app/models/renalware/events/event_query.rb +0 -1
  16. data/app/models/renalware/feeds/message_processor.rb +30 -6
  17. data/app/models/renalware/feeds/persist_message.rb +7 -6
  18. data/app/models/renalware/hd/provider.rb +12 -0
  19. data/app/models/renalware/hd/provider_unit.rb +15 -0
  20. data/app/models/renalware/hd/transmission_log.rb +26 -0
  21. data/app/models/renalware/letters/letter/pending_review.rb +8 -1
  22. data/app/models/renalware/medications/prescriptions_by_drug_type_query.rb +0 -1
  23. data/app/models/renalware/pathology/message_listener.rb +7 -7
  24. data/app/models/renalware/pathology/observation_requests_attributes_builder.rb +5 -5
  25. data/app/models/renalware/pathology/observations_jsonb_serializer.rb +0 -1
  26. data/app/models/renalware/patients/message_param_parser.rb +2 -2
  27. data/app/models/renalware/patients/patient_search.rb +2 -2
  28. data/app/models/renalware/renal/aki_alert.rb +4 -0
  29. data/app/models/renalware/renal/aki_alert_query.rb +0 -1
  30. data/app/models/renalware/renal/aki_alert_search_form.rb +2 -2
  31. data/app/models/renalware/renal.rb +0 -2
  32. data/app/views/renalware/hd/transmission_logs/index.html.slim +42 -0
  33. data/app/views/renalware/medications/drug_types/prescriptions/_filters.html.slim +1 -3
  34. data/app/views/renalware/navigation/_admin.html.slim +1 -2
  35. data/app/views/renalware/navigation/_renal.html.slim +1 -1
  36. data/app/views/renalware/navigation/_super_admin.html.slim +2 -0
  37. data/app/views/renalware/renal/aki_alerts/_aki_alert.html.slim +1 -3
  38. data/app/views/renalware/renal/aki_alerts/_filters.html.slim +35 -15
  39. data/app/views/renalware/renal/aki_alerts/_filters.pdf.slim +4 -1
  40. data/app/views/renalware/renal/aki_alerts/edit.html.slim +2 -2
  41. data/app/views/renalware/renal/aki_alerts/index.html.slim +1 -1
  42. data/app/views/renalware/renal/aki_alerts/index.pdf.slim +0 -5
  43. data/config/initializers/ransack.rb +15 -1
  44. data/config/permissions.yml +3 -0
  45. data/config/routes.rb +2 -4
  46. data/db/migrate/20151116170200_create_transplant_versions.rb +3 -3
  47. data/db/migrate/20180622130552_add_external_id_to_hd_sessions.rb +6 -0
  48. data/db/migrate/20180625124431_add_patient_identifier_to_feed_messages.rb +7 -0
  49. data/db/migrate/20180702091222_create_hd_providers.rb +8 -0
  50. data/db/migrate/20180702091237_create_hd_provider_units.rb +11 -0
  51. data/db/migrate/20180702091352_create_hd_transmission_log.rb +18 -0
  52. data/db/migrate/20180730154454_add_external_session_id_to_hd_transmission_logs.rb +9 -0
  53. data/db/migrate/20180802132417_add_missing_indexes_2.rb +18 -0
  54. data/db/migrate/20180802144507_add_missing_foreign_key_indexes.rb +17 -0
  55. data/db/migrate/20180803131157_add_uuid_to_hd_transmission_logs.rb +5 -0
  56. data/db/migrate/20180814103916_create_index_on_lower_patient_family_name.rb +7 -0
  57. data/db/migrate/20180815144429_update_hd_overall_audit_to_version_8.rb +6 -0
  58. data/db/views/reporting_hd_overall_audit_v08.sql +46 -0
  59. data/lib/renalware/version.rb +1 -1
  60. data/lib/tasks/db.rake +13 -0
  61. data/lib/tasks/pathology.rake +29 -0
  62. data/spec/factories/hd/transmission_logs.rb +15 -0
  63. data/spec/support/capybara.rb +16 -15
  64. data/vendor/assets/javascripts/renalware/moment.min.js +1 -0
  65. metadata +25 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4028a0511b757d40f892d8b53f96aad528c613903b72b565cdb3aaba0fb24475
4
- data.tar.gz: 15c5b296ecf7ae47466c7e33480146b3cf00a6dfe88a4c3da0fc6e0dd1a40714
3
+ metadata.gz: cc71457e0667a1542f20348ec2d9a18f4c63771991d5ec1a04567d4c00998945
4
+ data.tar.gz: 3d125ec394cf34ae6fe52a7e31a1383e3a37e423ede66a73630677aecf7de36f
5
5
  SHA512:
6
- metadata.gz: 4415c46fd5f27d2b770675aff7c2fe215605b3a538702a6ef605a0c89f62e15a02bd2cbf733333a3a2a4096450049b9b51e60caf0979c98d4c0d59c0df7e583f
7
- data.tar.gz: fd3490bad516d1d04f5fb2c384537b83acc1d5c79fd8d4cc0aec949452dc3f62716ce7ce5839e780bf1c9e4efce7c70db365ba58d1c0a18a221be13ef0efa57d
6
+ metadata.gz: 7eff31ea5c1a1386c1a6b54004a8ea39822972febf28e2f15860f8d073ee7183028670d5c7ba78f65e2e68c8126c78790917bde0eefc5e37b462af28c977ca7e
7
+ data.tar.gz: c6fead2c420a33575453a89415ea5ec9fe2ce478797ac971b7ab4336f84ad797b9aedbe078dcdf0b76a29405a8991f3f58fd7f265a5cc1c27d8b97b60353fdb9
@@ -0,0 +1,27 @@
1
+ var Renalware = typeof Renalware === 'undefined' ? {} : Renalware;
2
+
3
+ Renalware.AkiAlerts = (function () {
4
+
5
+ var wireUpSetFilterDateToToday = function() {
6
+ $(document).on( "click", "a.set_filter_date_to_today", function(e) {
7
+ e.preventDefault();
8
+ $("#q_date").val(moment().format("DD-MMM-YYYY"))
9
+ });
10
+ };
11
+
12
+ var wireUpSetFilterDateAnyDate = function() {
13
+ $(document).on( "click", "a.set_filter_date_to_any_date", function(e) {
14
+ e.preventDefault();
15
+ $("#q_date").val("")
16
+ });
17
+ };
18
+
19
+ return {
20
+ init : function() {
21
+ wireUpSetFilterDateToToday();
22
+ wireUpSetFilterDateAnyDate();
23
+ }
24
+ }
25
+ })();
26
+
27
+ $(document).ready(Renalware.AkiAlerts.init);
@@ -45,6 +45,7 @@
45
45
  //= require rails.validations
46
46
  //= require rails.validations.simple_form
47
47
  //= require renalware/print.min
48
+ //= require renalware/moment.min
48
49
  //= require_tree .
49
50
  //
50
51
 
@@ -55,4 +56,3 @@ window.console = window.console || { log: function() {} };
55
56
  <% if Rails.env.test? %>
56
57
  $.fx.off = true;
57
58
  <% end %>
58
-
@@ -7,4 +7,9 @@ $(document).ready(function() {
7
7
  e.preventDefault();
8
8
  $(this).closest('form').submit();
9
9
  });
10
+
11
+ $("[data-behaviour='submit_on_change']").on('change', function(e) {
12
+ e.preventDefault();
13
+ $(this).closest('form').submit();
14
+ });
10
15
  });
@@ -1,3 +1,12 @@
1
+ table.stripeless {
2
+ // .session_import_success {
3
+ // background-color: lightgreen !important;
4
+ // }
5
+
6
+ .session_import_error {
7
+ background-color: #FFE5E5 !important;
8
+ }
9
+ }
1
10
 
2
11
  .hd-unit-diaries {
3
12
  .current-week {
@@ -1,3 +1,7 @@
1
+ .button.small_ellipsis_button {
2
+ margin: 0;
3
+ padding: .1rem .3rem;
4
+ }
1
5
 
2
6
  .fa-link-annotation {
3
7
  width: 1.4rem;
@@ -1,3 +1,9 @@
1
+ table.stripeless {
2
+ tr:nth-of-type(even),
3
+ tr:nth-of-type(odd) {
4
+ background-color: transparent;
5
+ }
6
+ }
1
7
 
2
8
  table td.actions-dropdown {
3
9
  padding-top: 0.3rem;
@@ -36,7 +36,7 @@ module Renalware
36
36
 
37
37
  def index
38
38
  events_query = EventQuery.new(patient: patient, query: query_params)
39
- events = events_query.call
39
+ events = events_query.call.page(page).per(per_page)
40
40
  authorize events
41
41
  events = EventsPresenter.new(patient, events)
42
42
 
@@ -93,15 +93,6 @@ module Renalware
93
93
 
94
94
  private
95
95
 
96
- def events
97
- @events ||= Event.for_patient(patient)
98
- .includes(:event_type)
99
- .includes(:created_by)
100
- .page(page)
101
- .per(per_page)
102
- .ordered
103
- end
104
-
105
96
  def disable_selection_of_event_type?
106
97
  event_type_slug.present? && event_type.present?
107
98
  end
@@ -145,8 +136,7 @@ module Renalware
145
136
  end
146
137
 
147
138
  def document_attributes
148
- params.require(:events_event)
149
- .fetch(:document, nil).try(:permit!)
139
+ params.require(:events_event).fetch(:document, nil).try(:permit!)
150
140
  end
151
141
 
152
142
  def new_event_for_patient(params = {})
@@ -176,9 +166,7 @@ module Renalware
176
166
  end
177
167
 
178
168
  def query_params
179
- params
180
- .fetch(:q, {})
181
- .merge(page: page, per_page: per_page || 20)
169
+ params.fetch(:q, {})
182
170
  end
183
171
  end
184
172
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/hd/base_controller"
4
+ require "collection_presenter"
5
+
6
+ module Renalware
7
+ module HD
8
+ class TransmissionLogsController < BaseController
9
+ include PresenterHelper
10
+ include Renalware::Concerns::Pageable
11
+
12
+ # NB be sure not to select the payload as this will slow things down.
13
+ # The payload is loaded by clicking on a link in the table
14
+ def index
15
+ logs = TransmissionLog
16
+ .order(created_at: :desc)
17
+ .select(TransmissionLog.attribute_names - [:payload])
18
+ .page(page).per(per_page)
19
+ authorize logs
20
+ render locals: { logs: logs }
21
+ end
22
+
23
+ def show
24
+ log = TransmissionLog.find(params[:id])
25
+ authorize log
26
+ respond_to do |format|
27
+ format.xml { render xml: log.payload }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -27,7 +27,7 @@ module Renalware
27
27
  def update
28
28
  authorize alert
29
29
  if alert.update(aki_alert_params.merge(by: current_user))
30
- redirect_to renal_filtered_aki_alerts_path(named_filter: :today)
30
+ redirect_to renal_aki_alerts_path(named_filter: :today)
31
31
  else
32
32
  render_edit(alert)
33
33
  end
@@ -85,7 +85,7 @@ module Renalware
85
85
  def search_params
86
86
  params
87
87
  .require(:q) {}
88
- .permit(:term, :on_hotlist, :action, :hospital_unit_id, :hospital_ward_id, :s)
88
+ .permit(:date, :term, :on_hotlist, :action, :hospital_unit_id, :hospital_ward_id, :s)
89
89
  end
90
90
 
91
91
  def path_params
@@ -12,6 +12,11 @@ module Renalware
12
12
  render locals: { study: study, participants: participants }
13
13
  end
14
14
 
15
+ def show
16
+ authorize StudyParticipant, :show?
17
+ redirect_to research_study_participants_path(study)
18
+ end
19
+
15
20
  def create
16
21
  participant = study.participants.build(participant_params)
17
22
  participant.joined_on ||= Time.zone.today
@@ -113,6 +113,19 @@ module Renalware
113
113
  attribute :had_blood_transfusion, Document::Enum, enums: %i(yes no), default: :no
114
114
  end
115
115
  attribute :complications, Complications
116
+
117
+ # rubocop:disable Metrics/AbcSize
118
+ def error_messages
119
+ [
120
+ observations_before.errors.full_messages,
121
+ observations_after.errors.full_messages,
122
+ dialysis.errors.full_messages,
123
+ info.errors.full_messages,
124
+ complications.errors.full_messages,
125
+ hdf.errors.full_messages
126
+ ].flatten.compact
127
+ end
128
+ # rubocop:enable Metrics/AbcSize
116
129
  end
117
130
  end
118
131
  end
data/app/jobs/feed_job.rb CHANGED
@@ -13,6 +13,9 @@
13
13
  #
14
14
  FeedJob = Struct.new(:raw_message) do
15
15
  def perform
16
- Renalware::Feeds.message_processor.call(raw_message)
16
+ Renalware::Feeds
17
+ .message_processor
18
+ .broadcasting_to_configured_subscribers
19
+ .call(raw_message)
17
20
  end
18
21
  end
@@ -10,6 +10,10 @@ module Renalware
10
10
  included do
11
11
  class_eval do
12
12
  scope :identity_match, ->(identity = 1) { where(sql_and_params(identity)) }
13
+
14
+ ransacker :family_name_case_insensitive, type: :string do
15
+ arel_table[:family_name].lower
16
+ end
13
17
  end
14
18
  end
15
19
 
@@ -19,7 +19,6 @@ module Renalware
19
19
  .eager_load(:event_type)
20
20
  .includes(:created_by)
21
21
  .eager_load(:created_by)
22
- .page(query[:page]).per(query[:per_page])
23
22
  .ordered
24
23
  end
25
24
 
@@ -8,14 +8,38 @@ module Renalware
8
8
  # Responsible for coordinating the processing sequences of a raw HL7 message.
9
9
  #
10
10
  class MessageProcessor
11
+ include Broadcasting
12
+
13
+ # For SubscriptionRegistry only, may not be needed as also inc in Broadcasting module
11
14
  include Wisper::Publisher
12
15
 
13
16
  def call(raw_message)
17
+ broadcast_args = nil
18
+
19
+ # We want to wrap message processing in a transaction because if message processing
20
+ # fails we don't want to leave an unprocessed message in the feed_messages table.
21
+ # If we did, and the same FeedJob retires a few minutes later, if will try to save to
22
+ # feed_messages with the same MD5 body_hash (the message is identical to one already saved)
23
+ # resulting in unique key violation.
24
+ # Using a transaction here prevents any orphaned records if there is an error.
25
+ # However we should be aware that any listeners raising an error will prevent successful
26
+ # in all other listeners. So a listener should be careful to catch errors and not re-raise
27
+ # them, or use the :message_processed message (lower down) which is safer.
14
28
  ActiveRecord::Base.transaction do
15
- message_payload = parse_message(raw_message)
16
- persist_message(message_payload)
17
- broadcast(:message_processed, message_payload)
29
+ hl7_message = build_hl7_object_from(raw_message)
30
+ feed_message = persist_message(hl7_message)
31
+ broadcast_args = { hl7_message: hl7_message, feed_message: feed_message }
32
+ broadcast(:message_arrived, broadcast_args)
18
33
  end
34
+
35
+ # Another event, this one letting anyone interested know that a message been successfully
36
+ # processed. They might want to forward the message on somewhere else for instance.
37
+ # Think Diaverum.
38
+ # The crucial difference here is that an exception raised by a listener does not prevent the
39
+ # main processing of the HL7 message from being rolled back.
40
+ # They could use this for message processing but we'd rather it was used for post-processing
41
+ # e.g. forwarding, logging etc.
42
+ broadcast(:message_processed, broadcast_args)
19
43
  rescue StandardError => exception
20
44
  notify_exception(exception)
21
45
  raise exception
@@ -23,7 +47,7 @@ module Renalware
23
47
 
24
48
  private
25
49
 
26
- def parse_message(raw_message)
50
+ def build_hl7_object_from(raw_message)
27
51
  MessageParser.new.parse(raw_message)
28
52
  end
29
53
 
@@ -32,8 +56,8 @@ module Renalware
32
56
  # same message payload is saved twice - in this case we exit #call early, the broadcast
33
57
  # is not issued and therefore the message is not processed. The message will go back into
34
58
  # the delayed_job queue and retry, failing until it finally gives up!
35
- def persist_message(message_payload)
36
- PersistMessage.new.call(message_payload)
59
+ def persist_message(hl7_message)
60
+ PersistMessage.new.call(hl7_message)
37
61
  end
38
62
 
39
63
  def notify_exception(exception)
@@ -5,15 +5,16 @@ require_dependency "renalware/feeds"
5
5
  module Renalware
6
6
  module Feeds
7
7
  class PersistMessage
8
- # message_payload is an HL7Message (a decorator around ::HL7::Message)
8
+ # hl7_message is an HL7Message (a decorator around ::HL7::Message)
9
9
  # If the same message is persisted twice we'll get an ActiveRecord::RecordNotUnique error
10
10
  # but that's fine as we don't want to process the same HL7 message twice.
11
- def call(message_payload)
11
+ def call(hl7_message)
12
12
  Message.create!(
13
- event_code: message_payload.type,
14
- header_id: message_payload.header_id,
15
- body: message_payload.to_s,
16
- body_hash: Digest::MD5.hexdigest(message_payload.to_s)
13
+ event_code: hl7_message.type,
14
+ header_id: hl7_message.header_id,
15
+ body: hl7_message.to_s,
16
+ body_hash: Digest::MD5.hexdigest(hl7_message.to_s),
17
+ patient_identifier: hl7_message.patient_identification&.internal_id
17
18
  )
18
19
  end
19
20
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/hd"
4
+
5
+ module Renalware
6
+ module HD
7
+ # An HD::Provider is a company managing dialysers for example Diaverum or Fresenius
8
+ class Provider < ApplicationRecord
9
+ validates :name, presence: true
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/hd"
4
+
5
+ module Renalware
6
+ module HD
7
+ # An HD::Provider is a company managing dialysers for example Diaverum or Fresenius
8
+ class ProviderUnit < ApplicationRecord
9
+ belongs_to :hd_provider, class_name: "HD::Provider"
10
+ belongs_to :hospital_unit, class_name: "Hospitals::Unit"
11
+ validates :hd_provider, presence: true
12
+ validates :hospital_unit, presence: true
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/hd"
4
+
5
+ module Renalware
6
+ module HD
7
+ # Tracks the import of incoming HD Session data from an integrated dialysis provider
8
+ # and the outgoing data back to that provider, for example HL7 messages.
9
+ class TransmissionLog < ApplicationRecord
10
+ belongs_to :hd_provider_unit, class_name: "ProviderUnit"
11
+ belongs_to :patient, class_name: "Renalware::Patient"
12
+ belongs_to :session
13
+ validates :direction, presence: true
14
+ validates :format, presence: true
15
+ has_many :children,
16
+ class_name: "TransmissionLog",
17
+ foreign_key: "parent_id",
18
+ dependent: :destroy
19
+ belongs_to :parent, class_name: "TransmissionLog"
20
+
21
+ def self.policy_class
22
+ BasePolicy
23
+ end
24
+ end
25
+ end
26
+ end
@@ -29,7 +29,14 @@ module Renalware
29
29
  def generate_archive(by:, presenter: default_presenter)
30
30
  becomes!(Approved).tap do |letter|
31
31
  letter.by = by
32
- letter.build_archive(by: by, content: presenter.content)
32
+ # Note there is no need to set letter_id: id here but there is an
33
+ # intermittent issue where (oddly) build_archive fails because letter_id not
34
+ # present, so in attempt to fix this we are setting it here explicitly.
35
+ # Using self.id rather than letter.id in case the becomes! has lost the id
36
+ # for some reason. Also moved presenter.content to a new line so we can more easily see
37
+ # if that is causing the error as it does a lot of processing to build the letter.
38
+ achived_letter_content = presenter.content
39
+ letter.build_archive(by: by, content: achived_letter_content, letter_id: id)
33
40
  end
34
41
  end
35
42
 
@@ -19,7 +19,6 @@ module Renalware
19
19
  @search ||= begin
20
20
  Prescription
21
21
  .current
22
- .ordered
23
22
  .includes(:medication_route, :drug)
24
23
  .includes(patient: { current_modality: :description })
25
24
  .eager_load(drug: [:drug_types])
@@ -3,29 +3,29 @@
3
3
  require_dependency "renalware/pathology"
4
4
 
5
5
  #
6
- # When subscribed to HL7 `message_processed` messages, gets notified of incoming HL7 messages
6
+ # When subscribed to HL7 `message_arrived` messages, gets notified of incoming HL7 messages
7
7
  # and creates the observations contained therein provided the patient exists.
8
8
  #
9
9
  module Renalware
10
10
  module Pathology
11
11
  class MessageListener
12
12
  # Note: We are already inside a transaction here
13
- def message_processed(message_payload)
14
- pathology_params = parse_pathology_params(message_payload)
13
+ def message_arrived(hl7_message:, **)
14
+ pathology_params = parse_pathology_params(hl7_message)
15
15
  create_observation_requests_and_their_child_observations_from(pathology_params)
16
16
  #
17
- # Note: The the current_observation_set for the patient is updated by a trigger here
17
+ # Note: The current_observation_set for the patient is updated by a trigger here!
18
18
  #
19
19
  end
20
20
 
21
21
  private
22
22
 
23
- def parse_pathology_params(message_payload)
24
- ObservationRequestsAttributesBuilder.new(message_payload).parse
23
+ def parse_pathology_params(hl7_message)
24
+ ObservationRequestsAttributesBuilder.new(hl7_message).parse
25
25
  end
26
26
 
27
27
  def create_observation_requests_and_their_child_observations_from(pathology_params)
28
- return if pathology_params.nil? # eg patient does not exist
28
+ return if pathology_params.nil? # e.g. patient does not exist
29
29
  CreateObservationRequests.new.call(pathology_params)
30
30
  end
31
31
  end
@@ -12,13 +12,13 @@ module Renalware
12
12
  # directly - this would remove the extra level of indirection that this class introduces.
13
13
  class ObservationRequestsAttributesBuilder
14
14
  DEFAULT_REQUESTOR_NAME = "UNKNOWN"
15
- delegate :patient_identification, :observation_requests, to: :message_payload
15
+ delegate :patient_identification, :observation_requests, to: :hl7_message
16
16
  delegate :internal_id, to: :patient_identification
17
17
  alias_attribute :requests, :observation_requests
18
18
 
19
- # message_payload is an HL7Message (a decorator around an ::HL7::Message)
20
- def initialize(message_payload, logger = Delayed::Worker.logger)
21
- @message_payload = message_payload
19
+ # hl7_message is an HL7Message (a decorator around an ::HL7::Message)
20
+ def initialize(hl7_message, logger = Delayed::Worker.logger)
21
+ @hl7_message = hl7_message
22
22
  @logger = logger
23
23
  end
24
24
 
@@ -40,7 +40,7 @@ module Renalware
40
40
 
41
41
  private
42
42
 
43
- attr_reader :message_payload, :logger
43
+ attr_reader :hl7_message, :logger
44
44
 
45
45
  def build_patient_params
46
46
  patient = find_patient(internal_id)
@@ -24,7 +24,6 @@ module Renalware
24
24
  super
25
25
  end
26
26
  end
27
- # rubocop:enable Style/MethodMissing
28
27
 
29
28
  # From eg hgb_result, returns
30
29
  # [:HGB, "result"]
@@ -8,8 +8,8 @@ module Renalware
8
8
  # that can be persisted by Patient.
9
9
  #
10
10
  class MessageParamParser
11
- def parse(message_payload)
12
- pi = message_payload.patient_identification
11
+ def parse(hl7_message)
12
+ pi = hl7_message.patient_identification
13
13
 
14
14
  {
15
15
  patient: {
@@ -7,8 +7,8 @@ module Renalware
7
7
  Renalware::Patient
8
8
  .includes(current_modality: [:description])
9
9
  .search(params[:patient_search]).tap do |search|
10
- search.sorts = %w(family_name given_name)
11
- end
10
+ search.sorts = %w(family_name_case_insensitive given_name)
11
+ end
12
12
  end
13
13
  end
14
14
  end
@@ -17,6 +17,10 @@ module Renalware
17
17
 
18
18
  scope :today, ->{ where(created_at: Time.zone.today.all_day) }
19
19
  scope :hotlist, ->{ where(hotlist: true) }
20
+
21
+ ransacker :created_at_casted do |_parent|
22
+ Arel.sql("date(renal_aki_alerts.created_at)")
23
+ end
20
24
  end
21
25
  end
22
26
  end
@@ -27,7 +27,6 @@ module Renalware
27
27
  .joins(:patient) # required for PatientsRansackHelper - see Admission
28
28
  .includes(:patient, :updated_by, :action, hospital_ward: :hospital_unit)
29
29
  .eager_load(patient: [current_modality: :description])
30
- .public_send(query[:named_filter].to_s)
31
30
  .ransack(query)
32
31
  end
33
32
  end
@@ -8,7 +8,7 @@ module Renalware
8
8
  include ActiveModel::Model
9
9
  include Virtus::Model
10
10
 
11
- attribute :hospital_unit_id, Integer
11
+ attribute :date, Date
12
12
  attribute :hospital_ward_id, Integer
13
13
  attribute :action, String
14
14
  attribute :term, String
@@ -19,9 +19,9 @@ module Renalware
19
19
  def query
20
20
  @query ||= begin
21
21
  options = {
22
+ created_at_casted_date_equals: date,
22
23
  identity_match: term,
23
24
  hospital_ward_id_eq: hospital_ward_id,
24
- hospital_ward_hospital_unit_id_eq: hospital_unit_id,
25
25
  action_id_eq: action,
26
26
  hotlist_eq: on_hotlist,
27
27
  s: s,
@@ -4,8 +4,6 @@ require_dependency "renalware"
4
4
 
5
5
  module Renalware
6
6
  module Renal
7
- AKI_ALERT_FILTERS = %w(today all hotlist).freeze
8
-
9
7
  def self.table_name_prefix
10
8
  "renal_"
11
9
  end
@@ -0,0 +1,42 @@
1
+ = within_admin_layout(title: "HD Transmission Logs") do
2
+ .hd_transmission_logs
3
+ table.stripeless
4
+ thead
5
+ tr
6
+ th.col-width-date-time Date
7
+ th.col-width-tiny Direction
8
+ th.col-width-tiny Format
9
+ th.col-width-tiny Payload
10
+ th.col-width-large Filename
11
+ th Patient
12
+ th.col-width-small Ext Session Id
13
+ th.col-width-small Session Id
14
+ th.col-width-tiny Result
15
+ th Errors
16
+ tbody
17
+ - logs.each do |log|
18
+ ruby:
19
+ klass = if log.parent_id.present?
20
+ log.session_id.present? ? "session_import_success" : "session_import_error"
21
+ else
22
+ ""
23
+ end
24
+ tr(class=klass)
25
+ td= l(log.created_at)
26
+ td= log.direction
27
+ td= log.format
28
+ td= link_to "...",
29
+ hd_transmission_log_path(log, format: :xml),
30
+ class: "button small_ellipsis_button",
31
+ target: "_blank"
32
+ td
33
+ span(title=log.filepath)= log.filepath && Pathname(log.filepath).basename
34
+ td= log.patient && link_to(log.patient, patient_hd_sessions_path(log.patient))
35
+ td= log.external_session_id
36
+ th
37
+ - if log.patient && log.session
38
+ = link_to log.session_id, patient_hd_session_path(log.patient, log.session)
39
+ td= log.result
40
+ td= log.error_messages.compact.uniq.join("<br>").html_safe
41
+
42
+ = paginate logs
@@ -10,9 +10,7 @@
10
10
  method: :get do |f|
11
11
  /= search_form_for(search, url: medications_esa_prescriptions_path) do |f|
12
12
  .small-6.columns
13
- /= f.search_field search_scope, placeholder: t(".search_prompt")
14
- = f.input :patient_given_name_or_patient_family_name_or_drug_name_or_patient_local_patient_id_cont,
15
- label: t(".search_prompt")
13
+ = f.input search_scope, label: t(".search_prompt")
16
14
  .small-3.columns
17
15
  = f.input :provider_eq,
18
16
  include_blank: true,
@@ -3,10 +3,9 @@ li.has-dropdown
3
3
  ul.dropdown
4
4
  li= link_to "Users", admin_users_path
5
5
  li= link_to "Hospital Units", hospitals_units_path
6
- li= link_to "HD Cannulation Types", hd_cannulation_types_path
7
- li= link_to "HD Dialysers", hd_dialysers_path
8
6
  li= link_to "Request Form Print History", pathology_requests_requests_path
9
7
  li= link_to "Pathology Requesting Configuration", pathology_requests_rules_path
8
+ li= link_to "HD Transmission Logs", hd_transmission_logs_path
10
9
  - unless Rails.env.production?
11
10
  li
12
11
  = link_to "Email Templates", system_email_templates_path