Skip to content

Commit 1f0d2d5

Browse files
Aboruhenpawana_backbase
andauthored
Investment/next improvement data set handler (#570)
* Implement the first part of price ingestion; add config for price creation & fix price generation and valiations * split sagas for asset univers & portfolios wealth * generate allocation for portfolios; define allocation by each day as it's required; add config for portfolio activation period by months; refactor asset universe; add checks for prices ingestion finish; * add implementation to create a deposit of portfolio cash and allocations orders * Adding Asset Categories and Types * add CHANGELOG.md --------- Co-authored-by: pawana_backbase <pawana@backbase.com>
1 parent 96a172a commit 1f0d2d5

26 files changed

+2106
-463
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
# Changelog
22
All notable changes to this project will be documented in this file.
33

4+
## [8.9.0](https://github.com/Backbase/stream-services/compare/8.8.0...8.9.0)
5+
### Changed
6+
- Investment service
7+
- add support for asset categories
8+
- improve allocations setup
9+
- add deposit and orders
10+
- price ingest async tasks complete check
11+
412
## [8.8.0](https://github.com/Backbase/stream-services/compare/8.7.0...8.8.0)
513
### Changed
614
- Investment service

stream-dbs-clients/src/main/java/com/backbase/stream/clients/config/InvestmentClientConfig.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.backbase.stream.clients.config;
22

33
import com.backbase.investment.api.service.ApiClient;
4+
import com.backbase.investment.api.service.v1.AllocationsApi;
45
import com.backbase.investment.api.service.v1.AssetUniverseApi;
6+
import com.backbase.investment.api.service.v1.AsyncBulkGroupsApi;
57
import com.backbase.investment.api.service.v1.ClientApi;
68
import com.backbase.investment.api.service.v1.FinancialAdviceApi;
9+
import com.backbase.investment.api.service.v1.InvestmentApi;
710
import com.backbase.investment.api.service.v1.InvestmentProductsApi;
11+
import com.backbase.investment.api.service.v1.PaymentsApi;
812
import com.backbase.investment.api.service.v1.PortfolioApi;
913
import com.fasterxml.jackson.annotation.JsonInclude.Include;
1014
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -38,7 +42,8 @@ public InvestmentClientConfig() {
3842
*/
3943
@Bean
4044
@ConditionalOnMissingBean
41-
public ApiClient investmentApiClient(WebClient interServiceWebClient, ObjectMapper objectMapper, DateFormat dateFormat) {
45+
public ApiClient investmentApiClient(WebClient interServiceWebClient, ObjectMapper objectMapper,
46+
DateFormat dateFormat) {
4247
ObjectMapper mapper = objectMapper.copy();
4348
mapper.setSerializationInclusion(Include.NON_EMPTY);
4449
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -83,4 +88,28 @@ public AssetUniverseApi assetUniverseApi(ApiClient investmentApiClient) {
8388
return new AssetUniverseApi(investmentApiClient);
8489
}
8590

91+
@Bean
92+
@ConditionalOnMissingBean
93+
public AllocationsApi allocationsApi(ApiClient investmentApiClient) {
94+
return new AllocationsApi(investmentApiClient);
95+
}
96+
97+
@Bean
98+
@ConditionalOnMissingBean
99+
public InvestmentApi investmentApi(ApiClient investmentApiClient) {
100+
return new InvestmentApi(investmentApiClient);
101+
}
102+
103+
@Bean
104+
@ConditionalOnMissingBean
105+
public PaymentsApi paymentsApi(ApiClient investmentApiClient) {
106+
return new PaymentsApi(investmentApiClient);
107+
}
108+
109+
@Bean
110+
@ConditionalOnMissingBean
111+
public AsyncBulkGroupsApi asyncBulkGroupsApi(ApiClient investmentApiClient) {
112+
return new AsyncBulkGroupsApi(investmentApiClient);
113+
}
114+
86115
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
2+
package com.backbase.stream.configuration;
3+
4+
import lombok.Data;
5+
import org.springframework.boot.context.properties.ConfigurationProperties;
6+
7+
/**
8+
* Configuration properties governing investment client ingestion behavior.
9+
*/
10+
@Data
11+
@ConfigurationProperties(prefix = "backbase.bootstrap.ingestions.investment")
12+
public class InvestmentIngestionConfigurationProperties {
13+
14+
private boolean assetUniversEnabled = true;
15+
private boolean wealthEnabled = true;
16+
private int portfolioActivationPastMonths = 1;
17+
18+
19+
}
20+

stream-investment/investment-core/src/main/java/com/backbase/stream/configuration/InvestmentSagaConfigurationProperties.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

stream-investment/investment-core/src/main/java/com/backbase/stream/configuration/InvestmentServiceConfiguration.java

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
package com.backbase.stream.configuration;
22

33
import com.backbase.investment.api.service.ApiClient;
4+
import com.backbase.investment.api.service.v1.AllocationsApi;
45
import com.backbase.investment.api.service.v1.AssetUniverseApi;
56
import com.backbase.investment.api.service.v1.ClientApi;
67
import com.backbase.investment.api.service.v1.FinancialAdviceApi;
8+
import com.backbase.investment.api.service.v1.InvestmentApi;
79
import com.backbase.investment.api.service.v1.InvestmentProductsApi;
10+
import com.backbase.investment.api.service.v1.PaymentsApi;
811
import com.backbase.investment.api.service.v1.PortfolioApi;
912
import com.backbase.stream.clients.autoconfigure.DbsApiClientsAutoConfiguration;
13+
import com.backbase.stream.investment.saga.InvestmentAssetUniversSaga;
1014
import com.backbase.stream.investment.saga.InvestmentSaga;
15+
import com.backbase.stream.investment.service.AsyncTaskService;
1116
import com.backbase.stream.investment.service.CustomIntegrationApiService;
17+
import com.backbase.stream.investment.service.InvestmentAssetPriceService;
1218
import com.backbase.stream.investment.service.InvestmentAssetUniverseService;
1319
import com.backbase.stream.investment.service.InvestmentClientService;
1420
import com.backbase.stream.investment.service.InvestmentModelPortfolioService;
21+
import com.backbase.stream.investment.service.InvestmentPortfolioAllocationService;
1522
import com.backbase.stream.investment.service.InvestmentPortfolioService;
1623
import lombok.RequiredArgsConstructor;
1724
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -24,7 +31,7 @@
2431
DbsApiClientsAutoConfiguration.class,
2532
})
2633
@EnableConfigurationProperties({
27-
InvestmentSagaConfigurationProperties.class
34+
InvestmentIngestionConfigurationProperties.class
2835
})
2936
@RequiredArgsConstructor
3037
@Configuration
@@ -43,8 +50,10 @@ public CustomIntegrationApiService customIntegrationApiService(ApiClient apiClie
4350

4451
@Bean
4552
public InvestmentPortfolioService investmentPortfolioService(PortfolioApi portfolioApi,
46-
InvestmentProductsApi investmentProductsApi) {
47-
return new InvestmentPortfolioService(investmentProductsApi, portfolioApi);
53+
InvestmentProductsApi investmentProductsApi, PaymentsApi paymentsApi,
54+
InvestmentIngestionConfigurationProperties configurationProperties) {
55+
return new InvestmentPortfolioService(investmentProductsApi, portfolioApi, paymentsApi,
56+
configurationProperties);
4857
}
4958

5059
@Bean
@@ -59,13 +68,37 @@ public InvestmentModelPortfolioService investmentModelPortfolioService(Financial
5968
return new InvestmentModelPortfolioService(financialAdviceApi, customIntegrationApiService);
6069
}
6170

71+
@Bean
72+
public InvestmentAssetPriceService investmentAssetPriceService(AssetUniverseApi assetUniverseApi) {
73+
return new InvestmentAssetPriceService(assetUniverseApi);
74+
}
75+
76+
@Bean
77+
public InvestmentPortfolioAllocationService investmentPortfolioAllocationService(AllocationsApi allocationsApi,
78+
AssetUniverseApi assetUniverseApi, InvestmentApi investmentApi,
79+
CustomIntegrationApiService customIntegrationApiService) {
80+
return new InvestmentPortfolioAllocationService(allocationsApi, assetUniverseApi, investmentApi,
81+
customIntegrationApiService);
82+
}
83+
6284
@Bean
6385
public InvestmentSaga investmentSaga(InvestmentClientService investmentClientService,
6486
InvestmentPortfolioService investmentPortfolioService,
6587
InvestmentModelPortfolioService investmentModelPortfolioService,
66-
InvestmentAssetUniverseService investmentAssetUniverseService) {
67-
return new InvestmentSaga(investmentClientService, investmentPortfolioService, investmentModelPortfolioService,
68-
investmentAssetUniverseService);
88+
InvestmentPortfolioAllocationService investmentPortfolioAllocationService, AsyncTaskService asyncTaskService,
89+
InvestmentIngestionConfigurationProperties coreConfigurationProperties) {
90+
return new InvestmentSaga(investmentClientService, investmentPortfolioService,
91+
investmentPortfolioAllocationService, investmentModelPortfolioService, asyncTaskService,
92+
coreConfigurationProperties);
93+
}
94+
95+
@Bean
96+
public InvestmentAssetUniversSaga investmentStaticDataSaga(
97+
InvestmentAssetUniverseService investmentAssetUniverseService,
98+
InvestmentAssetPriceService investmentAssetPriceService,
99+
InvestmentIngestionConfigurationProperties coreConfigurationProperties) {
100+
return new InvestmentAssetUniversSaga(investmentAssetUniverseService, investmentAssetPriceService,
101+
coreConfigurationProperties);
69102
}
70103

71104
}

stream-investment/investment-core/src/main/java/com/backbase/stream/investment/Asset.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.backbase.investment.api.service.v1.model.StatusA10Enum;
66
import com.fasterxml.jackson.annotation.JsonProperty;
77
import java.net.URI;
8-
import java.util.HashMap;
98
import java.util.List;
109
import java.util.Map;
1110
import java.util.UUID;
@@ -29,8 +28,24 @@ public record Asset(
2928
List<String> categories,
3029
URI logo,
3130
String externalId,
32-
String description
33-
) {
31+
String description,
32+
Double defaultPrice
33+
) implements AssetKey {
34+
35+
@Override
36+
public String getIsin() {
37+
return isin;
38+
}
39+
40+
@Override
41+
public String getMarket() {
42+
return market;
43+
}
44+
45+
@Override
46+
public String getCurrency() {
47+
return currency;
48+
}
3449

3550
/**
3651
* Creates a record from the generated API model.
@@ -54,7 +69,8 @@ public static Asset fromModel(com.backbase.investment.api.service.v1.model.Asset
5469
categories == null ? List.of() : categories.stream().map(AssetCategory::getCode).toList(),
5570
asset.getLogo(),
5671
asset.getExternalId(),
57-
asset.getDescription()
72+
asset.getDescription(),
73+
100d
5874
);
5975
}
6076

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.backbase.stream.investment;
2+
3+
import java.util.Map;
4+
5+
public interface AssetKey {
6+
7+
String getIsin();
8+
9+
String getMarket();
10+
11+
String getCurrency();
12+
13+
default Map<String, Object> getAssetMap() {
14+
return Map.of("isin", getIsin(), "market", getMarket(), "currency", getCurrency());
15+
}
16+
17+
default String getKeyString() {
18+
return getIsin() + "_" + getMarket() + "_" + getCurrency();
19+
}
20+
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.backbase.stream.investment;
2+
3+
public record AssetPrice(String isin, String market, String currency, double price,
4+
RandomParam randomParam) implements AssetKey {
5+
6+
@Override
7+
public String getIsin() {
8+
return isin;
9+
}
10+
11+
@Override
12+
public String getMarket() {
13+
return market;
14+
}
15+
16+
@Override
17+
public String getCurrency() {
18+
return currency;
19+
}
20+
21+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.backbase.stream.investment;
2+
3+
import com.backbase.investment.api.service.v1.model.AssetCategory;
4+
import com.backbase.investment.api.service.v1.model.AssetCategoryType;
5+
import com.backbase.investment.api.service.v1.model.GroupResult;
6+
import com.backbase.investment.api.service.v1.model.Market;
7+
import com.backbase.investment.api.service.v1.model.MarketSpecialDay;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.Objects;
11+
import java.util.UUID;
12+
import java.util.function.Function;
13+
import java.util.stream.Collectors;
14+
import lombok.Builder;
15+
import lombok.Data;
16+
import lombok.EqualsAndHashCode;
17+
18+
@EqualsAndHashCode
19+
@Data
20+
@Builder
21+
public class InvestmentAssetData {
22+
23+
private List<Market> markets;
24+
private List<MarketSpecialDay> marketSpecialDays;
25+
private List<AssetCategoryType> assetCategoryTypes;
26+
private List<AssetCategory> assetCategories;
27+
private List<Asset> assets;
28+
private List<AssetPrice> assetPrices;
29+
private List<GroupResult> priceAsyncTasks;
30+
31+
public Map<String, AssetPrice> getPriceByAsset() {
32+
return Objects.requireNonNullElse(assetPrices, List.<AssetPrice>of()).stream()
33+
.collect(Collectors.toMap(AssetKey::getKeyString, Function.identity()));
34+
}
35+
36+
public Map<UUID, Asset> getAssetByUuid() {
37+
return Objects.requireNonNullElse(assets, List.<Asset>of()).stream()
38+
.collect(Collectors.toMap(Asset::uuid, Function.identity()));
39+
40+
}
41+
42+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.backbase.stream.investment;
2+
3+
import com.backbase.investment.api.service.v1.model.AssetCategory;
4+
import com.backbase.investment.api.service.v1.model.AssetCategoryType;
5+
import com.backbase.investment.api.service.v1.model.GroupResult;
6+
import com.backbase.investment.api.service.v1.model.Market;
7+
import com.backbase.investment.api.service.v1.model.MarketSpecialDay;
8+
import com.backbase.stream.worker.model.StreamTask;
9+
import java.util.List;
10+
import lombok.Data;
11+
import lombok.EqualsAndHashCode;
12+
13+
@EqualsAndHashCode(callSuper = true)
14+
@Data
15+
public class InvestmentAssetsTask extends StreamTask {
16+
17+
private final InvestmentAssetData data;
18+
19+
public InvestmentAssetsTask(String unitOfWorkId, InvestmentAssetData data) {
20+
super(unitOfWorkId);
21+
this.data = data;
22+
}
23+
24+
@Override
25+
public String getName() {
26+
return "investment";
27+
}
28+
29+
public void setMarkets(List<Market> markets) {
30+
data.setMarkets(markets);
31+
}
32+
33+
public void setMarketSpecialDays(List<MarketSpecialDay> marketSpecialDays) {
34+
data.setMarketSpecialDays(marketSpecialDays);
35+
}
36+
37+
public void setAssetCategoryTypes(List<AssetCategoryType> assetCategoryTypes) {
38+
data.setAssetCategoryTypes(assetCategoryTypes);
39+
}
40+
41+
public void setAssetCategories(List<AssetCategory> assetCategories) {
42+
data.setAssetCategories(assetCategories);
43+
}
44+
45+
public void setAssets(List<Asset> assets) {
46+
data.setAssets(assets);
47+
}
48+
49+
public InvestmentAssetsTask setPriceTasks(List<GroupResult> tasks) {
50+
data.setPriceAsyncTasks(tasks);
51+
return this;
52+
}
53+
54+
}

0 commit comments

Comments
 (0)