From 5eedabfae55a9d76919ff5696408ef0b764a9ad3 Mon Sep 17 00:00:00 2001 From: Jimmy Praet Date: Wed, 8 Oct 2025 11:58:26 +0200 Subject: [PATCH] Add validator for Belgif openapi-employment-identifier EmployerId --- .../validation/AbstractRequestValidator.java | 14 ++++++ .../validation/EmployerIdValidator.java | 47 +++++++++++++++++++ .../validation/EmployerIdValidatorTest.java | 39 +++++++++++++++ .../validation/RequestValidatorTest.java | 18 +++++++ .../problem/api/InputValidationIssues.java | 5 ++ .../belgif/rest/problem/Messages.properties | 1 + .../rest/problem/Messages_de.properties | 1 + .../rest/problem/Messages_fr.properties | 1 + .../rest/problem/Messages_nl.properties | 1 + src/main/asciidoc/release-notes.adoc | 4 ++ 10 files changed, 131 insertions(+) create mode 100644 belgif-rest-problem-validator/src/main/java/io/github/belgif/rest/problem/validation/EmployerIdValidator.java create mode 100644 belgif-rest-problem-validator/src/test/java/io/github/belgif/rest/problem/validation/EmployerIdValidatorTest.java diff --git a/belgif-rest-problem-validator/src/main/java/io/github/belgif/rest/problem/validation/AbstractRequestValidator.java b/belgif-rest-problem-validator/src/main/java/io/github/belgif/rest/problem/validation/AbstractRequestValidator.java index c13f07bb..4db9fb0b 100644 --- a/belgif-rest-problem-validator/src/main/java/io/github/belgif/rest/problem/validation/AbstractRequestValidator.java +++ b/belgif-rest-problem-validator/src/main/java/io/github/belgif/rest/problem/validation/AbstractRequestValidator.java @@ -151,6 +151,20 @@ public SELF establishmentUnitNumber(Input establishmentUnitNumber) { return getThis(); } + /** + * Validate the structure of a Belgif openapi-employment-identifier EmployerId. + * + * @param employerId the employer id + * @return this request validator + * @see openapi-employment-identifier + */ + public SELF employerId(Input employerId) { + if (employerId != null && employerId.getValue() != null) { + addValidator(new EmployerIdValidator(employerId)); + } + return getThis(); + } + /** * Validate the structure of a Belgif openapi-time Period or PeriodOptionalEnd. * diff --git a/belgif-rest-problem-validator/src/main/java/io/github/belgif/rest/problem/validation/EmployerIdValidator.java b/belgif-rest-problem-validator/src/main/java/io/github/belgif/rest/problem/validation/EmployerIdValidator.java new file mode 100644 index 00000000..5636374b --- /dev/null +++ b/belgif-rest-problem-validator/src/main/java/io/github/belgif/rest/problem/validation/EmployerIdValidator.java @@ -0,0 +1,47 @@ +package io.github.belgif.rest.problem.validation; + +import java.util.Optional; + +import io.github.belgif.rest.problem.api.Input; +import io.github.belgif.rest.problem.api.InputValidationIssue; +import io.github.belgif.rest.problem.api.InputValidationIssues; + +/** + * Validates the structure of a Belgif openapi-employment-identifier EmployerId. + * + * @see openapi-employment-identifier + */ +class EmployerIdValidator extends AbstractSingleInputValidator { + + EmployerIdValidator(Input input) { + super(input); + } + + @Override + public Optional validate() { + // Belgif openapi-employment-identifier EmployerId already enforces 197 -> 5999999999 range: + // we only need to validate the checksum here + int checksum = (int) (getValue() % 100); + if (!(checksum == calculateNssoChecksum() || (isInPlaRange() && checksum == calculatePlaChecksum()))) { + return Optional.of(InputValidationIssues.invalidEmployerId(getIn(), getName(), getValue())); + } + return Optional.empty(); + } + + private int calculateNssoChecksum() { + long radix = getValue() / 100; + int checksum = (int) (96 - (radix * 100) % 97L); + return checksum == 0 ? 97 : checksum; + } + + private int calculatePlaChecksum() { + long radix = getValue() / 100; + int checksum = (int) (radix % 97L); + return checksum == 0 ? 97 : checksum; + } + + private boolean isInPlaRange() { + return getValue() >= 197L && getValue() <= 99999926L; + } + +} diff --git a/belgif-rest-problem-validator/src/test/java/io/github/belgif/rest/problem/validation/EmployerIdValidatorTest.java b/belgif-rest-problem-validator/src/test/java/io/github/belgif/rest/problem/validation/EmployerIdValidatorTest.java new file mode 100644 index 00000000..d7c16007 --- /dev/null +++ b/belgif-rest-problem-validator/src/test/java/io/github/belgif/rest/problem/validation/EmployerIdValidatorTest.java @@ -0,0 +1,39 @@ +package io.github.belgif.rest.problem.validation; + +import static io.github.belgif.rest.problem.api.InEnum.*; +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import io.github.belgif.rest.problem.api.Input; +import io.github.belgif.rest.problem.api.InputValidationIssues; + +class EmployerIdValidatorTest { + + @ParameterizedTest + @ValueSource(longs = { 100006L, 212345609L, 312345625L, 200000031L, 499999982L, 187995796L, 168676597L }) + void okNssoNumber(Long employerId) { + assertThat(new EmployerIdValidator(Input.body("test", employerId)).validate()).isEmpty(); + } + + @ParameterizedTest + @ValueSource(longs = { 5134794036L, 5000000120L, 5999999989L, 5678901277L }) + void okProvisionalNssoNumber(Long employerId) { + assertThat(new EmployerIdValidator(Input.body("test", employerId)).validate()).isEmpty(); + } + + @ParameterizedTest + @ValueSource(longs = { 43220065L, 2130057L, 22300094L, 5170096L, 55290097L }) + void okPplNumber(Long employerId) { + assertThat(new EmployerIdValidator(Input.body("test", employerId)).validate()).isEmpty(); + } + + @ParameterizedTest + @ValueSource(longs = { 4000000100L, 6999999999L, 5678901279L, 1000000047L, 5000000121L }) + void nok(Long employerId) { + assertThat(new EmployerIdValidator(Input.body("test", employerId)).validate()) + .contains(InputValidationIssues.invalidEmployerId(BODY, "test", employerId)); + } + +} diff --git a/belgif-rest-problem-validator/src/test/java/io/github/belgif/rest/problem/validation/RequestValidatorTest.java b/belgif-rest-problem-validator/src/test/java/io/github/belgif/rest/problem/validation/RequestValidatorTest.java index 7ef4bb37..2a153cb6 100644 --- a/belgif-rest-problem-validator/src/test/java/io/github/belgif/rest/problem/validation/RequestValidatorTest.java +++ b/belgif-rest-problem-validator/src/test/java/io/github/belgif/rest/problem/validation/RequestValidatorTest.java @@ -82,6 +82,24 @@ void establishmentUnitNumberInvalid() { InputValidationIssues.invalidEstablishmentUnitNumber(BODY, "establishmentUnitNumber", "2111111111")); } + @Test + void employerIdValid() { + assertValid(new RequestValidator().employerId(Input.body("employerId", 312345625L))); + } + + @Test + void employerIdNull() { + assertValid(new RequestValidator().employerId(null)); + assertValid(new RequestValidator().employerId(Input.body("employerId", null))); + } + + @Test + void employerIdInvalid() { + assertInvalid( + new RequestValidator().employerId(Input.body("employerId", 5678901279L)), + InputValidationIssues.invalidEmployerId(BODY, "employerId", 5678901279L)); + } + @Test void periodValid() { InputPeriod period = new InputPeriod(LocalDate.of(2023, 1, 1), LocalDate.of(2023, 12, 31)); diff --git a/belgif-rest-problem/src/main/java/io/github/belgif/rest/problem/api/InputValidationIssues.java b/belgif-rest-problem/src/main/java/io/github/belgif/rest/problem/api/InputValidationIssues.java index 991a578b..7c266b84 100644 --- a/belgif-rest-problem/src/main/java/io/github/belgif/rest/problem/api/InputValidationIssues.java +++ b/belgif-rest-problem/src/main/java/io/github/belgif/rest/problem/api/InputValidationIssues.java @@ -239,6 +239,11 @@ public static InputValidationIssue invalidEstablishmentUnitNumber(InEnum in, Str I18N.getLocalizedString("invalidStructure.establishmentUnitNumber.detail", establishmentUnitNumber)); } + public static InputValidationIssue invalidEmployerId(InEnum in, String name, Long employerId) { + return invalidStructure(in, name, employerId, + I18N.getLocalizedString("invalidStructure.employerId.detail", employerId)); + } + public static InputValidationIssue exactlyOneOfExpected(List> inputs) { InputValidationIssue issue = invalidInputExt(ISSUE_TYPE_EXACTLY_ONE_OF_EXPECTED, "Exactly one of these inputs must be present") diff --git a/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages.properties b/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages.properties index 6550aaa5..e681db80 100644 --- a/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages.properties +++ b/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages.properties @@ -22,6 +22,7 @@ invalidStructure.incompleteDate.detail=Incomplete date %s is invalid invalidStructure.yearMonth.detail=Year month %s is invalid invalidStructure.enterpriseNumber.detail=Enterprise number %s is invalid invalidStructure.establishmentUnitNumber.detail=Establishment unit number %s is invalid +invalidStructure.employerId.detail=Employer ID %s is invalid invalidPeriod.detail=%s should not precede %s exactlyOneOfExpected.detail=Exactly one of these inputs must be present: %s anyOfExpected.detail=Any of these inputs must be present: %s diff --git a/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_de.properties b/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_de.properties index b8bd8e7d..e0921197 100644 --- a/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_de.properties +++ b/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_de.properties @@ -22,6 +22,7 @@ invalidStructure.incompleteDate.detail=Das unvollst invalidStructure.yearMonth.detail=Jahr-Monat %s ist nicht gültig invalidStructure.enterpriseNumber.detail=Die Unternehmensnummer %s ist nicht gültig invalidStructure.establishmentUnitNumber.detail=Die Standortnummer %s ist nicht gültig +invalidStructure.employerId.detail=Die Arbeitgeber ID %s ist nicht gültig invalidPeriod.detail=%s darf nicht vor %s liegen exactlyOneOfExpected.detail=Genau einer dieser Inputs muss vorhanden sein: %s anyOfExpected.detail=Mindestens einer dieser Inputs muss vorhanden sein: %s diff --git a/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_fr.properties b/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_fr.properties index 405b4e44..89fc5ee4 100644 --- a/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_fr.properties +++ b/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_fr.properties @@ -22,6 +22,7 @@ invalidStructure.incompleteDate.detail=La date incompl invalidStructure.yearMonth.detail=L'année et le mois %s sont invalides invalidStructure.enterpriseNumber.detail=Le numéro d'entreprise %s est invalide invalidStructure.establishmentUnitNumber.detail=Le numéro de l'unité d'établissement %s est invalide +invalidStructure.employerId.detail=L'identifiant d'employeur %s est invalide invalidPeriod.detail=%s ne peut pas être antérieur à %s exactlyOneOfExpected.detail=Exactement un de ces inputs doit être présent: %s anyOfExpected.detail=Au moins un de ces inputs doit être présent: %s diff --git a/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_nl.properties b/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_nl.properties index f49fa190..72d6ac2a 100644 --- a/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_nl.properties +++ b/belgif-rest-problem/src/main/resources/io/github/belgif/rest/problem/Messages_nl.properties @@ -22,6 +22,7 @@ invalidStructure.incompleteDate.detail=Onvolledige datum %s is ongeldig invalidStructure.yearMonth.detail=Jaar maand %s is ongeldig invalidStructure.enterpriseNumber.detail=Ondernemingsnummer %s is ongeldig invalidStructure.establishmentUnitNumber.detail=Vestigingseenheidsnummer %s is ongeldig +invalidStructure.employerId.detail=Werkgever ID %s is ongeldig invalidPeriod.detail=%s mag niet voorafgaan aan %s exactlyOneOfExpected.detail=Exact één van deze inputs moet aanwezig zijn: %s anyOfExpected.detail=Ten minste één van deze inputs moet aanwezig zijn: %s diff --git a/src/main/asciidoc/release-notes.adoc b/src/main/asciidoc/release-notes.adoc index 75ddecff..c2478c0e 100644 --- a/src/main/asciidoc/release-notes.adoc +++ b/src/main/asciidoc/release-notes.adoc @@ -18,6 +18,10 @@ * Add Input parameter alternatives in InputValidationIssues for invalidSsin, unknownSsin, canceledSsin and replacedSsin +*belgif-rest-problem-validator:* + +* Add validator for Belgif openapi-employment-identifier https://github.com/belgif/openapi-employment-identifier/blob/main/src/main/openapi/employment/identifier/v1/employment-identifier-v1.yaml[EmployerId] + == Version 0.17 [WARNING]