renalware-core 2.0.0.pre.rc5 → 2.0.0.pre.rc6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/renalware/protocol_pdf.scss +26 -4
  3. data/app/controllers/renalware/base_controller.rb +1 -1
  4. data/app/controllers/renalware/patients/patients_controller.rb +3 -0
  5. data/app/jobs/renalware/letters/save_pdf_letter_to_file_job.rb +23 -0
  6. data/app/models/renalware/letters/part/clinical_observations.rb +34 -1
  7. data/app/models/renalware/pathology/all_observation_codes.rb +20 -0
  8. data/app/models/renalware/pathology/current_observation_set.rb +7 -1
  9. data/app/models/renalware/pathology/observations_jsonb_serializer.rb +5 -16
  10. data/app/models/renalware/patient.rb +4 -0
  11. data/app/presenters/renalware/hd/protocol_presenter.rb +5 -0
  12. data/app/presenters/renalware/patient_presenter.rb +14 -0
  13. data/app/views/renalware/api/ukrdc/patients/_clinic_visit_observation.xml.builder +2 -1
  14. data/app/views/renalware/api/ukrdc/patients/_documents.xml.builder +1 -1
  15. data/app/views/renalware/api/ukrdc/patients/_observations.xml.builder +7 -1
  16. data/app/views/renalware/api/ukrdc/patients/lab_orders/_result_item.xml.builder +10 -4
  17. data/app/views/renalware/hd/mdm/_audits.html.slim +3 -3
  18. data/app/views/renalware/hd/mdm/_sessions.html.slim +6 -5
  19. data/app/views/renalware/hd/protocols/_recent_pathology.html.slim +10 -0
  20. data/app/views/renalware/hd/protocols/show.pdf.slim +3 -1
  21. data/app/views/renalware/letters/parts/_clinical_observations.html.slim +5 -8
  22. data/app/views/renalware/patients/_side_menu.html.slim +2 -0
  23. data/app/views/renalware/patients/patients/_patient.html.slim +10 -0
  24. data/app/views/renalware/patients/patients/_table.html.slim +2 -0
  25. data/app/views/renalware/patients/patients/index.html.slim +1 -1
  26. data/app/views/renalware/patients/side_menu/_general.html.slim +0 -1
  27. data/app/views/renalware/patients/side_menu/_modalities.html.slim +1 -0
  28. data/app/views/renalware/patients/side_menu/_site_specific_actions.html.slim +1 -0
  29. data/app/views/renalware/patients/side_menu/_site_specific_links.html.slim +1 -0
  30. data/config/initializers/devise.rb +1 -1
  31. data/config/locales/loinc_codes.yml +10 -3
  32. data/config/locales/renalware/clinics/visit.yml +5 -3
  33. data/db/migrate/20180119121243_create_trigger_to_preprocess_hl7_msg.rb +50 -0
  34. data/db/seeds/default/letters/seeds.rb +2 -1
  35. data/lib/renalware/version.rb +1 -1
  36. metadata +8 -4
  37. data/db/seeds/default/letters/letterheads.csv +0 -4
  38. data/db/seeds/default/letters/letterheads.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '029ce152132118a328d4531c385ef69f1099851f896560c5c229f78597c40b06'
4
- data.tar.gz: 48865c348da03e90d9107edf4d94a010f6ba5ae4318cc150d9c71cfbdf753e96
3
+ metadata.gz: ce584cb7cbfefee7174f99e866b6a7955c12266f2fd6b0a60d86078dbf342ee2
4
+ data.tar.gz: 63261ae22a2fa334bb74777b0312ca3101a0cc38b45f964fd15ffaa82d62e7f6
5
5
  SHA512:
6
- metadata.gz: a83a65471cc274aed97ce173dd41d34dcb674b48ea7b71887dbd712e2a1610ce6ceaea9952e1243f22448724e7e2a3b557b569dddd835e7d0c31b733f018a096
7
- data.tar.gz: 11534fdc42c9af7b7789ae428d46f1ccd0b88d441aaf0332e953eb42174d958cb1b76f99f7fbbbc7f5732355840aa18b26abbab422effdf34a20a36967f612b3
6
+ metadata.gz: e0f645e776c510e2b1f65c9b786b5838af19d350cc762d01ce6648f207881f6239ae131a10c980264cd123ed5ce6eaa0b1dcd13c2d0e62b2c6576df4feb32cc7
7
+ data.tar.gz: 0035ed970b1e8776a586398a8ad05e51373dff09467f833d6950f311eaf4e8508b63649849699e599b619c1fe4e689cb3334785ab91da31f1706bb677651ff02
@@ -76,15 +76,26 @@ h1 {
76
76
  font-size: 1.1rem ;
77
77
 
78
78
  &.protocol-hd-profile {
79
- width: 52%;
79
+ width: 42%;
80
80
  }
81
81
 
82
82
  &.protocol-allergies {
83
- width: 20%;
83
+ width: 18%;
84
+
85
+ .allergy_status_updated_at {
86
+ padding-left: 0.2rem;
87
+ font-weight: normal;
88
+ }
84
89
  }
85
90
 
86
91
  &.protocol-prescriptions {
87
- width: 28%;
92
+ width: 25%;
93
+ }
94
+
95
+ &.protocol-recent-pathology {
96
+ width: 15%;
97
+ padding: 0;
98
+ padding-left: .3rem;
88
99
  }
89
100
  }
90
101
  }
@@ -198,6 +209,17 @@ h1 {
198
209
  }
199
210
  }
200
211
 
212
+ table.recent-pathology {
213
+ text-align: left;
214
+
215
+ td, th {
216
+ padding-right: 0.2rem;
217
+ }
218
+
219
+ .result {
220
+ text-align: right;
221
+ }
222
+ }
201
223
 
