Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/appeals 28087 36678 uat 4 1 merge #22251

Merged
merged 6 commits into from
Jul 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ def decision_review_created

claim_id = drc_params[:claim_id]
headers = request.headers
::Events::DecisionReviewCreated.create!(consumer_event_id, claim_id, headers, drc_params)
consumer_and_claim_ids = { consumer_event_id: consumer_event_id, reference_id: claim_id }
::Events::DecisionReviewCreated.create!(consumer_and_claim_ids, headers, drc_params)
render json: { message: "DecisionReviewCreatedEvent successfully processed and backfilled" }, status: :created
rescue Caseflow::Error::RedisLockFailed => error
render json: { message: error.message }, status: :conflict
Expand Down
28 changes: 28 additions & 0 deletions app/helpers/parser_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true

module ParserHelper
# Checking for nonrating_issue_category is "Disposition" and processing such issues.
def process_nonrating_issue_category(payload_json)
payload_json[:request_issues].each do |issue|
next unless issue[:nonrating_issue_category] == "Disposition"

issue[:nonrating_issue_category] = "Unknown Issue Category"
end
end

# Generic/universal methods
# rubocop:disable Rails/TimeZone
def convert_milliseconds_to_datetime(milliseconds)
milliseconds.nil? ? nil : Time.at(milliseconds.to_i / 1000).to_datetime
end
# rubocop:enable Rails/TimeZone

# convert logical date int to date
def logical_date_converter(logical_date_int)
return nil if logical_date_int.nil? || logical_date_int.to_i.days == 0

base_date = Date.new(1970, 1, 1)
converted_date = base_date + logical_date_int.to_i.days
converted_date
end
end
2 changes: 1 addition & 1 deletion app/models/claim_review.rb
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ def cleared_nonrating_ep?

def from_decision_review_created_event?
# refer back to the associated Intake to see if both objects came from DRCE
intake ? intake.from_decision_review_created_event? : false
intake&.from_decision_review_created_event? || false
end

def sct_appeal?
Expand Down
4 changes: 3 additions & 1 deletion app/models/end_product.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ class EndProduct
"930AMADOR" => "AMA Difference of Opinion - Rating",
"930AMADONR" => "AMA Difference of Opinion - NR",
"930DORPMC" => "PMC AMA Difference of Opinion - Rating",
"930DONRPMC" => "PMC AMA Difference of Opinion - NR"
"930DONRPMC" => "PMC AMA Difference of Opinion - NR",
"930ADORPMC" => "PMC AMA Difference of Opinion - Rating",
"930ADONRPMC" => "PMC AMA Difference of Opinion - NR"
}.freeze

RAMP_CODES = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class Api::V3::Issues::Ama::RequestIssueSerializer

attribute :edited_by_css_id do |object|
if object&.edited_description.present?
object&.end_product_establishment&.user&.station_id
object&.end_product_establishment&.user&.css_id
end
end

Expand Down
112 changes: 112 additions & 0 deletions app/services/decision_review_created_issue_parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# frozen_string_literal: true

class DecisionReviewCreatedIssueParser
include ParserHelper
attr_reader :issue

def initialize(issue)
@issue = issue
end

def ri_benefit_type
@issue.dig(:benefit_type)
end

def ri_contested_issue_description
@issue.dig(:contested_issue_description)
end

def ri_contention_reference_id
@issue.dig(:contention_reference_id)
end

def ri_contested_rating_decision_reference_id
@issue.dig(:contested_rating_decision_reference_id)
end

def ri_contested_rating_issue_profile_date
@issue.dig(:contested_rating_issue_profile_date)
end

def ri_contested_rating_issue_reference_id
@issue.dig(:contested_rating_issue_reference_id)
end

def ri_contested_decision_issue_id
@issue.dig(:contested_decision_issue_id)
end

def ri_decision_date
decision_date_int = @issue.dig(:decision_date)
logical_date_converter(decision_date_int)
end

def ri_ineligible_due_to_id
@issue.dig(:ineligible_due_to_id)
end

def ri_ineligible_reason
@issue.dig(:ineligible_reason)
end

def ri_is_unidentified
@issue.dig(:is_unidentified)
end

def ri_unidentified_issue_text
@issue.dig(:unidentified_issue_text)
end

