enum ReservationStatus { ACTIVE RELEASED COMMITTED } model Warehouse { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid name String @db.VarChar(100) organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict) items StockItem[] @@unique([organizationId, name]) @@unique([id, organizationId]) @@map("warehouses") } model StockItem { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid variantId String @map("variant_id") @db.Uuid warehouseId String @map("warehouse_id") @db.Uuid onHand Int @default(0) @map("on_hand") variant ProductVariant @relation(fields: [variantId, organizationId], references: [id, organizationId], onDelete: Restrict) warehouse Warehouse @relation(fields: [warehouseId, organizationId], references: [id, organizationId], onDelete: Restrict) entries StockLedger[] reservations StockReservation[] @@unique([variantId, warehouseId]) @@unique([id, organizationId]) @@index([organizationId, id]) @@map("stock_items") } model StockLedger { id String @id @default(uuid()) @db.Uuid stockItemId String @map("stock_item_id") @db.Uuid organizationId String @map("organization_id") @db.Uuid actorId String @map("actor_id") @db.Uuid actor User @relation(fields: [actorId, organizationId], references: [id, organizationId], onDelete: Restrict) delta Int reason String @db.VarChar(200) idempotencyKey String @map("idempotency_key") @db.Uuid requestHash String @map("request_hash") @db.Char(64) createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) stockItem StockItem @relation(fields: [stockItemId, organizationId], references: [id, organizationId], onDelete: Restrict) @@unique([organizationId, idempotencyKey]) @@index([stockItemId, createdAt, id]) @@map("stock_ledger") } model StockReservation { id String @id @default(uuid()) @db.Uuid stockItemId String @map("stock_item_id") @db.Uuid organizationId String @map("organization_id") @db.Uuid userId String @map("user_id") @db.Uuid user User @relation(fields: [userId, organizationId], references: [id, organizationId], onDelete: Restrict) quantity Int status ReservationStatus @default(ACTIVE) 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) stockItem StockItem @relation(fields: [stockItemId, organizationId], references: [id, organizationId], onDelete: Restrict) @@unique([organizationId, idempotencyKey]) @@index([stockItemId, status, expiresAt]) @@index([userId, organizationId]) @@map("stock_reservations") }