renalware-core 2.0.121 → 2.0.123

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +6 -0
  3. data/app/controllers/renalware/admin/users_controller.rb +15 -13
  4. data/app/controllers/renalware/clinical/profiles_controller.rb +11 -6
  5. data/app/controllers/renalware/hd/sessions_controller.rb +5 -0
  6. data/app/models/concerns/renalware/patient_pathology_scopes.rb +1 -1
  7. data/app/models/renalware/feeds/hl7_message.rb +6 -0
  8. data/app/models/renalware/hd/prescription_administration.rb +1 -0
  9. data/app/models/renalware/hd/session.rb +2 -0
  10. data/app/models/renalware/pathology/observation_for_patient_observation_description_query.rb +3 -6
  11. data/app/models/renalware/pathology/observation_for_patient_observation_description_using_set_query.rb +20 -0
  12. data/app/models/renalware/pathology/requests/global_rule/observation_result.rb +23 -17
  13. data/app/models/renalware/pathology/requests/global_rule/prescription_drug.rb +2 -2
  14. data/app/models/renalware/pathology/requests/global_rule/prescription_drug_category.rb +2 -2
  15. data/app/models/renalware/pathology/requests/global_rule/prescription_drug_type.rb +7 -2
  16. data/app/models/renalware/pathology/requests/global_rule_set/patient_rule_set_decision.rb +11 -16
  17. data/app/models/renalware/pathology/requests/request_factory.rb +10 -13
  18. data/app/models/renalware/pathology/requests/requests_factory.rb +3 -6
  19. data/app/models/renalware/pathology/{view_observation_results.rb → view_observation_results.rb.dead} +0 -0
  20. data/app/models/renalware/patient.rb +1 -0
  21. data/app/models/renalware/patients/ingestion/commands/add_or_update_patient.rb +3 -3
  22. data/app/models/renalware/patients/ingestion/message_mappers/patient.rb +24 -2
  23. data/app/models/renalware/patients/ingestion/update_master_patient_index.rb +3 -4
  24. data/app/models/renalware/problems/note.rb +4 -0
  25. data/app/models/renalware/system/update_user.rb +1 -0
  26. data/app/models/renalware/user.rb +1 -0
  27. data/app/policies/renalware/hd/closed_session_policy.rb +3 -1
  28. data/app/policies/renalware/hd/dna_session_policy.rb +3 -1
  29. data/app/views/renalware/admin/users/edit.html.slim +16 -11
  30. data/app/views/renalware/admin/users/index.html.slim +6 -0
  31. data/app/views/renalware/clinical/profiles/edit.html.slim +24 -14
  32. data/app/views/renalware/clinical/profiles/show.html.slim +4 -0
  33. data/app/views/renalware/hd/mdm_patients/_patient.html.slim +4 -2
  34. data/app/views/renalware/hd/mdm_patients/_table.html.slim +4 -2
  35. data/app/views/renalware/medications/home_delivery/prescriptions/index.pdf.slim +9 -6
  36. data/app/views/renalware/medications/prescriptions/_table.html.slim +1 -1
  37. data/app/views/renalware/problems/problems/_archived_table.html.slim +1 -1
  38. data/config/locales/renalware/hd/mdm_patients.yml +2 -2
  39. data/db/migrate/20190925161724_change_path_request_consultant_id.rb +2 -6
  40. data/db/migrate/20191026120029_add_deleted_at_to_hd_sessions.rb +11 -0
  41. data/db/migrate/20191029095202_add_deleted_at_to_problem_notes.rb +8 -0
  42. data/db/migrate/20191105095304_update_views_to_exclude_deleted_sessions.rb +12 -0
  43. data/db/migrate/20191108105923_add_named_consultant_to_patients.rb +11 -0
  44. data/db/views/reporting_hd_blood_pressures_audit_v02.sql +80 -0
  45. data/lib/renalware/version.rb +1 -1
  46. data/spec/factories/system/users.rb +4 -0
  47. data/spec/support/pages/clinical/profile_page.rb +28 -0
  48. metadata +10 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b93f9d4c837438e01bbb281d1a8a81046ae012697e1f6906cb008e401162cb0
4
- data.tar.gz: 474cf5ccd494cbcf535ca7d11dee7e96bb1675f023dda2327b8fbe8a74d80fa2
3
+ metadata.gz: a8947eece7d110e83bf494a41fd4f0c72fc654ca830236c6207abdd151d5d556
4
+ data.tar.gz: f7717b64d5286fcc533e247fd278653851f79c263fb928fa136f11630ccaa9dd
5
5
  SHA512:
6
- metadata.gz: a6d2790007b3bcf1f1173c421f8b0060c0b40345bb0323e5893dc83e3d39164e4c1e5653d9acf15d0b3ac163664fcc9f8a68e4b4a4df416e05c5d8a8c73d5240
7
- data.tar.gz: b82938bbc38a637773a7999da0f416b98050a7efa56848f18e2741fb084b167e91900b836b99a50db736b7e07b3af75f666d5d51041d2f32ded7fae957289914
6
+ metadata.gz: 504ea58c9804a3f70209bac95fd4daa8f494fb0a3e78ef3b5bebdbda6a12d7efbd930590c2d69f0cdb31b36f0f4316834842866dc3c87f365a70335af389b9fa
7
+ data.tar.gz: 4fd87df55586b2a7043baef87043986d7791b5d3a9b3f16228fab25235b1837e3d686d3eefca9b4969c42140f69c6614efdc8f39e30a0d394dcb44fcaf953b86
data/Rakefile CHANGED
@@ -51,6 +51,12 @@ namespace :yarn do
51
51
  end
52
52
  end
53
53
 
54
+ namespace :webpacker do
55
+ task :compile do
56
+ Rake::Task["app:renalware:webpacker_compile"].invoke
57
+ end
58
+ end
59
+
54
60
  # Default rake task to run all tests:
55
61
  # bundle exec rake
56
62
  task :engine_default_task do
@@ -17,26 +17,24 @@ module Renalware
17
17
  end
18
18
 
19
19
  def edit
20
- load_user
20
+ render locals: { user: find_and_authorize_user }
21
21
  end
22
22
 
23
23
  def update
24
- load_user
25
-
26
- if update_user.call(update_params)
24
+ user = find_and_authorize_user
25
+ if System::UpdateUser.new(user).call(update_params)
27
26
  redirect_to admin_users_path,
