renalware-core 2.0.21 → 2.0.22

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/renalware/clinical/profiles_controller.rb +9 -3
  3. data/app/controllers/renalware/system/user_feedback_controller.rb +2 -3
  4. data/app/controllers/renalware/virology/base_controller.rb +17 -0
  5. data/app/controllers/renalware/virology/profiles_controller.rb +61 -0
  6. data/app/documents/renalware/dated_boolean_diagnosis.rb +16 -0
  7. data/app/documents/renalware/patient_document.rb +1 -8
  8. data/app/documents/renalware/virology/profile_document.rb +14 -0
  9. data/app/documents/renalware/year_dated_diagnosis.rb +8 -0
  10. data/app/jobs/renalware/hd/generate_monthly_statistics_for_patient_job.rb +3 -1
  11. data/app/jobs/renalware/hd/generate_monthly_statistics_job.rb +3 -1
  12. data/app/models/renalware/pathology/observation_requests_attributes_builder.rb +4 -1
  13. data/app/models/renalware/patient.rb +5 -0
  14. data/app/models/renalware/virology/patient.rb +11 -0
  15. data/app/models/renalware/virology/profile.rb +4 -0
  16. data/app/models/renalware/virology/version.rb +11 -0
  17. data/app/policies/renalware/virology/profile_policy.rb +10 -0
  18. data/app/presenters/renalware/clinical/profile_presenter.rb +6 -5
  19. data/app/views/renalware/clinical/profiles/edit.html.slim +2 -4
  20. data/app/views/renalware/clinical/profiles/show.html.slim +9 -4
  21. data/app/views/renalware/hd/current_profile/_summary.html.slim +1 -1
  22. data/app/views/renalware/hd/dashboards/show.html.slim +6 -1
  23. data/app/views/renalware/hd/mdm/_top.html.slim +4 -0
  24. data/app/views/renalware/hd/preference_sets/_summary.html.slim +1 -1
  25. data/app/views/renalware/hd/protocols/_virology.html.slim +7 -0
  26. data/app/views/renalware/hd/protocols/show.pdf.slim +8 -3
  27. data/app/views/renalware/letters/letters/_letter.html.slim +28 -28
  28. data/app/views/renalware/letters/letters/_table.html.slim +0 -1
  29. data/app/views/renalware/patients/patients/new.html.slim +15 -0
  30. data/app/views/renalware/shared/documents/_dated_boolean_diagnosis.html.slim +0 -0
  31. data/app/views/renalware/shared/documents/_dated_boolean_diagnosis_input.html.slim +9 -0
  32. data/app/views/renalware/shared/documents/_year_dated_diagnosis_input.html.slim +21 -0
  33. data/app/views/renalware/virology/dashboards/_actions.html.slim +1 -0
  34. data/app/views/renalware/virology/dashboards/show.html.slim +1 -1
  35. data/app/views/renalware/virology/profiles/_summary.html.slim +16 -0
  36. data/app/views/renalware/virology/profiles/edit.html.slim +18 -0
  37. data/config/initializers/inflections.rb +1 -0
  38. data/config/locales/renalware/patient.yml +3 -0
  39. data/config/locales/renalware/virology/virology.en.yml +6 -0
  40. data/config/routes.rb +1 -0
  41. data/db/migrate/20180502093256_add_document_to_virology_profiles.rb +29 -0
  42. data/db/migrate/20180502110638_create_virology_versions.rb +10 -0
  43. data/lib/renalware/version.rb +1 -1
  44. data/spec/factories/virology/patients.rb +5 -0
  45. metadata +29 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb52057efa06f6dce32bab7e11ecef1b2d0657efd313d4877700c1c28d1e99fc
4
- data.tar.gz: 1056cb320a5f6bbf1219c309d2d7346e24cb660526de58f104bccea93b8b894c
3
+ metadata.gz: 5c9df5d0937aca9913d07516b1d59836215499b54f8160d4a9fa5d6d811a5eb8
4
+ data.tar.gz: 4afe4555a5821f3c8464d95137fe5a28b8341f1db3e996083216c73b4780f85a
5
5
  SHA512:
6
- metadata.gz: a2d221d00a911a99274cf8741dd7ac549b065d70d484021fc02c76ab050395dbceaec1df8dab4fd9a9bc9092d68a43013e4632377527a1ec50b7172ac1df7c0c
7
- data.tar.gz: 0d66eb47e8baba59a335ad9f70b87c8875e43cf274e30aedaba726baab1f2dd7485eea9a85a661383d76f89f404c17ccd8562ee8c7d5f1fc5eaf86abf32a4750
6
+ metadata.gz: e8f02ea880a57bc537775cc5addd1bea2d6fcf5bf3beae5c647d2cb36a88c6dc0007bed2d76215651d24a29e9cc9e30550fd77785ff3e9bfafbcd8cfdd0d1800
7
+ data.tar.gz: 9d7ba211614d195aff1d88d4faf32a6a83669c130fae96ecbedc69d5ec1be197cbf24749a6b05e3a148534e83fd1694e96a10d7ba246eb6a51699aadf21f78bd
@@ -32,8 +32,12 @@ module Renalware
32
32
 
