diff --git a/app/domain/operations/eligibilities/v3/individual_market/ssa_vlp_determined.rb b/app/domain/operations/eligibilities/v3/individual_market/ssa_vlp_determined.rb index 4c74daf5676..6e703bd248a 100644 --- a/app/domain/operations/eligibilities/v3/individual_market/ssa_vlp_determined.rb +++ b/app/domain/operations/eligibilities/v3/individual_market/ssa_vlp_determined.rb @@ -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 @@ -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] @@ -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 @@ -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) @@ -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 diff --git a/spec/domain/operations/eligibilities/v3/individual_market/ssa_vlp_determined_spec.rb b/spec/domain/operations/eligibilities/v3/individual_market/ssa_vlp_determined_spec.rb index bafcf4fa1fa..8fa02eb46a2 100644 --- a/spec/domain/operations/eligibilities/v3/individual_market/ssa_vlp_determined_spec.rb +++ b/spec/domain/operations/eligibilities/v3/individual_market/ssa_vlp_determined_spec.rb @@ -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 \ No newline at end of file