Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
060c9d5
HDPI-5180: Create basic event to persist a citizen General Application
scottstewart-sl Mar 9, 2026
1b24de7
Merge branch 'master' into HDPI-5180_gen_app_skeleton
scottstewart-sl Mar 9, 2026
b1ea5fd
Merge remote-tracking branch 'origin/master' into HDPI-5180_gen_app_s…
scottstewart-sl Mar 23, 2026
61c00ac
Merge remote-tracking branch 'origin/master' into HDPI-5180_gen_app_s…
scottstewart-sl Mar 24, 2026
a714589
Merge remote-tracking branch 'origin/master' into HDPI-5180_gen_app_s…
scottstewart-sl Mar 25, 2026
be62c02
HDPI-5180: Fix applicable states for citizen gen app event
scottstewart-sl Mar 25, 2026
32ec663
HDPI-5180: Add initial state to gen app
scottstewart-sl Mar 25, 2026
6f6a932
Merge branch 'master' into HDPI-5180_gen_app_skeleton
scottstewart-sl Mar 26, 2026
be34f62
Merge remote-tracking branch 'origin/master' into HDPI-5180_gen_app_s…
scottstewart-sl Mar 26, 2026
acb1e76
Merge branch 'HDPI-5180_gen_app_skeleton' of github.com:hmcts/pcs-api…
scottstewart-sl Mar 26, 2026
94bb818
HDPI-5180: Update DB migration number
scottstewart-sl Mar 26, 2026
707aae8
Merge remote-tracking branch 'origin/master' into HDPI-5180_gen_app_s…
scottstewart-sl Mar 27, 2026
f0b788f
HDPI-5180: Move GenAppType to genapp package
scottstewart-sl Mar 27, 2026
52842c9
Merge branch 'master' into HDPI-5180_gen_app_skeleton
scottstewart-sl Apr 1, 2026
615dece
HDPI-5180: Update DB migration version number
scottstewart-sl Apr 1, 2026
185f605
Merge branch 'master' into HDPI-5180_gen_app_skeleton
scottstewart-sl Apr 2, 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
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.ClaimantAccess;
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.DefendantAccess;
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.GlobalSearchAccess;
import uk.gov.hmcts.reform.pcs.ccd.domain.genapp.CitizenGenAppRequest;
import uk.gov.hmcts.reform.pcs.ccd.domain.enforcetheorder.EnforcementOrder;
import uk.gov.hmcts.reform.pcs.ccd.domain.grounds.AssuredNoArrearsPossessionGrounds;
import uk.gov.hmcts.reform.pcs.ccd.domain.grounds.AssuredRentArrearsPossessionGrounds;
Expand Down Expand Up @@ -500,6 +501,9 @@ public class PCSCase {
@CCD(access = {ClaimantAccess.class, DefendantAccess.class})
private List<ListValue<ClaimGroundSummary>> claimGroundSummaries;

@CCD(access = DefendantAccess.class)
private CitizenGenAppRequest citizenGenAppRequest;

@CCD(
label = "Search Criteria",
access = {GlobalSearchAccess.class}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package uk.gov.hmcts.reform.pcs.ccd.domain.genapp;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CitizenGenAppRequest {

private GenAppType applicationType;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package uk.gov.hmcts.reform.pcs.ccd.domain.genapp;

public enum GenAppState {

PENDING_SUBMISSION,
SUBMITTED

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package uk.gov.hmcts.reform.pcs.ccd.domain.genapp;

public enum GenAppType {

SUSPEND,
ADJOURN,
SET_ASIDE,
SOMETHING_ELSE

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package uk.gov.hmcts.reform.pcs.ccd.entity;

import com.fasterxml.jackson.annotation.JsonBackReference;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import uk.gov.hmcts.reform.pcs.ccd.domain.genapp.GenAppType;
import uk.gov.hmcts.reform.pcs.ccd.domain.genapp.GenAppState;
import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity;

import java.util.UUID;

import static jakarta.persistence.FetchType.EAGER;
import static jakarta.persistence.FetchType.LAZY;

@Entity
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "general_application")
public class GenAppEntity {

@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "case_id")
@JsonBackReference
private PcsCaseEntity pcsCase;

@Enumerated(EnumType.STRING)
private GenAppType type;

@Enumerated(EnumType.STRING)
private GenAppState state;

@ManyToOne(fetch = EAGER)
@JoinColumn(name = "party_id")
@JsonBackReference
private PartyEntity party;

}
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ public class PcsCaseEntity {
@JsonManagedReference
private List<ClaimEntity> claims = new ArrayList<>();

@OneToMany(mappedBy = "pcsCase", fetch = LAZY, cascade = ALL)
@Builder.Default
@JsonManagedReference
private Set<GenAppEntity> genApps = new HashSet<>();

@OneToMany(mappedBy = "pcsCase", fetch = LAZY, cascade = ALL)
@Builder.Default
@JsonManagedReference
Expand Down Expand Up @@ -100,6 +105,11 @@ public void addClaim(ClaimEntity claim) {
claim.setPcsCase(this);
}

public void addGenApp(GenAppEntity genApp) {
genApps.add(genApp);
genApp.setPcsCase(this);
}

public void addParty(PartyEntity party) {
parties.add(party);
party.setPcsCase(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ public enum EventId {
enforceTheOrder,
respondPossessionClaim,
submitDefendantResponse,
citizenCreateGenApp,
createTestCase
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package uk.gov.hmcts.reform.pcs.ccd.event.citizen;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import uk.gov.hmcts.ccd.sdk.api.CCDConfig;
import uk.gov.hmcts.ccd.sdk.api.DecentralisedConfigBuilder;
import uk.gov.hmcts.ccd.sdk.api.EventPayload;
import uk.gov.hmcts.ccd.sdk.api.Permission;
import uk.gov.hmcts.ccd.sdk.api.callback.SubmitResponse;
import uk.gov.hmcts.reform.pcs.ccd.ShowConditions;
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.UserRole;
import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase;
import uk.gov.hmcts.reform.pcs.ccd.domain.State;
import uk.gov.hmcts.reform.pcs.ccd.domain.genapp.CitizenGenAppRequest;
import uk.gov.hmcts.reform.pcs.ccd.domain.genapp.GenAppState;
import uk.gov.hmcts.reform.pcs.ccd.entity.GenAppEntity;
import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity;
import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity;
import uk.gov.hmcts.reform.pcs.ccd.repository.GenAppRepository;
import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService;
import uk.gov.hmcts.reform.pcs.ccd.service.party.PartyService;
import uk.gov.hmcts.reform.pcs.security.SecurityContextService;

import java.util.UUID;

import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.citizenCreateGenApp;

@Slf4j
@Component
@AllArgsConstructor
public class CitizenCreateGenApp implements CCDConfig<PCSCase, State, UserRole> {

private final PcsCaseService pcsCaseService;
private final PartyService partyService;
private final SecurityContextService securityContextService;
private final GenAppRepository genAppRepository;

@Override
public void configureDecentralised(DecentralisedConfigBuilder<PCSCase, State, UserRole> configBuilder) {
configBuilder
.decentralisedEvent(citizenCreateGenApp.name(), this::submit)
.forAllStates() // TODO: Adjust once target states are known and available
.name("Create a General Application")
.showCondition(ShowConditions.NEVER_SHOW)
.grant(Permission.CRUD, UserRole.DEFENDANT)
.showSummary();
}

private SubmitResponse<State> submit(EventPayload<PCSCase, State> eventPayload) {
long caseReference = eventPayload.caseReference();
PCSCase caseData = eventPayload.caseData();

PcsCaseEntity pcsCaseEntity = pcsCaseService.loadCase(caseReference);

UUID currentUserId = securityContextService.getCurrentUserId();
PartyEntity applicantParty = partyService.getPartyEntityByIdamId(currentUserId, caseReference);

CitizenGenAppRequest citizenCreateGenApp = caseData.getCitizenGenAppRequest();

GenAppEntity genAppEntity = GenAppEntity.builder()
.type(citizenCreateGenApp.getApplicationType())
.party(applicantParty)
.state(GenAppState.SUBMITTED)
.build();

genAppRepository.save(genAppEntity);

pcsCaseEntity.addGenApp(genAppEntity);

return SubmitResponse.<State>builder()
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package uk.gov.hmcts.reform.pcs.ccd.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import uk.gov.hmcts.reform.pcs.ccd.entity.GenAppEntity;

import java.util.UUID;

@Repository
public interface GenAppRepository extends JpaRepository<GenAppEntity, UUID> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
CREATE TABLE general_application (
id UUID PRIMARY KEY,
case_id UUID REFERENCES public.pcs_case (id),
type VARCHAR(50),
state VARCHAR(30),
party_id UUID REFERENCES public.party (id)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
package uk.gov.hmcts.reform.pcs.ccd.event.citizen;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import uk.gov.hmcts.reform.pcs.ccd.domain.genapp.GenAppType;
import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase;
import uk.gov.hmcts.reform.pcs.ccd.domain.genapp.CitizenGenAppRequest;
import uk.gov.hmcts.reform.pcs.ccd.domain.genapp.GenAppState;
import uk.gov.hmcts.reform.pcs.ccd.entity.GenAppEntity;
import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity;
import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity;
import uk.gov.hmcts.reform.pcs.ccd.event.BaseEventTest;
import uk.gov.hmcts.reform.pcs.ccd.repository.GenAppRepository;
import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService;
import uk.gov.hmcts.reform.pcs.ccd.service.party.PartyService;
import uk.gov.hmcts.reform.pcs.security.SecurityContextService;

import java.util.UUID;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

@ExtendWith(MockitoExtension.class)
class CitizenCreateGenAppTest extends BaseEventTest {

@Mock
private PcsCaseService pcsCaseService;
@Mock
private PartyService partyService;
@Mock
private SecurityContextService securityContextService;
@Mock
private GenAppRepository genAppRepository;

@BeforeEach
void setUp() {
CitizenCreateGenApp underTest = new CitizenCreateGenApp(pcsCaseService, partyService,
securityContextService, genAppRepository);

setEventUnderTest(underTest);
}

@Nested
@DisplayName("Submit event tests")
class SubmitTests {

@Mock
private PcsCaseEntity pcsCaseEntity;

@BeforeEach
void setUp() {
given(pcsCaseService.loadCase(TEST_CASE_REFERENCE)).willReturn(pcsCaseEntity);
}

@ParameterizedTest
@EnumSource(value = GenAppType.class)
void shouldSetGeneralApplicationType(GenAppType genAppType) {
// Given
CitizenGenAppRequest genAppRequest = CitizenGenAppRequest.builder()
.applicationType(genAppType)
.build();

PCSCase caseData = PCSCase.builder()
.citizenGenAppRequest(genAppRequest)
.build();

// When
callSubmitHandler(caseData);

// Then
ArgumentCaptor<GenAppEntity> genAppEntityCaptor = ArgumentCaptor.forClass(GenAppEntity.class);
verify(genAppRepository).save(genAppEntityCaptor.capture());

assertThat(genAppEntityCaptor.getValue().getType()).isEqualTo(genAppType);
}

@Test
void shouldSetInitialState() {
// Given
CitizenGenAppRequest genAppRequest = CitizenGenAppRequest.builder()
.build();

PCSCase caseData = PCSCase.builder()
.citizenGenAppRequest(genAppRequest)
.build();

// When
callSubmitHandler(caseData);

// Then
ArgumentCaptor<GenAppEntity> genAppEntityCaptor = ArgumentCaptor.forClass(GenAppEntity.class);
verify(genAppRepository).save(genAppEntityCaptor.capture());

assertThat(genAppEntityCaptor.getValue().getState()).isEqualTo(GenAppState.SUBMITTED);
}

@Test
void shouldSetApplicantParty() {
// Given
final PartyEntity applicantParty = mock(PartyEntity.class);

CitizenGenAppRequest genAppRequest = CitizenGenAppRequest.builder()
.applicationType(GenAppType.SUSPEND)
.build();

PCSCase caseData = PCSCase.builder()
.citizenGenAppRequest(genAppRequest)
.build();

UUID currentUserId = UUID.randomUUID();
given(securityContextService.getCurrentUserId()).willReturn(currentUserId);
given(partyService.getPartyEntityByIdamId(currentUserId, TEST_CASE_REFERENCE)).willReturn(applicantParty);

// When
callSubmitHandler(caseData);

// Then
ArgumentCaptor<GenAppEntity> genAppEntityCaptor = ArgumentCaptor.forClass(GenAppEntity.class);
verify(genAppRepository).save(genAppEntityCaptor.capture());

assertThat(genAppEntityCaptor.getValue().getParty()).isEqualTo(applicantParty);
}

@Test
void shouldCreateGenAppAndAddToCaseEntity() {
// Given
PCSCase caseData = PCSCase.builder()
.citizenGenAppRequest(CitizenGenAppRequest.builder().build())
.build();

// When
callSubmitHandler(caseData);

// Then
ArgumentCaptor<GenAppEntity> genAppEntityCaptor = ArgumentCaptor.forClass(GenAppEntity.class);
verify(genAppRepository).save(genAppEntityCaptor.capture());

verify(pcsCaseEntity).addGenApp(same(genAppEntityCaptor.getValue()));
}

}
}
Loading