diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDao.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDao.kt index 30b999c195..4d936ed749 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDao.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/register/dao/HivRegisterDao.kt @@ -31,6 +31,7 @@ import javax.inject.Provider import javax.inject.Singleton import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow +import org.hl7.fhir.r4.model.CarePlan import org.hl7.fhir.r4.model.CodeType import org.hl7.fhir.r4.model.CodeableConcept import org.hl7.fhir.r4.model.Coding @@ -42,6 +43,7 @@ import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.RelatedPerson import org.hl7.fhir.r4.model.Resource import org.hl7.fhir.r4.model.ResourceType +import org.hl7.fhir.r4.model.Task import org.smartregister.fhircore.engine.configuration.ConfigurationRegistry import org.smartregister.fhircore.engine.data.domain.Guardian import org.smartregister.fhircore.engine.data.domain.PregnancyStatus @@ -74,6 +76,7 @@ import org.smartregister.fhircore.engine.util.extension.getResourcesByIds import org.smartregister.fhircore.engine.util.extension.givenName import org.smartregister.fhircore.engine.util.extension.loadResource import org.smartregister.fhircore.engine.util.extension.shouldShowOnProfile +import org.smartregister.fhircore.engine.util.extension.taskStatusToCarePlanActivityStatus import org.smartregister.fhircore.engine.util.extension.toAgeDisplay import org.smartregister.fhircore.engine.util.extension.yearsPassed import timber.log.Timber @@ -243,12 +246,7 @@ constructor( showIdentifierInProfile = true, currentCarePlan = carePlan, healthStatus = patient.extractHealthStatusFromMeta(patientTypeMetaTagCodingSystem), - tasks = - carePlan - ?.activity - ?.filter { it.shouldShowOnProfile() } - ?.sortedWith(compareBy(nullsLast()) { it?.detail?.code?.text?.toBigIntegerOrNull() }) - ?: listOf(), + tasks = fetchCarePlanActivities(carePlan), conditions = defaultRepository.activePatientConditions(patient.logicalId), otherPatients = patient.otherChildren(), guardians = patient.guardians(), @@ -490,6 +488,37 @@ constructor( .filterNot { it.healthStatus == HealthStatus.DEFAULT } } + private suspend fun fetchCarePlanActivities( + carePlan: CarePlan? + ): List { + if (carePlan == null) return emptyList() + val activityOnList = mutableMapOf() + val tasksToFetch = mutableListOf() + for (planActivity in carePlan.activity) { + if (!planActivity.shouldShowOnProfile()) { + continue + } + val taskId = planActivity.outcomeReference.firstOrNull()?.extractId() + if (taskId != null) { + tasksToFetch.add(taskId) + activityOnList[taskId] = planActivity + } + } + if (tasksToFetch.isNotEmpty()) { + val tasks = fhirEngine.getResourcesByIds(tasksToFetch) + tasks.forEach { task -> + val planActivity: CarePlan.CarePlanActivityComponent? = activityOnList[task.logicalId] + if (planActivity != null) { + planActivity.detail?.status = task.taskStatusToCarePlanActivityStatus() + activityOnList[task.logicalId] = planActivity + } + } + } + return activityOnList.values.sortedWith( + compareBy(nullsLast()) { it.detail?.code?.text?.toBigIntegerOrNull() }, + ) + } + object ResourceValue { const val BLANK = "" } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirCarePlanGenerator.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirCarePlanGenerator.kt index 8dd1615ba7..21d5365c1b 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirCarePlanGenerator.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirCarePlanGenerator.kt @@ -36,6 +36,7 @@ import org.hl7.fhir.r4.utils.StructureMapUtilities import org.smartregister.fhircore.engine.data.local.DefaultRepository import org.smartregister.fhircore.engine.util.extension.encodeResourceToString import org.smartregister.fhircore.engine.util.extension.getCarePlanId +import org.smartregister.fhircore.engine.util.extension.taskStatusToCarePlanActivityStatus import org.smartregister.fhircore.engine.util.helper.TransformSupportServices import timber.log.Timber @@ -148,7 +149,7 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS for ((index, value) in carePlan.activity.withIndex()) { val outcome = value.outcomeReference.find { x -> x.reference.contains(id) } if (outcome != null) { - value.detail.status = taskStatusToCarePlanActivityStatus(task.status) + value.detail.status = task.taskStatusToCarePlanActivityStatus() carePlan.activity?.set(index, value) break } @@ -176,18 +177,4 @@ constructor(val fhirEngine: FhirEngine, val transformSupportServices: TransformS else -> Task.TaskStatus.COMPLETED } } - - private fun taskStatusToCarePlanActivityStatus( - status: Task.TaskStatus, - ): CarePlan.CarePlanActivityStatus { - return when (status) { - Task.TaskStatus.FAILED -> CarePlan.CarePlanActivityStatus.STOPPED - Task.TaskStatus.CANCELLED -> CarePlan.CarePlanActivityStatus.CANCELLED - Task.TaskStatus.COMPLETED, - Task.TaskStatus.ONHOLD, - Task.TaskStatus.INPROGRESS, - Task.TaskStatus.ENTEREDINERROR, -> CarePlan.CarePlanActivityStatus.fromCode(status.toCode()) - else -> CarePlan.CarePlanActivityStatus.NULL - } - } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/TaskExtension.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/TaskExtension.kt index 105d9afc09..896b96a3a4 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/TaskExtension.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/extension/TaskExtension.kt @@ -16,6 +16,7 @@ package org.smartregister.fhircore.engine.util.extension +import org.hl7.fhir.r4.model.CarePlan import org.hl7.fhir.r4.model.Coding import org.hl7.fhir.r4.model.Task import org.smartregister.fhircore.engine.util.DateUtils @@ -71,3 +72,16 @@ fun Task.getCarePlanId(): String? { ?.code ?.substringAfterLast(delimiter = '/', missingDelimiterValue = "") } + +fun Task.taskStatusToCarePlanActivityStatus(): CarePlan.CarePlanActivityStatus { + return when (status) { + Task.TaskStatus.FAILED -> CarePlan.CarePlanActivityStatus.STOPPED + Task.TaskStatus.CANCELLED -> CarePlan.CarePlanActivityStatus.CANCELLED + Task.TaskStatus.READY -> CarePlan.CarePlanActivityStatus.NOTSTARTED + Task.TaskStatus.COMPLETED, + Task.TaskStatus.ONHOLD, + Task.TaskStatus.INPROGRESS, + Task.TaskStatus.ENTEREDINERROR, -> CarePlan.CarePlanActivityStatus.fromCode(status.toCode()) + else -> CarePlan.CarePlanActivityStatus.NULL + } +} \ No newline at end of file