Skip to content

Commit

Permalink
Merge branch 'main' into exclude-questionnaire-items-from-population
Browse files Browse the repository at this point in the history
Signed-off-by: Elly Kitoto <junkmailstoelly@gmail.com>
  • Loading branch information
ellykits committed Sep 19, 2024
2 parents 4997fb7 + 2f8055b commit b4e0bcb
Show file tree
Hide file tree
Showing 42 changed files with 1,073 additions and 452 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,5 @@ data class LoginConfig(
val logoHeight: Int = 120,
val logoWidth: Int = 140,
val showAppTitle: Boolean = true,
val supervisorContactNumber: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -762,7 +762,7 @@ constructor(
*/
suspend fun updateResourcesRecursively(
resourceConfig: ResourceConfig,
subject: Resource,
subject: Resource? = null,
eventWorkflow: EventWorkflow,
) {
withContext(dispatcherProvider.io()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,11 @@ constructor(

override suspend fun doWork(): Result {
return withContext(dispatcherProvider.io()) {
fhirResourceUtil.expireOverdueTasks()
fhirResourceUtil.closeResourcesRelatedToCompletedServiceRequests()
fhirResourceUtil.run {
expireOverdueTasks()
closeResourcesRelatedToCompletedServiceRequests()
closeFhirResources()
}
Result.success()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,4 +248,22 @@ constructor(
closeRelatedResources(serviceRequest)
}
}

suspend fun closeFhirResources() {
val appRegistry =
configurationRegistry.retrieveConfiguration<ApplicationConfiguration>(
ConfigType.Application,
)

appRegistry.eventWorkflows
.filter { it.eventType == EventType.RESOURCE_CLOSURE }
.forEach { eventWorkFlow ->
eventWorkFlow.eventResources.forEach { eventResource ->
defaultRepository.updateResourcesRecursively(
resourceConfig = eventResource,
eventWorkflow = eventWorkFlow,
)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

package org.smartregister.fhircore.engine.util.extension

import android.content.Context
import android.telephony.PhoneNumberUtils
import java.text.MessageFormat
import java.text.SimpleDateFormat
import java.util.Date
Expand Down Expand Up @@ -123,3 +125,14 @@ fun String.lastOffset() = this.uppercase() + "_" + SharedPreferenceKey.LAST_OFFS

fun String.spaceByUppercase() =
this.split(Regex("(?=\\p{Upper})")).joinToString(separator = " ").trim()

fun String?.formatPhoneNumber(context: Context): String? {
if (this == null) return null
return try {
PhoneNumberUtils.formatNumber(this, context.resources.configuration.locales.get(0).country)
?: this
} catch (formatException: NumberFormatException) {
Timber.e(formatException, "Error formatting phone number: $this")
this
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ object LocationUtils {

fun isLocationEnabled(context: Context): Boolean {
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager

return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,63 +18,48 @@ package org.smartregister.fhircore.engine.util.location

import android.Manifest
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat

object PermissionUtils {

fun checkPermissions(context: Context, permissions: List<String>): Boolean {
for (permission in permissions) {
if (
ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED
) {
return false
}
fun checkPermissions(context: Context, permissions: List<String>): Boolean =
permissions.none {
ContextCompat.checkSelfPermission(
context,
it,
) != PackageManager.PERMISSION_GRANTED
}
return true
}

fun getLocationPermissionLauncher(
activity: AppCompatActivity,
permissions: Map<String, Boolean>,
onFineLocationPermissionGranted: () -> Unit,
onCoarseLocationPermissionGranted: () -> Unit,
onLocationPermissionDenied: () -> Unit,
): ActivityResultLauncher<Array<String>> {
return activity.registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions(),
) { permissions ->
if (permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true) {
) {
when {
permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true ->
onFineLocationPermissionGranted()
} else if (permissions[Manifest.permission.ACCESS_COARSE_LOCATION] == true) {
permissions[Manifest.permission.ACCESS_COARSE_LOCATION] == true ->
onCoarseLocationPermissionGranted()
} else {
onLocationPermissionDenied()
}
}
}

fun getStartActivityForResultLauncher(
activity: AppCompatActivity,
onResult: (resultCode: Int, data: Intent?) -> Unit,
): ActivityResultLauncher<Intent> {
return activity.registerForActivityResult(
ActivityResultContracts.StartActivityForResult(),
) { result ->
onResult(result.resultCode, result.data)
else -> onLocationPermissionDenied()
}
}

fun hasFineLocationPermissions(context: Context): Boolean {
return ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) ==
fun hasFineLocationPermissions(context: Context): Boolean =
ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED
}

fun hasCoarseLocationPermissions(context: Context): Boolean {
return ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) ==
fun hasCoarseLocationPermissions(context: Context): Boolean =
ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) ==
PackageManager.PERMISSION_GRANTED
}

fun hasLocationPermissions(context: Context) =
checkPermissions(
context,
listOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
),
)
}
1 change: 0 additions & 1 deletion android/engine/src/main/res/values-fr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,6 @@
<string name="incorrect_pin_please_retry">Code PIN incorrect, veuillez réessayer</string>
<string name="pin_menu_login">Connexion</string>
<string name="forgot_pin">Code PIN oublié ?</string>
<string name="please_contact_supervisor">Veuillez contacter votre superviseur.</string>
<string name="logging_out">Déconnexion. Veuillez patienter...</string>
<string name="session_expired">Session expirée, veuillez vous connecter à nouveau</string>
<string name="sex">Sexe</string>
Expand Down
1 change: 0 additions & 1 deletion android/engine/src/main/res/values-in/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@
<string name="incorrect_pin_please_retry">PIN salah, mohon coba lagi</string>
<string name="pin_menu_login">Masuk</string>
<string name="forgot_pin">Lupa PIN?</string>
<string name="please_contact_supervisor">Silakan hubungi supervisor Anda.</string>
<string name="percentage" translatable="false">%</string>
<string name="logging_out">Sedang keluar (log out). Mohon tunggu…</string>
<string name="session_expired">Sesi telah kedaluwarsa dan harus login lagi</string>
Expand Down
1 change: 0 additions & 1 deletion android/engine/src/main/res/values-sw/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@
<string name="incorrect_pin_please_retry">PIN isiyo sahihi, jaribu tena</string>
<string name="pin_menu_login">Ingia</string>
<string name="forgot_pin">Umesahau PIN?</string>
<string name="please_contact_supervisor">Tafadhali wasiliana na msimamizi wako.</string>
<string name="logging_out">Tafadhali subiri... Inatoka kwenye mfumo</string>
<string name="session_expired">Muda wa kipindi chako umeisha. Tafadhali ingia tena.</string>
<string name="sex">Jinsia</string>
Expand Down
7 changes: 4 additions & 3 deletions android/engine/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
<string name="forgot_password">Forgot Password</string>
<string name="forgot_password_title">Forgot Password!</string>
<string name="more">More</string>
<string name="call_supervisor">Please call your supervisor at %1$s</string>
<string name="call_supervisor">Please contact your supervisor.</string>
<string name="cancel" tools:ignore="ButtonCase">CANCEL</string>
<string name="dial_number">DIAL NUMBER</string>
<string name="register">Register</string>
Expand Down Expand Up @@ -113,7 +113,6 @@
<string name="incorrect_pin_please_retry">Incorrect PIN, please try again</string>
<string name="pin_menu_login">Login</string>
<string name="forgot_pin">Forgot PIN?</string>
<string name="please_contact_supervisor">Please contact your supervisor.</string>
<string name="percentage" translatable="false">%</string>
<string name="logging_out">Logging out. Please wait…</string>
<string name="session_expired">Session has been expired and must login again</string>
Expand Down Expand Up @@ -151,6 +150,7 @@
<string name="weeks">Week(s)</string>
<string name="days">Days(s)</string>
<string name="initializing">Initializing settings &#8230;</string>
<string name="initializing_application">Initializing application &#8230;</string>
<string name="username_sample" translatable="false">e.g JohnDoe</string>
<string name="percentage_progress" translatable="false">%1$d%%</string>
<string name="error_occurred">Something went wrong…</string>
Expand Down Expand Up @@ -190,10 +190,11 @@
<string name="no_data">No data set</string>
<string name="sync_complete">Sync complete</string>
<string name="sync_error">Sync error</string>
<string name="minutes_remaining">Calculating minutes remaining...</string>
<string name="minutes_remaining">Calculating minutes remaining</string>
<string name="sync_up_inprogress"> %1$d%% Syncing up…</string>
<string name="sync_down_inprogress"> %1$d%% Syncing down…</string>
<string name="default_html_title">file</string>
<string name="retry">RETRY</string>
<string name="unsynced_data_present">There\'s some un-synced data</string>
<string name="missing_supervisor_contact">Supervisor contact missing or the provided phone number is invalid</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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<Encounter>()
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 =
Expand Down
7 changes: 7 additions & 0 deletions android/quest/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,13 @@ android {
versionNameSuffix = "-contigo"
manifestPlaceholders["appLabel"] = "Contigo"
}

create("minsaEir") {
dimension = "apps"
applicationIdSuffix = ".minsaEir"
versionNameSuffix = "-minsaEir"
manifestPlaceholders["appLabel"] = "Minsa EIR"
}
}

applicationVariants.all {
Expand Down
Loading

0 comments on commit b4e0bcb

Please sign in to comment.