renalware-core 2.0.88 → 2.0.89

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b307ab9e2206ff86c1d62380d3b6dfc77839512a51f5ad7957f8e98e2c7e29a
4
- data.tar.gz: c722f3506055163495fabcf33d586d83597be269f5b40998cec8605236e6400a
3
+ metadata.gz: dea8d3ef3c91160dead8c1db92b9a131b218f2ab1001c2acd0ad6698f6b83e33
4
+ data.tar.gz: 4a19dba06dfd48d8973e103dd3cb950162bf3fe038af55acbd5cee991e240b17
5
5
  SHA512:
6
- metadata.gz: 68c6187d34c761393b070b05bbdb8fed13485739f3deab2cc5feb397a6a4c2a6a86d0c2d67a7f1681dcb7d0e8e36fa181f416c6c7ec9655a55c870dcf88034ed
7
- data.tar.gz: 8f954eeaebce032662556e9b2bb2b4984479f7b13c27ee814e63b17a154836a5c91f596107cbc2e0961c2c32daf3849045f29caea5f39805483ae9ffff3a9d77
6
+ metadata.gz: de2b1c0d56675e5e23607cca2729c9864516ff919e838a278dcc84a15598b72ed2ab26b0be8894894a8cb10d5c1229213af78a6001bbfcc723ec881e5f43e52b
7
+ data.tar.gz: a8c732dfd1caba2154487c21c8f557ba52e09f161b71886262516938b2331399c33806d9fe292b961ad08d60d373baf55e632c1754d7cddfdcebe76922d5259f
data/Rakefile CHANGED
@@ -43,3 +43,12 @@ namespace :assets do
43
43
  Rake::Task["app:assets:clobber"].invoke
44
44
  end
45
45
  end
46
+
47
+ # Default rake task to run all tests:
48
+ # bundle exec rake
49
+ task :engine_default_task do
50
+ sh "bin/rspec"
51
+ sh "bin/cucumber"
52
+ sh "bin/cucumber TEST_DEPTH=web --profile rake_web"
53
+ end
54
+ task(:default).clear.enhance(["engine_default_task"])
@@ -7,6 +7,12 @@ module Renalware
7
7
  class Unit < ApplicationRecord
8
8
  extend Enumerize
9
9
 
10
+ UNIT_TYPE_RR8_MAP = {
11
+ hospital: "HOSP",
12
+ satellite: "SATL",
13
+ home: "HOME"
14
+ }.freeze
15
+
10
16
  belongs_to :hospital_centre, class_name: "Hospitals::Centre"
11
17
  has_many :wards,
12
18
  class_name: "Hospitals::Ward",
@@ -32,6 +38,11 @@ module Renalware
32
38
  def to_s
33
39
  "#{name} (#{unit_code})"
34
40
  end
41
+
42
+ # Map unit_type to its equivalent Renal Registry RR8 code.
43
+ def unit_type_rr8
44
+ UNIT_TYPE_RR8_MAP[unit_type.to_sym]
45
+ end
35
46
  end
36
47
  end
37
48
  end
@@ -19,10 +19,11 @@ module Renalware
19
19
  :request_uuid,
20
20
  :timestamp,
21
21
  :batch_number,
22
- :summary
22
+ :summary,
23
+ :force_send
23
24
  )
24
25
 
25
- def initialize(changed_since: nil, patient_ids: nil, logger: nil)
26
+ def initialize(changed_since: nil, patient_ids: nil, logger: nil, force_send: false)
26
27
  @changed_since = Time.zone.parse(changed_since) if changed_since.present?
27
28
  @patient_ids = Array(patient_ids)
28
29
  @logger = logger || Rails.logger
@@ -30,6 +31,7 @@ module Renalware
30
31
  @timestamp = Time.zone.now.strftime("%Y%m%d%H%M%S%L")
31
32
  @batch_number ||= BatchNumber.next.number
32
33
  @summary = ExportSummary.new
34
+ @force_send = force_send
33
35
  end
34
36
 
35
37
  def call
@@ -74,7 +76,8 @@ module Renalware
74
76
  changes_since: changed_since,
75
77
  request_uuid: request_uuid,
76
78
  batch_number: batch_number,
77
- logger: logger
79
+ logger: logger,
80
+ force_send: force_send
78
81
  ).call
79
82
  end
80
83
  end
