242 lines
9.3 KiB
Markdown
242 lines
9.3 KiB
Markdown
// =============================================
|
|
// 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])
|
|
}
|