From b7b2183a99db37226476c326a46611f7926698fd Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 23 Jun 2022 10:13:16 +0200
Subject: [PATCH] OZG-1513 create and handle command for sending postfach
 nachricht; Refactoring: allow order als string in grpc endpoint

---
 ...ntragstellerNotificationEventListener.java | 13 ++++-
 .../command/CommandRemoteService.java         |  2 +
 .../notification/command/CommandService.java  | 15 +++---
 .../postfach/PostfachNachricht.java           |  4 ++
 .../notification/vorgang/VorgangService.java  |  2 +-
 ...gstellerNotificationEventListenerTest.java |  9 ++++
 .../command/CommandServiceTest.java           | 27 ++++++++++
 .../PostfachNachrichtTestFactory.java         |  3 +-
 pluto-interface/pom.xml                       |  2 +-
 pluto-server/pom.xml                          | 12 +++--
 .../VorgangAttachedItemEventListener.java     |  4 +-
 .../de/itvsh/ozg/pluto/command/Command.java   |  2 +-
 .../ozg/pluto/command/CommandService.java     | 13 ++++-
 .../pluto/command/CreateCommandRequest.java   |  2 +-
 .../command/GrpcCommandResponseMapper.java    |  9 +++-
 .../ozg/pluto/command/GrpcCommandService.java | 14 +++---
 .../GrpcCreateCommandRequestMapper.java       |  9 ++++
 .../de/itvsh/ozg/pluto/command/Order.java     |  6 +++
 .../PersistPostfachMailByCommandService.java  |  2 +-
 .../itvsh/ozg/pluto/command/StatusOrder.java  | 12 ++++-
 .../pluto/vorgang/VorgangEventListener.java   |  2 +-
 .../ozg/pluto/vorgang/VorgangService.java     |  5 +-
 .../redirect/ForwardingEventListener.java     |  6 +--
 ...organgAttachedItemEventListenerITCase.java |  4 +-
 .../VorgangAttachedItemITCase.java            |  7 ++-
 .../ozg/pluto/command/CommandITCase.java      |  8 +--
 .../ozg/pluto/command/CommandServiceTest.java | 49 ++++++++++++++++++-
 .../ozg/pluto/command/CommandTestFactory.java |  2 +-
 .../CreateCommandRequestTestFactory.java      |  2 +-
 .../pluto/command/GrpcCommandMapperTest.java  |  5 +-
 .../pluto/command/GrpcCommandServiceTest.java | 23 ++++-----
 .../GrpcCreateCommandRequestMapperTest.java   | 22 +++++++--
 .../GrpcCreateCommandRequestTestFactory.java  |  1 +
 ...istPostfachMailByCommandServiceITCase.java |  3 +-
 .../vorgang/VorgangEventListenerTest.java     |  2 +-
 .../ForwardingEventListenerITCase.java        |  6 +--
 .../redirect/ForwardingEventListenerTest.java |  4 +-
 37 files changed, 235 insertions(+), 78 deletions(-)

diff --git a/notification-manager/src/main/java/de/itvsh/kop/notification/antragsteller/AntragstellerNotificationEventListener.java b/notification-manager/src/main/java/de/itvsh/kop/notification/antragsteller/AntragstellerNotificationEventListener.java
index c54b50fd1..c4ec067e8 100644
--- a/notification-manager/src/main/java/de/itvsh/kop/notification/antragsteller/AntragstellerNotificationEventListener.java
+++ b/notification-manager/src/main/java/de/itvsh/kop/notification/antragsteller/AntragstellerNotificationEventListener.java
@@ -1,13 +1,17 @@
 package de.itvsh.kop.notification.antragsteller;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 
