Xu ly giao dien San Pham
This commit is contained in:
241
prisma2.md
Normal file
241
prisma2.md
Normal file
@@ -0,0 +1,241 @@
|
||||
// =============================================
|
||||
// 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])
|
||||
}
|
||||
Reference in New Issue
Block a user