Browse Source
Bugfix/fix fees calculation in portfolio summary (#3567)
* Fix fees calculation
* Update changelog
pull/3568/head^2
Thomas Kaul
7 months ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with
29 additions and
5 deletions
-
CHANGELOG.md
-
apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy-and-sell.spec.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-baln-buy.spec.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-fee.spec.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-googl-buy.spec.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-item.spec.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator-novn-buy-and-sell.spec.ts
-
apps/api/src/app/portfolio/calculator/twr/portfolio-calculator.ts
-
libs/common/src/lib/models/timeline-position.ts
|
|
@ -12,6 +12,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 |
|
|
|
- Improved the chart of the holdings tab on the home page (experimental) |
|
|
|
- Separated the icon purposes in the `site.webmanifest` |
|
|
|
|
|
|
|
### Fixed |
|
|
|
|
|
|
|
- Fixed an issue in the portfolio summary with the currency conversion of fees |
|
|
|
|
|
|
|
## 2.95.0 - 2024-07-12 |
|
|
|
|
|
|
|
### Added |
|
|
|
|
|
@ -300,6 +300,12 @@ export abstract class PortfolioCalculator { |
|
|
|
const errors: ResponseError['errors'] = []; |
|
|
|
|
|
|
|
for (const item of lastTransactionPoint.items) { |
|
|
|
const feeInBaseCurrency = item.fee.mul( |
|
|
|
exchangeRatesByCurrency[`${item.currency}${this.currency}`]?.[ |
|
|
|
lastTransactionPoint.date |
|
|
|
] |
|
|
|
); |
|
|
|
|
|
|
|
const marketPriceInBaseCurrency = ( |
|
|
|
marketSymbolMap[endDateString]?.[item.symbol] ?? item.averagePrice |
|
|
|
).mul( |
|
|
@ -340,10 +346,11 @@ export abstract class PortfolioCalculator { |
|
|
|
hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors; |
|
|
|
|
|
|
|
positions.push({ |
|
|
|
dividend: totalDividend, |
|
|
|
dividendInBaseCurrency: totalDividendInBaseCurrency, |
|
|
|
feeInBaseCurrency, |
|
|
|
timeWeightedInvestment, |
|
|
|
timeWeightedInvestmentWithCurrencyEffect, |
|
|
|
dividend: totalDividend, |
|
|
|
dividendInBaseCurrency: totalDividendInBaseCurrency, |
|
|
|
averagePrice: item.averagePrice, |
|
|
|
currency: item.currency, |
|
|
|
dataSource: item.dataSource, |
|
|
|
|
|
@ -168,6 +168,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
dividend: new Big('0'), |
|
|
|
dividendInBaseCurrency: new Big('0'), |
|
|
|
fee: new Big('3.2'), |
|
|
|
feeInBaseCurrency: new Big('3.2'), |
|
|
|
firstBuyDate: '2021-11-22', |
|
|
|
grossPerformance: new Big('-12.6'), |
|
|
|
grossPerformancePercentage: new Big('-0.04408677396780965649'), |
|
|
|
|
|
@ -153,6 +153,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
dividend: new Big('0'), |
|
|
|
dividendInBaseCurrency: new Big('0'), |
|
|
|
fee: new Big('3.2'), |
|
|
|
feeInBaseCurrency: new Big('3.2'), |
|
|
|
firstBuyDate: '2021-11-22', |
|
|
|
grossPerformance: new Big('-12.6'), |
|
|
|
grossPerformancePercentage: new Big('-0.0440867739678096571'), |
|
|
|
|
|
@ -138,6 +138,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
dividend: new Big('0'), |
|
|
|
dividendInBaseCurrency: new Big('0'), |
|
|
|
fee: new Big('1.55'), |
|
|
|
feeInBaseCurrency: new Big('1.55'), |
|
|
|
firstBuyDate: '2021-11-30', |
|
|
|
grossPerformance: new Big('24.6'), |
|
|
|
grossPerformancePercentage: new Big('0.09004392386530014641'), |
|
|
|
|
|
@ -166,6 +166,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
dividend: new Big('0'), |
|
|
|
dividendInBaseCurrency: new Big('0'), |
|
|
|
fee: new Big('0'), |
|
|
|
feeInBaseCurrency: new Big('0'), |
|
|
|
firstBuyDate: '2015-01-01', |
|
|
|
grossPerformance: new Big('27172.74'), |
|
|
|
grossPerformancePercentage: new Big('42.41978276196153750666'), |
|
|
|
|
|
@ -123,6 +123,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
dividend: new Big('0'), |
|
|
|
dividendInBaseCurrency: new Big('0'), |
|
|
|
fee: new Big('49'), |
|
|
|
feeInBaseCurrency: new Big('49'), |
|
|
|
firstBuyDate: '2021-09-01', |
|
|
|
grossPerformance: null, |
|
|
|
grossPerformancePercentage: null, |
|
|
|
|
|
@ -151,6 +151,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
dividend: new Big('0'), |
|
|
|
dividendInBaseCurrency: new Big('0'), |
|
|
|
fee: new Big('1'), |
|
|
|
feeInBaseCurrency: new Big('0.9238'), |
|
|
|
firstBuyDate: '2023-01-03', |
|
|
|
grossPerformance: new Big('27.33'), |
|
|
|
grossPerformancePercentage: new Big('0.3066651705565529623'), |
|
|
@ -177,7 +178,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
valueInBaseCurrency: new Big('103.10483') |
|
|
|
} |
|
|
|
], |
|
|
|
totalFeesWithCurrencyEffect: new Big('1'), |
|
|
|
totalFeesWithCurrencyEffect: new Big('0.9238'), |
|
|
|
totalInterestWithCurrencyEffect: new Big('0'), |
|
|
|
totalInvestment: new Big('89.12'), |
|
|
|
totalInvestmentWithCurrencyEffect: new Big('82.329056'), |
|
|
|
|
|
@ -123,6 +123,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
dividend: new Big('0'), |
|
|
|
dividendInBaseCurrency: new Big('0'), |
|
|
|
fee: new Big('0'), |
|
|
|
feeInBaseCurrency: new Big('0'), |
|
|
|
firstBuyDate: '2022-01-01', |
|
|
|
grossPerformance: null, |
|
|
|
grossPerformancePercentage: null, |
|
|
|
|
|
@ -153,6 +153,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
dividend: new Big('0'), |
|
|
|
dividendInBaseCurrency: new Big('0'), |
|
|
|
fee: new Big('4.25'), |
|
|
|
feeInBaseCurrency: new Big('4.25'), |
|
|
|
firstBuyDate: '2022-03-07', |
|
|
|
grossPerformance: new Big('21.93'), |
|
|
|
grossPerformancePercentage: new Big('0.15113417083448194384'), |
|
|
|
|
|
@ -183,6 +183,7 @@ describe('PortfolioCalculator', () => { |
|
|
|
dividend: new Big('0'), |
|
|
|
dividendInBaseCurrency: new Big('0'), |
|
|
|
fee: new Big('0'), |
|
|
|
feeInBaseCurrency: new Big('0'), |
|
|
|
firstBuyDate: '2022-03-07', |
|
|
|
grossPerformance: new Big('19.86'), |
|
|
|
grossPerformancePercentage: new Big('0.13100263852242744063'), |
|
|
|
|
|
@ -34,9 +34,9 @@ export class TWRPortfolioCalculator extends PortfolioCalculator { |
|
|
|
let totalTimeWeightedInvestmentWithCurrencyEffect = new Big(0); |
|
|
|
|
|
|
|
for (const currentPosition of positions) { |
|
|
|
if (currentPosition.fee) { |
|
|
|
if (currentPosition.feeInBaseCurrency) { |
|
|
|
totalFeesWithCurrencyEffect = totalFeesWithCurrencyEffect.plus( |
|
|
|
currentPosition.fee |
|
|
|
currentPosition.feeInBaseCurrency |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -24,6 +24,10 @@ export class TimelinePosition { |
|
|
|
@Type(() => Big) |
|
|
|
fee: Big; |
|
|
|
|
|
|
|
@Transform(transformToBig, { toClassOnly: true }) |
|
|
|
@Type(() => Big) |
|
|
|
feeInBaseCurrency: Big; |
|
|
|
|
|
|
|
firstBuyDate: string; |
|
|
|
|
|
|
|
@Transform(transformToBig, { toClassOnly: true }) |
|
|
|