diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index 9dbe5d54..6bfe2465 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -14,7 +14,127 @@ datasource db { } model User { - id String @id @default(cuid()) - email String @unique - name String? + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + email String @unique + name String? + userWalletAccounts UserWalletAccount[] + budgetUsers BudgetUser[] + transactions Transaction[] +} + +model UserWalletAccount { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + userId String + user User @relation(fields: [userId], references: [id]) + + name String + icon String? + description String? + lastDigits String? + transactions Transaction[] +} + +model Budget { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + name String + description String? + type BudgetType @default(SPENDING) + + periodConfig BudgetPeriodConfig? + budgetUsers BudgetUser[] + transactions Transaction[] +} + +enum BudgetType { + SPENDING + SAVING + INVESTING + DEBT +} + +enum BudgetPeriod { + MONTHLY + QUARTERLY + YEARLY + CUSTOM +} + +model BudgetPeriodConfig { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + period BudgetPeriod + amount Decimal + currency String + startDate DateTime? + endDate DateTime? + + budget Budget @relation(fields: [budgetId], references: [id], onDelete: Cascade) + budgetId String @unique +} + +model BudgetUser { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + permission BudgetUserPermission + + userId String + user User @relation(fields: [userId], references: [id]) + budgetId String + budget Budget @relation(fields: [budgetId], references: [id]) + + @@unique([userId, budgetId]) +} + +enum BudgetUserPermission { + OWNER + MEMBER +} + +model Transaction { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + amount Decimal + currency String + date DateTime + note String? + + categoryId String? + category Category? @relation(fields: [categoryId], references: [id], onDelete: SetNull) + budgetId String + budget Budget @relation(fields: [budgetId], references: [id]) + walletAccountId String + walletAccount UserWalletAccount @relation(fields: [walletAccountId], references: [id]) + createdByUserId String + createdByUser User @relation(fields: [createdByUserId], references: [id]) +} + +model Category { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + name String + description String? + icon String? + color String? + + parent Category? @relation("CategoryToCategory", fields: [parentId], references: [id], onDelete: SetNull) + parentId String? + children Category[] @relation("CategoryToCategory") + transactions Transaction[] }