generator client {
  provider        = "prisma-client-js"
  binaryTargets   = ["native", "debian-openssl-3.0.x"]
  previewFeatures = ["typedSql", "prismaSchemaFolder"]
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL_MANAGER")
}

//AdStat--------------------------------

model AdStat {
  id Int @id @default(autoincrement())

  date        DateTime
  spend       Decimal  @default(0) @db.Decimal(18, 2)
  conversions Int
  impressions Int
  clicks      Int
  adId        String
  adgroupId   String
  campaignId  String
  accountId   String

  accountIdRef Int
  account      Account @relation(fields: [accountIdRef], references: [id])

  @@unique([date, accountIdRef, adId])
  @@map("ad_stat")
}

//TikTok--------------------------------
model TikTokCampaign {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  operationStatus  String //operation_status
  createTikTokTime DateTime
  campaignName     String
  tikTokCampaignId String
  tikTokAccountId  String
  budget           Decimal  @default(0) @db.Decimal(18, 2)

  account   Account         @relation(fields: [accountId], references: [id])
  accountId Int
  adgroups  TikTokAdgroup[]

  @@unique([tikTokCampaignId, accountId])
  @@map("tiktok_campaign")
}

model TikTokAdgroup {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  operationStatus  String //operation_status
  createTikTokTime DateTime
  adgroupName      String
  tikTokCampaignId String
  tikTokAdgroupId  String
  tikTokAccountId  String
  budget           Decimal  @default(0) @db.Decimal(18, 2)
  pixelId          String?

  campaign   TikTokCampaign? @relation(fields: [campaignId], references: [id])
  campaignId Int?
  accountId  Int?
  account    Account?        @relation(fields: [accountId], references: [id])

  ads TikTokAd[]

  @@unique([tikTokAdgroupId, tikTokCampaignId])
  @@map("tiktok_adgroup")
}

model TikTokAd {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  operationStatus  String //operation_status
  createTikTokTime DateTime
  adName           String
  tikTokAdId       String
  tikTokAdgroupId  String
  tikTokCampaignId String
  tikTokAccountId  String
  trackingPixelId  String?
  landingPageUrl   String

  adgroup   TikTokAdgroup? @relation(fields: [adgroupId], references: [id])
  adgroupId Int?
  accountId Int?
  account   Account?       @relation(fields: [accountId], references: [id])

  @@unique([tikTokAdId, tikTokAdgroupId])
  @@map("tiktok_ad")
}

//Facebook------------------------------
model FacebookCampaign {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  status               String
  createFbCampaignDate DateTime
  facebookCampaignId   String
  name                 String
  facebookAccountId    String // do not forget to add act_ before account id
  dailyBudget          Decimal   @default(0) @db.Decimal(18, 2)
  budgetRemaining      Decimal   @default(0) @db.Decimal(18, 2)
  startTime            DateTime?
  stopTime             DateTime?

  accountId Int?
  account   Account? @relation(fields: [accountId], references: [id])

  adgroups FacebookAdgroup[]

  @@unique([facebookAccountId, facebookCampaignId])
  @@map("facebook_campaign")
}

model FacebookAdgroup {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  status              String
  createFbAdgroupDate DateTime
  facebookCampaignId  String
  facebookAccountId   String // do not forget to add act_ before account id
  facebookAdgroupId   String
  name                String
  dailyBudget         Decimal  @default(0) @db.Decimal(18, 2)
  budgetRemaining     Decimal  @default(0) @db.Decimal(18, 2)

  campaignId Int?
  campaign   FacebookCampaign? @relation(fields: [campaignId], references: [id])
  accountId  Int?
  account    Account?          @relation(fields: [accountId], references: [id])

  ads FacebookAd[]

  @@unique([facebookAdgroupId, facebookCampaignId])
  @@map("facebook_adgroup")
}