202
224
  dl {
203
225
  padding-bottom: 0.2rem;
@@ -241,11 +263,11 @@ h1 {
241
263
  }
242
264
 
243
265
  .allergies {
244
-
245
266
  .allergy_status {
246
267
  font-weight: normal;
247
268
  margin-right: 10px;
248
269
  }
270
+
249
271
  .allergy_descriptions {
250
272
  font-weight: bold;
251
273
  padding: 0;
@@ -57,7 +57,7 @@ module Renalware
57
57
 
58
58
  def user_not_authorized
59
59
  flash[:error] = "You are not authorized to perform this action."
60
- redirect_to patients_path
60
+ redirect_to dashboard_path
61
61
  end
62
62
  end
63
63
  end
@@ -7,9 +7,12 @@ module Renalware
7
7
  include Renalware::Concerns::Pageable
8
8
 
9
9
  def index
10
+ sort = params.dig(:q, :s)
11
+ patient_search.sorts = sort if sort
10
12
  patients = patient_search.result.page(page).per(per_page)
11
13
  authorize patients
12
14
  render locals: {
15
+ search: patient_search,
13
16
  patients: present(patients, PatientPresenter)
14
17
  }
15
18
  end
@@ -0,0 +1,23 @@
1
+ require_dependency "renalware/letters"
2
+ require "fileutils"
3
+
4
+ module Renalware
5
+ module Letters
6
+ class SavePdfLetterToFileJob < ApplicationJob
7
+ def perform(letter:, file_path:)
8
+ file_path = Pathname(file_path)
9
+ create_folder_if_not_exists(file_path)
10
+ File.open(file_path, "wb") { |file| file << pdf_data_for(letter) }
11
+ end
12
+
13
+ def pdf_data_for(letter)
14
+ letter = Renalware::Letters::LetterPresenter.new(letter)
15
+ Renalware::Letters::PdfRenderer.call(letter)
16
+ end
17
+
18
+ def create_folder_if_not_exists(path)
19
+ FileUtils.mkdir_p(path.dirname)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -3,11 +3,44 @@ require "renalware/letters/part"
3
3
  module Renalware
4
4
  module Letters
5
5
  class Part::ClinicalObservations < Part
6
- delegate :height, :weight, :bp, :bmi, :urine_blood, :urine_protein, to: :event
6
+ include Renalware::AttributeNameHelper
7
+ OBSERVATION_ATTRS = %i(bp weight height bmi urine_blood urine_protein).freeze
8
+ OBSERVATION_UNITS = { weight: :kg, height: :m }.freeze
9
+ delegate(*OBSERVATION_ATTRS, to: :event)
10
+ delegate :any?, to: :observations
11
+
12
+ def each_observation
13
+ observations.each do |arr|
14
+ label, result, unit_of_measurement = arr
15
+ yield(label, result, unit_of_measurement)
16
+ end
17
+ end
7
18
 
8
19
  def to_partial_path
9
20
  "renalware/letters/parts/clinical_observations"
10
21
  end
22
+
23
+ private
24
+
25
+ def observations
26
+ OBSERVATION_ATTRS.each_with_object([]) do |observation, arr|
27
+ value = send(observation)
28
+ next if value.blank?
29
+ arr << [
30
+ label_for(observation),
31
+ enum_text_or_raw_value_for(value),
32
+ OBSERVATION_UNITS[observation]
33
+ ]
34
+ end
35
+ end
36
+
37
+ def label_for(observation)
38
+ attr_name(Renalware::Clinics::ClinicVisit, observation)
39
+ end
40
+
41
+ def enum_text_or_raw_value_for(value)
42
+ value.try(:text) || value
43
+ end
11
44
  end
12
45
  end
13
46
  end
@@ -0,0 +1,20 @@
1
+ require_dependency "renalware/pathology"
2
+
3
+ module Renalware
4
+ module Pathology
5
+ # A singleton exposing all defined OBX codes as an array of symbols
6
+ class AllObservationCodes
7
+ include Singleton
8
+
9
+ # Example usage:
10
+ # AllObservationCodes.include?(code)
11
+ def self.include?(code)
12
+ instance.all.include?(code)
13
+ end
14
+
15
+ def all
16
+ @all ||= ObservationDescription.order(:code).pluck(:code).map(&:upcase).map(&:to_sym)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -22,7 +22,9 @@ module Renalware
22
22
  # When displaying or using a patient's current_observation_set the consuming code
23
23
  # must filter out the codes it wants.
24
24
  class CurrentObservationSet < ApplicationRecord
25
- belongs_to :patient, class_name: "Renalware::Pathology::Patient"
25
+ belongs_to :patient,
26
+ class_name: "Renalware::Pathology::Patient",
27
+ inverse_of: :current_observation_set
26
28
  validates :patient, presence: true
27
29
  serialize :values, ObservationsJsonbSerializer
28
30
 
@@ -30,6 +32,10 @@ module Renalware
30
32
  codes = Array(codes)
31
33
  values.select{ |code, _| codes.include?(code) }
32
34
  end
35
+
36
+ def self.null_values_hash
37
+ HashWithIndifferentAccess.new.extend(ObservationSetMethods)
38
+ end
33
39
  end
34
40
  end
35
41
  end
@@ -2,21 +2,6 @@ require_dependency "renalware/pathology"
2
2
 
3
3
  module Renalware
4
4
  module Pathology
5
- # A singleton exposing all defined OBX codes as an array of symbols
6
- class AllObservationCodes
7
- include Singleton
8
-
9
- # Example usage:
10
- # AllObservationCodes.include?(code)
11
- def self.include?(code)
12
- instance.all.include?(code)
13
- end
14
-
15
- def all
16
- @all ||= ObservationDescription.order(:code).pluck(:code).map(&:upcase).map(&:to_sym)
17
- end
18
- end
19
-
20
5
  # We mix this module into any database-returned jsonb hash of observations
21
6
  # (e.g. CurrentObservationSet.values and Letter.pathology_snapshot)
22
7
  module ObservationSetMethods
@@ -26,7 +11,11 @@ module Renalware
26
11
  # values.hgb_result # => 3.3
27
12
  # values.hgb_observed_at # => "2017-17-01"
28
13
  # So the values has methods corresponding to the entire set of possible
29
- # OBX codes, and also methods to reach in and get their result and observed_at date
14
+ # OBX codes, and also methods to reach in and get their result and observed_at date.
15
+ #
16
+ # Note that if you get a missing method error for something like #hgb_result it means
17
+ # that HGB does not exist yet as an ObservationDescription so is not found in
18
+ # AllObservationCodes hence we can't respond to it.
30
19
  # rubocop:disable Style/MethodMissing
31
20
  def method_missing(method_name, *_args, &_block)
32
21
  code, suffix = method_parts(method_name)
@@ -26,6 +26,10 @@ module Renalware
26
26
  @secure_id_without_dashes ||= super&.gsub("-", "")
27
27
  end
28
28
 
29
+ def secure_id_dashed
30
+ self[:secure_id]
31
+ end
32
+
29
33
  enumerize :marital_status, in: %i(married single divorced widowed)
30
34
 
31
35
  has_paper_trail class_name: "Renalware::Patients::Version"
@@ -45,6 +45,11 @@ module Renalware
45
45
  ::CollectionPresenter.new(prescriptions, ::Renalware::Medications::PrescriptionPresenter)
46
46
  end
47
47
 
48
+ def recent_pathology
49
+ current_observation_set = Pathology.cast_patient(patient).current_observation_set
50
+ current_observation_set&.values || Pathology::CurrentObservationSet.null_values_hash
51
+ end
52
+
48
53
  def patient_title
49
54
  patient.to_s(:long)
50
55
  end
@@ -16,5 +16,19 @@ module Renalware
16
16
  return if super.index(" ")
17
17
  "#{super[0..2]} #{super[3..5]} #{super[6..-1]}"
18
18
  end
19
+
20
+ def rpv_decision
21
+ [
22
+ I18n.l(rpv_decision_on),
23
+ rpv_recorded_by
24
+ ].compact.join(" by ")
25
+ end
26
+
27
+ def renalreg_decision
28
+ [
29
+ I18n.l(renalreg_decision_on),
30
+ renalreg_recorded_by
31
+ ].compact.join(" by ")
32
+ end
19
33
  end
20
34
  end
@@ -5,7 +5,8 @@ xml.Observation do
5
5
  xml.ObservationTime visit.datetime
6
6
 
7
7
  xml.ObservationCode do
8
- xml.CodingStandard "2.16.840.1.113883.4.642.2.115"
8
+ # xml.CodingStandard "2.16.840.1.113883.4.642.2.115"
9
+ xml.CodingStandard "LOCAL"
9
10
  xml.Code I18n.t("loinc.#{i18n_key}.code")
10
11
  xml.Description I18n.t("loinc.#{i18n_key}.description")
11
12
  end
@@ -21,7 +21,7 @@ xml.Documents do
21
21
  xml.Code letter.hospital_unit_code
22
22
  end
23
23
  xml.FileType do
24
- xml.Code "PDF"
24
+ xml.Code "application/pdf"
25
25
  end
26
26
  xml.Stream Base64.encode64(Renalware::Letters::PdfRenderer.call(letter))
27
27
  end
@@ -5,7 +5,6 @@
5
5
  xml = builder
6
6
 
7
7
  xml.Observations(start: Time.zone.today.iso8601, stop: Time.zone.today.iso8601) do
8
- xml.comment! "Check what start and stop refer to here"
9
8
  patient.clinic_visits.includes(:updated_by).each do |visit|
10
9
  render "clinic_visit_observation",
11
10
  visit: visit,
@@ -22,6 +21,13 @@ xml.Observations(start: Time.zone.today.iso8601, stop: Time.zone.today.iso8601)
22
21
  render "clinic_visit_observation",
23
22
  visit: visit,
24
23
  method: :weight,
24
+ i18n_key: "weight",
25
+ builder: builder
26
+
27
+ render "clinic_visit_observation",
28
+ visit: visit,
29
+ method: :height,
30
+ i18n_key: "height",
25
31
  builder: builder
26
32
  end
27
33
  end
@@ -3,14 +3,20 @@ observation = Renalware::Pathology::ObservationPresenter.new(observation)
3
3
  observation = Renalware::UKRDC::PathologyObservationPresenter.new(observation)
4
4
 
5
5
  xml.ResultItem do
6
+ # xml.ResultType
6
7
  xml.EnteredOn observation.updated_at&.iso8601
7
- xml.ObservationTime observation.observed_at&.iso8601
8
8
  xml.PrePost observation.pre_post(patient_is_on_hd: patient.current_modality_hd?)
9
- xml.ResultValue observation.result
10
- xml.ResultValueUnits observation.measurement_unit_name
11
9
  xml.ServiceId do
12
- xml.Code observation.description_code
13
10
  xml.CodingStandard "LOCAL"
11
+ xml.Code observation.description_code
14
12
  xml.Description observation.description_name
15
13
  end
14
+ # xml.SubId
15
+ xml.ResultValue observation.result
16
+ xml.ResultValueUnits observation.measurement_unit_name
17
+ # xml.AbnormalFlags
18
+ # xml.Status
19
+ xml.ObservationTime observation.observed_at&.iso8601
20
+ # xml.Comments
21
+ # xml.ReferenceComment
16
22
  end
@@ -1,6 +1,6 @@
1
- fieldset.simple
2
- legend
3
- span.title= t(".title")
1
+ article
2
+ header
3
+ h2= t(".title")
4
4
 
5
5
  table.mdm.audit
6
6
  thead
@@ -1,6 +1,7 @@
1
- fieldset.simple
2
- legend
3
- span.title= t(".title")
4
- span.actions.action-links
5
- = link_to t(".view_all"), patient_hd_sessions_path(mdm.patient)
1
+ article
2
+ header
3
+ h2= t(".title")
4
+ =link_to t(".view_all"),
5
+ patient_hd_sessions_path(mdm.patient),
6
+ class: "button left secondary"
6
7
  = render "renalware/hd/sessions/table", sessions: mdm.sessions
@@ -0,0 +1,10 @@
1
+ table.recent-pathology
2
+ tbody
3
+ tr
4
+ th.code HGB
5
+ td.result= recent_pathology.hgb_result
6
+ td.observed_at= (l(recent_pathology.hgb_observed_at))
7
+ tr
8
+ th.code PLT
9
+ td.result= recent_pathology.plt_result
10
+ td.observed_at= (l(recent_pathology.plt_observed_at))
@@ -15,13 +15,15 @@
15
15
  = clinical_patient.allergy_status&.text
16
16
  - if clinical_patient.allergy_status_updated_at
17
17
  span.allergy_status_updated_at
18
- = "(#{l(clinical_patient.allergy_status_updated_at&.to_date)})"
18
+ = "#{l(clinical_patient.allergy_status_updated_at&.to_date)}"
19
19
  th.protocol-prescriptions Prescriptions on HD
20
+ th.protocol-recent-pathology Recent Pathology
20
21
  tbody
21
22
  tr
22
23
  td= render "profile", profile: protocol.profile
23
24
  td= render "allergies", patient: protocol.patient
24
25
  td= render "prescriptions", prescriptions: protocol.prescriptions
26
+ td= render "recent_pathology", recent_pathology: protocol.recent_pathology
25
27
 
26
28
  .row.collapse
27
29
  .small-12.columns
@@ -1,8 +1,5 @@
1
- .list.observations
2
- ul.inline
3
- li= inline_value("BP", clinical_observations.bp)
4
- li= inline_value("Weight", clinical_observations.weight, "kg")
5
- li= inline_value("Height", clinical_observations.height, "m")
6
- li= inline_value("BMI", clinical_observations.bmi)
7
- li= inline_value("Urine Blood", clinical_observations.urine_blood&.text)
8
- li= inline_value("Urine Protein", clinical_observations.urine_protein&.text)
1
+ - if clinical_observations.any?
2
+ .list.observations
3
+ ul.inline
4
+ - clinical_observations.each_observation do |label, value, unit_of_measurement|
5
+ li= inline_value(label, value, unit_of_measurement)
@@ -1,5 +1,7 @@
1
1
  ul.side-nav
2
2
  = render "renalware/patients/side_menu/general", patient: patient
3
+ = render "renalware/patients/side_menu/site_specific_links", patient: patient
3
4
  = render "renalware/patients/side_menu/modalities", patient: patient
4
5
  = render "renalware/patients/side_menu/transplants", patient: patient
5
6
  = render "renalware/patients/side_menu/actions", patient: patient
7
+ = render "renalware/patients/side_menu/site_specific_actions", patient: patient
@@ -6,4 +6,14 @@ tr
6
6
  td= patient.sex.code
7
7
  td= patient.born_on
8
8
  td= patient.age
9
+ - if(patient.send_to_rpv?)
10
+ td(title="#{patient.rpv_decision}")
11
+ i.fa.fa-check
12
+ -else
13
+ td
14
+ - if(patient.send_to_renalreg?)
15
+ td(title="#{patient.renalreg_decision}")
16
+ i.fa.fa-check
17
+ -else
18
+ td
9
19
  td= patient.current_modality
@@ -8,6 +8,8 @@ table#patients
8
8
  th.col-width-tiny= attr_name(Renalware::Patient, :sex)
9
9
  th.col-width-date= attr_name(Renalware::Patient, :born_on)
10
10
  th.col-width-tiny= attr_name(Renalware::Patient, :age)
11
+ th.col-width-tiny= sort_link(search, :send_to_rpv, "RPV")
12
+ th.col-width-tiny= sort_link(search, :send_to_renalreg, "RReg")
11
13
  th.col-width-small Modality
12
14
 
13
15
  tbody
@@ -3,4 +3,4 @@
3
3
 
4
4
  = within_admin_layout(title: "Patients") do
5
5
  = render "renalware/patients/index_header"
6
- = render "table", patients: patients
6
+ = render "table", patients: patients, search: search
@@ -57,4 +57,3 @@ li.heading= t(".heading")
57
57
  = patient_menu_item title: t(".inpatient_admissions", count: summary.admissions_count),
58
58
  path: patient_admissions_path(patient),
59
59
  active_when_controller_matches: %r{renalware/admissions}
60
- hr
@@ -1,3 +1,4 @@
1
+ hr
1
2
  li.heading= t(".heading")
2
3
 
3
4
  = patient_menu_item title: t(".pd"),
@@ -0,0 +1 @@
1
+ / Override this template in the host rails application to add actions specific to the hospital
@@ -0,0 +1 @@
1
+ / Override this template in the host rails application to add links specific to the hospital
@@ -11,7 +11,7 @@ Devise.setup do |config|
11
11
  # Configure the e-mail address which will be shown in Devise::Mailer,
12
12
  # note that it will be overwritten if you use your own mailer class
13
13
  # with default "from" parameter.
14
- config.mailer_sender = "please-change-me-at-config-initializers-devise@example.com"
14
+ config.mailer_sender = Renalware.config.default_from_email_address
15
15
 
16
16
  config.parent_controller = "ApplicationController"
17
17
  config.router_name = :renalware
@@ -2,15 +2,22 @@ en:
2
2
  loinc:
3
3
  blood_pressure:
4
4
  systolic:
5
- code: 76538-8
5
+ # code: 76538-8
6
+ code: bpsys
6
7
  description: Blood pressure device Cuff pressure.systolic
7
8
  units: "mmHg"
8
9
  diastolic:
9
- code: 76539-6
10
+ # code: 76539-6
11
+ code: bpdia
10
12
  description: Blood pressure device Cuff pressure.systolic
11
13
  units: "mmHg"
12
14
  weight:
13
- code: 3141-9
15
+ # code: 3141-9
16
+ code: weight
14
17
  description: Body weight Measured
15
18
  units: "Kg"
19
+ height:
20
+ code: height
21
+ description: Height Measured
22
+ units: "m"
16
23
 
@@ -7,9 +7,11 @@ en:
7
7
  activerecord:
8
8
  attributes:
9
9
  renalware/clinics/clinic_visit:
10
- bp: "BP"
11
- standing_bp: "Standing BP"
12
- bmi: "BMI"
10
+ bp: BP
11
+ standing_bp: Standing BP
12
+ bmi: BMI
13
+ urine_blood: Urine Blood
14
+ urine_protein: Urine Protein
13
15
  errors:
14
16
  models:
15
17
  renalware/clinics/clinic_visit:
@@ -0,0 +1,50 @@
1
+ class CreateTriggerToPreprocessHL7Msg < ActiveRecord::Migration[5.1]
2
+ def up
3
+ sql = <<-SQL
4
+ /* Create a function for the trigger to call */
5
+ CREATE FUNCTION preprocess_hl7_message() RETURNS trigger AS
6
+ $body$
7
+ BEGIN
8
+ /*
9
+ Mirth inserts a row into delayed job when a new HL7 message needs to be processed by Renalware.
10
+ The SQL it uses looks like this:
11
+ insert into renalware.delayed_jobs (handler, run_at)
12
+ values(E'--- !ruby/struct:FeedJob\nraw_message: |\n ' || REPLACE(${message.rawData},E'\r',E'\n '), NOW());
13
+ This works unless there is a 10^12 value in the unit of measurement segment for an OBX (e.g.
14
+ for WBC or HGB). Then Mirth encodes the ^ as \S\ because ^ is a significant character in Mirth
15
+ (field separator). Unfortunately this creates the combination
16
+ 10\S\12 and S\12 is converted to \n when the handler's payload is loaded in by the delayed_job worker.
17
+ To get around this we need to convert instances of \S\ with another escape sequence eg «
18
+ and manually map this back to a ^ in the job handler ruby code.
19
+
20
+ So here, if this delayed_job is destinated to be picked up by a Feed job handler
21
+ make sure we convert the Mirth escape sequence \S\ to \\S\\
22
+ */
23
+ IF position('Feed' in NEW.handler) > 0 THEN
24
+ NEW.handler = replace(NEW.handler, '\S\', '\\S\\');
25
+ END IF;
26
+
27
+ RETURN NEW;
28
+ END
29
+
30
+ $body$
31
+ LANGUAGE plpgsql;
32
+
33
+ /* Create the trigger! */
34
+ CREATE TRIGGER feed_messages_preprocessing_trigger
35
+ BEFORE INSERT
36
+ ON delayed_jobs
37
+ FOR EACH ROW
38
+ EXECUTE PROCEDURE preprocess_hl7_message();
39
+ SQL
40
+
41
+ connection.execute(sql)
42
+ end
43
+
44
+ def down
45
+ connection.execute("
46
+ drop trigger if exists feed_messages_preprocessing_trigger on delayed_jobs;
47
+ drop function if exists preprocess_hl7_message();"
48
+ )
49
+ end
50
+ end
@@ -1 +1,2 @@
1
- require_relative "./letterheads"
1
+ # Empty for now - letters seeds are all app-specific. See spec/dummy/db/seeds/letters
2
+ # for examples.
@@ -1,3 +1,3 @@
1
1
  module Renalware
2
- VERSION = "2.0.0.pre.rc5".freeze
2
+ VERSION = "2.0.0.pre.rc6".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: renalware-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre.rc5
4
+ version: 2.0.0.pre.rc6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airslie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-17 00:00:00.000000000 Z
11
+ date: 2018-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -1238,6 +1238,7 @@ files:
1238
1238
  - app/jobs/renalware/hd/generate_monthly_statistics_for_patient_job.rb
1239
1239
  - app/jobs/renalware/hd/generate_monthly_statistics_job.rb
1240
1240
  - app/jobs/renalware/hd/update_rolling_patient_statistics_job.rb
1241
+ - app/jobs/renalware/letters/save_pdf_letter_to_file_job.rb
1241
1242
  - app/jobs/renalware/reporting/refresh_audit_data_job.rb
1242
1243
  - app/mailers/renalware/admin/user_mailer.rb
1243
1244
  - app/mailers/renalware/letters/delivery/errors.rb
@@ -1488,6 +1489,7 @@ files:
1488
1489
  - app/models/renalware/modalities/pd_to_haemodialysis.rb
1489
1490
  - app/models/renalware/modalities/reason.rb
1490
1491
  - app/models/renalware/pathology.rb
1492
+ - app/models/renalware/pathology/all_observation_codes.rb
1491
1493
  - app/models/renalware/pathology/clinic.rb
1492
1494
  - app/models/renalware/pathology/consultant.rb
1493
1495
  - app/models/renalware/pathology/create_observations.rb
@@ -2082,6 +2084,7 @@ files:
2082
2084
  - app/views/renalware/hd/protocols/_allergies.html.slim
2083
2085
  - app/views/renalware/hd/protocols/_prescriptions.html.slim
2084
2086
  - app/views/renalware/hd/protocols/_profile.html.slim
2087
+ - app/views/renalware/hd/protocols/_recent_pathology.html.slim
2085
2088
  - app/views/renalware/hd/protocols/show.pdf.slim
2086
2089
  - app/views/renalware/hd/sessions/_empty_row.html.slim
2087
2090
  - app/views/renalware/hd/sessions/_form.html.slim
@@ -2345,6 +2348,8 @@ files:
2345
2348
  - app/views/renalware/patients/side_menu/_general.html.slim
2346
2349
  - app/views/renalware/patients/side_menu/_modalities.html.slim
2347
2350
  - app/views/renalware/patients/side_menu/_options.html.slim.redundant
2351
+ - app/views/renalware/patients/side_menu/_site_specific_actions.html.slim
2352
+ - app/views/renalware/patients/side_menu/_site_specific_links.html.slim
2348
2353
  - app/views/renalware/patients/side_menu/_transplants.html.slim
2349
2354
  - app/views/renalware/patients/worries/_delete.html.slim
2350
2355
  - app/views/renalware/patients/worries/_new.html.slim
@@ -3049,6 +3054,7 @@ files:
3049
3054
  - db/migrate/20180108185400_remove_null_constraint_from_letters_pathology_snapshot.rb
3050
3055
  - db/migrate/20180112151706_create_low_clearance_profiles.rb
3051
3056
  - db/migrate/20180112151813_create_low_clearance_versions.rb
3057
+ - db/migrate/20180119121243_create_trigger_to_preprocess_hl7_msg.rb
3052
3058
  - db/seeds.rb
3053
3059
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.csv
3054
3060
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.rb
@@ -3077,8 +3083,6 @@ files:
3077
3083
  - db/seeds/default/hd/dialysers.rb
3078
3084
  - db/seeds/default/hd/seeds.rb
3079
3085
  - db/seeds/default/housekeeping.rb
3080
- - db/seeds/default/letters/letterheads.csv
3081
- - db/seeds/default/letters/letterheads.rb
3082
3086
  - db/seeds/default/letters/seeds.rb
3083
3087
  - db/seeds/default/medications/medication_routes.rb
3084
3088
  - db/seeds/default/medications/seeds.rb
@@ -1,4 +0,0 @@
1
- "site_code","unit_info","trust_name","trust_caption","site_info"
2
- "MRH","THE RENAL UNIT","Mount Royal Hospital","NHS Foundation Trust","<p>Renal Administration<br>Mount Royal Hospital<br>Ave Mont Royal<br>Montreal H99 9Z9<br><b>Appointments</b>: 099 9999 6244<br><b>Fax</b>: 099 9999 6472<br><b>Switchboard</b>: 099 9999 9000<br><b>GP Email Advice</b>: mountroyal.renal@nhx.xyz</p>"
3
- "PEEL","NEPHROLOGY OUTREACH CLINIC","Peel District Hospital","NHS Trust","<p><Dr Lily Sinclair &middot; Dr Thomas Devoe<br>Dr David Monroe &middot; Dr Marta Shearing<br><br>Peel District Hospital<br>Peel Street<br>Montreal H88 8Z8<br>Tel: 088 428417<br>Fax: 088 428415<br>www.peelhosp.nhs.xyz</p>"
4
- "FAIR","NEPHROLOGY OUTREACH CLINIC","Fairmount Hospital","NHS Trust","<p>Dr Marta Shearing &middot; Dr Michael Clayton<br>Dr Kathryn Bolkovac &middot; Dr Basher Tarr</b><br><br>Fairmount Hospital<br>Rue Fairmount<br>Montreal H33 3Z3<br><b>Direct Telephone</b>: 033 836 6000<br><b>Fax Number</b>: 033 836 4444<br><b>GP Email Advice</b>: fairmount.renal@nhx.xyz<br><b>www.fairmounthosp.nhs.uk</b></p>"
@@ -1,17 +0,0 @@
1
- module Renalware
2
- log "Adding Letterheads" do
3
-
4
- file_path = File.join(File.dirname(__FILE__), "letterheads.csv")
5
-
6
- CSV.foreach(file_path, headers: true) do |row|
7
- name = "(#{row["site_code"]}) #{row["unit_info"]}"
8
- letterhead = Letters::Letterhead.find_or_initialize_by(name: name)
9
- letterhead.site_code = row["site_code"]
10
- letterhead.unit_info = row["unit_info"]
11
- letterhead.trust_name = row["trust_name"]
12
- letterhead.trust_caption = row["trust_caption"]
13
- letterhead.site_info = row["site_info"]
14
- letterhead.save!
15
- end
16
- end
17
- end