From 19e0813ac202ab47c4901f79fc0fbfa41bbe7265 Mon Sep 17 00:00:00 2001 From: Lentumunai-Mark Date: Fri, 6 Sep 2024 15:15:16 +0300 Subject: [PATCH 1/7] Implement event management to close custom resources via the background worker. Signed-off-by: Lentumunai-Mark --- .../engine/data/local/DefaultRepository.kt | 2 +- .../engine/task/FhirResourceExpireWorker.kt | 1 + .../fhircore/engine/task/FhirResourceUtil.kt | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/DefaultRepository.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/DefaultRepository.kt index 85b6059587..fd6310ec06 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/DefaultRepository.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/data/local/DefaultRepository.kt @@ -762,7 +762,7 @@ constructor( */ suspend fun updateResourcesRecursively( resourceConfig: ResourceConfig, - subject: Resource, + subject: Resource? = null, eventWorkflow: EventWorkflow, ) { withContext(dispatcherProvider.io()) { diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt index 43cebe5702..a1696e0a37 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt @@ -42,6 +42,7 @@ constructor( return withContext(dispatcherProvider.io()) { fhirResourceUtil.expireOverdueTasks() fhirResourceUtil.closeResourcesRelatedToCompletedServiceRequests() + fhirResourceUtil.closeCustomResources() Result.success() } } diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceUtil.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceUtil.kt index 57228e3153..b8ea323808 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceUtil.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceUtil.kt @@ -248,4 +248,22 @@ constructor( closeRelatedResources(serviceRequest) } } + + suspend fun closeCustomResources() { + val appRegistry = + configurationRegistry.retrieveConfiguration( + ConfigType.Application, + ) + + appRegistry.eventWorkflows + .filter { it.eventType == EventType.RESOURCE_CLOSURE } + .forEach { eventWorkFlow -> + eventWorkFlow.eventResources.forEach { eventResource -> + defaultRepository.updateResourcesRecursively( + resourceConfig = eventResource, + eventWorkflow = eventWorkFlow, + ) + } + } + } } From bff5e19d641d31b500924ba1975608299998ddfd Mon Sep 17 00:00:00 2001 From: Lentumunai-Mark Date: Mon, 9 Sep 2024 09:41:40 +0300 Subject: [PATCH 2/7] "Start writing test fro closing custom resources" Signed-off-by: Lentumunai-Mark --- .../engine/task/FhirResourceUtilTest.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirResourceUtilTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirResourceUtilTest.kt index ee0010e637..17ce9c2b93 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirResourceUtilTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirResourceUtilTest.kt @@ -38,6 +38,7 @@ import javax.inject.Inject import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest import org.hl7.fhir.r4.model.CarePlan +import org.hl7.fhir.r4.model.Encounter import org.hl7.fhir.r4.model.Period import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.Task @@ -281,4 +282,22 @@ class FhirResourceUtilTest : RobolectricTest() { assertEquals(TaskStatus.REQUESTED, task.status) } + + @Test + fun testCloseCustomResources() { + val encounter = + Encounter().apply { + id = "test-Encounter" + period = Period().apply { start = Date().plusDays(-2) } + status = Encounter.EncounterStatus.INPROGRESS + } + + runBlocking { fhirEngine.create(encounter) } + + coEvery { defaultRepository.update(any()) } just runs + + assertEquals(Encounter.EncounterStatus.INPROGRESS, encounter.status) + + runBlocking { fhirResourceUtil.closeCustomResources() } + } } From 74a41b8df7206ab748952b3b58deda783c5175ff Mon Sep 17 00:00:00 2001 From: Lentumunai-Mark Date: Tue, 10 Sep 2024 17:27:46 +0300 Subject: [PATCH 3/7] Test closure of resources without a base resource. Signed-off-by: Lentumunai-Mark --- .../data/local/DefaultRepositoryTest.kt | 87 +++++++++++++++++++ .../engine/task/FhirResourceUtilTest.kt | 19 ---- .../configs/app/application_config.json | 48 ++++++++++ 3 files changed, 135 insertions(+), 19 deletions(-) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt index d0ec498516..7f90fd2b0e 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt @@ -56,12 +56,14 @@ import org.hl7.fhir.r4.model.Coding import org.hl7.fhir.r4.model.Condition import org.hl7.fhir.r4.model.ContactPoint import org.hl7.fhir.r4.model.DateTimeType +import org.hl7.fhir.r4.model.Encounter import org.hl7.fhir.r4.model.Enumerations import org.hl7.fhir.r4.model.Group import org.hl7.fhir.r4.model.HumanName import org.hl7.fhir.r4.model.Location import org.hl7.fhir.r4.model.Organization import org.hl7.fhir.r4.model.Patient +import org.hl7.fhir.r4.model.Period import org.hl7.fhir.r4.model.Procedure import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.RelatedPerson @@ -80,6 +82,7 @@ import org.smartregister.fhircore.engine.app.fakes.Faker import org.smartregister.fhircore.engine.configuration.ConfigurationRegistry import org.smartregister.fhircore.engine.configuration.UniqueIdAssignmentConfig import org.smartregister.fhircore.engine.configuration.app.ConfigService +import org.smartregister.fhircore.engine.configuration.event.EventTriggerCondition import org.smartregister.fhircore.engine.configuration.event.EventWorkflow import org.smartregister.fhircore.engine.configuration.event.UpdateWorkflowValueConfig import org.smartregister.fhircore.engine.configuration.profile.ManagingEntityConfig @@ -887,6 +890,90 @@ class DefaultRepositoryTest : RobolectricTest() { coVerify(exactly = 0) { fhirEngine.update(any()) } } + @Test + fun testNonCareplanRelatedResourcesUpdatedCorrectlyAndWithNoSpecifiedBaseResource() = runTest { + val encounter = + Encounter().apply { + id = "test-Encounter" + period = Period().apply { start = Date().plusDays(-2) } + status = Encounter.EncounterStatus.INPROGRESS + type = + listOf( + CodeableConcept().apply { + coding = + listOf( + Coding().apply { + system = "http://smartregister.org/" + code = "SVISIT" + display = "Service Point Visit" + }, + ) + text = "Service Point Visit" + }, + ) + } + val eventWorkflow = + EventWorkflow( + triggerConditions = + listOf( + EventTriggerCondition( + eventResourceId = "encounterToBeClosed", + matchAll = false, + conditionalFhirPathExpressions = + listOf( + "true", + ), + ), + ), + eventResources = + listOf( + ResourceConfig( + id = "encounterToBeClosed", + resource = ResourceType.Encounter, + configRules = listOf(), + dataQueries = + listOf( + DataQuery( + paramName = "reason-code", + filterCriteria = + listOf( + FilterCriterionConfig.TokenFilterCriterionConfig( + dataType = Enumerations.DataType.CODEABLECONCEPT, + value = Code(system = "http://smartregister.org/", code = "SVISIT"), + ), + ), + ), + ), + ), + ), + updateValues = + listOf( + UpdateWorkflowValueConfig( + jsonPathExpression = "Encounter.status", + value = JsonPrimitive("finished"), + resourceType = ResourceType.Encounter, + ), + ), + resourceFilterExpressions = + listOf( + ResourceFilterExpression( + conditionalFhirPathExpressions = listOf("Encounter.period.end < now()"), + matchAll = true, + ), + ), + ) + fhirEngine.create(encounter) + defaultRepository.updateResourcesRecursively( + resourceConfig = eventWorkflow.eventResources[0], + eventWorkflow = eventWorkflow + ) + val resourceSlot = slot() + val captured = resourceSlot.captured + coVerify { fhirEngine.update(capture(resourceSlot)) } + Assert.assertEquals("test-Encounter", captured.id) + Assert.assertEquals(Encounter.EncounterStatus.FINISHED, captured.status) + } + @Test fun testUpdateResourcesRecursivelyClosesResource() = runTest { val patient = diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirResourceUtilTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirResourceUtilTest.kt index 17ce9c2b93..ee0010e637 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirResourceUtilTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/task/FhirResourceUtilTest.kt @@ -38,7 +38,6 @@ import javax.inject.Inject import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest import org.hl7.fhir.r4.model.CarePlan -import org.hl7.fhir.r4.model.Encounter import org.hl7.fhir.r4.model.Period import org.hl7.fhir.r4.model.Reference import org.hl7.fhir.r4.model.Task @@ -282,22 +281,4 @@ class FhirResourceUtilTest : RobolectricTest() { assertEquals(TaskStatus.REQUESTED, task.status) } - - @Test - fun testCloseCustomResources() { - val encounter = - Encounter().apply { - id = "test-Encounter" - period = Period().apply { start = Date().plusDays(-2) } - status = Encounter.EncounterStatus.INPROGRESS - } - - runBlocking { fhirEngine.create(encounter) } - - coEvery { defaultRepository.update(any()) } just runs - - assertEquals(Encounter.EncounterStatus.INPROGRESS, encounter.status) - - runBlocking { fhirResourceUtil.closeCustomResources() } - } } diff --git a/android/quest/src/test/assets/configs/app/application_config.json b/android/quest/src/test/assets/configs/app/application_config.json index 85a96d76b3..bc04e9fc7d 100644 --- a/android/quest/src/test/assets/configs/app/application_config.json +++ b/android/quest/src/test/assets/configs/app/application_config.json @@ -29,6 +29,54 @@ "QuestionnaireResponse" ] }, + "eventWorkflows": [ + { + "eventType": "RESOURCE_CLOSURE", + "triggerConditions": [ + { + "eventResourceId": "encounterToBeClosed", + "matchAll": false, + "conditionalFhirPathExpressions": [ + "true" + ] + } + ], + "eventResources": [ + { + "id": "encounterToBeClosed", + "resource": "Encounter", + "configRules": [], + "dataQueries": [ + { + "paramName": "reason-code", + "filterCriteria": [ + { + "dataType": "CODEABLECONCEPT", + "value": { + "system": "http://smartregister.org/", + "code": "SVISIT" + } + } + ] + } + ] + } + ], + "updateValues": [ + { + "jsonPathExpression": "Encounter.status", + "value": "finished", + "resourceType": "Encounter" + } + ], + "resourceFilterExpression": { + "conditionalFhirPathExpressions": [ + "Encounter.period.end < now()" + ], + "matchAll": true + } + } + ], "logGpsLocation": [ "QUESTIONNAIRE" ] From 154ad34aa2901d795d7a0217fd3478cf4ac73f7a Mon Sep 17 00:00:00 2001 From: Lentumunai-Mark Date: Tue, 10 Sep 2024 20:32:13 +0300 Subject: [PATCH 4/7] Run spotless Apply. Signed-off-by: Lentumunai-Mark --- .../fhircore/engine/data/local/DefaultRepositoryTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt index 7f90fd2b0e..d9b0ceba8e 100644 --- a/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt +++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/data/local/DefaultRepositoryTest.kt @@ -965,7 +965,7 @@ class DefaultRepositoryTest : RobolectricTest() { fhirEngine.create(encounter) defaultRepository.updateResourcesRecursively( resourceConfig = eventWorkflow.eventResources[0], - eventWorkflow = eventWorkflow + eventWorkflow = eventWorkflow, ) val resourceSlot = slot() val captured = resourceSlot.captured From 4f4198689d40f1c0d8468d770e278aa43433cfa2 Mon Sep 17 00:00:00 2001 From: Benjamin Mwalimu Date: Thu, 12 Sep 2024 11:45:13 +0300 Subject: [PATCH 5/7] Update android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt Co-authored-by: Elly Kitoto --- .../fhircore/engine/task/FhirResourceExpireWorker.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt index a1696e0a37..c7b4f290e7 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt @@ -40,9 +40,11 @@ constructor( override suspend fun doWork(): Result { return withContext(dispatcherProvider.io()) { - fhirResourceUtil.expireOverdueTasks() - fhirResourceUtil.closeResourcesRelatedToCompletedServiceRequests() - fhirResourceUtil.closeCustomResources() + fhirResourceUtil.run { + expireOverdueTasks() + closeResourcesRelatedToCompletedServiceRequests() + closeCustomResources() + } Result.success() } } From 10fd2ea1bbb54993f5aa79b8c0f7ef5cf20c4cbb Mon Sep 17 00:00:00 2001 From: Benjamin Mwalimu Date: Thu, 12 Sep 2024 11:45:34 +0300 Subject: [PATCH 6/7] Update android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceUtil.kt Co-authored-by: Elly Kitoto --- .../org/smartregister/fhircore/engine/task/FhirResourceUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceUtil.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceUtil.kt index b8ea323808..9fbcf49923 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceUtil.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceUtil.kt @@ -249,7 +249,7 @@ constructor( } } - suspend fun closeCustomResources() { + suspend fun closeFhirResources() { val appRegistry = configurationRegistry.retrieveConfiguration( ConfigType.Application, From 01924cb63b807863cddd7d26d4aea4222884f1cf Mon Sep 17 00:00:00 2001 From: Lentumunai-Mark Date: Thu, 12 Sep 2024 13:32:10 +0300 Subject: [PATCH 7/7] Replace old fucntion name with new function name. Signed-off-by: Lentumunai-Mark --- .../fhircore/engine/task/FhirResourceExpireWorker.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt index c7b4f290e7..50c24a5582 100644 --- a/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt +++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/task/FhirResourceExpireWorker.kt @@ -41,10 +41,10 @@ constructor( override suspend fun doWork(): Result { return withContext(dispatcherProvider.io()) { fhirResourceUtil.run { - expireOverdueTasks() - closeResourcesRelatedToCompletedServiceRequests() - closeCustomResources() - } + expireOverdueTasks() + closeResourcesRelatedToCompletedServiceRequests() + closeFhirResources() + } Result.success() } }