147 lines
4.5 KiB
Plaintext
147 lines
4.5 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
enum HouseholdType {
|
|
SINGLE
|
|
COUPLE
|
|
}
|
|
|
|
enum IncomeMode {
|
|
PER_PERSON
|
|
HOUSEHOLD
|
|
}
|
|
|
|
enum OneTimeEventType {
|
|
INCOME
|
|
EXPENSE
|
|
}
|
|
|
|
enum TransitionAction {
|
|
CARRY_OVER
|
|
PAYOUT
|
|
SELL
|
|
}
|
|
|
|
model Plan {
|
|
id String @id @default(cuid())
|
|
name String
|
|
householdType HouseholdType @default(SINGLE)
|
|
person1Name String @default("Person 1")
|
|
person1CurrentAge Int
|
|
person2Name String?
|
|
person2CurrentAge Int?
|
|
plannedRetirementAge Int @default(65)
|
|
defaultInflationRate Float @default(2.0)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
scenarios Scenario[]
|
|
}
|
|
|
|
model Scenario {
|
|
id String @id @default(cuid())
|
|
planId String
|
|
name String
|
|
isBaseline Boolean @default(false)
|
|
sortOrder Int @default(0)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
plan Plan @relation(fields: [planId], references: [id], onDelete: Cascade)
|
|
phases LifePhase[]
|
|
|
|
@@index([planId])
|
|
}
|
|
|
|
model LifePhase {
|
|
id String @id @default(cuid())
|
|
scenarioId String
|
|
name String
|
|
sortOrder Int
|
|
durationYears Int
|
|
isRetirementPhase Boolean @default(false)
|
|
incomeMode IncomeMode @default(PER_PERSON)
|
|
householdIncome Float?
|
|
person1Income Float?
|
|
person2Income Float?
|
|
householdExpenses Float @default(0)
|
|
inflationRate Float?
|
|
expectedPensionIncome Float?
|
|
expectedPensionCapital Float?
|
|
pensionCapitalTaxRate Float?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
scenario Scenario @relation(fields: [scenarioId], references: [id], onDelete: Cascade)
|
|
securities Security[]
|
|
properties Property[]
|
|
oneTimeEvents OneTimeEvent[]
|
|
transitionFrom PhaseTransition? @relation("TransitionFrom")
|
|
transitionTo PhaseTransition? @relation("TransitionTo")
|
|
|
|
@@index([scenarioId])
|
|
}
|
|
|
|
model Security {
|
|
id String @id @default(cuid())
|
|
lifePhaseId String
|
|
name String
|
|
ownerTag String?
|
|
startBalance Float @default(0)
|
|
expectedReturnRate Float @default(5.0)
|
|
annualSavingsAllocation Float @default(0)
|
|
sortOrder Int @default(0)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
lifePhase LifePhase @relation(fields: [lifePhaseId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([lifePhaseId])
|
|
}
|
|
|
|
model Property {
|
|
id String @id @default(cuid())
|
|
lifePhaseId String
|
|
name String
|
|
currentValue Float @default(0)
|
|
mortgageBalance Float @default(0)
|
|
valueGrowthRate Float @default(2.0)
|
|
annualAmortization Float @default(0)
|
|
saleTaxRatePercent Float?
|
|
sortOrder Int @default(0)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
lifePhase LifePhase @relation(fields: [lifePhaseId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([lifePhaseId])
|
|
}
|
|
|
|
model OneTimeEvent {
|
|
id String @id @default(cuid())
|
|
lifePhaseId String
|
|
name String
|
|
yearOffset Int
|
|
amount Float
|
|
type OneTimeEventType
|
|
taxRatePercent Float?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
lifePhase LifePhase @relation(fields: [lifePhaseId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([lifePhaseId])
|
|
}
|
|
|
|
model PhaseTransition {
|
|
id String @id @default(cuid())
|
|
fromPhaseId String @unique
|
|
toPhaseId String @unique
|
|
securityActions Json @default("[]")
|
|
propertyActions Json @default("[]")
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
fromPhase LifePhase @relation("TransitionFrom", fields: [fromPhaseId], references: [id], onDelete: Cascade)
|
|
toPhase LifePhase @relation("TransitionTo", fields: [toPhaseId], references: [id], onDelete: Cascade)
|
|
}
|