From b77e55e47fecc8df4c03cac28cf9954fe389aacc Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Mon, 10 Mar 2025 10:56:17 +0100
Subject: [PATCH 1/6] OZG-7572 OZG-7901 add forwarded links to root resource

---
 .../de/ozgcloud/alfa/RootViewLinkHandler.java |  2 +-
 .../de/ozgcloud/alfa/LinkTestFactory.java     | 19 ++++
 .../alfa/RootViewLinkHandlerTest.java         | 87 ++++++++++++-------
 3 files changed, 75 insertions(+), 33 deletions(-)
 create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/LinkTestFactory.java

diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java
index a8af53edb7..6a832f1fd2 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java
@@ -72,7 +72,7 @@ class RootViewLinkHandler {
 	private final SystemStatusService systemStatusService;
 
 	private final List<VorgangStatus> statusList = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
-			VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN);
+			VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET);
 
 	public void addViewLinks(EntityModel<Root> model, Optional<UserId> userId) {
 		model.add(buildGetAllVorgaengeLink());
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/LinkTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/LinkTestFactory.java
new file mode 100644
index 0000000000..011dd9db09
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/LinkTestFactory.java
@@ -0,0 +1,19 @@
+package de.ozgcloud.alfa;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+import org.springframework.hateoas.Link;
+
+import com.thedeanda.lorem.LoremIpsum;
+
+public class LinkTestFactory {
+
+	public static Link create() {
+		return Link.of(LoremIpsum.getInstance().getUrl());
+	}
+
+	public static List<Link> createList(int size) {
+		return Stream.iterate(0, i -> i + 1).limit(size).map(i -> create()).toList();
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
index 6f0e2b6558..0b8fd47ccb 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
@@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.List;
 import java.util.Optional;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -36,6 +37,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
 import org.junit.jupiter.params.provider.EnumSource.Mode;
+import org.mockito.AdditionalAnswers;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
@@ -433,29 +435,66 @@ class RootViewLinkHandlerTest {
 		class TestBuildVorgangStatusLinks {
 
 			private final UserId userId = UserProfileTestFactory.ID;
+			private final List<VorgangStatus> statuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
+					VorgangStatus.BESCHIEDEN,
+					VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET);
 
 			@Test
 			void shouldCallBuildVorgangListByPageLink() {
 				viewLinkHandler.buildVorgangStatusLinks(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID);
 
-				verify(viewLinkHandler, times(7)).buildGetAllVorgaengeByAssignedToAndStatus(
-						any(VorgangStatus.class),
-						eq(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE),
-						eq(userId));
+				statuses.forEach(status -> verify(viewLinkHandler).buildGetAllVorgaengeByAssignedToAndStatus(status,
+						RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, userId));
 			}
 
 			@Test
-			void shouldCallFormatLinkRelTemplate() {
-				viewLinkHandler.buildVorgangStatusLinks(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID);
+			void shouldReturnLinks() {
+				var expectedLinks = LinkTestFactory.createList(8);
+				doAnswer(AdditionalAnswers.returnsElementsOf(expectedLinks)).when(viewLinkHandler).buildGetAllVorgaengeByAssignedToAndStatus(any(),
+						any(), any());
+
+				var links = viewLinkHandler.buildVorgangStatusLinks(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID);
 
-				verify(viewLinkHandler, times(7)).formatLinkRelTemplate(eq(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE), any(VorgangStatus.class));
+				assertThat(links).containsExactlyInAnyOrderElementsOf(expectedLinks);
 			}
+		}
 
-			@Test
-			void shouldBuildLinks() {
-				var links = viewLinkHandler.buildVorgangStatusLinks(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID);
+		@DisplayName("build get all vorgaenge by assignedTo and status")
+		@Nested
+		class TestBuildGetAllVorgaengeByAssignedToAndStatus {
+
+			@ParameterizedTest
+			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
+					"ZU_LOESCHEN", "WEITERGELEITET" })
+			void shouldCallFormatLinkRelTemplate(VorgangStatus status) {
+				viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE,
+						UserProfileTestFactory.ID);
+
+				verify(viewLinkHandler).formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, status);
+			}
+
+			@ParameterizedTest
+			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
+					"ZU_LOESCHEN", "WEITERGELEITET" })
+			void shouldAddByAssignedToAndStatus(VorgangStatus status) {
+				var link = viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE,
+						UserProfileTestFactory.ID);
+
+				assertThat(link.getHref()).isEqualTo(
+						"/api/vorgangs?page=0&limit=100&assignedTo=" + UserProfileTestFactory.ID.toString() + "&status=" + status.toString());
+			}
+
+			@ParameterizedTest
+			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
+					"ZU_LOESCHEN", "WEITERGELEITET" })
+			void shouldHaveFormattedRelation(VorgangStatus status) {
+				var expectedRelation = LoremIpsum.getInstance().getWords(1);
+				doReturn(expectedRelation).when(viewLinkHandler).formatLinkRelTemplate(any(), any());
+
+				var link = viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE,
+						UserProfileTestFactory.ID);
 
