almeira-web/facturacion-dian-hub/backend/prisma/schema.prisma

188 lines
6.9 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Tenant {
id String @id @default(uuid()) @db.Uuid
name String
slug String @unique
apiKeyHash String
status String @default("ACTIVE") // ACTIVE, SUSPENDED
economicActivityCode String?
contactEmail String
webhookUrl String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
resoluciones DianResolution[]
facturas Invoice[]
auditLogs AuditLog[]
@@map("tenants")
}
model CompanyProfile {
id String @id @default(uuid()) @db.Uuid
nit String @unique
dv String
legalName String
tradeName String
taxRegime String @default("48") // 48 = Responsable de IVA
fiscalResponsibility String @default("O-13,O-15,O-23,O-47")
departmentCode String @default("76") // Valle del Cauca
cityCode String @default("76001") // Cali
cityName String @default("Cali")
address String @default("Avenida Colombia # 12-45")
email String @default("facturacion@innovacionydesarrollo.co")
phone String @default("+57 300 123 4567")
softwareId String @default("d5e07b47-6aea-43cc-b38c-3c7d46b4a52f")
softwarePin String @default("75319")
dianEnvironment String @default("HABILITACION") // HABILITACION, PRODUCCION
testSetId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("company_profiles")
}
model DigitalCertificate {
id String @id @default(uuid()) @db.Uuid
alias String
issuer String
subject String
serialNumber String
validFrom DateTime
validTo DateTime
p12DataEncrypted String @db.Text
passwordEncrypted String
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("digital_certificates")
}
model DianResolution {
id String @id @default(uuid()) @db.Uuid
tenantId String? @db.Uuid
resolutionNumber String
prefix String
fromNumber BigInt
toNumber BigInt
currentConsecutive BigInt
technicalKey String
startDate DateTime
endDate DateTime
isActive Boolean @default(true)
documentType String @default("01") // 01: Factura, 91: NC, 92: ND
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
tenant Tenant? @relation(fields: [tenantId], references: [id])
facturas Invoice[]
@@unique([prefix, resolutionNumber])
@@map("dian_resolutions")
}
model Invoice {
id String @id @default(uuid()) @db.Uuid
tenantId String @db.Uuid
resolutionId String @db.Uuid
prefix String
consecutive BigInt
fullNumber String @unique
documentType String @default("01") // 01: Factura Venta, 91: NC, 92: ND
issueDate DateTime
issueTime String
currency String @default("COP")
operationType String @default("10")
paymentType String @default("1") // 1 = Contado, 2 = Credito
paymentMethodCode String @default("10") // 10 = Efectivo, 48 = Tarjeta, 31 = Transferencia
paymentDueDate DateTime?
subtotal Decimal @db.Decimal(14, 2)
taxTotal Decimal @db.Decimal(14, 2)
discountTotal Decimal @default(0) @db.Decimal(14, 2)
grandTotal Decimal @db.Decimal(14, 2)
cufe String? @unique
qrContent String? @db.Text
xmlSigned String? @db.Text
xmlDianResponse String? @db.Text
dianStatus String @default("PENDING") // PENDING, SIGNED, ACCEPTED, REJECTED, ERROR, CONTINGENCY
dianStatusCode String?
dianStatusDescription String? @db.Text
dianTrackingKey String?
dianReceivedDate DateTime?
pdfUrl String?
metadata Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
tenant Tenant @relation(fields: [tenantId], references: [id])
resolution DianResolution @relation(fields: [resolutionId], references: [id])
customer InvoiceCustomer?
items InvoiceItem[]
auditLogs AuditLog[]
@@index([tenantId, dianStatus])
@@index([issueDate])
@@map("invoices")
}
model InvoiceCustomer {
id String @id @default(uuid()) @db.Uuid
invoiceId String @unique @db.Uuid
identificationType String @default("13") // 13: CC, 31: NIT, 22: CE, 41: Pasaporte
identificationNumber String
dv String?
legalOrFullName String
tradeName String?
email String
phone String?
address String
departmentCode String @default("76")
cityCode String @default("76001")
cityName String @default("Cali")
taxRegime String @default("49") // 48: Responsable IVA, 49: No responsable IVA
invoice Invoice @relation(fields: [invoiceId], references: [id], onDelete: Cascade)
@@map("invoice_customers")
}
model InvoiceItem {
id String @id @default(uuid()) @db.Uuid
invoiceId String @db.Uuid
lineNumber Int
sku String
description String
quantity Decimal @db.Decimal(12, 4)
unitCode String @default("EA")
unitPrice Decimal @db.Decimal(14, 2)
totalCost Decimal @db.Decimal(14, 2)
taxPercentage Decimal @default(19.00) @db.Decimal(5, 2)
taxAmount Decimal @db.Decimal(14, 2)
taxTypeCode String @default("01") // 01 = IVA, 04 = INC
discountAmount Decimal @default(0) @db.Decimal(14, 2)
invoice Invoice @relation(fields: [invoiceId], references: [id], onDelete: Cascade)
@@map("invoice_items")
}
model AuditLog {
id String @id @default(uuid()) @db.Uuid
tenantId String? @db.Uuid
invoiceId String? @db.Uuid
action String
details Json
ipAddress String?
userAgent String?
createdAt DateTime @default(now())
tenant Tenant? @relation(fields: [tenantId], references: [id])
invoice Invoice? @relation(fields: [invoiceId], references: [id])
@@index([action, createdAt])
@@map("audit_logs")
}