From 02880ed5797762ee3313f0485d4a2a7ef32af0cf Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Mon, 26 Oct 2026 22:19:51 +0300 Subject: [PATCH] fix: mark unpriced positions as partial return (#138) --- .../brokerage-accounts.service.spec.ts | 6 ++++-- .../brokerage-accounts/brokerage-accounts.service.ts | 11 ++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/modules/investments/brokerage-accounts/brokerage-accounts.service.spec.ts b/src/modules/investments/brokerage-accounts/brokerage-accounts.service.spec.ts index 7a87469..8d51469 100644 --- a/src/modules/investments/brokerage-accounts/brokerage-accounts.service.spec.ts +++ b/src/modules/investments/brokerage-accounts/brokerage-accounts.service.spec.ts @@ -111,15 +111,17 @@ describe('saved brokerage account projection', () => { { type: 'FUND', quantity: '3', averagePurchasePrice: { currency: 'USD', value: '2.5' }, absoluteReturn: null }, { type: 'STOCK', quantity: '4', averagePurchasePrice: { currency: 'USD', value: '0' }, absoluteReturn: { currency: 'USD', value: '2.5' } }, { type: 'CURRENCY', quantity: '100', averagePurchasePrice: { currency: 'EUR', value: '1' }, absoluteReturn: { currency: 'EUR', value: '5' } }, + { type: 'BOND', quantity: '1', currentValue: { currency: 'CNY', value: '7' }, averagePurchasePrice: null, absoluteReturn: null }, ], }, }], }); expect((await service.list('owner')).data?.[0].portfolioSummary).toMatchObject({ - stockPositionCount: 2, bondPositionCount: 1, - fundPositionCount: 1, totalPositionCount: 5, + stockPositionCount: 2, bondPositionCount: 2, + fundPositionCount: 1, totalPositionCount: 6, unrealizedReturnByCurrency: [ + { currency: 'CNY', absolute: '0', costBasis: '0', percent: null, partial: true }, { currency: 'RUB', absolute: '1.250000003', costBasis: '30.000000002', percent: '4.17', partial: false }, { currency: 'USD', absolute: '2.5', costBasis: '0', percent: null, partial: true }, ], diff --git a/src/modules/investments/brokerage-accounts/brokerage-accounts.service.ts b/src/modules/investments/brokerage-accounts/brokerage-accounts.service.ts index 86649c6..29fefdc 100644 --- a/src/modules/investments/brokerage-accounts/brokerage-accounts.service.ts +++ b/src/modules/investments/brokerage-accounts/brokerage-accounts.service.ts @@ -40,11 +40,12 @@ function unrealizedReturns(positions: PortfolioPositionDto[]): UnrealizedReturnD ), ); const partial = new Set( - investments.flatMap((position) => - !position.absoluteReturn && position.averagePurchasePrice - ? [position.averagePurchasePrice.currency] - : [], - ), + investments.flatMap((position) => { + const money = position.absoluteReturn + ? null + : position.averagePurchasePrice ?? position.currentValue; + return money ? [money.currency] : []; + }), ); const currencies = new Set([...absolute, ...costs].map((money) => money.currency)); return [...new Set([...currencies, ...partial])]