Skip to content
Snippets Groups Projects
Commit 1b3f3438 authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'OZG-5398 Bescheid-Ergebnis als ClientAttribute ablegen'...

Merge pull request 'OZG-5398 Bescheid-Ergebnis als ClientAttribute ablegen' (#344) from OZG-5398-bescheid-ergebnis-al-ClientAttribute-ablegen into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/vorgang-manager/pulls/344


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents 32f48c0e c386a7a7
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,7 @@ import org.springframework.stereotype.Service;
import de.ozgcloud.bescheid.attacheditem.AttachedItem;
import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
import de.ozgcloud.bescheid.attributes.ClientAttributeService;
import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
import de.ozgcloud.bescheid.nachricht.NachrichtService;
import de.ozgcloud.bescheid.vorgang.Vorgang;
......@@ -32,6 +33,7 @@ class BescheidService {
private final AttachedItemService attachedItemService;
private final NachrichtService nachrichtService;
private final CurrentUserService currentUserService;
private final ClientAttributeService bescheidClientAttributeService;
private final Optional<BescheidRemoteService> remoteService;
@PostConstruct
......@@ -113,7 +115,7 @@ class BescheidService {
Bescheid buildBescheid(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto) {
return Bescheid.builder()
.vorgangId(VorgangId.from(bescheidItem.getVorgangId()))
.genehmigt(MapUtils.getBoolean(bescheidItem.getItem(), Bescheid.FIELD_BEWILLIGT))
.genehmigt(getBewilligt(bescheidItem))
.bescheidFileId(FileId.from(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT)))
.nachrichtSubject(Optional.ofNullable(getNachrichtSubject(bescheidItem)))
.nachrichtText(Optional.ofNullable(getNachrichtText(bescheidItem)))
......@@ -139,6 +141,11 @@ class BescheidService {
attachedItemService.patch(setBescheidDraftStatus(item));
throw e;
}
bescheidClientAttributeService.setAntragResult(bescheidItem.getVorgangId(), getBewilligt(bescheidItem));
}
boolean getBewilligt(AttachedItem bescheidItem) {
return MapUtils.getBooleanValue(bescheidItem.getItem(), Bescheid.FIELD_BEWILLIGT, false);
}
AttachedItem setBescheidSendStatus(AttachedItem bescheidItem) {
......
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.bescheid.attributes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub;
import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcAccessPermission;
import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute;
import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttributeValue;
import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest;
import io.grpc.ClientInterceptor;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service("bescheid_ClientAttributeRemoteService")
class ClientAttributeRemoteService {
@GrpcClient("vorgang-manager")
private ClientAttributeServiceBlockingStub serviceBlockingStub;
@Autowired
private ClientInterceptor bescheidCallContextInterceptor;
public void setBooleanReadOnlyClientAttribute(String vorgangId, String attributeName, boolean value) {
serviceBlockingStub.withInterceptors(bescheidCallContextInterceptor).set(buildRequest(vorgangId, attributeName, value));
}
GrpcSetClientAttributeRequest buildRequest(String vorgangId, String attributeName, boolean value) {
return GrpcSetClientAttributeRequest.newBuilder()
.setVorgangId(vorgangId)
.setAttribute(buildClientAttribute(attributeName, value))
.build();
}
GrpcClientAttribute buildClientAttribute(String attributeName, boolean value) {
return GrpcClientAttribute.newBuilder()
.setClientName(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME)
.setAccess(GrpcAccessPermission.READ_ONLY)
.setAttributeName(attributeName)
.setValue(GrpcClientAttributeValue.newBuilder().setBoolValue(value).build())
.build();
}
}
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.bescheid.attributes;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
@Service("bescheid_ClientAttributeService")
@RequiredArgsConstructor
public class ClientAttributeService {
public static final String ATTRIBUTE_NAME_ANTRAG_BEWILLIGT = "ANTRAG_BEWILLIGT";
private final ClientAttributeRemoteService bescheidClientAttributeRemoteService;
public void setAntragResult(String vorgangId, boolean antragResult) {
bescheidClientAttributeRemoteService.setBooleanReadOnlyClientAttribute(vorgangId, ATTRIBUTE_NAME_ANTRAG_BEWILLIGT, antragResult);
}
}
......@@ -25,6 +25,7 @@ import org.springframework.test.util.ReflectionTestUtils;
import de.ozgcloud.bescheid.attacheditem.AttachedItem;
import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
import de.ozgcloud.bescheid.attacheditem.AttachedItemTestFactory;
import de.ozgcloud.bescheid.attributes.ClientAttributeService;
import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
import de.ozgcloud.bescheid.common.callcontext.UserProfile;
import de.ozgcloud.bescheid.nachricht.NachrichtService;
......@@ -54,6 +55,8 @@ class BescheidServiceTest {
private CurrentUserService currentUserService;
@Mock
private UserProfile callContextUser;
@Mock
private ClientAttributeService clientAttributeService;
@BeforeEach
void init() {
......@@ -371,8 +374,17 @@ class BescheidServiceTest {
assertThat(result.getVorgangId()).hasToString(CommandTestFactory.VORGANG_ID);
}
@Test
void shouldCallGetBewilligt() {
buildBescheid();
verify(service).getBewilligt(BESCHEID_ITEM);
}
@Test
void shouldSetGenehmigt() {
doReturn(true).when(service).getBewilligt(any());
var result = buildBescheid();
assertThat(result.isGenehmigt()).isTrue();
......@@ -514,11 +526,49 @@ class BescheidServiceTest {
verify(attachedItemService).patch(bescheidSendItem);
}
@Test
void shouldCallGetBewilligt() {
sendBescheid();
verify(service).getBewilligt(bescheidItem);
}
@Test
void shouldCallClientAttributeService() {
doReturn(true).when(service).getBewilligt(any());
sendBescheid();
verify(clientAttributeService).setAntragResult(CommandTestFactory.VORGANG_ID, true);
}
private void sendBescheid() {
service.sendBescheid(bescheidItem);
}
}
@Nested
class TestGetBewilligt {
@Test
void shouldReturnBewilligt() {
var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_BEWILLIGT, true).build();
var result = service.getBewilligt(bescheidItem);
assertThat(result).isTrue();
}
@Test
void shouldReturnDefault() {
var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().build();
var result = service.getBewilligt(bescheidItem);
assertThat(result).isFalse();
}
}
@Nested
class TestSetBescheidSendStatus {
......
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.bescheid.attributes;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor;
import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub;
import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcAccessPermission;
import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute;
import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest;
class ClientAttributeRemoteServiceTest {
private static final String VORGANG_ID = "vorgangId";
private static final String ATTRIBUTE_NAME = "attributeName";
@Spy
@InjectMocks
private ClientAttributeRemoteService service;
@Mock
private ClientAttributeServiceBlockingStub serviceBlockingStub;
@Mock
private BescheidCallContextAttachingInterceptor bescheidCallContextInterceptor;
@Nested
class TestSetBooleanReadOnlyClientAttribute {
@Captor
private ArgumentCaptor<BescheidCallContextAttachingInterceptor> interceptorCaptor;
@BeforeEach
void setUp() {
when(serviceBlockingStub.withInterceptors(any())).thenReturn(serviceBlockingStub);
}
@Test
void shouldSetInterceptors() {
service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true);
verify(serviceBlockingStub).withInterceptors(interceptorCaptor.capture());
assertThat(interceptorCaptor.getValue()).isEqualTo(bescheidCallContextInterceptor);
}
@Test
void shouldCallBuildRequest() {
service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true);
verify(service).buildRequest(VORGANG_ID, ATTRIBUTE_NAME, true);
}
@Test
void shouldCallSetMethod() {
var request = GrpcSetClientAttributeRequest.newBuilder().build();
doReturn(request).when(service).buildRequest(any(), any(), anyBoolean());
service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true);
verify(serviceBlockingStub).set(request);
}
}
@Nested
class TestBuildRequest {
@Mock
private GrpcClientAttribute clientAttribute;
@Test
void shouldSetVorgangId() {
var result = buildRequest();
assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID);
}
@Test
void shouldCallBuildClientAttribute() {
buildRequest();
verify(service).buildClientAttribute(ATTRIBUTE_NAME, true);
}
@Test
void shouldSetClientAttribute() {
doReturn(clientAttribute).when(service).buildClientAttribute(any(), anyBoolean());
var result = buildRequest();
assertThat(result.getAttribute()).isEqualTo(clientAttribute);
}
private GrpcSetClientAttributeRequest buildRequest() {
return service.buildRequest(VORGANG_ID, ATTRIBUTE_NAME, true);
}
}
@Nested
class TestBuildClientAttribute {
@Test
void shouldSetClientName() {
var result = service.buildClientAttribute(ATTRIBUTE_NAME, true);
assertThat(result.getClientName()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
}
@Test
void shouldSetAccess() {
var result = service.buildClientAttribute(ATTRIBUTE_NAME, true);
assertThat(result.getAccess()).isEqualTo(GrpcAccessPermission.READ_ONLY);
}
@Test
void shouldSetAttributeName() {
var result = service.buildClientAttribute(ATTRIBUTE_NAME, true);
assertThat(result.getAttributeName()).isEqualTo(ATTRIBUTE_NAME);
}
@Test
void shouldSetValue() {
var result = service.buildClientAttribute(ATTRIBUTE_NAME, true);
assertThat(result.getValue().getBoolValue()).isTrue();
}
}
}
\ No newline at end of file
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.bescheid.attributes;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
class ClientAttributeServiceTest {
@InjectMocks
private ClientAttributeService service;
@Mock
private ClientAttributeRemoteService remoteService;
@Test
void shouldCallRemoteService() {
var vorgangId = "vorgangId";
service.setAntragResult(vorgangId, true);
verify(remoteService).setBooleanReadOnlyClientAttribute(vorgangId, ClientAttributeService.ATTRIBUTE_NAME_ANTRAG_BEWILLIGT, true);
}
}
\ No newline at end of file
......@@ -54,7 +54,9 @@ import de.ozgcloud.bescheid.attacheditem.AttachedItemService;
import de.ozgcloud.bescheid.common.callcontext.CallContextUser;
import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
import de.ozgcloud.bescheid.common.callcontext.UserProfile;
import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandCreatedEvent;
import de.ozgcloud.command.CommandStatus;
import de.ozgcloud.common.test.DataITCase;
import de.ozgcloud.document.BescheidDocumentCreatedEvent;
import de.ozgcloud.document.Document;
......@@ -62,7 +64,9 @@ import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
import de.ozgcloud.vorgang.VorgangManagerServerApplication;
import de.ozgcloud.vorgang.attached_item.VorgangAttachedItem;
import de.ozgcloud.vorgang.attached_item.VorgangAttachedItemTestFactory;
import de.ozgcloud.vorgang.command.CommandService;
import de.ozgcloud.vorgang.command.CommandTestFactory;
import de.ozgcloud.vorgang.command.CreateCommandRequest;
import de.ozgcloud.vorgang.status.StatusChangedEvent;
import de.ozgcloud.vorgang.vorgang.Vorgang;
import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
......@@ -80,6 +84,8 @@ import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
@DirtiesContext
class BescheidEventListenerITCase {
@Autowired
private CommandService commandService;
@Autowired
private ApplicationEventPublisher eventPublisher;
@SpyBean
......@@ -255,6 +261,19 @@ class BescheidEventListenerITCase {
when(userProfile.getId()).thenReturn(UserId.from("user-id"));
}
@Test
void shouldSuccessfullyCompleteCommand() {
var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
var bescheidItem = mongoOperations.save(createBescheidAttachedItemWithDocument(vorgangId));
commandService.createCommand(buildCreateCommandRequest(vorgangId, bescheidItem));
await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
verify(bescheiTestEventListener).onBescheidSentEvent(bescheidSentEventCaptor.capture());
assertThat(loadCommand(bescheidSentEventCaptor.getValue().getSource()).getStatus()).isEqualTo(CommandStatus.FINISHED);
});
}
@Test
void shouldSetBescheidStatusToSent() {
var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
......@@ -272,12 +291,12 @@ class BescheidEventListenerITCase {
void shouldSetVorgangStatusToBeschieden() {
var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
var bescheidItem = mongoOperations.save(createBescheidAttachedItemWithDocument(vorgangId));
var event = buildCommandCreatedEvent(vorgangId, bescheidItem);
eventPublisher.publishEvent(event);
commandService.createCommand(buildCreateCommandRequest(vorgangId, bescheidItem));
await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
verify(bescheiTestEventListener, atLeastOnce()).onBescheidStatusChangedEvent(statusChangedEventCaptor.capture());
verify(bescheiTestEventListener).onBescheidStatusChangedEvent(statusChangedEventCaptor.capture());
assertThat(loadCommand(statusChangedEventCaptor.getValue().getSource()).getStatus()).isEqualTo(CommandStatus.FINISHED);
assertThat(loadVorgang(vorgangId).getStatus()).isEqualTo(Vorgang.Status.BESCHIEDEN);
});
}
......@@ -286,18 +305,34 @@ class BescheidEventListenerITCase {
void shouldSaveNachrichtDraft() {
var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
var bescheidItem = mongoOperations.save(createBescheidAttachedItemWithDocument(vorgangId));
var event = buildCommandCreatedEvent(vorgangId, bescheidItem);
eventPublisher.publishEvent(event);
commandService.createCommand(buildCreateCommandRequest(vorgangId, bescheidItem));
await().atMost(60, TimeUnit.SECONDS).untilAsserted(() -> {
verify(bescheiTestEventListener).onBescheidStatusChangedEvent(statusChangedEventCaptor.capture());
await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
verify(bescheiTestEventListener).onBescheidSentEvent(bescheidSentEventCaptor.capture());
assertThat(loadCommand(bescheidSentEventCaptor.getValue().getSource()).getStatus()).isEqualTo(CommandStatus.FINISHED);
var nachrichtDraft = loadNachricht(vorgangId);
assertThat(nachrichtDraft.getItem()).containsEntry(PostfachNachricht.FIELD_SUBJECT, NACHRICHT_SUBJECT);
assertThat(nachrichtDraft.getItem()).containsEntry(PostfachNachricht.FIELD_MAIL_BODY, NACHRICHT_TEXT);
});
}
@Test
void shouldSetClientAttribute() {
var vorgangId = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build()).getId();
var bescheidItem = mongoOperations.save(createBescheidAttachedItemWithDocument(vorgangId));
commandService.createCommand(buildCreateCommandRequest(vorgangId, bescheidItem));
await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> {
verify(bescheiTestEventListener).onBescheidSentEvent(bescheidSentEventCaptor.capture());
assertThat(loadCommand(bescheidSentEventCaptor.getValue().getSource()).getStatus()).isEqualTo(CommandStatus.FINISHED);
var vorgang = loadVorgang(vorgangId);
assertThat(vorgang.getClientAttributes()).containsKey(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME);
});
}
private VorgangAttachedItem createBescheidAttachedItemWithDocument(String vorgangId) {
return VorgangAttachedItemTestFactory.createBuilder()
.id(null)
......@@ -326,6 +361,21 @@ class BescheidEventListenerITCase {
return new CommandCreatedEvent(command);
}
private CreateCommandRequest buildCreateCommandRequest(String vorgangId, VorgangAttachedItem bescheidItem) {
return CreateCommandRequest.builder()
.vorgangId(vorgangId)
.relationId(bescheidItem.getId())
.relationVersion(bescheidItem.getVersion())
.order(SEND_POSTFACH_MAIL_ORDER)
.bodyObject(Map.of(BESCHEID_VOM_BODYKEY, "2024-01-01",
GENEHMIGT_BODYKEY, true))
.build();
}
private Command loadCommand(String commandId) {
return mongoOperations.findById(commandId, Command.class);
}
private VorgangAttachedItem loadBescheid(String bescheidId) {
return mongoOperations.findById(bescheidId, VorgangAttachedItem.class);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment