diff --git a/src/app/admin/clients/new/actions.ts b/src/app/admin/clients/new/actions.ts new file mode 100644 index 0000000..f9cacf2 --- /dev/null +++ b/src/app/admin/clients/new/actions.ts @@ -0,0 +1,59 @@ +"use server"; + +import { redirect } from "next/navigation"; +import { revalidatePath } from "next/cache"; +import { z } from "zod"; +import { db } from "@/db"; +import { clients, payments } from "@/db/schema"; + +const createClientSchema = z.object({ + name: z.string().min(1, "Nome richiesto"), + brand_name: z.string().min(1, "Nome brand richiesto"), + brief: z.string().min(1, "Brief richiesto"), +}); + +export async function createClient(formData: FormData) { + const raw = { + name: formData.get("name") as string, + brand_name: formData.get("brand_name") as string, + brief: formData.get("brief") as string, + }; + + const parsed = createClientSchema.safeParse(raw); + if (!parsed.success) { + // In v1 return errors as thrown string — form displays validation inline + throw new Error( + parsed.error.issues.map((i) => i.message).join(", ") + ); + } + + // Insert client — token and id are auto-generated by $defaultFn(() => nanoid()) + const [newClient] = await db + .insert(clients) + .values({ + name: parsed.data.name, + brand_name: parsed.data.brand_name, + brief: parsed.data.brief, + }) + .returning({ id: clients.id, token: clients.token }); + + // Always create two payment stubs per client — Acconto 50% and Saldo 50% + // Amounts default to 0 until admin sets accepted_total; admin updates separately + await db.insert(payments).values([ + { + client_id: newClient.id, + label: "Acconto 50%", + amount: "0", + status: "da_saldare", + }, + { + client_id: newClient.id, + label: "Saldo 50%", + amount: "0", + status: "da_saldare", + }, + ]); + + revalidatePath("/admin"); + redirect(`/admin/clients/${newClient.id}`); +} \ No newline at end of file diff --git a/src/app/admin/clients/new/page.tsx b/src/app/admin/clients/new/page.tsx new file mode 100644 index 0000000..c4a42c6 --- /dev/null +++ b/src/app/admin/clients/new/page.tsx @@ -0,0 +1,69 @@ +import { createClient } from "./actions"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { + Card, + CardContent, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import Link from "next/link"; + +export default function NewClientPage() { + return ( +
Nessun cliente ancora.
++ + Crea il primo cliente + +
+| + Cliente + | ++ Totale + | ++ Acconto + | ++ Saldo + | ++ Link + | +
|---|
{client.brand_name}
+