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") }