// 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 contactName String @default("") contactPhone String @default("") contactAddress String @default("") contactPostalCode String @default("") contactCity String @default("") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt // Relations machines Machine[] documents Document[] @relation("SiteDocuments") @@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") componentRequirements TypeMachineComponentRequirement[] pieceRequirements TypeMachinePieceRequirement[] @@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") models ComposantModel[] componentRequirements TypeMachineComponentRequirement[] @@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") models PieceModel[] pieceRequirements TypeMachinePieceRequirement[] @@map("type_pieces") } model Machine { id String @id @default(cuid()) name String reference 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]) constructeurId String? constructeur Constructeur? @relation(fields: [constructeurId], references: [id], onDelete: SetNull) 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? 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]) composantModelId String? composantModel ComposantModel? @relation(fields: [composantModelId], references: [id], onDelete: SetNull) typeMachineComponentRequirementId String? typeMachineComponentRequirement TypeMachineComponentRequirement? @relation(fields: [typeMachineComponentRequirementId], references: [id], onDelete: SetNull) constructeurId String? constructeur Constructeur? @relation(fields: [constructeurId], references: [id], onDelete: SetNull) pieces Piece[] documents Document[] @relation("ComposantDocuments") customFieldValues CustomFieldValue[] @relation("ComposantCustomFieldValues") @@map("composants") } model Piece { id String @id @default(cuid()) name String reference 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]) pieceModelId String? pieceModel PieceModel? @relation(fields: [pieceModelId], references: [id], onDelete: SetNull) typeMachinePieceRequirementId String? typeMachinePieceRequirement TypeMachinePieceRequirement? @relation(fields: [typeMachinePieceRequirementId], references: [id], onDelete: SetNull) constructeurId String? constructeur Constructeur? @relation(fields: [constructeurId], references: [id], onDelete: SetNull) documents Document[] @relation("PieceDocuments") customFieldValues CustomFieldValue[] @relation("PieceCustomFieldValues") @@map("pieces") } model Constructeur { id String @id @default(cuid()) name String @unique email String? phone String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt machines Machine[] composants Composant[] pieces Piece[] @@map("constructeurs") } model Profile { id String @id @default(cuid()) firstName String lastName String isActive Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("profiles") } 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) siteId String? site Site? @relation("SiteDocuments", fields: [siteId], 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") } model ComposantModel { id String @id @default(cuid()) name String description String? structure Json? // Définition du composant (sous-composants, pièces, champs personnalisés) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt typeComposantId String typeComposant TypeComposant @relation(fields: [typeComposantId], references: [id], onDelete: Cascade) composants Composant[] @@map("composant_models") } model PieceModel { id String @id @default(cuid()) name String description String? structure Json? // Définition de la pièce (champs personnalisés par défaut, etc.) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt typePieceId String typePiece TypePiece @relation(fields: [typePieceId], references: [id], onDelete: Cascade) pieces Piece[] @@map("piece_models") } model TypeMachineComponentRequirement { id String @id @default(cuid()) label String? minCount Int @default(1) maxCount Int? required Boolean @default(true) allowNewModels Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt typeMachineId String typeMachine TypeMachine @relation(fields: [typeMachineId], references: [id], onDelete: Cascade) typeComposantId String typeComposant TypeComposant @relation(fields: [typeComposantId], references: [id]) composants Composant[] @@map("type_machine_component_requirements") } model TypeMachinePieceRequirement { id String @id @default(cuid()) label String? minCount Int @default(0) maxCount Int? required Boolean @default(false) allowNewModels Boolean @default(true) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt typeMachineId String typeMachine TypeMachine @relation(fields: [typeMachineId], references: [id], onDelete: Cascade) typePieceId String typePiece TypePiece @relation(fields: [typePieceId], references: [id]) pieces Piece[] @@map("type_machine_piece_requirements") }