// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // Entités principales model Site { id String @id @default(cuid()) name String description String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations machines Machine[] @@map("sites") } model TypeMachine { id String @id @default(cuid()) name String @unique description String? category String? maintenanceFrequency String? components Json? // Stockage de la structure hiérarchique des composants criticalParts Json? // Stockage des pièces critiques machinePieces Json? // Stockage des pièces de machine specifications Json? // Stockage des spécifications techniques createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations machines Machine[] customFields CustomField[] @relation("TypeMachineCustomFields") @@map("type_machines") } model TypeComposant { id String @id @default(cuid()) name String @unique description String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations composants Composant[] customFields CustomField[] @relation("TypeComposantCustomFields") @@map("type_composants") } model TypePiece { id String @id @default(cuid()) name String @unique description String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations pieces Piece[] customFields CustomField[] @relation("TypePieceCustomFields") @@map("type_pieces") } model Machine { id String @id @default(cuid()) name String reference String? constructeur String? prix Decimal? @db.Decimal(10, 2) emplacement String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations siteId String site Site @relation(fields: [siteId], references: [id], onDelete: Cascade) typeMachineId String? typeMachine TypeMachine? @relation(fields: [typeMachineId], references: [id]) composants Composant[] pieces Piece[] documents Document[] @relation("MachineDocuments") customFieldValues CustomFieldValue[] @relation("MachineCustomFieldValues") @@map("machines") } model Composant { id String @id @default(cuid()) name String reference String? constructeur String? prix Decimal? @db.Decimal(10, 2) emplacement String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations hiérarchiques machineId String? machine Machine? @relation(fields: [machineId], references: [id], onDelete: Cascade) parentComposantId String? parentComposant Composant? @relation("ComposantHierarchy", fields: [parentComposantId], references: [id], onDelete: Cascade) sousComposants Composant[] @relation("ComposantHierarchy") typeComposantId String? typeComposant TypeComposant? @relation(fields: [typeComposantId], references: [id]) pieces Piece[] documents Document[] @relation("ComposantDocuments") customFieldValues CustomFieldValue[] @relation("ComposantCustomFieldValues") @@map("composants") } model Piece { id String @id @default(cuid()) name String reference String? constructeur String? prix Decimal? @db.Decimal(10, 2) emplacement String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations machineId String? machine Machine? @relation(fields: [machineId], references: [id], onDelete: Cascade) composantId String? composant Composant? @relation(fields: [composantId], references: [id], onDelete: Cascade) typePieceId String? typePiece TypePiece? @relation(fields: [typePieceId], references: [id]) documents Document[] @relation("PieceDocuments") customFieldValues CustomFieldValue[] @relation("PieceCustomFieldValues") @@map("pieces") } model Document { id String @id @default(cuid()) name String filename String path String mimeType String size Int createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations polymorphiques machineId String? machine Machine? @relation("MachineDocuments", fields: [machineId], references: [id], onDelete: Cascade) composantId String? composant Composant? @relation("ComposantDocuments", fields: [composantId], references: [id], onDelete: Cascade) pieceId String? piece Piece? @relation("PieceDocuments", fields: [pieceId], references: [id], onDelete: Cascade) @@map("documents") } model CustomField { id String @id @default(cuid()) name String type String // 'string', 'number', 'boolean', 'date' required Boolean @default(false) defaultValue String? options String[] // Pour les champs de type SELECT createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations polymorphiques pour les types typeMachineId String? typeMachine TypeMachine? @relation("TypeMachineCustomFields", fields: [typeMachineId], references: [id], onDelete: Cascade) typeComposantId String? typeComposant TypeComposant? @relation("TypeComposantCustomFields", fields: [typeComposantId], references: [id], onDelete: Cascade) typePieceId String? typePiece TypePiece? @relation("TypePieceCustomFields", fields: [typePieceId], references: [id], onDelete: Cascade) // Relations avec les valeurs customFieldValues CustomFieldValue[] @@map("custom_fields") } model CustomFieldValue { id String @id @default(cuid()) value String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations customFieldId String customField CustomField @relation(fields: [customFieldId], references: [id], onDelete: Cascade) machineId String? machine Machine? @relation("MachineCustomFieldValues", fields: [machineId], references: [id], onDelete: Cascade) composantId String? composant Composant? @relation("ComposantCustomFieldValues", fields: [composantId], references: [id], onDelete: Cascade) pieceId String? piece Piece? @relation("PieceCustomFieldValues", fields: [pieceId], references: [id], onDelete: Cascade) @@map("custom_field_values") }