94 lines
3.7 KiB
Plaintext
94 lines
3.7 KiB
Plaintext
enum OrderStatus {
|
|
PENDING_PAYMENT
|
|
CANCELLED
|
|
}
|
|
enum CouponKind {
|
|
FIXED
|
|
PERCENT
|
|
}
|
|
model Cart {
|
|
id String @id @default(uuid()) @db.Uuid
|
|
organizationId String @map("organization_id") @db.Uuid
|
|
userId String @map("user_id") @db.Uuid
|
|
version Int @default(0)
|
|
user User @relation(fields: [userId, organizationId], references: [id, organizationId], onDelete: Restrict)
|
|
lines CartLine[]
|
|
@@unique([userId, organizationId])
|
|
@@unique([id, organizationId])
|
|
@@map("carts")
|
|
}
|
|
model CartLine {
|
|
id String @id @default(uuid()) @db.Uuid
|
|
cartId String @map("cart_id") @db.Uuid
|
|
organizationId String @map("organization_id") @db.Uuid
|
|
variantId String @map("variant_id") @db.Uuid
|
|
quantity Int
|
|
cart Cart @relation(fields: [cartId, organizationId], references: [id, organizationId], onDelete: Cascade)
|
|
variant ProductVariant @relation(fields: [variantId, organizationId], references: [id, organizationId], onDelete: Restrict)
|
|
@@unique([cartId, variantId])
|
|
@@map("cart_lines")
|
|
}
|
|
model Coupon {
|
|
id String @id @default(uuid()) @db.Uuid
|
|
organizationId String @map("organization_id") @db.Uuid
|
|
code String @db.VarChar(40)
|
|
kind CouponKind
|
|
currency String @db.Char(3)
|
|
amount Decimal? @db.Decimal(12,2)
|
|
percentBps Int? @map("percent_bps")
|
|
minimumSubtotal Decimal @default(0) @map("minimum_subtotal") @db.Decimal(12,2)
|
|
maxUses Int @map("max_uses")
|
|
perUserLimit Int @map("per_user_limit")
|
|
startsAt DateTime @map("starts_at") @db.Timestamptz(3)
|
|
endsAt DateTime @map("ends_at") @db.Timestamptz(3)
|
|
active Boolean @default(true)
|
|
organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict)
|
|
orders Order[]
|
|
@@unique([organizationId, code])
|
|
@@unique([id, organizationId])
|
|
@@map("coupons")
|
|
}
|
|
model Order {
|
|
id String @id @default(uuid()) @db.Uuid
|
|
organizationId String @map("organization_id") @db.Uuid
|
|
userId String @map("user_id") @db.Uuid
|
|
status OrderStatus @default(PENDING_PAYMENT)
|
|
currency String @db.Char(3)
|
|
subtotal Decimal @db.Decimal(16,2)
|
|
discount Decimal @db.Decimal(16,2)
|
|
merchandiseTotal Decimal @map("merchandise_total") @db.Decimal(16,2)
|
|
addressSnapshot Json @map("address_snapshot")
|
|
couponSnapshot Json? @map("coupon_snapshot")
|
|
couponId String? @map("coupon_id") @db.Uuid
|
|
idempotencyKey String @map("idempotency_key") @db.Uuid
|
|
requestHash String @map("request_hash") @db.Char(64)
|
|
expiresAt DateTime @map("expires_at") @db.Timestamptz(3)
|
|
createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3)
|
|
user User @relation(fields: [userId, organizationId], references: [id, organizationId], onDelete: Restrict)
|
|
coupon Coupon? @relation(fields: [couponId, organizationId], references: [id, organizationId], onDelete: Restrict)
|
|
lines OrderLine[]
|
|
reservations StockReservation[]
|
|
@@unique([userId, organizationId, idempotencyKey])
|
|
@@unique([id, organizationId])
|
|
@@index([organizationId, userId, createdAt, id])
|
|
@@unique([id, userId, organizationId])
|
|
@@index([couponId, status, expiresAt])
|
|
@@map("orders")
|
|
}
|
|
model OrderLine {
|
|
id String @id @default(uuid()) @db.Uuid
|
|
orderId String @map("order_id") @db.Uuid
|
|
organizationId String @map("organization_id") @db.Uuid
|
|
variantId String @map("variant_id") @db.Uuid
|
|
sku String @db.VarChar(64)
|
|
productName String @map("product_name") @db.VarChar(160)
|
|
variantName String @map("variant_name") @db.VarChar(160)
|
|
quantity Int
|
|
unitPrice Decimal @map("unit_price") @db.Decimal(12,2)
|
|
lineTotal Decimal @map("line_total") @db.Decimal(16,2)
|
|
order Order @relation(fields: [orderId, organizationId], references: [id, organizationId], onDelete: Restrict)
|
|
variant ProductVariant @relation(fields: [variantId, organizationId], references: [id, organizationId], onDelete: Restrict)
|
|
@@unique([orderId, variantId])
|
|
@@map("order_lines")
|
|
}
|