generator client { provider = "prisma-client-js" binaryTargets = ["native", "linux-musl-openssl-3.0.x", "debian-openssl-3.0.x"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") } // Super Admin da plataforma TemFut (acessa admin.localhost) model Admin { id String @id @default(cuid()) email String @unique password String name String role AdminRole @default(ADMIN) createdAt DateTime @default(now()) } enum AdminRole { SUPER_ADMIN // Acesso total ADMIN // Acesso de leitura } model Group { id String @id @default(cuid()) slug String @unique @default(cuid()) // Para subdomínios (ex: flamengo.temfut.com) name String logoUrl String? primaryColor String @default("#000000") secondaryColor String @default("#ffffff") createdAt DateTime @default(now()) email String? @unique password String? plan Plan @default(FREE) planExpiresAt DateTime? matches Match[] players Player[] sponsors Sponsor[] arenas Arena[] financialEvents FinancialEvent[] transactions Transaction[] pixKey String? pixName String? status GroupStatus @default(ACTIVE) showTotalInPublic Boolean @default(true) votingEnabled Boolean @default(true) teamConfigs TeamConfig[] } enum GroupStatus { ACTIVE FROZEN } enum Plan { FREE BASIC PRO } model Player { id String @id @default(cuid()) name String number Int? position String @default("MEI") level Int @default(3) isLeader Boolean @default(false) groupId String createdAt DateTime @default(now()) group Group @relation(fields: [groupId], references: [id]) teams TeamPlayer[] attendances Attendance[] payments Payment[] reviews Review[] matchEvents MatchEvent[] transactions Transaction[] @@unique([number, groupId]) } model Attendance { id String @id @default(cuid()) playerId String player Player @relation(fields: [playerId], references: [id]) matchId String match Match @relation(fields: [matchId], references: [id], onDelete: Cascade) status String @default("CONFIRMED") // CONFIRMED, CANCELED createdAt DateTime @default(now()) @@unique([playerId, matchId]) } model Match { id String @id @default(cuid()) date DateTime location String? arenaId String? arena Arena? @relation(fields: [arenaId], references: [id]) maxPlayers Int? drawSeed String? status MatchStatus @default(CONVOCACAO) groupId String createdAt DateTime @default(now()) group Group @relation(fields: [groupId], references: [id]) teams Team[] attendances Attendance[] isRecurring Boolean @default(false) recurrenceInterval String? // 'WEEKLY' recurrenceEndDate DateTime? duration Int? @default(60) // Duração em minutos actualStartTime DateTime? actualEndTime DateTime? enableVoting Boolean @default(true) votingDuration Int @default(72) // Duração da votação em horas (24, 48, 72) gamificationType String @default("PADRAO") // PADRAO, PAREDAO, OSCAR events MatchEvent[] reviews Review[] } model Team { id String @id @default(cuid()) name String color String shirtUrl String? matchId String match Match @relation(fields: [matchId], references: [id], onDelete: Cascade) players TeamPlayer[] matchEvents MatchEvent[] } model TeamConfig { id String @id @default(cuid()) name String color String @default("#000000") shirtUrl String? groupId String group Group @relation(fields: [groupId], references: [id]) createdAt DateTime @default(now()) } model TeamPlayer { id String @id @default(cuid()) teamId String playerId String player Player @relation(fields: [playerId], references: [id]) team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) } enum MatchStatus { SCHEDULED CONVOCACAO SORTEIO LIVE IN_PROGRESS ENCERRAMENTO CANCELED } model Sponsor { id String @id @default(cuid()) name String logoUrl String? groupId String createdAt DateTime @default(now()) group Group @relation(fields: [groupId], references: [id]) } model Arena { id String @id @default(cuid()) name String address String? groupId String group Group @relation(fields: [groupId], references: [id]) matches Match[] createdAt DateTime @default(now()) } model FinancialEvent { id String @id @default(cuid()) title String description String? totalAmount Float? // Meta de arrecadação (opcional) pricePerPerson Float? // Valor por pessoa dueDate DateTime type FinancialEventType @default(MONTHLY_FEE) status FinancialEventStatus @default(OPEN) groupId String group Group @relation(fields: [groupId], references: [id]) payments Payment[] createdAt DateTime @default(now()) isRecurring Boolean @default(false) recurrenceInterval String? // 'MONTHLY', 'WEEKLY' recurrenceEndDate DateTime? showTotalInPublic Boolean @default(true) } model Payment { id String @id @default(cuid()) financialEventId String financialEvent FinancialEvent @relation(fields: [financialEventId], references: [id], onDelete: Cascade) playerId String player Player @relation(fields: [playerId], references: [id]) amount Float status PaymentStatus @default(PENDING) paidAt DateTime? method String? // PIX, CASH createdAt DateTime @default(now()) @@unique([financialEventId, playerId]) } enum FinancialEventType { MONTHLY_FEE EXTRA_EVENT CONTRIBUTION } enum FinancialEventStatus { OPEN CLOSED CANCELED } enum PaymentStatus { PENDING PAID WAIVED } model MatchEvent { id String @id @default(cuid()) matchId String match Match @relation(fields: [matchId], references: [id], onDelete: Cascade) type String // GOAL, CARD_YELLOW, CARD_RED, etc. playerId String? player Player? @relation(fields: [playerId], references: [id]) teamId String? team Team? @relation(fields: [teamId], references: [id]) minute Int? createdAt DateTime @default(now()) } model Review { id String @id @default(cuid()) matchId String match Match @relation(fields: [matchId], references: [id], onDelete: Cascade) playerId String // Atleta que está sendo avaliado player Player @relation(fields: [playerId], references: [id]) reviewerId String? // Opcional type String // STAR (Craque), PEREBA, FAIR_PLAY, etc. createdAt DateTime @default(now()) } model Transaction { id String @id @default(cuid()) description String amount Float type TransactionType @default(INCOME) category String? // 'Mensalidade', 'Avulso', 'Sobra', 'Material', 'Quadra', etc. date DateTime @default(now()) groupId String group Group @relation(fields: [groupId], references: [id]) playerId String? // Opcional: para vincular a um atleta específico (ex: avulso) player Player? @relation(fields: [playerId], references: [id]) createdAt DateTime @default(now()) } enum TransactionType { INCOME // Entrada EXPENSE // Saída }