model FacebookAd {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  status              String
  createFbAdgroupDate DateTime
  facebookCampaignId  String
  facebookAccountId   String // do not forget to add act_ before account id
  facebookAdgroupId   String
  facebookAdId        String
  name                String
  landingPageUrl      String?

  adgroupId Int?
  adgroup   FacebookAdgroup? @relation(fields: [adgroupId], references: [id])
  accountId Int?
  account   Account?         @relation(fields: [accountId], references: [id])

  @@unique([facebookAdId, facebookAdgroupId])
  @@map("facebook_ad")
}

model BinomUser {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  name           String
  groupOffId     String?
  groupCampId    String?
  archived       Boolean @default(false)
  userExternalId String?

  user User?

  teamId Int?
  team   Team? @relation(fields: [teamId], references: [id])

  binomAffNetworks BinomAffNetwork[]
  binomOffers      BinomOffer[]
  binomCampaigns   BinomCampaign[]

  @@unique([name])
  @@map("binom_user")
}

model BinomCampaign {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  binomCampaignName String
  binomCampaignId   Int

  binomUserId          Int
  binomUser            BinomUser          @relation(fields: [binomUserId], references: [id])
  binomDomainId        Int
  binomDomain          BinomDomain        @relation(fields: [binomDomainId], references: [id])
  binomTrafficSourceId Int
  binomTrafficSource   BinomTrafficSource @relation(fields: [binomTrafficSourceId], references: [id])

  binomRules BinomRule[]

  @@map("binom_campaign")
}

model BinomTrafficSource {
  id Int @id @default(autoincrement())

  externalId    String
  trafficSource TrafficSource

  binomCampaigns BinomCampaign[]

  @@map("binom_traffic_source")
}

model Domain {
  id         Int      @id @default(autoincrement())
  createDate DateTime @default(now())
  updateDate DateTime @updatedAt

  name     String         @unique
  tf       TrafficSource?
  provider Provider?
  tracker  TrackerType?

  adscomDomain AdscomDomain?
  binomDomain  BinomDomain?

  userId Int?
  user   User? @relation(fields: [userId], references: [id])

  @@map("domain")
}

model SystemSettings {
  id Int @id @default(autoincrement())

  binomTimezone         String
  binomSsnUrl           String
  binomArmUrl           String
  binomDomain           String
  binomApiKey           String
  tonicFinalizationHour Int // example 23 in UTC

  @@map("system_settings")
}

model BusinessManager {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  name          String
  bmId          String
  trafficSource TrafficSource
  active        Boolean       @default(true)

  apiAccessId Int?
  apiAccess   ApiAccess? @relation(fields: [apiAccessId], references: [id])

  accounts Account[]

  @@map("business_manager")
}

model AccountUser {
  accountId Int
  userId    Int
  account   Account @relation(fields: [accountId], references: [id])
  user      User    @relation(fields: [userId], references: [id])

  @@id([accountId, userId])
  @@unique([accountId, userId])
  @@map("account_to_user")
}

model Agency {
  id       Int       @id @default(autoincrement())
  createAt DateTime  @default(now())
  updateAt DateTime  @updatedAt
  name     String    @unique
  note     String?
  color    String?
  archived Boolean   @default(false)
  accounts Account[]

  @@map("agency")
}

enum HardcodedAgencies {
  HTTE
  HTTC
  PTW
  GH
  SBC
  BLF
  WLP
  T4Y
}

model Team {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  name               String
  note               String?
  binomName          String?
  color              String?
  archived           Boolean @default(false)
  teamRevenuePercent Decimal @default(0) @db.Decimal(18, 2) // how much revenue team will get by default
  inviteCode         String?

  businessDirectionId Int?
  businessDirection   BusinessDirection?  @relation(fields: [businessDirectionId], references: [id])
  parentTeamId        Int?
  parentTeam          Team?               @relation("subteams_teams", fields: [parentTeamId], references: [id])
  managerId           Int?
  manager             User?               @relation("teams_managed_by_user", fields: [managerId], references: [id])
  financeProfile      TeamFinanceProfile?

  subTeams                      Team[]                        @relation("subteams_teams")
  users                         User[]
  binomUsers                    BinomUser[]
  newBuyerAccessRequestEntities NewBuyerAccessRequestEntity[]
  accounts                      Account[]

  @@map("team")
}

