Browse Source

Change CASH to LIQUIDITY in asset class enum

pull/3321/head
Thomas Kaul 1 year ago
parent
commit
4c0309d6d9
  1. 2
      apps/api/src/app/admin/admin.service.ts
  2. 16
      apps/api/src/app/portfolio/portfolio.controller.ts
  3. 11
      apps/api/src/app/portfolio/portfolio.service.ts
  4. 4
      apps/api/src/services/data-provider/coingecko/coingecko.service.ts
  5. 2
      apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
  6. 2
      apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
  7. 4
      apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
  8. 1
      libs/common/src/lib/config.ts
  9. 2
      libs/common/src/lib/interfaces/portfolio-position.interface.ts
  10. 4
      libs/ui/src/lib/holdings-table/holdings-table.component.ts
  11. 1
      libs/ui/src/lib/i18n.ts
  12. 2
      prisma/migrations/20240422181320_added_liquidity_to_asset_class/migration.sql
  13. 2
      prisma/migrations/20240422181356_added_cash_to_asset_sub_class/migration.sql
  14. 7
      prisma/migrations/20240422181835_changed_cash_to_liquidity_in_asset_sub_class/migration.sql
  15. 9
      prisma/migrations/20240422182643_removed_cash_from_asset_class/migration.sql
  16. 3
      prisma/schema.prisma

2
apps/api/src/app/admin/admin.service.ts

