renalware-core 2.0.79 → 2.0.80

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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/app/models/renalware/ukrdc/treatment.rb +17 -0
  4. data/app/models/renalware/ukrdc/treatment_timeline/generate_timeline.rb +35 -0
  5. data/app/models/renalware/ukrdc/treatment_timeline/generate_treatments.rb +45 -0
  6. data/app/models/renalware/ukrdc/treatment_timeline/generator_factory.rb +33 -0
  7. data/app/models/renalware/ukrdc/treatment_timeline/generators/deaths_timeline.rb +17 -0
  8. data/app/models/renalware/ukrdc/treatment_timeline/generators/generic_timeline.rb +17 -0
  9. data/app/models/renalware/ukrdc/treatment_timeline/generators/hd_timeline.rb +145 -0
  10. data/app/models/renalware/ukrdc/treatment_timeline/generators/low_clearance_timelinex.rb +17 -0
  11. data/app/models/renalware/ukrdc/treatment_timeline/generators/pd_timeline.rb +18 -0
  12. data/app/models/renalware/ukrdc/treatment_timeline/generators/transplants_donor_timeline.rb +17 -0
  13. data/app/models/renalware/ukrdc/treatment_timeline/generators/transplants_recipient_timeline.rb +17 -0
  14. data/app/models/renalware/ukrdc/treatment_timeline/prepare_tables.rb +28 -0
  15. data/app/models/renalware/ukrdc/treatment_timeline/remap_model_table_names_to_their_prepared_equivalents.rb +70 -0
  16. data/app/presenters/renalware/ukrdc/patient_presenter.rb +4 -1
  17. data/app/views/renalware/api/ukrdc/patients/_diagnoses.xml.builder +9 -9
  18. data/app/views/renalware/api/ukrdc/patients/_encounters.xml.builder +1 -6
  19. data/app/views/renalware/api/ukrdc/patients/_treatments.xml.builder +28 -0
  20. data/app/views/renalware/api/ukrdc/patients/procedures/_dialysis_session.xml.builder +0 -1
  21. data/app/views/renalware/api/ukrdc/patients/show.xml.builder +1 -1
  22. data/db/migrate/20190520091324_create_ukrdc_treatments.rb +18 -0
  23. data/db/migrate/20190607134717_add_ukrdc_modality_code_id_to_modality_descriptions.rb +22 -0
  24. data/lib/renalware/version.rb +1 -1
  25. data/lib/tasks/ukrdc.rake +8 -0
  26. data/spec/factories/ukrdc/modality_codes.rb +17 -0
  27. data/spec/support/patients_spec_helper.rb +5 -1
  28. metadata +19 -4
  29. data/app/views/renalware/api/ukrdc/patients/encounters/_hd_session.xml.builder +0 -38
  30. data/app/views/renalware/api/ukrdc/patients/encounters/_treatment.xml.builder +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e498f337dc6db41cfb6478cd0241f19693a22f284ff95941a1756c32beb057d5
4
- data.tar.gz: 45bf39706420b19adc516e7e2fc2effd4c095392a675d01af1e1a64892ba0420
3
+ metadata.gz: f3aa90a846be2948db0c68e68384a6199d8fc84504fbdbd8eaf890a587d3242d
4
+ data.tar.gz: 0730cc42cf7371c20d3c3589bf3b1e66078fd263ecce33e61bf03ebf25e69bd0
5
5
  SHA512:
6
- metadata.gz: 6ba0afc1c09b0f94252f359d6ca2412906e668c437913a11115ba3174325ed27e441ea29e9e895e07a9e9ca1b6a259ed622be7d31dbe3fc3dc9dd0d4a5906293
7
- data.tar.gz: a14cb7fa2f36d3d40b3939715e485804b713b148dcd54dd68420eba7f1007a6cfbf31dde473952805ce79cae497276ae004e0734ee120f42b4affbe1c016a3d3
6
+ metadata.gz: edd227674f0d89c5d865b0f6a4ccc9fc7e1827e30809b11cb740838e93c6ba9e02746d756059b7a56b4161e2d7366dc11d210c83f679ead2a9f90d4bff4986d6
7
+ data.tar.gz: 64fc99a1982ec5674374e5d84dbe366757cc18fc0fd0db442d2b0a998b2d6b522fd2227efdb5825e1f9709698b2165c40750b4f28c7373171eec4928526d1519
data/README.md CHANGED
@@ -15,7 +15,7 @@ Rails application, and configure it to include the Renalware engine. The host ap
15
15
  extremely thin, adding no custom features other than site-specific configuration, or it may include
