Skip to content

Commit 20e66f3

Browse files
authored
SIMPLEMOB-4 Add effect to fetch complete medical records (#5726)
1 parent 51b6c9a commit 20e66f3

14 files changed

Lines changed: 150 additions & 67 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
### Internal
66

7-
-Update `ci-checks.yml` & `story-link-check.sh` to verify valid jira reference
7+
- Update `ci-checks.yml` & `story-link-check.sh` to verify valid jira reference
8+
- Add effect to fetch complete medical records
89

910
## 2026.02.02
1011

app/src/main/java/org/simple/clinic/bloodsugar/BloodSugarMeasurement.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ data class BloodSugarMeasurement(
9999
ORDER BY recordedAt DESC
100100
""")
101101
fun allBloodSugars(patientUuid: UUID): Observable<List<BloodSugarMeasurement>>
102+
@Query("""
103+
SELECT * FROM BloodSugarMeasurements
104+
WHERE patientUuid == :patientUuid AND deletedAt IS NULL
105+
ORDER BY recordedAt DESC
106+
""")
107+
fun allBloodSugarsImmediate(patientUuid: UUID): List<BloodSugarMeasurement>
102108

103109
@Query("""
104110
SELECT * FROM BloodSugarMeasurements

app/src/main/java/org/simple/clinic/medicalhistory/MedicalHistory.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import org.simple.clinic.medicalhistory.MedicalHistoryQuestion.IsOnDiabetesTreat
2424
import org.simple.clinic.medicalhistory.MedicalHistoryQuestion.IsOnHypertensionTreatment
2525
import org.simple.clinic.medicalhistory.MedicalHistoryQuestion.IsSmoking
2626
import org.simple.clinic.medicalhistory.MedicalHistoryQuestion.IsUsingSmokelessTobacco
27+
import org.simple.clinic.medicalhistory.sync.MedicalHistoryPayload
2728
import org.simple.clinic.patient.PatientUuid
2829
import org.simple.clinic.patient.SyncStatus
2930
import java.time.Instant
@@ -114,6 +115,28 @@ data class MedicalHistory(
114115
return copy(cholesterol = cholesterol)
115116
}
116117

118+
fun toPayload(): MedicalHistoryPayload {
119+
return MedicalHistoryPayload(
120+
uuid = uuid,
121+
patientUuid = patientUuid,
122+
diagnosedWithHypertension = diagnosedWithHypertension,
123+
isOnTreatmentForHypertension = isOnHypertensionTreatment,
124+
isOnDiabetesTreatment = isOnDiabetesTreatment,
125+
hasHadHeartAttack = hasHadHeartAttack,
126+
hasHadStroke = hasHadStroke,
127+
hasHadKidneyDisease = hasHadKidneyDisease,
128+
hasDiabetes = diagnosedWithDiabetes,
129+
hasHypertension = diagnosedWithHypertension,
130+
isSmoking = isSmoking,
131+
isUsingSmokelessTobacco = isUsingSmokelessTobacco,
132+
cholesterol = cholesterol,
133+
hypertensionDiagnosedAt = hypertensionDiagnosedAt,
134+
diabetesDiagnosedAt = diabetesDiagnosedAt,
135+
createdAt = createdAt,
136+
updatedAt = updatedAt,
137+
deletedAt = deletedAt)
138+
}
139+
117140
@Dao
118141
interface RoomDao {
119142

app/src/main/java/org/simple/clinic/medicalhistory/sync/MedicalHistorySync.kt

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,7 @@ class MedicalHistorySync @Inject constructor(
3535
}
3636

3737
private fun toRequest(histories: List<MedicalHistory>): MedicalHistoryPushRequest {
38-
val payloads = histories
39-
.map {
40-
it.run {
41-
MedicalHistoryPayload(
42-
uuid = uuid,
43-
patientUuid = patientUuid,
44-
diagnosedWithHypertension = diagnosedWithHypertension,
45-
isOnTreatmentForHypertension = isOnHypertensionTreatment,
46-
isOnDiabetesTreatment = isOnDiabetesTreatment,
47-
hasHadHeartAttack = hasHadHeartAttack,
48-
hasHadStroke = hasHadStroke,
49-
hasHadKidneyDisease = hasHadKidneyDisease,
50-
hasDiabetes = diagnosedWithDiabetes,
51-
hasHypertension = diagnosedWithHypertension,
52-
isSmoking = isSmoking,
53-
isUsingSmokelessTobacco = isUsingSmokelessTobacco,
54-
cholesterol = cholesterol,
55-
hypertensionDiagnosedAt = hypertensionDiagnosedAt,
56-
diabetesDiagnosedAt = diabetesDiagnosedAt,
57-
createdAt = createdAt,
58-
updatedAt = updatedAt,
59-
deletedAt = deletedAt)
60-
}
61-
}
38+
val payloads = histories.map { it.toPayload() }
6239
return MedicalHistoryPushRequest(payloads)
6340
}
6441
}

app/src/main/java/org/simple/clinic/overdue/Appointment.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,23 @@ data class Appointment(
5151
val creationFacilityUuid: UUID?
5252
) : Parcelable {
5353

54+
fun toPayload(): AppointmentPayload {
55+
return AppointmentPayload(
56+
uuid = uuid,
57+
patientUuid = patientUuid,
58+
facilityUuid = facilityUuid,
59+
creationFacilityUuid = creationFacilityUuid,
60+
date = scheduledDate,
61+
status = status,
62+
cancelReason = cancelReason,
63+
remindOn = remindOn,
64+
agreedToVisit = agreedToVisit,
65+
appointmentType = appointmentType,
66+
createdAt = createdAt,
67+
updatedAt = updatedAt,
68+
deletedAt = deletedAt)
69+
}
70+
5471
fun wasCancelledBecauseOfInvalidPhoneNumber(): Boolean = status == Status.Cancelled && cancelReason == AppointmentCancelReason.InvalidPhoneNumber
5572

5673
sealed class Status : Parcelable {

app/src/main/java/org/simple/clinic/overdue/AppointmentSync.kt

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,7 @@ class AppointmentSync @Inject constructor(
3333
}
3434

3535
private fun toRequest(appointments: List<Appointment>): AppointmentPushRequest {
36-
val payloads = appointments
37-
.map {
38-
it.run {
39-
AppointmentPayload(
40-
uuid = uuid,
41-
patientUuid = patientUuid,
42-
facilityUuid = facilityUuid,
43-
creationFacilityUuid = creationFacilityUuid,
44-
date = scheduledDate,
45-
status = status,
46-
cancelReason = cancelReason,
47-
remindOn = remindOn,
48-
agreedToVisit = agreedToVisit,
49-
appointmentType = appointmentType,
50-
createdAt = createdAt,
51-
updatedAt = updatedAt,
52-
deletedAt = deletedAt)
53-
}
54-
}
55-
.toList()
36+
val payloads = appointments.map { it.toPayload() }
5637
return AppointmentPushRequest(payloads)
5738
}
5839
}

app/src/main/java/org/simple/clinic/patient/PatientPhoneNumber.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.room.PrimaryKey
1212
import androidx.room.Query
1313
import io.reactivex.Flowable
1414
import kotlinx.parcelize.Parcelize
15+
import org.simple.clinic.patient.sync.PatientPhoneNumberPayload
1516
import java.time.Instant
1617
import java.util.UUID
1718

@@ -47,6 +48,18 @@ data class PatientPhoneNumber(
4748
val deletedAt: Instant?
4849
) : Parcelable {
4950

51+
fun toPayload(): PatientPhoneNumberPayload {
52+
return PatientPhoneNumberPayload(
53+
uuid = uuid,
54+
number = number,
55+
type = phoneType,
56+
active = active,
57+
createdAt = createdAt,
58+
updatedAt = updatedAt,
59+
deletedAt = deletedAt
60+
)
61+
}
62+
5063
fun withNumber(number: String): PatientPhoneNumber =
5164
copy(number = number)
5265

app/src/main/java/org/simple/clinic/patient/PatientRepository.kt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import org.simple.clinic.facility.Facility
1313
import org.simple.clinic.medicalhistory.Answer
1414
import org.simple.clinic.overdue.Appointment.AppointmentType.Manual
1515
import org.simple.clinic.overdue.Appointment.Status.Scheduled
16-
import org.simple.clinic.patient.Answer.*
16+
import org.simple.clinic.patient.Answer.Unanswered
1717
import org.simple.clinic.patient.PatientSearchCriteria.Name
1818
import org.simple.clinic.patient.PatientSearchCriteria.NumericCriteria
1919
import org.simple.clinic.patient.SyncStatus.DONE
@@ -741,6 +741,31 @@ class PatientRepository @Inject constructor(
741741
}
742742
}
743743

744+
fun fetchCompleteMedicalRecord(): List<CompleteMedicalRecord> {
745+
val patientProfiles = database.patientDao().allPatientProfiles()
746+
return patientProfiles.map { patientProfile ->
747+
val patientUuid = patientProfile.patientUuid
748+
val medicalHistory = database.medicalHistoryDao().historyForPatientImmediate(patientUuid)
749+
val appointments = database.appointmentDao().getAllAppointmentsForPatient(patientUuid)
750+
val bloodPressures = database.bloodPressureDao().allBloodPressuresRecordedSinceImmediate(
751+
patientUuid,
752+
Instant.EPOCH
753+
)
754+
val bloodSugars = database.bloodSugarDao().allBloodSugarsImmediate(patientUuid)
755+
756+
val prescribedDrugs = database.prescriptionDao().forPatientImmediate(patientUuid)
757+
758+
CompleteMedicalRecord(
759+
patient = patientProfile,
760+
medicalHistory = medicalHistory,
761+
appointments = appointments,
762+
bloodPressures = bloodPressures,
763+
bloodSugars = bloodSugars,
764+
prescribedDrugs = prescribedDrugs
765+
)
766+
}
767+
}
768+
744769
fun addIdentifiersToPatient(
745770
patientUuid: UUID,
746771
businessIds: List<BusinessId>

app/src/main/java/org/simple/clinic/patient/sync/PatientSync.kt

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@ class PatientSync @Inject constructor(
3838
private fun toRequest(patients: List<PatientProfile>): PatientPushRequest {
3939
return PatientPushRequest(
4040
patients.map { (patient, address, phoneNumbers, businessIds) ->
41-
val numberPayloads = phoneNumbers
42-
.map(::phoneNumberPayload)
43-
.let { payloads -> if (payloads.isEmpty()) null else payloads }
41+
val numberPayloads = phoneNumbers.map { it.toPayload() }
42+
.let { payloads -> payloads.ifEmpty { null } }
4443

4544
val businessIdPayloads = businessIds
4645
.map { it.toPayload() }
@@ -71,17 +70,4 @@ class PatientSync @Inject constructor(
7170
}
7271
)
7372
}
74-
75-
private fun phoneNumberPayload(phoneNumber: PatientPhoneNumber): PatientPhoneNumberPayload {
76-
return phoneNumber.run {
77-
PatientPhoneNumberPayload(
78-
uuid = uuid,
79-
number = number,
80-
type = phoneType,
81-
active = active,
82-
createdAt = createdAt,
83-
updatedAt = updatedAt,
84-
deletedAt = deletedAt)
85-
}
86-
}
8773
}

app/src/main/java/org/simple/clinic/settings/SettingsEffect.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.simple.clinic.settings
22

3+
import org.simple.clinic.scanid.ScanSimpleIdEffect
4+
35
sealed class SettingsEffect
46

57
data object LoadUserDetailsEffect : SettingsEffect()
@@ -23,3 +25,6 @@ data object ShowConfirmLogoutDialog : SettingsViewEffect()
2325
data object RestartApp : SettingsViewEffect()
2426

2527
data object GoBack : SettingsViewEffect()
28+
29+
data object FetchCompleteMedicalRecords : SettingsEffect()
30+

0 commit comments

Comments
 (0)