-				assertThat(links).hasSize(7);
+				assertThat(link.getRel()).isEqualTo(LinkRelation.of(expectedRelation));
 			}
 		}
 
@@ -465,7 +504,7 @@ class RootViewLinkHandlerTest {
 
 			@ParameterizedTest
 			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
-					"ZU_LOESCHEN" })
+					"ZU_LOESCHEN", "WEITERGELEITET" })
 			void shouldCallFormatLinkRelTemplateWithAllVorgaengeTemplate(VorgangStatus status) {
 				var linkRel = viewLinkHandler.formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, status);
 
@@ -474,7 +513,7 @@ class RootViewLinkHandlerTest {
 
 			@ParameterizedTest
 			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
-					"ZU_LOESCHEN" })
+					"ZU_LOESCHEN", "WEITERGELEITET" })
 			void shouldCallFormatLinkRelTemplateWithMyVorgaengeTemplate(VorgangStatus status) {
 				var linkRel = viewLinkHandler.formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, status);
 
@@ -483,7 +522,7 @@ class RootViewLinkHandlerTest {
 
 			@ParameterizedTest
 			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
-					"ZU_LOESCHEN" })
+					"ZU_LOESCHEN", "WEITERGELEITET" })
 			void shouldCallFormatLinkRelTemplateWithUnassignedVorgaengeTemplate(VorgangStatus status) {
 				var linkRel = viewLinkHandler.formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_UNASSIGNED_REL_TEMPLATE, status);
 
@@ -497,7 +536,7 @@ class RootViewLinkHandlerTest {
 
 			@ParameterizedTest
 			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
-					"ZU_LOESCHEN" })
+					"ZU_LOESCHEN", "WEITERGELEITET" })
 			void shouldAddByStatus(VorgangStatus status) {
 				var link = viewLinkHandler.buildGetAllVorgaengeByStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE);
 
@@ -506,29 +545,13 @@ class RootViewLinkHandlerTest {
 
 		}
 
-		@DisplayName("build get all vorgaenge by assignedTo and status")
-		@Nested
-		class TestBuildGetAllVorgaengeByAssignedToAndStatus {
-
-			@ParameterizedTest
-			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
-					"ZU_LOESCHEN" })
-			void shouldAddByAssignedToAndStatus(VorgangStatus status) {
-				var link = viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE,
-						UserProfileTestFactory.ID);
-
-				assertThat(link.getHref()).isEqualTo(
-						"/api/vorgangs?page=0&limit=100&assignedTo=" + UserProfileTestFactory.ID.toString() + "&status=" + status.toString());
-			}
-		}
-
 		@DisplayName("build get all unassigned vorgaenge by status")
 		@Nested
 		class TestBuildGetAllUnassignedVorgaengeByStatus {
 
 			@ParameterizedTest
 			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
-					"ZU_LOESCHEN" })
+					"ZU_LOESCHEN", "WEITERGELEITET" })
 			void shouldAddByUnassignedToAndStatus(VorgangStatus status) {
 				var link = viewLinkHandler.buildGetAllVorgaengeByAssignedToAndStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE,
 						UserId.empty());
-- 
GitLab


From 2ce6e43de57047e459b4a7d86401c3b7a5f8954a Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Mon, 10 Mar 2025 11:20:41 +0100
Subject: [PATCH 2/6] OZG-7501 OZG-7902 add count of vorgangs in status
 weitergeleitet

---
 .../de/ozgcloud/alfa/statistic/ByStatus.java  |  1 +
 .../alfa/statistic/StatisticService.java      | 19 +++++++++---------
 .../alfa/statistic/StatisticServiceTest.java  | 20 ++++++++++++++++---
 3 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/ByStatus.java b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/ByStatus.java
index 6f0a4929e0..852c8cfc85 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/ByStatus.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/ByStatus.java
@@ -39,4 +39,5 @@ class ByStatus {
 	private int abgeschlossen;
 	private int verworfen;
 	private int zuLoeschen;
+	private int weitergeleitet;
 }
\ No newline at end of file
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java
index 9e8cbd8c31..26cbc36abf 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java
@@ -28,26 +28,26 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
+import lombok.RequiredArgsConstructor;
 
 @Service
