fix: count brokerage cash once and skip short-position return percent (WealthLedger/backend#140)

This commit is contained in:
2026-10-28 08:00:20 +03:00
parent 97fc41fa29
commit f2843e30bd
6 changed files with 65 additions and 8 deletions
@@ -19,7 +19,7 @@ const position = (
});
describe('portfolio structure', () => {
it('includes cash once and keeps currency instruments among other assets', () => {
it('counts cash once and skips CURRENCY positions that mirror it', () => {
const result = portfolioStructure(
[
position('STOCK', '60'),
@@ -30,13 +30,13 @@ describe('portfolio structure', () => {
);
expect(result.currencies[0]).toEqual({
currency: 'RUB',
totalValue: '100',
totalValue: '90',
hasNegativeValues: false,
categories: [
{ type: 'STOCK', value: '60', sharePercent: '60' },
{ type: 'BOND', value: '20', sharePercent: '20' },
{ type: 'OTHER', value: '10', sharePercent: '10' },
{ type: 'CASH', value: '10', sharePercent: '10' },
{ type: 'STOCK', value: '60', sharePercent: '66.666667' },
{ type: 'BOND', value: '20', sharePercent: '22.222222' },
{ type: 'OTHER', value: '0', sharePercent: '0' },
{ type: 'CASH', value: '10', sharePercent: '11.111111' },
],
});
});
@@ -43,6 +43,8 @@ export function portfolioStructure(
currencies.set(money.currency, group);
};
for (const position of positions) {
// CURRENCY positions mirror cash, which is counted once as CASH below.
if (position.type === 'CURRENCY') continue;
const type = ['BOND', 'STOCK'].includes(position.type)
? position.type
: 'OTHER';