model BusinessDirection {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  name                         String
  archived                     Boolean @default(false)
  showSearch                   Boolean @default(true)
  includeToSearchFinanceReport Boolean @default(true)

  teams    Team[]
  accounts Account[]

  wrongDomainsWebsiteSettings WebSiteSettings[] @relation("wrongDomains")

  @@map("business_direction")
}

model LeadToSendToTracker {
  id Int @id @default(autoincrement())

  trackerId        String
  revenue          Decimal          @default(0) @db.Decimal(18, 2)
  event1           String?
  event2           String?
  leadDate         DateTime
  conversionStatus ConvertionStatus

  @@map("lead_to_send_to_tracker")
}

model TonicLead {
  id       Int      @id @default(autoincrement())
  createAt DateTime @default(now())
  updateAt DateTime @updatedAt

  clicks         Int
  revenue        Decimal  @default(0) @db.Decimal(18, 2)
  trackerClickId String?
  keyword        String
  campaignName   String
  campaignId     String
  date           DateTime
  tonicAccountId Int
  offerName      String
  offerId        String
  country        String
  vertical       String
  isSentToBinom  Boolean  @default(false)
  isFinal        Boolean
  isNeedUpdate   Boolean
  error          Boolean  @default(false)

  tomicAccount     ProviderAccount @relation(fields: [tonicAccountId], references: [id])
  user             User?           @relation(fields: [userId], references: [id])
  userId           Int?
  binomV2AccountId Int?
  binomV2Account   BinomV2Account? @relation(fields: [binomV2AccountId], references: [id])

  @@unique([campaignId, trackerClickId, date])
  @@map("tonic_lead")
}

model DomainActiveLead {
  id Int @id @default(autoincrement())

  clicks         Int
  revenue        Decimal @default(0) @db.Decimal(18, 2)
  trackerClickId String?
  keyword        String

  domainActiveAccount   DomainActiveAccount @relation(fields: [domainActiveAccountId], references: [id])
  domainActiveAccountId Int
  user                  User?               @relation(fields: [userId], references: [id])
  userId                Int?

  @@map("domain_active_lead")
}

model DomainActiveAccount {
  id Int @id @default(autoincrement())

  name  String
  token String

  leads DomainActiveLead[]

  @@map("domain_active_account")
}

model BinomAffNetwork {
  id Int @id @default(autoincrement())

  networkId String
  name      String

  users  BinomUser[]
  offers BinomOffer[]

  @@map("binom_aff_network")
}

model ProviderAccount {
  id               Int           @id @default(autoincrement())
  createAt         DateTime      @default(now())
  updateAt         DateTime      @updatedAt
  consumerKey      String?
  consumerSecret   String?
  name             String
  trafficSource    TrafficSource
  provider         Provider      @default(TONIC)
  startWorkingDate DateTime?
  login            String?
  password         String?
  apiToken         String?
  isActive         Boolean       @default(true)
  domain           String?

  tonicLeads     TonicLead[]
  offers         Offer[]
  inuvoCampaigns InuvoCampaign[] // we need this to check uniqunes of the campaign isd
  tonicCampaigns TonicCampaign[]

  providerBaseReports        ProviderBaseReport[]
  userProviderRevenueReports ProviderRevenueReport[]
  usersConnector             ProviderAccountToUser[]
  tonicHeadline              TonicHeadline[]

  @@map("provider_account")
}

model ProviderAccountToUser {
  id Int @id @default(autoincrement())

  providerAccountId Int
  providerAccount   ProviderAccount @relation(fields: [providerAccountId], references: [id])
  userId            Int
  user              User            @relation(fields: [userId], references: [id])

  @@map("provider_account_to_user")
}

