renalware-core 2.0.18 → 2.0.20
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.
- checksums.yaml +4 -4
- data/app/controllers/renalware/events/events_controller.rb +1 -1
- data/app/jobs/renalware/hd/generate_monthly_statistics_job.rb +1 -1
- data/app/mailers/renalware/letters/delivery/errors.rb +1 -1
- data/app/mailers/renalware/letters/delivery/practice_mailer.rb +5 -1
- data/app/models/concerns/renalware/letters/letter_pathology.rb +0 -2
- data/app/models/renalware/admissions/consult_query.rb +1 -0
- data/app/models/renalware/hd/generate_monthly_statistics_for_patient.rb +37 -0
- data/app/models/renalware/letters/delivery/email_letter_to_practice.rb +10 -1
- data/app/models/renalware/renal/aki_alert_query.rb +1 -0
- data/app/presenters/renalware/letters/practice_email_meta_data.rb +5 -0
- data/app/views/renalware/admissions/consults/_filters.html.slim +0 -9
- data/app/views/renalware/admissions/consults/_table.html.slim +5 -8
- data/app/views/renalware/dashboard/bookmarks/_table.html.slim +1 -1
- data/app/views/renalware/renal/aki_alerts/_aki_alert.html.slim +1 -0
- data/app/views/renalware/renal/aki_alerts/_table.html.slim +3 -1
- data/db/migrate/20180419141524_add_cols_to_hd_patient_statistics.rb +10 -0
- data/db/migrate/20180422090043_update_hd_overall_audit_to_version_6.rb +91 -0
- data/db/seeds/default/reporting/audits.yml +30 -5
- data/db/views/reporting_hd_overall_audit_v06.sql +44 -0
- data/lib/renalware/version.rb +1 -1
- data/lib/tasks/ukrdc.rake +34 -7
- data/spec/factories/hd/patient_statistics.rb +21 -2
- data/spec/factories/pathology/observation_descriptions.rb +7 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e1fbdf118aac168c7b1662ba8514d197bc7dbb520cfea70c2db52120d1a8f35
|
4
|
+
data.tar.gz: ee61a87fbb969e571a1cd37d23446ce3d4c32ba439f768e73bcd6e1aeb2092de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecb654a9c098a41bd8f50eb870312480b77655b6d5c19eba163d287c427cd19fa76b8747d98a198dff695c714b5331585f6eb3cfd3d7d2bf8426af6fb98caff2
|
7
|
+
data.tar.gz: 57de76f0a5b9eb77cea4655a171d0b1d9c03df7d2ec525f505372e6802e6cd66b36642343601173cf78d51cf586c3509f066451fbfaa9f44139cf3a3ff39b4f4
|
@@ -108,7 +108,7 @@ module Renalware
|
|
108
108
|
|
109
109
|
def build_new_event
|
110
110
|
event = new_event_for_patient
|
111
|
-
event.date_time = Time.zone.now
|
111
|
+
event.date_time = Time.zone.now
|
112
112
|
event.event_type = event_type
|
113
113
|
# disable_selection_of_event_type is a virtual attribute
|
114
114
|
event.disable_selection_of_event_type = disable_selection_of_event_type?
|
@@ -7,6 +7,8 @@ require_relative "./errors"
|
|
7
7
|
module Renalware
|
8
8
|
module Letters
|
9
9
|
module Delivery
|
10
|
+
# Note PracticeMailer not the best name as we use this mailer to send a letter to any
|
11
|
+
# recipient (practices, hospital secretaries etc)
|
10
12
|
class PracticeMailer < ApplicationMailer
|
11
13
|
def patient_letter(letter:, to:)
|
12
14
|
validate_letter(letter)
|
@@ -49,7 +51,9 @@ module Renalware
|
|
49
51
|
end
|
50
52
|
|
51
53
|
def validate_letter(letter)
|
52
|
-
|
54
|
+
unless letter.approved? || letter.completed?
|
55
|
+
raise Delivery::LetterIsNotApprovedOrCompletedError, letter.id
|
56
|
+
end
|
53
57
|
end
|
54
58
|
end
|
55
59
|
end
|
@@ -9,8 +9,6 @@ module Renalware
|
|
9
9
|
|
10
10
|
# Filters a set of observations using a specific set of OBX codes
|
11
11
|
class FilteredObservationSet
|
12
|
-
EMPTY_SNAPSHOT = {}.freeze
|
13
|
-
|
14
12
|
def initialize(observation_set:, codes: nil)
|
15
13
|
@codes = codes || RelevantObservationDescription.all.map(&:code)
|
16
14
|
@observation_set = observation_set
|
@@ -24,6 +24,7 @@ module Renalware
|
|
24
24
|
stats.hospital_unit = most_recently_used_hospital_unit(sessions)
|
25
25
|
stats.assign_attributes(auditable_sessions(sessions).to_h)
|
26
26
|
stats.session_count = sessions.length
|
27
|
+
stats.pathology_snapshot = capture_pathology_snapshot
|
27
28
|
stats.save!
|
28
29
|
end
|
29
30
|
|
@@ -43,6 +44,42 @@ module Renalware
|
|
43
44
|
def most_recently_used_hospital_unit(sessions)
|
44
45
|
sessions.last&.hospital_unit
|
45
46
|
end
|
47
|
+
|
48
|
+
def capture_pathology_snapshot
|
49
|
+
FilteredObservationSet.new(patient: patient).to_h
|
50
|
+
end
|
51
|
+
|
52
|
+
# Filters a set of observations using a specific set of OBX codes.
|
53
|
+
# The snapshot is stored on the hd_patient_statistics table - i.e. it represents
|
54
|
+
# the state of the patient's pathology *at the time the hd_stats row is created*.
|
55
|
+
# So for an hd_stats row for say Patient X in the month of April 2018, the
|
56
|
+
# pathology_snapshot is a frozen snapshot of their pathology at 30/4/2018 23:59
|
57
|
+
# TODO: de-dupe this with the other FilteredObservationSet in Letters::?
|
58
|
+
class FilteredObservationSet
|
59
|
+
# These are the codes for the results we want to store in
|
60
|
+
# hd_patient_statics.pathology_snapshot - we are only interested in these
|
61
|
+
# results. They will be used for instance in reporting_hd_overall_audit
|
62
|
+
CODES = %w(HGB PTH PHOS CRE URE URR).freeze
|
63
|
+
|
64
|
+
def initialize(patient:)
|
65
|
+
@observation_set = Pathology.cast_patient(patient).fetch_current_observation_set
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns a hash of the filtered observations e.g.
|
69
|
+
# {
|
70
|
+
# "HGB"=>{"result"=>"139", "observed_at"=>"2016-03-15T03:28:00"},
|
71
|
+
# "URR"=>{"result"=>"49", "observed_at"=>"2016-03-15T03:28:00"},
|
72
|
+
# ...
|
73
|
+
# }
|
74
|
+
def to_h
|
75
|
+
return {} if observation_set.blank?
|
76
|
+
observation_set.values.select { |code, _| CODES.include?(code.to_s) }
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
attr_reader :observation_set
|
82
|
+
end
|
46
83
|
end
|
47
84
|
end
|
48
85
|
end
|
@@ -28,9 +28,18 @@ module Renalware
|
|
28
28
|
private
|
29
29
|
|
30
30
|
def email_letter_to_the_patients_practice
|
31
|
+
# Note we cast the letter back to the superclass Letters::Letter here to prevent
|
32
|
+
# GlobalID from trying to load the letter using e.g. Letters::Approved.find(123), because
|
33
|
+
# in the meantime the letter's class might have progressed to Letters::Completed in which
|
34
|
+
# case GlobalId/ ActiveJob would not be able to find the letter!
|
35
|
+
# Casting to Letters::Letter means in the delayed job the handler says e.g.
|
36
|
+
# - letter:
|
37
|
+
# _aj_globalid: gid://dummy/Renalware::Letters::Letter/3
|
38
|
+
# which it turns out works fine when the letter is loaded by GlobalId/ActiveJob;
|
39
|
+
# it correctly casts the letter to its STI type e.g. Letters::Approved in the job.
|
31
40
|
Letter.transaction do
|
32
41
|
PracticeMailer.patient_letter(
|
33
|
-
letter: letter,
|
42
|
+
letter: letter.becomes(Letter),
|
34
43
|
to: practice_email_address
|
35
44
|
).deliver_later
|
36
45
|
|
@@ -26,6 +26,7 @@ module Renalware
|
|
26
26
|
AKIAlert
|
27
27
|
.joins(:patient) # required for PatientsRansackHelper - see Admission
|
28
28
|
.includes(:patient, :updated_by, :action, hospital_ward: :hospital_unit)
|
29
|
+
.eager_load(patient: [current_modality: :description])
|
29
30
|
.public_send(query[:named_filter].to_s)
|
30
31
|
.ransack(query)
|
31
32
|
end
|
@@ -19,6 +19,7 @@ module Renalware
|
|
19
19
|
#
|
20
20
|
class PracticeEmailMetaData
|
21
21
|
NullPrimaryCarePhysician = Naught.build(&:define_explicit_conversions)
|
22
|
+
NullPractice = Naught.build(&:define_explicit_conversions)
|
22
23
|
|
23
24
|
pattr_initialize [
|
24
25
|
:letter!,
|
@@ -82,6 +83,10 @@ module Renalware
|
|
82
83
|
def primary_care_physician
|
83
84
|
@primary_care_physician ||= NullPrimaryCarePhysician.new
|
84
85
|
end
|
86
|
+
|
87
|
+
def practice
|
88
|
+
@practice ||= NullPractice.new
|
89
|
+
end
|
85
90
|
end
|
86
91
|
end
|
87
92
|
end
|
@@ -11,10 +11,6 @@
|
|
11
11
|
= f.input :consult_site_id_eq,
|
12
12
|
collection: Renalware::Admissions::ConsultSite.pluck(:name, :id),
|
13
13
|
label: "Site"
|
14
|
-
.columns.medium-1.large-1
|
15
|
-
= f.input :requires_aki_nurse_eq,
|
16
|
-
collection: [["Yes", true], ["No", false]],
|
17
|
-
label: "AKI Nurse?"
|
18
14
|
.columns.medium-2.large-1
|
19
15
|
= f.input :seen_by_id_eq,
|
20
16
|
include_blank: false,
|
@@ -30,11 +26,6 @@
|
|
30
26
|
include_blank: true,
|
31
27
|
collection: [["Yes", true], ["No", false]],
|
32
28
|
label: "Active"
|
33
|
-
.columns.medium-1.large-1
|
34
|
-
= f.input :rrt_eq,
|
35
|
-
include_blank: true,
|
36
|
-
collection: [["Yes", true], ["No", false]],
|
37
|
-
label: "RRT"
|
38
29
|
.columns.medium-2.large-2.actions.end
|
39
30
|
= f.submit "Filter", class: "button"
|
40
31
|
span= " or "
|
@@ -13,13 +13,12 @@
|
|
13
13
|
"Location")
|
14
14
|
th.col-width-date.noprint= sort_link(query, :started_on, "Started")
|
15
15
|
th.col-width-date.noprint= sort_link(query, :ended_on, "Ended")
|
16
|
-
th.col-width-small.show-for-large-up
|
16
|
+
th.col-width-small.show-for-large-up
|
17
|
+
= sort_link([:renalware, query], :patient_current_modality_description_name, "Modality")
|
17
18
|
th.col-width-tiny.show-for-large-up Sex
|
18
19
|
th.col-width-date.show-for-large-up= sort_link(query, :patient_born_on, "DOB")
|
19
|
-
th.col-width-tiny.show-for-large-up
|
20
|
-
th.col-width-tiny RRT?
|
20
|
+
th.col-width-tiny.show-for-large-up Age
|
21
21
|
th.col-width-tiny.noprint= sort_link(query, :aki_risk, "AKI Risk")
|
22
|
-
th.col-width-tiny.noprint= sort_link(query, :requires_aki_nurse, " AKI Nurse?")
|
23
22
|
/th.show-for-large-up Author
|
24
23
|
/th.col-width-medium.show-for-xlarge-up Description
|
25
24
|
|
@@ -68,14 +67,12 @@
|
|
68
67
|
td.show-for-large-up.col-width-medium-with-ellipsis= consult.patient_current_modality
|
69
68
|
td.show-for-large-up= consult.patient_sex
|
70
69
|
td.show-for-large-up= l(consult.patient.born_on)
|
71
|
-
td.show-for-large-up
|
72
|
-
td= yes_no(consult.rrt)
|
70
|
+
td.show-for-large-up= consult.patient_age
|
73
71
|
td.noprint= consult.aki_risk&.text
|
74
|
-
td.noprint= yes_no(consult.requires_aki_nurse)
|
75
72
|
/td.show-for-xlarge-up.consult-author.col-width-medium-with-ellipsis(title=consult.created_by)= consult.created_by
|
76
73
|
/td.col-width-medium-with-ellipsis(title=consult.description)= consult.description
|
77
74
|
= content_tag(:tr, id: "consult-quick-preview-#{consult.id}", style: "display: none")
|
78
|
-
td(colspan=
|
75
|
+
td(colspan=11)
|
79
76
|
.quick-preview
|
80
77
|
dl.dl-horizontal
|
81
78
|
dt Author
|
@@ -7,7 +7,7 @@ table.auto-layout
|
|
7
7
|
th.col-width-date= t(".born_on")
|
8
8
|
th.col-width-tiny= t(".age")
|
9
9
|
th.col-width-tiny= t(".sex")
|
10
|
-
th.col-width-
|
10
|
+
th.col-width-medium= t(".modality")
|
11
11
|
th= t(".notes")
|
12
12
|
th= t(".tags")
|
13
13
|
th.col-width-date-time= t(".bookmarked_on")
|
@@ -8,6 +8,7 @@ tr(class="#{'aki_alert--hotlist' if aki_alert.hotlist?}")
|
|
8
8
|
data: { behaviour: "toggler" })
|
9
9
|
td= default_patient_link(aki_alert.patient)
|
10
10
|
td= aki_alert.patient.hospital_identifiers
|
11
|
+
td.show-for-large-up.col-width-medium-with-ellipsis= aki_alert.patient.current_modality
|
11
12
|
td= aki_alert.patient.sex
|
12
13
|
td= aki_alert.patient.age
|
13
14
|
td= aki_alert.action
|
@@ -1,8 +1,10 @@
|
|
1
1
|
table.aki-alerts
|
2
2
|
thead
|
3
3
|
th.col-width-small
|
4
|
-
th.col-width-large Patient
|
4
|
+
th.col-width-large= sort_link(search, :patient_family_name, "Patient")
|
5
5
|
th.col-width-reference-no Hosp. No.
|
6
|
+
th.col-width-small.show-for-large-up
|
7
|
+
= sort_link([:renalware, search], :patient_current_modality_description_name, "Modality")
|
6
8
|
th.col-width-tiny Sex
|
7
9
|
th.col-width-tiny Age
|
8
10
|
th= sort_link(search, :action_name, "Action")
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# rubocop:disable Metrics/MethodLength
|
2
|
+
class UpdateHDOverallAuditToVersion6 < ActiveRecord::Migration[5.1]
|
3
|
+
def change
|
4
|
+
update_view :reporting_hd_overall_audit,
|
5
|
+
materialized: true,
|
6
|
+
version: 6,
|
7
|
+
revert_to_version: 5
|
8
|
+
|
9
|
+
reversible do |direction|
|
10
|
+
direction.up do
|
11
|
+
connection.execute <<-SQL
|
12
|
+
update reporting_audits set display_configuration = '
|
13
|
+
{
|
14
|
+
"columnDefs": [
|
15
|
+
{
|
16
|
+
"title": "Unit",
|
17
|
+
"width": "300",
|
18
|
+
"data": "name"
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"title": "Year",
|
22
|
+
"width": "100",
|
23
|
+
"data": "year"
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"title": "Month",
|
27
|
+
"width": "100",
|
28
|
+
"data": "month"
|
29
|
+
},
|
30
|
+
{
|
31
|
+
"title": "No. patients",
|
32
|
+
"width": "100",
|
33
|
+
"data": "patient_count"
|
34
|
+
},
|
35
|
+
{
|
36
|
+
"title": "% HGB > 100",
|
37
|
+
"width": "120",
|
38
|
+
"data": "percentage_hgb_gt_100"
|
39
|
+
},
|
40
|
+
{
|
41
|
+
"title": "% HGB > 130",
|
42
|
+
"width": "120",
|
43
|
+
"data": "percentage_hgb_gt_130"
|
44
|
+
},
|
45
|
+
{
|
46
|
+
"title": "% Phosphate < 1.8",
|
47
|
+
"width": "120",
|
48
|
+
"data": "percentage_phosphate_lt_1_8"
|
49
|
+
},
|
50
|
+
{
|
51
|
+
"title": "% PTH < 300",
|
52
|
+
"width": "120",
|
53
|
+
"data": "percentage_pth_lt_300"
|
54
|
+
},
|
55
|
+
{
|
56
|
+
"title": "% URR > 64",
|
57
|
+
"width": "120",
|
58
|
+
"data": "percentage_urr_gt_64"
|
59
|
+
},
|
60
|
+
{
|
61
|
+
"title": "% URR > 69",
|
62
|
+
"width": "120",
|
63
|
+
"data": "percentage_urr_gt_69"
|
64
|
+
},
|
65
|
+
{
|
66
|
+
"title": "% w/fistula or graft",
|
67
|
+
"width": "120",
|
68
|
+
"data": "percentage_access_fistula_or_graft"
|
69
|
+
},
|
70
|
+
{
|
71
|
+
"title": "Avg. missed HD time",
|
72
|
+
"width": "120",
|
73
|
+
"data": "avg_missed_hd_time"
|
74
|
+
},
|
75
|
+
{
|
76
|
+
"title": "% sessions >5% dialysis time missed",
|
77
|
+
"width": "200",
|
78
|
+
"data": "pct_missed_sessions_gt_10_pct"
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"title": "% missing >10% HD sessions",
|
82
|
+
"width": "150",
|
83
|
+
"data": "pct_shortfall_gt_5_pct"
|
84
|
+
}
|
85
|
+
]
|
86
|
+
}';
|
87
|
+
SQL
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -84,6 +84,16 @@
|
|
84
84
|
"width": "300",
|
85
85
|
"data": "name"
|
86
86
|
},
|
87
|
+
{
|
88
|
+
"title": "Year",
|
89
|
+
"width": "100",
|
90
|
+
"data": "year"
|
91
|
+
},
|
92
|
+
{
|
93
|
+
"title": "Month",
|
94
|
+
"width": "100",
|
95
|
+
"data": "month"
|
96
|
+
},
|
87
97
|
{
|
88
98
|
"title": "No. patients",
|
89
99
|
"width": "120",
|
@@ -92,18 +102,33 @@
|
|
92
102
|
{
|
93
103
|
"title": "% HGB > 100",
|
94
104
|
"width": "120",
|
95
|
-
"data": "
|
105
|
+
"data": "percentage_hgb_gt_100"
|
96
106
|
},
|
97
107
|
{
|
98
|
-
"title": "%
|
108
|
+
"title": "% HGB > 130",
|
99
109
|
"width": "120",
|
100
|
-
"data": "
|
110
|
+
"data": "percentage_hgb_gt_130"
|
101
111
|
},
|
102
112
|
{
|
103
113
|
"title": "% Phosphate < 1.8",
|
104
114
|
"width": "200",
|
105
115
|
"data": "percentage_phosphate_lt_1_8"
|
106
116
|
},
|
117
|
+
{
|
118
|
+
"title": "% PTH < 300",
|
119
|
+
"width": "200",
|
120
|
+
"data": "percentage_pth_lt_300"
|
121
|
+
},
|
122
|
+
{
|
123
|
+
"title": "% URR > 64",
|
124
|
+
"width": "120",
|
125
|
+
"data": "percentage_urr_gt_64"
|
126
|
+
},
|
127
|
+
{
|
128
|
+
"title": "% URR > 69",
|
129
|
+
"width": "120",
|
130
|
+
"data": "percentage_urr_gt_69"
|
131
|
+
},
|
107
132
|
{
|
108
133
|
"title": "% w/fistula or graft",
|
109
134
|
"width": "200",
|
@@ -115,9 +140,9 @@
|
|
115
140
|
"data": "avg_missed_hd_time"
|
116
141
|
},
|
117
142
|
{
|
118
|
-
"title": "% missing >
|
143
|
+
"title": "% missing >10% HD time",
|
119
144
|
"width": "200",
|
120
|
-
"data": "
|
145
|
+
"data": "pct_shortfall_gt_10_pct"
|
121
146
|
}
|
122
147
|
]
|
123
148
|
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
with fistula_or_graft_access_types as (
|
2
|
+
select id
|
3
|
+
from access_types
|
4
|
+
where name ilike '%fistula%' or name ilike '%graft%'
|
5
|
+
),
|
6
|
+
stats as (
|
7
|
+
select
|
8
|
+
s.patient_id,
|
9
|
+
s.hospital_unit_id,
|
10
|
+
s.month,
|
11
|
+
s.year,
|
12
|
+
s.session_count,
|
13
|
+
s.number_of_missed_sessions,
|
14
|
+
s.number_of_sessions_with_dialysis_minutes_shortfall_gt_5_pct,
|
15
|
+
((number_of_missed_sessions::float / NULLIF(session_count::float, 0)) * 100.0) > 10.0 as missed_sessions_gt_10_pct,
|
16
|
+
s.dialysis_minutes_shortfall::float,
|
17
|
+
convert_to_float(s.pathology_snapshot -> 'HGB' ->> 'result') > 100 as hgb_gt_100,
|
18
|
+
convert_to_float(s.pathology_snapshot -> 'HGB' ->> 'result') > 130 as hgb_gt_130,
|
19
|
+
convert_to_float(s.pathology_snapshot -> 'PTH' ->> 'result') < 300 as pth_lt_300,
|
20
|
+
convert_to_float(s.pathology_snapshot -> 'URR' ->> 'result') > 64 as urr_gt_64,
|
21
|
+
convert_to_float(s.pathology_snapshot -> 'URR' ->> 'result') > 69 as urr_gt_69,
|
22
|
+
convert_to_float(s.pathology_snapshot -> 'PHOS' ->> 'result') < 1.8 as phos_lt_1_8
|
23
|
+
from hd_patient_statistics s
|
24
|
+
where s.rolling is null
|
25
|
+
)
|
26
|
+
select
|
27
|
+
hu.name,
|
28
|
+
stats.year,
|
29
|
+
stats.month,
|
30
|
+
count(*) as patient_count,
|
31
|
+
avg(stats.dialysis_minutes_shortfall) as avg_missed_hd_time,
|
32
|
+
avg(number_of_sessions_with_dialysis_minutes_shortfall_gt_5_pct) as pct_shortfall_gt_5_pct,
|
33
|
+
(count(*) filter(where missed_sessions_gt_10_pct = true))::float / count(*)::float * 100 as pct_missed_sessions_gt_10_pct,
|
34
|
+
(count(*) filter(where hgb_gt_100 = true))::float / count(*)::float * 100 as percentage_hgb_gt_100,
|
35
|
+
(count(*) filter(where hgb_gt_130 = true))::float / count(*)::float * 100 as percentage_hgb_gt_130,
|
36
|
+
(count(*) filter(where pth_lt_300 = true))::float / count(*)::float * 100 as percentage_pth_lt_300,
|
37
|
+
(count(*) filter(where urr_gt_64 = true))::float / count(*)::float * 100 as percentage_urr_gt_64,
|
38
|
+
(count(*) filter(where urr_gt_69 = true))::float / count(*)::float * 100 as percentage_urr_gt_69,
|
39
|
+
(count(*) filter(where phos_lt_1_8 = true))::float / count(*)::float * 100 as percentage_phosphate_lt_1_8,
|
40
|
+
'TBC' as percentage_access_fistula_or_graft
|
41
|
+
from stats
|
42
|
+
inner join hospital_units hu on hu.id = stats.hospital_unit_id
|
43
|
+
group by hu.name, stats.year, stats.month
|
44
|
+
order by hu.name, stats.year asc, stats.month asc;
|
data/lib/renalware/version.rb
CHANGED
data/lib/tasks/ukrdc.rake
CHANGED
@@ -1,16 +1,43 @@
|
|
1
1
|
require "fileutils"
|
2
2
|
require "gpgme"
|
3
3
|
|
4
|
-
#
|
5
|
-
# the patient has but only those bits modified since the last export or :since_date
|
6
|
-
#
|
4
|
+
# Note you can print out the help for this task and others with `rake -D`
|
7
5
|
namespace :ukrdc do
|
8
|
-
desc
|
9
|
-
|
10
|
-
|
6
|
+
desc <<-DESC
|
7
|
+
Creates a folder of UKRDC XML files with any changes to PV patients since their last export
|
8
|
+
Notes:
|
9
|
+
1. Running the rake task updates the sent_to_ukrdc_at for each patient exported.
|
10
|
+
If you don't want to do this you may need to edit this task to wrpt the code in a
|
11
|
+
transaction you can optionally roll back.
|
12
|
+
2: If testing this inside the renalware-core gem, you will need to append app: e.g.
|
13
|
+
app:ukrdc:export ...
|
14
|
+
|
15
|
+
Example usage
|
16
|
+
1. To get all patients with send_to_rpv=true who have changed since the last time they
|
17
|
+
were sent, or have not been sent to the UKRDC yet:
|
18
|
+
|
19
|
+
bundle exec rake ukrdc:export
|
20
|
+
|
21
|
+
2. To get all patients with send_to_rpv=true who have changed since a certain date:
|
22
|
+
|
23
|
+
bundle exec rake ukrdc:export["2018-02-23"]
|
24
|
+
or in zsh shell
|
25
|
+
bundle exec rake ukrdc:export\["2018-02-23"\]
|
26
|
+
|
27
|
+
3. To get only certain RPV patients (by their id eg ids 1 and 2) who with changes since
|
28
|
+
a certain time (not pass patient ids in a space delimited string:
|
29
|
+
|
30
|
+
bundle exec rake ukrdc:export["2018-02-23","1 2"]
|
31
|
+
or in the zsh shell
|
32
|
+
bundle exec rake ukrdc:export\["2018-02-23","1 2"\]
|
33
|
+
DESC
|
34
|
+
task :export, [:changed_since, :patient_ids] => [:environment] do |_task, args|
|
11
35
|
logger = Logger.new(STDOUT)
|
12
36
|
logger.level = Logger::INFO
|
13
37
|
Rails.logger = logger
|
14
|
-
Renalware::UKRDC::SendPatients.new(
|
38
|
+
Renalware::UKRDC::SendPatients.new(
|
39
|
+
changed_since: args[:changed_since],
|
40
|
+
patient_ids: args.fetch(:patient_ids, "").split(" ").map(&:to_i)
|
41
|
+
).call
|
15
42
|
end
|
16
43
|
end
|
@@ -4,7 +4,26 @@ FactoryBot.define do
|
|
4
4
|
factory :hd_patient_statistics, class: "Renalware::HD::PatientStatistics" do
|
5
5
|
patient factory: :hd_patient
|
6
6
|
association :hospital_unit, factory: :hospital_unit
|
7
|
-
month
|
8
|
-
year
|
7
|
+
month 1
|
8
|
+
year 2018
|
9
|
+
# rolling false
|
10
|
+
pre_mean_systolic_blood_pressure 0
|
11
|
+
pre_mean_diastolic_blood_pressure 0
|
12
|
+
post_mean_systolic_blood_pressure 0
|
13
|
+
post_mean_diastolic_blood_pressure 0
|
14
|
+
lowest_systolic_blood_pressure 0
|
15
|
+
highest_systolic_blood_pressure 0
|
16
|
+
mean_fluid_removal 0
|
17
|
+
mean_weight_loss 0
|
18
|
+
mean_machine_ktv 0
|
19
|
+
mean_blood_flow 0
|
20
|
+
mean_litres_processed 0
|
21
|
+
session_count 0
|
22
|
+
number_of_missed_sessions 0
|
23
|
+
dialysis_minutes_shortfall 0
|
24
|
+
dialysis_minutes_shortfall_percentage 0
|
25
|
+
mean_ufr 0
|
26
|
+
mean_weight_loss_as_percentage_of_body_weight 0
|
27
|
+
number_of_sessions_with_dialysis_minutes_shortfall_gt_5_pct 0
|
9
28
|
end
|
10
29
|
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.
|
4
|
+
version: 2.0.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Airslie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_type
|
@@ -3213,6 +3213,8 @@ files:
|
|
3213
3213
|
- db/migrate/20180326155400_add_admin_notes_to_system_user_feedback.rb
|
3214
3214
|
- db/migrate/20180327100423_add_constraints_to_recipient_operations.rb
|
3215
3215
|
- db/migrate/20180328210434_add_rrt_to_admission_consults.rb
|
3216
|
+
- db/migrate/20180419141524_add_cols_to_hd_patient_statistics.rb
|
3217
|
+
- db/migrate/20180422090043_update_hd_overall_audit_to_version_6.rb
|
3216
3218
|
- db/seeds.rb
|
3217
3219
|
- db/seeds/default/accesses/access_pd_catheter_insertion_techniques.csv
|
3218
3220
|
- db/seeds/default/accesses/access_pd_catheter_insertion_techniques.rb
|
@@ -3315,6 +3317,7 @@ files:
|
|
3315
3317
|
- db/views/reporting_hd_overall_audit_v02.sql
|
3316
3318
|
- db/views/reporting_hd_overall_audit_v04.sql
|
3317
3319
|
- db/views/reporting_hd_overall_audit_v05.sql
|
3320
|
+
- db/views/reporting_hd_overall_audit_v06.sql
|
3318
3321
|
- db/views/reporting_main_authors_audit_v01.sql
|
3319
3322
|
- db/views/reporting_main_authors_audit_v02.sql
|
3320
3323
|
- db/views/reporting_pd_audit_v01.sql
|