renalware-core 2.0.41 → 2.0.42

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