@@ -89,11 +92,18 @@ module Renalware
89
92
  def ukrdc_patients_who_have_changed_since_last_send
90
93
  @ukrdc_patients_who_have_changed_since_last_send ||= begin
91
94
  logger.info("Finding #{patient_ids&.any? ? patient_ids : 'all ukrdc'} patients")
92
- query = Renalware::UKRDC::PatientsQuery.new.call(changed_since: changed_since)
95
+ query = Renalware::UKRDC::PatientsQuery.new.call(
96
+ changed_since: changed_since,
97
+ changed_since_last_send: !force_send
98
+ )
93
99
  query = query.where(id: Array(patient_ids)) if patient_ids.present?
94
100
 
95
101
  if changed_since.present?
96
- logger.info("#{query.count} patients have changed since #{changed_since}")
102
+ if force_send
103
+ logger.info("sending #{query.count} patients, taking changes since #{changed_since}")
104
+ else
105
+ logger.info("#{query.count} patients have changed since #{changed_since}")
106
+ end
97
107
  else
98
108
  logger.info("#{query.count} patients have changed since the last send")
99
109
  end
@@ -14,10 +14,13 @@ module Renalware
14
14
  :logger,
15
15
  :batch_number,
16
16
  :renderer, # so we can pass a test renderer to bypass real rendering
17
- :log
17
+ :log,
18
+ :force_send
18
19
  ]
19
20
 
20
21
  # rubocop:disable Metrics/AbcSize
22
+ # If force_send is true then send all files even if they have not changed since the last
23
+ # send. This is primarily for debugging and testing phases with UKRDC
21
24
  def call
22
25
  update_patient_to_indicated_we_checked_them_for_any_relevant_changes
23
26
  UKRDC::TransmissionLog.with_logging(patient, request_uuid) do |log|
@@ -25,7 +28,7 @@ module Renalware
25
28
  logger.info " Patient #{patient.ukrdc_external_id}"
26
29
  xml_payload = build_payload(log)
27
30
  if xml_payload.present?
28
- if xml_payload_same_as_last_sent_payload?(xml_payload)
31
+ if !force_send && xml_payload_same_as_last_sent_payload?(xml_payload)
29
32
  logger.info " skipping as no change in XML file"
30
33
  log.unsent_no_change_since_last_send!
31
34
  else
@@ -18,11 +18,15 @@ module Renalware
18
18
  # this for now I think. If it is a problem we can use the checked_for_ukrdc_changes_at column
19
19
  # on patients.
20
20
  class PatientsQuery
21
- def call(changed_since: nil)
21
+ def call(changed_since: nil, changed_since_last_send: true)
22
22
  if changed_since.present?
23
- sendable_patients.where("updated_at > ?", changed_since)
24
- else
23
+ # patients who changed since a specific date (inclusive)
24
+ sendable_patients.where("updated_at >= ?", changed_since)
25
+ elsif changed_since_last_send
26
+ # patients who have never been sent, or have changed since the last time they were sent
25
27
  sendable_patients.where("(sent_to_ukrdc_at is null) or (updated_at > sent_to_ukrdc_at)")
28
+ else
29
+ sendable_patients
26
30
  end
27
31
  end
28
32
 
@@ -31,7 +35,7 @@ module Renalware
31
35
  def sendable_patients
32
36
  Renalware::Patient.where(send_to_rpv: true).or(
33
37
  Renalware::Patient.where(send_to_renalreg: true)
34
- )
38
+ ).order(family_name: :asc, given_name: :asc)
35
39
  end
36
40
  end
37
41
  end
@@ -15,11 +15,11 @@ module Renalware
15
15
 
16
16
  def call
17
17
  PrepareTables.call
18
- RemapModelTableNamesToTheirPreparedEquivalents.call
19
-
20
- modalities.each do |modality|
21
- print "#{modality.description.name} "
22
- GeneratorFactory.call(modality).call
18
+ RemapModelTableNamesToTheirPreparedEquivalents.new.call do
19
+ modalities.each do |modality|
20
+ print "#{modality.description.name} "
21
+ GeneratorFactory.call(modality).call
22
+ end
23
23
  end
24
24
  end
25
25
 
@@ -4,7 +4,7 @@
4
4
  module Renalware
5
5
  module UKRDC
6
6
  module TreatmentTimeline