16
16
  Ruby, HTML and JavaScript to override or augment renalware-core's features.
17
17
 
18
- While the engine is indented to be deployed inside a host application in production, it can be run
18
+ While the engine is intended to be deployed inside a host application in production, it can be run
19
19
  stand-alone in a local development environment (or indeed deployed in a limited way to somewhere like Heroku) by employing
20
20
  the _dummy_ host application that ships inside the engine. This dummy app (in `./spec/dummy`)
21
21
  allows a developer to quickly mount the engine, and is used also used Rails integration tests (which is why
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+
5
+ module Renalware
6
+ module UKRDC
7
+ class Treatment < ApplicationRecord
8
+ belongs_to :patient
9
+ belongs_to :clinician, class_name: "Renalware::User"
10
+ belongs_to :modality_code
11
+ validates :patient, presence: true
12
+ validates :modality_code, presence: true
13
+
14
+ scope :ordered, -> { order(started_on: :asc, ended_on: :asc) }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+ require "attr_extras"
5
+
6
+ # rubocop:disable Rails/Output
7
+ module Renalware
8
+ module UKRDC
9
+ module TreatmentTimeline
10
+ #
11
+ # Re-generates the ukrdc_treatments for a patient from their modalities and other information.
12
+ #
13
+ class GenerateTimeline
14
+ pattr_initialize :patient
15
+
16
+ def call
17
+ PrepareTables.call
18
+ RemapModelTableNamesToTheirPreparedEquivalents.call
19
+
20
+ modalities.each do |modality|
21
+ print "#{modality.description.name} "
22
+ GeneratorFactory.call(modality).call
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def modalities
29
+ patient.modalities.order(started_on: :asc, updated_at: :asc)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ # rubocop:enable Rails/Output
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+ require "attr_extras"
5
+ require "benchmark"
6
+
7
+ module Renalware
8
+ module UKRDC
9
+ module TreatmentTimeline
10
+ # Re-generates the ukrdc_treatments table
11
+ class GenerateTreatments
12
+ def self.call
13
+ new.call
14
+ end
15
+
16
+ def call
17
+ elapsed_ms = Benchmark.ms do
18
+ generate_treatments
19
+ end
20
+ log("\nCreated #{UKRDC::Treatment.count} UKRDC Treatments in #{elapsed_ms / 1000.0}s")
21
+ end
22
+
23
+ private
24
+
25
+ def patient_scope
26
+ Renalware::Patient.select(:id)
27
+ end
28
+
29
+ # rubocop:disable Rails/Output
30
+ def generate_treatments
31
+ Rails.logger.info "#{patient_scope.count} patients"
32
+ patient_scope.find_each do |patient|
33
+ print "\n#{patient.id}: "
34
+ GenerateTimeline.new(patient).call
35
+ end
36
+ end
37
+ # rubocop:enable Rails/Output
38
+
39
+ def log(msg)
40
+ Rails.logger.info(msg)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+ require "attr_extras"
5
+ require "benchmark"
6
+
7
+ module Renalware
8
+ module UKRDC
9
+ module TreatmentTimeline
10
+ class GeneratorFactory
11
+ DEFAULT_TYPE = "Generic"
12
+
13
+ # Returns the class of object to suitable for generating the treatment timeline for the
14
+ # requested modality. If the modality description type is nil then we use a generic
15
+ # generator. If no generator class is defined matching the description.type, we also
16
+ # return nil.
17
+ # Example:
18
+ # given the modality_description.type of Renalware::Bla::BlaModalityDescription
19
+ # we will look to see if the constant GenerateBlaBlaTimeline exists and return an instance
20
+ # if so - otherwise we return an instance of the default generator GenerateGenericTimeline.
21
+ def self.call(modality)
22
+ type = modality.description.type.presence || DEFAULT_TYPE
23
+ type = type.gsub("::", "").gsub(/^Renalware/, "").gsub(/ModalityDescription$/, "")
24
+ (klass_for(type) || klass_for(DEFAULT_TYPE)).new(modality)
25
+ end
26
+
27
+ def self.klass_for(type)
28
+ "Renalware::UKRDC::TreatmentTimeline::Generators::#{type}Timeline".safe_constantize
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+
5
+ module Renalware
6
+ module UKRDC
7
+ module TreatmentTimeline
8
+ module Generators
9
+ class DeathsTimeline
10
+ pattr_initialize :modality
11
+
12
+ def call; end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+
5
+ module Renalware
6
+ module UKRDC
7
+ module TreatmentTimeline
8
+ module Generators
9
+ class GenericTimeline
10
+ pattr_initialize :modality
11
+
12
+ def call; end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+
5
+ # rubocop:disable Rails/Output
6
+ module Renalware
7
+ module UKRDC
8
+ module TreatmentTimeline
9
+ module Generators
10
+ class HDTimeline
11
+ pattr_initialize :modality
12
+ delegate :patient, to: :modality
13
+
14
+ def call
15
+ create_treatment_from_modality
16
+ create_treatments_within_modality
17
+ deduplicate
18
+ end
19
+
20
+ private
21
+
22
+ def create_treatment_from_modality
23
+ print "[#{treatment.txt_code}] "
24
+ treatments << Treatment.create!(
25
+ patient: patient,
26
+ clinician: modality.created_by,
27
+ started_on: modality.started_on,
28
+ ended_on: modality.ended_on,
29
+ modality_code: treatment
30
+ )
31
+ end
32
+
33
+ class ProfileDecorator < DumbDelegator
34
+ def initialize(profile, last_profile:)
35
+ @last_profile = last_profile
36
+ super(profile)
37
+ end
38
+
39
+ def hd_type
40
+ document.dialysis.hd_type
41
+ end
42
+
43
+ def changed?
44
+ return true if last_profile.blank?
45
+
46
+ hd_type_changed? || hospital_unit_changed?
47
+ end
48
+
49
+ def unchanged?
50
+ !changed?
51
+ end
52
+
53
+ def hd_type_changed?
54
+ last_profile.document.dialysis.hd_type != hd_type
55
+ end
56
+
57
+ def hospital_unit_changed?
58
+ last_profile.hospital_unit_id != hospital_unit_id
59
+ end
60
+
61
+ private
62
+
63
+ attr_reader :last_profile
64
+ end
65
+
66
+ # 3 things trigger a new Treatment for an HD patient
67
+ # - change of site
68
+ # - change of hd_type to from hd and (hdf_pre || hdf_post)
69
+ # - change of hd prescription
70
+ # Looop through the hd_profiles and trigger an new treatment when these change
71
+ def create_treatments_within_modality
72
+ profiles = hd_profiles_for(patient, from: modality.started_on, to: modality.ended_on)
73
+ last_profile = NullObject.instance
74
+
75
+ profiles.each do |profile_|
76
+ profile = ProfileDecorator.new(profile_, last_profile: last_profile)
77
+ create_treatment_from(profile) if profile.changed?
78
+ last_profile = profile_
79
+ end
80
+ end
81
+
82
+ # - if modality started on same day as hd profile prescribed then use HD Profile hd_type
83
+ # if present else hd
84
+ # - if modality started before hd_profile setup and hd_profile is hdf, we'll have
85
+ # 2 treatments: hd then hdf
86
+ # - if hosp unit changes within the modality timeframe, trigger a new treatment
87
+ # - if medications change? new treatment? Check with GS
88
+ def deduplicate
89
+ # p treatments.map(&:id)
90
+ end
91
+
92
+ # rubocop:disable Metrics/AbcSize
93
+ def create_treatment_from(profile)
94
+ code = treatment_for_hd_type(profile.hd_type)
95
+ print "[#{code.txt_code}] "
96
+ treatments << Treatment.create!(
97
+ patient: patient,
98
+ clinician: modality.created_by,
99
+ started_on: modality.started_on,
100
+ ended_on: modality.ended_on,
101
+ modality_code: treatment_for_hd_type(profile.hd_type)
102
+ )
103
+ end
104
+ # rubocop:enable Metrics/AbcSize
105
+
106
+ def treatments
107
+ @treatments ||= []
108
+ end
109
+
110
+ def treatment_for_hd_type(hd_type)
111
+ ukrr_name = case hd_type.to_s.downcase
112
+ when "hd" then "Haemodialysis"
113
+ when "hdf_pre", "hdf_post" then "Haemodiafiltration"
114
+ end
115
+ UKRDC::ModalityCode.find_by!(description: ukrr_name)
116
+ end
117
+
118
+ def hd_profiles_for(patient, from:, to: Time.zone.now)
119
+ conditions = {
120
+ patient_id: patient.id,
121
+ prescribed_on: from..DateTime::Infinity.new
122
+ }
123
+
124
+ scope = Renalware::HD::Profile
125
+ .with_deactivated
126
+ .order(prescribed_on: :asc, deactivated_at: :desc)
127
+
128
+ scope
129
+ .where(conditions.merge(deactivated_at: from..to))
130
+ .or(scope.where(conditions.merge(deactivated_at: nil)))
131
+ end
132
+
133
+ def hd_patient
134
+ Renalware::HD.cast_patient(patient)
135
+ end
136
+
137
+ def treatment
138
+ ModalityCode.find_by!(description: "Haemodialysis")
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+ # rubocop:enable Rails/Output
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+
5
+ module Renalware
6
+ module UKRDC
7
+ module TreatmentTimelinex
8
+ module Generators
9
+ class LowClearanceTimeline
10
+ pattr_initialize :modality
11
+
12
+ def call; end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+
5
+ module Renalware
6
+ module UKRDC
7
+ module TreatmentTimeline
8
+ module Generators
9
+ class PDTimeline
10
+ pattr_initialize :modality
11
+ delegate :patient, to: :modality
12
+
13
+ def call; end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+
5
+ module Renalware
6
+ module UKRDC
7
+ module TreatmentTimeline
8
+ module Generators
9
+ class TransplantsDonorTimeline
10
+ pattr_initialize :modality
11
+
12
+ def call; end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+
5
+ module Renalware
6
+ module UKRDC
7
+ module TreatmentTimeline
8
+ module Generators
9
+ class TransplantsRecipientTimeline
10
+ pattr_initialize :modality
11
+
12
+ def call; end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware
4
+ module UKRDC
5
+ module TreatmentTimeline
6
+ # If the host site has defined a SQL function called ukrdc_prepare_tables() in any schema in
7
+ # the current SEARCH_PATH, then we call it here. It will (we hope) generate massaged copies of
8
+ # tables needed to later generate e.g. UKRDC treatments - for example at KCH the hd_profiles
9
+ # table is massaged to correct migration artefacts and issues prior to the generation of the
10
+ # UKRDC Treatment Timeline. Elsewhere we detect the presence of these prepared
11
+ # tables (eg ukrdc_prepared_hd_profiles) and use them as the underlying table behind, in this
12
+ # example, Renalware::HD::Profile, by setting class.table_name = 'ukrdc_prepared_hd_profiles'.
13
+ # If the site has not defined the ukrdc_prepare_tables SQL function then we exit gracefully.
14
+ class PrepareTables
15
+ def self.call
16
+ connection = ActiveRecord::Base.connection
17
+ result = connection.execute(<<-SQL)
18
+ select 1 where exists(select 1 from pg_proc where proname = 'ukrdc_prepare_tables');
19
+ SQL
20
+ if result.ntuples == 1
21
+ connection.execute("select ukrdc_prepare_tables();")
22
+ return true
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ # For use only in rake task! See comments below
4
+ module Renalware
5
+ module UKRDC
6
+ module TreatmentTimeline
7
+ # Wehen generating the tratment timeline, sites may want to pre-prepare a massaged version
8
+ # of say hd_profiles, in order to correct any anomalies. This service object
9
+ # will remap the table_name of the supplied (or default models) to the
10
+ # 'ukrdc_prepared_*' version if it exists. Otrherwise it will not change the table name.
11
+ # Note that this can only be done when executing as a rake task (which has its own process)
12
+ # as I beleive changing the table_name will affect all threads in the same process - so doing
13
+ # this in a puma process would mean users start to see only the contents of the
14
+ # ukrdc_prepared_tables. Not good :0.
15
+ class RemapModelTableNamesToTheirPreparedEquivalents
16
+ ALLOWED_PROCESSES = %w(rake rspec).freeze
17
+ MODELS = [
18
+ Renalware::HD::Profile
19
+ ].freeze
20
+ class ExecutionNotAllowedError < StandardError; end
21
+
22
+ def self.call(models = MODELS)
23
+ new.call(models)
24
+ end
25
+
26
+ def call(models)
27
+ fail_unless_running_in_rake_or_rspec
28
+ Array(models).each do |model_class|
29
+ prepared_table_name = prepared_table_name_for(model_class.table_name)
30
+ model_class.table_name = prepared_table_name if table_exists?(prepared_table_name)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def fail_unless_running_in_rake_or_rspec
37
+ unless ALLOWED_PROCESSES.include?(File.basename($PROGRAM_NAME))
38
+ raise(
39
+ ExecutionNotAllowedError,
40
+ "Can only be called from #{ALLOWED_PROCESSES.join(', ')}"
41
+ )
42
+ end
43
+ end
44
+
45
+ def prepared_table_name_for(table_name)
46
+ "ukrdc_prepared_#{table_name}"
47
+ end
48
+
49
+ def table_exists?(table_name)
50
+ result = connection.execute(<<-SQL)
51
+ SELECT 1
52
+ WHERE EXISTS (
53
+ SELECT 1 FROM information_schema.tables WHERE table_name = '#{table_name}')
54
+ SQL
55
+ result.ntuples == 1
56
+ end
57
+
58
+ def connection
59
+ ActiveRecord::Base.connection
60
+ end
61
+ end
62
+
63
+ module X
64
+ def table_name
65
+ "ukrdc_prepared_#{super}"
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -96,7 +96,10 @@ module Renalware
96
96
 
97
97
  # We always send the patients current prescriptions.
98
98
  def prescriptions
99
- __getobj__.prescriptions.current.includes(:termination, :medication_route, :drug)
99
+ __getobj__
100
+ .prescriptions
101
+ .includes(:termination, :medication_route, :drug)
102
+ .order(:prescribed_on)
100
103
  end
101
104
 
102
105
  def observation_requests
@@ -3,15 +3,6 @@
3
3
  # https://github.com/renalreg/ukrdc/blob/6d95e364dd8de857839fe6cdbd4e7fc3fb4c1d42/Schema/Diagnoses/Diagnosis.xsd
4
4
  xml = builder
5
5
  xml.Diagnoses do
6
- if patient.dead? && patient.first_cause.present?
7
- # Only 1 CauseOfDeath element is allowed so we ignore patient.second_cause
8
- render(
9
- "renalware/api/ukrdc/patients/diagnoses/cause_of_death",
10
- builder: xml,
11
- cause: patient.first_cause
12
- )
13
- end
14
-
15
6
  patient.yes_comorbidities.each do |comorb|
16
7
  xml.Diagnosis do
17
8
  xml.Diagnosis do
@@ -44,6 +35,15 @@ xml.Diagnoses do
44
35
  end
45
36
  end
46
37
 
38
+ if patient.dead? && patient.first_cause.present?
39
+ # Only 1 CauseOfDeath element is allowed so we ignore patient.second_cause
40
+ render(
41
+ "renalware/api/ukrdc/patients/diagnoses/cause_of_death",
42
+ builder: xml,
43
+ cause: patient.first_cause
44
+ )
45
+ end
46
+
47
47
  if patient.prd_description_code.present?
48
48
  xml.RenalDiagnosis do
49
49
  xml.Diagnosis do
@@ -3,10 +3,5 @@
3
3
  xml = builder
4
4
 
5
5
  xml.Encounters do
6
- patient.modalities.each do |session|
7
- render "renalware/api/ukrdc/patients/encounters/treatment",
8
- builder: xml,
9
- patient: patient,
10
- session: Renalware::HD::SessionPresenter.new(session)
11
- end
6
+ render "treatments", builder: xml, patient: patient
12
7
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ xml = builder
4
+
5
+ # A temporary output ot the treatment timeline using just this modality descriptions with a
6
+ # crude renal reg modality code assigned to them - HD PD Transplant vCKD - all other modalities
7
+ # fall through the gaps at this stage until we implement this properly. Also sub RR modal codes
8
+ # like CAPD and HDF are not yet implemented, just the top level modality.
9
+ patient.modalities.each do |modality|
10
+ next if modality.description.ukrdc_modality_code_id.blank?
11
+
12
+ xml.Treatment do
13
+ xml.EncounterNumber modality.id
14
+ xml.EncounterType "N"
15
+ xml.FromTime modality.started_on.to_time&.iso8601
16
+ xml.ToTime modality.ended_on.to_time&.iso8601
17
+
18
+ xml.HealthCareFacility do
19
+ xml.CodingStandard "ODS"
20
+ xml.Code Renalware.config.ukrdc_site_code
21
+ end
22
+
23
+ xml.AdmitReason do
24
+ xml.CodingStandard "CF_RR7_TREATMENT"
25
+ xml.Code Renalware::UKRDC::ModalityCode.find(modality.description.ukrdc_modality_code_id).txt_code
26
+ end
27
+ end
28
+ end
@@ -6,7 +6,6 @@ xml.DialysisSession(
6
6
  start: session.performed_on_date,
7
7
  stop: session.performed_on_date
8
8
  ) do
9
-
10
9
  xml.ProcedureType do
11
10
  xml.CodingStandard "SNOMED"
12
11
  xml.Code "302497006"
@@ -23,7 +23,7 @@ xml.ukrdc(:PatientRecord, namespace_and_schema) do
23
23
  render "medications", builder: xml, patient: patient
24
24
  render "procedures", builder: xml, patient: patient
25
25
  render "documents", builder: xml, patient: patient
26
- # render "encounters", builder: xml, patient: patient
26
+ render "encounters", builder: xml, patient: patient
27
27
  render "program_memberships", builder: xml, patient: patient
28
28
  render "clinical_relationships", builder: xml, patient: patient
29
29
  render "surveys", builder: xml, patient: patient
@@ -0,0 +1,18 @@
1
+ class CreateUKRDCTreatments < ActiveRecord::Migration[5.2]
2
+ def change
3
+ within_renalware_schema do
4
+ create_table :ukrdc_treatments do |t|
5
+ t.references :patient, foreign_key: true, index: true, null: false
6
+ t.references :clinician, foreign_key: { to_table: :users }, index: true, null: true
7
+ t.references :modality_code, foreign_key: { to_table: :ukrdc_modality_codes }, index: true, null: false
8
+ t.references :modality, index: true, null: true
9
+ t.references :modality_description, index: true, null: true, foreign_key: true
10
+ t.references :hospital_centre, null: true, foreign_key: true, index: true
11
+ t.references :hospital_unit, null: true, foreign_key: true, index: true
12
+ t.date :started_on, null: false
13
+ t.date :ended_on
14
+ t.timestamps null: false
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ class AddUKRDCModalityCodeIdToModalityDescriptions < ActiveRecord::Migration[5.2]
2
+ def change
3
+ # add_column :modality_descriptions, :ukrdc_modality_code_id, :integer
4
+ add_reference :modality_descriptions,
5
+ :ukrdc_modality_code,
6
+ foreign_key: true
7
+
8
+ reversible do |direction|
9
+ direction.up do
10
+ connection.execute(<<-SQL.squish)
11
+ update renalware.modality_descriptions set ukrdc_modality_code_id = (select id from renalware.ukrdc_modality_codes where qbl_code = '19') where name = 'PD';
12
+ update renalware.modality_descriptions set ukrdc_modality_code_id = (select id from renalware.ukrdc_modality_codes where qbl_code = '1') where name = 'HD';
13
+ update renalware.modality_descriptions set ukrdc_modality_code_id = (select id from renalware.ukrdc_modality_codes where qbl_code = '29') where name = 'Transplant';
14
+ update renalware.modality_descriptions set ukrdc_modality_code_id = (select id from renalware.ukrdc_modality_codes where qbl_code = '900') where name = 'vCKD';
15
+ SQL
16
+ end
17
+ direction.down do
18
+ # noop
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Renalware
4
- VERSION = "2.0.79"
4
+ VERSION = "2.0.80"
5
5
  end
data/lib/tasks/ukrdc.rake CHANGED
@@ -41,4 +41,12 @@ namespace :ukrdc do
41
41
  patient_ids: args.fetch(:patient_ids, "").split(" ").map(&:to_i)
42
42
  ).call