model WorkerEntity {
  id           Int        @id @default(autoincrement())
  name         String
  type         WorkerType
  minutes      Int
  isRunning    Boolean
  isActive     Boolean
  fileName     String
  nextRunTime  DateTime?
  lastDuration Float? //seconds
  workerData   String?
  error        Boolean?
  errorMessage String?

  logs Log[]

  @@map("worker_entity")
}

model FacebookEvent {
  id Int @id @default(autoincrement())

  eventName       String?
  eventTime       DateTime?
  eventIp         String?
  eventId         String?
  eventUserAgent  String?
  fbClid          String? // id passed to a link
  needToSend      Boolean
  binomCampaignId String?
  value           String?
  binomOfferId    String?
  binomClickId    String?
  message         String?
  error           Boolean   @default(false)
  eventSentCount  Int       @default(0)
  token           String?

  @@unique([fbClid, binomClickId])
  @@map("facebook_event")
}

model TikTokEvent {
  id Int @id @default(autoincrement())

  eventName       String?
  eventTime       DateTime?
  eventIp         String?
  eventId         String?
  eventUserAgent  String?
  ttclid          String?
  needToSend      Boolean
  binomCampaignId String?
  binomOfferId    String?
  binomClickId    String?         @unique
  value           String?
  message         String?
  eventDirection  EventDirection? @default(SEARCH)
  pixel           String?
  eventSentCount  Int             @default(0)
  advertizerId    String?
  token           String?

  error Boolean @default(false)

  @@unique([ttclid, binomClickId])
  @@map("tiktok_event")
}

enum EventDirection {
  SEARCH
  TEDDY
}

model Pixel {
  id         Int      @id @default(autoincrement())
  createDate DateTime @default(now())
  updateDate DateTime @updatedAt

  externalPixelId   String
  customPixelName   String
  externalPixelName String?
  pixelToken        String
  pixelTf           TrafficSource @default(FACEBOOK)
  pixelProvider     Provider      @default(TONIC)

  account   Account? @relation(fields: [accountId], references: [id])
  accountId Int?
  userId    Int?
  user      User?    @relation(fields: [userId], references: [id])

  adscomPixel AdscomPixel?
  inuvoPixel  InuvoPixel?

  binomDomains BinomDomain[]

  @@unique([pixelProvider, pixelTf, externalPixelId, userId])
  @@map("pixel")
}

//---------------------------------

model BinomDomain {
  id         Int      @id @default(autoincrement())
  createDate DateTime @default(now())

  name            String
  sslValidTime    DateTime
  domainValidDate DateTime?
  binomDomainId   String
  campaigns       Int
  status          String
  ssl             String
  sslStatus       String

  domainId Int    @unique
  domain   Domain @relation(fields: [domainId], references: [id])

  pixelId Int?
  pixel   Pixel? @relation(fields: [pixelId], references: [id])

  users          User[]
  binomCampaigns BinomCampaign[]

  @@map("binom_domain")
}

model WebSiteSettings {
  id         Int      @id @default(autoincrement())
  createDate DateTime @default(now())

  active Boolean @default(false)

  accountManagerTasksDefaultUserId  Int?  @unique()
  accountManagerRequestsDefaultUser User? @relation("accountManagerRequestsDefaultUser", fields: [accountManagerTasksDefaultUserId], references: [id])
  techTasksDefaultUserId            Int?  @unique()
  techRequestsDefaultUser           User? @relation("techRequestsDefaultUser", fields: [techTasksDefaultUserId], references: [id])

  wrongDomainsBusinessDirections BusinessDirection[] @relation("wrongDomains") // which business directions should be displayed on wrong domains page

  @@map("website_settings")
}

model Timezone {
  id         Int      @id @default(autoincrement())
  createDate DateTime @default(now())

  name       String
  timeNumber String?

  users                 User[]
  createAccountRequests CreateAccountRequest[]

  @@map("timezone")
}

