<StructureDefinition xmlns="http://hl7.org/fhir">
  <id value="profile-Patient-base" />
  <url value="https://bpcs.exchange/fhir/StructureDefinition/profile-Patient-base" />
  <name value="PatientBase" />
  <title value="Recipient Base Profile" />
  <status value="active" />
  <experimental value="false" />
  <description value="Information about a recipient used across all use cases" />
  <fhirVersion value="5.0.0" />
  <mapping>
    <identity value="BPCS" />
    <name value="Internal BPCS API" />
  </mapping>
  <kind value="resource" />
  <abstract value="false" />
  <type value="Patient" />
  <baseDefinition value="http://hl7.org/fhir/StructureDefinition/Patient" />
  <derivation value="constraint" />
  <differential>
    <element id="Patient.meta">
      <path value="Patient.meta" />
    </element>
    <element id="Patient.meta.extension:effectiveDate">
      <path value="Patient.meta.extension" />
      <sliceName value="effectiveDate" />
      <type>
        <code value="Extension" />
        <profile value="https://bpcs.exchange/fhir/StructureDefinition/ext-Meta-effectiveDate" />
      </type>
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.effModDt, RecipientDTO.recEffDate (which it maps to depends on whether the record represents a create or an update)" />
      </mapping>
    </element>
    <element id="Patient.extension:contactApplicationMember">
      <path value="Patient.extension" />
      <sliceName value="contactApplicationMember" />
      <type>
        <code value="Extension" />
        <profile value="https://bpcs.exchange/fhir/StructureDefinition/ext-Patient-ContactApplicationMemberFlag" />
      </type>
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.contactApplicationMember" />
      </mapping>
    </element>
    <element id="Patient.identifier">
      <path value="Patient.identifier" />
      <slicing>
        <discriminator>
          <type value="value" />
          <path value="use" />
        </discriminator>
        <discriminator>
          <type value="value" />
          <path value="type" />
        </discriminator>
        <rules value="open" />
      </slicing>
      <min value="1" />
    </element>
    <element id="Patient.identifier:odbNum">
      <path value="Patient.identifier" />
      <sliceName value="odbNum" />
      <constraint>
        <key value="bpcs-odb1" />
        <severity value="error" />
        <human value="Must have an ODB number value unless the system is for an associate family member, in which case it can be empty when creating a recipient" />
        <expression value="value.empty() implies system='https://bpcs.exchange/fhir/NamingSystem/afm'" />
      </constraint>
      <mustSupport value="true" />
    </element>
    <element id="Patient.identifier:odbNum.use">
      <path value="Patient.identifier.use" />
      <comment value="Distinguishes current ODBNumber from cross-reference numbers" />
      <min value="1" />
      <patternCode value="official" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.identifier:odbNum.system">
      <path value="Patient.identifier.system" />
      <short value="Distinguishes type of primary identifier" />
      <min value="1" />
      <mustSupport value="true" />
      <binding>
        <strength value="required" />
        <valueSet value="https://bpcs.exchange/fhir/ValueSet/vs-ODBTypes" />
      </binding>
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.odbFlag, FamilyMemberDTO.odbFlag" />
      </mapping>
    </element>
    <element id="Patient.identifier:odbNum.value">
      <path value="Patient.identifier.value" />
      <maxLength value="10" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.odbNum, FamilyMemberDTO.odbNum, ContactDTO.odbNum, FamilyHistoryDTO.contactOdbEligNo" />
      </mapping>
    </element>
    <element id="Patient.identifier:xref">
      <path value="Patient.identifier" />
      <sliceName value="xref" />
      <definition value="Alternate PHNs" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.identifier:xref.use">
      <path value="Patient.identifier.use" />
      <comment value="Distinguishes current ODBNumber from cross-reference numbers" />
      <min value="1" />
      <patternCode value="old" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.identifier:xref.system">
      <path value="Patient.identifier.system" />
      <short value="Distinguishes type of xref identifier" />
      <min value="1" />
      <mustSupport value="true" />
      <binding>
        <strength value="required" />
        <valueSet value="https://bpcs.exchange/fhir/ValueSet/vs-ODBTypes" />
      </binding>
      <mapping>
        <identity value="BPCS" />
        <map value="CrossReferenceValuesDTO.idType" />
      </mapping>
    </element>
    <element id="Patient.identifier:xref.value">
      <path value="Patient.identifier.value" />
      <min value="1" />
      <maxLength value="10" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="CrossReferenceValuesDTO.id" />
      </mapping>
    </element>
    <element id="Patient.name">
      <path value="Patient.name" />
      <min value="1" />
      <max value="1" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.name.family">
      <path value="Patient.name.family" />
      <min value="1" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.lastName, FamilyMemberDTO.lastName, ContactDTO.lastName" />
      </mapping>
    </element>
    <element id="Patient.name.given">
      <path value="Patient.name.given" />
      <comment value="First name is first repetition, middle name is second repetition" />
      <min value="1" />
      <max value="2" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.firstName, RecipientDTO.middleName, FamilyMemberDTO.firstName, FamilyMemberDTO.lastName, ContactDTO.firstName, ContactDTO.lastName" />
      </mapping>
    </element>
    <element id="Patient.telecom">
      <path value="Patient.telecom" />
      <slicing>
        <discriminator>
          <type value="value" />
          <path value="system" />
        </discriminator>
        <discriminator>
          <type value="value" />
          <path value="use" />
        </discriminator>
        <rules value="open" />
      </slicing>
    </element>
    <element id="Patient.telecom:homePhone">
      <path value="Patient.telecom" />
      <sliceName value="homePhone" />
      <max value="1" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.telecom:homePhone.system">
      <path value="Patient.telecom.system" />
      <min value="1" />
      <patternCode value="phone" />
    </element>
    <element id="Patient.telecom:homePhone.value">
      <path value="Patient.telecom.value" />
      <min value="1" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientAddressDTO.telephone, RecipientAddressDTO.phone (last 7 characters), RecipientAddressDTO.telephoneArea (1st 3 characters), ContactDTO.homePhoneNum" />
      </mapping>
    </element>
    <element id="Patient.telecom:homePhone.use">
      <path value="Patient.telecom.use" />
      <min value="1" />
      <patternCode value="home" />
    </element>
    <element id="Patient.telecom:workPhone">
      <path value="Patient.telecom" />
      <sliceName value="workPhone" />
      <comment value="Work phone numbers are only captured if the recipient is the 'contact' for a family coverage" />
      <max value="1" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.telecom:workPhone.system">
      <path value="Patient.telecom.system" />
      <min value="1" />
      <patternCode value="phone" />
    </element>
    <element id="Patient.telecom:workPhone.value">
      <path value="Patient.telecom.value" />
      <comment value="If there is an extension, separate concatenate it with ' ext:' as a separator from the base number." />
      <min value="1" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="ContactDTO.workPhoneNum, ContactDTO.workPhoneExt" />
      </mapping>
    </element>
    <element id="Patient.telecom:workPhone.use">
      <path value="Patient.telecom.use" />
      <min value="1" />
      <patternCode value="work" />
    </element>
    <element id="Patient.telecom:email">
      <path value="Patient.telecom" />
      <sliceName value="email" />
      <short value="A contact email for the individual" />
      <definition value="A contact email(e.g. a telephone number or an email address) by which the individual may be contacted." />
      <max value="1" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.telecom:email.system">
      <path value="Patient.telecom.system" />
      <patternCode value="email" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.telecom:email.value">
      <path value="Patient.telecom.value" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.gender">
      <path value="Patient.gender" />
      <mustSupport value="true" />
      <binding>
        <strength value="required" />
        <valueSet value="https://bpcs.exchange/fhir/ValueSet/vs-administrative-gender" />
      </binding>
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.sex, FamilyMemberDTO.sex" />
      </mapping>
    </element>
    <element id="Patient.birthDate">
      <path value="Patient.birthDate" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.birthDate, FamilyMemberDTO.birthDate" />
      </mapping>
    </element>
    <element id="Patient.deceased[x]">
      <path value="Patient.deceased[x]" />
      <type>
        <code value="dateTime" />
      </type>
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.deathDate, FamilyMemberDTO.deathDate" />
      </mapping>
    </element>
    <element id="Patient.address">
      <path value="Patient.address" />
      <slicing>
        <discriminator>
          <type value="value" />
          <path value="type" />
        </discriminator>
        <rules value="open" />
      </slicing>
      <mustSupport value="true" />
    </element>
    <element id="Patient.address:mailing">
      <path value="Patient.address" />
      <sliceName value="mailing" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientAddressDTO" />
      </mapping>
    </element>
    <element id="Patient.address:mailing.type">
      <path value="Patient.address.type" />
      <min value="1" />
      <patternCode value="postal" />
    </element>
    <element id="Patient.address:mailing.line">
      <path value="Patient.address.line" />
      <short value="First line of an address. Usually will contain the street number and street name. Second line of an address. Usually will contain an apartment number, rural route or other similar information." />
      <min value="1" />
      <max value="2" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientAddressDTO.address1 (1st repetition), RecipientAddressDTO.address2 (2nd repetition)" />
      </mapping>
    </element>
    <element id="Patient.address:mailing.city">
      <path value="Patient.address.city" />
      <min value="1" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientAddressDTO.city" />
      </mapping>
    </element>
    <element id="Patient.address:mailing.state">
      <path value="Patient.address.state" />
      <min value="1" />
      <maxLength value="2" />
      <mustSupport value="true" />
      <binding>
        <strength value="required" />
        <valueSet value="https://bpcs.exchange/fhir/ValueSet/vs-Province" />
      </binding>
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientAddressDTO.province" />
      </mapping>
    </element>
    <element id="Patient.address:mailing.postalCode">
      <path value="Patient.address.postalCode" />
      <min value="1" />
      <maxLength value="10" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientAddressDTO.postalCode" />
      </mapping>
    </element>
    <element id="Patient.address:mailing.country">
      <path value="Patient.address.country" />
      <min value="1" />
      <mustSupport value="true" />
      <binding>
        <strength value="required" />
        <valueSet value="https://bpcs.exchange/fhir/ValueSet/vs-Country" />
      </binding>
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientAddressDTO.country" />
      </mapping>
    </element>
    <element id="Patient.communication">
      <path value="Patient.communication" />
      <max value="1" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.communication.language">
      <path value="Patient.communication.language" />
      <mustSupport value="true" />
      <binding>
        <strength value="required" />
        <valueSet value="https://bpcs.exchange/fhir/ValueSet/vs-Language" />
      </binding>
    </element>
    <element id="Patient.communication.language.coding">
      <path value="Patient.communication.language.coding" />
      <min value="1" />
      <max value="1" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.communication.language.coding.system">
      <path value="Patient.communication.language.coding.system" />
      <min value="1" />
      <mustSupport value="true" />
    </element>
    <element id="Patient.communication.language.coding.code">
      <path value="Patient.communication.language.coding.code" />
      <min value="1" />
      <mustSupport value="true" />
      <mapping>
        <identity value="BPCS" />
        <map value="RecipientDTO.language" />
      </mapping>
    </element>
    <element id="Patient.communication.preferred">
      <path value="Patient.communication.preferred" />
      <patternBoolean value="true" />
      <mustSupport value="true" />
    </element>
  </differential>
</StructureDefinition>