"use client"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Checkbox } from "@/components/ui/checkbox"; import { toast } from "sonner"; import { documentNumberingService } from "@/lib/services/document-numbering.service"; import { VoidReplaceDto } from "@/types/dto/numbering.dto"; import { useState } from "react"; const formSchema = z.object({ documentNumber: z.string().min(3, "Document Number is required"), reason: z.string().min(5, "Reason must be at least 5 characters"), replace: z.boolean(), projectId: z.number() }); type VoidReplaceFormData = z.infer; export function VoidReplaceForm({ projectId = 1 }: { projectId?: number }) { const [loading, setLoading] = useState(false); const form = useForm({ resolver: zodResolver(formSchema) as any, defaultValues: { documentNumber: "", reason: "", replace: false, projectId: projectId }, }); async function onSubmit(values: z.infer) { setLoading(true); try { const dto: VoidReplaceDto = { ...values, }; await documentNumberingService.voidAndReplace(dto); toast.success("Number voided successfully. " + (values.replace ? "Replacement generated." : "")); form.reset(); } catch (error) { toast.error("Failed to void number. Check if it exists."); console.error(error); } finally { setLoading(false); } } return (

Void & Replace Number

Void a generated number. Useful for skipped numbers or errors.

( Document Number )} /> ( Reason )} /> (
Generate Replacement? If checked, a new number will be reserved immediately.
)} /> ); }