Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,8 @@ def update_evidences_for_applicant(res_applicant_entity)
eligibility_entity.evidences.each do |evidence_entity|
evidence = eligibility.evidences.detect { |e| e.key.to_sym == evidence_entity.key.to_sym }
next unless evidence
update_evidence(evidence, evidence_entity) if evidence_entity.request_results.present? || evidence_entity.verification_histories.present?

update_evidence_state(evidence, evidence_entity) if evidence_entity.request_results.present? || evidence_entity.verification_histories.present?
record_request_result(evidence, evidence_entity, applicant) if evidence_entity.request_results.present?
record_verification_result(evidence, evidence_entity) if evidence_entity.verification_histories.present?
end
Expand All @@ -215,17 +216,19 @@ def update_evidences_for_applicant(res_applicant_entity)
def record_request_result(evidence, evidence_entity, applicant)
result_result_entity = evidence_entity.request_results.first
evidence.request_results.new(result_result_entity.to_h)
assign_citizen_status(evidence_entity, applicant) if result_result_entity.source.to_s == "FDSH SSA"
assign_five_year_bar_citizenship_result(evidence_entity, applicant) if result_result_entity.source.to_s == "FDSH VLP"
json_raw_payload = evidence_entity.request_results.first.raw_payload
raw_payload = JSON.parse(json_raw_payload, symbolize_names: true)

assign_citizen_status(raw_payload, applicant) if result_result_entity.source.to_s == "FDSH SSA"
assign_five_year_bar_citizenship_result(raw_payload, applicant) if result_result_entity.source.to_s == "FDSH VLP"
assign_immigration_evidence_response_codes(raw_payload, evidence) if EnrollRegistry.feature_enabled?(:vlp_upgrade_v37_1_2) && evidence.key == "immigration_evidence"
rescue StandardError => e
record_ingestion_result(evidence, e)
end

def assign_citizen_status(evidence_entity, applicant)
json_raw_payload = evidence_entity.request_results.first.raw_payload
response = JSON.parse(json_raw_payload, symbolize_names: true)
response_code = response.dig(:ResponseMetadata, :ResponseCode)
ssa_response = response.dig(:SSACompositeIndividualResponses, 0, :SSAResponse)
def assign_citizen_status(raw_payload, applicant)
response_code = raw_payload.dig(:ResponseMetadata, :ResponseCode)
ssa_response = raw_payload.dig(:SSACompositeIndividualResponses, 0, :SSAResponse)
return applicant.citizenship_result = ::ConsumerRole::NOT_LAWFULLY_PRESENT_STATUS unless response_code == "HS000000" && ssa_response.present?

ssn_indicator = ssa_response[:SSNVerificationIndicator]
Expand All @@ -236,9 +239,7 @@ def assign_citizen_status(evidence_entity, applicant)
end

# update applicant only for vlp payloads
def assign_five_year_bar_citizenship_result(evidence_entity, applicant)
json_raw_payload = evidence_entity.request_results.first.raw_payload
raw_payload = JSON.parse(json_raw_payload, symbolize_names: true)
def assign_five_year_bar_citizenship_result(raw_payload, applicant)
initial_responses = raw_payload.dig(:InitialVerificationResponseSet, :InitialVerificationIndividualResponses)
return unless initial_responses

Expand All @@ -252,6 +253,39 @@ def assign_five_year_bar_citizenship_result(evidence_entity, applicant)
applicant.citizenship_result = get_citizen_status(applicant, individual_response)
end

def assign_immigration_evidence_response_codes(raw_payload, evidence)
initial_responses = raw_payload.dig(:InitialVerificationResponseSet, :InitialVerificationIndividualResponses)
return unless initial_responses

individual_response = initial_responses[0]
return unless individual_response

individual_response_set = individual_response[:InitialVerificationIndividualResponseSet]
return unless individual_response_set

evidence.assign_attributes(build_immigration_response_hash(raw_payload, individual_response, individual_response_set))
end

def build_immigration_response_hash(raw_payload, individual_response, individual_response_set)
# TODO: Use the below lines in hash once we have the logic to capture transaction id from the response
# evidence.response_transaction_id = individual_response_set[:ResponseTransactionId]
# evidence.response_timestamp : is set to current time as this is the response time for the evidence

{response_code: raw_payload.dig(:ResponseMetadata, :ResponseCode),
response_description_text: raw_payload.dig(:ResponseMetadata, :ResponseDescriptionText),
us_citizen_code: individual_response.dig(:InitialVerificationIndividualResponseSet, :USCitizenCode),
lawful_presence_verified_code: individual_response[:LawfulPresenceVerifiedCode],
aptc_eligible_non_citizen_code: individual_response_set[:APTCEligibleNonCitizenCode],
medicaid_eligible_non_citizen_code: individual_response_set[:MCEligibleNonCitizenCode],
qualified_non_citizen_code: individual_response_set[:QualifiedNonCitizenCode],
five_year_bar_apply_code: individual_response_set[:FiveYearBarApplyCode],
five_year_bar_met_code: individual_response_set[:FiveYearBarMetCode],
non_cit_coa_code: individual_response_set[:NonCitCoaCode],
elig_statement_cd: individual_response_set[:EligStatementCd],
elig_statement_txt: individual_response_set[:EligStatementTxt],
response_timestamp: DateTime.now}
end

def get_citizen_status(applicant, individual_response)
return ::ConsumerRole::NOT_LAWFULLY_PRESENT_STATUS unless ['Y', 'X'].include?(individual_response[:LawfulPresenceVerifiedCode])
status = individual_response.dig(:InitialVerificationIndividualResponseSet, :EligStatementTxt)
Expand Down Expand Up @@ -345,7 +379,7 @@ def record_ingestion_result(evidence, error)
# @param evidence [Eligibilities::V3::Evidence] The evidence to update
# @param evidence_entity [AcaEntities::MagiMedicaid::Evidence] The evidence entity from the response
# @return [void]
def update_evidence(evidence, evidence_entity)
def update_evidence_state(evidence, evidence_entity)
case evidence_entity.current_state
when :attested
evidence.mark_as_verified
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -431,4 +431,80 @@
end
end
end

describe 'when vlp_upgrade_v37_1_2 is enabled' do
let(:immigration_rr) do
{ result: 'test_state',
source: "FDSH VLP",
code: 'HS000000',
code_description: 'SSA VLP Determined',
raw_payload: "{\"ResponseMetadata\":{\"ResponseCode\":\"HS000000\",\"ResponseDescriptionText\":\"Successful\"},
\"InitialVerificationResponseSet\":{\"InitialVerificationIndividualResponses\":[{\"ResponseMetadata\":{\"ResponseCode\":\"HS000000\",
\"ResponseDescriptionText\":\"Successful\"},\"LawfulPresenceVerifiedCode\":\"P\",\"InitialVerificationIndividualResponseSet\":{\"CaseNumber\":\"0000000000000AA\",\"NonCitLastName\":\"NonCitLastName1\",
\"NonCitFirstName\":\"NonCitFirstName1\",\"NonCitMiddleName\":null,\"NonCitBirthDate\":\"2006-05-04T00:00:00.000Z\",\"NonCitEntryDate\":null,\"AdmittedToDate\":null,\"AdmittedToText\":null,
\"NonCitCountryBirthCd\":null,\"NonCitCountryCitCd\":null,\"NonCitCoaCode\":null,\"NonCitProvOfLaw\":null,\"NonCitEadsExpireDate\":null,\"EligStatementCd\":5,\"EligStatementTxt\":\"EligStatementTxt1\",
\"IAVTypeCode\":null,\"IAVTypeTxt\":null,\"WebServSftwrVer\":\"WebServSftwrVer1\",\"GrantDate\":null,\"GrantDateReasonCd\":null,\"SponsorDataFoundIndicator\":null,\"ArrayOfSponsorshipData\":null,
\"SponsorshipReasonCd\":null,\"AgencyAction\":\"AgencyAction1\",\"FiveYearBarApplyCode\":\"N\",\"QualifiedNonCitizenCode\":\"N\",\"APTCEligibleNonCitizenCode\":\"Y\",\"MCEligibleNonCitizenCode\":\"N\",
\"FiveYearBarMetCode\":\"N\",\"USCitizenCode\":\"N\"}}]}}"}
end

before do
allow(EnrollRegistry).to receive(:feature_enabled?).with(:vlp_upgrade_v37_1_2).and_return(true)
@application_hash = Operations::Fdsh::BuildAndValidateApplicationPayload.new.call(application).value!.to_h
@determinations = application.applicants.pluck(:person_hbx_id)
application.applicants.each do |applicant|
applicant.build_ivl_eligibility_with_evidences
individual_market_eligibility = applicant.individual_market_eligibility
individual_market_eligibility.evidences.build(
_type: 'Eligibilities::V3::Evidences::ImmigrationEvidence',
title: 'Immigration Evidence',
key: :immigration_evidence,
current_state: :pending
)
applicant.save
end
end

context 'with valid application' do
before do
@application_hash[:applicants].each do |applicant|
applicant[:eligibilities] = [eligibility_hash]
end
@result = subject.call({call_type: 'application_determination', job_id: job.job_id, application_hbx_id: @application_hash[:hbx_id],
response: @application_hash.to_json, app_type: 'faa',
determinations: {ssa: @determinations, vlp: @determinations}})
end

it 'returns success with message' do
expect(@result).to be_success
expect(::Transmittable::Job.first.process_status.latest_state).to eq(:succeeded)
expect(::Transmittable::Transmission.first.process_status.latest_state).to eq(:succeeded)
expect(::Transmittable::Transaction.first.process_status.latest_state).to eq(:succeeded)
end

it 'record response code in immigration evidence' do
application.reload
applicant = application.applicants.first
individual_market_eligibility = applicant.individual_market_eligibility

immigration_evidence = individual_market_eligibility.evidences.detect { |e| e.key.to_s == "immigration_evidence" }

expect(immigration_evidence.response_code).to eq 'HS000000'
expect(immigration_evidence.response_description_text).to eq 'Successful'
expect(immigration_evidence.lawful_presence_verified_code).to eq 'P'
expect(immigration_evidence.aptc_eligible_non_citizen_code).to eq 'Y'
expect(immigration_evidence.medicaid_eligible_non_citizen_code).to eq 'N'
expect(immigration_evidence.qualified_non_citizen_code).to eq 'N'
expect(immigration_evidence.five_year_bar_apply_code).to eq 'N'
expect(immigration_evidence.five_year_bar_met_code).to eq 'N'
expect(immigration_evidence.non_cit_coa_code).to be_nil
expect(immigration_evidence.elig_statement_cd).to eq '5'
expect(immigration_evidence.elig_statement_txt).to eq 'EligStatementTxt1'

# TODO: Uncomment the below lines once we have the logic to capture transaction id and timestamp from the response
# expect(immigration_evidence.response_transaction_id).to be_present
# expect(immigration_evidence.response_timestamp).to be_present
end
end
end
end
Loading