43
43
  end
44
+
45
+ desc "Regenerates the ukrdc_treatments table ready for exporting to UKRDC in another task"
46
+ task generate_treatments: :environment do
47
+ logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
48
+ logger.level = Logger::INFO
49
+ Rails.logger = logger
50
+ Renalware::UKRDC::TreatmentTimeline::GenerateTreatments.call
51
+ end
44
52
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :ukrdc_modality_code, class: Renalware::UKRDC::ModalityCode do
5
+ trait :hd do
6
+ description { "Haemodialysis" }
7
+ txt_code { 1 }
8
+ qbl_code { 1 }
9
+ end
10
+
11
+ trait :hdf do
12
+ description { "Haemodiafiltration" }
13
+ txt_code { 3 }
14
+ qbl_code { 3 }
15
+ end
16
+ end
17
+ end
@@ -6,7 +6,8 @@ module PatientsSpecHelper
6
6
  started_on: Time.zone.today,
7
7
  by: Renalware::User.first)
8
8
 
9
- Renalware::Modalities::ChangePatientModality
9
+ # ChangePatientModality returns a Success or Failure object
10
+ new_modality = Renalware::Modalities::ChangePatientModality
10
11
  .new(patient: patient, user: by)
11
12
  .call(
12
13
  description: modality_description,
@@ -14,5 +15,8 @@ module PatientsSpecHelper
14
15
  )
15
16
 
16
17
  patient.reload # need to do this in order for current_modality to be set
18
+
19
+ # Return ther object associated with the returned Success or Failure object
20
+ new_modality.object
17
21
  end
18
22
  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.79
4
+ version: 2.0.80
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airslie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-06 00:00:00.000000000 Z
11
+ date: 2019-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_type
@@ -1825,6 +1825,19 @@ files:
1825
1825
  - app/models/renalware/ukrdc/paths.rb
1826
1826
  - app/models/renalware/ukrdc/patients_query.rb
1827
1827
  - app/models/renalware/ukrdc/transmission_log.rb
1828
+ - app/models/renalware/ukrdc/treatment.rb
1829
+ - app/models/renalware/ukrdc/treatment_timeline/generate_timeline.rb
1830
+ - app/models/renalware/ukrdc/treatment_timeline/generate_treatments.rb
1831
+ - app/models/renalware/ukrdc/treatment_timeline/generator_factory.rb
1832
+ - app/models/renalware/ukrdc/treatment_timeline/generators/deaths_timeline.rb
1833
+ - app/models/renalware/ukrdc/treatment_timeline/generators/generic_timeline.rb
1834
+ - app/models/renalware/ukrdc/treatment_timeline/generators/hd_timeline.rb
1835
+ - app/models/renalware/ukrdc/treatment_timeline/generators/low_clearance_timelinex.rb
1836
+ - app/models/renalware/ukrdc/treatment_timeline/generators/pd_timeline.rb
1837
+ - app/models/renalware/ukrdc/treatment_timeline/generators/transplants_donor_timeline.rb
1838
+ - app/models/renalware/ukrdc/treatment_timeline/generators/transplants_recipient_timeline.rb
1839
+ - app/models/renalware/ukrdc/treatment_timeline/prepare_tables.rb
1840
+ - app/models/renalware/ukrdc/treatment_timeline/remap_model_table_names_to_their_prepared_equivalents.rb
1828
1841
  - app/models/renalware/ukrdc/xml_renderer.rb
