Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
b864f22
FPVTL-2022 : added Awaiting Information
ravidoki-hmcts Feb 3, 2026
d73feec
FPVTL-2022 - Initial changes for Awaiting Information Case
maddalihari Feb 3, 2026
24b0082
FPVTL-2022 - added awaiting information
ravidoki-hmcts Feb 6, 2026
d336590
FPVTL-2022 - added awaiting information
ravidoki-hmcts Feb 6, 2026
c95012d
FPVTL-2022 - added awaiting information tests for controller and service
Feb 9, 2026
682524c
Merge branch 'master' into FPVTL-2022
ravidoki-hmcts Feb 9, 2026
fcb3503
FPVTL-2022 - added awaiting information - tests
ravidoki-hmcts Feb 9, 2026
57087b6
FPVTL-2022 - added awaiting information tests for controller and service
Feb 9, 2026
2b14788
Merge remote-tracking branch 'origin/FPVTL-2022' into FPVTL-2022
Feb 9, 2026
78c23f6
FPVTL-2022 - added awaiting information tests for controller and service
Feb 9, 2026
525d5ab
FPVTL-2022 - added awaiting information tests for controller and service
Feb 9, 2026
144880c
FPVTL-2022 - added feature toggler
Feb 9, 2026
8a750ec
FPVTL-2022 - added awaiting information - added FS
ravidoki-hmcts Feb 10, 2026
7265b1d
FPVTL-2022 - added awaiting information - added FS
ravidoki-hmcts Feb 10, 2026
732de69
FPVTL-2022 - added awaiting information - added FS
ravidoki-hmcts Feb 10, 2026
d52259d
FPVTL-2022 - added feature toggler removed conditional on calss, used…
Feb 10, 2026
cfe3b9d
FPVTL-2022 - persist awaitingInformation in to case data
Feb 12, 2026
30c90aa
FPVTL-2022 added reasons for awaiting information
Feb 13, 2026
f19ab52
FPVTL-2022 - added awaiting information - added FS
ravidoki-hmcts Feb 17, 2026
9944db6
FPVTL-2022 - added awaiting information - added FS
ravidoki-hmcts Feb 17, 2026
61f4101
FPVTL-2022 - added awaiting information - added FS
ravidoki-hmcts Feb 17, 2026
3934862
FPVTL-2022 - added awaiting information - added FS
ravidoki-hmcts Feb 17, 2026
20d9f54
Merge branch 'master' into FPVTL-2022
srochani Feb 18, 2026
9aa90df
FPVTL-2022 - added awaiting information - added FS
ravidoki-hmcts Feb 19, 2026
be1e7ee
Merge remote-tracking branch 'origin/FPVTL-2022' into FPVTL-2022
ravidoki-hmcts Feb 19, 2026
14a06e7
FPVTL-2022 added tests for awaiting information details for summary tab
Feb 20, 2026
b9ba27e
FPVTL-2022 review comments
Feb 24, 2026
700c867
FPVTL-2022 - fixes as per comments
ravidoki-hmcts Feb 24, 2026
a262e62
Merge remote-tracking branch 'origin/FPVTL-2022' into FPVTL-2022
ravidoki-hmcts Feb 24, 2026
970a02f
FPVTL-2022 - fixes as per comments
ravidoki-hmcts Feb 24, 2026
1415228
FPVTL-2022 review comments
Feb 24, 2026
31c0a92
FPVTL-2022 review comments
Feb 25, 2026
7cafc9b
FPVTL-2022 review comments
Feb 25, 2026
a5d6134
FPVTL-2022 review comments
Feb 25, 2026
b5a5035
Merge remote-tracking branch 'origin/master' into FPVTL-2022
ravidoki-hmcts Feb 25, 2026
ac38882
FPVTL-2022 review comments
Feb 26, 2026
2f131ee
FPVTL-2022 review comments
Feb 26, 2026
d8355f9
FPVTL-2022 review date validation
Feb 26, 2026
770329c
FPVTL-2022 case event name change from Awaiting Information to Reques…
Mar 2, 2026
d3709fa
FPVTL-2022 case event name change from Awaiting Information to Reques…
Mar 2, 2026
38167ef
FPVTL-2022 case event name change from Awaiting Information to Reques…
Mar 4, 2026
3b724dd
FPVTL-2022 history Tab
Mar 6, 2026
211f397
FPVTL-2022 history Tab changes
Mar 11, 2026
1dae850
FPVTL-2022 history Tab changes
Mar 11, 2026
04db217
Merge branch 'master' of github.com:hmcts/prl-cos-api into FPVTL-2510…
bsgangapatnam Mar 26, 2026
c737c1e
adding Awating info for case issued
bsgangapatnam Mar 26, 2026
ca96a9e
refactor the callback controller for Case Issued
bsgangapatnam Mar 27, 2026
da0d184
FPVTL-2108 Populating HWF_APP_LIST when the case state AWAITING_INFOR…
tonymort Mar 26, 2026
c9b0c05
FPVTL-2108 On the about to submit stage of the HWF event, handling th…
tonymort Mar 29, 2026
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
1 change: 0 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -707,4 +707,3 @@ bootWithCCD {
test {
useJUnitPlatform()
}

1 change: 1 addition & 0 deletions charts/prl-cos/values.preview.template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -105,5 +105,6 @@ java:
COMMON_DATA_API: http://rd-commondata-api-aat.service.core-compute-aat.internal
SEND_LETTER_URL: http://rpe-send-letter-service-{{ .Values.global.environment }}.service.core-compute-{{ .Values.global.environment }}.internal
BARRISTER_FEATURE_ENABLED: true
AWAITING_INFORMATION_ENABLED: true
CAFCASS_DATE_TIME_FEATURE_ENABLED: true
APP_ENV: "preview"

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -1126,6 +1126,8 @@ public class PrlAppsConstants {

public static final String CASE_STATUS = "caseStatus";

public static final String REQUEST_FURTHER_INFORMATION_DETAILS = "requestFurtherInformationDetails";

public static final String FETCH_FEE_INVALID_APPLICATION_TYPE = "Invalid application type to fetch fee details: ";
public static final String FETCH_FEE_ERROR = "Error while fetching fee details for application type: ";
public static final String ENGLISH = "en";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@
import static uk.gov.hmcts.reform.prl.constants.PrlLaunchDarklyFlagConstants.TASK_LIST_V2_FLAG;
import static uk.gov.hmcts.reform.prl.constants.PrlLaunchDarklyFlagConstants.TASK_LIST_V3_FLAG;
import static uk.gov.hmcts.reform.prl.enums.Event.SEND_TO_GATEKEEPER;
import static uk.gov.hmcts.reform.prl.enums.State.AWAITING_INFORMATION;
import static uk.gov.hmcts.reform.prl.enums.State.CASE_ISSUED;
import static uk.gov.hmcts.reform.prl.enums.State.SUBMITTED_PAID;
import static uk.gov.hmcts.reform.prl.enums.YesOrNo.Yes;
import static uk.gov.hmcts.reform.prl.utils.CaseUtils.getCaseData;
Expand Down Expand Up @@ -696,15 +698,25 @@ public AboutToStartOrSubmitCallbackResponse addCaseNumberSubmitted(
) {
if (authorisationService.isAuthorized(authorisation, s2sToken)) {
Map<String, Object> caseDataUpdated = callbackRequest.getCaseDetails().getData();
CaseData caseData = getCaseData(callbackRequest.getCaseDetails(), objectMapper);
List<CaseEventDetail> eventsForCase = caseEventService.findEventsForCase(String.valueOf(callbackRequest.getCaseDetails().getId()));

Optional<String> previousState = eventsForCase.stream()
Optional<String> previousStateOpt = eventsForCase.stream()
.map(CaseEventDetail::getStateId)
.findFirst();
previousState.ifPresent(s -> caseDataUpdated.put(
VERIFY_CASE_NUMBER_ADDED,
SUBMITTED_PAID.getValue().equalsIgnoreCase(s) ? Yes.getDisplayedValue() : null
));

if (previousStateOpt.isPresent()) {
String previousState = previousStateOpt.get();
if (AWAITING_INFORMATION.getValue().equalsIgnoreCase(previousState)) {
caseDataUpdated.put(VERIFY_CASE_NUMBER_ADDED, Yes.getDisplayedValue());
caseData = caseData.toBuilder().state(CASE_ISSUED).build();
caseDataUpdated.putAll(caseSummaryTab.updateTab(caseData));
caseDataUpdated.put(STATE_FIELD, CASE_ISSUED.getValue());
} else if (SUBMITTED_PAID.getValue().equalsIgnoreCase(previousState)) {
caseDataUpdated.put(VERIFY_CASE_NUMBER_ADDED, Yes.getDisplayedValue());
}
}

caseDataUpdated.put(ISSUE_DATE_FIELD, LocalDate.now());
return AboutToStartOrSubmitCallbackResponse.builder()
.data(caseDataUpdated)
Expand Down Expand Up @@ -940,4 +952,3 @@ public AboutToStartOrSubmitCallbackResponse updateOtherPeoplePartyDetails(
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package uk.gov.hmcts.reform.prl.controllers;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse;
import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest;
import uk.gov.hmcts.reform.ccd.client.model.SubmittedCallbackResponse;
import uk.gov.hmcts.reform.prl.constants.PrlAppsConstants;
import uk.gov.hmcts.reform.prl.models.dto.ccd.CallbackResponse;
import uk.gov.hmcts.reform.prl.services.AuthorisationService;
import uk.gov.hmcts.reform.prl.services.FeatureToggleService;
import uk.gov.hmcts.reform.prl.services.RequestFurtherInformationService;

import static java.util.Collections.emptyList;
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
import static org.springframework.http.ResponseEntity.ok;
import static uk.gov.hmcts.reform.prl.constants.PrlAppsConstants.INVALID_CLIENT;

@Slf4j
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RequestFurtherInformationController {
private final RequestFurtherInformationService requestFurtherInformationService;
private final AuthorisationService authorisationService;
private final FeatureToggleService featureToggleService;
public static final String CONFIRMATION_HEADER = "confirmationHeader";

@PostMapping(path = "/submit-request-further-information", consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
@Operation(description = "Awaiting On Information callback to update case data and set case status to awaiting information")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Callback processed.",
content = @Content(mediaType = "application/json", schema = @Schema(implementation = AboutToStartOrSubmitCallbackResponse.class))),
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content)})
@SecurityRequirement(name = "Bearer Authentication")
public AboutToStartOrSubmitCallbackResponse submitAwaitingInformation(
@RequestHeader(HttpHeaders.AUTHORIZATION) @Parameter(hidden = true) String authorisation,
@RequestHeader(PrlAppsConstants.SERVICE_AUTHORIZATION_HEADER) String s2sToken,
@RequestBody CallbackRequest callbackRequest
) {
if (authorisationService.isAuthorized(authorisation, s2sToken)
&& featureToggleService.isAwaitingInformationEnabled()) {
var caseDataUpdated = requestFurtherInformationService.addToCase(callbackRequest);
return AboutToStartOrSubmitCallbackResponse.builder().data(caseDataUpdated).build();
}
throw (new RuntimeException(INVALID_CLIENT));
}


@PostMapping(path = "/validate-request-further-information", consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
@Operation(description = "Callback to validate review date")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Child details are fetched"),
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content)})
public CallbackResponse validateReviewDate(@RequestBody CallbackRequest callbackRequest) {
if (!featureToggleService.isAwaitingInformationEnabled()) {
return CallbackResponse.builder()
.errors(emptyList())
.build();
}
CallbackResponse build = CallbackResponse.builder()
.errors(requestFurtherInformationService.validate(callbackRequest))
.build();
return build;
}

@PostMapping(path = "/history-update", consumes = APPLICATION_JSON, produces = APPLICATION_JSON)
@Operation(description = "Callback to update History Tab with Awaiting Information . Returns service request reference if "
+ "successful")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Callback processed.",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = uk.gov.hmcts.reform.ccd.client.model.CallbackResponse.class))),
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content)})
public ResponseEntity<SubmittedCallbackResponse> historyUpdated(
@RequestHeader(HttpHeaders.AUTHORIZATION) @Parameter(hidden = true) String authorisation,
@RequestHeader(PrlAppsConstants.SERVICE_AUTHORIZATION_HEADER) String s2sToken,
@RequestBody CallbackRequest callbackRequest) {
if (authorisationService.isAuthorized(authorisation, s2sToken)
&& featureToggleService.isAwaitingInformationEnabled()) {
requestFurtherInformationService.updateHistoryTab(callbackRequest);
return ok(SubmittedCallbackResponse.builder().build());
}
throw (new RuntimeException(INVALID_CLIENT));
}
}
4 changes: 3 additions & 1 deletion src/main/java/uk/gov/hmcts/reform/prl/enums/CaseEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,9 @@ public enum CaseEvent {
AMEND_OTHER_PEOPLE_IN_THE_CASE_REVISED("amendOtherPeopleInTheCaseRevised"),
APPLICANT_DETAILS("applicantsDetails"),
REVIEW_ADDITIONAL_APPLICATION("reviewAdditionalApplication"),
CLOSE_REVIEW_RA_REQUEST_TASK("closeReviewRARequestTask");
CLOSE_REVIEW_RA_REQUEST_TASK("closeReviewRARequestTask"),
REQUEST_FURTHER_INFORMATION("requestFurtherInformation"),
REQUEST_FURTHER_INFORMATION_HISTORY("requestFurtherInformationHistory");

private final String value;

Expand Down
4 changes: 3 additions & 1 deletion src/main/java/uk/gov/hmcts/reform/prl/enums/State.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@ public enum State {
READY_FOR_DELETION("READY_FOR_DELETION", "Ready for deletion"),
DECISION_OUTCOME("DECISION_OUTCOME","Hearing Outcome"),
PROCEEDS_IN_HERITAGE_SYSTEM("PROCEEDS_IN_HERITAGE_SYSTEM",
"Proceeding in offline mode in familyman system");
"Proceeding in offline mode in familyman system"),
AWAITING_INFORMATION("AWAITING_INFORMATION",
"Awaiting information");

private final String value;
private final String label;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package uk.gov.hmcts.reform.prl.enums.awaitinginformation;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.RequiredArgsConstructor;
import uk.gov.hmcts.reform.prl.enums.CustomEnumSerializer;

@RequiredArgsConstructor
@JsonSerialize(using = CustomEnumSerializer.class)
public enum RequestFurtherInformationReasonEnum {

@JsonProperty("miamFurtherInformation")
miamFurtherInformation("miamFurtherInformation", "MIAM - further information required"),
@JsonProperty("dwpHmrcWhereaboutsUnknown")
dwpHmrcWhereaboutsUnknown("dwpHmrcWhereaboutsUnknown", "DWP/HMRC - whereabouts unknown"),
@JsonProperty("applicantFurtherInformation")
applicantFurtherInformation("applicantFurtherInformation", "Applicant - further information required"),
@JsonProperty("applicantClarifyConfidentialDetails")
applicantClarifyConfidentialDetails("applicantClarifyConfidentialDetails", "Applicant - clarify confidential details"),
@JsonProperty("respondentFurtherInformation")
respondentFurtherInformation("respondentFurtherInformation", "Respondent - further information required"),
@JsonProperty("helpWithFeesFurtherAction")
helpWithFeesFurtherAction("helpWithFeesFurtherAction", "Help with Fees - further action required"),
@JsonProperty("ctscRefundRequired")
ctscRefundRequired("ctscRefundRequired", "CTSC - Refund required"),
@JsonProperty("other")
other("other", "Another reason that has not been listed");

private final String id;
private final String displayedValue;

@JsonValue
public String getDisplayedValue() {
return displayedValue;
}

@JsonCreator
public static RequestFurtherInformationReasonEnum getValue(String key) {
return RequestFurtherInformationReasonEnum.valueOf(key);
}

}
3 changes: 2 additions & 1 deletion src/main/java/uk/gov/hmcts/reform/prl/models/Features.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ public enum Features {

IS_BARRISTER_FEATURE_ENABLED("barristerFeatureEnabled"),
IS_CAFCASS_DATE_TIME_FEATURE_ENABLED("cafcassDateTimeFeatureEnabled"),
IS_OS_COURT_LOOKUP_ENABLED("osCourtLookupEnabled");
IS_OS_COURT_LOOKUP_ENABLED("osCourtLookupEnabled"),
IS_AWAITING_INFORMATION_ENABLED("awaitingInformationEnabled");

private final String name;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package uk.gov.hmcts.reform.prl.models.dto.ccd;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import uk.gov.hmcts.reform.prl.enums.awaitinginformation.RequestFurtherInformationReasonEnum;

import java.time.LocalDate;
import java.util.List;

@Data
@Builder(toBuilder = true)
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class RequestFurtherInformation {
@JsonProperty("reviewByDate")
private LocalDate reviewDate;
@JsonProperty("requestFurtherInformationReasonList")
private List<RequestFurtherInformationReasonEnum> requestFurtherInformationReasonEnum;
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,8 @@ public boolean isCafcassDateTimeFeatureEnabled() {
public boolean isOsCourtLookupFeatureEnabled() {
return isFeatureEnabled(IS_OS_COURT_LOOKUP_ENABLED);
}

public boolean isAwaitingInformationEnabled() {
return isFeatureEnabled(Features.IS_AWAITING_INFORMATION_ENABLED);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ public ResponseEntity<SubmittedCallbackResponse> handleSubmitted() {
public Map<String, Object> setCaseStatus(CallbackRequest callbackRequest, String authorisation) {
Map<String, Object> caseDataUpdated = callbackRequest.getCaseDetails().getData();
CaseData caseData = CaseUtils.getCaseData(callbackRequest.getCaseDetails(), objectMapper);
if (callbackRequest.getCaseDetails().getState().equalsIgnoreCase((State.SUBMITTED_NOT_PAID.getValue()))) {
if (callbackRequest.getCaseDetails().getState().equalsIgnoreCase(State.SUBMITTED_NOT_PAID.getValue())
|| callbackRequest.getCaseDetails().getState().equalsIgnoreCase(State.AWAITING_INFORMATION.getValue())) {
caseDataUpdated.put(CASE_STATUS, CaseStatus.builder()
.state(SUBMITTED_PAID.getLabel())
.build());
Expand Down Expand Up @@ -176,7 +177,10 @@ public Map<String, Object> handleAboutToStart(CaseDetails caseDetails) {
CaseData caseData = CaseUtils.getCaseData(caseDetails, objectMapper);

if (null != caseData) {
if (State.SUBMITTED_NOT_PAID.getValue().equalsIgnoreCase(caseDetails.getState()) && YesOrNo.Yes.equals(caseData.getHelpWithFees())) {
if ((State.SUBMITTED_NOT_PAID.getValue().equalsIgnoreCase(caseDetails.getState())
|| State.AWAITING_INFORMATION.getValue().equalsIgnoreCase(caseDetails.getState()))
&& YesOrNo.Yes.equals(caseData.getHelpWithFees())) {

String dynamicElement = String.format("Child arrangements application C100 - %s",
CommonUtils.formatLocalDateTime(caseData.getCaseSubmittedTimeStamp(),
DATE_TIME_OF_SUBMISSION_FORMAT));
Expand Down Expand Up @@ -236,7 +240,8 @@ public Map<String, Object> populateHwfDynamicData(CaseDetails caseDetails) {
CaseData caseData = CaseUtils.getCaseData(caseDetails, objectMapper);
Map<String, Object> caseDataUpdated = caseDetails.getData();
log.info("case state :" + caseDetails.getState());
if (State.SUBMITTED_NOT_PAID.getValue().equalsIgnoreCase(caseDetails.getState())) {
if (State.SUBMITTED_NOT_PAID.getValue().equalsIgnoreCase(caseDetails.getState())
|| State.AWAITING_INFORMATION.getValue().equalsIgnoreCase(caseDetails.getState())) {
log.info("populate data for C100 application");
caseDataUpdated.put(HWF_APPLICATION_DYNAMIC_DATA_LABEL,
String.format(
Expand Down
Loading