feat: implement financial recurrence, privacy settings, and premium DateTimePicker overhaul
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- A unique constraint covering the columns `[slug]` on the table `Group` will be added. If there are existing duplicate values, this will fail.
|
||||
- The required column `slug` was added to the `Group` table with a prisma-level default value. This is not possible if the table is not empty. Please add this column as optional, then populate it before making it required.
|
||||
|
||||
*/
|
||||
-- CreateEnum
|
||||
CREATE TYPE "AdminRole" AS ENUM ('SUPER_ADMIN', 'ADMIN');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "GroupStatus" AS ENUM ('ACTIVE', 'FROZEN');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "Plan" AS ENUM ('FREE', 'BASIC', 'PRO');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "FinancialEventType" AS ENUM ('MONTHLY_FEE', 'EXTRA_EVENT', 'CONTRIBUTION');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "FinancialEventStatus" AS ENUM ('OPEN', 'CLOSED', 'CANCELED');
|
||||
|
||||
-- CreateEnum
|
||||
CREATE TYPE "PaymentStatus" AS ENUM ('PENDING', 'PAID', 'WAIVED');
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Group" ADD COLUMN "pixKey" TEXT,
|
||||
ADD COLUMN "pixName" TEXT,
|
||||
ADD COLUMN "plan" "Plan" NOT NULL DEFAULT 'FREE',
|
||||
ADD COLUMN "planExpiresAt" TIMESTAMP(3),
|
||||
ADD COLUMN "slug" TEXT NOT NULL,
|
||||
ADD COLUMN "status" "GroupStatus" NOT NULL DEFAULT 'ACTIVE';
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Match" ADD COLUMN "arenaId" TEXT;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Player" ADD COLUMN "isLeader" BOOLEAN NOT NULL DEFAULT false;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Admin" (
|
||||
"id" TEXT NOT NULL,
|
||||
"email" TEXT NOT NULL,
|
||||
"password" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"role" "AdminRole" NOT NULL DEFAULT 'ADMIN',
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "Admin_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Arena" (
|
||||
"id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"address" TEXT,
|
||||
"groupId" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "Arena_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "FinancialEvent" (
|
||||
"id" TEXT NOT NULL,
|
||||
"title" TEXT NOT NULL,
|
||||
"description" TEXT,
|
||||
"totalAmount" DOUBLE PRECISION,
|
||||
"pricePerPerson" DOUBLE PRECISION,
|
||||
"dueDate" TIMESTAMP(3) NOT NULL,
|
||||
"type" "FinancialEventType" NOT NULL DEFAULT 'MONTHLY_FEE',
|
||||
"status" "FinancialEventStatus" NOT NULL DEFAULT 'OPEN',
|
||||
"groupId" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"isRecurring" BOOLEAN NOT NULL DEFAULT false,
|
||||
"recurrenceInterval" TEXT,
|
||||
"recurrenceEndDate" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "FinancialEvent_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "Payment" (
|
||||
"id" TEXT NOT NULL,
|
||||
"financialEventId" TEXT NOT NULL,
|
||||
"playerId" TEXT NOT NULL,
|
||||
"amount" DOUBLE PRECISION NOT NULL,
|
||||
"status" "PaymentStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"paidAt" TIMESTAMP(3),
|
||||
"method" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "Payment_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Admin_email_key" ON "Admin"("email");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Payment_financialEventId_playerId_key" ON "Payment"("financialEventId", "playerId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "Group_slug_key" ON "Group"("slug");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Match" ADD CONSTRAINT "Match_arenaId_fkey" FOREIGN KEY ("arenaId") REFERENCES "Arena"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Arena" ADD CONSTRAINT "Arena_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "FinancialEvent" ADD CONSTRAINT "FinancialEvent_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Payment" ADD CONSTRAINT "Payment_financialEventId_fkey" FOREIGN KEY ("financialEventId") REFERENCES "FinancialEvent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Payment" ADD CONSTRAINT "Payment_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
@@ -44,6 +44,7 @@ model Group {
|
||||
pixKey String?
|
||||
pixName String?
|
||||
status GroupStatus @default(ACTIVE)
|
||||
showTotalInPublic Boolean @default(true)
|
||||
}
|
||||
|
||||
enum GroupStatus {
|
||||
@@ -63,6 +64,7 @@ model Player {
|
||||
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])
|
||||
@@ -167,6 +169,7 @@ model FinancialEvent {
|
||||
isRecurring Boolean @default(false)
|
||||
recurrenceInterval String? // 'MONTHLY', 'WEEKLY'
|
||||
recurrenceEndDate DateTime?
|
||||
showTotalInPublic Boolean @default(true)
|
||||
}
|
||||
|
||||
model Payment {
|
||||
|
||||
@@ -19,7 +19,7 @@ async function main() {
|
||||
})
|
||||
|
||||
// 2. Criar Pelada de Exemplo
|
||||
await prisma.group.upsert({
|
||||
const group = await prisma.group.upsert({
|
||||
where: { email: 'erik@idealpages.com.br' },
|
||||
update: {},
|
||||
create: {
|
||||
@@ -34,6 +34,55 @@ async function main() {
|
||||
}
|
||||
})
|
||||
|
||||
// 3. Criar Jogador Líder (Rei)
|
||||
await prisma.player.upsert({
|
||||
where: { number_groupId: { number: 10, groupId: group.id } },
|
||||
update: {},
|
||||
create: {
|
||||
name: 'Erik Ideal',
|
||||
number: 10,
|
||||
position: 'MEI',
|
||||
level: 5,
|
||||
// @ts-ignore
|
||||
isLeader: true,
|
||||
groupId: group.id
|
||||
}
|
||||
})
|
||||
|
||||
// 4. Adicionar alguns jogadores para teste
|
||||
const players = [
|
||||
{ name: 'Ricardo Rocha', number: 4, position: 'ZAG', level: 4 },
|
||||
{ name: 'Bebeto', number: 7, position: 'ATA', level: 5 },
|
||||
{ name: 'Dunga', number: 8, position: 'VOL', level: 4 },
|
||||
{ name: 'Taffarel', number: 1, position: 'GOL', level: 5 },
|
||||
]
|
||||
|
||||
for (const p of players) {
|
||||
await prisma.player.upsert({
|
||||
where: { number_groupId: { number: p.number, groupId: group.id } },
|
||||
update: {},
|
||||
create: {
|
||||
...p,
|
||||
groupId: group.id
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 5. Criar uma partida agendada
|
||||
const nextWednesday = new Date()
|
||||
nextWednesday.setDate(nextWednesday.getDate() + ((7 - nextWednesday.getDay() + 3) % 7 || 7))
|
||||
nextWednesday.setHours(20, 0, 0, 0)
|
||||
|
||||
await prisma.match.create({
|
||||
data: {
|
||||
groupId: group.id,
|
||||
date: nextWednesday,
|
||||
location: 'Arena Central',
|
||||
maxPlayers: 20,
|
||||
status: 'SCHEDULED'
|
||||
}
|
||||
})
|
||||
|
||||
console.log('Seed concluído com sucesso!')
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user