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
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,17 @@ public ResponseEntity<ApiResponse> submitBulk(
new ApiResponse(true, "Bulk submit complete: " + saved.size() + " saved", saved));
}

@Operation(summary = "Get all form responses for a beneficiary filtered by form UUID")
@Operation(summary = "Get all form responses for a beneficiary filtered by form UUID. "
+ "If beneficiaryId is omitted, villageId and/or providerServiceMapId are used instead "
+ "to return responses for every matching beneficiary.")
@RequestMapping(value = "/getByBeneficiary", method = RequestMethod.GET)
public ResponseEntity<ApiResponse> getByBeneficiary(
@RequestParam Long beneficiaryId,
@RequestParam(required = false) Long beneficiaryId,
@RequestParam(required = false) Integer villageId,
@RequestParam(required = false) Integer providerServiceMapId,
@RequestParam String formUuid) {
List<FormResponseDTO> dtos =
responseService.getResponsesByBeneficiary(beneficiaryId, formUuid);
responseService.getResponsesByBeneficiary(beneficiaryId, villageId, providerServiceMapId, formUuid);
return ResponseEntity.ok(new ApiResponse(true, "Responses fetched successfully", dtos));
}

Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/iemr/flw/repo/iemr/FormResponseRepo.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ List<FormResponse> findByFormIdAndStatusInFiltered(@Param("formId") Long formId,
@Param("villageId") Integer villageId,
@Param("providerServiceMapId") Integer providerServiceMapId);

@Query("SELECT r FROM FormResponse r WHERE r.formId = :formId " +
"AND r.beneficiaryId IN (SELECT b.beneficiaryID FROM BenFlowStatus b WHERE b.deleted = false " +
"AND (:villageId IS NULL OR b.villageID = :villageId) " +
"AND (:providerServiceMapId IS NULL OR b.providerServiceMapId = :providerServiceMapId))")
List<FormResponse> findByFormIdFiltered(@Param("formId") Long formId,
@Param("villageId") Integer villageId,
@Param("providerServiceMapId") Integer providerServiceMapId);

@Query("SELECT r.beneficiaryId FROM FormResponse r " +
"WHERE r.beneficiaryId IN :benIds " +
"AND r.formId = :formId " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,14 @@ public interface DynamicFormResponseService {
/** Save POST_SUBMIT section answers and advance status to COMPLETE. */
FormResponseDTO completeForm(FormResponseRequest request, String jwtToken) throws IEMRException;

/** All responses for a beneficiary filtered by form UUID. */
List<FormResponseDTO> getResponsesByBeneficiary(Long beneficiaryId, String formUuid);
/**
* Responses to the given form, either for one beneficiary or for every beneficiary matching
* villageId/providerServiceMapId. At least one of beneficiaryId, villageId, or
* providerServiceMapId is required: pass beneficiaryId for a single beneficiary, or leave it
* null and use villageId and/or providerServiceMapId to filter across beneficiaries.
*/
List<FormResponseDTO> getResponsesByBeneficiary(Long beneficiaryId, Integer villageId,
Integer providerServiceMapId, String formUuid);

/** Single response with all nested section and question answers. */
FormResponseDTO getResponseById(Long responseId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,12 +152,18 @@ public FormResponseDTO completeForm(FormResponseRequest request, String jwtToken

@Override
@Transactional(readOnly = true)
public List<FormResponseDTO> getResponsesByBeneficiary(Long beneficiaryId, String formUuid) {
public List<FormResponseDTO> getResponsesByBeneficiary(Long beneficiaryId, Integer villageId,
Integer providerServiceMapId, String formUuid) {
if (beneficiaryId == null && villageId == null && providerServiceMapId == null) {
throw new IllegalArgumentException(
"At least one of beneficiaryId, villageId, or providerServiceMapId must be provided");
}
FormVersion version = resolveLatestVersion(formUuid);
Long formId = version.getDynamicForm().getFormId();

List<FormResponse> responses =
formResponseRepo.findByBeneficiaryIdAndFormId(beneficiaryId, formId);
List<FormResponse> responses = beneficiaryId != null
? formResponseRepo.findByBeneficiaryIdAndFormId(beneficiaryId, formId)
: formResponseRepo.findByFormIdFiltered(formId, villageId, providerServiceMapId);
return responses.stream()
.map(r -> buildFormResponseDTO(r, loadSectionResponseDTOs(r.getResponseId())))
.collect(Collectors.toList());
Expand Down