You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.3 KiB
TypeScript

"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<SimpanPelangganState> {
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<HapusPelangganState> {
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" };
}
}