Skip to content

Commit

Permalink
Add updated logic for mapping of additional reasons. (#523)
Browse files Browse the repository at this point in the history
  • Loading branch information
TreyE authored Aug 23, 2024
1 parent 1ef5e6a commit 5925454
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 42 deletions.
23 changes: 17 additions & 6 deletions lib/aca_entities/atp/functions/applicant_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,28 @@ def call(cache)
end

def referral_activity(applicant)
additional_reason_codes = applicant[:additional_reason_codes]&.flat_map {|e| e[:additional_reason_codes]}
reason_code = applicant[:reason_code].blank? ? "FullDetermination" : applicant[:reason_code]
{
referral_activity_values = {
activity_id: { identification_id: ["SBM", DateTime.now.strftime("%Y%m%d%H%M%S"), "pe#{applicant[:person_hbx_id]}"&.slice(-3..-1)].join },
activity_date: { date_time: DateTime.now },
sender_reference: { :ref => "Sender" }, # TODO
receiver_reference: { :ref => "medicaidReceiver" }, # TODO
status: { :status_code => "Initiated" }, # TODO
reason_code: reason_code, # TODO
additional_reason_codes: additional_reason_codes
status: { :status_code => "Initiated" } # TODO
}
referral_activity_values[:reason_code] = applicant[:reason_code] unless applicant[:reason_code].blank?
unless applicant[:additional_reason_codes].nil?
referral_activity_values[:additional_reason_codes] = extract_additional_reason_codes(applicant[:additional_reason_codes])
end
referral_activity_values
end

# I don't know why the transformer 'double-nests' my array value,
# but I'm not going to fix it at the risk of damaging overall behaviour
def extract_additional_reason_codes(reason_codes_value)
if reason_codes_value.is_a?(Array) && reason_codes_value.first.is_a?(Hash)
reason_codes_value.first.values.first
else
reason_codes_value
end
end

def get_enrolled_non_esi_indicator(enrolled_non_esi_benfits)
Expand Down
84 changes: 61 additions & 23 deletions lib/aca_entities/atp/xml/constraint/exchange/SBM_MESBM.xsd
Original file line number Diff line number Diff line change
@@ -1,25 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:exch="http://at.dsh.cms.gov/exchange/1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:hix-ee="http://hix.cms.gov/0.1/hix-ee"
xmlns:i="http://niem.gov/niem/appinfo/2.0"
xmlns:hix-types="http://hix.cms.gov/0.1/hix-types"
xmlns:s="http://niem.gov/niem/structures/2.0"
xmlns:me-atp="http://xmlns.coverme.gov/atp/hix-ee"
attributeFormDefault="qualified"
elementFormDefault="qualified" targetNamespace="http://xmlns.coverme.gov/atp/hix-ee" version="1">
<xsd:import namespace="http://hix.cms.gov/0.1/hix-types"
schemaLocation="../niem/domains/hix/0.1/hix-tupes/hix-types.xsd" />
<xsd:import namespace="http://hix.cms.gov/0.1/hix-ee"
schemaLocation="../niem/domains/hix/0.1/hix-ee/hix-ee.xsd" />
<xsd:import namespace="http://niem.gov/niem/structures/2.0"
schemaLocation="../../subset/niem/structures/2.0/structures.xsd"/>

<xsd:element abstract="false" name="ReferralActivity"
substitutionGroup="hix-ee:ReferralActivity"
type="me-atp:ReferralActivityType">
</xsd:element>

xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:hix-ee="http://hix.cms.gov/0.1/hix-ee"
xmlns:i="http://niem.gov/niem/appinfo/2.0"
xmlns:hix-types="http://hix.cms.gov/0.1/hix-types"
xmlns:s="http://niem.gov/niem/structures/2.0"
xmlns:me-atp="http://xmlns.coverme.gov/atp/hix-ee" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.coverme.gov/atp/hix-ee" version="1">
<xsd:import namespace="http://hix.cms.gov/0.1/hix-types" schemaLocation="../niem/domains/hix/0.1/hix-tupes/hix-types.xsd" />
<xsd:import namespace="http://hix.cms.gov/0.1/hix-ee" schemaLocation="../niem/domains/hix/0.1/hix-ee/hix-ee.xsd" />
<xsd:import namespace="http://niem.gov/niem/structures/2.0" schemaLocation="../../subset/niem/structures/2.0/structures.xsd"/>

<xsd:element abstract="false" name="ReferralActivity" substitutionGroup="hix-ee:ReferralActivity" type="me-atp:ReferralActivityType">
</xsd:element>

<xsd:complexType abstract="false" mixed="false" name="ReferralActivityType">
<xsd:annotation>
<xsd:appinfo>
Expand All @@ -35,6 +28,51 @@
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

<xsd:element name="AdditionalReferralActivityReasonCode" type="hix-types:ReferralActivityReasonCodeType" />

<xsd:simpleType name="AdditionalReferralActivityReasonCodeSimpleType">
<xsd:annotation>
<xsd:appinfo>
<i:Base i:name="Object" i:namespace="http://niem.gov/niem/structures/2.0"/>
</xsd:appinfo>
<xsd:documentation source="">A data type for a reason for a referral activity.</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:token">
<xsd:enumeration value="FullDetermination">
<xsd:annotation>
<xsd:documentation source="">The applicant has requested a full determination be made for Medicaid and Children's Health Insurance Program eligibility.</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="WaitingPeriodException">
<xsd:annotation>
<xsd:documentation source="">The marketplace has requested that a Children's Health Insurance Program (CHIP) system determine if an applicant qualifies for an exception to the normal waiting period rules for the Children's Health Insurance Program. (This reason can apply either in the case of an initial referral from a marketplace to a CHIP system or in the case of a rejected referral initiated by a CHIP system.)</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="GapFilling">
<xsd:annotation>
<xsd:documentation source="">The sender is referring an applicant under the gap filling rules established by the Centers for Medicare &amp; Medicaid Services.</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
<xsd:enumeration value="Renewal">
<xsd:annotation>
<xsd:documentation source="">The sender is referring an applicant under a renewal application.</xsd:documentation>
</xsd:annotation>
</xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="AdditionalReferralActivityReasonCodeType">
<xsd:annotation>
<xsd:appinfo>
<i:Base i:name="Object" i:namespace="http://niem.gov/niem/structures/2.0"/>
</xsd:appinfo>
<xsd:documentation source="">A data type for an additional reason for a referral activity.</xsd:documentation>
</xsd:annotation>
<xsd:simpleContent>
<xsd:extension base="me-atp:AdditionalReferralActivityReasonCodeSimpleType">
<xsd:attributeGroup ref="s:SimpleObjectAttributeGroup"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:element name="AdditionalReferralActivityReasonCode" type="me-atp:AdditionalReferralActivityReasonCodeType" />
</xsd:schema>
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ class AccountTransferRequestContract < Dry::Validation::Contract
required(:people).array(:hash)
required(:senders).filled(:array)
required(:receivers).filled(:array)
required(:insurance_application).filled(:hash)
optional(:medicaid_households).array(:hash)
optional(:assister).maybe(:hash)
optional(:authorized_representative).maybe(:hash)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@ class AdditionalReferralActivity
has_one :receiver_reference, ReferralActivityReceiverReference
has_one :status, ReferralActivityStatus
element :reason_code, String, tag: 'ReferralActivityReasonCode', namespace: "hix-ee"
has_many :additional_reason_codes, String, tag: 'AdditionalReferralActivityReasonCode', namespace: 'me-atp'
has_many :eligibility_reason_reference, ReferralActivityEligibilityReasonReference

# As this is derived by extension, new elements must come last.
has_many :additional_reason_codes, String, tag: 'AdditionalReferralActivityReasonCode', namespace: 'me-atp'

def self.domain_to_mapper(referral_activity)
mapper = self.new
mapper.activity_id = ActivityIdentification.domain_to_mapper(referral_activity.activity_id)
Expand All @@ -37,9 +39,8 @@ def self.domain_to_mapper(referral_activity)
mapper.receiver_reference = ReferralActivityReceiverReference.domain_to_mapper(referral_activity.receiver_reference)
mapper.status = ReferralActivityStatus.domain_to_mapper(referral_activity.status)
other_reason_codes = referral_activity.additional_reason_codes || []
encoded_additional_reasons = other_reason_codes - [referral_activity.reason_code]
mapper.reason_code = referral_activity.reason_code
mapper.additional_reason_codes = encoded_additional_reasons
mapper.reason_code = referral_activity.reason_code unless referral_activity.reason_code.blank?
mapper.additional_reason_codes = other_reason_codes
mapper
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,10 +187,10 @@ def to_hash # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
def self.encode_ref_activity(mapper, ref_activity)
return unless ref_activity

if ref_activity.additional_reason_codes.present? && ref_activity.additional_reason_codes.any?
mapper.additional_referral_activity = AdditionalReferralActivity.domain_to_mapper(ref_activity)
else
if ref_activity.additional_reason_codes.nil?
mapper.referral_activity = ReferralActivity.domain_to_mapper(ref_activity)
else
mapper.additional_referral_activity = AdditionalReferralActivity.domain_to_mapper(ref_activity)
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def self.domain_to_mapper(referral_activity)
mapper.sender_reference = ReferralActivitySenderReference.domain_to_mapper(referral_activity.sender_reference)
mapper.receiver_reference = ReferralActivityReceiverReference.domain_to_mapper(referral_activity.receiver_reference)
mapper.status = ReferralActivityStatus.domain_to_mapper(referral_activity.status)
mapper.reason_code = referral_activity.reason_code
mapper.reason_code = referral_activity.reason_code unless referral_activity.reason_code.blank?
mapper
end

Expand Down
8 changes: 4 additions & 4 deletions spec/aca_entities/atp/operations/aces/generate_xml_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -75,12 +75,12 @@
expect(texts&.first&.content&.strip).to eq "true"
end

it 'should include the default referral activity reason code' do
it 'should not include any default activity code' do
payload_hash[:family][:magi_medicaid_applications][:applicants].first[:is_temporarily_out_of_state] = true
result = described_class.new.call(payload_hash.to_json)
doc = Nokogiri::XML.parse(result.value!)
texts = doc.xpath("//hix-ee:InsuranceApplicant/hix-ee:ReferralActivity/hix-ee:ReferralActivityReasonCode", namespaces).map(&:content)
expect(texts).to eq ["FullDetermination", "FullDetermination", "FullDetermination"]
expect(texts).to eq []
end

context 'when person has contact with unmappable kind' do
Expand Down Expand Up @@ -1078,11 +1078,11 @@
let(:payload) { File.read(Pathname.pwd.join("spec/support/atp/sample_payloads/multiple_reason_L_cv_payload.json")) }
let(:payload_hash) { JSON.parse(payload, symbolize_names: true) }

it 'should include additional referral activity reason codes, excluding the primary one' do
it 'should include additional referral activity reason codes' do
payload_hash[:family][:magi_medicaid_applications][:applicants].first[:is_temporarily_out_of_state] = true
result = described_class.new.call(payload_hash.to_json)
doc = Nokogiri::XML.parse(result.value!)
texts = doc.xpath("//hix-ee:InsuranceApplicant/me-atp:ReferralActivity/me-atp:AdditionalReferralActivityReasonCode", namespaces).map(&:content)
expect(texts).to eq ["GapFilling"]
expect(texts).to eq ["FullDetermination", "GapFilling"]
end
end

0 comments on commit 5925454

Please sign in to comment.