"use server"; import { revalidatePath } from "next/cache"; import { z } from "zod"; import { getCurrentUser } from "@/data/auth"; import { deletePelanggan, insertPelanggan, updatePelanggan, PelangganInput, } from "@/data/pelanggan"; export type SimpanPelangganState = { ok: boolean; error?: string; kdCustomer?: string }; export type HapusPelangganState = { ok: boolean; error?: string }; const pelangganSchema = z.object({ nama: z.string().trim().min(1, "Nama wajib diisi").max(100), alias: z.string().trim().max(11), ktp: z.string().trim().max(16), alamat: z.string().trim().min(1, "Alamat wajib diisi").max(100), wilayah: z.string().trim().max(200), telp: z.string().trim().max(15), ponsel: z.string().trim().max(15), email: z.string().trim().max(30), jenisCustomer: z.string().trim().max(1), upline: z.string().trim().max(11), btsBon: z.coerce.number().int().min(0).max(2_000_000_000), }); function emptyStringToNull(value: string): string | null { return value === "" ? null : value; } export async function simpanPelanggan(_prevState: SimpanPelangganState, formData: FormData): Promise { await getCurrentUser(); const parsed = pelangganSchema.safeParse({ nama: formData.get("nama"), alias: formData.get("alias"), ktp: formData.get("ktp"), alamat: formData.get("alamat"), wilayah: formData.get("wilayah"), telp: formData.get("telp"), ponsel: formData.get("ponsel"), email: formData.get("email"), jenisCustomer: formData.get("jenisCustomer"), upline: formData.get("upline"), btsBon: formData.get("btsBon"), }) if (!parsed.success) { return { ok: false, error: parsed.error.issues[0].message } } const input: PelangganInput = { ...parsed.data, wilayah: emptyStringToNull(parsed.data.wilayah), telp: emptyStringToNull(parsed.data.telp), ponsel: emptyStringToNull(parsed.data.ponsel), email: emptyStringToNull(parsed.data.email), jenisCustomer: emptyStringToNull(parsed.data.jenisCustomer), upline: emptyStringToNull(parsed.data.upline), } const kdCustomer = String(formData.get("kdCustomer") ?? "").trim(); try { if (kdCustomer === "") { const kdBaru = await insertPelanggan(input); revalidatePath("/master/pelanggan"); return { ok: true, kdCustomer: kdBaru }; } const updated = await updatePelanggan(kdCustomer, input); if (!updated) { return { ok: false, error: "Pelanggan tidak ditemukan" }; } revalidatePath("/master/pelanggan"); return { ok: true, kdCustomer }; } catch (error) { console.error("simpan pelanggan gagal", error); return { ok: false, error: "Gagal menyimpan pelanggan" }; } } export async function hapusPelanggan( _prevState: HapusPelangganState, formData: FormData, ): Promise { await getCurrentUser(); const kdCustomer = String(formData.get("kdCustomer") ?? "").trim(); if (kdCustomer === "") { return { ok: false, error: "Kode pelanggan tidak ada" }; } try { const deleted = await deletePelanggan(kdCustomer); if (!deleted) { return { ok: false, error: "Pelanggan tidak ditemukan" }; } revalidatePath("/master/pelanggan"); return { ok: true }; } catch (error) { console.error("hapus pelanggan gagal", error); return { ok: false, error: "Gagal menghapus pelanggan" }; } }