diff --git a/.gitignore b/.gitignore index 4af56c94..ff8d42ba 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ applicationinsights-agent-*.jar *.log .env +.env-test AGENTS.md scripts/ diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/fact/functional/controllers/CourtProfessionalInformationControllerFunctionalTest.java b/src/functionalTest/java/uk/gov/hmcts/reform/fact/functional/controllers/CourtProfessionalInformationControllerFunctionalTest.java index 84eca715..a164c683 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/fact/functional/controllers/CourtProfessionalInformationControllerFunctionalTest.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/fact/functional/controllers/CourtProfessionalInformationControllerFunctionalTest.java @@ -64,18 +64,22 @@ void shouldCreateProfessionalInformationWithAllValidFields() throws Exception { final CourtDxCodeDto dxCode1 = new CourtDxCodeDto(); dxCode1.setDxCode("120551 Marylebone 9"); dxCode1.setExplanation("(County Court) primary"); + dxCode1.setExplanationCy("(FamilyCourt) primary"); final CourtDxCodeDto dxCode2 = new CourtDxCodeDto(); dxCode2.setDxCode("703360 Hanley 3"); dxCode2.setExplanation("(Crown Court) secondary"); + dxCode2.setExplanationCy("(FamilyCourt) secondary"); final CourtFaxDto fax1 = new CourtFaxDto(); fax1.setFaxNumber("0207 222 3333"); fax1.setDescription("General enquiries"); + fax1.setDescriptionCy("Ymholiadau cyffredinol"); final CourtFaxDto fax2 = new CourtFaxDto(); fax2.setFaxNumber("0207 444 5555"); fax2.setDescription("Urgent matters"); + fax2.setDescriptionCy("Ymholiadau cyffredinol"); final CourtProfessionalInformationDetailsDto professionalInfoDetails = new CourtProfessionalInformationDetailsDto(); @@ -204,6 +208,7 @@ void shouldUpdateExistingProfessionalInformation() throws Exception { final CourtDxCodeDto updatedDxCode = new CourtDxCodeDto(); updatedDxCode.setDxCode("999999 Updated 1"); updatedDxCode.setExplanation("Updated explanation"); + updatedDxCode.setExplanationCy("Updated Welsh explanation"); final CourtProfessionalInformationDetailsDto updatedDetails = new CourtProfessionalInformationDetailsDto(); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/fact/data/api/controllers/CourtProfessionalInformationControllerTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/fact/data/api/controllers/CourtProfessionalInformationControllerTest.java index 434075a0..9db1c519 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/fact/data/api/controllers/CourtProfessionalInformationControllerTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/fact/data/api/controllers/CourtProfessionalInformationControllerTest.java @@ -64,11 +64,13 @@ private CourtProfessionalInformationDetailsDto sampleProfessionalInformationDeta CourtDxCodeDto dxCode = CourtDxCodeDto.builder() .dxCode("444") .explanation("Main DX") + .explanationCy("Prif DX") .build(); CourtFaxDto fax = CourtFaxDto.builder() .faxNumber("01234567890") .description("Primary fax") + .descriptionCy("Prif ffacs") .build(); return CourtProfessionalInformationDetailsDto.builder() @@ -90,11 +92,13 @@ private CourtProfessionalInformationDetailsDto wrapProfessionalInformation( CourtDxCodeDto dxCode = CourtDxCodeDto.builder() .dxCode("444") .explanation("Main DX") + .explanationCy("Prif DX") .build(); CourtFaxDto fax = CourtFaxDto.builder() .faxNumber("01234567890") .description("Primary fax") + .descriptionCy("Prif ffacs") .build(); return buildDetails(professionalInformation, codes, List.of(dxCode), List.of(fax)); @@ -291,10 +295,12 @@ void postProfessionalInformationInvalidDxCodeCharactersReturnsBadRequest() throw List.of(CourtDxCodeDto.builder() .dxCode("120551 Marylebone 9$") .explanation("Valid explanation") + .explanationCy("Esboniad dilys") .build()), List.of(CourtFaxDto.builder() .faxNumber("0207 111 1111") .description("Fax") + .descriptionCy("Ffacs") .build()) ); @@ -322,10 +328,12 @@ void postProfessionalInformationInvalidDxCodeTooLongReturnsBadRequest() throws E List.of(CourtDxCodeDto.builder() .dxCode(longCode) .explanation("Valid explanation") + .explanationCy("Esboniad dilys") .build()), List.of(CourtFaxDto.builder() .faxNumber("0207 111 1111") .description("Fax") + .descriptionCy("Ffacs") .build()) ); @@ -353,10 +361,12 @@ void postProfessionalInformationInvalidDxExplanationTooLongReturnsBadRequest() t List.of(CourtDxCodeDto.builder() .dxCode("120551 Marylebone 9") .explanation(longExplanation) + .explanationCy("Esboniad hir") .build()), List.of(CourtFaxDto.builder() .faxNumber("0207 111 1111") .description("Fax") + .descriptionCy("Ffacs") .build()) ); @@ -386,10 +396,12 @@ void postProfessionalInformationInvalidGbsReturnsBadRequest() throws Exception { List.of(CourtDxCodeDto.builder() .dxCode("120551 Marylebone 9") .explanation("Valid explanation") + .explanationCy("Esboniad dilys") .build()), List.of(CourtFaxDto.builder() .faxNumber("0207 111 1111") .description("Fax") + .descriptionCy("Ffacs") .build()) ); @@ -416,10 +428,12 @@ void postProfessionalInformationInvalidFaxDescriptionReturnsBadRequest() throws List.of(CourtDxCodeDto.builder() .dxCode("120551 Marylebone 9") .explanation("Valid explanation") + .explanationCy("Esboniad dilys") .build()), List.of(CourtFaxDto.builder() .faxNumber("0207 111 1111") .description("Invalid 😊") + .descriptionCy("Ffacs") .build()) ); @@ -446,10 +460,12 @@ void postProfessionalInformationInvalidFaxNumberReturnsBadRequest() throws Excep List.of(CourtDxCodeDto.builder() .dxCode("120551 Marylebone 9") .explanation("Valid explanation") + .explanationCy("Esboniad dilys") .build()), List.of(CourtFaxDto.builder() .faxNumber("012") .description("Fax") + .descriptionCy("Ffacs") .build()) ); @@ -477,6 +493,7 @@ void postProfessionalInformationNullDxEntryReturnsBadRequest() throws Exception List.of(CourtFaxDto.builder() .faxNumber("0207 111 1111") .description("Fax") + .descriptionCy("Ffacs") .build()) ); @@ -503,6 +520,7 @@ void postProfessionalInformationNullFaxEntryReturnsBadRequest() throws Exception List.of(CourtDxCodeDto.builder() .dxCode("120551 Marylebone 9") .explanation("Valid explanation") + .explanationCy("Esboniad dilys") .build()), Arrays.asList((CourtFaxDto) null) ); @@ -514,6 +532,130 @@ void postProfessionalInformationNullFaxEntryReturnsBadRequest() throws Exception .andExpect(jsonPath("$['faxNumbers[0]']").value("must not be null")); } + @Test + @DisplayName("POST /courts/{courtId}/v1/professional-information returns 400 when DX explanationCy is missing") + void postProfessionalInformationMissingDxExplanationCyReturnsBadRequest() throws Exception { + CourtProfessionalInformationDetailsDto invalid = buildDetails( + ProfessionalInformationDto.builder() + .interviewRooms(true) + .interviewRoomCount(2) + .interviewPhoneNumber("0207 123 4567") + .videoHearings(true) + .commonPlatform(false) + .accessScheme(true) + .build(), + CourtCodesDto.builder().gbs("123").build(), + List.of(CourtDxCodeDto.builder() + .dxCode("120551 Marylebone 9") + .explanation("Valid explanation") + .build()), + List.of(CourtFaxDto.builder() + .faxNumber("0207 111 1111") + .description("Fax") + .descriptionCy("Ffacs") + .build()) + ); + + mockMvc.perform(post("/courts/{courtId}/v1/professional-information", courtId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(invalid))) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$['dxCodes[0].explanationCyPresentWhenExplanationProvided']").exists()); + } + + @Test + @DisplayName("POST /courts/{courtId}/v1/professional-information returns 400 when fax descriptionCy is missing") + void postProfessionalInformationMissingFaxDescriptionCyReturnsBadRequest() throws Exception { + CourtProfessionalInformationDetailsDto invalid = buildDetails( + ProfessionalInformationDto.builder() + .interviewRooms(true) + .interviewRoomCount(2) + .interviewPhoneNumber("0207 123 4567") + .videoHearings(true) + .commonPlatform(false) + .accessScheme(true) + .build(), + CourtCodesDto.builder().gbs("123").build(), + List.of(CourtDxCodeDto.builder() + .dxCode("120551 Marylebone 9") + .explanation("Valid explanation") + .explanationCy("Esboniad dilys") + .build()), + List.of(CourtFaxDto.builder() + .faxNumber("0207 111 1111") + .description("Fax") + .build()) + ); + + mockMvc.perform(post("/courts/{courtId}/v1/professional-information", courtId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(invalid))) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$['faxNumbers[0].descriptionCyPresentWhenDescriptionProvided']").exists()); + } + + @Test + @DisplayName("POST /courts/{courtId}/v1/professional-information returns 400 when DX explanation is missing") + void postProfessionalInformationMissingDxExplanationReturnsBadRequest() throws Exception { + CourtProfessionalInformationDetailsDto invalid = buildDetails( + ProfessionalInformationDto.builder() + .interviewRooms(true) + .interviewRoomCount(2) + .interviewPhoneNumber("0207 123 4567") + .videoHearings(true) + .commonPlatform(false) + .accessScheme(true) + .build(), + CourtCodesDto.builder().gbs("123").build(), + List.of(CourtDxCodeDto.builder() + .dxCode("120551 Marylebone 9") + .explanationCy("Esboniad dilys") + .build()), + List.of(CourtFaxDto.builder() + .faxNumber("0207 111 1111") + .description("Fax") + .descriptionCy("Ffacs") + .build()) + ); + + mockMvc.perform(post("/courts/{courtId}/v1/professional-information", courtId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(invalid))) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$['dxCodes[0].explanationCyPresentWhenExplanationProvided']").exists()); + } + + @Test + @DisplayName("POST /courts/{courtId}/v1/professional-information returns 400 when fax description is missing") + void postProfessionalInformationMissingFaxDescriptionReturnsBadRequest() throws Exception { + CourtProfessionalInformationDetailsDto invalid = buildDetails( + ProfessionalInformationDto.builder() + .interviewRooms(true) + .interviewRoomCount(2) + .interviewPhoneNumber("0207 123 4567") + .videoHearings(true) + .commonPlatform(false) + .accessScheme(true) + .build(), + CourtCodesDto.builder().gbs("123").build(), + List.of(CourtDxCodeDto.builder() + .dxCode("120551 Marylebone 9") + .explanation("Valid explanation") + .explanationCy("Esboniad dilys") + .build()), + List.of(CourtFaxDto.builder() + .faxNumber("0207 111 1111") + .descriptionCy("Ffacs") + .build()) + ); + + mockMvc.perform(post("/courts/{courtId}/v1/professional-information", courtId) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(invalid))) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$['faxNumbers[0].descriptionCyPresentWhenDescriptionProvided']").exists()); + } + @Test @DisplayName("POST /courts/{courtId}/v1/professional-information returns 400 for invalid UUID") void postProfessionalInformationInvalidUuid() throws Exception { diff --git a/src/main/java/uk/gov/hmcts/reform/fact/data/api/dto/CourtDxCodeDto.java b/src/main/java/uk/gov/hmcts/reform/fact/data/api/dto/CourtDxCodeDto.java index cdbc3c4b..86e9c70a 100644 --- a/src/main/java/uk/gov/hmcts/reform/fact/data/api/dto/CourtDxCodeDto.java +++ b/src/main/java/uk/gov/hmcts/reform/fact/data/api/dto/CourtDxCodeDto.java @@ -1,6 +1,7 @@ package uk.gov.hmcts.reform.fact.data.api.dto; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; @@ -9,6 +10,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; import uk.gov.hmcts.reform.fact.data.api.entities.CourtDxCode; import uk.gov.hmcts.reform.fact.data.api.entities.validation.ValidationConstants; @@ -31,10 +33,22 @@ public class CourtDxCodeDto { message = ValidationConstants.GENERIC_DESCRIPTION_REGEX_MESSAGE) private String explanation; + @Schema(description = "Welsh language explanation of the DX code") + @Size(max = 250, message = "DX Welsh explanation must be {max} characters or fewer") + @Pattern(regexp = ValidationConstants.GENERIC_DESCRIPTION_REGEX, + message = ValidationConstants.GENERIC_DESCRIPTION_REGEX_MESSAGE) + private String explanationCy; + + @AssertTrue(message = "DX explanation and Welsh explanation must be provided together") + public boolean isExplanationCyPresentWhenExplanationProvided() { + return StringUtils.isBlank(explanation) == StringUtils.isBlank(explanationCy); + } + public static CourtDxCodeDto fromEntity(CourtDxCode entity) { return CourtDxCodeDto.builder() .dxCode(entity.getDxCode()) .explanation(entity.getExplanation()) + .explanationCy(entity.getExplanationCy()) .build(); } } diff --git a/src/main/java/uk/gov/hmcts/reform/fact/data/api/dto/CourtFaxDto.java b/src/main/java/uk/gov/hmcts/reform/fact/data/api/dto/CourtFaxDto.java index b95c0b19..fe980b6c 100644 --- a/src/main/java/uk/gov/hmcts/reform/fact/data/api/dto/CourtFaxDto.java +++ b/src/main/java/uk/gov/hmcts/reform/fact/data/api/dto/CourtFaxDto.java @@ -1,6 +1,7 @@ package uk.gov.hmcts.reform.fact.data.api.dto; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; import jakarta.validation.constraints.Size; @@ -9,6 +10,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; import uk.gov.hmcts.reform.fact.data.api.entities.CourtFax; import uk.gov.hmcts.reform.fact.data.api.entities.validation.ValidationConstants; @@ -30,10 +32,22 @@ public class CourtFaxDto { message = ValidationConstants.GENERIC_DESCRIPTION_REGEX_MESSAGE) private String description; + @Schema(description = "Welsh language fax description") + @Size(max = 250, message = "Welsh fax description must be {max} characters or fewer") + @Pattern(regexp = ValidationConstants.GENERIC_DESCRIPTION_REGEX, + message = ValidationConstants.GENERIC_DESCRIPTION_REGEX_MESSAGE) + private String descriptionCy; + + @AssertTrue(message = "Fax description and Welsh fax description must be provided together") + public boolean isDescriptionCyPresentWhenDescriptionProvided() { + return StringUtils.isBlank(description) == StringUtils.isBlank(descriptionCy); + } + public static CourtFaxDto fromEntity(CourtFax entity) { return CourtFaxDto.builder() .faxNumber(entity.getFaxNumber()) .description(entity.getDescription()) + .descriptionCy(entity.getDescriptionCy()) .build(); } } diff --git a/src/main/java/uk/gov/hmcts/reform/fact/data/api/entities/CourtDxCode.java b/src/main/java/uk/gov/hmcts/reform/fact/data/api/entities/CourtDxCode.java index b45b8ca7..19bfa99d 100644 --- a/src/main/java/uk/gov/hmcts/reform/fact/data/api/entities/CourtDxCode.java +++ b/src/main/java/uk/gov/hmcts/reform/fact/data/api/entities/CourtDxCode.java @@ -72,4 +72,11 @@ public class CourtDxCode implements AuditableCourtEntity { @Column(length = 250) private String explanation; + @Schema(description = "The Welsh language explanation") + @Size(max = 250) + @Pattern(regexp = ValidationConstants.GENERIC_DESCRIPTION_REGEX, + message = ValidationConstants.GENERIC_DESCRIPTION_REGEX_MESSAGE) + @Column(name = "explanation_cy", length = 250) + private String explanationCy; + } diff --git a/src/main/java/uk/gov/hmcts/reform/fact/data/api/entities/CourtFax.java b/src/main/java/uk/gov/hmcts/reform/fact/data/api/entities/CourtFax.java index 5e90b197..2018cf73 100644 --- a/src/main/java/uk/gov/hmcts/reform/fact/data/api/entities/CourtFax.java +++ b/src/main/java/uk/gov/hmcts/reform/fact/data/api/entities/CourtFax.java @@ -70,4 +70,11 @@ public class CourtFax implements AuditableCourtEntity { @Column(name = "description", length = 250) private String description; + @Schema(description = "Welsh language description") + @Size(max = 250, message = "Welsh fax description must be {max} characters or fewer") + @Pattern(regexp = ValidationConstants.GENERIC_DESCRIPTION_REGEX, + message = ValidationConstants.GENERIC_DESCRIPTION_REGEX_MESSAGE) + @Column(name = "description_cy", length = 250) + private String descriptionCy; + } diff --git a/src/main/java/uk/gov/hmcts/reform/fact/data/api/services/CourtProfessionalInformationService.java b/src/main/java/uk/gov/hmcts/reform/fact/data/api/services/CourtProfessionalInformationService.java index 2288dc8a..70d5e72f 100644 --- a/src/main/java/uk/gov/hmcts/reform/fact/data/api/services/CourtProfessionalInformationService.java +++ b/src/main/java/uk/gov/hmcts/reform/fact/data/api/services/CourtProfessionalInformationService.java @@ -217,6 +217,7 @@ private List replaceCourtDxCodes(UUID courtId, Court court, List replaceCourtFaxNumbers(UUID courtId, Court court, List createDxCodes(final Random random) { if (random.nextBoolean()) { CourtDxCodeDto code = CourtDxCodeDto.builder() .dxCode(rndAlphaNumeric(6, random)) - .explanation(COURT_TYPES.stream().findAny().map(CourtType::getName).orElse("General") + " DX code") .build(); dxCodes.add(code); } @@ -790,7 +791,6 @@ private List createFaxNumbers(final Random random) { faxNumbers.add( CourtFaxDto.builder() .faxNumber(rndPhoneNumber(random)) - .description(i == 0 ? "Fax number" : "Urgent documents fax number") .build() ); } diff --git a/src/main/resources/db/migration/V1.40__update_contact_description_type_and_misc_name_cy.sql b/src/main/resources/db/migration/V1.40__update_contact_description_type_and_misc_name_cy.sql new file mode 100644 index 00000000..6d252547 --- /dev/null +++ b/src/main/resources/db/migration/V1.40__update_contact_description_type_and_misc_name_cy.sql @@ -0,0 +1,192 @@ +UPDATE contact_description_types cdt +SET name_cy = v.name_cy +FROM ( + VALUES + ('Accessibility enquiries', 'Ymholiadau hygyrchedd'), + ('Administration', 'Gweinyddiaeth'), + ('Administrative Court appointments', 'Llys Gweinyddol - apwyntiadau'), + ('Administrative Court enquiries', 'Llys Gweinyddol - ymholiadau'), + ('Administrative Court lists', 'Llys Gweinyddol - rhestrau'), + ('Admiralty Court appointments', 'Llys y Morlys - apwyntiadau'), + ('Admiralty Court enquiries', 'Llys y Morlys - ymholiadau'), + ('Admiralty Court lists', 'Llys y Morlys - rhestrau'), + ('Adoption', 'Mabwysiadu'), + ('Appointments', 'Apwyntiadau'), + ('Asylum Support Tribunal enquiries', 'Tribiwnlys Cefnogi Ceiswyr Lloches - ymholiadau'), + ('Bail applications', 'Ceisiadau am fechniaeth'), + ('Bailiff enquiries', 'Ymholiadau beiliaid'), + ('Building facilities', 'Cyfleusterau yn yr adeilad'), + ('Business and Property Court appointments', 'Y Llys Busnes ac Eiddo - apwyntiadau'), + ('Business and Property Court enquiries', 'Y Llys Busnes ac Eiddo - ymholiadau'), + ('Business and Property Court lists', 'Y Llys Busnes ac Eiddo - rhestrau'), + ('Case progression', 'Cyflymu Achosion'), + ('Central London county court enquiries', 'Llys Sirol Canol Llundain - ymholiadau'), + ('Centralised Attachment of Earnings (CAPS)', 'System Ganolog Taliadau Atafaelu Enillion (CAPS)'), + ('Chancery division appointments', 'Yr Adran Siawnsri - apwyntiadau'), + ('Chancery division court lists', 'Yr Adran Siawnsri - rhestrau llys'), + ('Chancery division enquiries', 'Yr Adran Siawnsri - ymholiadau'), + ('Chancery division issues', 'Yr Adran Siawnsri - materion'), + ('Chancery Masters appointments', 'Meistri''r Siawnsri - apwyntiadau'), + ('Child arrangements', 'Trefniadau plant'), + ('Child maintenance', 'Cynhaliaeth plant'), + ('Children in care', 'Plant mewn gofal'), + ('Circuit Commercial Court appointments', 'Cylchdaith y Llys Masnach - apwyntiadau'), + ('Circuit Commercial Court enquiries', 'Cylchdaith y Llys Masnach - ymholiadau'), + ('Circuit Commercial Court lists', 'Cylchdaith y Llys Masnach - rhestrau'), + ('Circuit Court appointments', 'Llys Cylchdaith - apwyntiadau'), + ('Circuit Court enquiries', 'Llys Cylchdaith - ymholiadau'), + ('Circuit Court lists', 'Llys Cylchdaith - rhestrau'), + ('Citizens Advice Witness Service', 'Gwasanaeth Tystion Cyngor Ar Bopeth'), + ('Civil appointments', 'Llys Sifil - apwyntiadau'), + ('Civil court lists', 'Llys Sifil - rhestrau'), + ('Civil enquiries', 'Llys Sifil - ymholiadau'), + ('Commercial Court appointments', 'Y Llys Masnach - apwyntiadau'), + ('Commercial Court enquiries', 'Y Llys Masnach - ymholiadau'), + ('Commercial Court lists', 'Y Llys Masnach - rhestrau'), + ('Companies winding up', 'Dirwyn Cwmniau i Ben'), + ('Confiscation enquiries', 'Ymholiadau atafaelu'), + ('County court appointments', 'Llys Sirol - apwyntiadau'), + ('County court enquiries', 'Llys Sirol - ymholiadau'), + ('County court lists', 'Llys Sirol - rhestrau'), + ('Court clerks', 'Clercod y llys'), + ('Court lists', 'Rhestrau''r Llys'), + ('Court of Appeal Civil Division', 'Llys Apel - Adran Sifil'), + ('Court of Appeal Criminal Division', 'Llys Apel - Adran Droseddol'), + ('Court of Protection', 'Y Llys Gwarchod'), + ('Criminal Injuries Compensation Tribunal enquiries', 'Tribiwnlys Iawndal am Anafiadau Troseddol - ymholiadau'), + ('Crown Court appointments', 'Llys y Goron - apwyntiadau'), + ('Crown Court lists', 'Llys y Goron - rhestrau'), + ('Debt respite scheme enquiries', 'Cynllun seibiant o ddyledion - ymholiadau'), + ('District court appointments', 'Llys Dosbarth - apwyntiadau'), + ('District court enquiries', 'Llys Dosbarth - ymholiadau'), + ('District court lists', 'Llys Dosbarth - rhestrau'), + ('Divorce enquiries', 'Ymholiadau am ysgaru'), + ('Domestic violence remedy orders', 'Gorchmynion rhwymedi cam-drin domestig'), + ('Employment Tribunal enquiries', 'Tribiwnlys Cyflogaeth - ymholiadau'), + ('Enforcement enquiries', 'Gorfodi - ymholiadau'), + ('Enforcement fine enquiries', 'Gorfodi dirwyon - ymholiadau'), + ('Family court appointments', 'Llys Teulu - apwyntiadau'), + ('Family court lists', 'Llys teulu - rhestrau'), + ('Family private law', 'Cyfraith breifat - teulu'), + ('Family public law', 'Cyfraith gyhoeddus - teulu'), + ('Fee enquiries', 'Ymholiadau am ffioedd'), + ('Female genital mutilation protection orders', 'Gorchmynion Amddiffyn rhag Anffurfio Organau Cenhedlu Benywod (FGM)'), + ('Finances', 'Cyllid'), + ('Financial remedy during divorce', 'Rhwymedi ariannol yn ystod ysgariad'), + ('Fine enquiries', 'Ymholiadau dirwyon'), + ('Fixed penalties', 'Cosbau penodedig'), + ('Forced marriage protection orders', 'Gorchmynion Amddiffyn rhag Priodas dan Orfod'), + ('High Court appeals', 'Yr Uchel Lys - apeliadau'), + ('High Court appointments', 'Yr Uchel Lys - apwyntiadau'), + ('High Court enquiries', 'Yr Uchel Lys - ymholiadau'), + ('High Court lists', 'Yr Uchel Lys - rhestrau'), + ('Immigration and Asylum appeals enquiries', 'Apeliadau Mewnfudo a Lloches - ymholiadau'), + ('Immigration and Asylum Tribunal appointments', 'Tribiwnlys Mewnfudo a Lloches - apwyntiadau'), + ('Immigration and Asylum Tribunal court lists', 'Tribiwnlys Mewnfudo a Lloches - rhestrau'), + ('Enquiries', 'Ymholiadau'), + ('Immigration and Asylum Tribunal enquiries', 'Tribiwnlys Mewnfudo a Lloches - ymholiadau'), + ('Insolvency and Companies Court appointments', 'Llys Ansolfedd a Chwmniau - apwyntiadau'), + ('Insolvency and Companies Court enquiries', 'Llys Ansolfedd a Chwmniau - ymholiadau'), + ('Insolvency and Companies Court issues', 'Llys Ansolfedd a Chwmniau - materion'), + ('Insolvency and Companies Court lists', 'Llys Ansolfedd a Chwmniau - rhestrau'), + ('Issues', 'Materion'), + ('King''s Bench Division appointments', 'Adran Mainc y Brenin - apwyntiadau'), + ('King''s Bench Division court lists', 'Adran Mainc y Brenin - rhestrau'), + ('King''s Bench Division enquiries', 'Adran Mainc y Brenin - ymholiadau'), + ('Legal aid', 'Cymorth cyfreithiol'), + ('London Circuit Commercial Court appointments', 'Y Llys Masnach - Cylchdaith Llundain - apwyntiadau'), + ('London Circuit Commercial Court enquiries', 'Y Llys Masnach - Cylchdaith Llundain - ymholiadau'), + ('London Circuit Commercial Court lists', 'Y Llys Masnach - Cylchdaith Llundain - rhestrau'), + ('Magistrates'' court appointments', 'Llys Ynadon - apwyntiadau'), + ('Magistrates'' court enquiries', 'Llys Ynadon - ymholiadau'), + ('Magistrates'' court lists', 'Llys Ynadon - rhestrau'), + ('Mediation appointments', 'Apwyntiadau cyfryngu'), + ('Mediation enquiries', 'Ymholiadau cyfryngu'), + ('Online civil money claims enquiries', 'Hawliadau am arian sifil ar-lein (OCMC)'), + ('Orders and accounts', 'Gorchmynion a chyfrifon'), + ('Pay a fine', 'Talu dirwy'), + ('Payments', 'Taliadau'), + ('Planning Court', 'Y Llys Cynllunio'), + ('Possession', 'Meddiannu'), + ('Post court enquiries', 'Ymholiadau ar ôl llys'), + ('Pre and post court enquiries', 'Ymholiadau cyn ac ar ôl llys'), + ('Pre court enquiries', 'Ymholiadau cyn llys'), + ('Probate enquiries', 'Ymholiadau profiant'), + ('Registrar', 'Cofrestrydd'), + ('Registry enquiries', 'Ymholiadau cofrestrfa'), + ('Security', 'Diogelwch'), + ('Senior courts costs office', 'Swyddfa costau''r uwch lysoedd'), + ('Single Justice Procedures enquiries', 'Ymholiadau Gweithdrefn Un Ynad'), + ('Social Security and Child Support benefit appeals enquiries', 'Ymholiadau apeliadau Nawdd Cymdeithasol a Chynnal Plant (SSCS)'), + ('Social Security and Child Support Tribunal enquiries', 'Ymholiadau''r Tribiwnlys Nawdd Cymdeithasol a Chynnal Plant (SSCS)'), + ('Support Through Court', 'Support Through Court (STC)'), + ('Switchboard', 'Switsfwrdd'), + ('Technology and Construction Court appointments', 'Llys Technoleg ac Adeiladwaith - apwyntiadaui'), + ('Technology and Construction Court enquiries', 'Llys Technoleg ac Adeiladwaith - ymholiadau'), + ('Technology and Construction Court issues', 'Llys Technoleg ac Adeiladwaith - materion'), + ('Technology and Construction Court lists', 'Llys Technoleg ac Adeiladwaith - rhestrau'), + ('Textphone', 'Ffôn Testun'), + ('Welsh language helpline', 'Llinell Gymorth Gymraeg'), + ('Crown Court enquiries', 'Ymholiadau Llys y Goron'), + ('Family court enquiries', 'Ymholiadau Llys Teulu'), + ('Jury service', 'Gwasanaeth rheithgor'), + ('Pay a fee', 'Talu ffi'), + ('Transcripts', 'Trawsgrifiadau') +) AS v(name, name_cy) +WHERE cdt.name = v.name; + +ALTER TABLE court_types + ADD COLUMN IF NOT EXISTS name_cy VARCHAR; + +UPDATE court_types ct +SET name_cy = v.name_cy + FROM ( + VALUES + ('Magistrates'' Court', 'Llys Ynadon'), + ('Family Court', 'Llys Teulu'), + ('Tribunal', 'Tribiwnlys'), + ('County Court', 'Llys Sirol'), + ('Crown Court', 'Llys y Goron') +) AS v(name, name_cy) +WHERE ct.name = v.name; + +UPDATE area_of_law_types aolt +SET name_cy = v.name_cy + FROM ( + VALUES + ('Divorce', 'Ysgariad'), + ('Civil partnership', 'Partneriaeth sifil'), + ('High Court District Registry', 'Cofrestrfa Ddosbarth yr Uchel Lys'), + ('Adoption', 'Mabwysiadu'), + ('Social security', 'Nawdd Cymdeithasol'), + ('Housing possession', 'Meddiannu eiddo'), + ('Money claims', 'Hawliadau am arian'), + ('Employment', 'Cyflogaeth'), + ('Tax', 'Treth'), + ('Children', 'Plant'), + ('Domestic violence', 'Trais domestig'), + ('Crime', 'Trosedd'), + ('Civil', 'Sifil'), + ('Single justice procedure', 'Y Weithdrefn Un Ynad'), + ('High Court', 'Yr Uchel Lys'), + ('Court Of Appeal', 'Y Llys Apêl'), + ('Financial Remedy', 'Rhwymedi Ariannol'), + ('Business and Property', 'Busnes ac Eiddo'), + ('Bankruptcy', 'Methdaliad'), + ('Immigration', 'Mewnfudo'), + ('Probate', 'Profiant'), + ('Forced marriage', 'Priodas dan orfod'), + ('FGM', 'Anffurfio Organau Cenhedlu Benywod (FGM)'), + ('Pathfinder – for Private Law Proceedings', 'Cynllun Braenaru – ar gyfer Achosion Cyfraith Breifat'), + ('Domestic Abuse Protection Order (DAPOs)', 'Gorchymyn Diogelu Rhag Cam-drin Domestig (DAPOs)'), + ('Benefits', 'Budd-daliadau') +) AS v(name, name_cy) +WHERE aolt.name = v.name; + +ALTER TABLE court_dxcodes + ADD COLUMN IF NOT EXISTS explanation_cy VARCHAR(250); + +ALTER TABLE court_fax + ADD COLUMN IF NOT EXISTS description_cy VARCHAR(250); + + diff --git a/src/test/java/uk/gov/hmcts/reform/fact/data/api/services/CourtProfessionalInformationServiceTest.java b/src/test/java/uk/gov/hmcts/reform/fact/data/api/services/CourtProfessionalInformationServiceTest.java index fb0bdda9..13352078 100644 --- a/src/test/java/uk/gov/hmcts/reform/fact/data/api/services/CourtProfessionalInformationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/fact/data/api/services/CourtProfessionalInformationServiceTest.java @@ -112,12 +112,14 @@ void setup() { .courtId(courtId) .dxCode("789") .explanation("DX explanation") + .explanationCy("Esboniad DX") .build()); courtFaxes = List.of(CourtFax.builder() .courtId(courtId) .faxNumber("01234567890") .description("Fax description") + .descriptionCy("Disgrifiad ffacs") .build()); professionalInformationDto = ProfessionalInformationDto.builder() @@ -141,11 +143,13 @@ void setup() { courtDxCodeDtos = List.of(CourtDxCodeDto.builder() .dxCode(courtDxCodes.get(0).getDxCode()) .explanation(courtDxCodes.get(0).getExplanation()) + .explanationCy(courtDxCodes.get(0).getExplanationCy()) .build()); courtFaxDtos = List.of(CourtFaxDto.builder() .faxNumber(courtFaxes.get(0).getFaxNumber()) .description(courtFaxes.get(0).getDescription()) + .descriptionCy(courtFaxes.get(0).getDescriptionCy()) .build()); requestDetails = CourtProfessionalInformationDetailsDto.builder() @@ -285,10 +289,12 @@ void setProfessionalInformationTrimsAndNormalisesValues() { .dxCodes(List.of(CourtDxCodeDto.builder() .dxCode(" 120551 Marylebone 9 ") .explanation(" Main DX entry ") + .explanationCy(" Esboniad DX ") .build())) .faxNumbers(List.of(CourtFaxDto.builder() .faxNumber("0207 000 0000") .description(" Fax description ") + .descriptionCy(" Disgrifiad ffacs ") .build())) .build(); @@ -304,14 +310,20 @@ void setProfessionalInformationTrimsAndNormalisesValues() { assertThat(courtDxCodesCaptor.getValue()).hasSize(1); assertThat(courtDxCodesCaptor.getValue().get(0).getDxCode()).isEqualTo("120551 Marylebone 9"); assertThat(courtDxCodesCaptor.getValue().get(0).getExplanation()).isEqualTo("Main DX entry"); + assertThat(courtDxCodesCaptor.getValue().get(0).getExplanationCy()).isEqualTo("Esboniad DX"); assertThat(courtFaxCaptor.getValue()).hasSize(1); assertThat(courtFaxCaptor.getValue().get(0).getDescription()).isEqualTo("Fax description"); + assertThat(courtFaxCaptor.getValue().get(0).getDescriptionCy()).isEqualTo("Disgrifiad ffacs"); assertThat(result.getCodes().getGbs()).isEqualTo("GBS001"); assertThat(result.getDxCodes()).extracting(CourtDxCodeDto::getDxCode) .containsExactly("120551 Marylebone 9"); + assertThat(result.getDxCodes()).extracting(CourtDxCodeDto::getExplanationCy) + .containsExactly("Esboniad DX"); assertThat(result.getFaxNumbers()).extracting(CourtFaxDto::getDescription) .containsExactly("Fax description"); + assertThat(result.getFaxNumbers()).extracting(CourtFaxDto::getDescriptionCy) + .containsExactly("Disgrifiad ffacs"); } @Test