Adds complete initial codebase for the RJ Bulk Supplies fuel delivery backoffice: - Authentication pages and protected route layouts - Customer, supplier, fuel purchase, and delivery note management - Custom reporting and customer statement sending tools - Full UI component library and Tailwind styling - Server actions, API routes, and PocketBase integration - Development scripts and project configuration updates - Updated README and package metadata
67 lines
2.5 KiB
TypeScript
67 lines
2.5 KiB
TypeScript
"use server";
|
|
|
|
import { revalidatePath } from "next/cache";
|
|
import { z } from "zod";
|
|
import { pbCreate, pbDelete, pbUpdate } from "@/lib/pocketbase";
|
|
import { getAuth } from "@/lib/auth";
|
|
import { pbId } from "@/lib/pb";
|
|
|
|
const purchaseSchema = z.object({
|
|
supplier: z.string().min(1, "Supplier is required"),
|
|
purchase_qty: z.coerce.number().positive("Qty must be > 0"),
|
|
purchase_price: z.coerce.number().positive("Price must be > 0"),
|
|
purchase_date: z.string().min(1, "Date is required"),
|
|
});
|
|
|
|
export type ActionResult = { ok: true } | { ok: false; error: string };
|
|
|
|
export async function createFuelPurchase(_: unknown, formData: FormData): Promise<ActionResult> {
|
|
const { token } = await getAuth();
|
|
if (!token) return { ok: false, error: "Not signed in" };
|
|
const parsed = purchaseSchema.safeParse({
|
|
supplier: formData.get("supplier"),
|
|
purchase_qty: formData.get("purchase_qty"),
|
|
purchase_price: formData.get("purchase_price"),
|
|
purchase_date: formData.get("purchase_date"),
|
|
});
|
|
if (!parsed.success) return { ok: false, error: parsed.error.issues[0]?.message ?? "Invalid input" };
|
|
try {
|
|
await pbCreate("fuel_purchases", { id: pbId(), ...parsed.data }, token);
|
|
} catch (err: any) {
|
|
return { ok: false, error: err?.message || "Failed to create purchase" };
|
|
}
|
|
revalidatePath("/fuel-purchases");
|
|
return { ok: true };
|
|
}
|
|
|
|
export async function updateFuelPurchase(id: string, _: unknown, formData: FormData): Promise<ActionResult> {
|
|
const { token } = await getAuth();
|
|
if (!token) return { ok: false, error: "Not signed in" };
|
|
const parsed = purchaseSchema.safeParse({
|
|
supplier: formData.get("supplier"),
|
|
purchase_qty: formData.get("purchase_qty"),
|
|
purchase_price: formData.get("purchase_price"),
|
|
purchase_date: formData.get("purchase_date"),
|
|
});
|
|
if (!parsed.success) return { ok: false, error: parsed.error.issues[0]?.message ?? "Invalid input" };
|
|
try {
|
|
await pbUpdate("fuel_purchases", id, parsed.data, token);
|
|
} catch (err: any) {
|
|
return { ok: false, error: err?.message || "Failed to update" };
|
|
}
|
|
revalidatePath("/fuel-purchases");
|
|
revalidatePath(`/fuel-purchases/${id}`);
|
|
return { ok: true };
|
|
}
|
|
|
|
export async function deleteFuelPurchase(id: string): Promise<ActionResult> {
|
|
const { token } = await getAuth();
|
|
if (!token) return { ok: false, error: "Not signed in" };
|
|
try {
|
|
await pbDelete("fuel_purchases", id, token);
|
|
} catch (err: any) {
|
|
return { ok: false, error: err?.message || "Failed to delete" };
|
|
}
|
|
revalidatePath("/fuel-purchases");
|
|
return { ok: true };
|
|
}
|