diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateCCProsecutionApi.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateCCProsecutionApi.java index 78b3434e..17088936 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateCCProsecutionApi.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateCCProsecutionApi.java @@ -120,7 +120,7 @@ && isNull(def.getIndividual().getPersonalInformation().getAddress()))) { final InitiateProsecution initiateProsecution = envelope.payload(); final Prosecution ccProsecution = Prosecution.prosecution() - .withCaseDetails(caseDetailsEnrichmentService.enrichCaseDetails(initiateProsecution.getCaseDetails(), initiateProsecution.getCaseDetails().getProsecutor())) + .withCaseDetails(caseDetailsEnrichmentService.enrichCaseDetails(initiateProsecution.getCaseDetails(), initiateProsecution.getCaseDetails().getProsecutor(), channel)) .withChannel(initiateProsecution.getChannel()) .withMigrationSourceSystem(initiateProsecution.getMigrationSourceSystem()) .withListNewHearing(initiateProsecution.getListNewHearing()) diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateGroupProsecutionApi.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateGroupProsecutionApi.java index 2e69bd02..e01b158e 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateGroupProsecutionApi.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateGroupProsecutionApi.java @@ -79,7 +79,7 @@ public void initiateGroupProsecution(final Envelope en .stream() .map(groupProsecution -> { final List defendants = enrichDefendants(envelope, groupProsecution, prosecutionAuthority, offenceReferenceData); - return new GroupProsecution(this.caseDetailsEnrichmentService.enrichCaseDetails(groupProsecution.getCaseDetails(), groupProsecution.getCaseDetails().getProsecutor()), + return new GroupProsecution(this.caseDetailsEnrichmentService.enrichCaseDetails(groupProsecution.getCaseDetails(), groupProsecution.getCaseDetails().getProsecutor(), initiateGroupProsecution.getChannel()), defendants, groupProsecution.getGroupId(), groupProsecution.getIsCivil(), diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateSjpProsecutionApi.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateSjpProsecutionApi.java index 5e39a73a..c0835ded 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateSjpProsecutionApi.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateSjpProsecutionApi.java @@ -76,7 +76,7 @@ public void initiateSjpProsecution(final Envelope envelope) final Prosecution sjpProsecution = prosecution() .withChannel(initiateProsecution.getChannel()) .withDefendants(defendantsWithReferenceData.getDefendants()) - .withCaseDetails(caseDetailsEnrichmentService.enrichCaseDetails(initiateProsecution.getCaseDetails(), prosecutorWithReferenceData)) + .withCaseDetails(caseDetailsEnrichmentService.enrichCaseDetails(initiateProsecution.getCaseDetails(), prosecutorWithReferenceData, initiateProsecution.getChannel())) .withExternalId(initiateProsecution.getExternalId()) .withIsCivil(initiateProsecution.getIsCivil()) .withIsGroupMaster(initiateProsecution.getIsGroupMaster()) diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/CaseDetailsEnrichmentService.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/CaseDetailsEnrichmentService.java index ee4ee817..22d97905 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/CaseDetailsEnrichmentService.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/CaseDetailsEnrichmentService.java @@ -1,6 +1,7 @@ package uk.gov.moj.cpp.prosecution.casefile.command.api.service; import uk.gov.moj.cpp.prosecution.casefile.json.schemas.CaseDetails; +import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Channel; import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Prosecutor; import java.util.Optional; @@ -11,11 +12,11 @@ public class CaseDetailsEnrichmentService { @Inject private IdGenerationService idGenerationService; - public CaseDetails enrichCaseDetails(final CaseDetails caseDetails, Prosecutor prosecutorWithReferenceData) { + public CaseDetails enrichCaseDetails(final CaseDetails caseDetails, final Prosecutor prosecutorWithReferenceData, final Channel channel) { final String prosecutorCaseReference = Optional.ofNullable(caseDetails.getProsecutorCaseReference()) .orElseGet(() -> idGenerationService.generateCaseReference()); final UUID caseId = Optional.ofNullable(caseDetails.getCaseId()) - .orElseGet(() -> idGenerationService.generateCaseId(prosecutorCaseReference)); + .orElseGet(() -> idGenerationService.generateCaseId(prosecutorCaseReference, prosecutorWithReferenceData, channel)); return enrichCaseDetailsWithCaseIdAndProsecutorCaseReference(caseId, prosecutorCaseReference, caseDetails, prosecutorWithReferenceData); } diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/IdGenerationService.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/IdGenerationService.java index 0ca58a19..bdc0c112 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/IdGenerationService.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/main/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/IdGenerationService.java @@ -2,11 +2,14 @@ import static java.lang.String.format; import static java.util.UUID.randomUUID; -import static org.apache.commons.lang3.StringUtils.isNotEmpty; import static org.apache.commons.text.CharacterPredicates.DIGITS; import static org.apache.commons.text.CharacterPredicates.LETTERS; +import static uk.gov.moj.cpp.prosecution.casefile.json.schemas.Channel.MCC; import uk.gov.justice.services.core.dispatcher.SystemUserProvider; +import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Channel; +import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Prosecutor; +import uk.gov.moj.cpp.prosecution.casefile.json.schemas.ProsecutorsReferenceData; import uk.gov.moj.cpp.systemidmapper.client.AdditionResponse; import uk.gov.moj.cpp.systemidmapper.client.ResultCode; import uk.gov.moj.cpp.systemidmapper.client.SystemIdMap; @@ -38,21 +41,35 @@ public class IdGenerationService { @Inject private SystemIdMapperClient systemIdMapperClient; - public UUID generateCaseId(final String caseReference) { + public UUID generateCaseId(final String caseReference, final Prosecutor prosecutorWithReferenceData, final Channel channel) { + final String effectiveKey = buildEffectiveKey(caseReference, prosecutorWithReferenceData, channel); final UUID newCaseId = randomUUID(); - final Optional systemIdMapping = fetchSystemIdMappingFor(caseReference); + final Optional systemIdMapping = fetchSystemIdMappingFor(effectiveKey); if (systemIdMapping.isPresent()) { return systemIdMapping.map(SystemIdMapping::getTargetId).orElseThrow(() -> new IllegalStateException(format("Invalid mapping found against case reference %s", caseReference))); - } else if(addMappingForProsecutorCaseReference(caseReference, newCaseId).isSuccess()) { + } else if (addMappingForProsecutorCaseReference(effectiveKey, newCaseId).isSuccess()) { return newCaseId; } else { throw new IllegalStateException(format("Unable to generate case id for reference %s", caseReference)); } } - private AdditionResponse addMappingForProsecutorCaseReference(final String caseReference, final UUID caseId) { - final SystemIdMap systemIdMap = new SystemIdMap(caseReference, SOURCE_TYPE, caseId, TARGET_TYPE_CPI_MCC); + private String buildEffectiveKey(final String caseReference, final Prosecutor prosecutorWithReferenceData, final Channel channel) { + if (MCC.equals(channel) && prosecutorWithReferenceData != null) { + final ProsecutorsReferenceData refData = prosecutorWithReferenceData.getReferenceData(); + if (refData != null) { + if (Boolean.TRUE.equals(refData.getPoliceFlag())) { + return caseReference; + } + return refData.getOucode() + ":" + caseReference; + } + } + return caseReference; + } + + private AdditionResponse addMappingForProsecutorCaseReference(final String effectiveCaseReference, final UUID caseId) { + final SystemIdMap systemIdMap = new SystemIdMap(effectiveCaseReference, SOURCE_TYPE, caseId, TARGET_TYPE_CPI_MCC); final Optional contextSystemUserId = systemUserProvider.getContextSystemUserId(); if (contextSystemUserId.isPresent()) { @@ -61,9 +78,9 @@ private AdditionResponse addMappingForProsecutorCaseReference(final String caseR return new AdditionResponse(caseId, ResultCode.CONFLICT, Optional.of("Failed to add system id mapping")); } - public Optional fetchSystemIdMappingFor(final String caseReference) { + public Optional fetchSystemIdMappingFor(final String effectiveCaseReference) { return systemIdMapperClient.findBy(systemUserProvider.getContextSystemUserId().orElseThrow(() -> new IllegalStateException(INVALID_CONTEXT_SYSTEM_USER_ID)), - caseReference, TARGET_TYPE_CPI_MCC,TARGET_TYPE_SPI,TARGET_TYPE_SJP); + effectiveCaseReference, TARGET_TYPE_CPI_MCC, TARGET_TYPE_SPI, TARGET_TYPE_SJP); } public String generateCaseReference() { diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateCCProsecutionApiTest.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateCCProsecutionApiTest.java index c8a07463..c543e53d 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateCCProsecutionApiTest.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateCCProsecutionApiTest.java @@ -170,7 +170,7 @@ private void createValidPayloadToAssert(final Channel channel, final boolean isM when(caseDetails.getProsecutor()).thenReturn(prosecutor); when(caseDetails.getPoliceSystemId()).thenReturn(POLICE_SYSTEM_ID); when(prosecutor.getProsecutingAuthority()).thenReturn("OWTW"); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); final ProsecutorsReferenceData prosecutorsReferenceData = new ProsecutorsReferenceData.Builder() .withShortName("OWTW") @@ -295,7 +295,7 @@ void shouldSendReceiveCCProsecutionWithReferenceDataCommandWithLocationSetPayloa when(initiateProsecution.getIsCivil()).thenReturn(isCivil); when(caseDetails.getProsecutor()).thenReturn(prosecutor); when(prosecutor.getProsecutingAuthority()).thenReturn("OWTW"); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); final ProsecutorsReferenceData prosecutorsReferenceData = new ProsecutorsReferenceData.Builder() .withShortName("OWTW") @@ -318,7 +318,7 @@ void shouldSetDefaultOffenceLocationWhenOffenceHasNullLocationAndProsecutingAuth final Offence offence = offence().withOffenceLocation(null).build(); final Defendant defendant = defendant().withOffences(ImmutableList.of(offence)).withAddress(Address.address().build()).build(); final Envelope envelope = envelope(caseProsecution(defendant, DVLA_PROSECUTOR, null, null)); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); final ProsecutorsReferenceData prosecutorsReferenceData = new ProsecutorsReferenceData.Builder() .withShortName("OWTW") @@ -350,7 +350,7 @@ void shouldGetProsecutorByIdWhenOUCodeIsNull() { when(initiateProsecution.getChannel()).thenReturn(Channel.SPI); when(caseDetails.getProsecutor()).thenReturn(prosecutor); when(caseDetails.getPoliceSystemId()).thenReturn(POLICE_SYSTEM_ID); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); when(referenceDataQueryService.retrieveOffenceData(any(), any())).thenReturn(Collections.emptyList()); @@ -373,7 +373,7 @@ void shouldSetOffenceLocationProvidedWhenOffenceHasLocationAndProsecutingAuthori final Offence offence = offence().withOffenceLocation("My Location").build(); final Defendant defendant = defendant().withOffences(ImmutableList.of(offence)).withAddress(Address.address().build()).build(); final Envelope envelope = envelope(caseProsecution(defendant, DVLA_PROSECUTOR, null, null)); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); final ProsecutorsReferenceData prosecutorsReferenceData = new ProsecutorsReferenceData.Builder() .withShortName("OWTW") @@ -393,7 +393,7 @@ void shouldLeaveOffenceLocationAsIsWhenProsecutingAuthorityIsNonDVLA() { final Offence offence = offence().withOffenceLocation("Canada").build(); final Defendant defendant = defendant().withOffences(ImmutableList.of(offence)).withAddress(Address.address().build()).build(); final Envelope envelope = envelope(caseProsecution(defendant, NON_DVLA_PROSECUTOR, null, null)); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); final ProsecutorsReferenceData prosecutorsReferenceData = new ProsecutorsReferenceData.Builder() .withShortName("OWTW") @@ -414,7 +414,7 @@ void shouldLeaveOffenceLocationAsIsWhenProsecutingAuthorityIsUnknown() { final Offence offence = offence().withOffenceLocation("Canada").build(); final Defendant defendant = defendant().withOffences(ImmutableList.of(offence)).withAddress(Address.address().build()).build(); final Envelope envelope = envelope(caseProsecution(defendant, NON_DVLA_PROSECUTOR, null, null)); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); final ProsecutorsReferenceData prosecutorsReferenceData = new ProsecutorsReferenceData.Builder() .withShortName("OWTW") @@ -463,7 +463,7 @@ void shouldPopulatePleaAndVerdict() { .withLibraReferenceNumber(libraReferenceNumber) .build(); final Envelope envelope = envelope(caseProsecution(defendant, NON_DVLA_PROSECUTOR, null, null)); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); final ProsecutorsReferenceData prosecutorsReferenceData = new ProsecutorsReferenceData.Builder() @@ -527,7 +527,7 @@ void shouldCheckConvictingCourtCodeConditionalMandatory() { .build()) .build(); final Envelope envelope = envelope(caseProsecution(defendant, NON_DVLA_PROSECUTOR, migrationSourceSystem, null)); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); final ProsecutorsReferenceData prosecutorsReferenceData = new ProsecutorsReferenceData.Builder() .withShortName("OWTW") diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateGroupProsecutionApiTest.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateGroupProsecutionApiTest.java index a7658297..192bebb1 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateGroupProsecutionApiTest.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateGroupProsecutionApiTest.java @@ -68,7 +68,7 @@ public void shouldSendReceiveGroupProsecutionWithReferenceDataCommandWithCorrect .withInitiationCode("C") .withPoliceSystemId(POLICE_SYSTEM_ID) .build(); - when(this.caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(this.caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); when(this.referenceDataQueryService.retrieveOffenceData(any(), any())).thenReturn(singletonList(OffenceReferenceData.offenceReferenceData() .withLocationRequired("N") .build())); @@ -99,7 +99,7 @@ public void shouldGetProsecutorByIdWhenOUCodeIsNull() throws Exception { .withCaseId(UUID.fromString("51cac7fb-387c-4d19-9c80-8963fa8cf222")) .withPoliceSystemId(POLICE_SYSTEM_ID) .build(); - when(this.caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(caseDetails); + when(this.caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(caseDetails); when(this.referenceDataQueryService.retrieveOffenceData(any(), any())).thenReturn(singletonList(OffenceReferenceData.offenceReferenceData() .withLocationRequired("N") diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateSjpProsecutionApiTest.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateSjpProsecutionApiTest.java index ce153d46..2cdb1892 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateSjpProsecutionApiTest.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/InitiateSjpProsecutionApiTest.java @@ -199,7 +199,7 @@ private void shouldInitiateSjpProsecution(final String inputPayloadPath, final S final List referenceDataCountryNationalities = referenceDataCountryNationalities(); - when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any())).thenReturn(CaseDetails.caseDetails().build()); + when(caseDetailsEnrichmentService.enrichCaseDetails(any(), any(), any())).thenReturn(CaseDetails.caseDetails().build()); when(idGenerator.generateId()).thenReturn(UUID.fromString(UUID_IN_TEST)); initiateSjpProsecutionApi.initiateSjpProsecution(receivedEnvelope); diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/CaseDetailsEnrichmentServiceTest.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/CaseDetailsEnrichmentServiceTest.java index 3d48ee99..e57ad52a 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/CaseDetailsEnrichmentServiceTest.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/CaseDetailsEnrichmentServiceTest.java @@ -3,12 +3,15 @@ import static java.util.UUID.randomUUID; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static uk.gov.moj.cpp.prosecution.casefile.json.schemas.Channel.SPI; import uk.gov.moj.cpp.prosecution.casefile.json.schemas.CaseDetails; +import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Channel; import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Prosecutor; import java.time.LocalDate; @@ -44,7 +47,7 @@ public void shouldReturnOriginalCaseIdAndProsecutorReference() { .build()) .build(); - final CaseDetails response = caseDetailsEnrichmentService.enrichCaseDetails(caseDetails, prosecutor); + final CaseDetails response = caseDetailsEnrichmentService.enrichCaseDetails(caseDetails, prosecutor, SPI); assertThat(originalCaseId, is(response.getCaseId())); assertThat(originalProsecutorCaseReference, is(response.getProsecutorCaseReference())); @@ -62,8 +65,8 @@ public void shouldReturnGeneratedCaseIdAndProsecutorReference() { .build(); when(idGenerationService.generateCaseReference()).thenReturn(generatedProsecutorCaseReference); - when(idGenerationService.generateCaseId(anyString())).thenReturn(generatedCaseId); - final CaseDetails response = caseDetailsEnrichmentService.enrichCaseDetails(caseDetails, prosecutor); + when(idGenerationService.generateCaseId(anyString(), any(), any(Channel.class))).thenReturn(generatedCaseId); + final CaseDetails response = caseDetailsEnrichmentService.enrichCaseDetails(caseDetails, prosecutor, SPI); assertThat(generatedCaseId, is(response.getCaseId())); assertThat(generatedProsecutorCaseReference, is(response.getProsecutorCaseReference())); @@ -85,8 +88,8 @@ public void shouldReturnGeneratedCaseIdAndProsecutorReferenceAndDateOfCommittalA .build(); when(idGenerationService.generateCaseReference()).thenReturn(generatedProsecutorCaseReference); - when(idGenerationService.generateCaseId(anyString())).thenReturn(generatedCaseId); - final CaseDetails response = caseDetailsEnrichmentService.enrichCaseDetails(caseDetails, prosecutor); + when(idGenerationService.generateCaseId(anyString(), any(), any(Channel.class))).thenReturn(generatedCaseId); + final CaseDetails response = caseDetailsEnrichmentService.enrichCaseDetails(caseDetails, prosecutor, SPI); assertThat(generatedCaseId, is(response.getCaseId())); assertThat(generatedProsecutorCaseReference, is(response.getProsecutorCaseReference())); @@ -106,8 +109,8 @@ public void shouldNotInvokeIdGenerationServiceForCaseReferenceAndCaseId() { .build()) .build(); - final CaseDetails response = caseDetailsEnrichmentService.enrichCaseDetails(caseDetails, prosecutor); - verify(idGenerationService, times(0)).generateCaseId(originalProsecutorCaseReference); + final CaseDetails response = caseDetailsEnrichmentService.enrichCaseDetails(caseDetails, prosecutor, SPI); + verify(idGenerationService, times(0)).generateCaseId(anyString(), any(), any(Channel.class)); verify(idGenerationService, times(0)).generateCaseReference(); assertThat(originalCaseId, is(response.getCaseId())); diff --git a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/IdGenerationServiceTest.java b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/IdGenerationServiceTest.java index a07671d8..8b3bb679 100644 --- a/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/IdGenerationServiceTest.java +++ b/prosecutioncasefile-command/prosecutioncasefile-command-api/src/test/java/uk/gov/moj/cpp/prosecution/casefile/command/api/service/IdGenerationServiceTest.java @@ -14,8 +14,13 @@ import static uk.gov.moj.cpp.prosecution.casefile.command.api.service.IdGenerationService.TARGET_TYPE_CPI_MCC; import static uk.gov.moj.cpp.prosecution.casefile.command.api.service.IdGenerationService.TARGET_TYPE_SJP; import static uk.gov.moj.cpp.prosecution.casefile.command.api.service.IdGenerationService.TARGET_TYPE_SPI; +import static uk.gov.moj.cpp.prosecution.casefile.json.schemas.Channel.MCC; +import static uk.gov.moj.cpp.prosecution.casefile.json.schemas.ProsecutorsReferenceData.prosecutorsReferenceData; import uk.gov.justice.services.core.dispatcher.SystemUserProvider; +import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Channel; +import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Prosecutor; +import uk.gov.moj.cpp.prosecution.casefile.json.schemas.ProsecutorsReferenceData; import uk.gov.moj.cpp.systemidmapper.client.AdditionResponse; import uk.gov.moj.cpp.systemidmapper.client.ResultCode; import uk.gov.moj.cpp.systemidmapper.client.SystemIdMap; @@ -47,11 +52,11 @@ public class IdGenerationServiceTest { @InjectMocks private IdGenerationService idGenerationService; - private ArgumentCaptor systemIdMapArgumentCaptor = forClass(SystemIdMap.class); + private ArgumentCaptor systemIdMapArgumentCaptor = forClass(SystemIdMap.class); private static final String URN = "C2AAACD3455"; - private static final String SOURCE_ID = "GAFTL00:C2AAACD3455"; private static final String OU_CODE = "GAFTL00"; + private static final String OU_CODE_PREFIXED_URN = "GAFTL00:C2AAACD3455"; @Test public void shouldGenerateCaseReferenceWithoutOUCode(){ @@ -71,12 +76,12 @@ public void shouldReturnCaseIdWhenMappingExists() { //Given final UUID mappedCaseId = randomUUID(); - final SystemIdMapping systemIdMapping = new SystemIdMapping(randomUUID(), SOURCE_ID, "", mappedCaseId, "", now()); + final SystemIdMapping systemIdMapping = new SystemIdMapping(randomUUID(), URN, "", mappedCaseId, "", now()); when(systemUserProvider.getContextSystemUserId()).thenReturn(Optional.of(USER_ID)); when(systemIdMapperClient.findBy(USER_ID, URN, TARGET_TYPE_CPI_MCC, TARGET_TYPE_SPI, TARGET_TYPE_SJP)).thenReturn(Optional.of(systemIdMapping)); //When - final UUID cppCaseId = idGenerationService.generateCaseId(URN); + final UUID cppCaseId = idGenerationService.generateCaseId(URN, null, Channel.SPI); //Then assertThat(cppCaseId, is(mappedCaseId)); @@ -86,13 +91,113 @@ public void shouldReturnCaseIdWhenMappingExists() { public void shouldReturnCaseIdWhenNoMappingExists() { //Given when(systemUserProvider.getContextSystemUserId()).thenReturn(Optional.of(USER_ID)); - when(systemIdMapperClient.findBy(USER_ID, URN, TARGET_TYPE_CPI_MCC,TARGET_TYPE_SPI,TARGET_TYPE_SJP)).thenReturn(Optional.empty()); + when(systemIdMapperClient.findBy(USER_ID, URN, TARGET_TYPE_CPI_MCC, TARGET_TYPE_SPI, TARGET_TYPE_SJP)).thenReturn(Optional.empty()); when(systemIdMapperClient.add(systemIdMapArgumentCaptor.capture(), any())).thenReturn(new AdditionResponse(randomUUID(), ResultCode.OK, empty())); //When - final UUID caseId = idGenerationService.generateCaseId(URN); + final UUID caseId = idGenerationService.generateCaseId(URN, null, Channel.SPI); //Then assertThat("caseId should match", caseId, Is.is(systemIdMapArgumentCaptor.getValue().getTargetId())); } + + @Test + public void shouldUseCaseReferenceAsKeyForMccChannelWhenProsecutorIsPolice() { + //Given + final Prosecutor prosecutor = prosecutorWithPoliceFlag(true); + when(systemUserProvider.getContextSystemUserId()).thenReturn(Optional.of(USER_ID)); + when(systemIdMapperClient.findBy(USER_ID, URN, TARGET_TYPE_CPI_MCC, TARGET_TYPE_SPI, TARGET_TYPE_SJP)).thenReturn(Optional.empty()); + when(systemIdMapperClient.add(systemIdMapArgumentCaptor.capture(), any())).thenReturn(new AdditionResponse(randomUUID(), ResultCode.OK, empty())); + + //When + idGenerationService.generateCaseId(URN, prosecutor, MCC); + + //Then — police flag true: key must be the plain case reference, not oucode-prefixed + assertThat(systemIdMapArgumentCaptor.getValue().getSourceId(), is(URN)); + } + + @Test + public void shouldUseOucodePrefixedKeyForMccChannelWhenProsecutorIsNonPolice() { + //Given + final Prosecutor prosecutor = prosecutorWithPoliceFlag(false); + when(systemUserProvider.getContextSystemUserId()).thenReturn(Optional.of(USER_ID)); + when(systemIdMapperClient.findBy(USER_ID, OU_CODE_PREFIXED_URN, TARGET_TYPE_CPI_MCC, TARGET_TYPE_SPI, TARGET_TYPE_SJP)).thenReturn(Optional.empty()); + when(systemIdMapperClient.add(systemIdMapArgumentCaptor.capture(), any())).thenReturn(new AdditionResponse(randomUUID(), ResultCode.OK, empty())); + + //When + idGenerationService.generateCaseId(URN, prosecutor, MCC); + + //Then — police flag false: key must be oucode:caseReference + assertThat(systemIdMapArgumentCaptor.getValue().getSourceId(), is(OU_CODE_PREFIXED_URN)); + } + + @Test + public void shouldUseOucodePrefixedKeyForMccChannelWhenPoliceFlagIsNull() { + //Given — null policeFlag treated as non-police + final Prosecutor prosecutor = prosecutorWithPoliceFlag(null); + when(systemUserProvider.getContextSystemUserId()).thenReturn(Optional.of(USER_ID)); + when(systemIdMapperClient.findBy(USER_ID, OU_CODE_PREFIXED_URN, TARGET_TYPE_CPI_MCC, TARGET_TYPE_SPI, TARGET_TYPE_SJP)).thenReturn(Optional.empty()); + when(systemIdMapperClient.add(systemIdMapArgumentCaptor.capture(), any())).thenReturn(new AdditionResponse(randomUUID(), ResultCode.OK, empty())); + + //When + idGenerationService.generateCaseId(URN, prosecutor, MCC); + + //Then + assertThat(systemIdMapArgumentCaptor.getValue().getSourceId(), is(OU_CODE_PREFIXED_URN)); + } + + @Test + public void shouldReturnExistingMappingUsingOucodePrefixedKeyForMccNonPoliceCase() { + //Given + final UUID mappedCaseId = randomUUID(); + final SystemIdMapping systemIdMapping = new SystemIdMapping(randomUUID(), OU_CODE_PREFIXED_URN, "", mappedCaseId, "", now()); + final Prosecutor prosecutor = prosecutorWithPoliceFlag(false); + when(systemUserProvider.getContextSystemUserId()).thenReturn(Optional.of(USER_ID)); + when(systemIdMapperClient.findBy(USER_ID, OU_CODE_PREFIXED_URN, TARGET_TYPE_CPI_MCC, TARGET_TYPE_SPI, TARGET_TYPE_SJP)).thenReturn(Optional.of(systemIdMapping)); + + //When + final UUID caseId = idGenerationService.generateCaseId(URN, prosecutor, MCC); + + //Then + assertThat(caseId, is(mappedCaseId)); + } + + @Test + public void shouldUseCaseReferenceAsKeyForMccChannelWhenProsecutorIsNull() { + //Given + when(systemUserProvider.getContextSystemUserId()).thenReturn(Optional.of(USER_ID)); + when(systemIdMapperClient.findBy(USER_ID, URN, TARGET_TYPE_CPI_MCC, TARGET_TYPE_SPI, TARGET_TYPE_SJP)).thenReturn(Optional.empty()); + when(systemIdMapperClient.add(systemIdMapArgumentCaptor.capture(), any())).thenReturn(new AdditionResponse(randomUUID(), ResultCode.OK, empty())); + + //When + idGenerationService.generateCaseId(URN, null, MCC); + + //Then — null prosecutor: falls back to plain case reference + assertThat(systemIdMapArgumentCaptor.getValue().getSourceId(), is(URN)); + } + + @Test + public void shouldUseCaseReferenceAsKeyForMccChannelWhenReferenceDataIsNull() { + //Given + final Prosecutor prosecutor = Prosecutor.prosecutor().build(); + when(systemUserProvider.getContextSystemUserId()).thenReturn(Optional.of(USER_ID)); + when(systemIdMapperClient.findBy(USER_ID, URN, TARGET_TYPE_CPI_MCC, TARGET_TYPE_SPI, TARGET_TYPE_SJP)).thenReturn(Optional.empty()); + when(systemIdMapperClient.add(systemIdMapArgumentCaptor.capture(), any())).thenReturn(new AdditionResponse(randomUUID(), ResultCode.OK, empty())); + + //When + idGenerationService.generateCaseId(URN, prosecutor, MCC); + + //Then — no reference data: falls back to plain case reference + assertThat(systemIdMapArgumentCaptor.getValue().getSourceId(), is(URN)); + } + + private Prosecutor prosecutorWithPoliceFlag(final Boolean policeFlag) { + final ProsecutorsReferenceData refData = prosecutorsReferenceData() + .withOucode(OU_CODE) + .withPoliceFlag(policeFlag) + .build(); + return Prosecutor.prosecutor() + .withReferenceData(refData) + .build(); + } } diff --git a/prosecutioncasefile-domain/prosecutioncasefile-domain-value-schema/src/main/resources/json/schema/prosecutors-reference-data.json b/prosecutioncasefile-domain/prosecutioncasefile-domain-value-schema/src/main/resources/json/schema/prosecutors-reference-data.json index 0b51a83f..e77ef834 100644 --- a/prosecutioncasefile-domain/prosecutioncasefile-domain-value-schema/src/main/resources/json/schema/prosecutors-reference-data.json +++ b/prosecutioncasefile-domain/prosecutioncasefile-domain-value-schema/src/main/resources/json/schema/prosecutors-reference-data.json @@ -53,6 +53,9 @@ }, "aocpApproved": { "type": "boolean" + }, + "policeFlag": { + "type": "boolean" } }, "required": [