diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f347914c..4c1751763 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Fixed + +- Fixed the time in market of the portfolio summary to be empty if there is no activity + ## 3.35.0 - 2026-07-27 ### Added diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 80968ebd1..38f942156 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -816,25 +816,39 @@ export abstract class PortfolioCalculator { let firstAccountBalanceDate: Date; let firstActivityDate: Date; - try { - const firstAccountBalanceDateString = this.accountBalanceItems[0]?.date; - firstAccountBalanceDate = firstAccountBalanceDateString - ? parseDate(firstAccountBalanceDateString) - : new Date(); - } catch (error) { - firstAccountBalanceDate = new Date(); + if (this.accountBalanceItems?.length > 0) { + try { + const firstAccountBalanceDateString = this.accountBalanceItems[0].date; + firstAccountBalanceDate = firstAccountBalanceDateString + ? parseDate(firstAccountBalanceDateString) + : new Date(); + } catch (error) { + firstAccountBalanceDate = new Date(); + } } - try { - const firstActivityDateString = this.transactionPoints[0].date; - firstActivityDate = firstActivityDateString - ? parseDate(firstActivityDateString) - : new Date(); - } catch (error) { - firstActivityDate = new Date(); + if (this.transactionPoints?.length > 0) { + try { + const firstActivityDateString = this.transactionPoints[0].date; + firstActivityDate = firstActivityDateString + ? parseDate(firstActivityDateString) + : new Date(); + } catch (error) { + firstActivityDate = new Date(); + } + } + + const dates = [firstAccountBalanceDate, firstActivityDate].filter( + (date) => { + return !!date; + } + ); + + if (dates.length === 0) { + return undefined; } - return min([firstAccountBalanceDate, firstActivityDate]); + return min(dates); } protected abstract getSymbolMetrics({ diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 2eae63544..6a3c1f145 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1986,7 +1986,9 @@ export class PortfolioService { .minus(liabilities) .toNumber(); - const daysInMarket = differenceInDays(new Date(), dateOfFirstActivity); + const daysInMarket = dateOfFirstActivity + ? differenceInDays(new Date(), dateOfFirstActivity) + : 0; const annualizedPerformancePercent = getAnnualizedPerformancePercent({ daysInMarket, diff --git a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts index 8bc79b624..1cd2ec93c 100644 --- a/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts +++ b/apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts @@ -116,7 +116,7 @@ export class GfPortfolioSummaryComponent implements OnChanges { } ); } else { - this.timeInMarket = '-'; + this.timeInMarket = '–'; } } else { this.timeInMarket = undefined; diff --git a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts index e109a7e63..b1b7e938b 100644 --- a/libs/common/src/lib/interfaces/portfolio-summary.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-summary.interface.ts @@ -6,7 +6,7 @@ export interface PortfolioSummary extends PortfolioPerformance { annualizedPerformancePercent: number; annualizedPerformancePercentWithCurrencyEffect: number; cash: number; - dateOfFirstActivity: Date; + dateOfFirstActivity?: Date; dividendInBaseCurrency: number; emergencyFund: { assets: number;