7
- # Wehen generating the tratment timeline, sites may want to pre-prepare a massaged version
7
+ # When generating the treatment timeline, sites may want to pre-prepare a massaged version
8
8
  # of say hd_profiles, in order to correct any anomalies. This service object
9
9
  # will remap the table_name of the supplied (or default models) to the
10
10
  # 'ukrdc_prepared_*' version if it exists. Otrherwise it will not change the table name.
@@ -19,16 +19,25 @@ module Renalware
19
19
  ].freeze
20
20
  class ExecutionNotAllowedError < StandardError; end
21
21
 
22
- def self.call(models = MODELS)
23
- new.call(models)
24
- end
25
-
26
- def call(models)
22
+ # Saves the original table names for the array of models classes
23
+ # remaps to its ukrdc_prepared_* varaient if it exists, yields to allow
24
+ # the claling process to do its thing, then importantly winds back to
25
+ # the original table names.
26
+ def call(models = MODELS)
27
27
  fail_unless_running_in_rake_or_rspec
28
- Array(models).each do |model_class|
28
+ models = Array(models)
29
+ original_table_names = models.map(&:table_name)
30
+
31
+ models.each do |model_class|
29
32
  prepared_table_name = prepared_table_name_for(model_class.table_name)
30
33
  model_class.table_name = prepared_table_name if table_exists?(prepared_table_name)
31
34
  end
35
+
36
+ yield if block_given?
37
+
38
+ models.each_with_index do |model_class, index|
39
+ model_class.table_name = original_table_names[index]
40
+ end
32
41
  end
33
42
 
34
43
  private
@@ -39,7 +39,10 @@ module Renalware
39
39
  end
40
40
 
41
41
  def modalities
42
- __getobj__.modalities.includes(:description).order(started_on: :asc, created_at: :asc)
42
+ __getobj__
43
+ .modalities
44
+ .includes(:description)
45
+ .order(started_on: :asc, created_at: :asc)
43
46
  end
44
47
 
45
48
  def dead?
@@ -52,6 +55,7 @@ module Renalware
52
55
  current_modality.description.is_a?(Renalware::HD::ModalityDescription)
53
56
  end
54
57
 
58
+ # Note we of course only send letters for RPV patients and exlcude them for all others.
55
59
  def letters
56
60
  return ::Renalware::Letters::Letter.none if send_to_rpv == false
57
61
 
@@ -8,6 +8,7 @@ xml = builder
8
8
  # like CAPD and HDF are not yet implemented, just the top level modality.
9
9
  patient.modalities.each do |modality|
10
10
  ukrdc_modality_code_id = modality.description.ukrdc_modality_code_id
11
+
11
12
  next if ukrdc_modality_code_id.blank?
12
13
 
13
14
  ukrdc_modality_code = Renalware::UKRDC::ModalityCode.find(ukrdc_modality_code_id)
@@ -28,24 +29,25 @@ patient.modalities.each do |modality|
28
29
  xml.Code ukrdc_modality_code.txt_code
29
30
  end
30
31
 
31
- # # This is a bit of hack to get the HD Profile location for the current modality
32
- # if [1, 2, 3, 4, 5, 9].include?(ukrdc_modality_code.txt_code.to_i) # HD
33
- # profile = Renalware::HD::Profile
34
- # .for_patient(patient)
35
- # .where(<<-SQL).first
36
- # created_at::date <= '#{modality.started_on}'
37
- # and (
38
- # deactivated_at is NULL or
39
- # (
40
- # deactivated_at >= '#{modality.started_on}'
41
- # )
42
- # )
43
- # SQL
44
- # if profile&.hospital_unit.present?
45
- # xml.Attributes do
46
- # xml.QBL05 profile.hospital_unit.unit_type # eg home
47
- # end
48
- # end
49
- # end
32
+ # This is a bit of hack to get the HD Profile location for the current modality
33
+ if [1, 2, 3, 4, 5, 9].include?(ukrdc_modality_code.txt_code.to_i) # HD
34
+ profile = Renalware::HD::Profile
35
+ .where(patient_id: patient.id)
36
+ .where(<<-SQL).order(created_at: :desc).first
37
+ created_at::date <= '#{modality.started_on}'
38
+ and (
39
+ deactivated_at is NULL or
40
+ (
41
+ deactivated_at > '#{modality.started_on}'
42
+ )
43
+ )
44
+ SQL
45
+
46
+ if profile&.hospital_unit&.unit_type_rr8.present?
47
+ xml.Attributes do
48
+ xml.QBL05 profile.hospital_unit.unit_type_rr8 # eg HOME
49
+ end
50
+ end
51
+ end
50
52
  end
