generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum BillingCycle { MONTHLY YEARLY } enum SubscriptionStatus { ACTIVE PAST_DUE CANCELED TRIAL } enum InvoiceStatus { PENDING PAID OVERDUE CANCELED } enum PaymentStatus { PENDING CONFIRMED FAILED CANCELED } enum FiscalStatus { DRAFT ISSUED CANCELED } enum DealStage { LEAD PROPOSAL NEGOTIATION WON LOST } model Tenant { id String @id @default(uuid()) name String taxId String? status String @default("ACTIVE") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt subscriptions Subscription[] invoices Invoice[] payments Payment[] fiscalDocs FiscalDocument[] crmCompanies CrmCompany[] crmContacts CrmContact[] crmDeals CrmDeal[] } model Plan { id String @id @default(uuid()) name String priceCents Int billingCycle BillingCycle softLimit Int? hardLimit Int? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt subscriptions Subscription[] } model Subscription { id String @id @default(uuid()) tenantId String planId String status SubscriptionStatus @default(ACTIVE) startDate DateTime nextDueDate DateTime createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id]) plan Plan @relation(fields: [planId], references: [id]) invoices Invoice[] @@index([tenantId]) @@index([planId]) } model Invoice { id String @id @default(uuid()) tenantId String subscriptionId String? amountCents Int dueDate DateTime status InvoiceStatus @default(PENDING) paidAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id]) subscription Subscription? @relation(fields: [subscriptionId], references: [id]) payments Payment[] fiscalDocs FiscalDocument[] @@index([tenantId]) @@index([subscriptionId]) } model Payment { id String @id @default(uuid()) tenantId String invoiceId String gateway String method String externalId String? status PaymentStatus @default(PENDING) amountCents Int createdAt DateTime @default(now()) updatedAt DateTime @updatedAt invoice Invoice @relation(fields: [invoiceId], references: [id]) tenant Tenant @relation(fields: [tenantId], references: [id]) @@index([tenantId]) @@index([invoiceId]) @@unique([gateway, externalId]) } model FiscalDocument { id String @id @default(uuid()) tenantId String invoiceId String? number String? status FiscalStatus @default(DRAFT) pdfUrl String? xmlUrl String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id]) invoice Invoice? @relation(fields: [invoiceId], references: [id]) @@index([tenantId]) @@index([invoiceId]) } model CrmCompany { id String @id @default(uuid()) tenantId String name String segment String? website String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id]) contacts CrmContact[] deals CrmDeal[] @@index([tenantId]) } model CrmContact { id String @id @default(uuid()) tenantId String companyId String? name String email String? phone String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id]) company CrmCompany? @relation(fields: [companyId], references: [id]) @@index([tenantId]) @@index([companyId]) } model CrmDeal { id String @id @default(uuid()) tenantId String companyId String? name String stage DealStage @default(LEAD) valueCents Int expectedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenant Tenant @relation(fields: [tenantId], references: [id]) company CrmCompany? @relation(fields: [companyId], references: [id]) @@index([tenantId]) @@index([companyId]) }