+@RequiredArgsConstructor
 class StatisticService {
 
-	static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN,
-			VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN);
-	static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER = Collections.emptyList();
-	static final List<VorgangStatus> COUNT_BY_VORGANG_EINHEITLICHER_ANSPRECHPARTNER = Collections.emptyList();
+	private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN,
+			VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN,
+			VorgangStatus.WEITERGELEITET);
+	private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER = Collections.emptyList();
+	private static final List<VorgangStatus> COUNT_BY_VORGANG_EINHEITLICHER_ANSPRECHPARTNER = Collections.emptyList();
 
-	@Autowired
-	private StatisticRemoteService remoteService;
+	private final StatisticRemoteService remoteService;
 
-	@Autowired
-	private CurrentUserService currentUserService;
+	private final CurrentUserService currentUserService;
 
 	public Statistic getVorgaengeStatistic() {
 		var response = remoteService.getVorgaengeStatistics(getCountByVorgangStatusList());
@@ -80,6 +80,7 @@ class StatisticService {
 						.verworfen(getIntResult(response, remoteService.buildCountByStatusResultName(VorgangStatus.VERWORFEN)))
 						.inBearbeitung(getIntResult(response, remoteService.buildCountByStatusResultName(VorgangStatus.IN_BEARBEITUNG)))
 						.zuLoeschen(getIntResult(response, remoteService.buildCountByStatusResultName(VorgangStatus.ZU_LOESCHEN)))
+						.weitergeleitet(getIntResult(response, remoteService.buildCountByStatusResultName(VorgangStatus.WEITERGELEITET)))
 						.build())
 				.build();
 	}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java
index 61204730a5..180fe52812 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java
@@ -24,12 +24,12 @@
 package de.ozgcloud.alfa.statistic;
 
 import static de.ozgcloud.alfa.statistic.StatisticRemoteService.*;
-import static de.ozgcloud.alfa.statistic.StatisticService.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -155,6 +155,15 @@ class StatisticServiceTest {
 			assertThat(statistic.getByStatus().getZuLoeschen()).isEqualTo(StatisticResultTestFactory.INT_VALUE);
 		}
 
