enum ProductStatus { DRAFT PUBLISHED ARCHIVED } enum GroupKind { CATEGORY COLLECTION } model Product { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid name String @db.VarChar(160) slug String @db.VarChar(160) description String @default("") @db.VarChar(5000) status ProductStatus @default(DRAFT) createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3) organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict) variants ProductVariant[] groups ProductGroup[] @@unique([organizationId, slug]) @@unique([id, organizationId]) @@index([organizationId, status, createdAt, id]) @@map("products") } model ProductVariant { id String @id @default(uuid()) @db.Uuid productId String @map("product_id") @db.Uuid organizationId String @map("organization_id") @db.Uuid sku String @db.VarChar(64) name String @db.VarChar(160) price Decimal @db.Decimal(12,2) currency String @default("INR") @db.Char(3) attributes Json @default("{}") active Boolean @default(true) stockItems StockItem[] product Product @relation(fields: [productId, organizationId], references: [id, organizationId], onDelete: Restrict) @@unique([organizationId, sku]) @@unique([id, organizationId]) @@index([productId, active]) @@map("product_variants") } model CatalogGroup { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid name String @db.VarChar(100) slug String @db.VarChar(100) kind GroupKind organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict) products ProductGroup[] @@unique([organizationId, kind, slug]) @@unique([id, organizationId]) @@map("catalog_groups") } model ProductGroup { productId String @map("product_id") @db.Uuid groupId String @map("group_id") @db.Uuid organizationId String @map("organization_id") @db.Uuid product Product @relation(fields: [productId, organizationId], references: [id, organizationId], onDelete: Cascade) group CatalogGroup @relation(fields: [groupId, organizationId], references: [id, organizationId], onDelete: Restrict) @@id([productId, groupId]) @@index([groupId, organizationId]) @@map("product_groups") }