// 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 Machine { id String @id @default(cuid()) name String reference String? prix Decimal? @db.Decimal(10, 2) 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) componentLinks MachineComponentLink[] pieceLinks MachinePieceLink[] 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) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt structure Json? typeComposantId String? typeComposant ModelType? @relation("ModelTypeComponentAssignments", fields: [typeComposantId], references: [id]) constructeurId String? constructeur Constructeur? @relation(fields: [constructeurId], references: [id], onDelete: SetNull) documents Document[] @relation("ComposantDocuments") customFieldValues CustomFieldValue[] @relation("ComposantCustomFieldValues") machineLinks MachineComponentLink[] @@map("composants") } model Piece { id String @id @default(cuid()) name String reference String? prix Decimal? @db.Decimal(10, 2) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt typePieceId String? typePiece ModelType? @relation("ModelTypePieceAssignments", fields: [typePieceId], references: [id]) constructeurId String? constructeur Constructeur? @relation(fields: [constructeurId], references: [id], onDelete: SetNull) documents Document[] @relation("PieceDocuments") customFieldValues CustomFieldValue[] @relation("PieceCustomFieldValues") machineLinks MachinePieceLink[] @@map("pieces") } model MachineComponentLink { id String @id @default(cuid()) machineId String composantId String parentLinkId String? typeMachineComponentRequirementId String? nameOverride String? referenceOverride String? prixOverride Decimal? @db.Decimal(10, 2) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt machine Machine @relation(fields: [machineId], references: [id], onDelete: Cascade) composant Composant @relation(fields: [composantId], references: [id], onDelete: Cascade) parentLink MachineComponentLink? @relation("MachineComponentLinkHierarchy", fields: [parentLinkId], references: [id], onDelete: Cascade) childLinks MachineComponentLink[] @relation("MachineComponentLinkHierarchy") typeMachineComponentRequirement TypeMachineComponentRequirement? @relation("ComponentRequirementLinks", fields: [typeMachineComponentRequirementId], references: [id], onDelete: SetNull) pieceLinks MachinePieceLink[] @relation("ComponentLinkPieceLinks") @@map("machine_component_links") } model MachinePieceLink { id String @id @default(cuid()) machineId String pieceId String parentLinkId String? typeMachinePieceRequirementId String? nameOverride String? referenceOverride String? prixOverride Decimal? @db.Decimal(10, 2) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt machine Machine @relation(fields: [machineId], references: [id], onDelete: Cascade) piece Piece @relation(fields: [pieceId], references: [id], onDelete: Cascade) parentLink MachineComponentLink? @relation("ComponentLinkPieceLinks", fields: [parentLinkId], references: [id], onDelete: Cascade) typeMachinePieceRequirement TypeMachinePieceRequirement? @relation("PieceRequirementLinks", fields: [typeMachinePieceRequirementId], references: [id], onDelete: SetNull) @@map("machine_piece_links") } enum ModelCategory { COMPONENT PIECE } model ModelType { id String @id @default(cuid()) name String @db.VarChar(120) code String @unique @db.VarChar(60) category ModelCategory notes String? @db.Text description String? @db.Text componentSkeleton Json? pieceSkeleton Json? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt composants Composant[] @relation("ModelTypeComponentAssignments") componentRequirements TypeMachineComponentRequirement[] @relation("ModelTypeComponentRequirements") customFields CustomField[] @relation("ModelTypeCustomFields") pieceRequirements TypeMachinePieceRequirement[] @relation("ModelTypePieceRequirements") pieces Piece[] @relation("ModelTypePieceAssignments") pieceCustomFields CustomField[] @relation("ModelTypePieceCustomFields") @@index([category, name]) } 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 ModelType? @relation("ModelTypeCustomFields", fields: [typeComposantId], references: [id], onDelete: Cascade) typePieceId String? typePiece ModelType? @relation("ModelTypePieceCustomFields", 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 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 ModelType @relation("ModelTypeComponentRequirements", fields: [typeComposantId], references: [id]) machineComponentLinks MachineComponentLink[] @relation("ComponentRequirementLinks") @@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 ModelType @relation("ModelTypePieceRequirements", fields: [typePieceId], references: [id]) machinePieceLinks MachinePieceLink[] @relation("PieceRequirementLinks") @@map("type_machine_piece_requirements") }