File size: 4,542 Bytes
f31cfe8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider     = "sqlite"
  url          = "file:./data/tinker.db"
  relationMode = "prisma"
}

model User {
  id            String    @id @default(cuid())
  name          String?
  email         String    @unique
  password      String?
  emailVerified DateTime?
  image         String?
  createdAt     DateTime  @default(now())
  updatedAt     DateTime  @updatedAt
  subscription  String    @default("free")
  credits       Int       @default(10)
  maxDeals      Int       @default(5)
  accounts      Account[]
  sessions      Session[]
  deals         Deal[]
  scanLogs      ScanLog[]
  negotiations  Negotiation[]
  transactions  Transaction[]
  queueItems    QueueItem[]

  @@map("users")
}

model Account {
  id                String  @id @default(cuid())
  userId            String
  type              String
  provider          String
  providerAccountId String
  refresh_token     String?
  access_token      String?
  expires_at        Int?
  token_type        String?
  scope             String?
  id_token          String?
  session_state     String?
  user              User    @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([provider, providerAccountId])
  @@map("accounts")
}

model Session {
  id           String   @id @default(cuid())
  sessionToken String   @unique
  userId       String
  expires      DateTime
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@map("sessions")
}

model Deal {
  id            String        @id @default(cuid())
  userId        String
  title         String
  sourceUrl     String
  marketplace   String
  buyPrice      Float
  estimatedSell Float
  profitMargin  Float
  confidence    Float         @default(0)
  status        String        @default("pending")
  scrapedAt     DateTime      @default(now())
  analyzedAt    DateTime?
  negotiatedAt  DateTime?
  transactedAt  DateTime?
  sellerContact String?
  notes         String?
  user          User          @relation(fields: [userId], references: [id], onDelete: Cascade)
  negotiations  Negotiation[]
  transaction   Transaction?

  @@index([userId, status])
  @@map("deals")
}

model ScanLog {
  id            String   @id @default(cuid())
  userId        String?
  marketplace   String
  itemsScanned  Int      @default(0)
  dealsFound    Int      @default(0)
  duration      Int
  status        String   @default("completed")
  error         String?
  createdAt     DateTime @default(now())
  user          User?    @relation(fields: [userId], references: [id], onDelete: SetNull)

  @@index([createdAt])
  @@map("scan_logs")
}

model Negotiation {
  id          String   @id @default(cuid())
  dealId      String
  userId      String
  message     String
  response    String?
  offeredPrice Float?
  acceptedPrice Float?
  status      String   @default("pending")
  turn        Int      @default(1)
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
  deal        Deal     @relation(fields: [dealId], references: [id], onDelete: Cascade)
  user        User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([dealId])
  @@map("negotiations")
}

model Transaction {
  id              String   @id @default(cuid())
  dealId          String   @unique
  userId          String
  amount          Float
  fee             Float    @default(0)
  netProfit       Float
  paymentMethod   String
  paymentStatus   String   @default("pending")
  shippingAddress String?
  trackingNumber  String?
  status          String   @default("pending")
  createdAt       DateTime @default(now())
  completedAt     DateTime?
  deal            Deal     @relation(fields: [dealId], references: [id], onDelete: Cascade)
  user            User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId, status])
  @@map("transactions")
}

model QueueItem {
  id         String   @id @default(cuid())
  userId     String
  dealId     String?
  action     String
  priority   Int      @default(5)
  status     String   @default("queued")
  data       String?
  error      String?
  retries    Int      @default(0)
  maxRetries Int      @default(3)
  scheduled  DateTime?
  startedAt  DateTime?
  finishedAt DateTime?
  createdAt  DateTime @default(now())
  updatedAt  DateTime @updatedAt
  user       User     @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([status, priority])
  @@map("queue_items")
}