import { useState } from 'react'; import { Button, Divider, FileInput, Group, Modal, NumberInput, Select, Switch, Textarea, } from '@mantine/core'; import { Upload } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; import { useCreateInspectionReport, useUploadInspectionAttachments } from '@/hooks/useWarehouses'; import { INSPECTION_REPORT_TYPES, INSPECTION_STATUSES, type InspectionReportType, type InspectionResultStatus, } from '@/types/warehouse'; import { extractErrorMessage } from './options'; interface InspectionReportModalProps { opened: boolean; onClose: () => void; inventoryId: string | null; } const REPORT_TYPE_LABELS: Record = { INSPECTION: 'Inspection', DAMAGE: 'Damage', WEIGHT_LOSS: 'Weight loss', MISSING_ITEM: 'Missing item', GENERAL: 'General', }; const STATUS_LABELS: Record = { PASSED: 'Passed', FAILED: 'Failed', NEEDS_REVIEW: 'Needs review', }; /** Batch 4.5 — record an inspection / damage report with optional image upload. */ export function InspectionReportModal({ opened, onClose, inventoryId }: InspectionReportModalProps) { const { toast } = useToast(); const createReport = useCreateInspectionReport(); const uploadAttachments = useUploadInspectionAttachments(); const [reportType, setReportType] = useState('INSPECTION'); const [inspectionStatus, setInspectionStatus] = useState('PASSED'); const [hasDamage, setHasDamage] = useState(false); const [damageDescription, setDamageDescription] = useState(''); const [hasWeightLoss, setHasWeightLoss] = useState(false); const [expectedWeight, setExpectedWeight] = useState(''); const [actualWeight, setActualWeight] = useState(''); const [hasMissingItems, setHasMissingItems] = useState(false); const [missingItemsDescription, setMissingItemsDescription] = useState(''); const [remarks, setRemarks] = useState(''); const [files, setFiles] = useState([]); const submitting = createReport.isPending || uploadAttachments.isPending; const reset = () => { setReportType('INSPECTION'); setInspectionStatus('PASSED'); setHasDamage(false); setDamageDescription(''); setHasWeightLoss(false); setExpectedWeight(''); setActualWeight(''); setHasMissingItems(false); setMissingItemsDescription(''); setRemarks(''); setFiles([]); }; const handleSubmit = async () => { if (!inventoryId) return; try { const report = await createReport.mutateAsync({ inventoryId, payload: { reportType, inspectionStatus, hasDamage, damageDescription: damageDescription.trim() || undefined, hasWeightLoss, expectedWeight: expectedWeight === '' ? undefined : Number(expectedWeight), actualWeight: actualWeight === '' ? undefined : Number(actualWeight), hasMissingItems, missingItemsDescription: missingItemsDescription.trim() || undefined, remarks: remarks.trim() || undefined, }, }); if (files.length > 0) { await uploadAttachments.mutateAsync({ reportId: report.id, files }); } toast({ title: 'Inspection report saved' }); reset(); onClose(); } catch (error) { toast({ variant: 'destructive', title: 'Save failed', description: extractErrorMessage(error) }); } }; return ( ({ value: s, label: STATUS_LABELS[s] }))} value={inspectionStatus} onChange={(v) => setInspectionStatus((v as InspectionResultStatus) ?? 'PASSED')} allowDeselect={false} /> setHasDamage(e.currentTarget.checked)} color="orange" /> {hasDamage && (