Skip to content

Commit

Permalink
Merge branch 'master' of github.com:department-of-veterans-affairs/ve…
Browse files Browse the repository at this point in the history
…ts-api into mm/1407-v1
  • Loading branch information
MarchandMD committed Oct 24, 2024
2 parents bf7f25e + 82306d1 commit 2b1b397
Show file tree
Hide file tree
Showing 50 changed files with 1,120 additions and 468 deletions.
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -612,6 +612,7 @@ app/sidekiq/cypress_viewport_updater @department-of-veterans-affairs/backend-rev
app/sidekiq/decision_review @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
app/sidekiq/decision_review/form4142_submit.rb @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
app/sidekiq/decision_review/submit_upload.rb @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
app/sidekiq/delete_old_pii_logs_job.rb @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/va-api-engineers
app/sidekiq/education_form @department-of-veterans-affairs/my-education-benefits @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
app/sidekiq/education_form/templates/10203.erb @department-of-veterans-affairs/govcio-vfep-codereviewers @department-of-veterans-affairs/backend-review-group
app/sidekiq/education_form/templates/1990.erb @department-of-veterans-affairs/govcio-vfep-codereviewers @department-of-veterans-affairs/backend-review-group
Expand Down Expand Up @@ -1321,6 +1322,7 @@ spec/sidekiq/copay_notifications @department-of-veterans-affairs/vsa-debt-resolu
spec/sidekiq/decision_review @department-of-veterans-affairs/benefits-decision-reviews-be @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
spec/sidekiq/education_form @department-of-veterans-affairs/my-education-benefits @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
spec/sidekiq/education_form/create_daily_spool_files.rb @department-of-veterans-affairs/my-education-benefits @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/govcio-vfep-codereviewers
spec/sidekiq/delete_old_pii_logs_job_spec.rb @department-of-veterans-affairs/backend-review-group @department-of-veterans-affairs/va-api-engineers
spec/sidekiq/evss/dependents_application_job_spec.rb @department-of-veterans-affairs/benefits-dependents-management @department-of-veterans-affairs/vfs-authenticated-experience-backend @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
spec/sidekiq/evss/disability_compensation_form @department-of-veterans-affairs/Disability-Experience @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
spec/sidekiq/evss/disability_compensation_form/form526_document_upload_failure_email_spec.rb @department-of-veterans-affairs/Disability-Experience @department-of-veterans-affairs/va-api-engineers @department-of-veterans-affairs/backend-review-group
Expand Down
11 changes: 3 additions & 8 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -525,14 +525,9 @@ GEM
thor (>= 0.20, < 2.a)
google-cloud-env (2.2.1)
faraday (>= 1.0, < 3.a)
google-protobuf (4.28.2)
google-protobuf (4.28.3)
bigdecimal
rake (>= 13)
google-protobuf (4.28.2-java)
bigdecimal
ffi (~> 1)
ffi-compiler (~> 1)
rake (>= 13)
googleauth (1.11.1)
faraday (>= 1.0, < 3.a)
google-cloud-env (~> 2.1)
Expand Down Expand Up @@ -600,8 +595,8 @@ GEM
jar-dependencies (0.4.1)
jmespath (1.6.2)
jruby-openssl (0.15.0-java)
json (2.7.2)
json (2.7.2-java)
json (2.7.3)
json (2.7.3-java)
json-schema (5.0.1)
addressable (~> 2.8)
json_schema (0.21.0)
Expand Down
26 changes: 13 additions & 13 deletions app/models/concerns/form526_claim_fast_tracking_concern.rb
Original file line number Diff line number Diff line change
Expand Up @@ -205,21 +205,21 @@ def update_contention_classification_all!
end

def log_max_cfi_metrics_on_submit
user = User.find(user_uuid)
max_cfi_enabled = Flipper.enabled?(:disability_526_maximum_rating, user) ? 'on' : 'off'
ClaimFastTracking::DiagnosticCodesForMetrics::DC.each do |diagnostic_code|
next unless max_rated_diagnostic_codes_from_ipf.include?(diagnostic_code)

max_rated_diagnostic_codes_from_ipf.each do |diagnostic_code|
disability_claimed = diagnostic_codes.include?(diagnostic_code)

if disability_claimed
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.#{max_cfi_enabled}.submit.#{diagnostic_code}")
end
Rails.logger.info('Max CFI form526 submission',
id:, max_cfi_enabled:, disability_claimed:, diagnostic_code:,
cfi_checkbox_was_selected: cfi_checkbox_was_selected?,
total_increase_conditions: increase_disabilities.count)
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.submit",
tags: ["diagnostic_code:#{diagnostic_code}", "claimed:#{disability_claimed}"])
end
claimed_max_rated_dcs = max_rated_diagnostic_codes_from_ipf & diagnostic_codes
Rails.logger.info('Max CFI form526 submission',
id:,
num_max_rated: max_rated_diagnostic_codes_from_ipf.count,
num_max_rated_cfi: claimed_max_rated_dcs.count,
total_cfi: increase_disabilities.count,
cfi_checkbox_was_selected: cfi_checkbox_was_selected?)
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.on_submit",
tags: ["claimed:#{claimed_max_rated_dcs.any?}",
"has_max_rated:#{max_rated_diagnostic_codes_from_ipf.any?}"])
rescue => e
# Log the exception but but do not fail, otherwise form will not be submitted
log_exception_to_sentry(e)
Expand Down
1 change: 1 addition & 0 deletions app/models/lighthouse_document.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class LighthouseDocument < Common::Base
include ActiveModel::Validations::Callbacks
include SentryLogging

