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 b9779c8..5098b95 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,17 @@ 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 Optional landkode; private Organisasjonsnummer(MatchResult matchedOrganisasjonsnummer) { int groupOfOrganizationNumber = matchedOrganisasjonsnummer.groupCount(); this.organisasjonsnummer = matchedOrganisasjonsnummer.group(groupOfOrganizationNumber); + this.landkode = Optional.ofNullable(matchedOrganisasjonsnummer.group(groupOfOrganizationNumber - 1)); } public static boolean erGyldig(String organisasjonsnummer) { @@ -44,7 +47,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,11 +57,17 @@ public String getOrganisasjonsnummer() { } public String getOrganisasjonsnummerMedLandkode() { - return COUNTRY_CODE_ORGANIZATION_NUMBER_NORWAY + ":" + 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 erSammeOrganisasjonsnummerUavhengigAvLandkode(Organisasjonsnummer organisasjonsnummer) { + return this.organisasjonsnummer.equals(organisasjonsnummer.organisasjonsnummer); } public boolean erEnAv(Organisasjonsnummer... kandidater) { @@ -77,14 +87,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 3c7f99e..5fba074 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); @@ -89,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"); @@ -96,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();