diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java index 3e358b16a88944b3a0f97f611e935c65396f03d8..c7cf947305a114f2bec9c065a5d4b88212c48640 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java @@ -1,10 +1,14 @@ package de.ozgcloud.bescheid; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.stream.Stream; import jakarta.annotation.PostConstruct; @@ -41,11 +45,11 @@ class BescheidService { private static final String ERROR_MESSAGE_NO_SERVICE = "No Bescheid Endpoint is configured."; static final String VORGANG_BESCHEIDEN_ORDER = "VORGANG_BESCHEIDEN"; static final String SUBCOMMANDS_EXECUTION_MODE = "PARALLEL"; + static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT"; private final VorgangService vorgangService; private final AttachedItemService attachedItemService; - private final NachrichtService nachrichtService; - private final UserProfileService currentUserService; + private final UserProfileService userProfileService; @Qualifier("bescheid_OzgCloudCommandService") private final OzgCloudCommandService commandService; private final CommandMapper commandMapper; @@ -86,8 +90,9 @@ class BescheidService { public void sendBescheidManually(AttachedItem bescheidItem, Command parentCommand) { validateBescheidSendManually(bescheidItem, parentCommand.getRelationVersion()); - var subCommands = buildSendBescheidManuallySubCommands(bescheidItem); - setBescheidSent(bescheidItem, buildCreateSubCommandsRequest(parentCommand.getId(), subCommands)); + var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); + var subCommands = buildSetBescheidSentSubCommands(bescheidItem, vorgang, getUserId()); + commandService.addSubCommands(buildCreateSubCommandsRequest(parentCommand.getId(), subCommands)); } void validateBescheidSendManually(AttachedItem bescheidItem, long version) { @@ -100,8 +105,15 @@ class BescheidService { public void sendBescheidPostfachMail(AttachedItem bescheidItem, Command parentCommand) { validateBescheidSendPostfach(bescheidItem, parentCommand.getRelationVersion()); - var subCommands = buildSendBescheidPostfachMailSubCommands(bescheidItem); - setBescheidSent(bescheidItem, buildCreateSubCommandsRequest(parentCommand.getId(), subCommands)); + var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); + var userId = getUserId(); + var subCommands = buildSetBescheidSentSubCommands(bescheidItem, vorgang, userId); + subCommands.add(buildSendPostfachNachrichtCommand(bescheidItem, vorgang.getServiceKonto(), userId)); + commandService.addSubCommands(buildCreateSubCommandsRequest(parentCommand.getId(), subCommands)); + } + + String getUserId() { + return userProfileService.getUserProfile().getId().toString(); } public void validateBescheidSendPostfach(AttachedItem bescheidItem, long version) { @@ -131,19 +143,6 @@ class BescheidService { } } - Bescheid buildBescheid(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto) { - return Bescheid.builder() - .vorgangId(VorgangId.from(bescheidItem.getVorgangId())) - .genehmigt(getBewilligt(bescheidItem)) - .bescheidFileId(getBescheidFileId(bescheidItem)) - .nachrichtSubject(Optional.ofNullable(getNachrichtSubject(bescheidItem))) - .nachrichtText(Optional.ofNullable(getNachrichtText(bescheidItem))) - .createdBy(currentUserService.getUserProfile().getId()) - .serviceKonto(serviceKonto) - .attachments(getAttachments(bescheidItem)) - .build(); - } - FileId getBescheidFileId(AttachedItem bescheidItem) { var bescheidDocument = attachedItemService.getItem(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT)); return FileId.from(MapUtils.getString(bescheidDocument.getItem(), Document.FIELD_DOCUMENT_FILE)); @@ -172,21 +171,76 @@ class BescheidService { return Collections.emptyList(); } - List<OzgCloudCommand> buildSendBescheidPostfachMailSubCommands(AttachedItem bescheidItem) { - var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); - var commands = new ArrayList<>(buildSendBescheidSubCommands(bescheidItem, vorgang)); - commands.add(nachrichtService.buildSendBescheidCommand(buildBescheid(bescheidItem, vorgang.getServiceKonto()))); - return Collections.unmodifiableList(commands); + List<OzgCloudCommand> buildSetBescheidSentSubCommands(AttachedItem bescheidItem, Vorgang vorgang, String userId) { + var subCommands = new ArrayList<OzgCloudCommand>(); + subCommands.add(buildVorgangBescheidenCommand(vorgang)); + subCommands.add(buildSetBescheidSentStatusCommand(bescheidItem, userId)); + return subCommands; } - List<OzgCloudCommand> buildSendBescheidManuallySubCommands(AttachedItem bescheidItem) { - var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); - return buildSendBescheidSubCommands(bescheidItem, vorgang); + OzgCloudCommand buildVorgangBescheidenCommand(Vorgang vorgang) { + return OzgCloudCommand.builder() + .vorgangId(commandMapper.toOzgCloudVorgangId(vorgang.getId().toString())) + .relationId(commandMapper.mapRelationId(vorgang.getId().toString())) + .relationVersion(vorgang.getVersion()) + .order(VORGANG_BESCHEIDEN_ORDER) + .build(); } - List<OzgCloudCommand> buildSendBescheidSubCommands(AttachedItem bescheidItem, Vorgang vorgang) { - return List.of(vorgangService.buildVorgangBescheidenCommand(vorgang), - attachedItemService.buildSetBescheidSentStatusCommand(bescheidItem.getId(), bescheidItem.getVersion())) + OzgCloudCommand buildSetBescheidSentStatusCommand(AttachedItem bescheidItem, String userId) { + return OzgCloudCommand.builder() + .relationId(commandMapper.mapRelationId(bescheidItem.getId())) + .relationVersion(bescheidItem.getVersion()) + .order(AttachedItemService.PATCH_ATTACHED_ITEM) + .bodyObject(Map.of( + AttachedItem.PROPERTY_ID, bescheidItem.getId(), + AttachedItem.PROPERTY_ITEM, buildBescheidSentStatusItem(userId))) + .build(); + } + + Map<String, Object> buildBescheidSentStatusItem(String userId) { + return Map.of( + Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name(), + Bescheid.FIELD_SENT_INFO, buildSentInfoMap(userId)); + } + + Map<String, Object> buildSentInfoMap(String userId) { + return Map.of( + Bescheid.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME), + Bescheid.FIELD_SENT_BY, userId); + } + + OzgCloudCommand buildSendPostfachNachrichtCommand(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto, String userId) { + var bodyObject = buildSendNachrichtCommandBody(bescheidItem, buildPostfachAddress(serviceKonto.getPostfachAddresses().getFirst(), + serviceKonto.getType())); + return OzgCloudCommand.builder() + .vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId())) + .relationId(commandMapper.mapRelationId(bescheidItem.getVorgangId())) + .order(SEND_POSTFACH_NACHRICHT_ORDER) + .createdBy(commandMapper.toOzgCloudUserId(userId)) + .bodyObject(bodyObject) + .build(); + } + + Map<String, Object> buildSendNachrichtCommandBody(AttachedItem bescheidItem, Map<String, Object> serviceKonto) { + return Map.of( + NachrichtService.FIELD_REPLY_OPTION, NachrichtService.REPLY_OPTION, + NachrichtService.FIELD_SUBJECT, Optional.ofNullable(getNachrichtSubject(bescheidItem)).orElse(NachrichtService.SUBJECT), + NachrichtService.FIELD_MAIL_BODY, Optional.ofNullable(getNachrichtText(bescheidItem)).orElse(StringUtils.EMPTY), + NachrichtService.FIELD_ATTACHMENTS, buildAttachments(bescheidItem), + Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, serviceKonto); + + } + + List<String> buildAttachments(AttachedItem bescheidItem) { + return Stream.concat(Stream.of(getBescheidFileId(bescheidItem)), getAttachments(bescheidItem).stream()).map(FileId::toString).toList(); + } + + Map<String, Object> buildPostfachAddress(Vorgang.PostfachAddress postfachAddress, String serviceKontoType) { + return Map.of(Vorgang.PostfachAddress.FIELD_TYPE, postfachAddress.getType(), + Vorgang.PostfachAddress.FIELD_VERSION, postfachAddress.getVersion(), + Vorgang.PostfachAddress.FIELD_IDENTIFIER, postfachAddress.getIdentifier(), + Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, serviceKontoType); } OzgCloudCreateSubCommandsRequest buildCreateSubCommandsRequest(String parentCommandId, List<OzgCloudCommand> subCommands) { @@ -198,12 +252,7 @@ class BescheidService { .build(); } - void setBescheidSent(AttachedItem bescheidItem, OzgCloudCreateSubCommandsRequest createSubCommandsRequest) { - commandService.addSubCommands(createSubCommandsRequest); - setAntragBewilligung(bescheidItem); - } - - void setAntragBewilligung(AttachedItem bescheidItem) { + public void setAntragBewilligung(AttachedItem bescheidItem) { try { bescheidClientAttributeService.setAntragResult(bescheidItem.getVorgangId(), getBewilligt(bescheidItem)); } catch (Exception e) { diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java index daff3a71360a763bb8ef188d2875d1360684602f..a04140c8749ecf574e63e3b8c5cae6178debfbac 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attacheditem/AttachedItemService.java @@ -25,8 +25,6 @@ package de.ozgcloud.bescheid.attacheditem; import static java.util.Objects.*; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; @@ -47,7 +45,6 @@ import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; import de.ozgcloud.bescheid.BescheidManagerConfiguration; -import de.ozgcloud.bescheid.common.callcontext.CallContextUser; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; import de.ozgcloud.bescheid.vorgang.VorgangId; @@ -61,10 +58,10 @@ import lombok.extern.log4j.Log4j2; public class AttachedItemService { public static final String BESCHEID_ITEM_NAME = "Bescheid"; + public static final String PATCH_ATTACHED_ITEM = "PATCH_ATTACHED_ITEM"; static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM"; static final String UPDATE_ATTACHED_ITEM_ORDER = "UPDATE_ATTACHED_ITEM"; static final String DELETE_ATTACHED_ITEM = "DELETE_ATTACHED_ITEM"; - static final String PATCH_ATTACHED_ITEM = "PATCH_ATTACHED_ITEM"; static final String DEFAULT_SUBJECT = "Ihr Bescheid zum Antrag"; static final String DEFAULT_TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh"; @@ -267,69 +264,12 @@ public class AttachedItemService { .build(); } - public void setBescheidSentStatus(String id, long version) { - createPatchCommand(id, version, buildBescheidSentStatusBodyObject(id)); - } - - Map<String, Object> buildBescheidSentStatusBodyObject(String bescheidId) { - return Map.of(AttachedItem.PROPERTY_ID, bescheidId, - AttachedItem.PROPERTY_ITEM, buildBescheidSentStatusItem()); - } - - Map<String, Object> buildBescheidSentStatusItem() { - var itemMap = buildItemMap(Bescheid.Status.SENT); - itemMap.put(Bescheid.FIELD_SENT_INFO, buildSentInfoMap()); - return itemMap; - } - - Map<String, Object> buildSentInfoMap() { - return Map.of( - Bescheid.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME), - Bescheid.FIELD_SENT_BY, getUserId()); - } - - String getUserId() { - return currentUserService.findUser().flatMap(CallContextUser::getUserId).orElse(StringUtils.EMPTY); - } - - public void revertBescheidSendStatus(String id, long version) { - createPatchCommand(id, version, buildRevertBescheidSentStatusBodyObject(id)); - } - - private void createPatchCommand(String id, long version, Map<String, Object> itemMap) { - commandService.createAndWaitUntilDone(buildPatchBescheidCommand(id, version, itemMap)); - } - - Map<String, Object> buildRevertBescheidSentStatusBodyObject(String bescheidId) { - return Map.of(AttachedItem.PROPERTY_ID, bescheidId, - AttachedItem.PROPERTY_ITEM, buildRevertBescheidSentStatusItem()); - } - - Map<String, Object> buildRevertBescheidSentStatusItem() { - var itemMap = buildItemMap(Bescheid.Status.DRAFT); - itemMap.put(Bescheid.FIELD_SENT_INFO, null); - return itemMap; - } - Map<String, Object> buildItemMap(Bescheid.Status status) { var itemMap = new HashMap<String, Object>(); itemMap.put(Bescheid.FIELD_STATUS, status.name()); return itemMap; } - public OzgCloudCommand buildSetBescheidSentStatusCommand(String bescheidId, long bescheidVersion) { - return buildPatchBescheidCommand(bescheidId, bescheidVersion, buildBescheidSentStatusBodyObject(bescheidId)); - } - - OzgCloudCommand buildPatchBescheidCommand(String bescheidId, long bescheidVersion, Map<String, Object> bodyObject) { - return OzgCloudCommand.builder() - .relationId(commandMapper.mapRelationId(bescheidId)) - .relationVersion(bescheidVersion) - .order(PATCH_ATTACHED_ITEM) - .bodyObject(bodyObject) - .build(); - } - public Collection<AttachedItem> findAllBescheid(VorgangId vorgangId) { return remoteService.findAllBescheid(vorgangId); } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java index 8ccdfe96f684e643826e143b56636d42ac25f733..bdf3e8e6fb96ec7677bfd92a02b31c735f38ea7f 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java @@ -1,38 +1,30 @@ package de.ozgcloud.bescheid.nachricht; -import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.stream.Stream; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; -import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; -import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.errorhandling.TechnicalException; import lombok.extern.log4j.Log4j2; @Service @Log4j2 public class NachrichtService { - public static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT"; public static final String FIELD_POSTFACH_ID = "postfachId"; - static final String FIELD_REPLY_OPTION = "replyOption"; - static final String REPLY_OPTION = "POSSIBLE"; - static final String FIELD_SUBJECT = "subject"; - static final String FIELD_MAIL_BODY = "mailBody"; - static final String FIELD_ATTACHMENTS = "attachments"; + public static final String FIELD_REPLY_OPTION = "replyOption"; + public static final String REPLY_OPTION = "POSSIBLE"; + public static final String FIELD_SUBJECT = "subject"; + public static final String FIELD_MAIL_BODY = "mailBody"; + public static final String FIELD_ATTACHMENTS = "attachments"; + public static final String SUBJECT = "Ihr Bescheid zum Antrag"; @Autowired private NachrichtRemoteService remoteService; @@ -44,7 +36,6 @@ public class NachrichtService { @Autowired private TemplateHandler templateHandler; - static final String SUBJECT = "Ihr Bescheid zum Antrag"; private static final String TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh"; @@ -68,43 +59,6 @@ public class NachrichtService { .orElseGet(() -> templateHandler.fillTemplate(TEMPLATE_FILE, bescheid)); } - public void sendNachricht(Bescheid bescheid) { - commandService.createAndWaitUntilDone(buildSendBescheidCommand(bescheid)); - } - - public OzgCloudCommand buildSendBescheidCommand(Bescheid bescheid) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(bescheid.getVorgangId().toString())) - .relationId(commandMapper.mapRelationId(bescheid.getVorgangId().toString())) - .order(SEND_POSTFACH_NACHRICHT_ORDER) - .createdBy(commandMapper.toOzgCloudUserId(bescheid.getCreatedBy().toString())) - .bodyObject(buildSendNachrichtCommandBody(bescheid)) - .build(); - } - - Map<String, Object> buildSendNachrichtCommandBody(Bescheid bescheid) { - return Map.of( - FIELD_REPLY_OPTION, REPLY_OPTION, - FIELD_SUBJECT, bescheid.getNachrichtSubject().orElse(SUBJECT), - FIELD_MAIL_BODY, bescheid.getNachrichtText().orElse(StringUtils.EMPTY), - FIELD_ATTACHMENTS, buildAttachments(bescheid), - Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, buildPostfachAddress(bescheid)); - - } - - List<String> buildAttachments(Bescheid bescheid) { - return Stream.concat(Stream.of(bescheid.getBescheidFileId()), bescheid.getAttachments().stream()).map(FileId::toString).toList(); - } - - Map<String, Object> buildPostfachAddress(Bescheid bescheid) { - var postfachAddress = getAddress(bescheid).orElseThrow( - () -> new TechnicalException("No ServiceKonto on Vorgang (id: %s)".formatted(bescheid.getVorgangId()))); - return Map.of(PostfachAddress.FIELD_TYPE, postfachAddress.getType(), - PostfachAddress.FIELD_VERSION, postfachAddress.getVersion(), - PostfachAddress.FIELD_IDENTIFIER, postfachAddress.getIdentifier(), - Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, bescheid.getServiceKonto().getType()); - } - Optional<PostfachAddress> getAddress(Bescheid bescheid) { var serviceKonto = bescheid.getServiceKonto(); if (Objects.nonNull(serviceKonto)) { diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java index e185a33ad5af57e688bca5e214e8904fee509b1b..127daad5721a5542074e8e4b2488256f005a3634 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java @@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; -import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import lombok.NonNull; @@ -12,8 +11,6 @@ import lombok.NonNull; @Service("bescheid_VorgangService") public class VorgangService { - static final String VORGANG_BESCHEIDEN = "VORGANG_BESCHEIDEN"; - @Autowired private VorgangRemoteService remoteService; @Autowired @@ -26,25 +23,4 @@ public class VorgangService { return remoteService.getById(id); } - public void bescheiden(String vorgangId) { - bescheiden(getById(VorgangId.from(vorgangId))); - } - - private void bescheiden(Vorgang vorgang) { - commandService.createAndWaitUntilDone(buildVorgangBescheidenCommand(vorgang)); - } - - public OzgCloudCommand buildVorgangBescheidenCommand(String vorgangId) { - return buildVorgangBescheidenCommand(getById(VorgangId.from(vorgangId))); - } - - public OzgCloudCommand buildVorgangBescheidenCommand(Vorgang vorgang) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(vorgang.getId().toString())) - .relationId(commandMapper.mapRelationId(vorgang.getId().toString())) - .relationVersion(vorgang.getVersion()) - .order(VORGANG_BESCHEIDEN) - .build(); - } - } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java index f40c75e0a785481253769d68b70295e2eef9f219..2b9d8d0b29fe167ee61096bc63833e5cab8b8d65 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java @@ -84,7 +84,7 @@ class VorgangServiceTest { @Test void shouldCallCommandService() { - doReturn(ozgCloudCommand).when(service).buildVorgangBescheidenCommand(any()); + // doReturn(ozgCloudCommand).when(service).buildVorgangBescheidenCommand(any()); service.bescheiden(VorgangTestFactory.ID.toString());