attribute :first_name, String
attribute :claim_id, Integer
attribute :document_type, String
attribute :file_name, String
Expand Down
24 changes: 8 additions & 16 deletions app/services/claim_fast_tracking/max_cfi_metrics.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,6 @@ def log_form_update
log_exception_to_sentry(e)
end

def flipper_enabled_state
@flipper_enabled_state ||= begin
user = User.find(form.user_uuid)
Flipper.enabled?(:disability_526_maximum_rating, user) ? 'on' : 'off'
end
end

def claiming_increase?
form_data&.dig('view:claim_type', 'view:claiming_increase') ||
form_data&.dig('view:claimType', 'view:claimingIncrease')
Expand All @@ -82,22 +75,21 @@ def max_rated_disabilities_diagnostic_codes
max_rated_disabilities.map { |dis| dis['diagnosticCode'] || dis['diagnostic_code'] }
end

def diagnostic_codes_for_logging_metrics
ClaimFastTracking::DiagnosticCodesForMetrics::DC.intersection(max_rated_disabilities_diagnostic_codes)
end

private

def log_init_metric
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.#{flipper_enabled_state}.526_started")
diagnostic_codes_for_logging_metrics.each do |dc|
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.#{flipper_enabled_state}.526_started.#{dc}")
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.on_526_started",
tags: ["has_max_rated:#{max_rated_disabilities.any?}"])
max_rated_disabilities_diagnostic_codes.each do |dc|
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.526_started", tags: ["diagnostic_code:#{dc}"])
end
end

def log_cfi_metric
diagnostic_codes_for_logging_metrics.each do |dc|
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.#{flipper_enabled_state}.rated_disabilities.#{dc}")
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.on_rated_disabilities",
tags: ["has_max_rated:#{max_rated_disabilities.any?}"])
max_rated_disabilities_diagnostic_codes.each do |dc|
StatsD.increment("#{MAX_CFI_STATSD_KEY_PREFIX}.rated_disabilities", tags: ["diagnostic_code:#{dc}"])
end
end
end
Expand Down
17 changes: 17 additions & 0 deletions app/sidekiq/benefits_intake_status_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ def batch_process(pending_form_submissions)
pending_form_submissions.each_slice(batch_size) do |batch|
batch_uuids = batch.map(&:benefits_intake_uuid)
response = intake_service.bulk_status(uuids: batch_uuids)

# Log the entire response for debugging purposes
Rails.logger.info("Received bulk status response: #{response.body}")

raise response.body unless response.success?

total_handled += handle_response(response, batch)
Expand All @@ -59,6 +63,12 @@ def batch_process(pending_form_submissions)
def handle_response(response, pending_form_submissions)
total_handled = 0

# Ensure response body contains data, and log the data for debugging
if response.body['data'].blank?
Rails.logger.error("Response data is blank or missing: #{response.body}")
return total_handled
end

response.body['data']&.each do |submission|
uuid = submission['id']
form_submission = pending_form_submissions.find do |submission_from_db|
Expand All @@ -71,6 +81,10 @@ def handle_response(response, pending_form_submissions)

# https://developer.va.gov/explore/api/benefits-intake/docs
status = submission.dig('attributes', 'status')

# Log the status for debugging
Rails.logger.info("Processing submission UUID: #{uuid}, Status: #{status}")

lighthouse_updated_at = submission.dig('attributes', 'updated_at')
if status == 'expired'
# Expired - Indicate that documents were not successfully uploaded within the 15-minute window.
Expand All @@ -95,6 +109,9 @@ def handle_response(response, pending_form_submissions)
else
# no change being tracked
log_result('pending', form_id, uuid)
Rails.logger.info(
"Submission UUID: #{uuid} is still pending, status: #{status}, time to transition: #{time_to_transition}"
)
end

total_handled += 1
Expand Down
12 changes: 8 additions & 4 deletions app/sidekiq/delete_old_pii_logs_job.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
class DeleteOldPiiLogsJob
include Sidekiq::Job

sidekiq_options(unique_for: 30.minutes, retry: false)
sidekiq_options unique_for: 30.minutes, retry: false

EXPIRATION_TIME = 2.weeks
BATCH_SIZE = 10_000

def perform
PersonalInformationLog.where(
'created_at < ?', EXPIRATION_TIME.ago
).delete_all
loop do
records = PersonalInformationLog.where('created_at < ?', EXPIRATION_TIME.ago).limit(BATCH_SIZE)
break if records.empty?

records.delete_all
end
end
end
53 changes: 53 additions & 0 deletions app/sidekiq/lighthouse/document_upload.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,66 @@
class Lighthouse::DocumentUpload
include Sidekiq::Job