1829
1842
  - app/models/renalware/user.rb
1830
1843
  - app/models/renalware/version.rb
@@ -2118,9 +2131,8 @@ files:
2118
2131
  - app/views/renalware/api/ukrdc/patients/_sending_facility.xml.builder
2119
2132
  - app/views/renalware/api/ukrdc/patients/_social_histories.xml.builder
2120
2133
  - app/views/renalware/api/ukrdc/patients/_surveys.xml.builder
2134
+ - app/views/renalware/api/ukrdc/patients/_treatments.xml.builder
2121
2135
  - app/views/renalware/api/ukrdc/patients/diagnoses/_cause_of_death.xml.builder
2122
- - app/views/renalware/api/ukrdc/patients/encounters/_hd_session.xml.builder
2123
- - app/views/renalware/api/ukrdc/patients/encounters/_treatment.xml.builder
2124
2136
  - app/views/renalware/api/ukrdc/patients/lab_orders/_lab_order.xml.builder
2125
2137
  - app/views/renalware/api/ukrdc/patients/lab_orders/_result_item.xml.builder
2126
2138
  - app/views/renalware/api/ukrdc/patients/observations/_blood_pressure.xml.builder
@@ -3472,12 +3484,14 @@ files:
3472
3484
  - db/migrate/20190513131826_add_view_count_to_system_help.rb
