manicanldes-backend/prisma/checkout.prisma

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")
}