51
53
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Renalware
4
- VERSION = "2.0.88"
4
+ VERSION = "2.0.89"
5
5
  end
data/lib/tasks/ukrdc.rake CHANGED
@@ -5,40 +5,37 @@ require "fileutils"
5
5
  # Note you can print out the help for this task and others with `rake -D`
6
6
  namespace :ukrdc do
7
7
  desc <<-DESC
8
- Creates a folder of UKRDC XML files with any changes to PV patients since their last export
8
+ Creates a folder of UKRDC XML files with any changes to PV + RR patients since their last export
9
9
  Notes:
10
10
  1. Running the rake task updates the sent_to_ukrdc_at for each patient exported.
11
- If you don't want to do this you may need to edit this task to wrpt the code in a
11
+ If you don't want to do this you may need to edit this task to wrap the code in a
12
12
  transaction you can optionally roll back.
13
13
  2: If testing this inside the renalware-core gem, you will need to append app: e.g.
14
14
  app:ukrdc:export ...
15
15
 
16
16
  Example usage
17
- 1. To get all patients with send_to_rpv=true who have changed since the last time they
18
- were sent, or have not been sent to the UKRDC yet:
17
+ 1. To get all RR and RPV patients with who have changed
18
+ since the last time they were sent, or have not been sent to the UKRDC yet:
19
19
 
20
20
  bundle exec rake ukrdc:export
21
21
 
22
- 2. To get all patients with send_to_rpv=true who have changed since a certain date:
22
+ 2. To get all RR and RPV patients who have changed since a certain date:
23
23
 
24
- bundle exec rake ukrdc:export["2018-02-23"]
25
- or in zsh shell
26
- bundle exec rake ukrdc:export\["2018-02-23"\]
24
+ bundle exec rake ukrdc:export changed_since="2018-02-23"
27
25
 
28
- 3. To get only certain RPV patients (by their id eg ids 1 and 2) who with changes since
29
- a certain time (not pass patient ids in a space delimited string:
26
+ 3. To get only certain RR and RPV patients (by their id eg ids 1 and 2) with changes since
27
+ a certain date:
30
28
 
31
- bundle exec rake ukrdc:export["2018-02-23","1 2"]
32
- or in the zsh shell
33
- bundle exec rake ukrdc:export\["2018-02-23","1 2"\]
29
+ bundle exec rake ukrdc:export changed_since=2018-02-23 patient_ids=1,2
34
30
  DESC
35
- task :export, [:changed_since, :patient_ids] => [:environment] do |_task, args|
31
+ task :export => :environment do |_task, args|
36
32
  logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
37
33
  logger.level = Logger::INFO
38
34
  Rails.logger = logger
39
35
  Renalware::UKRDC::CreateEncryptedPatientXMLFiles.new(
40
- changed_since: args[:changed_since],
41
- patient_ids: args.fetch(:patient_ids, "").split(" ").map(&:to_i)
36
+ changed_since: ENV["changed_since"],
37
+ patient_ids: ENV.fetch("patient_ids", "").split(",").map(&:to_i),
38
+ force_send: ENV["force_send"] == "true"
42
39
  ).call
43
40
  end
44
41
 
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.88
4
+ version: 2.0.89
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-26 00:00:00.000000000 Z
11
+ date: 2019-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_type
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 9.4.2
75
+ version: '9.6'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 9.4.2
82
+ version: '9.6'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: client_side_validations
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -938,16 +938,16 @@ dependencies:
938
938
  name: yard
939
939
  requirement: !ruby/object:Gem::Requirement
940
940
  requirements:
941
- - - "~>"
941
+ - - ">="
942
942
  - !ruby/object:Gem::Version
943
- version: 0.9.15
943
+ version: 0.9.20
944
944
  type: :runtime
945
945
  prerelease: false
946
946
  version_requirements: !ruby/object:Gem::Requirement
947
947
  requirements:
948
- - - "~>"
948
+ - - ">="
949
949
  - !ruby/object:Gem::Version
950
- version: 0.9.15
950
+ version: 0.9.20
951
951
  description: Renalware uses demographic, clinical, pathology, and nephrology datasets
952
952
  to improve patient care, undertake clinical and administrative audits and share
953
953
  data with external systems.