33
33
  def update_patient
34
34
  document = patient.document
35
- document.diabetes = profile_params[:diabetes].symbolize_keys
36
- document.history = profile_params[:history].symbolize_keys
35
+ %i(diabetes history).each do |document_attribute|
36
+ document.send(
37
+ :"#{document_attribute}=",
38
+ profile_params[document_attribute].symbolize_keys
39
+ )
40
+ end
37
41
  patient.by = current_user
38
42
  patient.save!
39
43
  end
@@ -41,7 +45,9 @@ module Renalware
41
45
  def profile_params
42
46
  params
43
47
  .require(:clinical_profile)
44
- .permit(diabetes: %i(diagnosis diagnosed_on), history: %i(alcohol smoking))
48
+ .permit(
49
+ diabetes: %i(diagnosis diagnosed_on),
50
+ history: %i(alcohol smoking))
45
51
  .to_h
46
52
  end
47
53
  end
@@ -27,10 +27,9 @@ module Renalware
27
27
  search = UserFeedback
28
28
  .includes(:author)
29
29
  .order(created_at: :desc)
30
- .page(page)
31
- .per(per_page)
32
30
  .search(search_params)
33
- feedback_msgs = search.result
31
+
32
+ feedback_msgs = search.result.page(page).per(per_page)
34
33
  authorize feedback_msgs
35
34
  render locals: { feedback_msgs: feedback_msgs, search: search }
36
35
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/renal"
4
+
5
+ module Renalware
6
+ module Virology
7
+ class BaseController < Renalware::BaseController
8
+ protected
9
+
10
+ # rubocop:disable Naming/MemoizedInstanceVariableName
11
+ def patient
12
+ @virology_patient ||= Renalware::Virology.cast_patient(super)
13
+ end
14
+ # rubocop:enable Naming/MemoizedInstanceVariableName
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/virology"
4
+
5
+ module Renalware
6
+ module Virology
7
+ class ProfilesController < Virology::BaseController
8
+ def edit
9
+ profile = find_profile
10
+ authorize profile
11
+ render_edit(profile: profile)
12
+ end
13
+
14
+ def update
15
+ profile = find_profile
16
+ authorize profile
17
+ if update_profile(profile)
18
+ redirect_to patient_virology_dashboard_path(patient)
19
+ else
20
+ render_edit(profile: profile)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def find_profile
27
+ patient.profile || patient.build_profile
28
+ end
29
+
30
+ def render_edit(profile:)
31
+ render :edit, locals: { patient: patient, profile: profile }
32
+ end
33
+
34
+ def update_profile(profile)
35
+ document_params = profile_params[:document]
36
+ document = profile.document
37
+ document.hiv = YearDatedDiagnosis.new(document_params[:hiv])
38
+ document.hepatitis_b = YearDatedDiagnosis.new(document_params[:hepatitis_b])
39
+ document.hepatitis_c = YearDatedDiagnosis.new(document_params[:hepatitis_c])
40
+ profile.save_by(current_user)
41
+ end
42
+
43
+ def profile_params
44
+ params
45
+ .require(:virology_profile)
46
+ .permit(attributes)
47
+ .merge(document: document_attributes)
48
+ end
49
+
50
+ def attributes
51
+ [
52
+ document: []
53
+ ]
54
+ end
55
+
56
+ def document_attributes
57
+ params.require(:virology_profile).fetch(:document, nil).try(:permit!)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware
4
+ class DatedBooleanDiagnosis < NestedAttribute
5
+ attribute :diagnosis, Boolean
6
+ attribute :diagnosed_on, Date
7
+
8
+ validates :diagnosed_on, timeliness: { type: :date, allow_blank: true }
9
+
10
+ def to_s
11
+ return "" if diagnosis.to_s.blank?
12
+ datestamp = diagnosed_on.present? ? "(#{I18n.l(diagnosed_on)})" : nil
13
+ [(diagnosis ? "Yes" : "No"), datestamp].compact.join(" ")
14
+ end
15
+ end
16
+ end
@@ -8,14 +8,7 @@ module Renalware
8
8
  attribute :interpreter_notes, String
9
9
  attribute :admin_notes, String
10
10
  attribute :special_needs_notes, String
11
-
12
- class Diabetes < NestedAttribute
13
- attribute :diagnosis, Boolean
14
- attribute :diagnosed_on, Date
15
-
16
- validates :diagnosed_on, timeliness: { type: :date, allow_blank: true }
17
- end
18
- attribute :diabetes, Diabetes
11
+ attribute :diabetes, DatedBooleanDiagnosis
19
12
 
20
13
  class Referral < Document::Embedded
21
14
  attribute :referring_physician_name, String
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "document/embedded"
4
+ require "document/enum"
5
+
6
+ module Renalware
7
+ module Virology
8
+ class ProfileDocument < Document::Embedded
9
+ attribute :hiv, YearDatedDiagnosis
10
+ attribute :hepatitis_b, YearDatedDiagnosis
11
+ attribute :hepatitis_c, YearDatedDiagnosis
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "document/enum"
4
+
5
+ module Renalware
6
+ class YearDatedDiagnosis < YearDatedConfirmation
7
+ end
8
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "month_period"
4
+
3
5
  module Renalware