3473
3485
  - db/migrate/20190513135312_create_pathology_code_groups.rb
3474
3486
  - db/migrate/20190516093707_add_graft_nephectomy_on_to_tx_op_followup.rb
3487
+ - db/migrate/20190520091324_create_ukrdc_treatments.rb
3475
3488
  - db/migrate/20190531172829_add_last_change_date_to_patient_practices.rb
3476
3489
  - db/migrate/20190602114659_create_system_api_logs.rb
3477
3490
  - db/migrate/20190603084428_add_pages_to_system_api_logs.rb
3478
3491
  - db/migrate/20190603135247_add_columns_to_patient_primary_care_physicians.rb
3479
3492
  - db/migrate/20190603143834_update_import_practice_memberships_csv.rb
3480
3493
  - db/migrate/20190603165812_drop_import_practices_csv_function.rb
3494
+ - db/migrate/20190607134717_add_ukrdc_modality_code_id_to_modality_descriptions.rb
3481
3495
  - db/seeds.rb
3482
3496
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.csv
3483
3497
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.rb
@@ -3804,6 +3818,7 @@ files:
3804
3818
  - spec/factories/transplants/registration_status_descriptions.rb
3805
3819
  - spec/factories/transplants/registration_statuses.rb
3806
3820
  - spec/factories/transplants/registrations.rb
