From e350642e6553a5218e013d2cd1a59374f7bab08c Mon Sep 17 00:00:00 2001 From: Herman Wika Horn Date: Fri, 5 Jan 2024 16:04:42 +0100 Subject: [PATCH 1/3] Support both country code 9908 and 0192 in Organisasjonsnummer --- .../representations/Organisasjonsnummer.java | 17 +++++++---- .../OrganisasjonsnummerTest.java | 30 +++++++++++++++---- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java b/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java index b9779c8d..155e81b1 100644 --- a/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java +++ b/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java @@ -16,14 +16,18 @@ public final class Organisasjonsnummer { public static final String ISO6523_ACTORID = PMode.PARTY_ID_TYPE; public static final String ISO6523_ACTORID_OLD = "iso6523-actorid-upis"; - private static final String COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY = "9908"; - private static final Pattern ORGANIZATION_NUMBER_PATTERN = Pattern.compile("^(" + COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY + ":)?([0-9]{9})$"); + static final String COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD = "9908"; + static final String COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_NEW = "0192"; + private static final Pattern ORGANIZATION_NUMBER_PATTERN = Pattern.compile("^((" + COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD + "|" + COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_NEW + "):)?([0-9]{9})$"); private final String organisasjonsnummer; + private final String landkode; private Organisasjonsnummer(MatchResult matchedOrganisasjonsnummer) { int groupOfOrganizationNumber = matchedOrganisasjonsnummer.groupCount(); this.organisasjonsnummer = matchedOrganisasjonsnummer.group(groupOfOrganizationNumber); + this.landkode = Optional.ofNullable(matchedOrganisasjonsnummer.group(groupOfOrganizationNumber - 1)) + .orElse(COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD); } public static boolean erGyldig(String organisasjonsnummer) { @@ -44,7 +48,8 @@ public static Organisasjonsnummer of(String organisasjonsnummer) { throw new IllegalArgumentException( "Ugyldig organisasjonsnummer. Forventet format er ISO 6523, men fikk følgende nummer: '" + organisasjonsnummer + "'. Organisasjonsnummeret skal være 9 siffer og kan prefikses med " + - "landkode 9908. Eksempler på dette er '9908:984661185' og '984661185'."); + "enten landkode 9908 eller 0192. Eksempler på dette er '9908:984661185', '0192:984661185' " + + "og '984661185'."); } } @@ -53,7 +58,7 @@ public String getOrganisasjonsnummer() { } public String getOrganisasjonsnummerMedLandkode() { - return COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY + ":" + organisasjonsnummer; + return landkode + ":" + organisasjonsnummer; } public boolean er(String organisasjonsnummerString) { @@ -77,14 +82,14 @@ public String toString() { public boolean equals(Object obj) { if (obj instanceof Organisasjonsnummer) { Organisasjonsnummer that = (Organisasjonsnummer) obj; - return Objects.equals(this.organisasjonsnummer, that.organisasjonsnummer); + return Objects.equals(this.organisasjonsnummer, that.organisasjonsnummer) && Objects.equals(this.landkode, that.landkode); } return false; } @Override public int hashCode() { - return Objects.hash(organisasjonsnummer); + return Objects.hash(organisasjonsnummer, landkode); } } diff --git a/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java b/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java index 3c7f99e9..38a1fa9f 100644 --- a/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java +++ b/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java @@ -5,6 +5,8 @@ import java.util.Optional; +import static no.digipost.api.representations.Organisasjonsnummer.COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_NEW; +import static no.digipost.api.representations.Organisasjonsnummer.COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -14,13 +16,29 @@ public class OrganisasjonsnummerTest { @Test - public void initializes_organisasjonsnummer() { + public void initializes_organisasjonsnummer_without_prefix() { String nummer = "984661185"; Organisasjonsnummer organisasjonsnummer = Organisasjonsnummer.of(nummer); assertThat(organisasjonsnummer.toString(), is(nummer)); } + @Test + public void initializes_organisasjonsnummer_with_new_prefix() { + String nummer = COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_NEW + ":984661185"; + Organisasjonsnummer organisasjonsnummer = Organisasjonsnummer.of(nummer); + + assertThat(organisasjonsnummer.getOrganisasjonsnummerMedLandkode(), is(nummer)); + } + + @Test + public void initializes_organisasjonsnummer_with_old_prefix() { + String nummer = COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD + ":984661185"; + Organisasjonsnummer organisasjonsnummer = Organisasjonsnummer.of(nummer); + + assertThat(organisasjonsnummer.getOrganisasjonsnummerMedLandkode(), is(nummer)); + } + @Test public void constructor_throws_exception_if_not_valid() { assertThrows(IllegalArgumentException.class, () -> Organisasjonsnummer.of("98466118522222")); @@ -32,8 +50,8 @@ public void invalid_prefix_with_length_4_throws_exception() { } @Test - public void with_landkode_returns_return_organisasjosnummer_with_9908_prefix() { - String expected = "9908:984661185"; + public void with_old_landkode_returns_return_organisasjosnummer_with_9908_prefix() { + String expected = COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD + ":984661185"; Organisasjonsnummer organisasjonsnummer = Organisasjonsnummer.of("984661185"); String actual = organisasjonsnummer.getOrganisasjonsnummerMedLandkode(); @@ -42,8 +60,8 @@ public void with_landkode_returns_return_organisasjosnummer_with_9908_prefix() { } @Test - public void with_landkode_returns_organisasjosnummer_without_9908_prefix() { - String source = "9908:984661185"; + public void with_new_landkode_returns_organisasjosnummer_without_9908_prefix() { + String source = COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_NEW + ":984661185"; String expected = "984661185"; Organisasjonsnummer organisasjonsnummer = Organisasjonsnummer.of(source); @@ -54,7 +72,7 @@ public void with_landkode_returns_organisasjosnummer_without_9908_prefix() { @Test public void without_landkode_returns_organisasjosnummer_with_9908_prefix() { String source = "984661185"; - String expected = "9908:984661185"; + String expected = COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD + ":984661185"; Organisasjonsnummer organisasjonsnummer = Organisasjonsnummer.of(source); From 3aba8794e6afb8858e54cc753de7568a84a03eee Mon Sep 17 00:00:00 2001 From: Herman Wika Horn Date: Fri, 5 Jan 2024 19:33:24 +0100 Subject: [PATCH 2/3] Ensure the Organisasjonsnummer.er(...)-function returns desirable results when using country code The previous implementation, which I somewhat regrettably released as version 4.0.2, is not ideal when comparing an organisation number without country code to an organisation number with country code. The changes made here establish that in such cases, only the organisation numbers should be compared, disregarding country codes. --- .../api/representations/Organisasjonsnummer.java | 11 ++++++----- .../api/representations/OrganisasjonsnummerTest.java | 6 ++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java b/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java index 155e81b1..93845bee 100644 --- a/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java +++ b/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java @@ -20,14 +20,13 @@ public final class Organisasjonsnummer { static final String COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_NEW = "0192"; private static final Pattern ORGANIZATION_NUMBER_PATTERN = Pattern.compile("^((" + COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD + "|" + COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_NEW + "):)?([0-9]{9})$"); private final String organisasjonsnummer; - private final String landkode; + private final Optional landkode; private Organisasjonsnummer(MatchResult matchedOrganisasjonsnummer) { int groupOfOrganizationNumber = matchedOrganisasjonsnummer.groupCount(); this.organisasjonsnummer = matchedOrganisasjonsnummer.group(groupOfOrganizationNumber); - this.landkode = Optional.ofNullable(matchedOrganisasjonsnummer.group(groupOfOrganizationNumber - 1)) - .orElse(COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD); + this.landkode = Optional.ofNullable(matchedOrganisasjonsnummer.group(groupOfOrganizationNumber - 1)); } public static boolean erGyldig(String organisasjonsnummer) { @@ -58,11 +57,13 @@ public String getOrganisasjonsnummer() { } public String getOrganisasjonsnummerMedLandkode() { - return landkode + ":" + organisasjonsnummer; + return landkode.orElse(COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD) + ":" + organisasjonsnummer; } public boolean er(String organisasjonsnummerString) { - return hvisGyldig(organisasjonsnummerString).filter(this::equals).isPresent(); + return hvisGyldig(organisasjonsnummerString) + .filter(orgnr -> orgnr.landkode.isPresent() && this.landkode.isPresent() ? this.equals(orgnr) : this.organisasjonsnummer.equals(orgnr.organisasjonsnummer)) + .isPresent(); } public boolean erEnAv(Organisasjonsnummer... kandidater) { diff --git a/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java b/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java index 38a1fa9f..7d7281af 100644 --- a/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java +++ b/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java @@ -107,6 +107,12 @@ public void evaluates_string_with_or_without_authoroty_part_as_same() { assertTrue(organisasjonsnummer.er(organisasjonsnummer.getOrganisasjonsnummerMedLandkode())); } + @Test + public void without_authority_part_is_Same_as_with_authority_part() { + Organisasjonsnummer organisasjonsnummer = Organisasjonsnummer.of("0192:984661185"); + assertTrue(organisasjonsnummer.er(organisasjonsnummer.getOrganisasjonsnummer())); + } + @Test public void evaluates_other_strings_as_not_same() { Organisasjonsnummer organisasjonsnummer = Organisasjonsnummer.of("984661185"); From a6eff7bd02aeb79b9a6ec6608be323d42e1fed3b Mon Sep 17 00:00:00 2001 From: Herman Wika Horn Date: Tue, 9 Jan 2024 14:11:16 +0100 Subject: [PATCH 3/3] Introduce method to compare only organisation part of Organisasjonsnummer The changes introduced in the two previous commits change the behaviour of the Organisasjonsnummer equals method. Previously, this method could be used to compare only the organisation number string itself between two instances of Organisasjonsnummer. The method introduced in this commit, erSammeOrganisasjonsnummerUavhengigAvLandkode, is intended to replace the described use of the equals method for uses where ignoring country code is desirable. --- .../representations/Organisasjonsnummer.java | 4 ++++ .../OrganisasjonsnummerTest.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java b/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java index 93845bee..5098b95a 100644 --- a/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java +++ b/api-commons/src/main/java/no/digipost/api/representations/Organisasjonsnummer.java @@ -66,6 +66,10 @@ public boolean er(String organisasjonsnummerString) { .isPresent(); } + public boolean erSammeOrganisasjonsnummerUavhengigAvLandkode(Organisasjonsnummer organisasjonsnummer) { + return this.organisasjonsnummer.equals(organisasjonsnummer.organisasjonsnummer); + } + public boolean erEnAv(Organisasjonsnummer... kandidater) { return erEnAv(asList(kandidater)); } diff --git a/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java b/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java index 7d7281af..5fba0744 100644 --- a/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java +++ b/api-commons/src/test/java/no/digipost/api/representations/OrganisasjonsnummerTest.java @@ -120,6 +120,23 @@ public void evaluates_other_strings_as_not_same() { assertFalse(organisasjonsnummer.er("991825827")); } + @Test + public void evaluates_other_organisasjonsnummer_as_same() { + Organisasjonsnummer withoutCountryCode = Organisasjonsnummer.of("984661185"); + Organisasjonsnummer withNewCountryCode = Organisasjonsnummer.of(COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_NEW + ":984661185"); + Organisasjonsnummer withOldCountryCode = Organisasjonsnummer.of(COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY_OLD + ":984661185"); + Organisasjonsnummer notEqual = Organisasjonsnummer.of("123456789"); + assertTrue(withoutCountryCode.erSammeOrganisasjonsnummerUavhengigAvLandkode(withNewCountryCode)); + assertTrue(withoutCountryCode.erSammeOrganisasjonsnummerUavhengigAvLandkode(withOldCountryCode)); + assertTrue(withNewCountryCode.erSammeOrganisasjonsnummerUavhengigAvLandkode(withoutCountryCode)); + assertTrue(withNewCountryCode.erSammeOrganisasjonsnummerUavhengigAvLandkode(withOldCountryCode)); + assertTrue(withOldCountryCode.erSammeOrganisasjonsnummerUavhengigAvLandkode(withoutCountryCode)); + assertTrue(withOldCountryCode.erSammeOrganisasjonsnummerUavhengigAvLandkode(withNewCountryCode)); + assertFalse(notEqual.erSammeOrganisasjonsnummerUavhengigAvLandkode(withoutCountryCode)); + assertFalse(notEqual.erSammeOrganisasjonsnummerUavhengigAvLandkode(withNewCountryCode)); + assertFalse(notEqual.erSammeOrganisasjonsnummerUavhengigAvLandkode(withOldCountryCode)); + } + @Test public void correct_equals_and_hashcode() { EqualsVerifier.forClass(Organisasjonsnummer.class).verify();