// 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 = "sqlite" } model User { id String @id @default(cuid()) email String @unique name String? password String sessions Session[] sharedSessions SessionShare[] sessionEvents SessionEvent[] // Moving Motivators relations motivatorSessions MovingMotivatorsSession[] sharedMotivatorSessions MMSessionShare[] motivatorSessionEvents MMSessionEvent[] // Year Review relations yearReviewSessions YearReviewSession[] sharedYearReviewSessions YRSessionShare[] yearReviewSessionEvents YRSessionEvent[] // Weekly Check-in relations weeklyCheckInSessions WeeklyCheckInSession[] sharedWeeklyCheckInSessions WCISessionShare[] weeklyCheckInSessionEvents WCISessionEvent[] // Teams & OKRs relations createdTeams Team[] teamMembers TeamMember[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Session { id String @id @default(cuid()) title String collaborator String date DateTime @default(now()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) items SwotItem[] actions Action[] shares SessionShare[] events SessionEvent[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId]) } enum SwotCategory { STRENGTH WEAKNESS OPPORTUNITY THREAT } model SwotItem { id String @id @default(cuid()) content String category SwotCategory order Int @default(0) sessionId String session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade) actionLinks ActionLink[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([sessionId]) } model Action { id String @id @default(cuid()) title String description String? priority Int @default(0) status String @default("todo") dueDate DateTime? sessionId String session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade) links ActionLink[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([sessionId]) } model ActionLink { id String @id @default(cuid()) actionId String action Action @relation(fields: [actionId], references: [id], onDelete: Cascade) swotItemId String swotItem SwotItem @relation(fields: [swotItemId], references: [id], onDelete: Cascade) @@unique([actionId, swotItemId]) @@index([actionId]) @@index([swotItemId]) } // ============================================ // Collaboration & Real-time // ============================================ enum ShareRole { VIEWER EDITOR } model SessionShare { id String @id @default(cuid()) sessionId String session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) role ShareRole @default(EDITOR) createdAt DateTime @default(now()) @@unique([sessionId, userId]) @@index([sessionId]) @@index([userId]) } model SessionEvent { id String @id @default(cuid()) sessionId String session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) type String // ITEM_CREATED, ITEM_UPDATED, ITEM_DELETED, ACTION_CREATED, etc. payload String // JSON payload createdAt DateTime @default(now()) @@index([sessionId, createdAt]) } // ============================================ // Moving Motivators Workshop // ============================================ enum MotivatorType { STATUS // Statut POWER // Pouvoir ORDER // Ordre ACCEPTANCE // Acceptation HONOR // Honneur MASTERY // Maîtrise SOCIAL // Relations sociales FREEDOM // Liberté CURIOSITY // Curiosité PURPOSE // But } model MovingMotivatorsSession { id String @id @default(cuid()) title String participant String // Nom du participant date DateTime @default(now()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) cards MotivatorCard[] shares MMSessionShare[] events MMSessionEvent[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId]) } model MotivatorCard { id String @id @default(cuid()) type MotivatorType orderIndex Int // Position horizontale (1-10, importance) influence Int @default(0) // Position verticale (-3 à +3) sessionId String session MovingMotivatorsSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([sessionId, type]) // Une seule carte par type par session @@index([sessionId]) } model MMSessionShare { id String @id @default(cuid()) sessionId String session MovingMotivatorsSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) role ShareRole @default(EDITOR) createdAt DateTime @default(now()) @@unique([sessionId, userId]) @@index([sessionId]) @@index([userId]) } model MMSessionEvent { id String @id @default(cuid()) sessionId String session MovingMotivatorsSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) type String // CARD_MOVED, CARD_INFLUENCE_CHANGED, etc. payload String // JSON payload createdAt DateTime @default(now()) @@index([sessionId, createdAt]) } // ============================================ // Year Review Workshop // ============================================ enum YearReviewCategory { ACHIEVEMENTS // Réalisations / Accomplissements CHALLENGES // Défis / Difficultés rencontrées LEARNINGS // Apprentissages / Compétences développées GOALS // Objectifs pour l'année suivante MOMENTS // Moments forts / Moments difficiles } model YearReviewSession { id String @id @default(cuid()) title String participant String // Nom du participant year Int // Année du bilan (ex: 2024) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) items YearReviewItem[] shares YRSessionShare[] events YRSessionEvent[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId]) @@index([year]) } model YearReviewItem { id String @id @default(cuid()) content String category YearReviewCategory order Int @default(0) sessionId String session YearReviewSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([sessionId]) @@index([sessionId, category]) } model YRSessionShare { id String @id @default(cuid()) sessionId String session YearReviewSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) role ShareRole @default(EDITOR) createdAt DateTime @default(now()) @@unique([sessionId, userId]) @@index([sessionId]) @@index([userId]) } model YRSessionEvent { id String @id @default(cuid()) sessionId String session YearReviewSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) type String // ITEM_CREATED, ITEM_UPDATED, ITEM_DELETED, etc. payload String // JSON payload createdAt DateTime @default(now()) @@index([sessionId, createdAt]) } // ============================================ // Teams & OKRs // ============================================ enum TeamRole { ADMIN MEMBER } enum OKRStatus { NOT_STARTED IN_PROGRESS COMPLETED CANCELLED } enum KeyResultStatus { NOT_STARTED IN_PROGRESS COMPLETED AT_RISK } model Team { id String @id @default(cuid()) name String description String? createdById String creator User @relation(fields: [createdById], references: [id], onDelete: Cascade) members TeamMember[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([createdById]) } model TeamMember { id String @id @default(cuid()) teamId String team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) role TeamRole @default(MEMBER) okrs OKR[] joinedAt DateTime @default(now()) @@unique([teamId, userId]) @@index([teamId]) @@index([userId]) } model OKR { id String @id @default(cuid()) teamMemberId String teamMember TeamMember @relation(fields: [teamMemberId], references: [id], onDelete: Cascade) objective String description String? period String // Q1 2025, Q2 2025, H1 2025, 2025, etc. startDate DateTime endDate DateTime status OKRStatus @default(NOT_STARTED) keyResults KeyResult[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([teamMemberId]) @@index([teamMemberId, period]) @@index([status]) } model KeyResult { id String @id @default(cuid()) okrId String okr OKR @relation(fields: [okrId], references: [id], onDelete: Cascade) title String targetValue Float currentValue Float @default(0) unit String @default("%") // %, nombre, etc. status KeyResultStatus @default(NOT_STARTED) order Int @default(0) notes String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([okrId]) @@index([okrId, order]) } // ============================================ // Weekly Check-in Workshop // ============================================ enum WeeklyCheckInCategory { WENT_WELL // Ce qui s'est bien passé WENT_WRONG // Ce qui s'est mal passé CURRENT_FOCUS // Les enjeux du moment (je me concentre sur ...) NEXT_FOCUS // Les prochains enjeux } enum Emotion { PRIDE // Fierté JOY // Joie SATISFACTION // Satisfaction GRATITUDE // Gratitude CONFIDENCE // Confiance FRUSTRATION // Frustration WORRY // Inquiétude DISAPPOINTMENT // Déception EXCITEMENT // Excitement ANTICIPATION // Anticipation DETERMINATION // Détermination NONE // Aucune émotion } model WeeklyCheckInSession { id String @id @default(cuid()) title String participant String // Nom du participant date DateTime @default(now()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) items WeeklyCheckInItem[] shares WCISessionShare[] events WCISessionEvent[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId]) @@index([date]) } model WeeklyCheckInItem { id String @id @default(cuid()) content String category WeeklyCheckInCategory emotion Emotion @default(NONE) order Int @default(0) sessionId String session WeeklyCheckInSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([sessionId]) @@index([sessionId, category]) } model WCISessionShare { id String @id @default(cuid()) sessionId String session WeeklyCheckInSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) role ShareRole @default(EDITOR) createdAt DateTime @default(now()) @@unique([sessionId, userId]) @@index([sessionId]) @@index([userId]) } model WCISessionEvent { id String @id @default(cuid()) sessionId String session WeeklyCheckInSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) type String // ITEM_CREATED, ITEM_UPDATED, ITEM_DELETED, etc. payload String // JSON payload createdAt DateTime @default(now()) @@index([sessionId, createdAt]) }