diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 27acb0c4ffd60cdf9acd3a905de168d91ac7417e..0f7d64c45be81fd4a74e0ccc903d3fd5a4a895d8 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -17,7 +17,7 @@ <properties> <vorgang-manager.version>2.9.0</vorgang-manager.version> <nachrichten-manager.version>2.9.0</nachrichten-manager.version> - <api-lib.version>0.10.0</api-lib.version> + <api-lib.version>0.11.0-SNAPSHOT</api-lib.version> </properties> <dependencies> diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java index 49fbce9beef117e017788ae682323792bdb7478e..ce03da91e83577e2b9be664a9d8dbf9eb291ca48 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java @@ -167,7 +167,7 @@ class BescheidEventListener { if (SendBy.MANUAL.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) { service.sendBescheidManually(bescheidItem, command.getRelationVersion()); } else if (SendBy.NACHRICHT.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) { - service.sendBescheidPostfachMail(bescheidItem, command.getRelationVersion()); + service.sendBescheidPostfachMail(bescheidItem, command); } else { throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Allowed values are %s." .formatted(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY), 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 ffc2ece833e690b658dd1689c38e5e28789d1689..3e358b16a88944b3a0f97f611e935c65396f03d8 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java @@ -1,5 +1,6 @@ package de.ozgcloud.bescheid; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -9,9 +10,14 @@ import jakarta.annotation.PostConstruct; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.info.BuildProperties; 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.OzgCloudCreateSubCommandsRequest; +import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.bescheid.attacheditem.AttachedItem; import de.ozgcloud.bescheid.attacheditem.AttachedItemService; import de.ozgcloud.bescheid.attributes.ClientAttributeService; @@ -20,6 +26,7 @@ import de.ozgcloud.bescheid.nachricht.NachrichtService; import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangService; +import de.ozgcloud.command.Command; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.document.Document; @@ -32,11 +39,16 @@ import lombok.extern.log4j.Log4j2; 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"; private final VorgangService vorgangService; private final AttachedItemService attachedItemService; private final NachrichtService nachrichtService; private final UserProfileService currentUserService; + @Qualifier("bescheid_OzgCloudCommandService") + private final OzgCloudCommandService commandService; + private final CommandMapper commandMapper; private final ClientAttributeService bescheidClientAttributeService; private final BuildProperties buildProperties; private final Optional<BescheidRemoteService> remoteService; @@ -72,9 +84,10 @@ class BescheidService { } } - public void sendBescheidManually(AttachedItem bescheidItem, long version) { - validateBescheidSendManually(bescheidItem, version); - setBescheidSent(bescheidItem); + public void sendBescheidManually(AttachedItem bescheidItem, Command parentCommand) { + validateBescheidSendManually(bescheidItem, parentCommand.getRelationVersion()); + var subCommands = buildSendBescheidManuallySubCommands(bescheidItem); + setBescheidSent(bescheidItem, buildCreateSubCommandsRequest(parentCommand.getId(), subCommands)); } void validateBescheidSendManually(AttachedItem bescheidItem, long version) { @@ -85,11 +98,10 @@ class BescheidService { } } - public void sendBescheidPostfachMail(AttachedItem bescheidItem, long version) { - validateBescheidSendPostfach(bescheidItem, version); - var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); - setBescheidSent(bescheidItem); - nachrichtService.sendNachricht(buildBescheid(bescheidItem, vorgang.getServiceKonto())); + public void sendBescheidPostfachMail(AttachedItem bescheidItem, Command parentCommand) { + validateBescheidSendPostfach(bescheidItem, parentCommand.getRelationVersion()); + var subCommands = buildSendBescheidPostfachMailSubCommands(bescheidItem); + setBescheidSent(bescheidItem, buildCreateSubCommandsRequest(parentCommand.getId(), subCommands)); } public void validateBescheidSendPostfach(AttachedItem bescheidItem, long version) { @@ -160,14 +172,34 @@ class BescheidService { return Collections.emptyList(); } - void setBescheidSent(AttachedItem bescheidItem) { - attachedItemService.setBescheidSentStatus(bescheidItem.getId(), bescheidItem.getVersion()); - try { - vorgangService.bescheiden(bescheidItem.getVorgangId()); - } catch (Exception e) { - attachedItemService.revertBescheidSendStatus(bescheidItem.getId(), bescheidItem.getVersion()); - throw e; - } + 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> buildSendBescheidManuallySubCommands(AttachedItem bescheidItem) { + var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); + return buildSendBescheidSubCommands(bescheidItem, vorgang); + } + + List<OzgCloudCommand> buildSendBescheidSubCommands(AttachedItem bescheidItem, Vorgang vorgang) { + return List.of(vorgangService.buildVorgangBescheidenCommand(vorgang), + attachedItemService.buildSetBescheidSentStatusCommand(bescheidItem.getId(), bescheidItem.getVersion())) + } + + OzgCloudCreateSubCommandsRequest buildCreateSubCommandsRequest(String parentCommandId, List<OzgCloudCommand> subCommands) { + return OzgCloudCreateSubCommandsRequest.builder() + .parentId(parentCommandId) + .executionMode(SUBCOMMANDS_EXECUTION_MODE) + .completedIfSubsCompleted(true) + .subCommands(subCommands) + .build(); + } + + void setBescheidSent(AttachedItem bescheidItem, OzgCloudCreateSubCommandsRequest createSubCommandsRequest) { + commandService.addSubCommands(createSubCommandsRequest); setAntragBewilligung(bescheidItem); } 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 180d95031923d482c4f25f3f42f42ba0620b111d..daff3a71360a763bb8ef188d2875d1360684602f 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 @@ -317,6 +317,10 @@ public class AttachedItemService { 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)) 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 ce261151ddaa6d682521e59cfbb806c21c033656..8ccdfe96f684e643826e143b56636d42ac25f733 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 @@ -72,7 +72,7 @@ public class NachrichtService { commandService.createAndWaitUntilDone(buildSendBescheidCommand(bescheid)); } - OzgCloudCommand buildSendBescheidCommand(Bescheid bescheid) { + public OzgCloudCommand buildSendBescheidCommand(Bescheid bescheid) { return OzgCloudCommand.builder() .vorgangId(commandMapper.toOzgCloudVorgangId(bescheid.getVorgangId().toString())) .relationId(commandMapper.mapRelationId(bescheid.getVorgangId().toString())) 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 09b366285262b009acc54f131611760025ef1c5d..e185a33ad5af57e688bca5e214e8904fee509b1b 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 @@ -31,10 +31,14 @@ public class VorgangService { } private void bescheiden(Vorgang vorgang) { - commandService.createAndWaitUntilDone(buildBescheidenCommand(vorgang)); + commandService.createAndWaitUntilDone(buildVorgangBescheidenCommand(vorgang)); } - OzgCloudCommand buildBescheidenCommand(Vorgang 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())) 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 424a4330012bc1fd605dede82c56eac40c435f67..f40c75e0a785481253769d68b70295e2eef9f219 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 @@ -79,12 +79,12 @@ class VorgangServiceTest { void shouldCallBuildBescheidenCommand() { service.bescheiden(VorgangTestFactory.ID.toString()); - verify(service).buildBescheidenCommand(VORGANG); + verify(service).buildVorgangBescheidenCommand(VORGANG); } @Test void shouldCallCommandService() { - doReturn(ozgCloudCommand).when(service).buildBescheidenCommand(any()); + doReturn(ozgCloudCommand).when(service).buildVorgangBescheidenCommand(any()); service.bescheiden(VorgangTestFactory.ID.toString()); @@ -99,7 +99,7 @@ class VorgangServiceTest { @Test void shouldCallCommandMapperToOzgCloudVorgangId() { - service.buildBescheidenCommand(VORGANG); + service.buildVorgangBescheidenCommand(VORGANG); verify(commandMapper).toOzgCloudVorgangId(VorgangTestFactory.ID.toString()); } @@ -109,14 +109,14 @@ class VorgangServiceTest { var expectedId = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString()); when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedId); - var result = service.buildBescheidenCommand(VORGANG); + var result = service.buildVorgangBescheidenCommand(VORGANG); assertThat(result.getVorgangId()).isEqualTo(expectedId); } @Test void shouldCallCommandMapperMapRelationId() { - service.buildBescheidenCommand(VORGANG); + service.buildVorgangBescheidenCommand(VORGANG); verify(commandMapper).mapRelationId(VorgangTestFactory.ID.toString()); } @@ -126,7 +126,7 @@ class VorgangServiceTest { var expectedId = GenericId.from(VorgangTestFactory.ID.toString()); when(commandMapper.mapRelationId(any())).thenReturn(expectedId); - var result = service.buildBescheidenCommand(VORGANG); + var result = service.buildVorgangBescheidenCommand(VORGANG); assertThat(result.getRelationId()).isEqualTo(expectedId); } @@ -135,7 +135,7 @@ class VorgangServiceTest { void shouldSetRelationVersion() { var expectedVersion = VORGANG.getVersion(); - var result = service.buildBescheidenCommand(VORGANG); + var result = service.buildVorgangBescheidenCommand(VORGANG); assertThat(result.getRelationVersion()).isEqualTo(expectedVersion); } @@ -144,7 +144,7 @@ class VorgangServiceTest { void shouldSetOrder() { var expectedOrder = VorgangService.VORGANG_BESCHEIDEN; - var result = service.buildBescheidenCommand(VORGANG); + var result = service.buildVorgangBescheidenCommand(VORGANG); assertThat(result.getOrder()).isEqualTo(expectedOrder); } diff --git a/lombok.config b/lombok.config index d07dd9b0e2b0281fbf514a968b9451cb6af62f93..a06fa130e8af26b659f2d3a0cb1114cd966a9b0e 100644 --- a/lombok.config +++ b/lombok.config @@ -27,4 +27,5 @@ lombok.log.slf4j.flagUsage = ERROR lombok.log.log4j.flagUsage = ERROR lombok.data.flagUsage = ERROR lombok.nonNull.exceptionType = IllegalArgumentException -lombok.addLombokGeneratedAnnotation = true \ No newline at end of file +lombok.addLombokGeneratedAnnotation = true +lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier \ No newline at end of file diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index c1c9559cf51e63f7e9c0e53898afed11eaf4c05c..3776798e2d74025f9bb144d7d12a11e478138605 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -53,7 +53,7 @@ <zufi-manager-interface.version>1.0.0</zufi-manager-interface.version> <user-manager-interface.version>2.1.0</user-manager-interface.version> - <bescheid-manager.version>1.14.1</bescheid-manager.version> + <bescheid-manager.version>1.15.0-SNAPSHOT</bescheid-manager.version> <processor-manager.version>0.4.1</processor-manager.version> <nachrichten-manager.version>2.9.0</nachrichten-manager.version> <ozgcloud-starter.version>0.10.0</ozgcloud-starter.version>