Browse Source

Break down emergency fund in cash and assets

pull/2159/head
Thomas 2 years ago
parent
commit
87955c4b4f
  1. 3
      apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts
  2. 3
      apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts
  3. 3
      apps/api/src/app/portfolio/portfolio-calculator.ts
  4. 35
      apps/api/src/app/portfolio/portfolio.service.ts
  5. 3
      libs/common/src/lib/interfaces/portfolio-position.interface.ts
  6. 2
      libs/common/src/lib/interfaces/portfolio-summary.interface.ts
  7. 3
      libs/common/src/lib/interfaces/timeline-position.interface.ts

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

@ -1,4 +1,4 @@
import { DataSource, Type as TypeOfOrder } from '@prisma/client';
import { DataSource, Tag, Type as TypeOfOrder } from '@prisma/client';
import Big from 'big.js';
export interface PortfolioOrder {
@ -9,6 +9,7 @@ export interface PortfolioOrder {
name: string;
quantity: Big;
symbol: string;
tags?: Tag[];
type: TypeOfOrder;
unitPrice: Big;
}

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

@ -1,4 +1,4 @@
import { DataSource } from '@prisma/client';
import { DataSource, Tag } from '@prisma/client';
import Big from 'big.js';
export interface TransactionPointSymbol {
@ -9,5 +9,6 @@ export interface TransactionPointSymbol {
investment: Big;
quantity: Big;
symbol: string;
tags?: Tag[];
transactionCount: number;
}

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

@ -114,6 +114,7 @@ export class PortfolioCalculator {
firstBuyDate: oldAccumulatedSymbol.firstBuyDate,
quantity: newQuantity,
symbol: order.symbol,
tags: order.tags,
transactionCount: oldAccumulatedSymbol.transactionCount + 1
};
} else {
@ -125,6 +126,7 @@ export class PortfolioCalculator {
investment: unitPrice.mul(order.quantity).mul(factor),
quantity: order.quantity.mul(factor),
symbol: order.symbol,
tags: order.tags,
transactionCount: 1
};
}
@ -492,6 +494,7 @@ export class PortfolioCalculator {
: null,
quantity: item.quantity,
symbol: item.symbol,
tags: item.tags,
transactionCount: item.transactionCount
});

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

@ -583,6 +583,7 @@ export class PortfolioService {
quantity: item.quantity.toNumber(),
sectors: symbolProfile.sectors,
symbol: item.symbol,
tags: item.tags,
transactionCount: item.transactionCount,
url: symbolProfile.url,
value: value.toNumber()
@ -628,7 +629,7 @@ export class PortfolioService {
const emergencyFundInCash = emergencyFund
.minus(
this.getEmergencyFundPositionsValueInBaseCurrency({
activities: orders
holdings
})
)
.toNumber();
@ -656,7 +657,7 @@ export class PortfolioService {
balanceInBaseCurrency: cashDetails.balanceInBaseCurrency,
emergencyFundPositionsValueInBaseCurrency:
this.getEmergencyFundPositionsValueInBaseCurrency({
activities: orders
holdings
})
});
@ -742,6 +743,7 @@ export class PortfolioService {
name: order.SymbolProfile?.name,
quantity: new Big(order.quantity),
symbol: order.SymbolProfile.symbol,
tags: order.tags,
type: order.type,
unitPrice: new Big(order.unitPrice)
}));
@ -1390,13 +1392,13 @@ export class PortfolioService {
}
private getEmergencyFundPositionsValueInBaseCurrency({
activities
holdings
}: {
activities: Activity[];
holdings: PortfolioDetails['holdings'];
}) {
const emergencyFundOrders = activities.filter((activity) => {
const emergencyFundHoldings = Object.values(holdings).filter(({ tags }) => {
return (
activity.tags?.some(({ id }) => {
tags?.some(({ id }) => {
return id === EMERGENCY_FUND_TAG_ID;
}) ?? false
);
@ -1404,18 +1406,9 @@ export class PortfolioService {
let valueInBaseCurrencyOfEmergencyFundPositions = new Big(0);
for (const order of emergencyFundOrders) {
if (order.type === 'BUY') {
valueInBaseCurrencyOfEmergencyFundPositions =
valueInBaseCurrencyOfEmergencyFundPositions.plus(
order.valueInBaseCurrency
);
} else if (order.type === 'SELL') {
valueInBaseCurrencyOfEmergencyFundPositions =
valueInBaseCurrencyOfEmergencyFundPositions.minus(
order.valueInBaseCurrency
);
}
for (const { value } of emergencyFundHoldings) {
valueInBaseCurrencyOfEmergencyFundPositions =
valueInBaseCurrencyOfEmergencyFundPositions.plus(value);
}
return valueInBaseCurrencyOfEmergencyFundPositions.toNumber();
@ -1474,6 +1467,7 @@ export class PortfolioService {
quantity: 0,
sectors: [],
symbol: currency,
tags: [],
transactionCount: 0,
value: balance
};
@ -1686,6 +1680,10 @@ export class PortfolioService {
totalSell,
committedFunds: committedFunds.toNumber(),
emergencyFund: emergencyFund.toNumber(),
emergencyFundinAssets: emergencyFundPositionsValueInBaseCurrency,
emergencyFundInCash: emergencyFund
.minus(emergencyFundPositionsValueInBaseCurrency)
.toNumber(),
ordersCount: activities.filter(({ type }) => {
return type === 'BUY' || type === 'SELL';
}).length
@ -1737,6 +1735,7 @@ export class PortfolioService {
name: order.SymbolProfile?.name,
quantity: new Big(order.quantity),
symbol: order.SymbolProfile.symbol,
tags: order.tags,
type: order.type,
unitPrice: new Big(
this.exchangeRateDataService.toCurrency(

3
libs/common/src/lib/interfaces/portfolio-position.interface.ts

@ -1,4 +1,4 @@
import { AssetClass, AssetSubClass, DataSource } from '@prisma/client';
import { AssetClass, AssetSubClass, DataSource, Tag } from '@prisma/client';
import { Market, MarketState } from '../types';
import { Country } from './country.interface';
@ -28,6 +28,7 @@ export interface PortfolioPosition {
sectors: Sector[];
transactionCount: number;
symbol: string;
tags?: Tag[];
type?: string;
url?: string;
value?: number;

2
libs/common/src/lib/interfaces/portfolio-summary.interface.ts

@ -6,6 +6,8 @@ export interface PortfolioSummary extends PortfolioPerformance {
committedFunds: number;
dividend: number;
emergencyFund: number;
emergencyFundInCash: number;
emergencyFundinAssets: number;
excludedAccountsAndActivities: number;
fees: number;
firstOrderDate: Date;

3
libs/common/src/lib/interfaces/timeline-position.interface.ts

@ -1,4 +1,4 @@
import { DataSource } from '@prisma/client';
import { DataSource, Tag } from '@prisma/client';
import Big from 'big.js';
export interface TimelinePosition {
@ -15,5 +15,6 @@ export interface TimelinePosition {
netPerformancePercentage: Big;
quantity: Big;
symbol: string;
tags?: Tag[];
transactionCount: number;
}

Loading…
Cancel
Save