enum DocumentType {
  PASSPORT_WITH_PERSON
  PASSPORT_IMAGE
  NDA
  RESIDENCE
  DEBIT_CARD
}

model Document {
  id         Int      @id @default(autoincrement())
  createdAt  DateTime @default(now())
  updateDate DateTime @updatedAt

  type DocumentType
  url  String?
  name String       @unique

  userId Int
  user   User? @relation("UserDocuments", fields: [userId], references: [id])

  @@map("document")
}

model Image {
  id         Int      @id @default(autoincrement())
  createDate DateTime @default(now())

  imageExtension String
  imageType      ImageType
  imageUrl       String?

  profileUser User?

  @@map("image")
}

model DateRevenue {
  id Int @id @default(autoincrement()) // must have

  amount Decimal  @default(0) @db.Decimal(18, 2)
  date   DateTime
  leads  Int      @default(0)

  offerId     Int?
  offer       Offer?  @relation(fields: [offerId], references: [id])
  isFinalized Boolean @default(false)

  @@unique([date, offerId])
  @@map("date_revenue")
}

model TelegramBot {
  id Int @id @default(autoincrement()) // must have

  name        String
  botKey      String
  telegramTag String @default("")

  users User[]
  types TelegramBotToType[]

  @@map("telegram_bot")
}

model TelegramBotToType {
  id Int @id @default(autoincrement()) // must have

  type TelegramBotType

  telegramBotId Int?
  telegramBot   TelegramBot? @relation(fields: [telegramBotId], references: [id])

  @@map("telegram_bot_type")
}

model ApiAccess {
  id Int @id @default(autoincrement()) // must have

  type                     ApiAccessType
  name                     String         @default("") // in case with facebook add manually
  token                    String?
  active                   Boolean        @default(true) // changing by api
  clientId                 String?
  clientSecret             String?
  trafficSource            TrafficSource? @default(FACEBOOK)
  url                      String?
  note                     String?
  status                   Boolean        @default(true) // changed manually to prevent working with token
  isAdmin                  Boolean        @default(false) // special for fb. If token is from king account - true
  isBuyerMainFacebookToken Boolean        @default(false) // if token is facebook token - it can be main or safety token 

  businessManagers BusinessManager[]
  accounts         Account[]

  userId Int?
  user   User? @relation(fields: [userId], references: [id])

  @@unique([type, token])
  @@map("api_access")
}

model BinomRule {
  id Int @id @default(autoincrement())

  name    String
  default Boolean

  type            BinomRuleType
  countryCriteria BinomRuleToCountry[]
  offers          BinomRuleToOffer[]

  binomCampaignId Int
  binomCampaign   BinomCampaign? @relation(fields: [binomCampaignId], references: [id])

  @@map("binom_rule")
}

model BinomCountry {
  id Int @id @default(autoincrement())

  name String

  countryCriteria BinomRuleToCountry[]
  binomOffers     BinomOffer[]

  @@map("binom_country")
}

model BinomRuleToOffer {
  id Int @id @default(autoincrement())

  binomOfferId Int
  binomOffer   BinomOffer? @relation(fields: [binomOfferId], references: [id])
  ruleId       Int
  rule         BinomRule?  @relation(fields: [ruleId], references: [id])

  @@map("binom_rule_to_offer")
}

model BinomRuleToCountry {
  id Int @id @default(autoincrement())

  countryId Int
  country   BinomCountry? @relation(fields: [countryId], references: [id])
  ruleId    Int
  rule      BinomRule?    @relation(fields: [ruleId], references: [id])

  @@map("binom_rule_to_country")
}

model BinomOffer {
  id Int @id @default(autoincrement())

  url        String
  externalId Int
  name       String

  countryId    Int
  country      BinomCountry?    @relation(fields: [countryId], references: [id])
  affNetworkId Int
  affNetwork   BinomAffNetwork? @relation(fields: [affNetworkId], references: [id])
  binomUserId  Int
  binomUser    BinomUser?       @relation(fields: [binomUserId], references: [id])

  binomRulesToOffers BinomRuleToOffer[]

  @@map("binom_offer")
}

