generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } model audit { auditID Int @id @default(autoincrement()) auditIP String? @db.VarChar(255) auditURL String? @db.VarChar(255) auditURLMethod String? @db.VarChar(255) auditURLPayload String? @db.VarChar(255) auditCreatedDate DateTime? @db.DateTime(0) } model lookup { lookupID Int @id @default(autoincrement()) lookupOrder Int? lookupTitle String? @db.VarChar(255) lookupRefCode String? @db.VarChar(255) lookupValue String? @db.VarChar(255) lookupType String? @db.VarChar(255) lookupStatus String? @db.VarChar(255) lookupCreatedDate DateTime? @db.DateTime(0) lookupModifiedDate DateTime? @db.DateTime(0) } model role { roleID Int @id @default(autoincrement()) roleName String? @db.VarChar(255) roleDescription String? @db.VarChar(255) roleStatus String? @db.VarChar(255) roleCreatedDate DateTime? @db.DateTime(0) roleModifiedDate DateTime? @db.DateTime(0) userrole userrole[] } model user { userID Int @id @default(autoincrement()) userSecretKey String? @db.VarChar(255) userUsername String? @db.VarChar(255) userPassword String? @db.VarChar(255) userFullName String? @db.VarChar(255) userEmail String? @db.VarChar(255) userPhone String? @db.VarChar(255) userStatus String? @db.VarChar(255) userCreatedDate DateTime? @db.DateTime(0) userModifiedDate DateTime? @db.DateTime(0) userrole userrole[] } model userrole { userRoleID Int @id @default(autoincrement()) userRoleUserID Int @default(0) userRoleRoleID Int @default(0) userRoleCreatedDate DateTime @db.DateTime(0) role role @relation(fields: [userRoleRoleID], references: [roleID], onDelete: NoAction, onUpdate: NoAction, map: "FK_userrole_role") user user @relation(fields: [userRoleUserID], references: [userID], onDelete: NoAction, onUpdate: NoAction, map: "FK_userrole_user") @@index([userRoleRoleID], map: "FK_userrole_role") @@index([userRoleUserID], map: "FK_userrole_user") } model site_settings { settingID Int @id @default(autoincrement()) siteName String? @db.VarChar(255) siteNameFontSize Int? @default(18) siteDescription String? @db.Text siteLogo String? @db.VarChar(500) siteLoadingLogo String? @db.VarChar(500) siteFavicon String? @db.VarChar(500) showSiteNameInHeader Boolean? @default(true) primaryColor String? @db.VarChar(50) secondaryColor String? @db.VarChar(50) successColor String? @db.VarChar(50) infoColor String? @db.VarChar(50) warningColor String? @db.VarChar(50) dangerColor String? @db.VarChar(50) customCSS String? @db.Text themeMode String? @db.VarChar(50) customThemeFile String? @db.VarChar(500) currentFont String? @db.VarChar(255) fontSource String? @db.VarChar(500) seoTitle String? @db.VarChar(255) seoDescription String? @db.Text seoKeywords String? @db.Text seoAuthor String? @db.VarChar(255) seoOgImage String? @db.VarChar(500) seoTwitterCard String? @default("summary_large_image") @db.VarChar(50) seoCanonicalUrl String? @db.VarChar(500) seoRobots String? @default("index, follow") @db.VarChar(100) seoGoogleAnalytics String? @db.VarChar(255) seoGoogleTagManager String? @db.VarChar(255) seoFacebookPixel String? @db.VarChar(255) settingCreatedDate DateTime? @db.DateTime(0) settingModifiedDate DateTime? @db.DateTime(0) siteLoginLogo String? @db.VarChar(500) } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. model notification_analytics { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) notification_id String @db.VarChar(36) channel_type String @db.VarChar(20) metric_type String @db.VarChar(30) metric_value Int? @default(0) recorded_at DateTime? @default(now()) @db.Timestamp(0) metadata Json? notifications notifications @relation(fields: [notification_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "notification_analytics_ibfk_1") @@index([notification_id], map: "idx_notification_analytics_notification_id") } model notification_categories { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) name String @db.VarChar(100) value String @unique(map: "value") @db.VarChar(50) description String? @db.Text created_at DateTime? @default(now()) @db.Timestamp(0) updated_at DateTime? @default(now()) @db.Timestamp(0) notifications notifications[] } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. model notification_channels { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) notification_id String @db.VarChar(36) channel_type String @db.VarChar(20) is_enabled Boolean? @default(true) created_at DateTime? @default(now()) @db.Timestamp(0) notifications notifications @relation(fields: [notification_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "notification_channels_ibfk_1") @@index([notification_id], map: "notification_id") } model notification_delivery { id Int @id @default(autoincrement()) notification_id Int channel_type String recipient String is_success Boolean @default(false) error_message String? @db.Text attempts Int @default(0) sent_at DateTime? delivered_at DateTime? created_at DateTime @default(now()) updated_at DateTime } model notification_delivery_config { id Int @id @default(autoincrement()) channel_type String @unique is_enabled Boolean @default(false) provider String provider_config Json status String @default("Not Configured") success_rate Float @default(0) @db.Float created_at DateTime @default(now()) updated_at DateTime created_by Int updated_by Int } model notification_delivery_settings { id Int @id @default(1) auto_retry Boolean @default(true) enable_fallback Boolean @default(true) max_retries Int @default(3) retry_delay Int @default(30) priority String @default("normal") enable_reports Boolean @default(true) created_at DateTime @default(now()) updated_at DateTime created_by Int updated_by Int } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. model notification_queue { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) notification_id String @db.VarChar(36) recipient_id String @db.VarChar(36) scheduled_for DateTime @db.Timestamp(0) priority Int? @default(5) attempts Int? @default(0) max_attempts Int? @default(3) status String? @default("queued") @db.VarChar(20) last_attempt_at DateTime? @db.Timestamp(0) error_message String? @db.Text created_at DateTime? @default(now()) @db.Timestamp(0) updated_at DateTime? @default(now()) @db.Timestamp(0) notifications notifications @relation(fields: [notification_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "notification_queue_ibfk_1") notification_recipients notification_recipients @relation(fields: [recipient_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "notification_queue_ibfk_2") @@index([scheduled_for], map: "idx_notification_queue_scheduled_for") @@index([status], map: "idx_notification_queue_status") @@index([notification_id], map: "notification_id") @@index([recipient_id], map: "recipient_id") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. model notification_recipients { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) notification_id String @db.VarChar(36) user_id String @db.VarChar(36) email String? @db.VarChar(255) channel_type String @db.VarChar(20) status String? @default("pending") @db.VarChar(20) sent_at DateTime? @db.Timestamp(0) delivered_at DateTime? @db.Timestamp(0) opened_at DateTime? @db.Timestamp(0) clicked_at DateTime? @db.Timestamp(0) error_message String? @db.Text ab_test_variant String? @db.VarChar(1) created_at DateTime? @default(now()) @db.Timestamp(0) updated_at DateTime? @default(now()) @db.Timestamp(0) notification_queue notification_queue[] notifications notifications @relation(fields: [notification_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "notification_recipients_ibfk_1") @@index([status], map: "idx_notification_recipients_status") @@index([user_id], map: "idx_notification_recipients_user_id") @@index([notification_id], map: "notification_id") } model notification_templates { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) name String @db.VarChar(100) value String @unique(map: "value") @db.VarChar(50) subject String? @db.VarChar(255) email_content String? @db.Text push_title String? @db.VarChar(100) push_body String? @db.VarChar(300) variables Json? is_active Boolean? @default(true) created_at DateTime? @default(now()) @db.Timestamp(0) updated_at DateTime? @default(now()) @db.Timestamp(0) notifications notifications[] } model notification_user_segments { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) notification_id String @db.VarChar(36) segment_id String @db.VarChar(36) created_at DateTime? @default(now()) @db.Timestamp(0) notifications notifications @relation(fields: [notification_id], references: [id], onDelete: Cascade, onUpdate: NoAction, map: "notification_user_segments_ibfk_1") user_segments user_segments @relation(fields: [segment_id], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "notification_user_segments_ibfk_2") @@index([notification_id], map: "notification_id") @@index([segment_id], map: "segment_id") } /// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info. model notifications { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) title String @db.VarChar(255) type String @db.VarChar(20) priority String @db.VarChar(20) category_id String? @db.VarChar(36) status String? @default("draft") @db.VarChar(20) delivery_type String @db.VarChar(20) scheduled_at DateTime? @db.Timestamp(0) timezone String? @default("UTC") @db.VarChar(50) expires_at DateTime? @db.Timestamp(0) enable_ab_testing Boolean? @default(false) ab_test_split Int? @default(50) ab_test_name String? @db.VarChar(100) enable_tracking Boolean? @default(true) audience_type String @db.VarChar(20) specific_users String? @db.Text user_status String? @db.VarChar(20) registration_period String? @db.VarChar(50) exclude_unsubscribed Boolean? @default(true) respect_do_not_disturb Boolean? @default(true) content_type String @db.VarChar(20) template_id String? @db.VarChar(36) email_subject String? @db.VarChar(255) email_content String? @db.Text call_to_action_text String? @db.VarChar(100) call_to_action_url String? @db.Text push_title String? @db.VarChar(100) push_body String? @db.VarChar(300) push_image_url String? @db.Text estimated_reach Int? @default(0) actual_sent Int? @default(0) created_by String @db.VarChar(36) created_at DateTime? @default(now()) @db.Timestamp(0) updated_at DateTime? @default(now()) @db.Timestamp(0) sent_at DateTime? @db.Timestamp(0) notification_analytics notification_analytics[] notification_channels notification_channels[] notification_queue notification_queue[] notification_recipients notification_recipients[] notification_user_segments notification_user_segments[] notification_categories notification_categories? @relation(fields: [category_id], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "notifications_ibfk_1") notification_templates notification_templates? @relation(fields: [template_id], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "notifications_ibfk_2") @@index([category_id], map: "category_id") @@index([created_by], map: "idx_notifications_created_by") @@index([scheduled_at], map: "idx_notifications_scheduled_at") @@index([status], map: "idx_notifications_status") @@index([template_id], map: "template_id") } model user_notification_preferences { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) user_id String @db.VarChar(36) channel_type String @db.VarChar(20) category_value String? @db.VarChar(50) is_enabled Boolean? @default(true) do_not_disturb_start DateTime? @db.Time(0) do_not_disturb_end DateTime? @db.Time(0) timezone String? @default("UTC") @db.VarChar(50) created_at DateTime? @default(now()) @db.Timestamp(0) updated_at DateTime? @default(now()) @db.Timestamp(0) @@unique([user_id, channel_type, category_value], map: "user_id") @@index([user_id], map: "idx_user_notification_preferences_user_id") } model user_segments { id String @id @default(dbgenerated("(uuid())")) @db.VarChar(36) name String @db.VarChar(100) value String @unique(map: "value") @db.VarChar(50) description String? @db.Text criteria Json is_active Boolean? @default(true) created_at DateTime? @default(now()) @db.Timestamp(0) updated_at DateTime? @default(now()) @db.Timestamp(0) notification_user_segments notification_user_segments[] }