From 706511e7cb1ac8e57ccb01d713462dc90e4ed95d Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 11 Oct 2026 10:56:07 +0200 Subject: [PATCH] Fix start date of investment timeline --- .../app/portfolio/portfolio.service.spec.ts | 46 ++++++++++++++++++- .../src/app/portfolio/portfolio.service.ts | 3 +- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts index ac5dfebd49..a043a10309 100644 --- a/apps/api/src/app/portfolio/portfolio.service.spec.ts +++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts @@ -23,7 +23,7 @@ import { Filter, PortfolioSummary } from '@ghostfolio/common/interfaces'; -import { AccountWithBalance } from '@ghostfolio/common/types'; +import { AccountWithBalance, DateRange } from '@ghostfolio/common/types'; import { AssetClass, DataSource, Prisma } from '@prisma/client'; import { Big } from 'big.js'; @@ -842,6 +842,50 @@ describe('PortfolioService', () => { }); }); + describe('getInvestments', () => { + afterEach(() => { + jest.useRealTimers(); + }); + + it.each(['2025', 'ytd'] as DateRange[])( + 'should exclude the investment of the start date of the date range %s', + async (dateRange) => { + jest.useFakeTimers().setSystemTime(parseDate('2025-06-15').getTime()); + + jest + .spyOn(activitiesService, 'getActivitiesForPortfolioCalculator') + .mockResolvedValue({ activities: [{} as Activity], count: 1 }); + + jest + .spyOn(portfolioCalculatorFactory, 'createCalculator') + .mockReturnValue({ + getSnapshot: jest.fn().mockResolvedValue({ + historicalData: [ + { date: '2024-12-31', investmentValueWithCurrencyEffect: 100 }, + { date: '2025-01-01', investmentValueWithCurrencyEffect: 200 } + ] + }) + } as unknown as PortfolioCalculator); + + jest.spyOn(userService, 'user').mockResolvedValue({ + id: userDummyData.id, + settings: { + settings: { + baseCurrency: 'CHF' + } + } + } as unknown as Awaited>); + + const { investments } = await portfolioService.getInvestments({ + dateRange, + userId: userDummyData.id + }); + + expect(investments).toEqual([{ date: '2025-01-01', investment: 200 }]); + } + ); + }); + describe('getPerformance', () => { let getPerformanceOfCalculator: jest.Mock; diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index c67bb51064..ebd05805f5 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -98,7 +98,6 @@ import { endOfDay, format, isAfter, - isBefore, isSameMonth, isSameYear, min, @@ -564,7 +563,7 @@ export class PortfolioService { const date = resetHours(parseDate(historicalDataItem.date)); return ( - !isBefore(date, resetHours(startDate)) && + isAfter(date, resetHours(startDate)) && !isAfter(date, resetHours(endDate)) ); });