28
27
  notice: t(".success", model_name: "user")
29
28
  else
30
29
  flash.now[:error] = t(".failed", model_name: "user")
31
- render :edit
30
+ render :edit, locals: { user: user }
32
31
  end
33
32
  end
34
33
 
35
34
  private
36
35
 
37
- def load_user
38
- @user = User.find(params[:id])
39
- authorize @user
36
+ def find_and_authorize_user
37
+ User.find(params[:id]).tap { |user_| authorize user_ }
40
38
  end
41
39
 
42
40
  def update_params
@@ -45,15 +43,19 @@ module Renalware
45
43
  end
46
44
 
47
45
  def user_params
48
- params.require(:user).permit(:approved, :unexpire, :telephone, role_ids: [])
46
+ params
47
+ .require(:user)
48
+ .permit(
49
+ :approved,
50
+ :unexpire,
51
+ :telephone,
52
+ :consultant,
53
+ role_ids: []
54
+ )
49
55
  end
50
56
 
51
57
  def role_ids
52
58
  (user_params[:role_ids] || []).reject(&:blank?)
53
59
  end
54
-
55
- def update_user
56
- @update_user ||= System::UpdateUser.new(@user)
57
- end
58
60
  end
59
61
  end
@@ -4,6 +4,7 @@ require_dependency "renalware/clinical"
4
4
 
5
5
  module Renalware
6
6
  module Clinical
7
+ # Note that there is no concrete Clinical::Profile, most data here is persisted in the patient
7
8
  class ProfilesController < Clinical::BaseController
8
9
  def show
9
10
  authorize patient
@@ -31,24 +32,28 @@ module Renalware
31
32
  private
32
33
 
33
34
  def update_patient
35
+ patient.named_consultant_id = profile_params[:named_consultant_id]
34
36
  document = patient.document
37
+
35
38
  %i(diabetes history).each do |document_attribute|
36
39
  document.send(
37
40
  :"#{document_attribute}=",
38
- profile_params[document_attribute].symbolize_keys
41
+ profile_params[:document][document_attribute].symbolize_keys
39
42
  )
40
43
  end
41
- patient.by = current_user
42
- patient.save!
44
+ patient.save_by! current_user
43
45
  end
44
46
 
45
47
  def profile_params
46
48
  params
47
49
  .require(:clinical_profile)
48
50
  .permit(
49
- diabetes: %i(diagnosis diagnosed_on),
50
- history: %i(alcohol smoking))
51
- .to_h
51
+ :named_consultant_id,
52
+ document: {
53
+ diabetes: %i(diagnosis diagnosed_on),
54
+ history: %i(alcohol smoking)
55
+ }
56
+ ).to_h
52
57
  end
53
58
  end
54
59
  end
@@ -69,6 +69,7 @@ module Renalware
69
69
  session = Session.for_patient(patient).find(params[:id])
70
70
  authorize session
71
71
  session.destroy!
72
+ regenerate_rolling_hd_statistics
72
73
  message = t(".success", model_name: "HD session")
73
74
  redirect_to patient_hd_dashboard_path(patient), notice: message
74
75
  end
@@ -145,6 +146,10 @@ module Renalware
145
146
  .fetch(:document, nil)
146
147
  .try(:permit!)
147
148
  end
149
+
150
+ def regenerate_rolling_hd_statistics
151
+ Delayed::Job.enqueue UpdateRollingPatientStatisticsDjJob.new(patient.id)
152
+ end
148
153
  end
149
154
  # rubocop:enable Metrics/ClassLength
150
155
  end
@@ -24,7 +24,7 @@ module Renalware
24
24
  # = sort_link(<url>, :cre_date, "CRE date")
25
25
  #
26
26
  def self.extended(base)
27
- %i(hgb ure cre urr phos pth).each do |code|
27
+ %i(hgb ure cre urr phos pthi pot).each do |code|
28
28
  base.ransacker(code) { pathology_result_sort_predicate(code) }
29
29
  base.ransacker(:"#{code}_date") { pathology_date_sort_predicate(code) }
30
30
  end
@@ -134,6 +134,12 @@ module Renalware
134
134
  patient_id_list.split("^").first
135
135
  end
136
136
 
137
+ def nhs_number
138
+ return unless defined?(patient_id)
139
+
140
+ patient_id.split("^").first
141
+ end
142
+
137
143
  def name
138
144
  Name.new(patient_name)
139
145
  end
@@ -6,6 +6,7 @@ module Renalware
6
6
  module HD
7
7
  class PrescriptionAdministration < ApplicationRecord
8
8
  include Accountable
9
+ acts_as_paranoid
9
10
  attr_accessor :administrator_authorisation_token
10
11
  attr_accessor :witness_authorisation_token
11
12
 
@@ -10,6 +10,8 @@ module Renalware
10
10
  include Accountable
11
11
  include ExplicitStateModel
12
12
 
13
+ acts_as_paranoid
14
+
13
15
  # Prevent instances of this of this base class from being saved
14
16
  validates :type, presence: true
15
17
 
@@ -5,15 +5,12 @@ require_dependency "renalware/pathology"
5
5
  module Renalware
6
6
  module Pathology
7
7
  class ObservationForPatientObservationDescriptionQuery
8
- def initialize(patient, observation_description)
9
- @patient = patient
10
- @observation_description = observation_description
11
- end
8
+ pattr_initialize :patient, :observation_description
12
9
 
13
10
  def call
14
- @patient
11
+ patient
15
12
  .observations
16
- .where(description: @observation_description)
13
+ .where(description: observation_description)
17
14
  .order(observed_at: :desc)
18
15
  .first
19
16
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/pathology"
4
+
5
+ module Renalware
6
+ module Pathology
7
+ class ObservationForPatientObservationDescriptionUsingSetQuery
8
+ pattr_initialize :patient, :observation_description
9
+
10
+ # Fetches the patient's most recent observation for the supplied observation_description.code
11
+ # (eg 'HGB') using the patient's current_observation_set jsonb hash and returnd something
12
+ # like { "result" => "123", "observed_on" => "2019-01-01" }
13
+ def call
14
+ return {} unless patient.current_observation_set
15
+
16
+ patient.current_observation_set.values.fetch(observation_description.code, {})
17
+ end
18
+ end
19
+ end
20
+ end
@@ -36,23 +36,21 @@ module Renalware
36
36
  end
