From 602741a688238066f517182de015f2c11ca817d1 Mon Sep 17 00:00:00 2001 From: "rajkumar.meena" Date: Fri, 10 Jul 2026 15:25:54 +0100 Subject: [PATCH] CAD-1464 fix --- .../judicialresult/JudicialResultHelper.java | 8 +- .../JudicialResultHelperTest.java | 93 +++++++ .../test/resources/ddq-result-definition.json | 232 ++++++++++++++++++ 3 files changed, 331 insertions(+), 2 deletions(-) create mode 100644 sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelperTest.java create mode 100644 sjp-event/sjp-event-processor/src/test/resources/ddq-result-definition.json diff --git a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelper.java b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelper.java index 6adcdc292..2d144399f 100644 --- a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelper.java +++ b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelper.java @@ -65,6 +65,7 @@ public class JudicialResultHelper { "I", "INTERMEDIARY"); public static final String Y = "Y"; + public static final String DURATION = "duration"; private JudicialResultHelper() { @@ -93,8 +94,11 @@ public static JudicialResultPrompt.Builder populatePromptDefinitionAttributesBas resultDefinition.getJsonArray("prompts") .getValuesAs(JsonObject.class) .stream() - .filter(prompt -> prompt.getString("id").equals(jsPrompt.getId().toString()) - && duration.equals(prompt.getString("duration"))) + .filter(prompt -> prompt.getString("id").equals(jsPrompt.getId().toString())) + .filter(prompt -> prompt.containsKey(DURATION)) + .filter(prompt -> duration.equals(prompt.getString(DURATION)) + ||duration.toUpperCase().contains(prompt.getString(DURATION).toUpperCase()) + || prompt.getString(DURATION).toUpperCase().contains(duration.toUpperCase())) .findFirst(); return populatePrompt(jsPrompt, promptJson); diff --git a/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelperTest.java b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelperTest.java new file mode 100644 index 000000000..4a109c5da --- /dev/null +++ b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/results/converter/judicialresult/JudicialResultHelperTest.java @@ -0,0 +1,93 @@ +package uk.gov.moj.cpp.sjp.event.processor.results.converter.judicialresult; + +import static java.util.UUID.fromString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static uk.gov.moj.cpp.sjp.event.processor.results.converter.judicialresult.JPrompt.DDP_DISQUALIFICATION_PERIOD; +import static uk.gov.moj.cpp.sjp.event.processor.utils.FileUtil.getFileContentAsJson; + +import uk.gov.justice.core.courts.JudicialResultPrompt; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.UUID; + +import javax.json.JsonObject; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class JudicialResultHelperTest { + + private static final String RESULT_DEFINITION_FILE = "ddq-result-definition.json"; + private static final UUID DISQUALIFICATION_PERIOD_PROMPT_ID = fromString("2bf54447-328c-4c1b-a123-341adbd52172"); + + private JsonObject resultDefinition; + + @BeforeEach + public void setUp() { + resultDefinition = getFileContentAsJson(RESULT_DEFINITION_FILE, new HashMap<>()); + } + + @Test + public void shouldPopulatePromptDefinitionAttributesForYearsDuration() { + final JudicialResultPrompt.Builder builder = JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "Year(s)"); + + final JudicialResultPrompt prompt = builder.build(); + + assertThat(prompt.getJudicialResultPromptTypeId(), is(DISQUALIFICATION_PERIOD_PROMPT_ID)); + assertThat(prompt.getLabel(), is("Disqualification period")); + assertThat(prompt.getWelshLabel(), is("Cyfnod gwahardd")); + assertThat(prompt.getPromptReference(), is("disqualificationPeriod")); + assertThat(prompt.getType(), is("INTM")); + assertThat(prompt.getCourtExtract(), is("Y")); + assertThat(prompt.getDurationSequence(), is(1)); + assertThat(prompt.getPromptSequence(), is(new BigDecimal(100))); + assertThat(prompt.getIsFinancialImposition(), is(false)); + } + + @Test + public void shouldPopulatePromptDefinitionAttributesForMonthsDuration() { + final JudicialResultPrompt.Builder builder = JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "MONTH"); + + final JudicialResultPrompt prompt = builder.build(); + + assertThat(prompt.getJudicialResultPromptTypeId(), is(DISQUALIFICATION_PERIOD_PROMPT_ID)); + assertThat(prompt.getLabel(), is("Disqualification period")); + assertThat(prompt.getWelshLabel(), is("Cyfnod gwahardd")); + assertThat(prompt.getPromptReference(), is("disqualificationPeriod")); + assertThat(prompt.getType(), is("INTM")); + assertThat(prompt.getCourtExtract(), is("Y")); + assertThat(prompt.getDurationSequence(), is(1)); + assertThat(prompt.getPromptSequence(), is(new BigDecimal(100))); + assertThat(prompt.getIsFinancialImposition(), is(false)); + } + + @Test + public void shouldPopulatePromptDefinitionAttributesForDaysDuration() { + final JudicialResultPrompt.Builder builder = JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + DDP_DISQUALIFICATION_PERIOD, resultDefinition, "Day(s)"); + + final JudicialResultPrompt prompt = builder.build(); + + assertThat(prompt.getJudicialResultPromptTypeId(), is(DISQUALIFICATION_PERIOD_PROMPT_ID)); + assertThat(prompt.getLabel(), is("Disqualification period")); + assertThat(prompt.getWelshLabel(), is("Cyfnod gwahardd")); + assertThat(prompt.getPromptReference(), is("disqualificationPeriod")); + assertThat(prompt.getType(), is("INTM")); + assertThat(prompt.getCourtExtract(), is("Y")); + assertThat(prompt.getDurationSequence(), is(1)); + assertThat(prompt.getPromptSequence(), is(new BigDecimal(100))); + assertThat(prompt.getIsFinancialImposition(), is(false)); + } + + @Test + public void shouldThrowRuntimeExceptionWhenPromptNotFoundForDuration() { + assertThrows(RuntimeException.class, () -> + JudicialResultHelper.populatePromptDefinitionAttributesBasedOnDuration( + JPrompt.AMOUNT_OF_FINE, resultDefinition, "Year(s)")); + } +} diff --git a/sjp-event/sjp-event-processor/src/test/resources/ddq-result-definition.json b/sjp-event/sjp-event-processor/src/test/resources/ddq-result-definition.json new file mode 100644 index 000000000..ca234bfcd --- /dev/null +++ b/sjp-event/sjp-event-processor/src/test/resources/ddq-result-definition.json @@ -0,0 +1,232 @@ +{ + "id": "73fe22ca-76bd-4aba-bdea-6dfef8ee03a2", + "version": "2026-07-06T15:43:41.279Z", + "startDate": "2026-07-07", + "label": "Points disqualification", + "shortCode": "DDP", + "level": "O", + "rank": 94000, + "wordGroups": [ + { + "wordGroup": [ + "DDP" + ] + }, + { + "wordGroup": [ + "disqualification", + "points" + ] + } + ], + "prompts": [ + { + "id": "2bf54447-328c-4c1b-a123-341adbd52172", + "label": "Disqualification period", + "welshLabel": "Cyfnod gwahardd", + "resultPromptRule": "mandatory", + "type": "INTM", + "sequence": 100, + "duration": "Year(s)", + "financial": "N", + "reference": "disqualificationPeriod", + "userGroups": [], + "min": "1", + "max": "999", + "durationSequence": 1, + "welshDuration": "Flynedd", + "courtExtract": "Y", + "jurisdiction": "B", + "hidden": false, + "nameEmail": false, + "associatedWithReferenceData": false + }, + { + "id": "2bf54447-328c-4c1b-a123-341adbd52172", + "label": "Disqualification period", + "welshLabel": "Cyfnod gwahardd", + "resultPromptRule": "mandatory", + "type": "INTM", + "sequence": 100, + "duration": "Month(s)", + "financial": "N", + "reference": "disqualificationPeriod", + "userGroups": [], + "min": "1", + "max": "999", + "durationSequence": 1, + "welshDuration": "Mis", + "courtExtract": "Y", + "jurisdiction": "B", + "hidden": false, + "nameEmail": false, + "associatedWithReferenceData": false + }, + { + "id": "2bf54447-328c-4c1b-a123-341adbd52172", + "label": "Disqualification period", + "welshLabel": "Cyfnod gwahardd", + "resultPromptRule": "mandatory", + "type": "INTM", + "sequence": 100, + "duration": "Day(s)", + "financial": "N", + "reference": "disqualificationPeriod", + "userGroups": [], + "min": "1", + "max": "999", + "durationSequence": 1, + "welshDuration": "Niwrnod", + "courtExtract": "Y", + "jurisdiction": "B", + "hidden": false, + "nameEmail": false, + "associatedWithReferenceData": false + }, + { + "id": "2bf54447-328c-4c1b-a123-341adbd52172", + "label": "Disqualification period", + "welshLabel": "Cyfnod gwahardd", + "resultPromptRule": "mandatory", + "type": "INTM", + "sequence": 100, + "financial": "N", + "reference": "disqualificationPeriod", + "wordGroup": [ + "months", + "Years" + ], + "userGroups": [], + "min": "1", + "max": "999", + "durationSequence": 1, + "courtExtract": "Y", + "jurisdiction": "B", + "hidden": false, + "nameEmail": false, + "associatedWithReferenceData": false + }, + { + "id": "0143f821-7cab-4e53-a00b-2fd1c3dc8204", + "label": "Extension period section 35B (effect of custodial sentence noted)", + "welshLabel": "Cyfnod estyniad adran 35B (effaith dedfryd o garchar wedi’i nodi)", + "resultPromptRule": "optional", + "type": "TXT", + "sequence": 400, + "financial": "N", + "reference": "extensionPeriodSection35BEffectOfCustodialSentenceNoted", + "userGroups": [], + "min": "1", + "max": "100", + "courtExtract": "Y", + "jurisdiction": "B", + "hidden": false, + "nameEmail": false, + "associatedWithReferenceData": false + }, + { + "id": "462d5ba8-7a1c-44a0-a732-6c75601bd6af", + "label": "Notional penalty points", + "welshLabel": "Pwyntiau cosb tybiedig", + "resultPromptRule": "mandatory", + "type": "INT", + "sequence": 500, + "financial": "N", + "reference": "notionalPenaltyPoints", + "userGroups": [], + "min": "1", + "max": "999", + "courtExtract": "Y", + "jurisdiction": "B", + "hidden": false, + "nameEmail": false, + "associatedWithReferenceData": false + }, + { + "id": "a593ae4a-9d69-45b9-9585-c11aeed28404", + "label": "Defendant driving licence number", + "welshLabel": "Rhif trwydded yrru'r Diffynnydd", + "resultPromptRule": "optional", + "type": "TXT", + "sequence": 600, + "financial": "N", + "reference": "defendantDrivingLicenceNumber", + "userGroups": [ + "CPS", + "Defence", + "Judiciary", + "NCES", + "Prosecuting Authorities", + "Probation", + "YOTs" + ], + "min": "1", + "max": "16", + "courtExtract": "N", + "jurisdiction": "B", + "hidden": false, + "nameEmail": false, + "cacheable": 2, + "cacheDataPath": "personDefendant.driverNumber", + "associatedWithReferenceData": false + }, + { + "id": "81638260-3cd1-41e7-9725-c8e91e23bda1", + "label": "Extension period section 35A (immediate custodial sentence)", + "welshLabel": "Cyfnod estyniad adran 35A (dedfryd o garchar ar unwaith)", + "resultPromptRule": "optional", + "type": "TXT", + "sequence": 300, + "financial": "N", + "reference": "extensionPeriodSection35AImmediateCustodialSentence", + "userGroups": [], + "min": "1", + "max": "100", + "courtExtract": "Y", + "jurisdiction": "B", + "hidden": false, + "nameEmail": false, + "associatedWithReferenceData": false + } + ], + "financial": "N", + "unscheduled": false, + "adjournment": "N", + "category": "A", + "urgent": true, + "convicted": "Y", + "d20": true, + "cjsCode": "3072", + "postHearingCustodyStatus": "A", + "terminatesOffenceProceedings": false, + "lifeDuration": false, + "rollUpPrompts": true, + "publishedForNows": false, + "publishedAsAPrompt": false, + "excludedFromResults": false, + "alwaysPublished": false, + "jurisdiction": "B", + "libraCode": "DDP", + "resultWording": "Disqualified for holding or obtaining a driving licence. Disqualification obligatory due to repeat offending. Driving record endorsed. Section 35(1) Road Traffic Offenders Act 1988", + "welshResultWording": "Gwahardd rhag dal neu gael trwydded yrru. Gwaharddiad yn orfodol oherwydd aildroseddu. Cofnod gyrru wedi’i ardystio. Adran 35 (1) Deddf Troseddwyr Traffig Ffyrdd 1988", + "resultDefinitionRules": [ + { + "childResultDefinitionId": "429fb553-4fb3-45eb-a700-7e5e69d1ca29", + "ruleType": "mandatory" + }, + { + "childResultDefinitionId": "ea1ee5a4-be13-48dc-8411-78f22e01c236", + "ruleType": "optional" + } + ], + "canBeSubjectOfBreach": false, + "canBeSubjectOfVariation": true, + "pointsDisqualificationCode": "TT99", + "resultTextTemplate": "Disqualified for holding or obtaining a driving licence for {disqualificationPeriod}.[ %INTD%] Disqualification obligatory due to repeat offending. Driving record endorsed.[ ({notionalPenaltyPoints} penalty points determined).] Section 35(1) Road Traffic Offenders Act 1988.[ This includes an extension period of {extensionPeriodSection35AImmediateCustodialSentence} in accordance with section 35A (immediate custodial sentence).][ This includes an extension period of {extensionPeriodSection35BEffectOfCustodialSentenceNoted} in accordance with section 35B (effect of custodial sentence noted).]", + "sentToCC": false, + "committedToCC": false, + "isDeemedServed": false, + "unpaidWorkExtensionCommunityOrdYro": false, + "isAvailableForCourtExtract": true, + "isBooleanResult": false +} \ No newline at end of file