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,
marketDataItemCount,
symbol,
assetClass: 'CASH',
assetClass: AssetClass.LIQUIDITY,
countriesCount: 0,
currency: symbol.replace(DEFAULT_CURRENCY, ''),
id: undefined,

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

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

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

@ -54,6 +54,7 @@ import {
Account,
Type as ActivityType,
AssetClass,
AssetSubClass,
DataSource,
Order,
Platform,
@ -376,7 +377,7 @@ export class PortfolioService {
}) ?? false;
const isFilteredByCash = filters?.some(({ id, type }) => {
return id === 'CASH' && type === 'ASSET_CLASS';
return id === AssetClass.LIQUIDITY && type === 'ASSET_CLASS';
});
const isFilteredByClosedHoldings =
@ -391,8 +392,8 @@ export class PortfolioService {
if (
filters?.length === 0 ||
(filters?.length === 1 &&
filters[0].type === 'ASSET_CLASS' &&
filters[0].id === 'CASH')
filters[0].id === AssetClass.LIQUIDITY &&
filters[0].type === 'ASSET_CLASS')
) {
filteredValueInBaseCurrency = filteredValueInBaseCurrency.plus(
cashDetails.balanceInBaseCurrency
@ -1425,8 +1426,8 @@ export class PortfolioService {
return {
currency,
allocationInPercentage: 0,
assetClass: AssetClass.CASH,
assetSubClass: AssetClass.CASH,
assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetSubClass.CASH,
countries: [],
dataSource: 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>> {
const response: Partial<SymbolProfile> = {
symbol,
assetClass: AssetClass.CASH,
assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetSubClass.CRYPTOCURRENCY,
currency: DEFAULT_CURRENCY,
dataSource: this.getName()
@ -243,7 +243,7 @@ export class CoinGeckoService implements DataProviderInterface {
return {
name,
symbol,
assetClass: AssetClass.CASH,
assetClass: AssetClass.LIQUIDITY,
assetSubClass: AssetSubClass.CRYPTOCURRENCY,
currency: DEFAULT_CURRENCY,
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()) {
case 'cryptocurrency':
assetClass = AssetClass.CASH;
assetClass = AssetClass.LIQUIDITY;
assetSubClass = AssetSubClass.CRYPTOCURRENCY;
break;
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;
break;
case 'currency':
assetClass = AssetClass.CASH;
assetClass = AssetClass.LIQUIDITY;
if (Exchange?.toLowerCase() === 'cc') {
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
};
if (position.assetClass !== AssetClass.CASH) {
// Prepare analysis data by continents, countries and sectors except for cash
if (position.assetClass !== AssetClass.LIQUIDITY) {
// Prepare analysis data by continents, countries and sectors except for liquidity
if (position.countries.length > 0) {
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 ghostfolioScraperApiSymbolPrefix = `_${ghostfolioPrefix}_`;
export const ghostfolioCashSymbol = `${ghostfolioScraperApiSymbolPrefix}CASH`;
export const ghostfolioFearAndGreedIndexDataSource = DataSource.RAPID_API;
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;
assetClass?: AssetClass;
assetClassLabel?: string;
assetSubClass?: AssetSubClass | 'CASH';
assetSubClass?: AssetSubClass;
assetSubClassLabel?: string;
countries: Country[];
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 { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { Router, RouterModule } from '@angular/router';
import { AssetClass } from '@prisma/client';
import { AssetClass, AssetSubClass } from '@prisma/client';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { Subject, Subscription } from 'rxjs';
@ -66,7 +66,7 @@ export class GfHoldingsTableComponent implements OnChanges, OnDestroy, OnInit {
public dataSource: MatTableDataSource<PortfolioPosition> =
new MatTableDataSource();
public displayedColumns = [];
public ignoreAssetSubClasses = [AssetClass.CASH];
public ignoreAssetSubClasses = [AssetSubClass.CASH];
public isLoading = true;
public routeQueryParams: Subscription;

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

@ -40,6 +40,7 @@ const locales = {
COMMODITY: $localize`Commodity`,
EQUITY: $localize`Equity`,
FIXED_INCOME: $localize`Fixed Income`,
LIQUIDITY: $localize`Liquidity`,
REAL_ESTATE: $localize`Real Estate`,
// 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 {
CASH
COMMODITY
EQUITY
FIXED_INCOME
LIQUIDITY
REAL_ESTATE
}
enum AssetSubClass {
BOND
CASH
COMMODITY
CRYPTOCURRENCY
ETF

Loading…
Cancel
Save