37
37
 
38
38
  class PatientGlobalRuleDecision
39
- def initialize(patient, rule)
40
- @patient = patient
41
- @rule = rule
42
- end
39
+ pattr_initialize :patient, :rule
40
+ delegate :param_comparison_operator, :param_comparison_value, :param_id, to: :rule
43
41
 
44
42
  def observation_required_for_patient?
45
- return true if observation.nil?
43
+ return true if observation.blank?
46
44
 
47
- if [">", "<", ">=", "<="].include?(@rule.param_comparison_operator)
48
- observation.result.to_i.send(
49
- @rule.param_comparison_operator.to_sym,
50
- @rule.param_comparison_value.to_i
45
+ if [">", "<", ">=", "<="].include?(rule.param_comparison_operator)
46
+ observation.to_i.send(
47
+ param_comparison_operator.to_sym,
48
+ param_comparison_value.to_i
51
49
  )
52
50
  else
53
- observation.result.send(
54
- @rule.param_comparison_operator.to_sym,
55
- @rule.param_comparison_value
51
+ observation.send(
52
+ param_comparison_operator.to_sym,
53
+ param_comparison_value
56
54
  )
57
55
  end
58
56
  end
@@ -60,15 +58,23 @@ module Renalware
60
58
  private
61
59
 
62
60
  def observation
63
- @observation ||=
64
- ObservationForPatientObservationDescriptionQuery.new(
65
- @patient,
61
+ @observation ||= begin
62
+ # This fetches the observation from the patient.current_observation_set jsonb hash.
63
+ # The call returns eg { "result" => "123", "observed_on" => "2019-01-01" }
64
+ ObservationForPatientObservationDescriptionUsingSetQuery.new(
65
+ patient,
66
66
  observation_description
67
- ).call
67
+ ).call["result"]
68
+
69
+ # ObservationForPatientObservationDescriptionQuery.new(
70
+ # @patient,
71
+ # observation_description
72
+ # ).call&.result
73
+ end
68
74
  end
69
75
 
70
76
  def observation_description
71
- @observation_description ||= ObservationDescription.new(id: @rule.param_id)
77
+ rule.observation_description ||= ObservationDescription.new(id: param_id)
72
78
  end
73
79
  end
74
80
  end
@@ -10,7 +10,7 @@ module Renalware
10
10
  validate :drug_present
11
11
 
12
12
  def observation_required_for_patient?(patient, _date)
13
- patient.drugs.include?(drug)
13
+ patient.drugs.exists?(id: param_id)
14
14
  end
15
15
 
16
16
  def to_s
@@ -24,7 +24,7 @@ module Renalware
24
24
  end
25
25
 
26
26
  def drug_present
27
- return if drug.present?
27
+ return if Drugs::Drug.exists?(id: param_id)
28
28
 
29
29
  errors.add(:param_id, "param_id must be the id of a Drug")
30
30
  end
@@ -10,7 +10,7 @@ module Renalware
10
10
  validate :drug_category_present
11
11
 
12
12
  def observation_required_for_patient?(patient, _date)
13
- (patient.drugs.map(&:id) & drug_ids).any?
13
+ (patient.drugs.pluck(&:id) & drug_ids).any?
14
14
  end
15
15
 
16
16
  def to_s
@@ -20,7 +20,7 @@ module Renalware
20
20
  private
21
21
 
22
22
  def drug_ids
23
- drug_category.drugs.map(&:id)
23
+ drug_category.drugs.pluck(&:id)
24
24
  end
25
25
 
26
26
  def drug_category
@@ -10,7 +10,12 @@ module Renalware
10
10
  validate :drug_type_present
11
11
 
12
12
  def observation_required_for_patient?(patient, _date)
13
- patient.drugs.flat_map(&:drug_types).include?(drug_type)
13
+ patient
14
+ .drugs
15
+ .select(:id)
16
+ .joins(:classifications)
17
+ .where("drug_types_drugs.drug_type_id = ?", param_id)
18
+ .count > 0
14
19
  end
15
20
 
16
21
  def to_s
@@ -24,7 +29,7 @@ module Renalware
24
29
  end
25
30
 
26
31
  def drug_type_present
27
- return if drug_type.present?
32
+ return if Drugs::Type.exists?(param_id)
28
33
 
29
34
  errors.add(:param_id, "param_id must be the id of a DrugType")
30
35
  end
@@ -7,12 +7,7 @@ module Renalware
7
7
  class PatientRuleSetDecision
8
8
  OBSERVATION_REQUIRED = true
9
9
  OBSERVATION_NOT_REQUIRED = false
10
-
11
- def initialize(patient, rule_set, date)
12
- @rule_set = rule_set
13
- @patient = patient
14
- @date = date
15
- end
10
+ pattr_initialize :patient, :rule_set, :date
16
11
 
17
12
  # NOTE: Decide if a rule_set applies to a patient
18
13
  def call
@@ -32,26 +27,26 @@ module Renalware
32
27
  def last_observation_too_recent?
33
28
  return false if last_observation.nil?
34
29
 
35
- observed_days_ago = @date - last_observation.observed_on
36
- !@rule_set.frequency.observation_required?(observed_days_ago)
30
+ observed_days_ago = date - last_observation.observed_on
31
+ !rule_set.frequency.observation_required?(observed_days_ago)
37
32
  end
38
33
 
39
34
  def last_request_still_being_processed?
40
35
  return false if last_request.nil? || last_request_has_an_observation_result?
41
36
 
42
- expiration_days = @rule_set.request_description.expiration_days
37
+ expiration_days = rule_set.request_description.expiration_days
43
38
  return false if expiration_days == 0
44
39
 
45
40
  # This subtraction works because ActiveSupport::TimeWithZone works in days
46
41
  # e.g. TimeWithZone1 - TimeWithZone2 = 3 days
47
- requested_days_ago = @date - last_request.requested_on
42
+ requested_days_ago = date - last_request.requested_on
48
43
  requested_days_ago < expiration_days
49
44
  end
50
45
 
51
46
  def required_from_rules?
52
- @rule_set
47
+ rule_set
53
48
  .rules
54
- .map { |rule| rule.observation_required_for_patient?(@patient, @date) }
49
+ .map { |rule| rule.observation_required_for_patient?(patient, date) }
55
50
  .all?
56
51
  end
57
52
 
@@ -64,16 +59,16 @@ module Renalware
64
59
  def last_observation
65
60
  @last_observation ||=
66
61
  ObservationForPatientRequestDescriptionQuery.new(
67
- @patient,
68
- @rule_set.request_description
62
+ patient,
63
+ rule_set.request_description
69
64
  ).call
70
65
  end
71
66
 
72
67
  def last_request
73
68
  @last_request ||=
74
69
  RequestForPatientRequestDescriptionQuery.new(
75
- @patient,
76
- @rule_set.request_description
70
+ patient,
71
+ rule_set.request_description
77
72
  ).call
78
73
  end
79
74
  end
@@ -6,10 +6,7 @@ module Renalware
6
6
  module Pathology
7
7
  module Requests
8
8
  class RequestFactory
9
- def initialize(patient, params)
10
- @patient = patient
11
- @params = params
12
- end
9
+ pattr_initialize :patient, :params
13
10
 
14
11
  def build
15
12
  Request.new(request_params)
@@ -19,24 +16,24 @@ module Renalware
19
16
 
20
17
  def request_params
21
18
  {
22
- patient: @patient,
23
- clinic: @params[:clinic],
24
- consultant: @params[:consultant],
25
- telephone: @params[:telephone],
26
- template: @params[:template],
19
+ patient: patient,
20
+ clinic: params[:clinic],
21
+ consultant: params[:consultant],
22
+ telephone: params[:telephone],
23
+ template: params[:template],
27
24
  request_descriptions: request_descriptions,
28
25
  patient_rules: patient_rules,
29
- high_risk: @patient.high_risk?,
30
- by: @params[:by]
26
+ high_risk: patient.high_risk?,
27
+ by: params[:by]
31
28
  }
32
29
  end
33
30
 
34
31
  def request_descriptions
35
- @patient.required_observation_requests(@params[:clinic])
32
+ patient.required_observation_requests(params[:clinic])
36
33
  end
37
34
 
38
35
  def patient_rules
39
- @patient.required_patient_pathology
36
+ patient.required_patient_pathology
40
37
  end
41
38
  end
42
39
  end
@@ -6,14 +6,11 @@ module Renalware
6
6
  module Pathology
7
7
  module Requests
8
8
  class RequestsFactory
9
- def initialize(patients, params)
10
- @patients = patients
11
- @params = params
12
- end
9
+ pattr_initialize :patients, :params
13
10
 
14
11
  def build
15
- @patients.map do |patient|
16
- RequestFactory.new(patient, @params).build
12
+ patients.map do |patient|
13
+ RequestFactory.new(patient, params).build
17
14
  end
18
15
  end
19
16
  end
@@ -45,6 +45,7 @@ module Renalware
45
45
  belongs_to :country_of_birth, class_name: "System::Country"
46
46
  belongs_to :religion, class_name: "Patients::Religion"
47
47
  belongs_to :language, class_name: "Patients::Language"
48
+ belongs_to :named_consultant, class_name: "User"
48
49
  has_many :bookmarks, class_name: "Patients::Bookmark"
49
50
  has_many :alerts, class_name: "Patients::Alert"
50
51
  has_one :worry, class_name: "Patients::Worry"
@@ -35,15 +35,15 @@ module Renalware
35
35
  attr_reader :mapper_factory
36
36
 
37
37
  def call
38
- # For now skip updating the patient, just update the index ie create/update a
39
- # patient abridgement
40
- # update_patient_if_exists
38
+ update_patient_if_exists
41
39
  UpdateMasterPatientIndex.new(message).call
42
40
  end
43
41
 
44
42
  private
45
43
 
46
44
  def update_patient_if_exists
45
+ return if ENV.key?("ADT_SKIP_UPDATE_PATIENT")
46
+
47
47
  patient = find_patient
48
48
  return if patient.blank?
49
49
 
@@ -30,9 +30,9 @@ module Renalware
30
30
 
31
31
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
32
32
  def map_attributes
33
- patient.attributes = {
33
+ attrs = {
34
34
  local_patient_id: patient_identification.internal_id,
35
- nhs_number: patient_identification.external_id,
35
+ nhs_number: patient_identification.nhs_number,
36
36
  given_name: patient_identification.given_name,
37
37
  family_name: patient_identification.family_name,
38
38
  suffix: patient_identification.suffix,
@@ -43,6 +43,28 @@ module Renalware
43
43
  practice: find_practice(message.practice_code) || patient.practice,
44
44
  primary_care_physician: find_primary_care_physician(message.gp_code)
45
45
  }
46
+
47
+ # Don't overwrite existing patient data if the new data is blank?
48
+ attrs.reject! { |_key, value| value.blank? }
49
+ patient.attributes = attrs
50
+
51
+ # patient.given_name = patient_identification.given_name
52
+ # patient.family_name = patient_identification.family_name
53
+ # patient.suffix = patient_identification.suffix
54
+ # patient.title = patient_identification.title
55
+ # patient.attributes = {
56
+ # local_patient_id: patient_identification.internal_id,
57
+ # nhs_number: patient_identification.nhs_number,
58
+ # given_name: patient_identification.given_name,
59
+ # family_name: patient_identification.family_name,
60
+ # suffix: patient_identification.suffix,
61
+ # title: patient_identification.title,
62
+ # born_on: Time.zone.parse(patient_identification.dob)&.to_date,
63
+ # died_on: Time.zone.parse(patient_identification.death_date)&.to_date,
64
+ # sex: patient_identification.sex,
65
+ # practice: find_practice(message.practice_code) || patient.practice,
66
+ # primary_care_physician: find_primary_care_physician(message.gp_code)
67
+ # }
46
68
  patient.build_current_address if patient.current_address.blank?
47
69
  patient.current_address.attributes = {
48
70
  street_1: address[0],
@@ -20,8 +20,6 @@ module Renalware
20
20
 
21
21
  @rw_patient = find_patient_in_renalware
22
22
  update_or_create_abridged_patient
23
- # update_primary_care_physician
24
- # update_practice
25
23
  end
26
24
 
27
25
  private
@@ -32,9 +30,10 @@ module Renalware
32
30
  ) || NullObject.instance
33
31
  end
34
32
 
35
- # rubocop:disable Metrics/AbcSize
33
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
36
34
  def update_or_create_abridged_patient
37
35
  find_or_initialize_abridged_patient.update!(
36
+ nhs_number: patient_identification.nhs_number,
38
37
  given_name: patient_identification.given_name,
39
38
  family_name: patient_identification.family_name,
40
39
  sex: patient_identification.sex,
@@ -47,7 +46,7 @@ module Renalware
47
46
  gp_code: hl7_message.gp_code
48
47
  )
49
48
  end
50
- # rubocop:enable Metrics/AbcSize
49
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
51
50
 
52
51
  def find_or_initialize_abridged_patient
53
52
  Patients::Abridgement.find_or_initialize_by(
@@ -6,10 +6,14 @@ module Renalware
6
6
  module Problems
7
7
  class Note < ApplicationRecord
8
8
  include Accountable
9
+ acts_as_paranoid
10
+ alias archived? deleted?
9
11
 
10
12
  belongs_to :problem, touch: true
11
13
 
12
14
  scope :ordered, -> { order(created_at: :asc) }
15
+ scope :archived, -> { only_deleted }
16
+ scope :with_archived, -> { with_deleted }
13
17
 
14
18
  validates :description, presence: true
15
19
 
@@ -24,6 +24,7 @@ module Renalware
24
24
  User.transaction do
25
25
  approve if can_approve?(params)
26
26
  unexpire if can_unexpire?(params)
27
+ user.consultant = true?(params[:consultant])
27
28
  authorise(params)
28
29
  user.telephone = params[:telephone]
29
30
  user.save!
@@ -37,6 +37,7 @@ module Renalware
37
37
  .distinct("roles_users.user_id")
38
38
  .where("roles_users.user_id is null")
39
39
  }
40
+ scope :consultants, -> { where(consultant: true).excluding_system_user.ordered }
40
41
 
41
42
  # Non-persistent attribute to signify we want to use extended validation.
42
43
  # We need to refactor this by ising a form object for updating a user.
@@ -8,7 +8,9 @@ module Renalware
8
8
  end
9
9
 
10
10
  def edit?
11
- !record.immutable?
11
+ return false unless record.persisted?
12
+
13
+ user_is_super_admin? || !record.immutable?
12
14
  end
13
15
  end
14
16
  end
@@ -8,7 +8,9 @@ module Renalware
8
8
  end
9
9
 
10
10
  def edit?
11
- record.persisted? && !record.immutable?
11
+ return false unless record.persisted?
12
+
13
+ user_is_super_admin? || !record.immutable?
12
14
  end
13
15
  end
14
16
  end
@@ -1,47 +1,52 @@
1
1
  = within_admin_layout(title: "Edit",
2
2
  breadcrumbs: breadcrumb_for("Users", admin_users_path)) do
3
3
 
4
- h2= @user
4
+ h2= user
5
5
 
6
- = simple_form_for @user,
6
+ = simple_form_for user,
7
7
  html: { autocomplete: "off" },
8
- url: admin_user_path(@user) do |f|
8
+ url: admin_user_path(user) do |f|
9
9
  = f.input :approved, as: :hidden, input_html: { value: true }
10
10
 
11
- - if @user.errors.any?
11
+ - if user.errors.any?
12
12
  ul.error-messages
13
- - @user.errors.full_messages.each do |msg|
13
+ - user.errors.full_messages.each do |msg|
14
14
  li= msg
15
15
 
16
- - if @user.expired?
16
+ - if user.expired?
17
17
  .row
18
18
  = check_box_tag "user[unexpire]", true, false, class: "inline"
19
19
  = label_tag :user_unexpire, "Reactivate account"
20
20
 
21
21
  span
22
22
  | Requested write access: &nbsp;
23
- = yes_no(@user.asked_for_write_access)
23
+ = yes_no(user.asked_for_write_access)
24
24
 
25
25
  br
26
26
  br
27
27
  - Renalware::Role.all.order(id: :asc).each_with_index do |role, index|
28
28
  - element_id = "user_role_ids_#{index}"
29
- - policy = Pundit.policy(current_user, @user)
29
+ - policy = Pundit.policy(current_user, user)
30
30
  = check_box_tag "user[role_ids][]",
31
31
  role.id,
32
- @user.has_role?(role.name),
32
+ user.has_role?(role.name),
33
33
  disabled: !(policy.assign_role?(role)),
34
34
  id: element_id,
35
35
  class: "inline"
36
36
  = label_tag element_id, role.name.humanize
37
37
  br
38
- br
39
38
 
40
39
  = f.input :telephone,
41
40
  input_html: { class: "input small" },
42
41
  wrapper: :horizontal_small
43
42
 
44
- - msg = @user.approved? ? "Update" : "Approve"
43
+ = f.input :consultant,
44
+ as: :boolean,
45
+ checked_value: "true",
46
+ unchecked_value: "false",
47
+ wrapper: :horizontal_small
48
+
49
+ - msg = user.approved? ? "Update" : "Approve"
45
50
  = f.submit msg, class: "button"
46
51
  span= " or "
47
52
  = link_to "cancel", admin_users_path
@@ -19,6 +19,7 @@
19
19
  th.col-width-small Requested write access
20
20
  th.col-width-medium Role
21
21
  th.col-width-tiny= sort_link(user_search, :approved, "Approved")
22
+ th.col-width-tiny= sort_link(user_search, :consultant, "Consultant")
22
23
  th.col-width-date= sort_link(user_search, :expired_at, "Expired On")
23
24
  th.col-width-date-time.show-for-large-up= sort_link(user_search, :current_sign_in_at, "Current sign in")
24
25
  th.col-width-date-time.show-for-large-up= sort_link(user_search, :last_sign_in_at, "Last sign in")
@@ -47,6 +48,11 @@
47
48
  i.far.fa-check-square
48
49
  - else
49
50
  i.muted.unapproved.far.fa-square
51
+ td
52
+ - if user.consultant?
53
+ i.far.fa-check-square
54
+ - else
55
+ i.muted.unapproved.far.fa-square
50
56
  td.expired= l(user.expired_at&.to_date)
51
57
  td.show-for-large-up= l(user.current_sign_in_at)
52
58
  td.show-for-large-up= l(user.last_sign_in_at)
@@ -2,7 +2,7 @@
2
2
  breadcrumbs: breadcrumb_for("Clinical Profile", patient_clinical_profile_path)) do
3
3
 
4
4
  .row.document
5
- = simple_form_for patient.document,
5
+ = simple_form_for patient,
6
6
  url: patient_clinical_profile_path(patient),
7
7
  method: :patch,
8
8
  as: :clinical_profile,
@@ -12,19 +12,29 @@
12
12
  .columns.large-12
13
13
  article
14
14
  header
15
- h2 Diabetes
16
- .hint If YES, enter year of diagnosis
17
- = render_input f, :diabetes
15
+ h2 General
16
+ = f.association :named_consultant,
17
+ as: :user_picker,
18
+ collection: Renalware::User.consultants,
19
+ wrapper: :horizontal_medium
18
20
 
19
- article
20
- header
21
- h2 History
21
+ = f.simple_fields_for :document, patient.document do |fdoc|
22
+ .columns.large-12
23
+ article
24
+ header
25
+ h2 Diabetes
26
+ .hint If YES, enter year of diagnosis
27
+ = render_input fdoc, :diabetes
22
28
 
23
- = f.simple_fields_for :history, patient.document.history do |fd|
24
- = fd.input :alcohol, input_html: { class: "small-input" }
25
- = fd.input :smoking, input_html: { class: "small-input" }
29
+ article
30
+ header
31
+ h2 History
26
32
 
27
- .columns.large-12
28
- = submit_tag "Update", class: "button"
29
- span= " or "
30
- = link_to "Cancel", patient_clinical_profile_path(patient)
33
+ = fdoc.simple_fields_for :history, patient.document.history do |fh|
34
+ = fh.input :alcohol, input_html: { class: "small-input" }
35
+ = fh.input :smoking, input_html: { class: "small-input" }
36
+
37
+ .columns.large-12.form-actions
38
+ = submit_tag "Update", class: "button"
39
+ span= " or "
40
+ = link_to "Cancel", patient_clinical_profile_path(patient)
@@ -5,7 +5,11 @@
5
5
  .grid
6
6
  .row
7
7
  .columns.medium-6
8
+ = article_tag("General") do
9
+ = definition_list_for(patient) do |list|
10
+ = list.definition(:named_consultant)
8
11
 
12
+ .columns.medium-6
9
13
  article
10
14
  header
11
15
  h2 Diabetes
@@ -20,8 +20,10 @@ tr
20
20
  td= l(patient.current_observation_set.hgb_observed_at)
21
21
  td.show-for-xlarge-up= patient.current_observation_set.phos_result
22
22
  td.show-for-xlarge-up= l(patient.current_observation_set.phos_observed_at)
23
- td.show-for-xlarge-up= patient.current_observation_set.pth_result
24
- td.show-for-xlarge-up= l(patient.current_observation_set.pth_observed_at)
23
+ td.show-for-xlarge-up= patient.current_observation_set.pot_result
24
+ td.show-for-xlarge-up= l(patient.current_observation_set.pot_observed_at)
25
+ td.show-for-xlarge-up= patient.current_observation_set.pthi_result
26
+ td.show-for-xlarge-up= l(patient.current_observation_set.pthi_observed_at)
25
27
  td.show-for-xlarge-up= patient.current_observation_set.urr_result
26
28
  td.show-for-xlarge-up= l(patient.current_observation_set.urr_observed_at)
27
29
  td.actions= link_to t(".view"), view_proc.call(patient)
@@ -19,8 +19,10 @@ table#patients.mdm-patients.columns
19
19
  th.col-width-date= sort_link(path, :hgb_date, t(".hgb_date"))
20
20
  th.show-for-xlarge-up.col-width-tiny= sort_link(path, :phos, t(".phos"))
21
21
  th.show-for-xlarge-up.col-width-date= sort_link(path, :phos_date, t(".phos_date"))
22
- th.show-for-xlarge-up.col-width-tiny= sort_link(path, :pth, t(".pth"))
23
- th.show-for-xlarge-up.col-width-date= sort_link(path, :pth_date, t(".pth_date"))
22
+ th.show-for-xlarge-up.col-width-tiny= sort_link(path, :pot, t(".pot"))
23
+ th.show-for-xlarge-up.col-width-date= sort_link(path, :pot_date, t(".pot_date"))
24
+ th.show-for-xlarge-up.col-width-tiny= sort_link(path, :pthi, t(".pthi"))
25
+ th.show-for-xlarge-up.col-width-date= sort_link(path, :pthi_date, t(".pthi_date"))
24
26
  th.show-for-xlarge-up.col-width-tiny= sort_link(path, :urr, t(".urr"))
25
27
  th.show-for-xlarge-up.col-width-date= sort_link(path, :urr_date, t(".urr_date"))
26
28
  th.col-width-tiny
@@ -77,15 +77,18 @@ html
77
77
  section.consultant
78
78
  p
79
79
  b Consultant:
80
- span &nbsp;
80
+ / TODO: Move this logic to a presenter
81
+ - consultant = patient.named_consultant
82
+ - if consultant.present?
83
+ | &nbsp;&nbsp;
84
+ - name = consultant.signature.presence || consultant.to_s
85
+ = [name, consultant.professional_position].compact.join(", ")
86
+ - else
87
+ span &nbsp;
81
88
  section.signoff
82
89
  table
83
90
  tr
84
- td Prescriber:
85
- td
86
- td
87
- tr
88
- td.prescriber= [current_user.signature, current_user.professional_position].compact.join(", ")
91
+ td.prescriber Prescriber:
89
92
  td.signature Signature:
90
93
  td Date:
91
94
 
@@ -19,7 +19,7 @@
19
19
  th Notes
20
20
  th.col-width-date.wide
21
21
  = sort_link_if(treatable.sortable?, search, :prescribed_on, "Prescribed on")
22
- th Prescribed By
22
+ th Recorded By
23
23
  - unless current_scope
24
24
  th.col-width-date Terminated On
25
25
  th Terminated By
@@ -16,7 +16,7 @@ table#archived_problems.manual-stripes.auto-layout
16
16
  td
17
17
  = problem.description
18
18
  ol
19
- - problem.notes.each do |note|
19
+ - problem.notes.with_archived.each do |note|
20
20
  li= note.description
21
21
  td= l problem.updated_on
22
22
  td= problem.updated_by.full_name
@@ -30,10 +30,10 @@ en:
30
30
  urr_date: URR Date
31
31
  phos: PO4
32
32
  phos_date: PO4 Date
33
- pth: PTH
34
- pth_date: PTH Date
35
33
  pthi: PTHI
36
34
  pthi_date: PTHI Date
35
+ pot: POT
36
+ pot_date: POT Date
37
37
  cre: CRE
38
38
  cre_date: CRE Date
39
39
  egfr: EGFR
@@ -1,12 +1,8 @@
1
1
  class ChangePathRequestConsultantId < ActiveRecord::Migration[5.2]
2
2
  def change
3
3
  within_renalware_schema do
4
- remove_reference(
5
- :pathology_requests_requests,
6
- :consultant,
7
- foreign_key: { to_table: :users },
8
- index: true
9
- )
4
+ remove_column(:pathology_requests_requests, :consultant_id, :integer)
5
+
10
6
  add_reference(
11
7
  :pathology_requests_requests,
12
8
  :consultant,
@@ -0,0 +1,11 @@
1
+ class AddDeletedAtToHDSessions < ActiveRecord::Migration[5.2]
2
+ def change
3
+ within_renalware_schema do
4
+ add_column :hd_sessions, :deleted_at, :datetime
5
+ add_index :hd_sessions, :deleted_at
6
+
7
+ add_column :hd_prescription_administrations, :deleted_at, :datetime
8
+ add_index :hd_prescription_administrations, :deleted_at
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ class AddDeletedAtToProblemNotes < ActiveRecord::Migration[5.2]
2
+ def change
3
+ within_renalware_schema do
4
+ add_column :problem_notes, :deleted_at, :datetime
5
+ add_index :problem_notes, :deleted_at
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ class UpdateViewsToExcludeDeletedSessions < ActiveRecord::Migration[5.2]
2
+ def change
3
+ within_renalware_schema do
4
+ update_view(
5
+ :reporting_hd_blood_pressures_audit,
6
+ version: 2,
7
+ revert_to_version: 1,
8
+ materialized: true
9
+ )
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ class AddNamedConsultantToPatients < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_reference(
4
+ :patients,
5
+ :named_consultant,
6
+ foreign_key: { to_table: :users },
7
+ index: true,
8
+ null: true
9
+ )
10
+ end
11
+ end
@@ -0,0 +1,80 @@
1
+ /*
2
+ This is just a starter for 10 equivalent for the HaemoBPaudit4 audit.
3
+ Lots missing for example
4
+ - only do this for the last 30 days?
5
+ - selecting patients with a current modality of HD
6
+ - filtering out null or 0 bps
7
+ - the 140 130 etc percentages
8
+ */
9
+
10
+ WITH
11
+ blood_pressures AS (
12
+ SELECT
13
+ hd_sessions.id as session_id,
14
+ patients.id as patient_id,
15
+ hd_sessions.hospital_unit_id,
16
+ hd_sessions.document->'observations_before'->'blood_pressure'->>'systolic' as systolic_pre,
17
+ hd_sessions.document->'observations_before'->'blood_pressure'->>'diastolic' as diastolic_pre,
18
+ hd_sessions.document->'observations_after'->'blood_pressure'->>'systolic' as systolic_post,
19
+ hd_sessions.document->'observations_after'->'blood_pressure'->>'diastolic' as diastolic_post
20
+ FROM hd_sessions
21
+ INNER JOIN patients on patients.id = hd_sessions.patient_id
22
+ WHERE hd_sessions.signed_off_at IS NOT NULL
23
+ AND hd_sessions.deleted_at IS NULL
24
+ ),
25
+ some_other_derived_table_variable AS (
26
+ SELECT 1 FROM blood_pressures
27
+ )
28
+ SELECT
29
+ hu.name as hospital_unit_name,
30
+ ROUND(AVG(systolic_pre::int)) as systolic_pre_avg,
31
+ ROUND(AVG(diastolic_pre::int)) as diastolic_pre_avg,
32
+ ROUND(AVG(systolic_post::int)) as systolic_post_avg,
33
+ ROUND(AVG(diastolic_post::int)) as distolic_post_avg
34
+ FROM blood_pressures
35
+ INNER JOIN hospital_units as hu on hu.id = blood_pressures.hospital_unit_id
36
+ GROUP BY hu.name
37
+
38
+ /*
39
+ Here is the original for reference
40
+ use audits;
41
+ DROP TABLE IF EXISTS hdbpdata;
42
+ DROP TABLE IF EXISTS hdpatbpavg;
43
+ DROP TABLE IF EXISTS hdpatbpsite;
44
+ DROP TABLE IF EXISTS HDpatBPsitemain;
45
+ SET @mintotal=6;
46
+ CREATE TEMPORARY TABLE hdbpdata SELECT hdsesszid, modalsite as currsite, sex,
47
+ year(CURDATE())-year(birthdate) as age, syst_pre, syst_post, diast_pre, diast_post FROM
48
+ renalware.hdsessiondata JOIN renalware.patientdata ON hdsesszid=patzid WHERE DATEDIFF(CURDATE(),
49
+ hdsessdate)<30 and patientdata.modalcode LIKE '%HD%';
50
+ CREATE TABLE hdpatbpavg as SELECT hdsesszid, currsite, ROUND(AVG(syst_pre),0) as avgpresyst,
51
+ ROUND(AVG(syst_post),0) as avgpostsyst, ROUND(AVG(diast_pre),0) as avgprediast,
52
+ ROUND(AVG(diast_post),0) as avgpostdiast, syst_pre, syst_post, diast_pre, diast_post FROM hdbpdata
53
+ GROUP BY hdsesszid;
54
+ CREATE TABLE hdpatbpsite as SELECT currsite as currentsite, count(hdsesszid) as patcount,
55
+ ROUND(AVG(avgpresyst),0) as presyst_avg,
56
+ round(100*(sum(IF(syst_pre<140, '1','0'))/count(hdsesszid)),1) as pctpresysless140,
57
+ ROUND(AVG(avgpostsyst),0) as postsys_avg,
58
+ round(100*(sum(IF(syst_post<130, '1','0'))/count(hdsesszid)),1) as pctpostsysless130,
59
+ ROUND(AVG(avgprediast),0) as prediast_avg,
60
+ round(100*(sum(IF(diast_pre<90, '1','0'))/count(hdsesszid)),1) as pctprediastless90,
61
+ ROUND(AVG(avgpostdiast),0) as postdiast_avg,
62
+ round(100*(sum(IF(diast_post<80, '1','0'))/count(hdsesszid)),1) as pctpostdiastless80
63
+ FROM hdpatbpavg GROUP BY currentsite
64
+ UNION
65
+ SELECT 'Total', count(hdsesszid) as patcount, ROUND(AVG(avgpresyst),0) as presyst_avg,
66
+ round(100*(sum(IF(syst_pre<140, '1','0'))/count(hdsesszid)),1) as pctpresysless140,
67
+ ROUND(AVG(avgpostsyst),0) as postsys_avg,
68
+ round(100*(sum(IF(syst_post<130, '1','0'))/count(hdsesszid)),1) as pctpostsysless130,
69
+ ROUND(AVG(avgprediast),0) as prediast_avg,
70
+ round(100*(sum(IF(diast_pre<90, '1','0'))/count(hdsesszid)),1) as pctprediastless90,
71
+ ROUND(AVG(avgpostdiast),0) as postdiast_avg,
72
+ round(100*(sum(IF(diast_post<80, '1','0'))/count(hdsesszid)),1) as pctpostdiastless80
73
+ FROM hdpatbpavg;
74
+ Create TABLE HDpatBPsitemain as select * from hdpatbpsite WHERE patcount>@mintotal
75
+ ORDER BY patcount DESC;
76
+ UPDATE auditslist SET lastrun=NOW() WHERE auditcode='hdbpaudit';
77
+ DROP TABLE IF EXISTS hdbpdata;
78
+ DROP TABLE IF EXISTS hdpatbpavg;
79
+ DROP TABLE IF EXISTS hdpatbpsite;
80
+ */
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Renalware
4
- VERSION = "2.0.121"
4
+ VERSION = "2.0.123"
5
5
  end
@@ -29,6 +29,10 @@ FactoryBot.define do
29
29
  user.roles << create(:role, obj.role) if obj.role.present?
30
30
  end
31
31
 
32
+ trait :consultant do
33
+ consultant { true }
34
+ end
35
+
32
36
  trait :unapproved do
33
37
  approved { false }
34
38
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../page_object"
4
+
5
+ module Pages
6
+ module Clinical
7
+ class ProfilePage < Pages::PageObject
8
+ pattr_initialize :patient
9
+
10
+ def edit
11
+ visit patient_clinical_profile_path(patient)
12
+ within ".page-actions" do
13
+ click_on "Edit"
14
+ end
15
+ end
16
+
17
+ def save
18
+ within ".form-actions" do
19
+ find('input[name="commit"]').click
20
+ end
21
+ end
22
+
23
+ def named_consultant=(user)
24
+ select user.to_s, from: "Named consultant"
25
+ end
26
+ end
27
+ end
28
+ 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.121
4
+ version: 2.0.123
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airslie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-04 00:00:00.000000000 Z
11
+ date: 2019-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview-component
@@ -1697,6 +1697,7 @@ files:
1697
1697
  - app/models/renalware/pathology/observation_descriptions_by_code_query.rb
1698
1698
  - app/models/renalware/pathology/observation_digest.rb
1699
1699
  - app/models/renalware/pathology/observation_for_patient_observation_description_query.rb
1700
+ - app/models/renalware/pathology/observation_for_patient_observation_description_using_set_query.rb
1700
1701
  - app/models/renalware/pathology/observation_for_patient_request_description_query.rb
1701
1702
  - app/models/renalware/pathology/observation_request.rb
1702
1703
  - app/models/renalware/pathology/observation_requests_attributes_builder.rb
@@ -1749,7 +1750,7 @@ files:
1749
1750
  - app/models/renalware/pathology/requests/requests_factory.rb
1750
1751
  - app/models/renalware/pathology/requests/sample_type.rb
1751
1752
  - app/models/renalware/pathology/results.rb
1752
- - app/models/renalware/pathology/view_observation_results.rb
1753
+ - app/models/renalware/pathology/view_observation_results.rb.dead
1753
1754
  - app/models/renalware/patient.rb
1754
1755
  - app/models/renalware/patients.rb
1755
1756
  - app/models/renalware/patients/abridgement.rb
@@ -3691,6 +3692,10 @@ files:
3691
3692
  - db/migrate/20191012121433_add_consultant_to_users.rb
3692
3693
  - db/migrate/20191018143635_create_hd_diary_matrix_view.rb
3693
3694
  - db/migrate/20191018144917_create_fn_to_archive_master_slots.rb
3695
+ - db/migrate/20191026120029_add_deleted_at_to_hd_sessions.rb
3696
+ - db/migrate/20191029095202_add_deleted_at_to_problem_notes.rb
3697
+ - db/migrate/20191105095304_update_views_to_exclude_deleted_sessions.rb
3698
+ - db/migrate/20191108105923_add_named_consultant_to_patients.rb
3694
3699
  - db/seeds.rb
3695
3700
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.csv
3696
3701
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.rb
@@ -3808,6 +3813,7 @@ files:
3808
3813
  - db/views/reporting_daily_pathology_v03.sql
3809
3814
  - db/views/reporting_daily_ukrdc_v01.sql
3810
3815
  - db/views/reporting_hd_blood_pressures_audit_v01.sql
3816
+ - db/views/reporting_hd_blood_pressures_audit_v02.sql
3811
3817
  - db/views/reporting_hd_overall_audit_v01.sql
3812
3818
  - db/views/reporting_hd_overall_audit_v02.sql
3813
3819
  - db/views/reporting_hd_overall_audit_v04.sql
@@ -4049,6 +4055,7 @@ files:
4049
4055
  - spec/support/matchers/have_pdf_page_text.rb
4050
4056
  - spec/support/matchers/validate_timeliness_of.rb
4051
4057
  - spec/support/pages/admissions/consults_page.rb
4058
+ - spec/support/pages/clinical/profile_page.rb
4052
4059
  - spec/support/pages/letters/form.rb
4053
4060
  - spec/support/pages/letters/patient_letters.rb
4054
4061
  - spec/support/pages/medications/prescription_fom.rb