Skip to content

Commit

Permalink
Match total regimens to the total number of tx curr
Browse files Browse the repository at this point in the history
Match total regimens to the total number of tx curr
  • Loading branch information
Michaelndula authored Jan 27, 2025
2 parents b05ccd4 + f23ee98 commit 35078fa
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@

import org.openmrs.Concept;
import org.openmrs.Obs;
import org.openmrs.Patient;
import org.openmrs.api.context.Context;
import org.openmrs.module.ssemrws.queries.GetInterruptedInTreatment;
import org.springframework.stereotype.Component;

import java.text.ParseException;
Expand All @@ -17,21 +15,9 @@
@Component
public class GetPatientRegimens {

public Object getPatientsOnRegimenTreatment(String qStartDate, String qEndDate, List<String> regimenConceptUuids,
String activeRegimenConceptUuid, List<GetTxNew.PatientEnrollmentData> txCurrPatients) throws ParseException {

if (qStartDate == null || qStartDate.isEmpty()) {
throw new IllegalArgumentException("Start date cannot be null or empty");
}
if (qEndDate == null || qEndDate.isEmpty()) {
throw new IllegalArgumentException("End date cannot be null or empty");
}
if (regimenConceptUuids == null || regimenConceptUuids.isEmpty()) {
throw new IllegalArgumentException("Regimen concept UUIDs cannot be null or empty");
}
if (activeRegimenConceptUuid == null || activeRegimenConceptUuid.isEmpty()) {
throw new IllegalArgumentException("Active regimen concept UUID cannot be null or empty");
}
public Object getFilteredPatientsOnRegimenTreatment(String qStartDate, String qEndDate,
List<String> adultRegimenConceptUuids, List<String> childRegimenConceptUuids, String activeRegimenConceptUuid,
List<GetTxNew.PatientEnrollmentData> txCurrPatients, boolean isAdultCategory) throws ParseException {

SimpleDateFormat dateTimeFormatter = new SimpleDateFormat("yyyy-MM-dd");
Date[] dates = getStartAndEndDate(qStartDate, qEndDate, dateTimeFormatter);
Expand All @@ -40,14 +26,23 @@ public Object getPatientsOnRegimenTreatment(String qStartDate, String qEndDate,
Set<Integer> txCurrPatientIds = txCurrPatients.stream().map(data -> data.getPatient().getPatientId())
.collect(Collectors.toSet());

// Get regimen observations and filter them based on txCurr patients
List<Obs> regimenTreatmentObs = getRegimenTreatmentObservations(dates, regimenConceptUuids, activeRegimenConceptUuid)
.stream().filter(obs -> txCurrPatientIds.contains(obs.getPerson().getPersonId()))
.collect(Collectors.toList());
// Fetch both adult and child regimen observations
List<Obs> adultRegimenObs = getRegimenTreatmentObservations(dates, adultRegimenConceptUuids,
activeRegimenConceptUuid);
List<Obs> childRegimenObs = getRegimenTreatmentObservations(dates, childRegimenConceptUuids,
activeRegimenConceptUuid);

// Combine observations and determine the latest observation for each patient
Map<Integer, Obs> latestObsByPatient = getLatestObservationsAcrossCategories(txCurrPatientIds, adultRegimenObs,
childRegimenObs);

Map<Integer, Obs> latestObsByPatient = getLatestObservationsByPatient(regimenTreatmentObs);
// Filter patients based on category (adult or child)
Map<Integer, Obs> filteredObsByPatient = latestObsByPatient.entrySet().stream().filter(
entry -> isAdultCategory == adultRegimenConceptUuids.contains(entry.getValue().getValueCoded().getUuid()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Map<String, Integer> regimenCounts = countRegimens(latestObsByPatient);
// Count regimens
Map<String, Integer> regimenCounts = countRegimens(filteredObsByPatient);

return prepareResults(regimenCounts);
}
Expand All @@ -60,25 +55,38 @@ private List<Obs> getRegimenTreatmentObservations(Date[] dates, List<String> reg
regimenConcepts, null, null, null, 0, null, null, dates[1], false);
}

private Map<Integer, Obs> getLatestObservationsByPatient(List<Obs> regimenTreatmentObs) {
private Map<Integer, Obs> getLatestObservationsAcrossCategories(Set<Integer> txCurrPatientIds, List<Obs> adultRegimenObs,
List<Obs> childRegimenObs) {
Map<Integer, Obs> latestObsByPatient = new HashMap<>();
for (Obs obs : regimenTreatmentObs) {

// Combine adult and child observations into one list
List<Obs> allObservations = new ArrayList<>();
allObservations.addAll(adultRegimenObs);
allObservations.addAll(childRegimenObs);

// Determine the latest observation for each patient
for (Obs obs : allObservations) {
Integer patientId = obs.getPerson().getPersonId();
if (!latestObsByPatient.containsKey(patientId)
|| obs.getObsDatetime().after(latestObsByPatient.get(patientId).getObsDatetime())) {
latestObsByPatient.put(patientId, obs);
if (txCurrPatientIds.contains(patientId)) {
if (!latestObsByPatient.containsKey(patientId)
|| obs.getObsDatetime().after(latestObsByPatient.get(patientId).getObsDatetime())) {
latestObsByPatient.put(patientId, obs);
}
}
}

return latestObsByPatient;
}

private Map<String, Integer> countRegimens(Map<Integer, Obs> latestObsByPatient) {
Map<String, Integer> regimenCounts = new HashMap<>();
for (Obs obs : latestObsByPatient.values()) {
Concept regimenConcept = obs.getValueCoded();
if (regimenConcept != null && regimenConcept.getName() != null) {
String conceptName = regimenConcept.getName().getName();
regimenCounts.put(conceptName, regimenCounts.getOrDefault(conceptName, 0) + 1);
if (obs != null) {
Concept regimenConcept = obs.getValueCoded();
if (regimenConcept != null && regimenConcept.getName() != null) {
String conceptName = regimenConcept.getName().getName();
regimenCounts.put(conceptName, regimenCounts.getOrDefault(conceptName, 0) + 1);
}
}
}
return regimenCounts;
Expand All @@ -98,15 +106,4 @@ private Map<String, Object> prepareResults(Map<String, Integer> regimenCounts) {
results.put("results", regimenList);
return results;
}

private Date[] getStartAndEndDate(String qStartDate, String qEndDate, SimpleDateFormat dateTimeFormatter)
throws ParseException {
Date startDate = dateTimeFormatter.parse(qStartDate);
Date endDate = dateTimeFormatter.parse(qEndDate);
return new Date[] { startDate, endDate };
}

private List<Concept> getConceptsByUuids(List<String> conceptUuids) {
return conceptUuids.stream().map(Context.getConceptService()::getConceptByUuid).collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -500,40 +500,51 @@ public Object getPatientsOnHighVl(HttpServletRequest request, @RequestParam("sta
public Object getPatientsOnAdultRegimenTreatment(HttpServletRequest request,
@RequestParam("startDate") String qStartDate, @RequestParam("endDate") String qEndDate,
@RequestParam(required = false, value = "filter") filterCategory filterCategory) throws ParseException {

SimpleDateFormat dateTimeFormatter = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = dateTimeFormatter.parse(qStartDate);
Date endDate = dateTimeFormatter.parse(qEndDate);

// Get txCurrPatients within the date range
List<GetTxNew.PatientEnrollmentData> txCurrPatients = getTxCurrMain.getTxCurrPatients(startDate, endDate);

return getPatientRegimens.getPatientsOnRegimenTreatment(qStartDate, qEndDate,
// Fetch adult and child regimens
return getPatientRegimens.getFilteredPatientsOnRegimenTreatment(qStartDate, qEndDate,
Arrays.asList(regimen_1A, regimen_1B, regimen_1C, regimen_1D, regimen_1E, regimen_1F, regimen_1G, regimen_1H,
regimen_1J, regimen_2A, regimen_2B, regimen_2C, regimen_2D, regimen_2E, regimen_2F, regimen_2G, regimen_2H,
regimen_2I, regimen_2J, regimen_2K),
ACTIVE_REGIMEN_CONCEPT_UUID, txCurrPatients);
Arrays.asList(regimen_4A, regimen_4B, regimen_4C, regimen_4D, regimen_4E, regimen_4F, regimen_4G, regimen_4H,
regimen_4I, regimen_4J, regimen_4K, regimen_4L, regimen_5A, regimen_5B, regimen_5C, regimen_5D, regimen_5E,
regimen_5F, regimen_5G, regimen_5H, regimen_5I, regimen_5J),
// regimens
ACTIVE_REGIMEN_CONCEPT_UUID, txCurrPatients, true
);
}

/**
* Retrieves patients on children regimen treatment within a specified date range.
*/
@RequestMapping(method = RequestMethod.GET, value = "/dashboard/childRegimenTreatment")
@ResponseBody
public Object getPatientsOnChildRegimenTreatment(HttpServletRequest request,
@RequestParam("startDate") String qStartDate, @RequestParam("endDate") String qEndDate,
@RequestParam(required = false, value = "filter") filterCategory filterCategory) throws ParseException {

SimpleDateFormat dateTimeFormatter = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = dateTimeFormatter.parse(qStartDate);
Date endDate = dateTimeFormatter.parse(qEndDate);

// Get txCurrPatients within the date range
List<GetTxNew.PatientEnrollmentData> txCurrPatients = getTxCurrMain.getTxCurrPatients(startDate, endDate);

return getPatientRegimens.getPatientsOnRegimenTreatment(qStartDate, qEndDate,
// Fetch adult and child regimens
return getPatientRegimens.getFilteredPatientsOnRegimenTreatment(qStartDate, qEndDate,
Arrays.asList(regimen_1A, regimen_1B, regimen_1C, regimen_1D, regimen_1E, regimen_1F, regimen_1G, regimen_1H,
regimen_1J, regimen_2A, regimen_2B, regimen_2C, regimen_2D, regimen_2E, regimen_2F, regimen_2G, regimen_2H,
regimen_2I, regimen_2J, regimen_2K),
Arrays.asList(regimen_4A, regimen_4B, regimen_4C, regimen_4D, regimen_4E, regimen_4F, regimen_4G, regimen_4H,
regimen_4I, regimen_4J, regimen_4K, regimen_4L, regimen_5A, regimen_5B, regimen_5C, regimen_5D, regimen_5E,
regimen_5F, regimen_5G, regimen_5H, regimen_5I, regimen_5J),
ACTIVE_REGIMEN_CONCEPT_UUID, txCurrPatients);
// regimens
ACTIVE_REGIMEN_CONCEPT_UUID, txCurrPatients, false
);
}

/**
Expand Down

0 comments on commit 35078fa

Please sign in to comment.