From a23de4574c9d3c680ac14c22cec826fb1dd10414 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 23 Aug 2026 09:36:42 +0200 Subject: [PATCH] Fix market price carry forward on dates with activities --- .../portfolio-calculator-baln-buy.spec.ts | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts index a2d576361..947935296 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts @@ -293,5 +293,48 @@ describe('PortfolioCalculator', () => { // Closing price on 2021-11-30: 136.6 expect(snapshotOnBuyDate?.netPerformanceWithCurrencyEffect).toEqual(1.65); // 2 * (136.6 - 135.0) - 1.55 = 1.65 }); + + it.only('with BALN.SW buy (on a date without historical market data)', async () => { + jest.useFakeTimers().setSystemTime(parseDate('2021-12-18').getTime()); + + const activities: Activity[] = [ + { + ...activityDummyData, + assetProfile: { + ...assetProfileDummyData, + currency: 'CHF', + dataSource: 'YAHOO', + name: 'Bâloise Holding AG', + symbol: 'BALN.SW' + }, + date: new Date('2021-11-30'), + feeInAssetProfileCurrency: 1.55, + feeInBaseCurrency: 1.55, + quantity: 2, + type: 'BUY', + unitPriceInAssetProfileCurrency: 136.6 + } + ]; + + const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ + activities, + calculationType: PerformanceCalculationType.ROAI, + currency: 'CHF', + userId: userDummyData.id + }); + + const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); + const snapshotOnDateWithoutMarketData = + portfolioSnapshot.historicalData.find(({ date }) => { + return date === '2021-12-05'; + }); + + // No historical market data on 2021-12-05: carry forward the closing + // price of 2021-11-30, which is the date of the activity + expect(snapshotOnDateWithoutMarketData?.value).toEqual(273.2); // 2 * 136.6 + expect( + snapshotOnDateWithoutMarketData?.netPerformanceWithCurrencyEffect + ).toEqual(-1.55); // 2 * (136.6 - 136.6) - 1.55 + }); }); });