9.3 KiB
// ============================================= // PRISMA SCHEMA - HQLAND MANAGEMENT SYSTEM // Phiên bản: 2.4 (Cập nhật từ Database thực tế) // Ngày: 18/04/2026 // Ghi chú: Đồng bộ hóa 100% với Migrations hiện tại. // =============================================
datasource db { provider = "postgresql" url = env("DATABASE_URL") }
generator client { provider = "prisma-client-js" }
// ============================================= // 1. PROJECT (Dự án) // ============================================= model Project { id String @id @default(uuid()) code String @unique // ví dụ: STH03 name String createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
products Product[] templates PaymentTemplate[] }
// ============================================= // 2. PRODUCT (Sản phẩm) // ============================================= model Product { id String @id @default(uuid()) projectId String @map("project_id")
productType String @map("product_type") // LAND, APARTMENT...
code String @unique area Decimal @db.Decimal(12, 2) pricePerUnit Decimal @db.Decimal(15, 2) @map("price_per_unit") totalPrice Decimal @db.Decimal(15, 2) @map("total_price")
// Giá trị tài chính bổ sung qsddValue Decimal @default(0) @db.Decimal(15, 2) @map("qsdd_value") foundationTempValue Decimal @default(0) @db.Decimal(15, 2) @map("foundation_temp_value") contractTempValue Decimal @default(0) @db.Decimal(15, 2) @map("contract_temp_value")
// Thông số kỹ thuật adjacentRoad String? @map("adjacent_road") frontageCount Int? @map("frontage_count") maxFloors Int? @map("max_floors") buildingDensity Decimal? @db.Decimal(5, 2) @map("building_density") constructionStatus String? @map("construction_status")
// Hạ tầng & Dữ liệu động infrastructureRawText String? @map("infrastructure_raw_text") infrastructureStatus Json? @map("infrastructure_status") customData Json? @map("custom_data")
// Trạng thái status String @default("Đang mở bán") redBookStatus String @default("Chưa có dữ liệu") @map("red_book_status")
createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
project Project @relation(fields: [projectId], references: [id]) contracts Contract[] settlements Settlement[] }
// ============================================= // 3. CONTRACT & CUSTOMER // ============================================= model Contract { id String @id @default(uuid()) productId String @map("product_id") transferOrder Int @default(0) @map("transfer_order") contractType String @default("HĐMB") @map("contract_type") contractNumber String @unique @map("contract_number") signingDate DateTime? @map("signing_date") status String @default("Đang hiệu lực")
totalValue Decimal @db.Decimal(15, 2) @map("total_value") paidAmount Decimal @default(0) @db.Decimal(15, 2) @map("paid_amount") remainingAmount Decimal @default(0) @db.Decimal(15, 2) @map("remaining_amount") excessAmount Decimal @default(0) @db.Decimal(15, 2) @map("excess_amount") // Tiền dư
metadata Json? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
product Product @relation(fields: [productId], references: [id]) customers ContractCustomer[] appendices Appendix[] payments Payment[] schedule PaymentSchedule? fines PaymentFine[] }
model Customer { id String @id @default(uuid()) cmndCccd String @unique @map("cmnd_cccd") fullName String @map("full_name") phone String? email String? address Json? dob DateTime? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
contracts ContractCustomer[] }
model ContractCustomer { id BigInt @id @default(autoincrement()) contractId String @map("contract_id") customerId String @map("customer_id") role String @default("CHỦ SH 1") transferOrder Int @default(0) @map("transfer_order") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
contract Contract @relation(fields: [contractId], references: [id]) customer Customer @relation(fields: [customerId], references: [id]) }
// ============================================= // 4. FINANCE MODULE // ============================================= model PaymentTemplate { id String @id @default(uuid()) projectId String @map("project_id") name String isDefault Boolean @default(false) @map("is_default") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
project Project @relation(fields: [projectId], references: [id]) items PaymentScheduleItem[] schedules PaymentSchedule[] }
model PaymentSchedule { id String @id @default(uuid()) contractId String @unique @map("contract_id") templateId String @map("template_id") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
contract Contract @relation(fields: [contractId], references: [id]) template PaymentTemplate @relation(fields: [templateId], references: [id]) items PaymentScheduleItem[] }
model PaymentScheduleItem { id String @id @default(uuid()) templateId String? @map("template_id") scheduleId String? @map("schedule_id")
installmentNo Int @map("installment_no") amount Decimal? @db.Decimal(15, 2) percentage Decimal? @db.Decimal(5, 2)
// Logic ngày đến hạn daysAfterSigning Int? @map("days_after_signing") daysAfterPrevious Int? @map("days_after_previous") dueDate DateTime? @map("due_date")
type String // QSDD, MONG, THAN... createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
template PaymentTemplate? @relation(fields: [templateId], references: [id]) schedule PaymentSchedule? @relation(fields: [scheduleId], references: [id]) payments Payment[] }
model Payment { id String @id @default(uuid()) contractId String @map("contract_id") scheduleItemId String? @map("schedule_item_id")
amount Decimal @db.Decimal(15, 2) paidDate DateTime @map("paid_date") receiptNumber String? @map("receipt_number") method String @default("Chuyển khoản") metadata Json? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
contract Contract @relation(fields: [contractId], references: [id]) scheduleItem PaymentScheduleItem? @relation(fields: [scheduleItemId], references: [id]) }
model PaymentFine { id String @id @default(uuid()) contractId String @map("contract_id") amount Decimal @db.Decimal(15, 2) reason String dueDate DateTime @map("due_date") paidDate DateTime? @map("paid_date") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
contract Contract @relation(fields: [contractId], references: [id]) }
// ============================================= // 5. APPENDIX & SETTLEMENT // ============================================= model Appendix { id String @id @default(uuid()) contractId String @map("contract_id") productId String @map("product_id") type String applyFromOrder Int @map("apply_from_order") signingDate DateTime @map("signing_date") customData Json? @map("custom_data") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
contract Contract @relation(fields: [contractId], references: [id]) }
model Settlement { id String @id @default(uuid()) productId String @map("product_id") type String // MONG, THAN, CP THI CONG tempValue Decimal @db.Decimal(15, 2) @map("temp_value") finalValue Decimal @db.Decimal(15, 2) @map("final_value") difference Decimal @db.Decimal(15, 2) redBookStatus String @map("red_book_status") issueDate DateTime? @map("issue_date") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at")
product Product @relation(fields: [productId], references: [id]) }