From 0d4dd45e6407ebf8c43f8ba631adf9fa3e7de0a1 Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 30 Aug 2024 18:49:19 +0200 Subject: [PATCH 1/7] Fix Filter Handling --- apps/api/src/app/user/user.controller.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index c23870437..6b6b96fce 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -158,6 +158,12 @@ export class UserController { } } + for (const key in data) { + if (data[key] !== false && data[key] !== null) { + userSettings[key] = data[key]; + } + } + return this.userService.updateUserSetting({ emitPortfolioChangedEvent, userSettings, From e6c0102139ff30d2abb8c92a14a3ab1c7fc8c28f Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 30 Aug 2024 20:49:50 +0200 Subject: [PATCH 2/7] Fix Tag Handling --- apps/api/src/app/admin/admin.service.ts | 1 + .../src/app/portfolio/portfolio.service.ts | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 348a8d8d3..1ef2abfde 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -419,6 +419,7 @@ export class AdminService { sectors, symbol, symbolMapping, + tags, ...(dataSource === 'MANUAL' ? { assetClass, assetSubClass, name, url } : { diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index a0a327712..fbd456414 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1390,8 +1390,37 @@ export class PortfolioService { userId: string; }) { userId = await this.getUserId(impersonationId, userId); - - await this.orderService.assignTags({ dataSource, symbol, tags, userId }); + let symbolProfile = await this.symbolProfileService.getSymbolProfiles([ + { + dataSource, + symbol + } + ])[0]; + await this.symbolProfileService.updateSymbolProfile({ + assetClass: symbolProfile.assetClass, + assetSubClass: symbolProfile.assetSubClass, + countries: symbolProfile.countries, + currency: symbolProfile.currency, + dataSource, + holdings: symbolProfile.holdings, + name: symbolProfile.name, + sectors: symbolProfile.sectors, + symbol, + tags: { + connectOrCreate: tags.map(({ id,name }) => { + return { + create: { + id, + name + }, + where: { + id + } + }; + } + }, + url: symbolProfile.url + }); } @LogPerformance From 92d048773e3dbb7a636f32305ec756104ef7af7f Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 30 Aug 2024 20:50:01 +0200 Subject: [PATCH 3/7] Fix Detail DIalog --- .../holding-detail-dialog/holding-detail-dialog.component.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index a0f341cc6..75b7ca2b0 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -350,7 +350,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } } - if (isToday(parseISO(this.firstBuyDate))) { + if (this.firstBuyDate && isToday(parseISO(this.firstBuyDate))) { // Add average price this.historicalDataItems.push({ date: this.firstBuyDate, @@ -390,6 +390,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { if ( this.benchmarkDataItems[0]?.value === undefined && + this.firstBuyDate && isSameMonth(parseISO(this.firstBuyDate), new Date()) ) { this.benchmarkDataItems[0].value = this.averagePrice; From 2cf8dc76a4bd07440b546f6c2e43ca7fd590e06e Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 30 Aug 2024 21:19:12 +0200 Subject: [PATCH 4/7] Remove dividends from committed funds --- apps/api/src/app/portfolio/portfolio.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index fbd456414..a1bf1ac12 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1791,7 +1791,7 @@ export class PortfolioService { .plus(emergencyFundPositionsValueInBaseCurrency) .toNumber(); - const committedFunds = new Big(totalBuy).minus(totalSell); + const committedFunds = new Big(totalBuy).minus(totalSell).minus(dividendInBaseCurrency); const totalOfExcludedActivities = this.getSumOfActivityType({ userCurrency, From 8141c6647348fbc72d962c98de60aa8879d1304b Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 30 Aug 2024 21:19:19 +0200 Subject: [PATCH 5/7] Stake Handling --- .../app/portfolio/calculator/twr/portfolio-calculator.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index 4f053355c..8eced948f 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -503,6 +503,13 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { .mul(order.quantity) .mul(getFactor(order.type)); } + } else if (order.type === 'STAKE') { + transactionInvestment = new Big(0); + + transactionInvestmentWithCurrencyEffect = new Big(0); + + totalQuantityFromBuyTransactions = + totalQuantityFromBuyTransactions.plus(order.quantity); } if (PortfolioCalculator.ENABLE_LOGGING) { @@ -634,7 +641,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { // the time weighted investment if ( valueOfInvestmentBeforeTransaction.gt(0) && - ['BUY', 'SELL'].includes(order.type) + ['BUY', 'SELL', 'STAKE'].includes(order.type) ) { // Calculate the number of days since the previous order const orderDate = new Date(order.date); From bfa3e2b1b3d4266798e313336bdb0f4634982ee4 Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 30 Aug 2024 21:21:57 +0200 Subject: [PATCH 6/7] Remove Stake from index order date --- .../src/app/portfolio/calculator/twr/portfolio-calculator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts index 8eced948f..18e0c30c8 100644 --- a/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts @@ -641,7 +641,7 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { // the time weighted investment if ( valueOfInvestmentBeforeTransaction.gt(0) && - ['BUY', 'SELL', 'STAKE'].includes(order.type) + ['BUY', 'SELL'].includes(order.type) ) { // Calculate the number of days since the previous order const orderDate = new Date(order.date); From 6f01885df269d7364ef5843d07bb37d071bc85f1 Mon Sep 17 00:00:00 2001 From: Dan Date: Fri, 30 Aug 2024 21:38:10 +0200 Subject: [PATCH 7/7] fix --- apps/api/src/app/portfolio/portfolio.service.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index a1bf1ac12..d6f8bae78 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1407,7 +1407,7 @@ export class PortfolioService { sectors: symbolProfile.sectors, symbol, tags: { - connectOrCreate: tags.map(({ id,name }) => { + connectOrCreate: tags.map(({ id, name }) => { return { create: { id, @@ -1417,9 +1417,9 @@ export class PortfolioService { id } }; - } + }) }, - url: symbolProfile.url + url: symbolProfile.url }); } @@ -1791,7 +1791,9 @@ export class PortfolioService { .plus(emergencyFundPositionsValueInBaseCurrency) .toNumber(); - const committedFunds = new Big(totalBuy).minus(totalSell).minus(dividendInBaseCurrency); + const committedFunds = new Big(totalBuy) + .minus(totalSell) + .minus(dividendInBaseCurrency); const totalOfExcludedActivities = this.getSumOfActivityType({ userCurrency,