Module: Form526ClaimFastTrackingConcern

Extended by:
ActiveSupport::Concern
Included in:
Form526Submission
Defined in:
app/models/concerns/form526_claim_fast_tracking_concern.rb

Overview

rubocop:disable Metrics/ModuleLength For use with Form526Submission

Constant Summary collapse

RRD_STATSD_KEY_PREFIX =
'worker.rapid_ready_for_decision'
MAX_CFI_STATSD_KEY_PREFIX =
'api.max_cfi'
EP_MERGE_STATSD_KEY_PREFIX =
'worker.ep_merge'
DISABILITIES_WITH_MAX_CFI =
[ClaimFastTracking::DiagnosticCodes::TINNITUS].freeze
EP_MERGE_BASE_CODES =
%w[010 110 020 030 040].freeze
DOCUMENT_NAME_PREFIX =
'VAMC'
DOCUMENT_NAME_SUFFIX =
'Rapid_Decision_Evidence'
PDF_FILENAME_REGEX =
/#{DOCUMENT_NAME_PREFIX}.*#{DOCUMENT_NAME_SUFFIX}/
RRD_CODE =
'RRD'

Instance Method Summary collapse

Instance Method Details

#classify_single_contention(params) ⇒ Object



159
160
161
162
163
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 159

def classify_single_contention(params)
  vro_client = VirtualRegionalOffice::Client.new
  response = vro_client.classify_single_contention(params)
  response.body
end

#diagnostic_codesObject



97
98
99
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 97

def diagnostic_codes
  disabilities.pluck('diagnosticCode')
end

#disabilitiesObject



83
84
85
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 83

def disabilities
  form.dig('form526', 'form526', 'disabilities')
end

#disabilities_not_service_connected?Boolean

return whether all disabilities on this form are rated as not service-connected

Returns:

  • (Boolean)


200
201
202
203
204
205
206
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 200

def disabilities_not_service_connected?
  disabilities.pluck('ratedDisabilityId').all? do |rated_id|
    rated_id.present? && (all_rated_disabilities
                            .find { |rated| rated_id == rated.rated_disability_id }
                            &.decision_code == 'NOTSVCCON')
  end
end

#get_claim_typeObject



126
127
128
129
130
131
132
133
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 126

def get_claim_type
  claim_type = disabilities.pick('disabilityActionType').upcase
  if claim_type == 'INCREASE'
    'claim_for_increase'
  else
    'new'
  end
end

#increase_only?Boolean

Returns:

  • (Boolean)


87
88
89
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 87

def increase_only?
  disabilities.all? { |disability| disability['disabilityActionType']&.upcase == 'INCREASE' }
end

#increase_or_new?Boolean

Returns:

  • (Boolean)


91
92
93
94
95
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 91

def increase_or_new?
  disabilities.all? do |disability|
    disability['disabilityActionType']&.upcase == 'INCREASE' || disability['disabilityActionType']&.upcase == 'NEW'
  end
end

#log_max_cfi_metrics_on_submitObject



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 174

def log_max_cfi_metrics_on_submit
  DISABILITIES_WITH_MAX_CFI.intersection(diagnostic_codes).each do |diagnostic_code|
    next unless disabilities.any? do |dis|
      diagnostic_code == dis['diagnosticCode']
    end

    next unless max_rated_disabilities_from_ipf.any? do |dis|
      diagnostic_code == dis['diagnostic_code']
    end

    user = User.find(user_uuid)
    max_cfi_enabled = Flipper.enabled?(:disability_526_maximum_rating, user) ? 'on' : 'off'
    StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.#{max_cfi_enabled}.submit.#{diagnostic_code}")
  end
rescue => e
  # Log the exception but but do not fail, otherwise form will not be submitted
  log_exception_to_sentry(e)
end

#pending_eps?Boolean

Fetch all claims from EVSS

Returns:

  • (Boolean)

    whether there are any open EP 020’s



50
51
52
53
54
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 50

def pending_eps?
  pending = open_claims.any? { |claim| claim['base_end_product_code'] == '020' }
  (offramp_reason: 'pending_ep') if pending
  pending
end

#prepare_for_ep_merge!Object



115
116
117
118
119
120
121
122
123
124
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 115