3821
+ - spec/factories/ukrdc/modality_codes.rb
3807
3822
  - spec/factories/virology/patients.rb
3808
3823
  - spec/factories/virology/vaccinations.rb
3809
3824
  - spec/support/capybara_helper.rb
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # xml = builder
4
-
5
- # xml.Treatment do
6
- # xml.EncounterNumber session.uuid
7
- # xml.comment! "TODO: EncounterType TBC"
8
- # xml.EncounterType "R"
9
- # xml.FromTime session.start_datetime&.to_datetime
10
- # xml.ToTime session.stop_datetime&.to_datetime
11
-
12
- # xml.HealthCareFacility do
13
- # xml.CodingStandard "ODS"
14
- # xml.Code session.hospital_unit_renal_registry_code
15
- # xml.Description session.hospital_unit_name
16
- # end
17
-
18
- # xml.AdmitReason do
19
- # xml.comment! "AdmitReason 1 == Haemodialysis - TBC - may need to capture/derive"
20
- # xml.CodingStandard "CF_RR7_TREATMENT"
21
- # xml.Code "1"
22
- # end
23
-
24
- # xml.EnteredAt do
25
- # xml.Code session.hospital_unit_renal_registry_code
26
- # end
27
-
28
- # xml.Attributes do
29
- # xml.HDP01 session.patient&.hd_profile&.schedule_definition&.days_per_week
30
- # xml.HDP02 session.duration
31
- # xml.HDP03 session.document.dialysis.flow_rate
32
- # xml.HDP04 session&.dialysate&.sodium_content
33
- # xml.QBL05 session.access_type
34
- # xml.comment! "ERF61 - defaulting to 5 if not present, as element is required"
35
- # xml.ERF61 patient.current_registration_status_rr_code || "5" # 5= not assessed
36
- # xml.PAT35 patient.first_seen_on
37
- # end
38
- # end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- xml = builder
4
-
5
- xml.Treatment do
6
- xml.FromTime modality.started_on
7
- xml.ToTime modality.ended_on
8
-
9
- xml.HealthCareFacility do
10
- xml.CodingStandard "ODS"
11
- xml.Code Renalware.config.ukrdc_site_code
12
- end
13
-
14
- # xml.AdmitReason do
15
- # xml.comment! "AdmitReason 1 == Haemodialysis - TBC - may need to capture/derive"
16
- # xml.CodingStandard "CF_RR7_TREATMENT"
17
- # xml.Code "1"
18
- # end
19
-
20
- # xml.EnteredAt do
21
- # xml.Code session.hospital_unit_renal_registry_code
22
- # end
23
-
24
- # xml.Attributes do
25
- # xml.HDP01 session.patient&.hd_profile&.schedule_definition&.days_per_week
26
- # xml.HDP02 session.duration
27
- # xml.HDP03 session.document.dialysis.flow_rate
28
- # xml.HDP04 session&.dialysate&.sodium_content
29
- # xml.QBL05 session.access_type
30
- # xml.comment! "ERF61 - defaulting to 5 if not present, as element is required"
31
- # xml.ERF61 patient.current_registration_status_rr_code || "5" # 5= not assessed
32
- # xml.PAT35 patient.first_seen_on
33
- # end
34
- end