'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 { toast } from 'sonner'; import { documentNumberingService } from '@/lib/services/document-numbering.service'; import { ManualOverrideDto } from '@/types/dto/numbering.dto'; import { useState } from 'react'; const formSchema = z.object({ projectId: z.coerce.number().min(1, 'Project is required'), originatorOrganizationId: z.coerce.number().min(1, 'Originator is required'), recipientOrganizationId: z.coerce.number().min(1, 'Recipient is required'), correspondenceTypeId: z.coerce.number().min(1, 'Type is required'), newLastNumber: z.coerce.number().min(1, 'New number is required'), reason: z.string().min(5, 'Reason must be at least 5 characters'), resetScope: z.string().optional(), }); export function ManualOverrideForm({ projectId = 1 }: { projectId?: number | string }) { const [loading, setLoading] = useState(false); const form = useForm>({ resolver: zodResolver(formSchema) as any, // eslint-disable-line @typescript-eslint/no-explicit-any -- zod 4 + @hookform/resolvers compat defaultValues: { projectId: Number(projectId), originatorOrganizationId: 0, recipientOrganizationId: 0, correspondenceTypeId: 0, newLastNumber: 0, reason: '', resetScope: 'YEAR_2025', // Example, should be dynamic or selected }, }); async function onSubmit(values: z.infer) { setLoading(true); try { const dto: ManualOverrideDto = { ...values, resetScope: values.resetScope || 'YEAR_' + new Date().getFullYear(), }; await documentNumberingService.manualOverride(dto); toast.success('Manual override applied successfully.'); form.reset(); } catch (_error) { toast.error('Failed to apply override.'); } finally { setLoading(false); } } return (

Manual Override Sequence

Careful: This updates the LAST generated number. Next number will receive +1.

{/* Allow simple text input for IDs for now, ideally Selects from Master Data */} ( Project ID )} /> ( Type ID )} /> ( Originator Org ID )} /> ( Recipient Org ID )} />
( Set Last Number To If you set 99, the next auto-generated number will be 100. )} /> ( Reason )} /> ); }