generator client { provider = "prisma-client-js" binaryTargets = ["native", "debian-openssl-3.0.x"] } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) email String @unique passwordHash String firstName String lastName String isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt userRoles UserRole[] contactEntries CrmContactEntry[] } model Role { id String @id @default(cuid()) name String @unique description String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt userRoles UserRole[] rolePermissions RolePermission[] } model Permission { id String @id @default(cuid()) key String @unique description String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt rolePermissions RolePermission[] } model UserRole { userId String roleId String assignedAt DateTime @default(now()) assignedBy String? role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@id([userId, roleId]) } model RolePermission { roleId String permissionId String grantedAt DateTime @default(now()) permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade) role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) @@id([roleId, permissionId]) } model CompanyProfile { id String @id @default(cuid()) companyName String legalName String email String phone String website String taxId String addressLine1 String addressLine2 String city String state String postalCode String country String primaryColor String @default("#185ADB") accentColor String @default("#00A6A6") surfaceColor String @default("#F4F7FB") fontFamily String @default("Manrope") logoFileId String? @unique isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt logoFile FileAttachment? @relation("CompanyLogo", fields: [logoFileId], references: [id], onDelete: SetNull) } model FileAttachment { id String @id @default(cuid()) originalName String storedName String mimeType String sizeBytes Int relativePath String ownerType String ownerId String createdById String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt companyLogoFor CompanyProfile? @relation("CompanyLogo") } model Customer { id String @id @default(cuid()) name String email String phone String addressLine1 String addressLine2 String city String state String postalCode String country String status String @default("ACTIVE") lifecycleStage String @default("ACTIVE") isReseller Boolean @default(false) resellerDiscountPercent Float @default(0) parentCustomerId String? paymentTerms String? currencyCode String? @default("USD") taxExempt Boolean @default(false) creditHold Boolean @default(false) preferredAccount Boolean @default(false) strategicAccount Boolean @default(false) requiresApproval Boolean @default(false) blockedAccount Boolean @default(false) notes String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt contactEntries CrmContactEntry[] contacts CrmContact[] parentCustomer Customer? @relation("CustomerHierarchy", fields: [parentCustomerId], references: [id], onDelete: SetNull) childCustomers Customer[] @relation("CustomerHierarchy") } model Vendor { id String @id @default(cuid()) name String email String phone String addressLine1 String addressLine2 String city String state String postalCode String country String status String @default("ACTIVE") lifecycleStage String @default("ACTIVE") paymentTerms String? currencyCode String? @default("USD") taxExempt Boolean @default(false) creditHold Boolean @default(false) preferredAccount Boolean @default(false) strategicAccount Boolean @default(false) requiresApproval Boolean @default(false) blockedAccount Boolean @default(false) notes String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt contactEntries CrmContactEntry[] contacts CrmContact[] } model CrmContactEntry { id String @id @default(cuid()) type String @default("NOTE") summary String body String contactAt DateTime customerId String? vendorId String? createdById String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt customer Customer? @relation(fields: [customerId], references: [id], onDelete: Cascade) vendor Vendor? @relation(fields: [vendorId], references: [id], onDelete: Cascade) createdBy User? @relation(fields: [createdById], references: [id], onDelete: SetNull) } model CrmContact { id String @id @default(cuid()) fullName String role String @default("OTHER") email String phone String isPrimary Boolean @default(false) customerId String? vendorId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt customer Customer? @relation(fields: [customerId], references: [id], onDelete: Cascade) vendor Vendor? @relation(fields: [vendorId], references: [id], onDelete: Cascade) }