4
6
  module HD
5
7
  class GenerateMonthlyStatisticsForPatientJob < ApplicationJob
@@ -7,7 +9,7 @@ module Renalware
7
9
 
8
10
  # :reek:UtilityFunction
9
11
  def perform(patient:, month:, year:)
10
- period = MonthPeriod.new(month: month, year: year)
12
+ period = Renalware::MonthPeriod.new(month: month, year: year)
11
13
  GenerateMonthlyStatisticsForPatient.new(patient: patient, period: period).call
12
14
  end
13
15
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "month_period"
4
+
3
5
  # This job when executed will store a snapshot of last month's HD session statistics
4
6
  # for each HD patient.
5
7
  module Renalware
@@ -25,7 +27,7 @@ module Renalware
25
27
  end
26
28
 
27
29
  def period
28
- @period ||= MonthPeriod.new(month: month, year: year)
30
+ @period ||= Renalware::MonthPeriod.new(month: month, year: year)
29
31
  end
30
32
 
31
33
  def month
@@ -11,6 +11,7 @@ module Renalware
11
11
  # - This class could be removed and a Builder class used to create the database models
12
12
  # directly - this would remove the extra level of indirection that this class introduces.
13
13
  class ObservationRequestsAttributesBuilder
14
+ DEFAULT_REQUESTOR_NAME = "UNKNOWN"
14
15
  delegate :patient_identification, :observation_requests, to: :message_payload
15
16
  delegate :internal_id, to: :patient_identification
16
17
  alias_attribute :requests, :observation_requests