+import de.itvsh.kop.notification.vorgang.Vorgang;
 import de.itvsh.kop.notification.vorgang.VorgangId;
 import de.itvsh.kop.notification.vorgang.VorgangService;
 import de.itvsh.ozg.pluto.command.VorgangCreatedEvent;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 @Component
 public class AntragstellerNotificationEventListener {
 
@@ -20,7 +24,14 @@ public class AntragstellerNotificationEventListener {
 	public void onVorgangCreated(VorgangCreatedEvent event) {
 		var vorgang = vorgangService.getVorgang(VorgangId.from(event.getSource()));
 
-		service.sendNotification(vorgang);
+		sendIfWithPostfach(vorgang);
 	}
 
+	private void sendIfWithPostfach(Vorgang vorgang) {
+		if (StringUtils.isBlank(vorgang.getPostfachId())) {
+			LOG.info("No PostfachId present on Vorgang '{}'.", vorgang.getId());
+		} else {
+			service.sendNotification(vorgang);
+		}
+	}
 }
diff --git a/notification-manager/src/main/java/de/itvsh/kop/notification/command/CommandRemoteService.java b/notification-manager/src/main/java/de/itvsh/kop/notification/command/CommandRemoteService.java
index 6e4ed28fe..a57f8712e 100644
--- a/notification-manager/src/main/java/de/itvsh/kop/notification/command/CommandRemoteService.java
+++ b/notification-manager/src/main/java/de/itvsh/kop/notification/command/CommandRemoteService.java
@@ -1,10 +1,12 @@
 package de.itvsh.kop.notification.command;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
 import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
 import net.devh.boot.grpc.client.inject.GrpcClient;
 
+@Service
 class CommandRemoteService {
 
 	@GrpcClient("pluto")
diff --git a/notification-manager/src/main/java/de/itvsh/kop/notification/command/CommandService.java b/notification-manager/src/main/java/de/itvsh/kop/notification/command/CommandService.java
index dc1bc3765..783581413 100644
--- a/notification-manager/src/main/java/de/itvsh/kop/notification/command/CommandService.java
+++ b/notification-manager/src/main/java/de/itvsh/kop/notification/command/CommandService.java
@@ -13,22 +13,23 @@ import org.springframework.stereotype.Service;
 import de.itvsh.kop.notification.command.Command.CommandOrder;
 import de.itvsh.kop.notification.postfach.PostfachNachricht;
 
-@Service
+@Service("notificationCommandService")
 public class CommandService {
 
 	@Autowired
 	private CommandRemoteService commandRemoteService;
 
 	public void createSendPostfachNachrichtCommand(PostfachNachricht nachricht) {
-		buildCommand(nachricht);
+		commandRemoteService.createCommand(buildCommand(nachricht));
 	}
 
-	private void buildCommand(PostfachNachricht nachricht) {
-		Command.builder()
+	Command buildCommand(PostfachNachricht nachricht) {
+		return Command.builder()
 				.vorgangId(nachricht.getVorgangId())
 				.relationId(nachricht.getVorgangId().toString())
 				.order(CommandOrder.SEND_POSTFACH_NACHRICHT)
-				.body(toMap(nachricht));
+				.body(toMap(nachricht))
+				.build();
 	}
 
 	Map<String, Object> toMap(PostfachNachricht nachricht) {
@@ -37,9 +38,7 @@ public class CommandService {
 		new BeanMap(nachricht).entrySet().stream()
 				.filter(entry -> Objects.nonNull(entry.getValue()))
 				.filter(entry -> !StringUtils.equals(entry.getKey().toString(), "class"))
-				.forEach(entry -> {
-					result.put(entry.getKey().toString(), entry.getValue());
-				});
+				.forEach(entry -> result.put(entry.getKey().toString(), entry.getValue()));
 
 		return Collections.unmodifiableMap(result);
 	}
diff --git a/notification-manager/src/main/java/de/itvsh/kop/notification/postfach/PostfachNachricht.java b/notification-manager/src/main/java/de/itvsh/kop/notification/postfach/PostfachNachricht.java
index 79fdb98f7..6d81611ec 100644
--- a/notification-manager/src/main/java/de/itvsh/kop/notification/postfach/PostfachNachricht.java
+++ b/notification-manager/src/main/java/de/itvsh/kop/notification/postfach/PostfachNachricht.java
@@ -23,4 +23,8 @@ public class PostfachNachricht implements CommandBody {
 	private String subject;
 	private String message;
 
+	public String getReplyOption() {
+		return DEFAULT_REPLY_OPTION;
+	}
+
 }
diff --git a/notification-manager/src/main/java/de/itvsh/kop/notification/vorgang/VorgangService.java b/notification-manager/src/main/java/de/itvsh/kop/notification/vorgang/VorgangService.java
index a54913307..bb5d1fea9 100644
--- a/notification-manager/src/main/java/de/itvsh/kop/notification/vorgang/VorgangService.java
+++ b/notification-manager/src/main/java/de/itvsh/kop/notification/vorgang/VorgangService.java
@@ -3,7 +3,7 @@ package de.itvsh.kop.notification.vorgang;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-@Service
+@Service("notificationVorgangService")
 public class VorgangService {
 
 	@Autowired
diff --git a/notification-manager/src/test/java/de/itvsh/kop/notification/antragsteller/AntragstellerNotificationEventListenerTest.java b/notification-manager/src/test/java/de/itvsh/kop/notification/antragsteller/AntragstellerNotificationEventListenerTest.java
index 46875c9be..40687f5c1 100644
--- a/notification-manager/src/test/java/de/itvsh/kop/notification/antragsteller/AntragstellerNotificationEventListenerTest.java
+++ b/notification-manager/src/test/java/de/itvsh/kop/notification/antragsteller/AntragstellerNotificationEventListenerTest.java
@@ -48,5 +48,14 @@ class AntragstellerNotificationEventListenerTest {
 
 			verify(service).sendNotification(same(VORGANG));
 		}
+
+		@Test
+		void shouldNOTCallServiceOnMissingPostfach() {
+			when(vorgangService.getVorgang(any())).thenReturn(VorgangTestFactory.createBuilder().postfachId(null).build());
+
+			eventListener.onVorgangCreated(EVENT);
+
+			verify(service, never()).sendNotification(any());
+		}
 	}
 }
diff --git a/notification-manager/src/test/java/de/itvsh/kop/notification/command/CommandServiceTest.java b/notification-manager/src/test/java/de/itvsh/kop/notification/command/CommandServiceTest.java
index 9076b8f0b..8744f7a77 100644
--- a/notification-manager/src/test/java/de/itvsh/kop/notification/command/CommandServiceTest.java
+++ b/notification-manager/src/test/java/de/itvsh/kop/notification/command/CommandServiceTest.java
@@ -1,17 +1,44 @@
 package de.itvsh.kop.notification.command;
 
 import static org.assertj.core.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
 
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
 
 import de.itvsh.kop.notification.postfach.PostfachNachrichtTestFactory;
 
 class CommandServiceTest {
 
+	@Spy
 	@InjectMocks
 	private CommandService service;
+	@Mock
+	private CommandRemoteService remoteService;
+
+	@Nested
+	class TestCreateSendPostfachNachrichtCommnad {
+		@Test
+		void shouldBuildCommand() {
+			service.createSendPostfachNachrichtCommand(PostfachNachrichtTestFactory.create());
+
+			verify(service).buildCommand(notNull());
+		}
+
+		@Test
+		void shouldCallRemoteService() {
+			var command = CommandTestFactory.create();
+			doReturn(command).when(service).buildCommand(any());
+
+			service.createSendPostfachNachrichtCommand(PostfachNachrichtTestFactory.create());
+
+			verify(remoteService).createCommand(command);
+		}
+	}
 
 	@Nested
 	class TestToMap {
diff --git a/notification-manager/src/test/java/de/itvsh/kop/notification/postfach/PostfachNachrichtTestFactory.java b/notification-manager/src/test/java/de/itvsh/kop/notification/postfach/PostfachNachrichtTestFactory.java
index 125c9f907..85ad49c12 100644
--- a/notification-manager/src/test/java/de/itvsh/kop/notification/postfach/PostfachNachrichtTestFactory.java
+++ b/notification-manager/src/test/java/de/itvsh/kop/notification/postfach/PostfachNachrichtTestFactory.java
@@ -26,7 +26,8 @@ public class PostfachNachrichtTestFactory {
 				PostfachNachricht.FIELD_VORGANG_ID, VorgangTestFactory.ID,
 				PostfachNachricht.FIELD_POSTFACH_ID, VorgangTestFactory.POSTFACH_ID,
 				PostfachNachricht.FIELD_SUBJECT, SUBJECT,
-				PostfachNachricht.FIELD_MESSAGE, MESSAGE);
+				PostfachNachricht.FIELD_MESSAGE, MESSAGE,
+				PostfachNachricht.FIELD_REPLY_OPTION, PostfachNachricht.DEFAULT_REPLY_OPTION);
 
 	}
 
diff --git a/pluto-interface/pom.xml b/pluto-interface/pom.xml
index a738d2ea5..cd6163e1f 100644
--- a/pluto-interface/pom.xml
+++ b/pluto-interface/pom.xml
@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.common</groupId>
 		<artifactId>kop-common-dependencies</artifactId>
-		<version>1.1.2</version>
+		<version>1.1.3-SNAPSHOT</version>
 		<relativePath />
 	</parent>
 
diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml
index 39cb4c7eb..b062a14c5 100644
--- a/pluto-server/pom.xml
+++ b/pluto-server/pom.xml
@@ -49,6 +49,12 @@
 			<version>${project.version}</version>
 		</dependency>
 
+		<dependency>
+			<groupId>de.itvsh.kop.notification</groupId>
+			<artifactId>notification-manager</artifactId>
+			<version>${project.version}</version>
+			<scope>runtime</scope>
+		</dependency>
 
 		<!-- Spring -->
 		<dependency>
@@ -78,14 +84,14 @@
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-validation</artifactId>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.springframework.security</groupId>
 			<artifactId>spring-security-core</artifactId>
 		</dependency>
 		<dependency>
-		    <groupId>org.springframework.security</groupId>
-		    <artifactId>spring-security-config</artifactId>
+			<groupId>org.springframework.security</groupId>
+			<artifactId>spring-security-config</artifactId>
 		</dependency>
 
 		<!-- aspectJ -->
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemEventListener.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemEventListener.java
index 9d2c2b38a..ff6f0377a 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemEventListener.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemEventListener.java
@@ -16,8 +16,8 @@ class VorgangAttachedItemEventListener {
 	private static final String IS_CREATE_ITEM_ORDER_CONDITION = "{T(de.itvsh.ozg.pluto.attached_item.VorgangAttachedItemEventListener).IS_CREATE_ITEM_ORDER.test(event.getSource())}";
 	private static final String IS_UPDATE_ITEM_ORDER_CONDITION = "{T(de.itvsh.ozg.pluto.attached_item.VorgangAttachedItemEventListener).IS_UPDATE_ITEM_ORDER.test(event.getSource())}";
 
-	public static final Predicate<Command> IS_CREATE_ITEM_ORDER = command -> command.getOrder() == Order.CREATE_ATTACHED_ITEM;
-	public static final Predicate<Command> IS_UPDATE_ITEM_ORDER = command -> command.getOrder() == Order.UPDATE_ATTACHED_ITEM;
+	public static final Predicate<Command> IS_CREATE_ITEM_ORDER = command -> Order.CREATE_ATTACHED_ITEM.isMeant(command.getOrder());
+	public static final Predicate<Command> IS_UPDATE_ITEM_ORDER = command -> Order.UPDATE_ATTACHED_ITEM.isMeant(command.getOrder());
 
 	@Autowired
 	private VorgangAttachedItemService service;
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/Command.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/Command.java
index 34b656f2b..1c097b51d 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/Command.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/Command.java
@@ -37,7 +37,7 @@ public class Command {
 	private String relationId;
 	private long relationVersion;
 
-	private Order order;
+	private String order;
 
 	private Status previousStatus;
 	private String errorMessage;
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandService.java
index c20100699..2c5193e3f 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandService.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandService.java
@@ -12,6 +12,8 @@ import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
+import de.itvsh.ozg.pluto.common.callcontext.CallContextUser;
+import de.itvsh.ozg.pluto.common.callcontext.CurrentUserService;
 import de.itvsh.ozg.pluto.vorgang.Vorgang.Status;
 
 @Service
@@ -23,6 +25,9 @@ public class CommandService {
 	@Autowired
 	private ApplicationEventPublisher publisher;
 
+	@Autowired
+	private CurrentUserService userService;
+
 	public Command createCommand(CreateCommandRequest request) {
 		return createCommand(request, Optional.empty());
 	}
@@ -48,11 +53,15 @@ public class CommandService {
 
 		currentVorgangStatus.ifPresent(builder::previousStatus);
 
-		builder = addUserIfExists(builder, Optional.ofNullable(request.getCallContext().getUser()));
+		builder = addUserIfExists(builder, Optional.ofNullable(request.getCallContext()).map(CallContext::getUser), userService.findUser());
 		return builder.build();
 	}
 
-	private Command.CommandBuilder addUserIfExists(Command.CommandBuilder builder, Optional<User> user) {
+	private Command.CommandBuilder addUserIfExists(Command.CommandBuilder builder, Optional<User> user, Optional<CallContextUser> contextUser) {
+		if (contextUser.isPresent()) {
+			return builder.createdBy(contextUser.get().getUserId().orElse(null)).createdByName(contextUser.get().getUserName().orElse(null));
+		}
+
 		return user.map(u -> builder.createdBy(u.getId()).createdByName(u.getName())).orElse(builder);
 	}
 
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CreateCommandRequest.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CreateCommandRequest.java
index 20f44f722..0557061ca 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CreateCommandRequest.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CreateCommandRequest.java
@@ -27,7 +27,7 @@ public class CreateCommandRequest {
 	private Long relationVersion;
 
 	@NotNull
-	private Order order;
+	private String order;
 
 	private RedirectRequest redirectRequest;
 
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCommandResponseMapper.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCommandResponseMapper.java
index 289de5371..4128a1315 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCommandResponseMapper.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCommandResponseMapper.java
@@ -24,7 +24,14 @@ public interface GrpcCommandResponseMapper {
 	@Mapping(target = "unknownFields", ignore = true)
 	@Mapping(target = "allFields", ignore = true)
 	@Mapping(target = "messageParametersList", source = "messageParameters")
+	@Mapping(target = "command.orderString", source = "command.order")
 	GrpcCommandResponse toGrpc(CommandResponse response);
 
-	GrpcOrder orderMapping(Order order);
+	default GrpcOrder orderMapping(String order) {
+		try {
+			return GrpcOrder.valueOf(order);
+		} catch (IllegalArgumentException e) {
+			return GrpcOrder.UNDEFINED;
+		}
+	};
 }
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCommandService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCommandService.java
index c4ed34002..d6c1a95fb 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCommandService.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCommandService.java
@@ -58,26 +58,24 @@ public class GrpcCommandService extends CommandServiceImplBase {
 	}
 
 	private Optional<Status> getActualStatus(CreateCommandRequest request) {
-		if (isRelatedToVorgang(request.getOrder())) {
+		if (isStatusChangeOrder(request.getOrder())) {
 			return Optional.of(getVorgang(request.getRelationId()).getStatus());
 		} else {
 			return Optional.empty();
 		}
 	}
 
-	boolean isRelatedToVorgang(Order order) {
-		return order != Order.FORWARD_SUCCESSFULL
-				&& order != Order.FORWARD_FAILED
-				&& order != Order.RESEND_POSTFACH_MAIL
-				&& order != Order.UPDATE_ATTACHED_ITEM;
+	boolean isStatusChangeOrder(String order) {
+		return order.startsWith("VORGANG");
 	}
 
 	private Vorgang getVorgang(String vorgangId) {
 		return vorgangService.getById(vorgangId);
 	}
 
+	// TODO implement event/listener system
 	void executeOrder(Command command) {
-		Optional.ofNullable(StatusOrder.getOrderMethod(command.getOrder()))
+		StatusOrder.getOrderMethod(command.getOrder())
 				.ifPresent(orderMethod -> orderMethod.executeOrder(vorgangService, command));
 	}
 
@@ -146,7 +144,7 @@ public class GrpcCommandService extends CommandServiceImplBase {
 		return GrpcGetPendingCommandsResponse.newBuilder()
 				.addAllCommand(pendingCommands.stream()
 						.map(grpcCommandMapper::toGrpc)
-						.collect(Collectors.toList()))
+						.toList())
 				.build();
 	}
 
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestMapper.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestMapper.java
index c50fc53ef..a47a7c336 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestMapper.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestMapper.java
@@ -27,8 +27,17 @@ public interface GrpcCreateCommandRequestMapper {
 
 	@Mapping(target = "bodyObject", source = "bodyObj")
 	@Mapping(target = "body", source = "bodyList")
+	@Mapping(target = "order", expression = "java(mapOrder(grpcRequest))")
 	CreateCommandRequest fromGrpc(GrpcCreateCommandRequest grpcRequest);
 
+	default String mapOrder(GrpcCreateCommandRequest request) {
+		if (StringUtils.isBlank(request.getOrderString())) {
+			return map(request.getOrder()).name();
+		} else {
+			return request.getOrderString();
+		}
+	}
+
 	@ValueMapping(source = "UNRECOGNIZED", target = MappingConstants.NULL)
 	@ValueMapping(source = "UNDEFINED", target = MappingConstants.NULL)
 	Order map(GrpcOrder grpcOrder);
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/Order.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/Order.java
index 645fa4322..8e013b51a 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/Order.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/Order.java
@@ -1,5 +1,7 @@
 package de.itvsh.ozg.pluto.command;
 
+import org.apache.commons.lang3.StringUtils;
+
 public enum Order {
 
 	VORGANG_ANNEHMEN,
@@ -30,4 +32,8 @@ public enum Order {
 
 	CREATE_ATTACHED_ITEM,
 	UPDATE_ATTACHED_ITEM;
+
+	public boolean isMeant(String orderString) {
+		return StringUtils.equals(name(), orderString);
+	}
 }
\ No newline at end of file
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/PersistPostfachMailByCommandService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/PersistPostfachMailByCommandService.java
index 49bfc3de1..0b3ff7dd6 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/PersistPostfachMailByCommandService.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/PersistPostfachMailByCommandService.java
@@ -62,7 +62,7 @@ class PersistPostfachMailByCommandService implements PersistPostfachMailService
 				.callContext(buildCallContext(userId))
 				.vorgangId(mail.getVorgangId())
 				.relationId(mail.getVorgangId()).relationVersion(-1L)
-				.order(Order.CREATE_ATTACHED_ITEM)
+				.order(Order.CREATE_ATTACHED_ITEM.name())
 				.bodyObject(buildItem(mail))
 				.build());
 	}
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/StatusOrder.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/StatusOrder.java
index b8ecc8168..9c8fe81a3 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/StatusOrder.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/StatusOrder.java
@@ -1,5 +1,7 @@
 package de.itvsh.ozg.pluto.command;
 
+import java.util.Optional;
+
 import de.itvsh.ozg.pluto.vorgang.Vorgang;
 import de.itvsh.ozg.pluto.vorgang.VorgangService;
 import lombok.AllArgsConstructor;
@@ -39,7 +41,13 @@ enum StatusOrder {
 
 	private OrderMethod method;
 
-	static OrderMethod getOrderMethod(Order order) {
-		return StatusOrder.valueOf(order.name()).method;
+	/** @deprecated please implement event/listener */
+	@Deprecated
+	static Optional<OrderMethod> getOrderMethod(String order) {
+		try {
+			return Optional.ofNullable(StatusOrder.valueOf(order).method);
+		} catch (IllegalArgumentException e) {
+			return Optional.empty();
+		}
 	}
 }
\ No newline at end of file
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListener.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListener.java
index 3515f85dc..215f656bc 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListener.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListener.java
@@ -17,7 +17,7 @@ public class VorgangEventListener {
 
 	private static final String IS_ASSIGN_COMMAND_CONDITION = "{T(de.itvsh.ozg.pluto.vorgang.VorgangEventListener).IS_ASSIGN_COMMAND.test(event.getSource())}";
 
-	public static final Predicate<Command> IS_ASSIGN_COMMAND = command -> command.getOrder() == Order.ASSIGN_USER;
+	public static final Predicate<Command> IS_ASSIGN_COMMAND = command -> Order.ASSIGN_USER.isMeant(command.getOrder());
 
 	@Autowired
 	private VorgangService service;
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangService.java
index 712caaa4b..e03e58f54 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangService.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangService.java
@@ -17,6 +17,7 @@ import de.itvsh.ozg.pluto.clientattribute.ClientAttributeMap;
 import de.itvsh.ozg.pluto.clientattribute.ClientAttributeReadPermitted;
 import de.itvsh.ozg.pluto.clientattribute.ClientAttributesMap;
 import de.itvsh.ozg.pluto.command.Command;
+import de.itvsh.ozg.pluto.command.VorgangCreatedEvent;
 import de.itvsh.ozg.pluto.common.errorhandling.NotFoundException;
 import de.itvsh.ozg.pluto.vorgang.Vorgang.Status;
 import de.itvsh.ozg.pluto.vorgang.redirect.Forwarding;
@@ -83,7 +84,9 @@ public class VorgangService {
 	}
 
 	private void publishVorgangeCreatedEvent(Vorgang vorgang) {
-		publisher.publishEvent(new VorgangCreatedEvent(vorgang));
+		// TODO remove first event
+		publisher.publishEvent(new de.itvsh.ozg.pluto.vorgang.VorgangCreatedEvent(vorgang));
+		publisher.publishEvent(new VorgangCreatedEvent(vorgang.getId()));
 	}
 
 	public Vorgang setStatusNeu(Command command) {
diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListener.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListener.java
index 3e047ad02..e9e678eb9 100644
--- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListener.java
+++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListener.java
@@ -22,9 +22,9 @@ public class ForwardingEventListener {
 	private static final String IS_FORWARD_ORDER_CONDITION = "{T(de.itvsh.ozg.pluto.vorgang.redirect.ForwardingEventListener).IS_FORWARD_ORDER.test(event.getSource())}";
 
 	public static final Predicate<MailSendRequest> IS_REDIRECT_MAIL_REQ = req -> req.getRequestReference() instanceof Forwarding;
-	public static final Predicate<Command> IS_SUCCESSFULL_ORDER = command -> command.getOrder() == Order.FORWARD_SUCCESSFULL;
-	public static final Predicate<Command> IS_FAILED_ORDER = command -> command.getOrder() == Order.FORWARD_FAILED;
-	public static final Predicate<Command> IS_FORWARD_ORDER = command -> command.getOrder() == Order.REDIRECT_VORGANG;
+	public static final Predicate<Command> IS_SUCCESSFULL_ORDER = command -> Order.FORWARD_SUCCESSFULL.isMeant(command.getOrder());
+	public static final Predicate<Command> IS_FAILED_ORDER = command -> Order.FORWARD_FAILED.isMeant(command.getOrder());
+	public static final Predicate<Command> IS_FORWARD_ORDER = command -> Order.REDIRECT_VORGANG.isMeant(command.getOrder());
 
 	@Autowired
 	private ForwardingService service;
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemEventListenerITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemEventListenerITCase.java
index 972b19488..f3b839066 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemEventListenerITCase.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemEventListenerITCase.java
@@ -30,7 +30,7 @@ class VorgangAttachedItemEventListenerITCase {
 	class TestOnCreateItemCommand {
 		@Test
 		void shouldCallListener() {
-			var command = CommandTestFactory.createBuilder().order(Order.CREATE_ATTACHED_ITEM)
+			var command = CommandTestFactory.createBuilder().order(Order.CREATE_ATTACHED_ITEM.name())
 					.bodyObject(VorgangAttachedItemTestFactory.asMap()).build();
 			var event = CommandCreatedEventTestFactory.create(command);
 
@@ -44,7 +44,7 @@ class VorgangAttachedItemEventListenerITCase {
 	class TestOnUpdateItemCommand {
 		@Test
 		void shouldCallListener() {
-			var command = CommandTestFactory.createBuilder().order(Order.UPDATE_ATTACHED_ITEM)
+			var command = CommandTestFactory.createBuilder().order(Order.UPDATE_ATTACHED_ITEM.name())
 					.bodyObject(VorgangAttachedItemTestFactory.asMap()).build();
 			var event = CommandCreatedEventTestFactory.create(command);
 
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemITCase.java
index c8eb44098..593decd4b 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemITCase.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/attached_item/VorgangAttachedItemITCase.java
@@ -1,5 +1,6 @@
 package de.itvsh.ozg.pluto.attached_item;
 
+import static org.assertj.core.api.Assertions.*;
 import static org.junit.jupiter.api.Assertions.*;
 
 import java.util.HashMap;
@@ -14,8 +15,6 @@ import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.test.annotation.DirtiesContext;
 
-import static org.assertj.core.api.Assertions.*;
-
 import de.itvsh.kop.common.test.DataITCase;
 import de.itvsh.ozg.pluto.command.Command;
 import de.itvsh.ozg.pluto.command.CommandCreatedEvent;
@@ -53,7 +52,7 @@ class VorgangAttachedItemITCase {
 	@Nested
 	class TestCreateItem {
 
-		private Command command = CommandTestFactory.createBuilder().order(Order.CREATE_ATTACHED_ITEM)
+		private Command command = CommandTestFactory.createBuilder().order(Order.CREATE_ATTACHED_ITEM.name())
 				.bodyObject(VorgangAttachedItemTestFactory.asMap()).build();
 		private CommandCreatedEvent event = CommandCreatedEventTestFactory.create(command);
 
@@ -93,7 +92,7 @@ class VorgangAttachedItemITCase {
 			var bodyObjectMap = new HashMap<String, Object>(VorgangAttachedItemTestFactory.asMap());
 			bodyObjectMap.put(VorgangAttachedItem.MONGODB_FIELDNAME_ITEM, itemMap);
 
-			command = CommandTestFactory.createBuilder().order(Order.UPDATE_ATTACHED_ITEM).bodyObject(bodyObjectMap).build();
+			command = CommandTestFactory.createBuilder().order(Order.UPDATE_ATTACHED_ITEM.name()).bodyObject(bodyObjectMap).build();
 
 			event = CommandCreatedEventTestFactory.create(command);
 		}
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandITCase.java
index 78f37fd0e..7923f0f4f 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandITCase.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandITCase.java
@@ -1,5 +1,6 @@
 package de.itvsh.ozg.pluto.command;
 
+import static org.assertj.core.api.Assertions.*;
 import static org.junit.jupiter.api.Assertions.*;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -11,8 +12,6 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.test.annotation.DirtiesContext;
 
-import static org.assertj.core.api.Assertions.*;
-
 import de.itvsh.kop.common.test.DataITCase;
 import de.itvsh.ozg.pluto.attached_item.VorgangAttachedItem;
 import de.itvsh.ozg.pluto.attached_item.VorgangAttachedItemTestFactory;
@@ -153,7 +152,8 @@ class CommandITCase {
 				@BeforeEach
 				void prepareDatabase() {
 					mongoOperations.save(VorgangTestFactory.create());
-					mongoOperations.save(CommandTestFactory.createBuilder().order(Order.SEND_POSTFACH_MAIL).status(CommandStatus.PENDING).build());
+					mongoOperations
+							.save(CommandTestFactory.createBuilder().order(Order.SEND_POSTFACH_MAIL.name()).status(CommandStatus.PENDING).build());
 				}
 
 				@Test
@@ -313,7 +313,7 @@ class CommandITCase {
 				mongoOperations.save(VorgangTestFactory.createBuilder().status(Status.VERWORFEN).build());
 
 				mongoOperations.save(CommandTestFactory.createBuilder().relationId(VorgangTestFactory.ID)
-						.relationVersion(VorgangTestFactory.VERSION - 1).order(Order.VORGANG_VERWERFEN).build());
+						.relationVersion(VorgangTestFactory.VERSION - 1).order(Order.VORGANG_VERWERFEN.name()).build());
 			}
 
 			@Test
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandServiceTest.java
index cdd1fa8d9..4fdf601e1 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandServiceTest.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandServiceTest.java
@@ -20,12 +20,14 @@ import org.mockito.Spy;
 import org.springframework.context.ApplicationEventPublisher;
 
 import de.itvsh.ozg.pluto.common.callcontext.CallContextTestFactory;
+import de.itvsh.ozg.pluto.common.callcontext.CallContextUserTestFactory;
+import de.itvsh.ozg.pluto.common.callcontext.CurrentUserService;
 import de.itvsh.ozg.pluto.vorgang.Vorgang.Status;
 import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory;
 
 class CommandServiceTest {
 
-	@Spy // NOSONAR
+	@Spy
 	@InjectMocks
 	private CommandService service;
 
@@ -33,6 +35,8 @@ class CommandServiceTest {
 	private CommandRepository repository;
 	@Mock
 	private ApplicationEventPublisher publisher;
+	@Mock
+	private CurrentUserService currentUserService;
 
 	@Nested
 	class TestCreateCommand {
@@ -63,6 +67,49 @@ class CommandServiceTest {
 			assertThat(command.getPreviousStatus()).isEqualTo(Status.ANGENOMMEN);
 		}
 
+		@Test
+		void shouldHandleMissingCallContext() {
+			var request = CreateCommandRequestTestFactory.createBuilder().callContext(null).build();
+
+			var command = service.createCommand(request, Optional.of(Status.ANGENOMMEN));
+
+			assertThat(command).isNotNull();
+		}
+
+		@Nested
+		class ShouldAddUser {
+
+			@Test
+			void fromCallContext() {
+				when(currentUserService.findUser()).thenReturn(Optional.empty());
+
+				var command = service.createCommand(request, Optional.of(Status.ANGENOMMEN));
+
+				assertThat(command.getCreatedBy()).isEqualTo(UserTestFactory.ID);
+			}
+
+			@Test
+			void fromUserService() {
+				var request = CreateCommandRequestTestFactory.createBuilder().callContext(null).build();
+				when(currentUserService.findUser()).thenReturn(Optional.of(CallContextUserTestFactory.create()));
+
+				var command = service.createCommand(request, Optional.of(Status.ANGENOMMEN));
+
+				assertThat(command.getCreatedBy()).isEqualTo(UserTestFactory.ID);
+			}
+
+			@Test
+			void ifBothArePresentFromUserService() {
+				when(currentUserService.findUser())
+						.thenReturn(Optional.of(CallContextUserTestFactory.createBuilder().userId(Optional.of("other")).build()));
+
+				var command = service.createCommand(request, Optional.of(Status.ANGENOMMEN));
+
+				assertThat(command.getCreatedBy()).isEqualTo("other");
+			}
+
+		}
+
 		@Test
 		void shouldHandleEmptyUser() {
 			var request = CreateCommandRequestTestFactory.createBuilder().callContext(CallContextTestFactory.createBuilder().user(null).build())
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java
index 3f16352fd..6f1feca03 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java
@@ -36,6 +36,6 @@ public class CommandTestFactory {
 				.relationId(RELATION_ID)
 				.relationVersion(RELATION_VERSION)
 				.previousStatus(PREV_STATUS)
-				.order(ORDER);
+				.order(ORDER.name());
 	}
 }
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CreateCommandRequestTestFactory.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CreateCommandRequestTestFactory.java
index bcf0d8767..bb8cb428c 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CreateCommandRequestTestFactory.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CreateCommandRequestTestFactory.java
@@ -18,7 +18,7 @@ public class CreateCommandRequestTestFactory {
 		return CreateCommandRequest.builder()
 				.callContext(CALLCONTEXT)
 				.relationId(RELATION_ID)
-				.order(ORDER)
+				.order(ORDER.name())
 				.relationVersion(RELATION_VERSION);
 	}
 }
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCommandMapperTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCommandMapperTest.java
index 288c7e27c..8e583c5ad 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCommandMapperTest.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCommandMapperTest.java
@@ -17,9 +17,7 @@ class GrpcCommandMapperTest {
 
 		@Test
 		void shouldMap() {
-			Command command = CommandTestFactory.create();
-
-			GrpcCommand grpcCommand = mapper.toGrpc(command);
+			GrpcCommand grpcCommand = mapper.toGrpc(CommandTestFactory.create());
 
 			assertThat(grpcCommand.getId()).isEqualTo(CommandTestFactory.ID);
 			assertThat(grpcCommand.getCreatedAt()).isEqualTo(CommandTestFactory.CREATED_AT_STR);
@@ -28,5 +26,6 @@ class GrpcCommandMapperTest {
 			assertThat(grpcCommand.getRelationId()).isEqualTo(CommandTestFactory.RELATION_ID);
 			assertThat(grpcCommand.getOrder()).isNotNull();
 		}
+
 	}
 }
\ No newline at end of file
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCommandServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCommandServiceTest.java
index 791ff31cb..5c04e64ba 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCommandServiceTest.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCommandServiceTest.java
@@ -1,5 +1,6 @@
 package de.itvsh.ozg.pluto.command;
 
+import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
@@ -21,8 +22,6 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
-import static org.assertj.core.api.Assertions.*;
-
 import de.itvsh.ozg.pluto.common.security.PolicyService;
 import de.itvsh.ozg.pluto.grpc.command.GrpcCommand;
 import de.itvsh.ozg.pluto.grpc.command.GrpcCommandResponse;
@@ -119,22 +118,24 @@ class GrpcCommandServiceTest {
 	}
 
 	@Nested
-	class TestIsRelatedToVorgang {
+	class TestIsStatusChangeOrder {
 
 		@ParameterizedTest
-		@EnumSource(mode = Mode.INCLUDE, names = { "FORWARD_SUCCESSFULL", "FORWARD_FAILED", "RESEND_POSTFACH_MAIL", "UPDATE_ATTACHED_ITEM" })
-		void shouldReturnFalse(Order order) {
-			var result = service.isRelatedToVorgang(order);
+		@EnumSource(mode = Mode.INCLUDE, names = { "VORGANG_ANNEHMEN", "VORGANG_VERWERFEN", "VORGANG_ZURUECKHOLEN", "VORGANG_BEARBEITEN",
+				"VORGANG_BESCHEIDEN", "VORGANG_ZURUECKSTELLEN", "VORGANG_ABSCHLIESSEN", "VORGANG_WIEDEREROEFFNEN" })
+		void shouldReturnTrue(Order order) {
+			var result = service.isStatusChangeOrder(order.name());
 
-			assertThat(result).isFalse();
+			assertThat(result).isTrue();
 		}
 
 		@ParameterizedTest
-		@EnumSource(mode = Mode.EXCLUDE, names = { "FORWARD_SUCCESSFULL", "FORWARD_FAILED", "RESEND_POSTFACH_MAIL", "UPDATE_ATTACHED_ITEM" })
-		void shouldReturnTrue(Order order) {
-			var result = service.isRelatedToVorgang(order);
+		@EnumSource(mode = Mode.EXCLUDE, names = { "VORGANG_ANNEHMEN", "VORGANG_VERWERFEN", "VORGANG_ZURUECKHOLEN", "VORGANG_BEARBEITEN",
+				"VORGANG_BESCHEIDEN", "VORGANG_ZURUECKSTELLEN", "VORGANG_ABSCHLIESSEN", "VORGANG_WIEDEREROEFFNEN" })
+		void shouldReturnFalse(Order order) {
+			var result = service.isStatusChangeOrder(order.name());
 
-			assertThat(result).isTrue();
+			assertThat(result).isFalse();
 		}
 	}
 
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestMapperTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestMapperTest.java
index 37b18a13b..d80851280 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestMapperTest.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestMapperTest.java
@@ -78,14 +78,26 @@ class GrpcCreateCommandRequestMapperTest {
 			assertThat(request.getRelationId()).isEqualTo(GrpcCreateCommandRequestTestFactory.RELATION_ID);
 		}
 
-		@Test
-		void shouldMapOrder() {
+		@Nested
+		class shouldMapOrder {
 
-			GrpcCreateCommandRequest grpcRequest = GrpcCreateCommandRequestTestFactory.create();
+			@Test
+			void fromOrderStringField() {
+				GrpcCreateCommandRequest grpcRequest = GrpcCreateCommandRequestTestFactory.createBuilder().clearOrder().build();
 
-			CreateCommandRequest request = mapper.fromGrpc(grpcRequest);
+				CreateCommandRequest request = mapper.fromGrpc(grpcRequest);
 
-			assertThat(request.getOrder().name()).isEqualTo(GrpcCreateCommandRequestTestFactory.ORDER.name());
+				assertThat(request.getOrder()).isEqualTo(GrpcCreateCommandRequestTestFactory.ORDER.name());
+			}
+
+			@Test
+			void fromOrderField() {
+				GrpcCreateCommandRequest grpcRequest = GrpcCreateCommandRequestTestFactory.createBuilder().clearOrderString().build();
+
+				CreateCommandRequest request = mapper.fromGrpc(grpcRequest);
+
+				assertThat(request.getOrder()).isEqualTo(GrpcCreateCommandRequestTestFactory.ORDER.name());
+			}
 		}
 	}
 }
\ No newline at end of file
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestTestFactory.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestTestFactory.java
index e282941cc..479731db4 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestTestFactory.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/GrpcCreateCommandRequestTestFactory.java
@@ -21,6 +21,7 @@ public class GrpcCreateCommandRequestTestFactory {
 				.setCallContext(CALLCONTEXT)
 				.setRelationId(RELATION_ID)
 				.setOrder(ORDER)
+				.setOrderString(ORDER.name())
 				.setRelationVersion(RELATION_VERSION)
 				.setVorgangId(VorgangTestFactory.ID);
 	}
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/PersistPostfachMailByCommandServiceITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/PersistPostfachMailByCommandServiceITCase.java
index d73dcb0d9..26fb29ba9 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/PersistPostfachMailByCommandServiceITCase.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/PersistPostfachMailByCommandServiceITCase.java
@@ -1,5 +1,6 @@
 package de.itvsh.ozg.pluto.command;
 
+import static org.assertj.core.api.Assertions.*;
 import static org.junit.jupiter.api.Assertions.*;
 
 import java.util.Collections;
@@ -15,8 +16,6 @@ import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.test.context.support.WithMockUser;
 
-import static org.assertj.core.api.Assertions.*;
-
 import de.itvsh.kop.common.test.DataITCase;
 import de.itvsh.ozg.mail.postfach.PostfachMailTestFactory;
 import de.itvsh.ozg.pluto.attached_item.VorgangAttachedItem;
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListenerTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListenerTest.java
index 074a00933..7eb716343 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListenerTest.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListenerTest.java
@@ -12,7 +12,7 @@ import de.itvsh.ozg.pluto.vorgang.redirect.VorgangRedirectedEventTestFactory;
 
 class VorgangEventListenerTest {
 
-	@InjectMocks // NOSONAR
+	@InjectMocks
 	private VorgangEventListener listener;
 
 	@Mock
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListenerITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListenerITCase.java
index fb06c6da4..ff69c6f93 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListenerITCase.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListenerITCase.java
@@ -38,7 +38,7 @@ class ForwardingEventListenerITCase {
 	class TestForwardVorgang {
 		@Test
 		void shouldCallForwardingService() {
-			var command = CommandTestFactory.createBuilder().order(Order.REDIRECT_VORGANG).build();
+			var command = CommandTestFactory.createBuilder().order(Order.REDIRECT_VORGANG.name()).build();
 
 			publisher.publishEvent(CommandCreatedEventTestFactory.create(command));
 
@@ -61,7 +61,7 @@ class ForwardingEventListenerITCase {
 		@ParameterizedTest
 		@EnumSource(mode = Mode.EXCLUDE, names = { "REDIRECT_VORGANG" })
 		void shouldNOTCallServiceOnAnyOtherOrder(Order order) {
-			Command command = CommandTestFactory.createBuilder().order(order).build();
+			Command command = CommandTestFactory.createBuilder().order(order.name()).build();
 
 			publisher.publishEvent(MailSentEventTestFactory.create(command));
 
@@ -73,7 +73,7 @@ class ForwardingEventListenerITCase {
 	class CommandCreatedEvent {
 		@Test
 		void shouldCallForwardingService() {
-			var command = CommandTestFactory.createBuilder().order(Order.FORWARD_SUCCESSFULL).build();
+			var command = CommandTestFactory.createBuilder().order(Order.FORWARD_SUCCESSFULL.name()).build();
 
 			publisher.publishEvent(CommandCreatedEventTestFactory.create(command));
 
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListenerTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListenerTest.java
index 3126553a1..91e165aae 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListenerTest.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/redirect/ForwardingEventListenerTest.java
@@ -39,7 +39,7 @@ class ForwardingEventListenerTest {
 
 		@Test
 		void shouldCallService() {
-			Command command = CommandTestFactory.createBuilder().order(Order.FORWARD_SUCCESSFULL).build();
+			Command command = CommandTestFactory.createBuilder().order(Order.FORWARD_SUCCESSFULL.name()).build();
 
 			listener.markAsSuccessfull(CommandCreatedEventTestFactory.create(command));
 
@@ -53,7 +53,7 @@ class ForwardingEventListenerTest {
 
 		@Test
 		void shouldCallService() {
-			Command command = CommandTestFactory.createBuilder().order(Order.FORWARD_FAILED).build();
+			Command command = CommandTestFactory.createBuilder().order(Order.FORWARD_FAILED.name()).build();
 
 			listener.markAsFailed(CommandCreatedEventTestFactory.create(command));
 
-- 
GitLab