diff --git a/CHANGELOG.md b/CHANGELOG.md index fee5a416955..c018c31d5c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ - Bump Coroutines to v1.11.0 - Bump Gradle to v9.5.1 +### Changes + +- Update Titration nudge threshold for diabetic patients in SriLanka from `140/90` to `130/80` + ## 2026.05.11 ### Internal diff --git a/app/src/androidTest/java/org/simple/clinic/bp/BloodPressureRepositoryAndroidTest.kt b/app/src/androidTest/java/org/simple/clinic/bp/BloodPressureRepositoryAndroidTest.kt index 6ca82b3255d..52af7bd8dcc 100644 --- a/app/src/androidTest/java/org/simple/clinic/bp/BloodPressureRepositoryAndroidTest.kt +++ b/app/src/androidTest/java/org/simple/clinic/bp/BloodPressureRepositoryAndroidTest.kt @@ -453,8 +453,8 @@ class BloodPressureRepositoryAndroidTest { val newestBpForPatient3 = TestData.bloodPressureMeasurement( uuid = UUID.fromString("3d948d3b-6d8f-4608-bde0-d8750fef75d4"), patientUuid = patient3Uuid, - systolic = 150, - diastolic = 90, + systolic = 135, + diastolic = 85, createdAt = Instant.parse("2000-01-01T00:03:00Z"), recordedAt = Instant.parse("2000-01-01T00:03:00Z"), updatedAt = Instant.parse("2000-01-01T00:03:00Z"), @@ -475,9 +475,9 @@ class BloodPressureRepositoryAndroidTest { )) // when - val isNewestBpEntryHighForPatient1 = repository.isNewestBpEntryHigh(patient1Uuid).blockingFirst() - val isNewestBpEntryHighForPatient2 = repository.isNewestBpEntryHigh(patient2Uuid).blockingFirst() - val isNewestBpEntryHighForPatient3 = repository.isNewestBpEntryHigh(patient3Uuid).blockingFirst() + val isNewestBpEntryHighForPatient1 = repository.isNewestBpEntryHigh(patient1Uuid, isDiabeticPatient = false, isSriLankaEnabled = false).blockingFirst() + val isNewestBpEntryHighForPatient2 = repository.isNewestBpEntryHigh(patient2Uuid, isDiabeticPatient = true, isSriLankaEnabled = false).blockingFirst() + val isNewestBpEntryHighForPatient3 = repository.isNewestBpEntryHigh(patient3Uuid, isDiabeticPatient = true, isSriLankaEnabled = true).blockingFirst() // then assertThat(isNewestBpEntryHighForPatient1).isTrue() diff --git a/app/src/main/java/org/simple/clinic/bp/BloodPressureMeasurement.kt b/app/src/main/java/org/simple/clinic/bp/BloodPressureMeasurement.kt index 7ad89d9ad12..a83822598ba 100644 --- a/app/src/main/java/org/simple/clinic/bp/BloodPressureMeasurement.kt +++ b/app/src/main/java/org/simple/clinic/bp/BloodPressureMeasurement.kt @@ -252,20 +252,25 @@ data class BloodPressureMeasurement( fun purgeBloodPressureMeasurementWhenPatientIsNull(): Int @Query(""" - SELECT - CASE - WHEN (COUNT(BP.uuid) >= 1) THEN 1 - ELSE 0 - END - FROM BloodPressureMeasurement BP - WHERE - BP.patientUuid = :patientUuid AND - date(BP.recordedAt) == :currentDate AND - (BP.systolic >= 140 OR BP.diastolic >= 90) AND - BP.deletedAt IS NULL - ORDER BY BP.recordedAt DESC - LIMIT 1 - """) - fun isNewestBpEntryHigh(patientUuid: UUID, currentDate: LocalDate): Observable + SELECT + CASE + WHEN (COUNT(BP.uuid) >= 1) THEN 1 + ELSE 0 + END + FROM BloodPressureMeasurement BP + WHERE + BP.patientUuid = :patientUuid AND + date(BP.recordedAt) == :currentDate AND + (BP.systolic >= :systolicThreshold OR BP.diastolic >= :diastolicThreshold) AND + BP.deletedAt IS NULL + ORDER BY BP.recordedAt DESC + LIMIT 1 +""") + fun isNewestBpEntryHigh( + patientUuid: UUID, + currentDate: LocalDate, + systolicThreshold: Int, + diastolicThreshold: Int + ): Observable } } diff --git a/app/src/main/java/org/simple/clinic/bp/BloodPressureRepository.kt b/app/src/main/java/org/simple/clinic/bp/BloodPressureRepository.kt index 162a03f48b4..66339d6f18b 100644 --- a/app/src/main/java/org/simple/clinic/bp/BloodPressureRepository.kt +++ b/app/src/main/java/org/simple/clinic/bp/BloodPressureRepository.kt @@ -166,9 +166,25 @@ class BloodPressureRepository @Inject constructor( ) } - fun isNewestBpEntryHigh(patientUuid: UUID): Observable { + fun isNewestBpEntryHigh( + patientUuid: UUID, + isDiabeticPatient: Boolean, + isSriLankaEnabled: Boolean + ): Observable { + val currentDate = LocalDate.now(utcClock) - return dao.isNewestBpEntryHigh(patientUuid = patientUuid, currentDate = currentDate) + val systolicThreshold = + if (isSriLankaEnabled && isDiabeticPatient) 130 else 140 + + val diastolicThreshold = + if (isSriLankaEnabled && isDiabeticPatient) 80 else 90 + + return dao.isNewestBpEntryHigh( + patientUuid = patientUuid, + currentDate = currentDate, + systolicThreshold = systolicThreshold, + diastolicThreshold = diastolicThreshold + ) } } diff --git a/app/src/main/java/org/simple/clinic/summary/PatientSummaryEffectHandler.kt b/app/src/main/java/org/simple/clinic/summary/PatientSummaryEffectHandler.kt index 64b5a774bb9..c247885c384 100644 --- a/app/src/main/java/org/simple/clinic/summary/PatientSummaryEffectHandler.kt +++ b/app/src/main/java/org/simple/clinic/summary/PatientSummaryEffectHandler.kt @@ -401,14 +401,38 @@ class PatientSummaryEffectHandler @AssistedInject constructor( effects .observeOn(schedulersProvider.io()) .switchMap { + val patientUuid = it.patientUuid - bloodPressureRepository.isNewestBpEntryHigh(patientUuid).map { Pair(patientUuid, it) } + + val hasDiabetes = + medicalHistoryRepository.historyForPatientOrDefaultImmediate( + defaultHistoryUuid = uuidGenerator.v4(), + patientUuid = patientUuid + ).diagnosedWithDiabetes == MedicalHistoryAnswer.Yes + + val isSriLanka = + country.isoCountryCode == Country.SRI_LANKA + + bloodPressureRepository.isNewestBpEntryHigh( + patientUuid = patientUuid, + isDiabeticPatient = hasDiabetes, + isSriLankaEnabled = isSriLanka + ).map { isNewestBpEntryHigh -> + Pair(patientUuid, isNewestBpEntryHigh) + } } .switchMap { (patientUuid, isNewestBpEntryHigh) -> - prescriptionRepository.hasPrescriptionForPatientChangedToday(patientUuid).map { Pair(isNewestBpEntryHigh, it) } + prescriptionRepository + .hasPrescriptionForPatientChangedToday(patientUuid) + .map { hasPrescriptionsChangedToday -> + Pair(isNewestBpEntryHigh, hasPrescriptionsChangedToday) + } } .map { (isNewestBpEntryHigh, hasPrescriptionsChangedToday) -> - ClinicalDecisionSupportInfoLoaded(isNewestBpEntryHigh, hasPrescriptionsChangedToday) + ClinicalDecisionSupportInfoLoaded( + isNewestBpEntryHigh, + hasPrescriptionsChangedToday + ) } } } diff --git a/app/src/test/java/org/simple/clinic/summary/PatientSummaryEffectHandlerTest.kt b/app/src/test/java/org/simple/clinic/summary/PatientSummaryEffectHandlerTest.kt index dbe9cbff20b..318f2a3d39a 100644 --- a/app/src/test/java/org/simple/clinic/summary/PatientSummaryEffectHandlerTest.kt +++ b/app/src/test/java/org/simple/clinic/summary/PatientSummaryEffectHandlerTest.kt @@ -652,7 +652,14 @@ class PatientSummaryEffectHandlerTest { // given val patientUuid = UUID.fromString("44daeb85-de4c-4807-8b31-6a88bf597cc7") - whenever(bloodPressureRepository.isNewestBpEntryHigh(patientUuid)).doReturn(Observable.just(true)) + val medicalHistory = TestData.medicalHistory() + + whenever(medicalHistoryRepository.historyForPatientOrDefaultImmediate( + defaultHistoryUuid = uuidGenerator.v4(), + patientUuid = patientUuid + )) doReturn medicalHistory + + whenever(bloodPressureRepository.isNewestBpEntryHigh(patientUuid, medicalHistory.diagnosedWithDiabetes == Yes, false)).doReturn(Observable.just(true)) whenever(prescriptionRepository.hasPrescriptionForPatientChangedToday(patientUuid)).doReturn(Observable.just(true)) // when diff --git a/app/src/test/java/org/simple/clinic/summary/PatientSummaryScreenLogicTest.kt b/app/src/test/java/org/simple/clinic/summary/PatientSummaryScreenLogicTest.kt index 441665e7a45..e86240e5e73 100644 --- a/app/src/test/java/org/simple/clinic/summary/PatientSummaryScreenLogicTest.kt +++ b/app/src/test/java/org/simple/clinic/summary/PatientSummaryScreenLogicTest.kt @@ -24,8 +24,7 @@ import org.simple.clinic.cvdrisk.calculator.NonLabBasedCVDRiskCalculator import org.simple.clinic.drugs.DiagnosisWarningPrescriptions import org.simple.clinic.drugs.PrescriptionRepository import org.simple.clinic.facility.FacilityRepository -import org.simple.clinic.feature.Feature -import org.simple.clinic.feature.Features +import org.simple.clinic.medicalhistory.Answer import org.simple.clinic.medicalhistory.MedicalHistoryRepository import org.simple.clinic.overdue.Appointment.Status.Cancelled import org.simple.clinic.overdue.AppointmentCancelReason @@ -35,11 +34,9 @@ import org.simple.clinic.patient.PatientRepository import org.simple.clinic.patient.businessid.Identifier import org.simple.clinic.patient.businessid.Identifier.IdentifierType.BpPassport import org.simple.clinic.patientattribute.PatientAttributeRepository -import org.simple.clinic.remoteconfig.DefaultValueConfigReader import org.simple.clinic.summary.OpenIntention.LinkIdWithPatient import org.simple.clinic.summary.OpenIntention.ViewExistingPatient import org.simple.clinic.summary.OpenIntention.ViewNewPatient -import org.simple.clinic.util.NoOpRemoteConfigService import org.simple.clinic.util.RxErrorsRule import org.simple.clinic.util.TestUserClock import org.simple.clinic.util.TestUtcClock @@ -104,16 +101,17 @@ class PatientSummaryScreenLogicTest { .atZone(userClock.zone) .toInstant() - whenever(bpRepository.isNewestBpEntryHigh(patientUuid)) doReturn Observable.just(true) + val medicalHistory = TestData.medicalHistory(uuid = medicalHistoryUuid) + whenever(medicalHistoryRepository.historyForPatientOrDefaultImmediate( + defaultHistoryUuid = uuidGenerator.v4(), + patientUuid = patientUuid + )) doReturn medicalHistory + whenever(bpRepository.isNewestBpEntryHigh(patientUuid, isDiabeticPatient = medicalHistory.diagnosedWithDiabetes == Answer.Yes, isSriLankaEnabled = false)) doReturn Observable.just(true) whenever(patientRepository.patientProfile(patientUuid)) doReturn Observable.just(Optional.of(patientProfile)) whenever(patientRepository.latestPhoneNumberForPatient(patientUuid)) doReturn Optional.empty() whenever(appointmentRepository.lastCreatedAppointmentForPatient(patientUuid)) doReturn Optional.empty() whenever(bpRepository.hasBPRecordedToday(patientUuid, today)) doReturn Observable.just(true) whenever(facilityRepository.facility(assignedFacilityUuid)) doReturn Optional.of(TestData.facility()) - whenever(medicalHistoryRepository.historyForPatientOrDefaultImmediate( - defaultHistoryUuid = uuidGenerator.v4(), - patientUuid = patientUuid - )) doReturn TestData.medicalHistory(uuid = medicalHistoryUuid) whenever(prescriptionRepository.newestPrescriptionsForPatientImmediate(patientUuid)) doReturn emptyList() }