def prepare_for_ep_merge!
  pending_eps = open_claims.select { |claim| EP_MERGE_BASE_CODES.include?(claim['base_end_product_code']) }
  StatsD.distribution("#{EP_MERGE_STATSD_KEY_PREFIX}.pending_ep_count", pending_eps.count)
  return unless pending_eps.count == 1

  date = Date.strptime(pending_eps.first['date'], '%m/%d/%Y')
  days_ago = (Time.zone.today - date).round
  StatsD.distribution("#{EP_MERGE_STATSD_KEY_PREFIX}.pending_ep_age", days_ago)
  (ep_merge_pending_claim_id: pending_eps.first['id'])
end

#prepare_for_evss!Object



101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 101

def prepare_for_evss!
  begin
    classification_updated = update_classification!
  rescue => e
    Rails.logger.error "Contention Classification failed #{e.message}.", backtrace: e.backtrace
  end

  prepare_for_ep_merge! if disabilities.count == 1 && increase_only? && classification_updated

  return if pending_eps? || disabilities_not_service_connected?

  (forward_to_mas_all_claims: true)
end

#read_metadata(key) ⇒ Object



23
24
25
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 23

def (key)
  form.dig('rrd_metadata', key.to_s)
end

#rrd_pdf_added_for_uploading?Boolean

Returns if an RRD pdf has been included as a file to upload.

Returns:

  • (Boolean)

    if an RRD pdf has been included as a file to upload



70
71
72
73
74
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 70

def rrd_pdf_added_for_uploading?
  form['form526_uploads']&.any? do |upload|
    upload['name']&.match? PDF_FILENAME_REGEX
  end
end

#rrd_pdf_created?Boolean

Returns:

  • (Boolean)


56
57
58
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 56

def rrd_pdf_created?
  (:pdf_created) || false
end

#rrd_pdf_uploaded_to_s3?Boolean

Returns:

  • (Boolean)


60
61
62
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 60

def rrd_pdf_uploaded_to_s3?
  (:pdf_guid).present?
end

#rrd_special_issue_set?Boolean

Returns:

  • (Boolean)


76
77
78
79
80
81
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 76

def rrd_special_issue_set?
  disabilities = form.dig('form526', 'form526', 'disabilities')
  disabilities.any? do |disability|
    disability['specialIssues']&.include?(RRD_CODE)
  end
end

#rrd_statusObject



37
38
39
40
41
42
43
44
45
46
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 37

def rrd_status
  return 'processed' if rrd_claim_processed?

  offramp_reason = (:offramp_reason)
  return offramp_reason if offramp_reason.present?

  return 'error' if (:error).present?

  'unknown'
end

#save_metadata(metadata_hash) ⇒ Object

Parameters:

  • metadata_hash (Hash)

    to be merged into form_json



28
29
30
31
32
33
34
35
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 28

def ()
  form['rrd_metadata'] ||= {}
  form['rrd_metadata'].deep_merge!()

  update!(form_json: JSON.dump(form))
  invalidate_form_hash
  self
end

#send_post_evss_notifications!Object



193
194
195
196
197
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 193

def send_post_evss_notifications!
  conditionally_notify_mas
  conditionally_merge_ep
  Rails.logger.info('Submitted 526Submission to eVSS', id:, saved_claim_id:, submitted_claim_id:)
end

#send_rrd_alert_email(subject, message, error = nil, to = Settings.rrd.alerts.recipients) ⇒ Object



19
20
21
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 19

def send_rrd_alert_email(subject, message, error = nil, to = Settings.rrd.alerts.recipients)
  RrdAlertMailer.build(self, subject, message, error, to).deliver_now
end

#update_classification!Object



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 135

def update_classification!
  return unless increase_or_new?
  return unless disabilities.count == 1

  claim_type = get_claim_type
  return unless claim_type == 'claim_for_increase' || Flipper.enabled?(:disability_526_classifier_new_claims)

  diagnostic_code = diagnostic_codes.first
  params = {
    diagnostic_code:,
    claim_id: saved_claim_id,
    form526_submission_id: id,
    claim_type:,
    contention_text: disabilities.pick('name')
  }

  classification = classify_single_contention(params)
  Rails.logger.info('Classified 526Submission', id:, saved_claim_id:, classification:, claim_type:)
  return if classification.blank?

  update_form_with_classification_code(classification['classification_code'])
  classification['classification_code'].present?
end

#update_form_with_classification_code(classification_code) ⇒ Object



165
166
167
168
169
170
171
172
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 165

def update_form_with_classification_code(classification_code)
  form[Form526Submission::FORM_526]['form526']['disabilities'].each do |disability|
    disability['classificationCode'] = classification_code
  end

  update!(form_json: form.to_json)
  invalidate_form_hash
end