Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,12 @@
- Bug fixes in CI workflows
- Fetch `lab_based_cvd_risk_calculation_sheet` from remote config
- Add `cholesterol_value` to `MedicalHistory` table
- Bump AGP to v8.8.1
- Fix JSON variable name in non-lab based statin calculation sheet
- Add `LabBasedCVDRiskCalculator` and effect to calculate lab based cvd risk
- Add `CholesterolEntrySheet`
- Bump AGP to v8.8.2
- Calculate lab-based CVD risk score
- Update copy of statin nudge to support lab-based nudge

### Fixes

Expand Down
6 changes: 4 additions & 2 deletions app/src/main/java/org/simple/clinic/cvdrisk/CVDRiskLevel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ import org.simple.clinic.R
enum class CVDRiskLevel(val displayStringResId: Int, val color: Color) {
LOW_HIGH(R.string.statin_alert_low_high_risk_patient_x, Color(0xFFFF7A00)),
MEDIUM_HIGH(R.string.statin_alert_medium_high_risk_patient_x, Color(0xFFFF7A00)),
HIGH(R.string.statin_alert_high_risk_patient_x, Color(0xFFFF3355));
HIGH(R.string.statin_alert_high_risk_patient_x, Color(0xFFFF3355)),
VERY_HIGH(R.string.statin_alert_very_high_risk_range, Color(0xFFFF3355));

companion object {
fun compute(cvdRiskRange: CVDRiskRange): CVDRiskLevel {
return when {
cvdRiskRange.min < 5 -> LOW_HIGH
cvdRiskRange.min < 10 -> MEDIUM_HIGH
else -> HIGH
cvdRiskRange.min < 20 -> HIGH
else -> VERY_HIGH
}
}
}
Expand Down
7 changes: 5 additions & 2 deletions app/src/main/java/org/simple/clinic/cvdrisk/StatinInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,19 @@ import org.simple.clinic.patientattribute.BMIReading

@Parcelize
data class StatinInfo(
val canPrescribeStatin: Boolean,
val canShowStatinNudge: Boolean,
val cvdRisk: CVDRiskRange? = null,
val isSmoker: Answer = Answer.Unanswered,
val bmiReading: BMIReading? = null,
val hasCVD: Boolean = false,
val hasDiabetes: Boolean = false,
val age: Int = 0,
val cholesterol: Float? = null,
) : Parcelable {
companion object {
fun default(): StatinInfo {
return StatinInfo(
canPrescribeStatin = false,
canShowStatinNudge = false,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import androidx.room.Query
import androidx.room.RawQuery
import androidx.sqlite.db.SimpleSQLiteQuery
import io.reactivex.Flowable
import io.reactivex.Observable
import kotlinx.parcelize.Parcelize
import org.simple.clinic.medicalhistory.Answer.Unanswered
import org.simple.clinic.medicalhistory.MedicalHistoryQuestion.DiagnosedWithDiabetes
Expand Down Expand Up @@ -69,6 +68,14 @@ data class MedicalHistory(

val deletedAt: Instant?
) : Parcelable {

companion object {

fun convertCholesterolToMmol(cholesterol: Float): Float {
return cholesterol / 38.67f
}
}

val diagnosisRecorded: Boolean
get() = diagnosedWithHypertension != Unanswered && diagnosedWithDiabetes != Unanswered

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ data class MedicalHistoryPayload(
@Json(name = "smoking")
val isSmoking: Answer,

@Json(name = "cholesterol_value")
@Json(name = "cholesterol")
val cholesterol: Float?,

@Json(name = "created_at")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,5 @@ data class ShowHypertensionDiagnosisWarning(val continueToDiabetesDiagnosisWarni
data object ShowSmokingStatusDialog : PatientSummaryViewEffect()

data class OpenBMIEntrySheet(val patientUuid: UUID) : PatientSummaryViewEffect()

data class OpenCholesterolEntrySheet(val patientUuid: UUID) : PatientSummaryViewEffect()
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@ import org.simple.clinic.cvdrisk.CVDRiskRange
import org.simple.clinic.cvdrisk.CVDRiskRepository
import org.simple.clinic.cvdrisk.LabBasedCVDRiskInput
import org.simple.clinic.cvdrisk.NonLabBasedCVDRiskInput
import org.simple.clinic.cvdrisk.StatinInfo
import org.simple.clinic.cvdrisk.calculator.LabBasedCVDRiskCalculator
import org.simple.clinic.cvdrisk.calculator.NonLabBasedCVDRiskCalculator
import org.simple.clinic.drugs.DiagnosisWarningPrescriptions
import org.simple.clinic.drugs.PrescriptionRepository
import org.simple.clinic.facility.Facility
import org.simple.clinic.facility.FacilityRepository
import org.simple.clinic.medicalhistory.MedicalHistory
import org.simple.clinic.medicalhistory.MedicalHistoryQuestion
import org.simple.clinic.medicalhistory.MedicalHistoryRepository
import org.simple.clinic.overdue.AppointmentRepository
Expand Down Expand Up @@ -233,7 +233,7 @@ class PatientSummaryEffectHandler @AssistedInject constructor(
systolic = bloodPressure.reading.systolic,
isSmoker = medicalHistory.isSmoking,
diagnosedWithDiabetes = medicalHistory.diagnosedWithDiabetes,
cholesterol = null //Update once the value is available in medical history
cholesterol = medicalHistory.cholesterol?.let { MedicalHistory.convertCholesterolToMmol(it) }
)
)
}
Expand Down Expand Up @@ -279,18 +279,20 @@ class PatientSummaryEffectHandler @AssistedInject constructor(
.observeOn(schedulersProvider.io())
.map { effect ->
val patientUuid = effect.patientUuid
val patient = patientRepository.patientImmediate(patientUuid)
val medicalHistory = medicalHistoryRepository.historyForPatientOrDefaultImmediate(
defaultHistoryUuid = uuidGenerator.v4(),
patientUuid = patientUuid
)
val bmiReading = patientAttributeRepository.getPatientAttributeImmediate(patientUuid)
val cvdRisk = cvdRiskRepository.getCVDRiskImmediate(patientUuid)
StatinInfoLoaded(StatinInfo(
canPrescribeStatin = cvdRisk?.riskScore?.canPrescribeStatin ?: false,
cvdRisk = cvdRisk?.riskScore,
isSmoker = medicalHistory.isSmoking,
bmiReading = bmiReading?.bmiReading,
))
val patientAttribute = patientAttributeRepository.getPatientAttributeImmediate(patientUuid)
val riskRange = cvdRiskRepository.getCVDRiskImmediate(patientUuid)?.riskScore

StatinInfoLoaded(
age = patient!!.ageDetails.estimateAge(userClock),
medicalHistory = medicalHistory,
riskRange = riskRange,
bmiReading = patientAttribute?.bmiReading,
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ package org.simple.clinic.summary

import org.simple.clinic.cvdrisk.CVDRisk
import org.simple.clinic.cvdrisk.CVDRiskRange
import org.simple.clinic.cvdrisk.StatinInfo
import org.simple.clinic.drugs.DiagnosisWarningPrescriptions
import org.simple.clinic.drugs.PrescribedDrug
import org.simple.clinic.facility.Facility
import org.simple.clinic.medicalhistory.Answer
import org.simple.clinic.medicalhistory.MedicalHistory
import org.simple.clinic.overdue.Appointment
import org.simple.clinic.patientattribute.BMIReading
import org.simple.clinic.patientattribute.PatientAttribute
import org.simple.clinic.reassignpatient.ReassignPatientSheetClosedFrom
import org.simple.clinic.reassignpatient.ReassignPatientSheetOpenedFrom
Expand Down Expand Up @@ -163,7 +163,10 @@ data class CVDRiskCalculated(
data object CVDRiskUpdated : PatientSummaryEvent()

data class StatinInfoLoaded(
val statinInfo: StatinInfo
val age: Int,
val medicalHistory: MedicalHistory,
val riskRange: CVDRiskRange?,
val bmiReading: BMIReading?,
) : PatientSummaryEvent()

data object AddSmokingClicked : PatientSummaryEvent()
Expand All @@ -175,3 +178,7 @@ data class SmokingStatusAnswered(
data object BMIReadingAdded : PatientSummaryEvent()

data object AddBMIClicked : PatientSummaryEvent()

data object AddCholesterolClicked: PatientSummaryEvent()

data object CholesterolAdded : PatientSummaryEvent()
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ import org.simple.clinic.reassignpatient.ReassignPatientSheetOpenedFrom
import org.simple.clinic.remoteconfig.ConfigReader
import org.simple.clinic.scheduleappointment.ScheduleAppointmentSheet
import org.simple.clinic.scheduleappointment.facilityselection.FacilitySelectionScreen
import org.simple.clinic.summary.addcholesterol.CholesterolEntrySheet
import org.simple.clinic.summary.addphone.AddPhoneNumberDialog
import org.simple.clinic.summary.compose.StatinNudge
import org.simple.clinic.summary.linkId.LinkIdWithPatientSheet.LinkIdWithPatientSheetKey
Expand Down Expand Up @@ -327,8 +328,11 @@ class PatientSummaryScreen :
StatinNudge(
statinInfo = statinInfo,
modifier = Modifier.padding(start = 8.dp, end = 8.dp, top = 8.dp),
isNonLabBasedStatinNudgeEnabled = features.isEnabled(Feature.NonLabBasedStatinNudge),
isLabBasedStatinNudgeEnabled = features.isEnabled(Feature.LabBasedStatinNudge),
addSmokingClick = { additionalEvents.notify(AddSmokingClicked) },
addBMIClick = { additionalEvents.notify(AddBMIClicked) }
addBMIClick = { additionalEvents.notify(AddBMIClicked) },
addCholesterol = { additionalEvents.notify(AddCholesterolClicked) }
)
}
}
Expand Down Expand Up @@ -360,6 +364,10 @@ class PatientSummaryScreen :
is ScreenRequest.BMIEntrySheet -> {
additionalEvents.notify(BMIReadingAdded)
}

is ScreenRequest.CholesterolEntrySheet -> {
additionalEvents.notify(CholesterolAdded)
}
}
}

Expand Down Expand Up @@ -757,6 +765,10 @@ class PatientSummaryScreen :
.show()
}

override fun openCholesterolEntrySheet(patientUuid: UUID) {
router.pushExpectingResult(ScreenRequest.CholesterolEntrySheet, CholesterolEntrySheet.Key(patientUuid))
}

override fun openBMIEntrySheet(patientUuid: UUID) {
router.pushExpectingResult(ScreenRequest.BMIEntrySheet, BMIEntrySheet.Key(patientUuid))
}
Expand Down Expand Up @@ -903,5 +915,8 @@ class PatientSummaryScreen :

@Parcelize
data object BMIEntrySheet : ScreenRequest()

@Parcelize
data object CholesterolEntrySheet : ScreenRequest()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,5 @@ interface PatientSummaryUiActions {
fun showHypertensionDiagnosisWarning(continueToDiabetesDiagnosisWarning: Boolean)
fun showSmokingStatusDialog()
fun openBMIEntrySheet(patientUuid: UUID)
fun openCholesterolEntrySheet(patientUuid: UUID)
}
Loading
Loading