FILENAME_EXTENSION_MATCHER = /\.\w*$/
OBFUSCATED_CHARACTER_MATCHER = /[a-zA-Z\d]/

NOTIFY_SETTINGS = Settings.vanotify.services.benefits_management_tools
MAILER_TEMPLATE_ID = NOTIFY_SETTINGS.template_id.evidence_submission_failure_email

# retry for one day
sidekiq_options retry: 14, queue: 'low'
# Set minimum retry time to ~1 hour
sidekiq_retry_in do |count, _exception|
rand(3600..3660) if count < 9
end

sidekiq_retries_exhausted do |msg, _ex|
next unless Flipper.enabled?('cst_send_evidence_failure_emails')

icn = msg['args'].first
first_name = msg['args'][1]['first_name'].titleize
filename = obscured_filename(msg['args'][1]['file_name'])
date_submitted = format_issue_instant_for_mailers(msg['created_at'])

notify_client.send_email(
recipient_identifier: { id_value: icn, id_type: 'ICN' },
template_id: MAILER_TEMPLATE_ID,
personalisation: { first_name:, filename:, date_submitted: }
)

::Rails.logger.info('Lighthouse::DocumentUpload exhaustion handler email sent')
rescue => e
::Rails.logger.error('Lighthouse::DocumentUpload exhaustion handler email error',
{ message: e.message })
end

def self.obscured_filename(original_filename)
extension = original_filename[FILENAME_EXTENSION_MATCHER]
filename_without_extension = original_filename.gsub(FILENAME_EXTENSION_MATCHER, '')

if filename_without_extension.length > 5
# Obfuscate with the letter 'X'; we cannot obfuscate with special characters such as an asterisk,
# as these filenames appear in VA Notify Mailers and their templating engine uses markdown.
# Therefore, special characters can be interpreted as markdown and introduce formatting issues in the mailer
obfuscated_portion = filename_without_extension[3..-3].gsub(OBFUSCATED_CHARACTER_MATCHER, 'X')
filename_without_extension[0..2] + obfuscated_portion + filename_without_extension[-2..] + extension
else
original_filename
end
end

def self.format_issue_instant_for_mailers(issue_instant)
# We want to return all times in EDT
timestamp = Time.at(issue_instant).in_time_zone('America/New_York')

# We display dates in mailers in the format "May 1, 2024 3:01 p.m. EDT"
timestamp.strftime('%B %-d, %Y %-l:%M %P %Z').sub(/([ap])m/, '\1.m.')
end

def self.notify_client
VaNotify::Service.new(NOTIFY_SETTINGS.api_key)
end

def perform(user_icn, document_hash)
client = BenefitsDocuments::WorkerService.new
document, file_body, uploader = nil
Expand Down
13 changes: 8 additions & 5 deletions config/features.yml
Original file line number Diff line number Diff line change
Expand Up @@ -457,6 +457,9 @@ features:
disability_526_toxic_exposure_ipf:
actor_type: user
description: enables new pages, processing, and submission of toxic exposure claims for in progress forms (ipf)
disability_526_new_confirmation_page:
actor_type: user
description: enables new confirmation page for form 526 submission confirmation page
disability_526_toxic_exposure_document_upload_polling:
actor_type: user
description: enables the poll_form526_pdf call during the perform_ancillary_jobs step of submissions
Expand Down Expand Up @@ -733,19 +736,19 @@ features:
actor_type: user
description: If enabled shows the digital form experience for form 40-0247
form1010d:
actor_type: user
actor_type: cookie_id
description: If enabled shows the digital form experience for form 10-10d (IVC CHAMPVA)
form107959c:
actor_type: user
actor_type: cookie_id
description: If enabled shows the digital form experience for form 10-7959c (IVC CHAMPVA other health insurance)
form107959a:
actor_type: user
actor_type: cookie_id
description: If enabled shows the digital form experience for form 10-7959a (IVC CHAMPVA claim form)
form107959f1:
actor_type: user
actor_type: cookie_id
description: If enabled shows the digital form experience for form 10-7959f-1 (Foreign Medical Program register form)
form107959f2:
actor_type: user
actor_type: cookie_id
description: If enabled shows the digital form experience for form 10-7959f-2 (Foreign Medical Program claim form)
form_upload_flow:
actor_type: user
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class AddStatusToIntentToFileQueueExhaustion < ActiveRecord::Migration[7.1]
def change
create_enum :itf_remediation_status, %w[unprocessed]

add_column :intent_to_file_queue_exhaustions, :status, :enum, enum_type: 'itf_remediation_status', default: 'unprocessed'
end
end
5 changes: 5 additions & 0 deletions db/schema.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions lib/lighthouse/benefits_documents/service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ def build_lh_doc(file, file_params)
password = file_params[:password]

LighthouseDocument.new(
first_name: @user.first_name,
participant_id: @user.participant_id,
claim_id:,
file_obj: file,
Expand Down
Loading

0 comments on commit 2b1b397

Please sign in to comment.