def ri_nonrating_issue_category
@issue.dig(:nonrating_issue_category)
end

def ri_nonrating_issue_description
@issue.dig(:nonrating_issue_description)
end

def ri_untimely_exemption
@issue.dig(:untimely_exemption)
end

def ri_untimely_exemption_notes
@issue.dig(:untimely_exemption_notes)
end

def ri_vacols_id
@issue.dig(:vacols_id)
end

def ri_vacols_sequence_id
@issue.dig(:vacols_sequence_id)
end

def ri_closed_at
@issue.dig(:closed_at)
end

def ri_closed_status
@issue.dig(:closed_status)
end

def ri_contested_rating_issue_diagnostic_code
@issue.dig(:contested_rating_issue_diagnostic_code)
end

def ri_ramp_claim_id
@issue.dig(:ramp_claim_id)
end

def ri_rating_issue_associated_at
ri_rating_issue_associated_at_in_ms = @issue.dig(:rating_issue_associated_at)
convert_milliseconds_to_datetime(ri_rating_issue_associated_at_in_ms)
end

def ri_nonrating_issue_bgs_id
@issue.dig(:nonrating_issue_bgs_id)
end

def ri_nonrating_issue_bgs_source
@issue.dig(:nonrating_issue_bgs_source)
end
end
16 changes: 11 additions & 5 deletions app/services/events/decision_review_created.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ class Events::DecisionReviewCreated

class << self
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Lint/UselessAssignment
def create!(consumer_event_id, reference_id, headers, payload)
def create!(params, headers, payload)
consumer_event_id = params[:consumer_event_id]
reference_id = params[:reference_id]
return if Event.exists_and_is_completed?(consumer_event_id)

redis = Redis.new(url: Rails.application.secrets.redis_url_cache)
Expand Down Expand Up @@ -48,8 +50,10 @@ def create!(consumer_event_id, reference_id, headers, payload)
decision_review: decision_review)

# NOTE: event, user, and veteran need to be before this call.
Events::DecisionReviewCreated::CreateIntake.process!(event: event, user: user, veteran: vet, parser: parser,
decision_review: decision_review)
Events::DecisionReviewCreated::CreateIntake.process!(
{ event: event, user: user, veteran: vet,
parser: parser, decision_review: decision_review }
)

# NOTE: end_product_establishment & station_id is coming from the payload
# claim_review can either be a higher_level_revew or supplemental_claim
Expand All @@ -58,8 +62,10 @@ def create!(consumer_event_id, reference_id, headers, payload)
user: user)

# NOTE: 'epe' arg is the obj created as a result of the CreateEpEstablishment service class
Events::DecisionReviewCreated::CreateRequestIssues.process!(event: event, parser: parser, epe: epe,
decision_review: decision_review)
Events::DecisionReviewCreated::CreateRequestIssues.process!(
{ event: event, parser: parser, epe: epe,
decision_review: decision_review }
)

# NOTE: decision_review arg can either be a HLR or SC object. process! will only run if
# decision_review.legacy_opt_in_approved is true
Expand Down
7 changes: 6 additions & 1 deletion app/services/events/decision_review_created/create_intake.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ class Events::DecisionReviewCreated::CreateIntake
# that was created in the DecisionReviewCreated Service.

class << self
def process!(event:, user:, veteran:, parser:, decision_review:)
def process!(params)
event = params[:event]
user = params[:user]
veteran = params[:veteran]
parser = params[:parser]
decision_review = params[:decision_review]
# create Intake
intake = Intake.create!(veteran_file_number: veteran.file_number,
user: user,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
# when an Event is received using the data sent from VBMS
class Events::DecisionReviewCreated::CreateRequestIssues
class << self
def process!(event:, parser:, epe:, decision_review:)
create_request_issue_backfill(event, parser, epe, decision_review)
def process!(params)
create_request_issue_backfill(params)
rescue StandardError => error
raise Caseflow::Error::DecisionReviewCreatedRequestIssuesError, error.message
end
Expand All @@ -14,38 +14,43 @@ def process!(event:, parser:, epe:, decision_review:)

# iterate through the array of issues and create backfill object from each one
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
def create_request_issue_backfill(event, parser, epe, decision_review)
def create_request_issue_backfill(params)
event = params[:event]
epe = params[:epe]
parser = params[:parser]
decision_review = params[:decision_review]
request_issues = parser.request_issues
newly_created_issues = []

request_issues&.each do |issue|
# create backfill RI object using extracted values
parser_issues = DecisionReviewCreatedIssueParser.new(issue)
ri = RequestIssue.create!(
benefit_type: parser.ri_benefit_type(issue),
contested_issue_description: parser.ri_contested_issue_description(issue),
contention_reference_id: parser.ri_contention_reference_id(issue),
contested_rating_decision_reference_id: parser.ri_contested_rating_decision_reference_id(issue),
contested_rating_issue_profile_date: parser.ri_contested_rating_issue_profile_date(issue),
contested_rating_issue_reference_id: parser.ri_contested_rating_issue_reference_id(issue),
contested_decision_issue_id: parser.ri_contested_decision_issue_id(issue),
decision_date: parser.ri_decision_date(issue),
ineligible_due_to_id: parser.ri_ineligible_due_to_id(issue),
ineligible_reason: parser.ri_ineligible_reason(issue),
is_unidentified: parser.ri_is_unidentified(issue),
unidentified_issue_text: parser.ri_unidentified_issue_text(issue),
nonrating_issue_category: parser.ri_nonrating_issue_category(issue),
nonrating_issue_description: parser.ri_nonrating_issue_description(issue),
untimely_exemption: parser.ri_untimely_exemption(issue),
untimely_exemption_notes: parser.ri_untimely_exemption_notes(issue),
vacols_id: parser.ri_vacols_id(issue),
vacols_sequence_id: parser.ri_vacols_sequence_id(issue),
closed_at: parser.ri_closed_at(issue),
closed_status: parser.ri_closed_status(issue),
contested_rating_issue_diagnostic_code: parser.ri_contested_rating_issue_diagnostic_code(issue),
ramp_claim_id: parser.ri_ramp_claim_id(issue),
rating_issue_associated_at: parser.ri_rating_issue_associated_at(issue),
nonrating_issue_bgs_id: parser.ri_nonrating_issue_bgs_id(issue),
nonrating_issue_bgs_source: parser.ri_nonrating_issue_bgs_source(issue),
benefit_type: parser_issues.ri_benefit_type,
contested_issue_description: parser_issues.ri_contested_issue_description,
contention_reference_id: parser_issues.ri_contention_reference_id,
contested_rating_decision_reference_id: parser_issues.ri_contested_rating_decision_reference_id,
contested_rating_issue_profile_date: parser_issues.ri_contested_rating_issue_profile_date,
contested_rating_issue_reference_id: parser_issues.ri_contested_rating_issue_reference_id,
contested_decision_issue_id: parser_issues.ri_contested_decision_issue_id,
decision_date: parser_issues.ri_decision_date,
ineligible_due_to_id: parser_issues.ri_ineligible_due_to_id,
ineligible_reason: parser_issues.ri_ineligible_reason,
is_unidentified: parser_issues.ri_is_unidentified,
unidentified_issue_text: parser_issues.ri_unidentified_issue_text,
nonrating_issue_category: parser_issues.ri_nonrating_issue_category,
nonrating_issue_description: parser_issues.ri_nonrating_issue_description,
untimely_exemption: parser_issues.ri_untimely_exemption,
untimely_exemption_notes: parser_issues.ri_untimely_exemption_notes,
vacols_id: parser_issues.ri_vacols_id,
vacols_sequence_id: parser_issues.ri_vacols_sequence_id,
closed_at: parser_issues.ri_closed_at,
closed_status: parser_issues.ri_closed_status,
contested_rating_issue_diagnostic_code: parser_issues.ri_contested_rating_issue_diagnostic_code,
ramp_claim_id: parser_issues.ri_ramp_claim_id,
rating_issue_associated_at: parser_issues.ri_rating_issue_associated_at,
nonrating_issue_bgs_id: parser_issues.ri_nonrating_issue_bgs_id,
nonrating_issue_bgs_source: parser_issues.ri_nonrating_issue_bgs_source,
end_product_establishment_id: epe.id,
veteran_participant_id: parser.veteran_participant_id,
decision_review: decision_review
Expand Down
Loading
Loading