From 58a248a93ec85fd47a469c0322c8e26e01952049 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 3 Feb 2024 08:22:09 +0100 Subject: [PATCH] Refactoring --- ...folio-calculator-novn-buy-and-sell.spec.ts | 6 ++--- .../src/app/portfolio/portfolio-calculator.ts | 21 ++++++++++------ .../src/app/portfolio/portfolio.service.ts | 25 ++++++++++--------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts index 03ececc10..6a356e6e3 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -68,9 +68,9 @@ describe('PortfolioCalculator', () => { .spyOn(Date, 'now') .mockImplementation(() => parseDate('2022-04-11').getTime()); - const chartData = await portfolioCalculator.getChartData( - parseDate('2022-03-07') - ); + const chartData = await portfolioCalculator.getChartData({ + start: parseDate('2022-03-07') + }); const currentPositions = await portfolioCalculator.getCurrentPositions( parseDate('2022-03-07') diff --git a/apps/api/src/app/portfolio/portfolio-calculator.ts b/apps/api/src/app/portfolio/portfolio-calculator.ts index 2ad733221..d5585d255 100644 --- a/apps/api/src/app/portfolio/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/portfolio-calculator.ts @@ -174,11 +174,15 @@ export class PortfolioCalculator { this.transactionPoints = transactionPoints; } - public async getChartData( - start: Date, + public async getChartData({ end = new Date(Date.now()), + start, step = 1 - ): Promise { + }: { + end?: Date; + start: Date; + step?: number; + }): Promise { const symbols: { [symbol: string]: boolean } = {}; const transactionPointsBeforeEndDate = @@ -686,6 +690,9 @@ export class PortfolioCalculator { }); } + /** + * @deprecated + */ public getInvestmentsByGroup( groupBy: GroupBy ): { date: string; investment: Big }[] { @@ -1421,6 +1428,10 @@ export class PortfolioCalculator { investmentValuesAccumulatedWithCurrencyEffect[order.date] = totalInvestmentWithCurrencyEffect; + investmentValuesWithCurrencyEffect[order.date] = ( + investmentValuesWithCurrencyEffect[order.date] ?? new Big(0) + ).add(transactionInvestmentWithCurrencyEffect); + timeWeightedInvestmentValues[order.date] = totalInvestmentDays > 0 ? sumOfTimeWeightedInvestments.div(totalInvestmentDays) @@ -1432,10 +1443,6 @@ export class PortfolioCalculator { totalInvestmentDays ) : new Big(0); - - investmentValuesWithCurrencyEffect[order.date] = ( - investmentValuesWithCurrencyEffect[order.date] ?? new Big(0) - ).add(transactionInvestmentWithCurrencyEffect); } } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 4e95c46bc..9e6fedea2 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -1442,11 +1442,11 @@ export class PortfolioService { step = Math.round(daysInMarket / Math.min(daysInMarket, MAX_CHART_ITEMS)); } - const items = await portfolioCalculator.getChartData( - startDate, - endDate, - step - ); + const items = await portfolioCalculator.getChartData({ + step, + end: endDate, + start: startDate + }); return { items, @@ -1606,18 +1606,19 @@ export class PortfolioService { data: HistoricalDataItem[]; groupBy: GroupBy; }): InvestmentItem[] { - const groupedData: { [dateGroup: string]: number } = {}; + const groupedData: { [dateGroup: string]: Big } = {}; for (const { date, investmentValueWithCurrencyEffect } of data) { - const unit = + const dateGroup = groupBy === 'month' ? date.substring(0, 7) : date.substring(0, 4); - groupedData[unit] = - (groupedData[unit] ?? 0) + investmentValueWithCurrencyEffect; + groupedData[dateGroup] = (groupedData[dateGroup] ?? new Big(0)).plus( + investmentValueWithCurrencyEffect + ); } - return Object.keys(groupedData).map((unit) => ({ - date: groupBy === 'month' ? `${unit}-01` : `${unit}-01-01`, - investment: groupedData[unit] + return Object.keys(groupedData).map((dateGroup) => ({ + date: groupBy === 'month' ? `${dateGroup}-01` : `${dateGroup}-01-01`, + investment: groupedData[dateGroup].toNumber() })); }