mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-08-09 07:25:19 +02:00
Merge remote-tracking branch 'upstream/main' into etl-fixes
This commit is contained in:
commit
efce0d3ebb
6 changed files with 45 additions and 39 deletions
|
@ -1,5 +1,5 @@
|
|||
import type { User } from '@prisma/client'
|
||||
import { InvestmentTransactionCategory, Prisma, PrismaClient } from '@prisma/client'
|
||||
import { AssetClass, InvestmentTransactionCategory, Prisma, PrismaClient } from '@prisma/client'
|
||||
import { createLogger, transports } from 'winston'
|
||||
import { DateTime } from 'luxon'
|
||||
import type {
|
||||
|
@ -202,19 +202,25 @@ describe('insight service', () => {
|
|||
holdings: {
|
||||
create: [
|
||||
{
|
||||
security: { create: { symbol: 'AAPL', plaidType: 'equity' } },
|
||||
security: {
|
||||
create: { symbol: 'AAPL', assetClass: AssetClass.stocks },
|
||||
},
|
||||
quantity: 1,
|
||||
costBasisUser: 100,
|
||||
value: 200,
|
||||
},
|
||||
{
|
||||
security: { create: { symbol: 'NFLX', plaidType: 'equity' } },
|
||||
security: {
|
||||
create: { symbol: 'NFLX', assetClass: AssetClass.stocks },
|
||||
},
|
||||
quantity: 10,
|
||||
costBasisUser: 200,
|
||||
value: 300,
|
||||
},
|
||||
{
|
||||
security: { create: { symbol: 'SHOP', plaidType: 'equity' } },
|
||||
security: {
|
||||
create: { symbol: 'SHOP', assetClass: AssetClass.stocks },
|
||||
},
|
||||
quantity: 2,
|
||||
costBasisUser: 100,
|
||||
value: 50,
|
||||
|
|
|
@ -641,14 +641,7 @@ export class InsightService implements IInsightService {
|
|||
INNER JOIN (
|
||||
SELECT
|
||||
id,
|
||||
CASE
|
||||
-- plaid
|
||||
WHEN plaid_type IN ('equity', 'etf', 'mutual fund', 'derivative') THEN 'stocks'
|
||||
WHEN plaid_type IN ('fixed income') THEN 'fixed_income'
|
||||
WHEN plaid_type IN ('cash', 'loan') THEN 'cash'
|
||||
WHEN plaid_type IN ('cryptocurrency') THEN 'crypto'
|
||||
ELSE 'other'
|
||||
END AS "asset_class"
|
||||
asset_class
|
||||
FROM
|
||||
"security"
|
||||
) s ON s.id = h.security_id
|
||||
|
@ -694,14 +687,7 @@ export class InsightService implements IInsightService {
|
|||
INNER JOIN security s ON s.id = h.security_id
|
||||
LEFT JOIN LATERAL (
|
||||
SELECT
|
||||
CASE
|
||||
-- plaid
|
||||
WHEN s.plaid_type IN ('equity', 'etf', 'mutual fund', 'derivative') THEN 'stocks'
|
||||
WHEN s.plaid_type IN ('fixed income') THEN 'fixed_income'
|
||||
WHEN s.plaid_type IN ('cash', 'loan') THEN 'cash'
|
||||
WHEN s.plaid_type IN ('cryptocurrency') THEN 'crypto'
|
||||
ELSE 'other'
|
||||
END AS "category"
|
||||
asset_class AS "category"
|
||||
) x ON TRUE
|
||||
WHERE
|
||||
h.account_id IN ${accountIds}
|
||||
|
@ -828,28 +814,21 @@ export class InsightService implements IInsightService {
|
|||
UNION ALL
|
||||
-- investment accounts
|
||||
SELECT
|
||||
s.asset_type,
|
||||
s.asset_class AS "asset_type",
|
||||
SUM(h.value) AS "amount"
|
||||
FROM
|
||||
holdings_enriched h
|
||||
INNER JOIN (
|
||||
SELECT
|
||||
id,
|
||||
CASE
|
||||
-- plaid
|
||||
WHEN plaid_type IN ('equity', 'etf', 'mutual fund', 'derivative') THEN 'stocks'
|
||||
WHEN plaid_type IN ('fixed income') THEN 'bonds'
|
||||
WHEN plaid_type IN ('cash', 'loan') THEN 'cash'
|
||||
WHEN plaid_type IN ('cryptocurrency') THEN 'crypto'
|
||||
ELSE 'other'
|
||||
END AS "asset_type"
|
||||
asset_class
|
||||
FROM
|
||||
"security"
|
||||
) s ON s.id = h.security_id
|
||||
WHERE
|
||||
h.account_id IN ${pAccountIds}
|
||||
GROUP BY
|
||||
s.asset_type
|
||||
s.asset_class
|
||||
) x
|
||||
GROUP BY
|
||||
1
|
||||
|
|
|
@ -33,7 +33,7 @@ const PROJECTION_ASSET_PARAMS: {
|
|||
[type in SharedType.ProjectionAssetType]: [mean: Decimal.Value, stddev: Decimal.Value]
|
||||
} = {
|
||||
stocks: ['0.05', '0.186'],
|
||||
bonds: ['0.02', '0.052'],
|
||||
fixed_income: ['0.02', '0.052'],
|
||||
cash: ['-0.02', '0.05'],
|
||||
crypto: ['1.0', '1.0'],
|
||||
property: ['0.1', '0.2'],
|
||||
|
|
|
@ -56,7 +56,13 @@ export type PlanProjectionResponse = {
|
|||
}[]
|
||||
}
|
||||
|
||||
export type ProjectionAssetType = 'stocks' | 'bonds' | 'cash' | 'crypto' | 'property' | 'other'
|
||||
export type ProjectionAssetType =
|
||||
| 'stocks'
|
||||
| 'fixed_income'
|
||||
| 'cash'
|
||||
| 'crypto'
|
||||
| 'property'
|
||||
| 'other'
|
||||
export type ProjectionLiabilityType = 'credit' | 'loan' | 'other'
|
||||
|
||||
export type PlanInsights = {
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
-- CreateEnum
|
||||
CREATE TYPE "AssetClass" AS ENUM ('cash', 'crypto', 'fixed_income', 'stocks', 'other');
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "security"
|
||||
ADD COLUMN "asset_class" "AssetClass" NOT NULL DEFAULT 'other';
|
|
@ -243,6 +243,14 @@ model InvestmentTransaction {
|
|||
@@map("investment_transaction")
|
||||
}
|
||||
|
||||
enum AssetClass {
|
||||
cash
|
||||
crypto
|
||||
fixed_income
|
||||
stocks
|
||||
other
|
||||
}
|
||||
|
||||
model Security {
|
||||
id Int @id @default(autoincrement())
|
||||
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(6)
|
||||
|
@ -255,6 +263,7 @@ model Security {
|
|||
currencyCode String @default("USD") @map("currency_code")
|
||||
pricingLastSyncedAt DateTime? @map("pricing_last_synced_at") @db.Timestamptz(6)
|
||||
isBrokerageCash Boolean @default(false) @map("is_brokerage_cash")
|
||||
assetClass AssetClass @default(other) @map("asset_class")
|
||||
|
||||
// plaid data
|
||||
plaidSecurityId String? @unique @map("plaid_security_id")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue