diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplier.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplier.java new file mode 100644 index 0000000000000000000000000000000000000000..c6f0add9f68709045ae14f8b1aaca13409ecc3ca --- /dev/null +++ b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplier.java @@ -0,0 +1,29 @@ +package de.itvsh.kop.eingang.formcycle; + +import java.time.Instant; +import java.time.LocalDate; + +public class VorgangNummerSupplier { + + static final String BASE30_ALPHABET = "23456789ABCDEFGHJKMNPQRSTVWXYZ"; + static final int SUFFIX_LENGTH = 6; + + public String get() { + var resultBuilder = addPrefix(new StringBuilder()); + long currentTimeSeconds = Instant.now().getEpochSecond(); + for (int i = 0; i < SUFFIX_LENGTH; i++) { + resultBuilder.append(BASE30_ALPHABET.charAt((int) currentTimeSeconds % 30)); + currentTimeSeconds /= 30; + } + return resultBuilder.toString(); + } + + StringBuilder addPrefix(StringBuilder resultBuilder) { + var today = LocalDate.now(); + var lastYearNumber = today.getYear() % 10; + var monthValue = "%02d".formatted(today.getMonthValue()); + var dayValue = "%02d".formatted(today.getDayOfMonth()); + return resultBuilder.append(lastYearNumber).append(monthValue).append(dayValue).append("-"); + } + +} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplierTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplierTest.java new file mode 100644 index 0000000000000000000000000000000000000000..81e9b46af09296449e0b79a6b1a52f5b7c3a94ed --- /dev/null +++ b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/itvsh/kop/eingang/formcycle/VorgangNummerSupplierTest.java @@ -0,0 +1,84 @@ +package de.itvsh.kop.eingang.formcycle; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.time.LocalDate; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Spy; + +class VorgangNummerSupplierTest { + + @Spy + private VorgangNummerSupplier vorgangNummerSupplier = new VorgangNummerSupplier(); + + @Nested + @DisplayName("Get Vorgang Nummer") + class TestGetVorgangNummer { + + @Test + void shouldCallAddPrefix() { + vorgangNummerSupplier.get(); + + verify(vorgangNummerSupplier).addPrefix(any()); + } + + @Test + @DisplayName("should add random suffix of length 6") + void shouldAddSuffix() { + doReturn(new StringBuilder()).when(vorgangNummerSupplier).addPrefix(any()); + + var result = vorgangNummerSupplier.get(); + + assertThat(result).hasSize(6); + } + } + + @Nested + class TestAddPrefix{ + + @Test + void shouldHaveSize(){ + var resultBuilder = vorgangNummerSupplier.addPrefix(new StringBuilder()); + + assertThat(resultBuilder).hasSize(6); + } + @Test + void shouldAddLastYearNumberFirst(){ + var lastYearNumber = "" + LocalDate.now().getYear() % 10; + + var resultBuilder = vorgangNummerSupplier.addPrefix(new StringBuilder()); + + assertThat(resultBuilder.substring(0,1)).isEqualTo(lastYearNumber); + } + + @Test + void shouldAddMonthValueSecond(){ + var monthValue = "%02d".formatted(LocalDate.now().getMonthValue()); + + var resultBuilder = vorgangNummerSupplier.addPrefix(new StringBuilder()); + + assertThat(resultBuilder.substring(1, 3)).isEqualTo(monthValue); + } + + @Test + void shouldAddDayValueThird(){ + var dayValue = "%02d".formatted(LocalDate.now().getDayOfMonth()); + + var resultBuilder = vorgangNummerSupplier.addPrefix(new StringBuilder()); + + assertThat(resultBuilder.substring(3, 5)).isEqualTo(dayValue); + } + + @Test + void shouldAddHyphenAtEnd(){ + var resultBuilder = vorgangNummerSupplier.addPrefix(new StringBuilder()); + + assertThat(resultBuilder.charAt(5)).isEqualTo('-'); + } + } + +} \ No newline at end of file