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 { return {
SymbolProfile,
tags, tags,
type, type,
date: format(date, DATE_FORMAT), date: format(date, DATE_FORMAT),
fee: new Big(feeInAssetProfileCurrency), fee: new Big(feeInAssetProfileCurrency),
quantity: new Big(quantity), quantity: new Big(quantity),
SymbolProfile: {
...SymbolProfile,
assetSubClass: SymbolProfile.assetSubClass
},
unitPrice: new Big(unitPriceInAssetProfileCurrency) unitPrice: new Big(unitPriceInAssetProfileCurrency)
}; };
} }
@ -203,13 +206,19 @@ export abstract class PortfolioCalculator {
let totalInterestWithCurrencyEffect = new Big(0); let totalInterestWithCurrencyEffect = new Big(0);
let totalLiabilitiesWithCurrencyEffect = new Big(0); let totalLiabilitiesWithCurrencyEffect = new Big(0);
for (const { currency, dataSource, symbol } of transactionPoints[ for (const {
firstIndex - 1 assetSubClass,
].items) { currency,
dataGatheringItems.push({ dataSource,
dataSource, symbol
symbol } of transactionPoints[firstIndex - 1].items) {
}); // Gather data for all assets except CASH
if (assetSubClass !== 'CASH') {
dataGatheringItems.push({
dataSource,
symbol
});
}
currencies[symbol] = currency; currencies[symbol] = currency;
} }
@ -933,6 +942,7 @@ export abstract class PortfolioCalculator {
} of this.activities) { } of this.activities) {
let currentTransactionPointItem: TransactionPointSymbol; let currentTransactionPointItem: TransactionPointSymbol;
const assetSubClass = SymbolProfile.assetSubClass;
const currency = SymbolProfile.currency; const currency = SymbolProfile.currency;
const dataSource = SymbolProfile.dataSource; const dataSource = SymbolProfile.dataSource;
const factor = getFactor(type); const factor = getFactor(type);
@ -977,6 +987,7 @@ export abstract class PortfolioCalculator {
} }
currentTransactionPointItem = { currentTransactionPointItem = {
assetSubClass,
currency, currency,
dataSource, dataSource,
investment, investment,
@ -995,6 +1006,7 @@ export abstract class PortfolioCalculator {
}; };
} else { } else {
currentTransactionPointItem = { currentTransactionPointItem = {
assetSubClass,
currency, currency,
dataSource, dataSource,
fee, 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) { if (orders.length <= 0) {
return { return {
currentValues: {}, 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, // 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. // the calculation should fall back to using the activity’s unit price.
unitPriceAtEndDate = latestActivity.unitPrice; unitPriceAtEndDate = latestActivity.unitPrice;
} else if (isCash) {
unitPriceAtEndDate = new Big(1);
} }
if ( if (
@ -294,6 +298,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
itemType: 'start', itemType: 'start',
quantity: new Big(0), quantity: new Big(0),
SymbolProfile: { SymbolProfile: {
assetSubClass: isCash ? 'CASH' : undefined,
dataSource, dataSource,
symbol symbol
}, },
@ -307,6 +312,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
feeInBaseCurrency: new Big(0), feeInBaseCurrency: new Big(0),
itemType: 'end', itemType: 'end',
SymbolProfile: { SymbolProfile: {
assetSubClass: isCash ? 'CASH' : undefined,
dataSource, dataSource,
symbol symbol
}, },
@ -347,6 +353,7 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator {
feeInBaseCurrency: new Big(0), feeInBaseCurrency: new Big(0),
quantity: new Big(0), quantity: new Big(0),
SymbolProfile: { SymbolProfile: {
assetSubClass: isCash ? 'CASH' : undefined,
dataSource, dataSource,
symbol 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; quantity: Big;
SymbolProfile: Pick< SymbolProfile: Pick<
Activity['SymbolProfile'], Activity['SymbolProfile'],
'currency' | 'dataSource' | 'name' | 'symbol' | 'userId' 'assetSubClass' | 'currency' | 'dataSource' | 'name' | 'symbol' | 'userId'
>; >;
unitPrice: Big; 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'; import { Big } from 'big.js';
export interface TransactionPointSymbol { export interface TransactionPointSymbol {
assetSubClass?: string;
averagePrice: Big; averagePrice: Big;
currency: string; currency: string;
dataSource: DataSource; 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 (user.settings?.settings as UserSettings)?.emergencyFund ?? 0
); );
// Activities for non-cash assets // Activities for cash and non-cash assets
const { activities } = const { activities } =
await this.orderService.getOrdersForPortfolioCalculator({ await this.orderService.getOrdersForPortfolioCalculator({
filters, filters,
@ -495,7 +495,6 @@ export class PortfolioService {
userId userId
}); });
// Synthetic activities for cash
const cashDetails = await this.accountService.getCashDetails({ const cashDetails = await this.accountService.getCashDetails({
filters, filters,
userId, userId,

Loading…
Cancel
Save