Skip to content

Commit

Permalink
Add practitioner reference to Patient and Encounter resource (#1087)
Browse files Browse the repository at this point in the history
* - Added practitioner Id in Patient

* - Add Practitioner reference to patient and encounter resources.

* - Add test cases

* - Resolve requested changes
  • Loading branch information
RaaziaTarique authored Feb 25, 2022
1 parent 65f5378 commit c6f9009
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ import kotlinx.serialization.Serializable

@Serializable
data class UserInfo(
@SerialName("questionnaire_publisher") val questionnairePublisher: String? = null,
@SerialName("organization") val organization: String? = null,
@SerialName("location") val location: String? = null
@SerialName("questionnaire_publisher") var questionnairePublisher: String? = null,
@SerialName("organization") var organization: String? = null,
@SerialName("location") var location: String? = null,
@SerialName("sub") var keyclockuuid: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.hl7.fhir.r4.context.IWorkerContext
import org.hl7.fhir.r4.model.Bundle
import org.hl7.fhir.r4.model.Encounter
import org.hl7.fhir.r4.model.Group
import org.hl7.fhir.r4.model.Identifier
import org.hl7.fhir.r4.model.Patient
Expand Down Expand Up @@ -133,6 +134,19 @@ constructor(
}
}

fun appendPractitionerInfo(resource: Resource) {
authenticatedUserInfo?.keyclockuuid?.let { uuid ->
val practitionerRef = Reference().apply { reference = "Practitioner/$uuid" }

if (resource is Patient) resource.generalPractitioner = arrayListOf(practitionerRef)
else if (resource is Encounter)
resource.participant =
arrayListOf(
Encounter.EncounterParticipantComponent().apply { individual = practitionerRef }
)
}
}

fun extractAndSaveResources(
context: Context,
resourceId: String?,
Expand All @@ -151,11 +165,12 @@ constructor(
// add organization to entities representing individuals in registration questionnaire
if (bun.resource.resourceType.isIn(ResourceType.Patient, ResourceType.Group)) {
appendOrganizationInfo(bun.resource)

// if it is new registration set response subject
if (resourceId == null) questionnaireResponse.subject = bun.resource.asReference()
}

appendPractitionerInfo(bun.resource)

// response MUST have subject by far otherwise flow has issues
if (!questionnaire.experimental) questionnaireResponse.assertSubject()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import org.hl7.fhir.r4.model.CanonicalType
import org.hl7.fhir.r4.model.CodeableConcept
import org.hl7.fhir.r4.model.Coding
import org.hl7.fhir.r4.model.DecimalType
import org.hl7.fhir.r4.model.Encounter
import org.hl7.fhir.r4.model.Expression
import org.hl7.fhir.r4.model.Extension
import org.hl7.fhir.r4.model.HumanName
Expand All @@ -69,11 +70,13 @@ import org.robolectric.util.ReflectionHelpers
import org.smartregister.fhircore.engine.configuration.ConfigurationRegistry
import org.smartregister.fhircore.engine.cql.LibraryEvaluator
import org.smartregister.fhircore.engine.data.local.DefaultRepository
import org.smartregister.fhircore.engine.data.remote.model.response.UserInfo
import org.smartregister.fhircore.engine.robolectric.RobolectricTest
import org.smartregister.fhircore.engine.rule.CoroutineTestRule
import org.smartregister.fhircore.engine.util.DefaultDispatcherProvider
import org.smartregister.fhircore.engine.util.SharedPreferencesHelper
import org.smartregister.fhircore.engine.util.USER_INFO_SHARED_PREFERENCE_KEY
import org.smartregister.fhircore.engine.util.extension.encodeJson
import org.smartregister.fhircore.engine.util.extension.retainMetadata

@HiltAndroidTest
Expand Down Expand Up @@ -103,7 +106,7 @@ class QuestionnaireViewModelTest : RobolectricTest() {
hiltRule.inject()

every { sharedPreferencesHelper.read(USER_INFO_SHARED_PREFERENCE_KEY, null) } returns
"{\"organization\":\"1111\"}"
getUserInfo().encodeJson()

defaultRepo = spyk(DefaultRepository(fhirEngine, DefaultDispatcherProvider()))
val configurationRegistry = mockk<ConfigurationRegistry>()
Expand Down Expand Up @@ -964,4 +967,36 @@ class QuestionnaireViewModelTest : RobolectricTest() {

Assert.assertEquals("Organization/1111", questionnaireResponse.subject.reference)
}

private fun getUserInfo(): UserInfo {
val userInfo =
UserInfo().apply {
questionnairePublisher = "ab"
organization = "1111"
keyclockuuid = "123"
}
return userInfo
}

@Test
fun testAddPractitionerInfoShouldSetGeneralPractitionerReferenceToPatientResource() {
val patient =
Patient().apply {
Patient@ this.id = "123456"
this.birthDate = questionnaireViewModel.calculateDobFromAge(25)
}

questionnaireViewModel.appendPractitionerInfo(patient)

Assert.assertEquals("Practitioner/123", patient.generalPractitioner[0].reference)
}

@Test
fun testAddPractitionerInfoShouldSetIndividualPractitionerReferenceToEncounterResource() {
val encounter = Encounter().apply { this.id = "123456" }

questionnaireViewModel.appendPractitionerInfo(encounter)

Assert.assertEquals("Practitioner/123", encounter.participant[0].individual.reference)
}
}

0 comments on commit c6f9009

Please sign in to comment.