enum MaterialKind { WAX FRAGRANCE WICK DYE VESSEL PACKAGING LABEL OTHER } enum MaterialUnit { GRAM KILOGRAM MILLILITRE LITRE PIECE METRE } enum PurchaseOrderStatus { DRAFT ISSUED CANCELLED } model Supplier { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid name String @db.VarChar(160) code String @db.VarChar(32) contactName String @map("contact_name") @db.VarChar(160) email String @db.VarChar(254) phone String @db.VarChar(24) active Boolean @default(true) 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) materials SupplierMaterial[] purchaseOrders PurchaseOrder[] @@unique([organizationId, code]) @@unique([id, organizationId]) @@index([organizationId, active, name, id]) @@map("suppliers") } model Material { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid name String @db.VarChar(160) code String @db.VarChar(32) kind MaterialKind unit MaterialUnit active Boolean @default(true) 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) suppliers SupplierMaterial[] purchaseOrderLines PurchaseOrderLine[] @@unique([organizationId, code]) @@unique([id, organizationId]) @@index([organizationId, active, kind, name, id]) @@map("materials") } model PurchaseOrder { id String @id @default(uuid()) @db.Uuid organizationId String @map("organization_id") @db.Uuid supplierId String @map("supplier_id") @db.Uuid createdById String @map("created_by_id") @db.Uuid reference String @db.VarChar(20) status PurchaseOrderStatus @default(DRAFT) currency String @db.Char(3) expectedDeliveryAt DateTime? @map("expected_delivery_at") @db.Date merchandiseTotal Decimal @map("merchandise_total") @db.Decimal(12,2) issuedAt DateTime? @map("issued_at") @db.Timestamptz(3) cancelledAt DateTime? @map("cancelled_at") @db.Timestamptz(3) createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) supplier Supplier @relation(fields: [supplierId, organizationId], references: [id, organizationId], onDelete: Restrict) createdBy User @relation(fields: [createdById, organizationId], references: [id, organizationId], onDelete: Restrict) organization Organization @relation(fields: [organizationId], references: [id], onDelete: Restrict) lines PurchaseOrderLine[] @@unique([organizationId, reference]) @@unique([id, organizationId]) @@index([organizationId, status, createdAt, id]) @@map("purchase_orders") } model PurchaseOrderLine { id String @id @default(uuid()) @db.Uuid purchaseOrderId String @map("purchase_order_id") @db.Uuid organizationId String @map("organization_id") @db.Uuid materialId String @map("material_id") @db.Uuid materialName String @map("material_name") @db.VarChar(160) materialCode String @map("material_code") @db.VarChar(32) unit MaterialUnit supplierSku String @map("supplier_sku") @db.VarChar(64) quantity Decimal @db.Decimal(12,3) unitPrice Decimal @map("unit_price") @db.Decimal(12,2) lineTotal Decimal @map("line_total") @db.Decimal(12,2) purchaseOrder PurchaseOrder @relation(fields: [purchaseOrderId, organizationId], references: [id, organizationId], onDelete: Restrict) material Material @relation(fields: [materialId, organizationId], references: [id, organizationId], onDelete: Restrict) @@unique([purchaseOrderId, materialId]) @@index([materialId, organizationId]) @@map("purchase_order_lines") } model SupplierMaterial { supplierId String @map("supplier_id") @db.Uuid materialId String @map("material_id") @db.Uuid organizationId String @map("organization_id") @db.Uuid supplierSku String @map("supplier_sku") @db.VarChar(64) leadTimeDays Int @map("lead_time_days") minOrderQuantity Decimal @map("min_order_quantity") @db.Decimal(12, 3) unitPrice Decimal @map("unit_price") @db.Decimal(12, 2) currency String @db.Char(3) active Boolean @default(true) updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz(3) supplier Supplier @relation(fields: [supplierId, organizationId], references: [id, organizationId], onDelete: Restrict) material Material @relation(fields: [materialId, organizationId], references: [id, organizationId], onDelete: Restrict) @@id([supplierId, materialId]) @@index([materialId, organizationId, active]) @@map("supplier_materials") }