@ -416,7 +416,7 @@ export class AdminService {
dataSource, dataSource,
marketDataItemCount, marketDataItemCount,
symbol, symbol,
assetClass: 'CASH', assetClass: AssetClass.LIQUIDITY,
countriesCount: 0, countriesCount: 0,
currency: symbol.replace(DEFAULT_CURRENCY, ''), currency: symbol.replace(DEFAULT_CURRENCY, ''),
id: undefined, id: undefined,

16
apps/api/src/app/portfolio/portfolio.controller.ts

@ -47,6 +47,7 @@ import {
} from '@nestjs/common'; } from '@nestjs/common';
import { REQUEST } from '@nestjs/core'; import { REQUEST } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { AssetClass, AssetSubClass } from '@prisma/client';
import { Big } from 'big.js'; import { Big } from 'big.js';
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { StatusCodes, getReasonPhrase } from 'http-status-codes';
@ -128,14 +129,19 @@ export class PortfolioController {
const totalValue = Object.values(holdings) const totalValue = Object.values(holdings)
.filter(({ assetClass, assetSubClass }) => { .filter(({ assetClass, assetSubClass }) => {
return assetClass !== 'CASH' && assetSubClass !== 'CASH'; return (
assetClass !== AssetClass.LIQUIDITY &&
assetSubClass !== AssetSubClass.CASH
);
}) })
.map(({ valueInBaseCurrency }) => { .map(({ valueInBaseCurrency }) => {
return valueInBaseCurrency; return valueInBaseCurrency;
}) })
.reduce((a, b) => a + b, 0); .reduce((a, b) => {
return a + b;
}, 0);
for (const [symbol, portfolioPosition] of Object.entries(holdings)) { for (const [, portfolioPosition] of Object.entries(holdings)) {
portfolioPosition.investment = portfolioPosition.investment =
portfolioPosition.investment / totalInvestment; portfolioPosition.investment / totalInvestment;
portfolioPosition.valueInPercentage = portfolioPosition.valueInPercentage =
@ -185,11 +191,11 @@ export class PortfolioController {
holdings[symbol] = { holdings[symbol] = {
...portfolioPosition, ...portfolioPosition,
assetClass: assetClass:
hasDetails || portfolioPosition.assetClass === 'CASH' hasDetails || portfolioPosition.assetClass === AssetClass.LIQUIDITY
? portfolioPosition.assetClass ? portfolioPosition.assetClass
: undefined, : undefined,
assetSubClass: assetSubClass:
hasDetails || portfolioPosition.assetSubClass === 'CASH' hasDetails || portfolioPosition.assetSubClass === AssetSubClass.CASH
? portfolioPosition.assetSubClass ? portfolioPosition.assetSubClass
: undefined, : undefined,
countries: hasDetails ? portfolioPosition.countries : [], countries: hasDetails ? portfolioPosition.countries : [],

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

@ -54,6 +54,7 @@ import {
Account, Account,
Type as ActivityType, Type as ActivityType,
AssetClass, AssetClass,
AssetSubClass,
DataSource, DataSource,
Order, Order,
Platform, Platform,
@ -376,7 +377,7 @@ export class PortfolioService {
}) ?? false; }) ?? false;
const isFilteredByCash = filters?.some(({ id, type }) => { const isFilteredByCash = filters?.some(({ id, type }) => {
return id === 'CASH' && type === 'ASSET_CLASS'; return id === AssetClass.LIQUIDITY && type === 'ASSET_CLASS';
}); });
const isFilteredByClosedHoldings = const isFilteredByClosedHoldings =
@ -391,8 +392,8 @@ export class PortfolioService {
if ( if (
filters?.length === 0 || filters?.length === 0 ||
(filters?.length === 1 && (filters?.length === 1 &&
filters[0].type === 'ASSET_CLASS' && filters[0].id === AssetClass.LIQUIDITY &&
filters[0].id === 'CASH') filters[0].type === 'ASSET_CLASS')
) { ) {
filteredValueInBaseCurrency = filteredValueInBaseCurrency.plus( filteredValueInBaseCurrency = filteredValueInBaseCurrency.plus(
cashDetails.balanceInBaseCurrency cashDetails.balanceInBaseCurrency
@ -1425,8 +1426,8 @@ export class PortfolioService {
return { return {
currency, currency,
allocationInPercentage: 0, allocationInPercentage: 0,
assetClass: AssetClass.CASH, assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetClass.CASH, assetSubClass: AssetSubClass.CASH,
countries: [], countries: [],
dataSource: undefined, dataSource: undefined,
dateOfFirstActivity: undefined, dateOfFirstActivity: undefined,

4
apps/api/src/services/data-provider/coingecko/coingecko.service.ts

@ -59,7 +59,7 @@ export class CoinGeckoService implements DataProviderInterface {
}): Promise<Partial<SymbolProfile>> { }): Promise<Partial<SymbolProfile>> {
const response: Partial<SymbolProfile> = { const response: Partial<SymbolProfile> = {
symbol, symbol,
assetClass: AssetClass.CASH, assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetSubClass.CRYPTOCURRENCY, assetSubClass: AssetSubClass.CRYPTOCURRENCY,
currency: DEFAULT_CURRENCY, currency: DEFAULT_CURRENCY,
dataSource: this.getName() dataSource: this.getName()
@ -243,7 +243,7 @@ export class CoinGeckoService implements DataProviderInterface {
return { return {
name, name,
symbol, symbol,
assetClass: AssetClass.CASH, assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetSubClass.CRYPTOCURRENCY, assetSubClass: AssetSubClass.CRYPTOCURRENCY,
currency: DEFAULT_CURRENCY, currency: DEFAULT_CURRENCY,
dataProviderInfo: this.getDataProviderInfo(), dataProviderInfo: this.getDataProviderInfo(),

2
apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts

@ -266,7 +266,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface {
switch (quoteType?.toLowerCase()) { switch (quoteType?.toLowerCase()) {
case 'cryptocurrency': case 'cryptocurrency':
assetClass = AssetClass.CASH; assetClass = AssetClass.LIQUIDITY;
assetSubClass = AssetSubClass.CRYPTOCURRENCY; assetSubClass = AssetSubClass.CRYPTOCURRENCY;
break; break;
case 'equity': case 'equity':

2
apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts

@ -468,7 +468,7 @@ export class EodHistoricalDataService implements DataProviderInterface {
assetSubClass = AssetSubClass.STOCK; assetSubClass = AssetSubClass.STOCK;
break; break;
case 'currency': case 'currency':
assetClass = AssetClass.CASH; assetClass = AssetClass.LIQUIDITY;
if (Exchange?.toLowerCase() === 'cc') { if (Exchange?.toLowerCase() === 'cc') {
assetSubClass = AssetSubClass.CRYPTOCURRENCY; assetSubClass = AssetSubClass.CRYPTOCURRENCY;

4
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

@ -348,8 +348,8 @@ export class AllocationsPageComponent implements OnDestroy, OnInit {
name: position.name name: position.name
}; };
if (position.assetClass !== AssetClass.CASH) { if (position.assetClass !== AssetClass.LIQUIDITY) {
// Prepare analysis data by continents, countries and sectors except for cash // Prepare analysis data by continents, countries and sectors except for liquidity
if (position.countries.length > 0) { if (position.countries.length > 0) {
this.markets.developedMarkets.value += this.markets.developedMarkets.value +=

1
libs/common/src/lib/config.ts

@ -4,7 +4,6 @@ import ms from 'ms';
export const ghostfolioPrefix = 'GF'; export const ghostfolioPrefix = 'GF';
export const ghostfolioScraperApiSymbolPrefix = `_${ghostfolioPrefix}_`; export const ghostfolioScraperApiSymbolPrefix = `_${ghostfolioPrefix}_`;
export const ghostfolioCashSymbol = `${ghostfolioScraperApiSymbolPrefix}CASH`;
export const ghostfolioFearAndGreedIndexDataSource = DataSource.RAPID_API; export const ghostfolioFearAndGreedIndexDataSource = DataSource.RAPID_API;
export const ghostfolioFearAndGreedIndexSymbol = `${ghostfolioScraperApiSymbolPrefix}FEAR_AND_GREED_INDEX`; export const ghostfolioFearAndGreedIndexSymbol = `${ghostfolioScraperApiSymbolPrefix}FEAR_AND_GREED_INDEX`;

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

@ -8,7 +8,7 @@ export interface PortfolioPosition {
allocationInPercentage: number; allocationInPercentage: number;
assetClass?: AssetClass; assetClass?: AssetClass;
assetClassLabel?: string; assetClassLabel?: string;
assetSubClass?: AssetSubClass | 'CASH'; assetSubClass?: AssetSubClass;
assetSubClassLabel?: string; assetSubClassLabel?: string;
countries: Country[]; countries: Country[];
currency: string; currency: string;

4
libs/ui/src/lib/holdings-table/holdings-table.component.ts

@ -23,7 +23,7 @@ import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
import { MatSort, MatSortModule } from '@angular/material/sort'; import { MatSort, MatSortModule } from '@angular/material/sort';
import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { Router, RouterModule } from '@angular/router'; import { Router, RouterModule } from '@angular/router';
import { AssetClass } from '@prisma/client'; import { AssetClass, AssetSubClass } from '@prisma/client';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { Subject, Subscription } from 'rxjs'; import { Subject, Subscription } from 'rxjs';
@ -66,7 +66,7 @@ export class GfHoldingsTableComponent implements OnChanges, OnDestroy, OnInit {
public dataSource: MatTableDataSource<PortfolioPosition> = public dataSource: MatTableDataSource<PortfolioPosition> =
new MatTableDataSource(); new MatTableDataSource();
public displayedColumns = []; public displayedColumns = [];
public ignoreAssetSubClasses = [AssetClass.CASH]; public ignoreAssetSubClasses = [AssetSubClass.CASH];
public isLoading = true; public isLoading = true;
public routeQueryParams: Subscription; public routeQueryParams: Subscription;

1
libs/ui/src/lib/i18n.ts

@ -40,6 +40,7 @@ const locales = {
COMMODITY: $localize`Commodity`, COMMODITY: $localize`Commodity`,
EQUITY: $localize`Equity`, EQUITY: $localize`Equity`,
FIXED_INCOME: $localize`Fixed Income`, FIXED_INCOME: $localize`Fixed Income`,
LIQUIDITY: $localize`Liquidity`,
REAL_ESTATE: $localize`Real Estate`, REAL_ESTATE: $localize`Real Estate`,
// AssetSubClass (enum) // AssetSubClass (enum)

2
prisma/migrations/20240422181320_added_liquidity_to_asset_class/migration.sql

@ -0,0 +1,2 @@
-- AlterEnum
ALTER TYPE "AssetClass" ADD VALUE 'LIQUIDITY';

2
prisma/migrations/20240422181356_added_cash_to_asset_sub_class/migration.sql

@ -0,0 +1,2 @@
-- AlterEnum
ALTER TYPE "AssetSubClass" ADD VALUE 'CASH';

7
prisma/migrations/20240422181835_changed_cash_to_liquidity_in_asset_sub_class/migration.sql

@ -0,0 +1,7 @@
UPDATE "SymbolProfile"
SET "assetClass" = 'LIQUIDITY'
WHERE "assetClass" = 'CASH';
UPDATE "SymbolProfileOverrides"
SET "assetClass" = 'LIQUIDITY'
WHERE "assetClass" = 'CASH';

9
prisma/migrations/20240422182643_removed_cash_from_asset_class/migration.sql

@ -0,0 +1,9 @@
-- AlterEnum
BEGIN;
CREATE TYPE "AssetClass_new" AS ENUM ('COMMODITY', 'EQUITY', 'FIXED_INCOME', 'LIQUIDITY', 'REAL_ESTATE');
ALTER TABLE "SymbolProfile" ALTER COLUMN "assetClass" TYPE "AssetClass_new" USING ("assetClass"::text::"AssetClass_new");
ALTER TABLE "SymbolProfileOverrides" ALTER COLUMN "assetClass" TYPE "AssetClass_new" USING ("assetClass"::text::"AssetClass_new");
ALTER TYPE "AssetClass" RENAME TO "AssetClass_old";
ALTER TYPE "AssetClass_new" RENAME TO "AssetClass";
DROP TYPE "AssetClass_old";
COMMIT;

3
prisma/schema.prisma

@ -248,15 +248,16 @@ enum AccessPermission {
} }
enum AssetClass { enum AssetClass {
CASH
COMMODITY COMMODITY
EQUITY EQUITY
FIXED_INCOME FIXED_INCOME
LIQUIDITY
REAL_ESTATE REAL_ESTATE
} }
enum AssetSubClass { enum AssetSubClass {
BOND BOND
CASH
COMMODITY COMMODITY
CRYPTOCURRENCY CRYPTOCURRENCY
ETF ETF

Loading…
Cancel
Save