feat: add error handling to player creation and update gitignore for agent

This commit is contained in:
Erik Silva
2026-01-24 14:18:40 -03:00
commit 416bd83ea7
93 changed files with 16861 additions and 0 deletions

206
prisma/schema.prisma Normal file
View File

@@ -0,0 +1,206 @@
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[]
pixKey String?
pixName String?
status GroupStatus @default(ACTIVE)
}
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)
groupId String
createdAt DateTime @default(now())
group Group @relation(fields: [groupId], references: [id])
teams TeamPlayer[]
attendances Attendance[]
payments Payment[]
@@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(SCHEDULED)
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?
}
model Team {
id String @id @default(cuid())
name String
color String
matchId String
match Match @relation(fields: [matchId], references: [id], onDelete: Cascade)
players TeamPlayer[]
}
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
IN_PROGRESS
COMPLETED
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?
}
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
}