model Click {
  id         Int      @id @default(autoincrement())
  createDate DateTime @default(now())

  clickType                 ClickEvent?
  offerType                 OfferType?
  provider                  Provider?
  tracker                   TrackerType?
  isFinalized               Boolean      @default(false)
  trackerExternalClickId    String?
  revenue                   Decimal      @default(0) @db.Decimal(18, 2)
  date                      DateTime     @default(now())
  hasError                  Boolean      @default(false)
  errorMessage              String?
  hasErrorOnSendTfEvent     Boolean      @default(false)
  errorMessageOnSendTfEvent String?
  hasToSendTfEvent          Boolean      @default(false)
  trafficSourceClickId      String?
  hasToSendTrackerRevenue   Boolean      @default(false)

  inuvoClick InuvoClick?

  userId  Int?
  user    User?  @relation(fields: [userId], references: [id])
  offerId Int?
  offer   Offer? @relation(fields: [offerId], references: [id])

  @@map("click")
}

enum BinomRuleType {
  COUNTRY // 4
}

enum ApiAccessType {
  FACEBOOK_COST
  FACEBOOK_AGENCY
  TIKTOK_AGENCY
  TIKTOK_COST
  CLOUDFLARE_FULL
  BINOM
}

enum ClickEvent {
  PAGE_VIEW
  KEYWORD_BLOCK_LOADED
  CLICK
  UNDEFINED
}

enum TelegramBotType {
  FACEBOOK_TOKEN_CHECK
  SYSTEMS_CHECK
}

enum Provider {
  TONIC
  ADSCOM
  SYSTEM1
  DOMAIN_ACTIVE
  INUVO
}

enum TonicCampaignStatus {
  incomplete
  pending
  active
  stopped
  deleted
}

enum TieredPayoutRuleEntityType {
  TEAM
  USER
}

enum CommentType {
  ADMIN
  GENERAL
}

enum ImageType {
  LOCAL
  CLOUD
}

enum EmailAccessAction {
  REMOVE
  ADD
}

enum AccountManagerRequestStatus {
  NEW
  IN_PROGRESS
  ERROR
  DONE
}

enum AccountFinanceRequestStatus {
  NEW
  IN_PROGRESS_BY_AGENCY
  IN_PROGRESS
  ERROR
  DONE
}

enum TopUpRequestStatus {
  NEW
  IN_PROGRESS_BY_AGENCY
  IN_PROGRESS
  ERROR
  DONE
}

enum GeneralRequestStatus {
  NEW
  IN_PROGRESS
  NEED_MORE_INFO
  DONE
}

enum AccountManagerRequestType {
  CREATE_ACCOUNT //
  RENAME_ACCOUNT
  TRANSFER_PIXEL
  UNLOCK_ACCOUNT
  EMAIL_ACCESS
  OTHER
}

enum TechRequestType {
  COST_TROUBLES
  REVENUE_TROUBLES
  NEW_BUYER_ACCESS
  ADD_NEW_DOMAINS
  REMOVE_BUYER_ACCESS
  OTHER
}

enum WorkerType {
  INTERVAL
  SPECIFIC_TIME
}

enum Role {
  OWNER
  ADMIN
  TEAMLEAD
  BUYER
  HELPER
}

enum TrafficSource {
  FACEBOOK
  TIKTOK
  TABOOLA
  GOOGLE
  BIGO
  BING
  GENERAL
}

enum TonicAccountType {
  FACEBOOK
  TIKTOK
  TABOOLA
}

enum UserStatus {
  FIRED
  EMPLOYED
}

enum ConvertionStatus {
  lead
  final_lead
}

enum AccountPayoutStatus {
  DONE
  NONE
}

enum Currency {
  USD
  USDT
  UAH
  EUR
}

enum Test {
  test
}
