RJBULK-APP/actions/fuel-purchases.ts
SJCoetz 1efa979443 feat: initial setup of rj bulk supplies backoffice app
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
2026-07-19 20:38:16 +02:00

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 };
}