renalware-core 2.0.121 → 2.0.123

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 (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