generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") directUrl = env("DIRECT_URL") } enum UserRole { SYSTEM_ADMIN BUSINESS_OWNER STAFF AUDITOR } enum ReceiptStatus { PENDING VERIFIED REJECTED FAILED } enum PaymentMethod { CASH CARD MOBILE OTHER } model User { id String @id @default(uuid()) telegramId String? @unique @map("telegram_id") externalId String? @unique @map("external_id") email String? @unique username String? role UserRole passwordHash String? @map("password_hash") isActive Boolean @default(true) @map("is_active") // Relations ownerId String? @map("owner_id") owner User? @relation("OwnerStaff", fields: [ownerId], references: [id]) staff User[] @relation("OwnerStaff") receipts Receipt[] verifications Verification[] createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("users") @@index([telegramId]) @@index([externalId]) @@index([role]) } model Receipt { id String @id @default(uuid()) userId String @map("user_id") user User @relation(fields: [userId], references: [id]) // Receipt data imageUrl String @map("image_url") transactionId String? @map("transaction_id") merchant String? date DateTime? amount Float? paymentMethod PaymentMethod? @map("payment_method") // OCR & Status status ReceiptStatus @default(PENDING) ocrProcessed Boolean @default(false) @map("ocr_processed") ocrError String? @map("ocr_error") ocrProcessingTime Int? @map("ocr_processing_time") // milliseconds // Verification isDuplicate Boolean @default(false) @map("is_duplicate") fraudFlags String[] @default([]) @map("fraud_flags") verifications Verification[] createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") @@map("receipts") @@index([userId]) @@index([status]) @@index([transactionId]) @@index([createdAt]) } model Verification { id String @id @default(uuid()) receiptId String @map("receipt_id") receipt Receipt @relation(fields: [receiptId], references: [id]) verifiedBy String @map("verified_by") verifier User @relation(fields: [verifiedBy], references: [id]) status ReceiptStatus notes String? createdAt DateTime @default(now()) @map("created_at") @@map("verifications") @@index([receiptId]) @@index([verifiedBy]) } model PerformanceMetric { id String @id @default(uuid()) date DateTime @default(now()) // OCR Metrics ocrProcessingTime Float? @map("ocr_processing_time") // average in ms ocrFailureRate Float? @map("ocr_failure_rate") // percentage // API Metrics apiResponseTime Float? @map("api_response_time") // average in ms apiRequestCount Int? @map("api_request_count") // System Usage dailyReceiptCount Int? @map("daily_receipt_count") dailyUserCount Int? @map("daily_user_count") createdAt DateTime @default(now()) @map("created_at") @@map("performance_metrics") @@index([date]) }