@@ -59,7 +60,7 @@ module Renalware
59
60
  hash = {
60
61
  observation_request: {
61
62
  description_id: request_description.id,
62
- requestor_name: request.ordering_provider_name,
63
+ requestor_name: request.ordering_provider_name || DEFAULT_REQUESTOR_NAME,
63
64
  requestor_order_number: request.placer_order_number,
64
65
  requested_at: parse_time(request.date_time),
65
66
  observations_attributes: build_observations_params(request)
@@ -109,7 +110,9 @@ module Renalware
109
110
  Patient.find_by!(local_patient_id: local_patient_id)
110
111
  end
111
112
 
113
+ # Default to using today's date and time if no date_time passed in the message
112
114
  def parse_time(string)
115
+ return Time.zone.now.to_s if string.blank?
113
116
  Time.zone.parse(string).to_s
114
117
  end
115
118
  end
@@ -85,6 +85,11 @@ module Renalware
85
85
  length: { minimum: 10, maximum: 10 },
86
86
  uniqueness: { case_sensitive: false },
87
87
  allow_blank: true
88
+ validates :local_patient_id, uniqueness: { case_sensitive: false }, allow_blank: true
89
+ validates :local_patient_id_2, uniqueness: { case_sensitive: false }, allow_blank: true
90
+ validates :local_patient_id_3, uniqueness: { case_sensitive: false }, allow_blank: true
91
+ validates :local_patient_id_4, uniqueness: { case_sensitive: false }, allow_blank: true
92
+ validates :local_patient_id_5, uniqueness: { case_sensitive: false }, allow_blank: true
88
93
  validates :family_name, presence: true
89
94
  validates :given_name, presence: true
90
95
  validates :born_on, presence: true
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/virology"
4
+
5
+ module Renalware
6
+ module Virology
7
+ class Patient < ActiveType::Record[Renalware::Patient]
8
+ has_one :profile, dependent: :destroy
9
+ end
10
+ end
11
+ end
@@ -1,11 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_dependency "renalware/virology"
4
+ require "document/base"
4
5
 
5
6
  module Renalware
6
7
  module Virology
7
8
  class Profile < ApplicationRecord
9
+ include Accountable
10
+ include Document::Base
8
11
  belongs_to :patient, touch: true
12
+ has_document class_name: "Renalware::Virology::ProfileDocument"
9
13
  end
10
14
  end
11
15
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/virology"
4
+
5
+ module Renalware
6
+ module Virology
7
+ class Version < PaperTrail::Version
8
+ self.table_name = :virology_versions
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/virology"
4
+
5
+ module Renalware
6
+ module Virology
7
+ class ProfilePolicy < BasePolicy
8
+ end
9
+ end
10
+ end
@@ -6,8 +6,7 @@ module Renalware
6
6
  module Clinical
7
7
  class ProfilePresenter
8
8
  attr_reader :patient, :params
9
- delegate :allergies, to: :patient
10
- delegate :diagnosis, :diagnosed_on, to: :diabetes, prefix: true
9
+ delegate :allergies, :document, to: :patient
11
10
 
12
11
  def initialize(patient:, params:)
13
12
  @params = params
@@ -30,11 +29,13 @@ module Renalware
30
29
  end
31
30
 
32
31
  def history
33
- patient.document.history || NullObject.instance
32
+ document.history || NullObject.instance
34
33
  end
35
34
 
36
- def diabetes
37
- patient.document.diabetes || NullObject.instance
35
+ %i(diabetes).each do |document_attribute|
36
+ define_method(document_attribute) do
37
+ document.send(document_attribute) || NullObject.instance
38
+ end
38
39
  end
39
40
 
40
41
  def dry_weights
@@ -13,10 +13,8 @@
13
13
  article
14
14
  header
15
15
  h2 Diabetes
16
-
17
- = f.simple_fields_for :diabetes, patient.document.diabetes do |fd|
18
- = fd.input :diagnosis, as: :inline_radio_buttons
19
- = fd.input :diagnosed_on, as: :date_picker
16
+ .hint If YES, enter year of diagnosis
17
+ = render_input f, :diabetes
20
18
 
21
19
  article
22
20
  header
@@ -5,15 +5,20 @@
5
5
  .grid
6
6
  .row
7
7
  .columns.medium-6
8
+
8
9
  article
9
10
  header
10
11
  h2 Diabetes
11
12
 
12
13
  dl.dl-horizontal
13
- dt Diagnosis
14
- dd= yes_no(profile.diabetes_diagnosis) unless profile.diabetes_diagnosis.nil?
15
- dt Diagnosed on
16
- dd= l(profile.diabetes_diagnosed_on)
14
+ - %i(diabetes).each do |document_attribute|
15
+ dt= profile.document.class.human_attribute_name(document_attribute)
16
+ dd= profile.send(document_attribute).to_s
17
+
18
+ .columns.medium-6
19
+ = render "renalware/virology/profiles/summary",
20
+ patient: patient,
21
+ positive_results_only: true
17
22
 
18
23
  .columns.medium-6
19
24
  article
@@ -1,4 +1,4 @@
1
- article
1
+ article.hd-profile-summary
2
2
  header
3
3
  h2.noprint= t(".title")
4
4
  ul
@@ -21,8 +21,13 @@
21
21
  patient: dashboard.patient,
22
22
  access: dashboard.access
23
23
 
24
+ .medium-6.large-4.xlarge-3.columns
25
+ = render "renalware/virology/profiles/summary",
26
+ patient: dashboard.patient,
27
+ positive_results_only: true
28
+
24
29
  - unless dashboard.preference_set.new_record?
25
- .medium-6.large-4.xlarge-6.columns
30
+ .medium-6.large-4.xlarge-3.columns
26
31
  = render "renalware/hd/preference_sets/summary",
27
32
  patient: dashboard.patient,
28
33
  preference_set: dashboard.preference_set
@@ -3,5 +3,9 @@
3
3
  .columns.small-12.medium-6.large-3
4
4
  - if mdm.access.present?
5
5
  = render "renalware/hd/accesses/summary", access: mdm.access, patient: mdm.patient
6
+ .columns.medium-12.large-6
7
+ = render "renalware/virology/profiles/summary",
8
+ patient: mdm.patient,
9
+ positive_results_only: true
6
10
  .columns.medium-12.large-6
7
11
  = render "prescriptions", mdm: mdm, with_esa: true
@@ -1,4 +1,4 @@
1
- article
1
+ article.hd-preference-sets
2
2
  header
3
3
  h2= t(".title")
4
4
  ul
@@ -0,0 +1,7 @@
1
+ - document = Renalware::Virology.cast_patient(protocol.patient).profile&.document || Renalware::NullObject.instance
2
+ table(style="text-align: left;")
3
+ - %i(hiv hepatitis_b hepatitis_c).each do |attr|
4
+ - if document.public_send(attr).status&.yes?
5
+ tr
6
+ th= attr_name(document, attr)
7
+ td= document.public_send(attr).to_s
@@ -15,13 +15,18 @@
15
15
  - if clinical_patient.allergy_status_updated_at
16
16
  span.allergy_status_updated_at
17
17
  = "#{l(clinical_patient.allergy_status_updated_at&.to_date)}"
18
+
18
19
  th.protocol-prescriptions Prescriptions on HD
19
20
  th.protocol-recent-pathology Recent Pathology
20
21
  tbody
21
22
  tr
22
- td= render "profile", profile: protocol.profile
23
- td= render "allergies", patient: protocol.patient
24
- td= render "prescriptions", prescriptions: protocol.prescriptions
23
+ td
24
+ = render "profile", profile: protocol.profile
25
+ td
26
+ = render "allergies", patient: protocol.patient
27
+ = render "virology", protocol: protocol
28
+ td
29
+ = render "prescriptions", prescriptions: protocol.prescriptions
25
30
  td
26
31
  = render "recent_pathology", recent_pathology: protocol.recent_pathology
27
32
  = render "latest_dry_weight", latest_dry_weight: protocol.latest_dry_weight
@@ -1,32 +1,32 @@
1
1
  - columns = local_assigns[:columns] || []
2
-
3
- tr(class=letter.state.dasherize)
4
- td
5
- = link_to "Toggle", "#quick-preview-#{letter.id}", data: { behaviour: "toggler" }
6
- = pipe_separator
7
- = link_to letter.view_label, patient_letters_letter_path(letter.patient, letter)
8
- - if policy(letter).update?
9
- = pipe_separator
10
- = link_to "Edit", edit_patient_letters_letter_path(letter.patient, letter)
11
- - if policy(letter).destroy?
2
+ - cache([letter, columns.join("-")]) do
3
+ tr(class=letter.state.dasherize)
4
+ td
5
+ = link_to "Toggle", "#quick-preview-#{letter.id}", data: { behaviour: "toggler" }
12
6
  = pipe_separator
13
- = link_to "Delete",
14
- patient_letters_letter_path(letter.patient, letter),
15
- method: :delete,
16
- data: { confirm: I18n.t("prompts.confirm_delete") }
7
+ = link_to letter.view_label, patient_letters_letter_path(letter.patient, letter)
8
+ - if policy(letter).update?
9
+ = pipe_separator
10
+ = link_to "Edit", edit_patient_letters_letter_path(letter.patient, letter)
11
+ - if policy(letter).destroy?
12
+ = pipe_separator
13
+ = link_to "Delete",
14
+ patient_letters_letter_path(letter.patient, letter),
15
+ method: :delete,
16
+ data: { confirm: I18n.t("prompts.confirm_delete") }
17
17
 
18
- td.state
19
- span= letter.state_description
20
- td= l(letter.issued_on)
21
- - if columns.include?(:author)
22
- td.col-width-medium-with-ellipsis= letter.author
23
- - if columns.include?(:patient)
24
- td.col-width-medium-with-ellipsis= default_patient_link(letter.patient)
25
- td.recipient= letter.main_recipient.address
26
- td.col-width-medium-with-ellipsis= letter.description
18
+ td.state
19
+ span= letter.state_description
20
+ td= l(letter.issued_on)
21
+ - if columns.include?(:author)
22
+ td.col-width-medium-with-ellipsis= letter.author
23
+ - if columns.include?(:patient)
24
+ td.col-width-medium-with-ellipsis= default_patient_link(letter.patient)
25
+ td.recipient= letter.main_recipient.address
26
+ td.col-width-medium-with-ellipsis= letter.description
27
27
 
28
- = content_tag(:tr, id: "quick-preview-#{letter.id}", style: "display: none")
29
- td
30
- td(colspan=8)
31
- .quick-preview
32
- = simple_format letter.body
28
+ = content_tag(:tr, id: "quick-preview-#{letter.id}", style: "display: none")
29
+ td
30
+ td(colspan=8)
31
+ .quick-preview
32
+ = simple_format letter.body
@@ -16,5 +16,4 @@ table.auto-layout.letters.has-togglable-rows
16
16
  tbody
17
17
  = render partial: "renalware/letters/letters/letter",
18
18
  collection: letters,
19
- cached: true,
20
19
  locals: { columns: columns }
@@ -1,5 +1,20 @@
1
1
  = within_admin_layout(title: "New", breadcrumbs: breadcrumb_for("Patients", patients_path)) do
2
+
3
+ .panel.warn
4
+ h2 Before adding a patient, please check they are not already in Renalware
5
+ span
6
+ | Use the search at the top left of this page to identify a patient
7
+ | &nbsp;using their name or hospital/NHS number.
8
+ br
9
+ | If you find a match remember to check
10
+ | &nbsp;their name, date of birth and hospital numbers from the different hospitals.
11
+ br
12
+ | Please
13
+ b &nbsp;DO NOT ADD A PATIENT&nbsp;
14
+ | &nbsp;if you think they already exist on the database - check first and add them later if necessary
15
+
2
16
  .row
17
+
3
18
  = render "renalware/shared/errors", model: patient
4
19
 
5
20
  = simple_form_for patient,
@@ -0,0 +1,9 @@
1
+ - renderable = f.object.public_send(attribute)
2
+ = f.simple_fields_for attribute, renderable do |fd|
3
+ .row(class=attribute)
4
+ .columns.small-12.medium-3.large-3
5
+ = fd.label attribute, f.object.class.human_attribute_name(attribute)
6
+ .columns.small-4.medium-4.large-3
7
+ = fd.input :diagnosis, as: :inline_radio_buttons, wrapper: :bare
8
+ .columns.small-7.medium-5.large-4.end
9
+ = fd.input :diagnosed_on, as: :date_picker, label: "Diagnosed", input_html: { class: "tiny-input" }
@@ -0,0 +1,21 @@
1
+ - renderable = f.object.public_send(attribute)
2
+
3
+ td= fd.label :status, f.object.class.human_attribute_name(attribute)
4
+ td= fd.input :status, as: :inline_radio_buttons,
5
+ label: false, wrapper: "vertical_form"
6
+ td= fd.input :confirmed_on_year, label: false, wrapper: "vertical_form",
7
+ collection: Renalware::YearDatedConfirmation.valid_years.reverse,
8
+ input_html: { class: "tiny-input" }
9
+
10
+
11
+ = f.simple_fields_for attribute, renderable do |fd|
12
+ .row(class=attribute)
13
+ .columns.small-12.medium-3.large-3
14
+ = fd.label attribute, f.object.class.human_attribute_name(attribute)
15
+ .columns.small-4.medium-4.large-3
16
+ = fd.input :status, as: :inline_radio_buttons, wrapper: :bare
17
+ .columns.small-6.medium-5.large-4.end
18
+ = fd.input :confirmed_on_year,
19
+ label: "Diagnosed",
20
+ collection: Renalware::YearDatedConfirmation.valid_years.reverse,
21
+ input_html: { class: "tiny-input" }
@@ -1,3 +1,4 @@
1
+ = link_to "Edit Profile", edit_patient_virology_profile_path(patient), class: "button secondary"
1
2
  a.button.dropdown(href="#"
2
3
  data-dropdown="virology-options"
3
4
  aria-controls="virology-options"
@@ -2,5 +2,5 @@
2
2
  = render "actions", patient: patient
3
3
 
4
4
  = within_patient_layout(title: "Virology") do
5
-
5
+ = render "renalware/virology/profiles/summary", patient: patient
6
6
  = render "renalware/virology/vaccinations/list", vaccinations: vaccinations, patient: patient
@@ -0,0 +1,16 @@
1
+ - profile = Renalware::Virology.cast_patient(patient).profile
2
+ - document = profile&.document || Renalware::NullObject.instance
3
+ - positive_results_only = local_assigns.fetch(:positive_results_only, false)
4
+
5
+ article
6
+ header
7
+ h2 Virology
8
+ ul
9
+ li= link_to "Edit", edit_patient_virology_profile_path(patient), class: "button"
10
+
11
+ dl.dl-horizontal.medium
12
+ - %i(hiv hepatitis_b hepatitis_c).each do |attr_name|
13
+ - status = document.public_send(attr_name).status
14
+ - next if positive_results_only && !status&.yes?
15
+ dt= attr_name(document, attr_name)
16
+ dd= document.public_send(attr_name).to_s
@@ -0,0 +1,18 @@
1
+ = within_patient_layout(title: "Edit Profile",
2
+ breadcrumbs: breadcrumb_for("Virology", patient_virology_dashboard_path(patient))) do
3
+
4
+ = simple_form_for(profile,
5
+ url: patient_virology_profile_path(patient, profile),
6
+ method: :patch,
7
+ html: { autocomplete: "off" },
8
+ wrapper: :horizontal_form) do |f|
9
+
10
+ = f.simple_fields_for :document, profile.document do |fd|
11
+ .hint If YES, enter year of diagnosis
12
+ = render_input fd, :hiv
13
+ = render_input fd, :hepatitis_b
14
+ = render_input fd, :hepatitis_c
15
+
16
+ = f.submit "Save", class: "button"
17
+ span= " or "
18
+ = link_to "cancel", patient_virology_dashboard_path(patient)
@@ -29,6 +29,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
29
29
  inflect.acronym "GP"
30
30
  inflect.acronym "HD"
31
31
  inflect.acronym "HDF"
32
+ inflect.acronym "HIV"
32
33
  inflect.acronym "HL7"
33
34
  inflect.acronym "MDM"
34
35
  inflect.acronym "NHS"
@@ -16,7 +16,10 @@ en:
16
16
  renalreg_recorded_by: Renal Reg decision recorded by
17
17
  rpv_recorded_by: RPV decision recorded by
18
18
  language: Main Language
19
+ activemodel:
19
20
  attributes:
21
+ renalware/patient_document:
22
+ diabetes: Diabetes
20
23
  renalware/patient_document/history:
21
24
  alcohol:
22
25
  smoking:
@@ -8,6 +8,12 @@ en:
8
8
  dashboards:
9
9
  actions:
10
10
  add_vaccination: Vaccination
11
+ activemodel:
12
+ attributes:
13
+ renalware/virology/profile_document:
14
+ hiv: HIV
15
+ hepatitis_b: Hepatitis B
16
+ hepatitis_c: Hepatitis C
11
17
  enumerize:
12
18
  renalware/virology/vaccination/document:
13
19
  type:
data/config/routes.rb CHANGED
@@ -437,6 +437,7 @@ Renalware::Engine.routes.draw do
437
437
 
438
438
  namespace :virology do
439
439
  resource :dashboard, only: :show, path: "/dashboard"
440
+ resource :profile, except: :destroy
440
441
 
441
442
  resources :vaccinations,
442
443
  only: [:new, :create, :edit, :update],
@@ -0,0 +1,29 @@
1
+ # rubocop:disable Metrics/MethodLength
2
+ class AddDocumentToVirologyProfiles < ActiveRecord::Migration[5.1]
3
+ def change
4
+ add_column :virology_profiles,
5
+ :document,
6
+ :jsonb,
7
+ default: {},
8
+ null: false
9
+
10
+ add_reference :virology_profiles,
11
+ :updated_by,
12
+ foreign_key:
13
+ { to_table: :users },
14
+ index: true,
15
+ null: true
16
+
17
+ add_reference :virology_profiles,
18
+ :created_by,
19
+ foreign_key:
20
+ { to_table: :users },
21
+ index: true,
22
+ null: true
23
+
24
+ add_column :virology_profiles, :updated_at, :datetime
25
+ add_column :virology_profiles, :created_at, :datetime
26
+
27
+ add_index :virology_profiles, :document, using: :gin
28
+ end
29
+ end
@@ -0,0 +1,10 @@
1
+ class CreateVirologyVersions < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :virology_versions do |t|
4
+ t.string :item_type, null: false
5
+ t.integer :item_id, null: false
6
+ t.datetime :created_at
7
+ end
8
+ add_index :virology_versions, [:item_type, :item_id]
9
+ end
10
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Renalware
4
- VERSION = "2.0.21"
4
+ VERSION = "2.0.22"
5
5
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :virology_patient, class: "Renalware::Virology::Patient", parent: :patient
5
+ 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.21
4
+ version: 2.0.22
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-27 00:00:00.000000000 Z
11
+ date: 2018-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_type
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 7.2.5
75
+ version: 8.4.1
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 7.2.5
82
+ version: 8.4.1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: chosen-rails
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -226,14 +226,14 @@ dependencies:
226
226
  requirements:
227
227
  - - "~>"
228
228
  - !ruby/object:Gem::Version
229
- version: 2.2.1
229
+ version: 2.4.0
230
230
  type: :runtime
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - "~>"
235
235
  - !ruby/object:Gem::Version
236
- version: 2.2.1
236
+ version: 2.4.0
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: dumb_delegator
239
239
  requirement: !ruby/object:Gem::Requirement
@@ -352,14 +352,14 @@ dependencies:
352
352
  requirements:
353
353
  - - "~>"
354
354
  - !ruby/object:Gem::Version
355
- version: 0.15.7
355
+ version: 0.16.2
356
356
  type: :runtime
357
357
  prerelease: false
358
358
  version_requirements: !ruby/object:Gem::Requirement
359
359
  requirements:
360
360
  - - "~>"
361
361
  - !ruby/object:Gem::Version
362
- version: 0.15.7
362
+ version: 0.16.2
363
363
  - !ruby/object:Gem::Dependency
364
364
  name: jbuilder
365
365
  requirement: !ruby/object:Gem::Requirement
@@ -548,14 +548,14 @@ dependencies:
548
548
  requirements:
549
549
  - - "~>"
550
550
  - !ruby/object:Gem::Version
551
- version: 0.21.0
551
+ version: 1.0.0
552
552
  type: :runtime
553
553
  prerelease: false
554
554
  version_requirements: !ruby/object:Gem::Requirement
555
555
  requirements:
556
556
  - - "~>"
557
557
  - !ruby/object:Gem::Version
558
- version: 0.21.0
558
+ version: 1.0.0
559
559
  - !ruby/object:Gem::Dependency
560
560
  name: puma
561
561
  requirement: !ruby/object:Gem::Requirement
@@ -590,14 +590,14 @@ dependencies:
590
590
  requirements:
591
591
  - - "~>"
592
592
  - !ruby/object:Gem::Version
593
- version: 5.0.1
593
+ version: 5.2.0
594
594
  type: :runtime
595
595
  prerelease: false
596
596
  version_requirements: !ruby/object:Gem::Requirement
597
597
  requirements:
598
598
  - - "~>"
599
599
  - !ruby/object:Gem::Version
600
- version: 5.0.1
600
+ version: 5.2.0
601
601
  - !ruby/object:Gem::Dependency
602
602
  name: rails
603
603
  requirement: !ruby/object:Gem::Requirement
@@ -1186,13 +1186,16 @@ files:
1186
1186
  - app/controllers/renalware/transplants/registration_statuses_controller.rb
1187
1187
  - app/controllers/renalware/transplants/registrations_controller.rb
1188
1188
  - app/controllers/renalware/transplants/wait_lists_controller.rb
1189
+ - app/controllers/renalware/virology/base_controller.rb
1189
1190
  - app/controllers/renalware/virology/dashboards_controller.rb
1191
+ - app/controllers/renalware/virology/profiles_controller.rb
1190
1192
  - app/controllers/renalware/virology/vaccinations_controller.rb
1191
1193
  - app/documents/renalware/accesses/assessment_document.rb
1192
1194
  - app/documents/renalware/age.rb
1193
1195
  - app/documents/renalware/binary_marker.rb
1194
1196
  - app/documents/renalware/blood_group.rb
1195
1197
  - app/documents/renalware/blood_pressure.rb
1198
+ - app/documents/renalware/dated_boolean_diagnosis.rb
1196
1199
  - app/documents/renalware/dated_confirmation.rb
1197
1200
  - app/documents/renalware/dated_integer.rb
1198
1201
  - app/documents/renalware/dated_result.rb
@@ -1213,7 +1216,9 @@ files:
1213
1216
  - app/documents/renalware/transplants/recipient_operation_document.rb
1214
1217
  - app/documents/renalware/transplants/recipient_workup_document.rb
1215
1218
  - app/documents/renalware/transplants/registration_document.rb
1219
+ - app/documents/renalware/virology/profile_document.rb
1216
1220
  - app/documents/renalware/year_dated_confirmation.rb
1221
+ - app/documents/renalware/year_dated_diagnosis.rb
1217
1222
  - app/drops/renalware/patients/patient_drop.rb
1218
1223
  - app/drops/renalware/pd/exit_site_infection_drop.rb
1219
1224
  - app/drops/renalware/pd/patient_drop.rb
@@ -1732,8 +1737,10 @@ files:
1732
1737
  - app/models/renalware/user.rb
1733
1738
  - app/models/renalware/version.rb
1734
1739
  - app/models/renalware/virology.rb
1740
+ - app/models/renalware/virology/patient.rb
1735
1741
  - app/models/renalware/virology/profile.rb
1736
1742
  - app/models/renalware/virology/vaccination.rb
1743
+ - app/models/renalware/virology/version.rb
1737
1744
  - app/models/renalware/zip_archive.rb
1738
1745
  - app/policies/application_policy.rb
1739
1746
  - app/policies/renalware/admin/cache_policy.rb
@@ -1794,6 +1801,7 @@ files:
1794
1801
  - app/policies/renalware/transplants/registration_policy.rb
1795
1802
  - app/policies/renalware/user_policy.rb
1796
1803
  - app/policies/renalware/virology/dasboard_policy.rb
1804
+ - app/policies/renalware/virology/profile_policy.rb
1797
1805
  - app/policies/renalware/virology/vaccination_policy.rb
1798
1806
  - app/policies/renalware/yaml_permission_configuration.rb
1799
1807
  - app/presenters/date_presenter.rb
@@ -2167,6 +2175,7 @@ files:
2167
2175
  - app/views/renalware/hd/protocols/_prescriptions.html.slim
2168
2176
  - app/views/renalware/hd/protocols/_profile.html.slim
2169
2177
  - app/views/renalware/hd/protocols/_recent_pathology.html.slim
2178
+ - app/views/renalware/hd/protocols/_virology.html.slim
2170
2179
  - app/views/renalware/hd/protocols/show.pdf.slim
2171
2180
  - app/views/renalware/hd/sessions/_empty_row.html.slim
2172
2181
  - app/views/renalware/hd/sessions/_form.html.slim
@@ -2587,6 +2596,8 @@ files:
2587
2596
  - app/views/renalware/shared/documents/_blood_group_input.html.slim
2588
2597
  - app/views/renalware/shared/documents/_blood_pressure.html.slim
2589
2598
  - app/views/renalware/shared/documents/_blood_pressure_input.html.slim
2599
+ - app/views/renalware/shared/documents/_dated_boolean_diagnosis.html.slim
2600
+ - app/views/renalware/shared/documents/_dated_boolean_diagnosis_input.html.slim
2590
2601
  - app/views/renalware/shared/documents/_dated_confirmation.html.slim
2591
2602
  - app/views/renalware/shared/documents/_dated_confirmation_input.html.slim
2592
2603
  - app/views/renalware/shared/documents/_dated_integer.html.slim
@@ -2605,6 +2616,7 @@ files:
2605
2616
  - app/views/renalware/shared/documents/_smoking_status_input.html.slim
2606
2617
  - app/views/renalware/shared/documents/_year_dated_confirmation.html.slim
2607
2618
  - app/views/renalware/shared/documents/_year_dated_confirmation_input.html.slim
2619
+ - app/views/renalware/shared/documents/_year_dated_diagnosis_input.html.slim
2608
2620
  - app/views/renalware/snippets/snippet_invocations/create.js.erb
2609
2621
  - app/views/renalware/snippets/snippets/_form.html.slim
2610
2622
  - app/views/renalware/snippets/snippets/_list.html.slim
@@ -2694,6 +2706,8 @@ files:
2694
2706
  - app/views/renalware/transplants/wait_lists/show.html.slim
2695
2707
  - app/views/renalware/virology/dashboards/_actions.html.slim
2696
2708
  - app/views/renalware/virology/dashboards/show.html.slim
2709
+ - app/views/renalware/virology/profiles/_summary.html.slim
2710
+ - app/views/renalware/virology/profiles/edit.html.slim
2697
2711
  - app/views/renalware/virology/vaccinations/_cell.html.slim
2698
2712
  - app/views/renalware/virology/vaccinations/_inputs.html.slim
2699
2713
  - app/views/renalware/virology/vaccinations/_list.html.slim
@@ -3216,6 +3230,8 @@ files:
3216
3230
  - db/migrate/20180419141524_add_cols_to_hd_patient_statistics.rb
3217
3231
  - db/migrate/20180422090043_update_hd_overall_audit_to_version_6.rb
3218
3232
  - db/migrate/20180427133558_add_code_to_hospitals_wards.rb
3233
+ - db/migrate/20180502093256_add_document_to_virology_profiles.rb
3234
+ - db/migrate/20180502110638_create_virology_versions.rb
3219
3235
  - db/seeds.rb
3220
3236
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.csv
3221
3237
  - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.rb
@@ -3518,6 +3534,7 @@ files:
3518
3534
  - spec/factories/transplants/registration_status_descriptions.rb
3519
3535
  - spec/factories/transplants/registration_statuses.rb
3520
3536
  - spec/factories/transplants/registrations.rb
3537
+ - spec/factories/virology/patients.rb
3521
3538
  - spec/factories/virology/vaccinations.rb
3522
3539
  - spec/support/capybara.rb
3523
3540
  - spec/support/capybara_helper.rb