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
- #classify_single_contention(params) ⇒ Object
- #diagnostic_codes ⇒ Object
- #disabilities ⇒ Object
-
#disabilities_not_service_connected? ⇒ Boolean
return whether all disabilities on this form are rated as not service-connected.
- #get_claim_type ⇒ Object
- #increase_only? ⇒ Boolean
- #increase_or_new? ⇒ Boolean
- #log_max_cfi_metrics_on_submit ⇒ Object
-
#pending_eps? ⇒ Boolean
Fetch all claims from EVSS.
- #prepare_for_ep_merge! ⇒ Object
- #prepare_for_evss! ⇒ Object
- #read_metadata(key) ⇒ Object
-
#rrd_pdf_added_for_uploading? ⇒ Boolean
If an RRD pdf has been included as a file to upload.
- #rrd_pdf_created? ⇒ Boolean
- #rrd_pdf_uploaded_to_s3? ⇒ Boolean
- #rrd_special_issue_set? ⇒ Boolean
- #rrd_status ⇒ Object
- #save_metadata(metadata_hash) ⇒ Object
- #send_post_evss_notifications! ⇒ Object
- #send_rrd_alert_email(subject, message, error = nil, to = Settings.rrd.alerts.recipients) ⇒ Object
- #update_classification! ⇒ Object
- #update_form_with_classification_code(classification_code) ⇒ Object
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_codes ⇒ Object
97 98 99 |
# File 'app/models/concerns/form526_claim_fast_tracking_concern.rb', line 97 def diagnostic_codes disabilities.pluck('diagnosticCode') end |
#disabilities ⇒ Object
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
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_type ⇒ Object
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
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
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_submit ⇒ Object
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
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.}.", 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.
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
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
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
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_status ⇒ Object
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
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, , error = nil, to = Settings.rrd.alerts.recipients) RrdAlertMailer.build(self, subject, , 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 |