Browse Source

feat(api): do not fetch cash asset market price

pull/5650/head
KenTandrian 1 week ago
parent
commit
4aa71b5e22
  1. 28
      apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
  2. 7
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts
  3. 2
      apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts
  4. 1
      apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts
  5. 3
      apps/api/src/app/portfolio/portfolio.service.ts

28
apps/api/src/app/portfolio/calculator/portfolio-calculator.ts

@ -136,12 +136,15 @@ export abstract class PortfolioCalculator {
}
return {
SymbolProfile,
tags,
type,
date: format(date, DATE_FORMAT),
fee: new Big(feeInAssetProfileCurrency),
quantity: new Big(quantity),
SymbolProfile: {
...SymbolProfile,
assetSubClass: SymbolProfile.assetSubClass
},
unitPrice: new Big(unitPriceInAssetProfileCurrency)
};
}
@ -203,13 +206,19 @@ export abstract class PortfolioCalculator {
let totalInterestWithCurrencyEffect = new Big(0);
let totalLiabilitiesWithCurrencyEffect = new Big(0);
for (const { currency, dataSource, symbol } of transactionPoints[
firstIndex - 1
].items) {
dataGatheringItems.push({
dataSource,
symbol
});
for (const {
assetSubClass,
currency,
dataSource,
symbol
} of transactionPoints[firstIndex - 1].items) {
// Gather data for all assets except CASH
if (assetSubClass !== 'CASH') {
dataGatheringItems.push({
dataSource,
symbol
});
}
currencies[symbol] = currency;
}
@ -933,6 +942,7 @@ export abstract class PortfolioCalculator {
} of this.activities) {
let currentTransactionPointItem: TransactionPointSymbol;
const assetSubClass = SymbolProfile.assetSubClass;
const currency = SymbolProfile.currency;
const dataSource = SymbolProfile.dataSource;
const factor = getFactor(type);
@ -977,6 +987,7 @@ export abstract class PortfolioCalculator {
}
currentTransactionPointItem = {
assetSubClass,
currency,
dataSource,
investment,
@ -995,6 +1006,7 @@ export abstract class PortfolioCalculator {
};
} else {
currentTransactionPointItem = {
assetSubClass,
currency,
dataSource,
fee,

7
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts

@ -188,6 +188,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
})
);
const isCash = orders[0]?.SymbolProfile?.assetSubClass === 'CASH';
if (orders.length <= 0) {
return {
currentValues: {},
@ -244,6 +246,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
// For BUY / SELL activities with a MANUAL data source where no historical market price is available,
// the calculation should fall back to using the activity’s unit price.
unitPriceAtEndDate = latestActivity.unitPrice;
} else if (isCash) {
unitPriceAtEndDate = new Big(1);
}
if (
@ -294,6 +298,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
itemType: 'start',
quantity: new Big(0),
SymbolProfile: {
assetSubClass: isCash ? 'CASH' : undefined,
dataSource,
symbol
},
@ -307,6 +312,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
feeInBaseCurrency: new Big(0),
itemType: 'end',
SymbolProfile: {
assetSubClass: isCash ? 'CASH' : undefined,
dataSource,
symbol
},
@ -347,6 +353,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
feeInBaseCurrency: new Big(0),
quantity: new Big(0),
SymbolProfile: {
assetSubClass: isCash ? 'CASH' : undefined,
dataSource,
symbol
},

2
apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts

@ -6,7 +6,7 @@ export interface PortfolioOrder extends Pick<Activity, 'tags' | 'type'> {
quantity: Big;
SymbolProfile: Pick<
Activity['SymbolProfile'],
'currency' | 'dataSource' | 'name' | 'symbol' | 'userId'
'assetSubClass' | 'currency' | 'dataSource' | 'name' | 'symbol' | 'userId'
>;
unitPrice: Big;
}

1
apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts

@ -2,6 +2,7 @@ import { DataSource, Tag } from '@prisma/client';
import { Big } from 'big.js';
export interface TransactionPointSymbol {
assetSubClass?: string;
averagePrice: Big;
currency: string;
dataSource: DataSource;

3
apps/api/src/app/portfolio/portfolio.service.ts

@ -487,7 +487,7 @@ export class PortfolioService {
(user.settings?.settings as UserSettings)?.emergencyFund ?? 0
);
// Activities for non-cash assets
// Activities for cash and non-cash assets
const { activities } =
await this.orderService.getOrdersForPortfolioCalculator({
filters,
@ -495,7 +495,6 @@ export class PortfolioService {
userId
});
// Synthetic activities for cash
const cashDetails = await this.accountService.getCashDetails({
filters,
userId,

Loading…
Cancel
Save