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