diff --git a/src/app/api/admin/companies/[id]/route.ts b/src/app/api/admin/companies/[id]/route.ts index 57d2420..7357065 100644 --- a/src/app/api/admin/companies/[id]/route.ts +++ b/src/app/api/admin/companies/[id]/route.ts @@ -48,6 +48,9 @@ export async function PATCH(request: Request, { params }: { params: Promise<{ id return NextResponse.json({ company }) } catch (error) { console.error("Failed to update company", error) + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2002") { + return NextResponse.json({ error: "Já existe uma empresa com este slug." }, { status: 409 }) + } return NextResponse.json({ error: "Falha ao atualizar empresa" }, { status: 500 }) } } diff --git a/src/app/api/admin/companies/route.ts b/src/app/api/admin/companies/route.ts index ec35306..d34d617 100644 --- a/src/app/api/admin/companies/route.ts +++ b/src/app/api/admin/companies/route.ts @@ -2,6 +2,7 @@ import { NextResponse } from "next/server" import { randomBytes } from "crypto" import { prisma } from "@/lib/prisma" +import { Prisma } from "@prisma/client" import { assertStaffSession } from "@/lib/auth-server" import { isAdmin } from "@/lib/authz" @@ -27,13 +28,15 @@ export async function POST(request: Request) { const body = (await request.json()) as Partial<{ name: string slug: string + isAvulso: boolean + contractedHoursPerMonth: number | string | null cnpj: string | null domain: string | null phone: string | null description: string | null address: string | null }> - const { name, slug, cnpj, domain, phone, description, address } = body ?? {} + const { name, slug, isAvulso, contractedHoursPerMonth, cnpj, domain, phone, description, address } = body ?? {} if (!name || !slug) { return NextResponse.json({ error: "Nome e slug são obrigatórios" }, { status: 400 }) } @@ -46,7 +49,14 @@ export async function POST(request: Request) { name: String(name), slug: String(slug), provisioningCode, - // Campos opcionais (isAvulso, contractedHoursPerMonth) podem ser definidos via PATCH posteriormente. + // Campos opcionais + isAvulso: Boolean(isAvulso ?? false), + contractedHoursPerMonth: + typeof contractedHoursPerMonth === "number" + ? contractedHoursPerMonth + : contractedHoursPerMonth + ? Number(contractedHoursPerMonth) + : null, cnpj: cnpj ? String(cnpj) : null, domain: domain ? String(domain) : null, phone: phone ? String(phone) : null, @@ -57,6 +67,13 @@ export async function POST(request: Request) { return NextResponse.json({ company }) } catch (error) { console.error("Failed to create company", error) + if (error instanceof Prisma.PrismaClientKnownRequestError && error.code === "P2002") { + // Duplicidade de slug por tenant ou provisioningCode único + return NextResponse.json( + { error: "Já existe uma empresa com este slug ou código de provisionamento." }, + { status: 409 } + ) + } return NextResponse.json({ error: "Falha ao criar empresa" }, { status: 500 }) } }