+		@Test
+		void shouldContainCountByStatusWeitergeleitet() {
+			var statistic = service.buildGetVorgaengeStatisticResult(Map.of(
+					String.format(COUNT_VORGANG_STATUS_RESULT_NAME_FORMAT, VorgangStatus.WEITERGELEITET.name()),
+					StatisticResultTestFactory.create()));
+
+			assertThat(statistic.getByStatus().getWeitergeleitet()).isEqualTo(StatisticResultTestFactory.INT_VALUE);
+		}
+
 		@Test
 		void shouldContainDefaultCountByStatus() {
 			var statistic = service.buildGetVorgaengeStatisticResult(Map.of());
@@ -174,6 +183,10 @@ class StatisticServiceTest {
 	@Nested
 	class TestGetCountByVorgangStatusList {
 
+		private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN,
+				VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN,
+				VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET);
+
 		@Test
 		void shouldGetForVerwalungUser() {
 			when(currentUserService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true);
@@ -190,7 +203,7 @@ class StatisticServiceTest {
 
 			var result = service.getCountByVorgangStatusList();
 
-			assertThat(result).containsAll(COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER);
+			assertThat(result).containsAll(Collections.emptyList());
 		}
 
 		@Test
@@ -201,7 +214,7 @@ class StatisticServiceTest {
 
 			var result = service.getCountByVorgangStatusList();
 
-			assertThat(result).containsAll(COUNT_BY_VORGANG_EINHEITLICHER_ANSPRECHPARTNER);
+			assertThat(result).containsAll(Collections.emptyList());
 		}
 
 		@Test
@@ -222,6 +235,7 @@ class StatisticServiceTest {
 		private final Statistic statistic = StatisticTestFactory.create();
 		private final Map<String, StatisticResult> getVorgangStatisticsResponse = Map.of(COUNT_WIEDERVORLAGE_NEXT_FRIST_RESULT_NAME,
 				StatisticResultTestFactory.create());
+		private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU);
 
 		@BeforeEach
 		void beforeEach() {
-- 
GitLab


From 40df4b8d4e1b6a2d6a426d28123d5eb0c94e6e32 Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Mon, 10 Mar 2025 15:36:34 +0100
Subject: [PATCH 3/6] OZG-7572 OZG-7901 only add weitergeleitet status link if
 forward feature is enabled and add missing unit tests

---
 .../de/ozgcloud/alfa/RootViewLinkHandler.java |  18 ++-
 .../alfa/RootViewLinkHandlerTest.java         | 132 +++++++++++++++++-
 2 files changed, 139 insertions(+), 11 deletions(-)

diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java
index 6a832f1fd2..99d9c9dffd 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java
@@ -27,12 +27,14 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
 
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Stream;
 
 import org.springframework.hateoas.EntityModel;
 import org.springframework.hateoas.Link;
 import org.springframework.hateoas.server.LinkBuilder;
 import org.springframework.stereotype.Component;
 
+import de.ozgcloud.alfa.common.FeatureToggleProperties;
 import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserId;
 import de.ozgcloud.alfa.common.user.UserRole;
@@ -70,9 +72,7 @@ class RootViewLinkHandler {
 
 	private final CurrentUserService currentUserService;
 	private final SystemStatusService systemStatusService;
-
-	private final List<VorgangStatus> statusList = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
-			VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET);
+	private final FeatureToggleProperties featureToggleProperties;
 
 	public void addViewLinks(EntityModel<Root> model, Optional<UserId> userId) {
 		model.add(buildGetAllVorgaengeLink());
@@ -158,7 +158,7 @@ class RootViewLinkHandler {
 	}
 
 	void addVorgangStatusLinks(EntityModel<Root> model, String linkRelTemplate) {
-		statusList.forEach(status -> model.add(buildGetAllVorgaengeByStatus(status, linkRelTemplate)));
+		getVorgangStatusStream().forEach(status -> model.add(buildGetAllVorgaengeByStatus(status, linkRelTemplate)));
 	}
 
 	Link buildGetAllVorgaengeByStatus(VorgangStatus status, String linkRelTemplate) {
@@ -175,7 +175,14 @@ class RootViewLinkHandler {
 	}
 
 	List<Link> buildVorgangStatusLinks(String linkRelTemplate, UserId userId) {
-		return statusList.stream().map(status -> buildGetAllVorgaengeByAssignedToAndStatus(status, linkRelTemplate, userId)).toList();
+		return getVorgangStatusStream().map(status -> buildGetAllVorgaengeByAssignedToAndStatus(status, linkRelTemplate, userId)).toList();
+	}
+
+	Stream<VorgangStatus> getVorgangStatusStream() {
+		return Stream
+				.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN,
+						VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET)
+				.filter(status -> status != VorgangStatus.WEITERGELEITET || featureToggleProperties.isForwardByOzgCloudEnabled());
 	}
 
 	Link buildGetAllVorgaengeByAssignedToAndStatus(VorgangStatus status, String linkRelTemplate, UserId userId) {
@@ -214,4 +221,5 @@ class RootViewLinkHandler {
 				.getAllByAssignedToAndUngeleseneNachrichten(0, PAGE_SIZE, userId, VorgangController.PARAM_NACHRICHTEN_UNGELESENE))
 						.withRel(linkRel);
 	}
+
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
index 0b8fd47ccb..6a1550ae25 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
@@ -47,6 +47,7 @@ import org.springframework.hateoas.LinkRelation;
 
 import com.thedeanda.lorem.LoremIpsum;
 
+import de.ozgcloud.alfa.common.FeatureToggleProperties;
 import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserId;
 import de.ozgcloud.alfa.common.user.UserProfileTestFactory;
@@ -63,6 +64,8 @@ class RootViewLinkHandlerTest {
 	private CurrentUserService currentUserService;
 	@Mock
 	private SystemStatusService systemStatusService;
+	@Mock
+	private FeatureToggleProperties featureToggleProperties;
 
 	@DisplayName("Add view links")
 	@Nested
@@ -213,7 +216,7 @@ class RootViewLinkHandlerTest {
 			}
 
 			@Test
-			void shouldCallAddVorgangStatusLinks() {
+			void shouldCallAddAllVorgangStatusLinks() {
 				viewLinkHandler.addViewLinksForVerwaltungUser(model, Optional.of(UserProfileTestFactory.ID));
 
 				verify(viewLinkHandler).addAllVorgangStatusLinks(model);
@@ -435,9 +438,19 @@ class RootViewLinkHandlerTest {
 		class TestBuildVorgangStatusLinks {
 
 			private final UserId userId = UserProfileTestFactory.ID;
-			private final List<VorgangStatus> statuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
-					VorgangStatus.BESCHIEDEN,
-					VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET);
+			private final List<VorgangStatus> statuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN);
+
+			@BeforeEach
+			void mock() {
+				doReturn(statuses.stream()).when(viewLinkHandler).getVorgangStatusStream();
+			}
+
+			@Test
+			void shouldCallGetVorgangStatusStream() {
+				viewLinkHandler.buildVorgangStatusLinks(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID);
+
+				verify(viewLinkHandler).getVorgangStatusStream();
+			}
 
 			@Test
 			void shouldCallBuildVorgangListByPageLink() {
@@ -449,7 +462,7 @@ class RootViewLinkHandlerTest {
 
 			@Test
 			void shouldReturnLinks() {
-				var expectedLinks = LinkTestFactory.createList(8);
+				var expectedLinks = LinkTestFactory.createList(statuses.size());
 				doAnswer(AdditionalAnswers.returnsElementsOf(expectedLinks)).when(viewLinkHandler).buildGetAllVorgaengeByAssignedToAndStatus(any(),
 						any(), any());
 
@@ -532,7 +545,7 @@ class RootViewLinkHandlerTest {
 
 		@DisplayName("build get all vorgaenge by status")
 		@Nested
-		class TestBuildGetAllByStatus {
+		class TestBuildGetAllVorgaengeByStatus {
 
 			@ParameterizedTest
 			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
@@ -543,6 +556,27 @@ class RootViewLinkHandlerTest {
 				assertThat(link.getHref()).isEqualTo("/api/vorgangs?page=0&limit=100&status=" + status.toString());
 			}
 
+			@ParameterizedTest
+			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
+					"ZU_LOESCHEN", "WEITERGELEITET" })
+			void shouldCallFormatLinkRelTemplate(VorgangStatus status) {
+				viewLinkHandler.buildGetAllVorgaengeByStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE);
+
+				verify(viewLinkHandler).formatLinkRelTemplate(RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE, status);
+			}
+
+			@ParameterizedTest
+			@EnumSource(mode = Mode.INCLUDE, names = { "NEU", "ANGENOMMEN", "IN_BEARBEITUNG", "BESCHIEDEN", "ABGESCHLOSSEN", "VERWORFEN",
+					"ZU_LOESCHEN", "WEITERGELEITET" })
+			void shouldHaveFormattedRelation(VorgangStatus status) {
+				var expectedRelation = LoremIpsum.getInstance().getWords(1);
+				doReturn(expectedRelation).when(viewLinkHandler).formatLinkRelTemplate(any(), any());
+
+				var link = viewLinkHandler.buildGetAllVorgaengeByStatus(status, RootViewLinkHandler.VORGAENGE_MY_REL_TEMPLATE);
+
+				assertThat(link.getRel()).isEqualTo(LinkRelation.of(expectedRelation));
+			}
+
 		}
 
 		@DisplayName("build get all unassigned vorgaenge by status")
@@ -729,4 +763,90 @@ class RootViewLinkHandlerTest {
 		}
 
 	}
+
+	@Nested
+	class TestAddVorgangStatusLinks {
+
+		private final EntityModel<Root> model = EntityModel.of(RootTestFactory.create());
+		private final List<VorgangStatus> vorgangStatuses = List.of(VorgangStatus.NEU, VorgangStatus.BESCHIEDEN);
+		private final List<Link> links = LinkTestFactory.createList(vorgangStatuses.size());
+
+		@BeforeEach
+		void mock() {
+			doReturn(vorgangStatuses.stream()).when(viewLinkHandler).getVorgangStatusStream();
+			doAnswer(AdditionalAnswers.returnsElementsOf(links)).when(viewLinkHandler).buildGetAllVorgaengeByStatus(any(), any());
+		}
+
+		@Test
+		void shouldCallGetVorgangStatusStream() {
+			viewLinkHandler.addVorgangStatusLinks(model, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE);
+
+			verify(viewLinkHandler).getVorgangStatusStream();
+		}
+
+		@Test
+		void shouldCallBuildGetAllVorgaengeByStatus() {
+			viewLinkHandler.addVorgangStatusLinks(model, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE);
+
+			vorgangStatuses
+					.forEach(status -> verify(viewLinkHandler).buildGetAllVorgaengeByStatus(status, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE));
+		}
+
+		@Test
+		void shouldAddLinksToModel() {
+			viewLinkHandler.addVorgangStatusLinks(model, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE);
+
+			assertThat(model.getLinks()).containsExactlyInAnyOrderElementsOf(links);
+		}
+	}
+
+	@Nested
+	class TestGetVorgangStatusStream {
+
+		@Test
+		void shouldCallFeatureToggleProperties() {
+			viewLinkHandler.getVorgangStatusStream();
+
+			verify(featureToggleProperties).isForwardByOzgCloudEnabled();
+		}
+
+		@Nested
+		class TestOnIsForwardByOzgCloudEnabled {
+
+			@BeforeEach
+			void mock() {
+				when(featureToggleProperties.isForwardByOzgCloudEnabled()).thenReturn(true);
+			}
+
+			@Test
+			void shouldReturnStream() {
+				var expectedStatuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
+						VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN,
+						VorgangStatus.WEITERGELEITET);
+
+				var stream = viewLinkHandler.getVorgangStatusStream();
+
+				assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses);
+			}
+		}
+
+		@Nested
+		class TestOnIsNotForwardByOzgCloudEnabled {
+
+			@BeforeEach
+			void mock() {
+				when(featureToggleProperties.isForwardByOzgCloudEnabled()).thenReturn(false);
+			}
+
+			@Test
+			void shouldReturnStream() {
+				var expectedStatuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
+						VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN);
+
+				var stream = viewLinkHandler.getVorgangStatusStream();
+
+				assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses);
+			}
+		}
+	}
 }
-- 
GitLab


From c501390c9b30481c27172a4ee29dd45c4fff3f14 Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Mon, 10 Mar 2025 15:41:07 +0100
Subject: [PATCH 4/6] OZG-7572 OZG-7901fix unit test

---
 .../src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
index 6a1550ae25..be76fab90e 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
@@ -805,7 +805,7 @@ class RootViewLinkHandlerTest {
 
 		@Test
 		void shouldCallFeatureToggleProperties() {
-			viewLinkHandler.getVorgangStatusStream();
+			viewLinkHandler.getVorgangStatusStream().toList();
 
 			verify(featureToggleProperties).isForwardByOzgCloudEnabled();
 		}
-- 
GitLab


From b0dac5bc2ba67af7cf46b1e66b45d2387a2458ff Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Mon, 10 Mar 2025 15:48:52 +0100
Subject: [PATCH 5/6] OZG-7572 OZG-7902 consider feature toggle in
 statisticService

---
 .../alfa/statistic/StatisticService.java      | 17 +++--
 .../alfa/statistic/StatisticServiceTest.java  | 71 +++++++++++++++++--
 2 files changed, 78 insertions(+), 10 deletions(-)

diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java
index 26cbc36abf..9710c03464 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java
@@ -27,9 +27,11 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Stream;
 
 import org.springframework.stereotype.Service;
 
+import de.ozgcloud.alfa.common.FeatureToggleProperties;
 import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
@@ -39,15 +41,12 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 class StatisticService {
 
-	private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN,
-			VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN,
-			VorgangStatus.WEITERGELEITET);
 	private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER = Collections.emptyList();
 	private static final List<VorgangStatus> COUNT_BY_VORGANG_EINHEITLICHER_ANSPRECHPARTNER = Collections.emptyList();
 
 	private final StatisticRemoteService remoteService;
-
 	private final CurrentUserService currentUserService;
+	private final FeatureToggleProperties featureToggleProperties;
 
 	public Statistic getVorgaengeStatistic() {
 		var response = remoteService.getVorgaengeStatistics(getCountByVorgangStatusList());
@@ -56,7 +55,7 @@ class StatisticService {
 
 	List<VorgangStatus> getCountByVorgangStatusList() {
 		if (currentUserService.hasRole(UserRole.VERWALTUNG_USER)) {
-			return COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER;
+			return getVerwaltungUserStatuses();
 		}
 		if (currentUserService.hasRole(UserRole.VERWALTUNG_POSTSTELLE)) {
 			return COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER;
@@ -92,4 +91,12 @@ class StatisticService {
 	private boolean getBooleanResult(Map<String, StatisticResult> response, String resultName) {
 		return Optional.ofNullable(response.get(resultName)).map(StatisticResult::getBoolValue).orElse(false);
 	}
+
+	List<VorgangStatus> getVerwaltungUserStatuses() {
+		return Stream
+				.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN,
+						VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET)
+				.filter(status -> status != VorgangStatus.WEITERGELEITET || featureToggleProperties.isForwardByOzgCloudEnabled())
+				.toList();
+	}
 }
\ No newline at end of file
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java
index 180fe52812..58ef88e6ca 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/statistic/StatisticServiceTest.java
@@ -39,6 +39,7 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
+import de.ozgcloud.alfa.common.FeatureToggleProperties;
 import de.ozgcloud.alfa.common.user.CurrentUserService;
 import de.ozgcloud.alfa.common.user.UserRole;
 import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus;
@@ -52,6 +53,8 @@ class StatisticServiceTest {
 	private StatisticRemoteService remoteService;
 	@Mock
 	private CurrentUserService currentUserService;
+	@Mock
+	private FeatureToggleProperties featureToggleProperties;
 
 	@Nested
 	class TestBuildGetVorgaengeStatisticResult {
@@ -183,17 +186,25 @@ class StatisticServiceTest {
 	@Nested
 	class TestGetCountByVorgangStatusList {
 
-		private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN,
-				VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN,
-				VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET);
+		private static final List<VorgangStatus> VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN);
+
+		@Test
+		void shouldCallGetVerwaltungUserStatuses() {
+			when(currentUserService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true);
+
+			service.getCountByVorgangStatusList();
+
+			verify(service).getVerwaltungUserStatuses();
+		}
 
 		@Test
-		void shouldGetForVerwalungUser() {
+		void shouldReturnVerwaltungUserStatuses() {
 			when(currentUserService.hasRole(UserRole.VERWALTUNG_USER)).thenReturn(true);
+			doReturn(VORGANG_STATUS_VERWALTUNG_USER).when(service).getVerwaltungUserStatuses();
 
 			var result = service.getCountByVorgangStatusList();
 
-			assertThat(result).containsAll(COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER);
+			assertThat(result).containsAll(VORGANG_STATUS_VERWALTUNG_USER);
 		}
 
 		@Test
@@ -272,4 +283,54 @@ class StatisticServiceTest {
 			assertThat(result).isEqualTo(statistic);
 		}
 	}
+
+	@Nested
+	class TestGetVorgangStatuses {
+
+		@Test
+		void shouldCallFeatureToggleProperties() {
+			service.getVerwaltungUserStatuses();
+
+			verify(featureToggleProperties).isForwardByOzgCloudEnabled();
+		}
+
+		@Nested
+		class TestOnIsForwardByOzgCloudEnabled {
+
+			@BeforeEach
+			void mock() {
+				when(featureToggleProperties.isForwardByOzgCloudEnabled()).thenReturn(true);
+			}
+
+			@Test
+			void shouldReturnStream() {
+				var expectedStatuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
+						VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN,
+						VorgangStatus.WEITERGELEITET);
+
+				var stream = service.getVerwaltungUserStatuses();
+
+				assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses);
+			}
+		}
+
+		@Nested
+		class TestOnIsNotForwardByOzgCloudEnabled {
+
+			@BeforeEach
+			void mock() {
+				when(featureToggleProperties.isForwardByOzgCloudEnabled()).thenReturn(false);
+			}
+
+			@Test
+			void shouldReturnStream() {
+				var expectedStatuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
+						VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN);
+
+				var stream = service.getVerwaltungUserStatuses();
+
+				assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses);
+			}
+		}
+	}
 }
-- 
GitLab


From 8e20f4e8bed7adc0605e00ec0f55587c429cb352 Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Tue, 11 Mar 2025 13:53:24 +0100
Subject: [PATCH 6/6] OZG-7572 apply code review comments

---
 .../de/ozgcloud/alfa/RootViewLinkHandler.java | 14 ++++++-------
 .../alfa/statistic/StatisticService.java      |  8 ++++----
 .../alfa/RootViewLinkHandlerTest.java         | 20 +++++++++----------
 3 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java
index 99d9c9dffd..6b1eddb06b 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/RootViewLinkHandler.java
@@ -70,6 +70,9 @@ class RootViewLinkHandler {
 
 	static final int PAGE_SIZE = 100;
 
+	private static final List<VorgangStatus> STATUS_LIST = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
+			VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET);
+
 	private final CurrentUserService currentUserService;
 	private final SystemStatusService systemStatusService;
 	private final FeatureToggleProperties featureToggleProperties;
@@ -158,7 +161,7 @@ class RootViewLinkHandler {
 	}
 
 	void addVorgangStatusLinks(EntityModel<Root> model, String linkRelTemplate) {
-		getVorgangStatusStream().forEach(status -> model.add(buildGetAllVorgaengeByStatus(status, linkRelTemplate)));
+		getVorgangStatuses().forEach(status -> model.add(buildGetAllVorgaengeByStatus(status, linkRelTemplate)));
 	}
 
 	Link buildGetAllVorgaengeByStatus(VorgangStatus status, String linkRelTemplate) {
@@ -175,14 +178,11 @@ class RootViewLinkHandler {
 	}
 
 	List<Link> buildVorgangStatusLinks(String linkRelTemplate, UserId userId) {
-		return getVorgangStatusStream().map(status -> buildGetAllVorgaengeByAssignedToAndStatus(status, linkRelTemplate, userId)).toList();
+		return getVorgangStatuses().map(status -> buildGetAllVorgaengeByAssignedToAndStatus(status, linkRelTemplate, userId)).toList();
 	}
 
-	Stream<VorgangStatus> getVorgangStatusStream() {
-		return Stream
-				.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN,
-						VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET)
-				.filter(status -> status != VorgangStatus.WEITERGELEITET || featureToggleProperties.isForwardByOzgCloudEnabled());
+	Stream<VorgangStatus> getVorgangStatuses() {
+		return STATUS_LIST.stream().filter(status -> status != VorgangStatus.WEITERGELEITET || featureToggleProperties.isForwardByOzgCloudEnabled());
 	}
 
 	Link buildGetAllVorgaengeByAssignedToAndStatus(VorgangStatus status, String linkRelTemplate, UserId userId) {
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java
index 9710c03464..57b9c2e7c5 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/statistic/StatisticService.java
@@ -27,7 +27,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.stream.Stream;
 
 import org.springframework.stereotype.Service;
 
@@ -41,6 +40,9 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor
 class StatisticService {
 
+	private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN,
+			VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN,
+			VorgangStatus.WEITERGELEITET);
 	private static final List<VorgangStatus> COUNT_BY_VORGANG_STATUS_POSTSTELLE_USER = Collections.emptyList();
 	private static final List<VorgangStatus> COUNT_BY_VORGANG_EINHEITLICHER_ANSPRECHPARTNER = Collections.emptyList();
 
@@ -93,9 +95,7 @@ class StatisticService {
 	}
 
 	List<VorgangStatus> getVerwaltungUserStatuses() {
-		return Stream
-				.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG, VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN,
-						VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN, VorgangStatus.WEITERGELEITET)
+		return COUNT_BY_VORGANG_STATUS_VERWALTUNG_USER.stream()
 				.filter(status -> status != VorgangStatus.WEITERGELEITET || featureToggleProperties.isForwardByOzgCloudEnabled())
 				.toList();
 	}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
index be76fab90e..02d0843e8e 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/RootViewLinkHandlerTest.java
@@ -442,14 +442,14 @@ class RootViewLinkHandlerTest {
 
 			@BeforeEach
 			void mock() {
-				doReturn(statuses.stream()).when(viewLinkHandler).getVorgangStatusStream();
+				doReturn(statuses.stream()).when(viewLinkHandler).getVorgangStatuses();
 			}
 
 			@Test
-			void shouldCallGetVorgangStatusStream() {
+			void shouldCallGetVorgangStatuses() {
 				viewLinkHandler.buildVorgangStatusLinks(RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE, UserProfileTestFactory.ID);
 
-				verify(viewLinkHandler).getVorgangStatusStream();
+				verify(viewLinkHandler).getVorgangStatuses();
 			}
 
 			@Test
@@ -773,15 +773,15 @@ class RootViewLinkHandlerTest {
 
 		@BeforeEach
 		void mock() {
-			doReturn(vorgangStatuses.stream()).when(viewLinkHandler).getVorgangStatusStream();
+			doReturn(vorgangStatuses.stream()).when(viewLinkHandler).getVorgangStatuses();
 			doAnswer(AdditionalAnswers.returnsElementsOf(links)).when(viewLinkHandler).buildGetAllVorgaengeByStatus(any(), any());
 		}
 
 		@Test
-		void shouldCallGetVorgangStatusStream() {
+		void shouldCallGetVorgangStatuses() {
 			viewLinkHandler.addVorgangStatusLinks(model, RootViewLinkHandler.VORGAENGE_ALL_REL_TEMPLATE);
 
-			verify(viewLinkHandler).getVorgangStatusStream();
+			verify(viewLinkHandler).getVorgangStatuses();
 		}
 
 		@Test
@@ -801,11 +801,11 @@ class RootViewLinkHandlerTest {
 	}
 
 	@Nested
-	class TestGetVorgangStatusStream {
+	class TestGetVorgangStatuses {
 
 		@Test
 		void shouldCallFeatureToggleProperties() {
-			viewLinkHandler.getVorgangStatusStream().toList();
+			viewLinkHandler.getVorgangStatuses().toList();
 
 			verify(featureToggleProperties).isForwardByOzgCloudEnabled();
 		}
@@ -824,7 +824,7 @@ class RootViewLinkHandlerTest {
 						VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN,
 						VorgangStatus.WEITERGELEITET);
 
-				var stream = viewLinkHandler.getVorgangStatusStream();
+				var stream = viewLinkHandler.getVorgangStatuses();
 
 				assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses);
 			}
@@ -843,7 +843,7 @@ class RootViewLinkHandlerTest {
 				var expectedStatuses = List.of(VorgangStatus.NEU, VorgangStatus.ANGENOMMEN, VorgangStatus.IN_BEARBEITUNG,
 						VorgangStatus.BESCHIEDEN, VorgangStatus.ABGESCHLOSSEN, VorgangStatus.VERWORFEN, VorgangStatus.ZU_LOESCHEN);
 
-				var stream = viewLinkHandler.getVorgangStatusStream();
+				var stream = viewLinkHandler.getVorgangStatuses();
 
 				assertThat(stream).containsExactlyInAnyOrderElementsOf(expectedStatuses);
 			}
-- 
GitLab