From a3935fa894265c31aa40a44c4f9458f30302a37f Mon Sep 17 00:00:00 2001 From: Maximilian Wesener Date: Wed, 26 Jun 2024 07:57:27 +0200 Subject: [PATCH] feature(chore):985 Fixed contractagreement view script. --- .../base/service/AssetBaseService.java | 2 + .../assets/domain/base/AssetRepository.java | 2 + .../service/AbstractAssetBaseService.java | 5 ++ .../AssetAsBuiltRepositoryImpl.java | 7 ++ .../AssetAsPlannedRepositoryImpl.java | 8 +++ .../config/ApplicationStartupConfig.java | 70 ++++++++++++++++++- .../application/service/ContractService.java | 3 + .../domain/model/ContractAgreement.java | 56 +++++++++++++++ .../domain/repository/ContractRepository.java | 3 + .../domain/service/ContractServiceImpl.java | 7 ++ .../model/ContractAgreementView.java | 18 ++++- .../repository/ContractRepositoryImpl.java | 7 +- .../R__create_contract_agreement_view.sql | 29 +++----- .../common/support/AssetsSupport.java | 39 +++++++++++ 14 files changed, 231 insertions(+), 25 deletions(-) create mode 100644 tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/ContractAgreement.java diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java index 45d5f6be4f..b2d27f2c9d 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/application/base/service/AssetBaseService.java @@ -50,4 +50,6 @@ public interface AssetBaseService { List getDistinctFilterValues(String fieldName, String startWith, Integer size, Owner owner, List inAssetIds); List getAssetIdsInImportState(ImportState... importStates); + + List findAll(); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/AssetRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/AssetRepository.java index dd46332a48..99b959c1d6 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/AssetRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/AssetRepository.java @@ -51,4 +51,6 @@ public interface AssetRepository { List findByImportStateIn(ImportState... importStates); void updateImportStateAndNoteForAssets(ImportState importState, String importNote, List assetIds); + + List findAll(); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AbstractAssetBaseService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AbstractAssetBaseService.java index 82cd228a61..52c5467090 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AbstractAssetBaseService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/domain/base/service/AbstractAssetBaseService.java @@ -131,6 +131,11 @@ public List getAssetIdsInImportState(ImportState... importStates) { return getAssetRepository().findByImportStateIn(importStates).stream().map(AssetBase::getId).toList(); } + @Override + public List findAll() { + return getAssetRepository().findAll(); + } + private boolean isSupportedEnumType(String fieldName) { return SUPPORTED_ENUM_FIELDS.contains(fieldName); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/AssetAsBuiltRepositoryImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/AssetAsBuiltRepositoryImpl.java index 42b0890198..a7c1b89508 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/AssetAsBuiltRepositoryImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asbuilt/repository/AssetAsBuiltRepositoryImpl.java @@ -149,6 +149,13 @@ public void updateImportStateAndNoteForAssets(ImportState importState, String im jpaAssetAsBuiltRepository.saveAll(assets); } + @Transactional + @Override + public List findAll() { + return jpaAssetAsBuiltRepository.findAll().stream() + .map(AssetAsBuiltEntity::toDomain).toList(); + } + @Override public Optional findById(String assetId) { return jpaAssetAsBuiltRepository.findById(assetId) diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/AssetAsPlannedRepositoryImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/AssetAsPlannedRepositoryImpl.java index e728f3ddb8..74c11bcb7a 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/AssetAsPlannedRepositoryImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/assets/infrastructure/asplanned/repository/AssetAsPlannedRepositoryImpl.java @@ -28,6 +28,7 @@ import org.eclipse.tractusx.traceability.assets.domain.base.model.ImportNote; import org.eclipse.tractusx.traceability.assets.domain.base.model.ImportState; import org.eclipse.tractusx.traceability.assets.domain.base.model.Owner; +import org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.model.AssetAsBuiltEntity; import org.eclipse.tractusx.traceability.assets.infrastructure.asplanned.model.AssetAsPlannedEntity; import org.eclipse.tractusx.traceability.assets.infrastructure.base.irs.AssetCallbackRepository; import org.eclipse.tractusx.traceability.assets.infrastructure.base.model.AssetBaseEntity; @@ -80,6 +81,13 @@ public AssetBase getAssetByChildId(String childId) { .orElseThrow(() -> new AssetNotFoundException("Child Asset Not Found")); } + @Transactional + @Override + public List findAll() { + return jpaAssetAsPlannedRepository.findAll().stream() + .map(AssetAsPlannedEntity::toDomain).toList(); + } + @Override public PageResult getAssets(Pageable pageable, SearchCriteria searchCriteria) { diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java index fd4dac3939..c34f848025 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/common/config/ApplicationStartupConfig.java @@ -19,21 +19,29 @@ package org.eclipse.tractusx.traceability.common.config; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.tractusx.traceability.policies.domain.PolicyRepository; +import org.eclipse.tractusx.traceability.assets.application.base.service.AssetBaseService; +import org.eclipse.tractusx.traceability.assets.domain.base.model.AssetBase; +import org.eclipse.tractusx.traceability.contracts.application.service.ContractService; +import org.eclipse.tractusx.traceability.contracts.domain.model.ContractAgreement; +import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; import org.eclipse.tractusx.traceability.notification.application.contract.model.CreateNotificationContractRequest; import org.eclipse.tractusx.traceability.notification.application.contract.model.NotificationMethod; import org.eclipse.tractusx.traceability.notification.application.contract.model.NotificationType; import org.eclipse.tractusx.traceability.notification.domain.contract.EdcNotificationContractService; +import org.eclipse.tractusx.traceability.policies.domain.PolicyRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.annotation.Profile; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; +import java.time.Instant; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.stream.Stream; import static org.eclipse.tractusx.traceability.common.config.ApplicationProfiles.NOT_INTEGRATION_TESTS; @@ -41,9 +49,25 @@ @Slf4j @Component @Profile(NOT_INTEGRATION_TESTS) -@RequiredArgsConstructor public class ApplicationStartupConfig { private final PolicyRepository policyRepository; + private final AssetBaseService asPlannedService; + private final AssetBaseService asBuiltService; + private final ContractService contractService; + + @Autowired + public ApplicationStartupConfig(PolicyRepository policyRepository, + @Qualifier("assetAsBuiltServiceImpl") AssetBaseService asPlannedService, + @Qualifier("assetAsPlannedServiceImpl") AssetBaseService asBuiltService, + EdcNotificationContractService edcNotificationContractService, + ContractService contractService) { + this.policyRepository = policyRepository; + this.asPlannedService = asPlannedService; + this.asBuiltService = asBuiltService; + this.edcNotificationContractService = edcNotificationContractService; + this.contractService = contractService; + } + private final EdcNotificationContractService edcNotificationContractService; private static final List NOTIFICATION_CONTRACTS = List.of( new CreateNotificationContractRequest(NotificationType.QUALITY_ALERT, NotificationMethod.UPDATE), @@ -82,4 +106,44 @@ public void createNotificationContracts() { executor.shutdown(); } + @EventListener(ApplicationReadyEvent.class) + public void insertIntoContractAgreements() { + ExecutorService executor = Executors.newSingleThreadExecutor(); + executor.execute(() -> { + log.info("on ApplicationReadyEvent insert into contracts."); + try { + List asBuilt = asBuiltService.findAll(); + List asPlanned = asPlannedService.findAll(); + + List contractAgreementIdsAsBuilt = asBuilt.stream().map(asBuiltAsset -> ContractAgreement + .builder() + .type(ContractType.ASSET_AS_BUILT) + .contractAgreementId(asBuiltAsset.getContractAgreementId()) + .id(asBuiltAsset.getId()) + .created(Instant.now()) + .build()).toList(); + + List contractAgreementIdsAsPlanned = asPlanned.stream().map(asPlannedAsset -> ContractAgreement + .builder() + .type(ContractType.ASSET_AS_BUILT) + .contractAgreementId(asPlannedAsset.getContractAgreementId()) + .id(asPlannedAsset.getId()) + .created(Instant.now()) + .build()).toList(); + + List mergedAgreements = Stream.concat(contractAgreementIdsAsBuilt.stream(), contractAgreementIdsAsPlanned.stream()) + .toList(); + + contractService.saveAll(mergedAgreements); + + + } catch (Exception exception) { + log.error("Failed to insert contracts: ", exception); + } + log.info("on ApplicationReadyEvent insert into contracts successfully done."); + }); + executor.shutdown(); + } + + } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/service/ContractService.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/service/ContractService.java index 74e572d6bd..33d97874bf 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/service/ContractService.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/application/service/ContractService.java @@ -22,6 +22,7 @@ import org.eclipse.tractusx.traceability.common.model.PageResult; import org.eclipse.tractusx.traceability.common.request.PageableFilterRequest; import org.eclipse.tractusx.traceability.contracts.domain.model.Contract; +import org.eclipse.tractusx.traceability.contracts.domain.model.ContractAgreement; import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; import java.util.List; @@ -30,4 +31,6 @@ public interface ContractService { PageResult getContracts(PageableFilterRequest pageableFilterRequest); void saveContractAgreements(List contractAgreementIds, ContractType contractType) throws ContractAgreementException; + + void saveAll(List contractAgreements); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/ContractAgreement.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/ContractAgreement.java new file mode 100644 index 0000000000..04ee586f82 --- /dev/null +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/model/ContractAgreement.java @@ -0,0 +1,56 @@ +/******************************************************************************** + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ +package org.eclipse.tractusx.traceability.contracts.domain.model; + +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.Id; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; + +import java.time.Instant; +import java.util.List; + +@Getter +@Setter +@Builder +public class ContractAgreement { + + @Id + private String id; + private String contractAgreementId; + @Enumerated(EnumType.STRING) + private ContractType type; + private Instant created; + + public static ContractAgreementView toEntity(ContractAgreement contractAgreement) { + return ContractAgreementView.builder() + .created(contractAgreement.getCreated()) + .id(contractAgreement.getId()) + .contractAgreementId(contractAgreement.getContractAgreementId()) + .type(contractAgreement.getType()) + .build(); + } + + public static List toEntityList(List contractAgreementList) { + return contractAgreementList.stream().map(ContractAgreement::toEntity).toList(); + } +} diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/repository/ContractRepository.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/repository/ContractRepository.java index dfbd7d824b..833cda721f 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/repository/ContractRepository.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/repository/ContractRepository.java @@ -23,6 +23,7 @@ import org.eclipse.tractusx.traceability.common.model.SearchCriteria; import org.eclipse.tractusx.traceability.contracts.domain.model.Contract; import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; import org.springframework.data.domain.Pageable; import java.util.List; @@ -32,4 +33,6 @@ public interface ContractRepository { PageResult getContractsByPageable(Pageable pageable, SearchCriteria searchCriteria); void saveAllContractAgreements(List contractAgreementIds, ContractType contractType) throws ContractAgreementException; + + void saveAll(List contractAgreements); } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/service/ContractServiceImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/service/ContractServiceImpl.java index a2863306eb..218e8bd8ce 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/service/ContractServiceImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/domain/service/ContractServiceImpl.java @@ -27,8 +27,10 @@ import org.eclipse.tractusx.traceability.contracts.application.mapper.ContractFieldMapper; import org.eclipse.tractusx.traceability.contracts.application.service.ContractService; import org.eclipse.tractusx.traceability.contracts.domain.model.Contract; +import org.eclipse.tractusx.traceability.contracts.domain.model.ContractAgreement; import org.eclipse.tractusx.traceability.contracts.domain.repository.ContractRepository; import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; @@ -54,4 +56,9 @@ public PageResult getContracts(PageableFilterRequest pageableFilterReq public void saveContractAgreements(List contractAgreementIds, ContractType contractType) throws ContractAgreementException { contractRepository.saveAllContractAgreements(contractAgreementIds, contractType); } + + @Override + public void saveAll(List contractAgreements) { + contractRepository.saveAll(ContractAgreement.toEntityList(contractAgreements)); + } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementView.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementView.java index 3716b96b83..2472aa1f93 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementView.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/model/ContractAgreementView.java @@ -27,16 +27,18 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.SuperBuilder; +import org.eclipse.tractusx.traceability.contracts.domain.model.ContractAgreement; import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; import java.time.Instant; +import java.util.List; @Getter @Setter @NoArgsConstructor @Entity @SuperBuilder -@Table(name = "contract_agreement_view") +@Table(name = "contract_agreement") public class ContractAgreementView { @Id @@ -45,4 +47,18 @@ public class ContractAgreementView { @Enumerated(EnumType.STRING) private ContractType type; private Instant created; + + + public static ContractAgreement toDomain(ContractAgreementView contractAgreement) { + return ContractAgreement.builder() + .created(contractAgreement.getCreated()) + .id(contractAgreement.getId()) + .contractAgreementId(contractAgreement.getContractAgreementId()) + .type(contractAgreement.getType()) + .build(); + } + + public static List toDomainList(List contractAgreementList) { + return contractAgreementList.stream().map(ContractAgreementView::toDomain).toList(); + } } diff --git a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java index c6f28cda7b..30e6be679f 100644 --- a/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java +++ b/tx-backend/src/main/java/org/eclipse/tractusx/traceability/contracts/infrastructure/repository/ContractRepositoryImpl.java @@ -32,9 +32,9 @@ import org.eclipse.tractusx.traceability.common.repository.BaseSpecification; import org.eclipse.tractusx.traceability.contracts.domain.exception.ContractException; import org.eclipse.tractusx.traceability.contracts.domain.model.Contract; +import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; import org.eclipse.tractusx.traceability.contracts.domain.repository.ContractRepository; import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; -import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; @@ -102,6 +102,11 @@ public void saveAllContractAgreements(List contractAgreementIds, Contrac contractAgreementInfoViewRepository.saveAll(contractAgreementViewsUpdated); } + @Override + public void saveAll(List contractAgreements) { + contractAgreementInfoViewRepository.saveAll(contractAgreements); + } + private List fetchEdcContractAgreements(List contractAgreementInfoViews) throws ContractAgreementException { List contractAgreementIds = contractAgreementInfoViews.stream().map(ContractAgreementView::getContractAgreementId).toList(); log.info("Trying to fetch contractAgreementIds from EDC: " + contractAgreementIds); diff --git a/tx-backend/src/main/resources/db/migration/R__create_contract_agreement_view.sql b/tx-backend/src/main/resources/db/migration/R__create_contract_agreement_view.sql index f306eee2b8..5bf0b629ee 100644 --- a/tx-backend/src/main/resources/db/migration/R__create_contract_agreement_view.sql +++ b/tx-backend/src/main/resources/db/migration/R__create_contract_agreement_view.sql @@ -1,21 +1,10 @@ +-- Drop the view if it exists +DROP VIEW IF EXISTS contract_agreement_view; -ALTER VIEW contract_agreement_view RENAME COLUMN asset_type TO type; - -CREATE OR REPLACE VIEW contract_agreement_view (id, contract_agreement_id, type, created) AS -SELECT * -FROM ( - (SELECT assets_as_built.id, - contract_agreement_id, - 'ASSET_AS_BUILT' AS type, - created - FROM assets_as_built - WHERE contract_agreement_id IS NOT NULL) - UNION ALL - (SELECT assets_as_planned.id, - contract_agreement_id, - 'ASSET_AS_PLANNED' AS type, - created - FROM assets_as_planned - WHERE contract_agreement_id IS NOT NULL) - ) results -ORDER BY created DESC; +-- Create the table +CREATE TABLE contract_agreement ( + id varchar(255) PRIMARY KEY, + contract_agreement_id varchar(255), + type VARCHAR(255), + created TIMESTAMP +); diff --git a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java index 719ccc59e4..3be43d75df 100644 --- a/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java +++ b/tx-backend/src/test/java/org/eclipse/tractusx/traceability/integration/common/support/AssetsSupport.java @@ -20,9 +20,18 @@ import lombok.extern.slf4j.Slf4j; import org.eclipse.tractusx.traceability.assets.infrastructure.asbuilt.model.AssetAsBuiltEntity; +import org.eclipse.tractusx.traceability.contracts.domain.model.ContractType; +import org.eclipse.tractusx.traceability.contracts.domain.repository.ContractRepository; +import org.eclipse.tractusx.traceability.contracts.infrastructure.model.ContractAgreementView; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.Instant; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + @Slf4j @Component public class AssetsSupport { @@ -30,6 +39,9 @@ public class AssetsSupport { @Autowired AssetRepositoryProvider assetRepositoryProvider; + @Autowired + ContractRepository contractRepository; + @Autowired BpnSupport bpnSupport; @@ -45,6 +57,33 @@ public void defaultAssetsStored() { oAuth2ApiSupport.oauth2ApiReturnsTechnicalUserToken(); bpnSupport.providesBpdmLookup(); assetRepositoryProvider.assetAsBuiltRepository().saveAll(assetRepositoryProvider.testdataProvider().readAndConvertAssetsForTests()); + + List mergedAgreements = extractContractAgreementByAssets(); + + contractRepository.saveAll(mergedAgreements); + + } + + private @NotNull List extractContractAgreementByAssets() { + List contractAgreementIdsAsBuilt = assetRepositoryProvider.assetAsBuiltRepository().findAll().stream().map(asBuiltAsset -> ContractAgreementView + .builder() + .type(ContractType.ASSET_AS_BUILT) + .contractAgreementId(asBuiltAsset.getContractAgreementId()) + .id(asBuiltAsset.getId()) + .created(Instant.now()) + .build()).collect(Collectors.toUnmodifiableList()); + + List contractAgreementIdsAsPlanned = assetRepositoryProvider.assetAsPlannedRepository().findAll().stream().map(asPlannedAsset -> ContractAgreementView + .builder() + .type(ContractType.ASSET_AS_BUILT) + .contractAgreementId(asPlannedAsset.getContractAgreementId()) + .id(asPlannedAsset.getId()) + .created(Instant.now()) + .build()).collect(Collectors.toUnmodifiableList()); + + List mergedAgreements = Stream.concat(contractAgreementIdsAsBuilt.stream(), contractAgreementIdsAsPlanned.stream()) + .toList(); + return mergedAgreements; } public AssetAsBuiltEntity findById(String id) {