import React, { useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Import, Download, FileText } from 'lucide-react'; import { IndBillitemRecord } from '@/lib/pbtypes'; import { IndJob } from '@/lib/types'; import { addBillItem } from '@/services/billItemService'; import { updateJob } from '@/services/jobService'; interface MaterialsImportExportProps { job: IndJob; billOfMaterials: IndBillitemRecord[]; consumedMaterials: IndBillitemRecord[]; onBillOfMaterialsUpdate: (billItems: IndBillitemRecord[]) => void; onConsumedMaterialsUpdate: (billItems: IndBillitemRecord[]) => void; } const MaterialsImportExport: React.FC = ({ job, billOfMaterials, consumedMaterials, onBillOfMaterialsUpdate, onConsumedMaterialsUpdate }) => { const [bomInput, setBomInput] = useState(''); const [consumedInput, setConsumedInput] = useState(''); const parseBillOfMaterials = async (text: string): Promise => { const lines = text.split('\n').filter(line => line.trim()); const materials: IndBillitemRecord[] = []; for (const line of lines) { const parts = line.trim().split(/\s+/); if (parts.length >= 2) { const name = parts.slice(0, -1).join(' '); const quantity = parseInt(parts[parts.length - 1]); if (name && !isNaN(quantity)) { const newBillItem = await addBillItem(job.id, { name, quantity }); materials.push(newBillItem); } } } job.billOfMaterials = materials; await updateJob(job.id, { billOfMaterials: materials.map(item => item.id) }); return job; }; const parseConsumedMaterials = async (text: string): Promise => { const lines = text.split('\n').filter(line => line.trim()); const materials: IndBillitemRecord[] = []; for (const line of lines) { const parts = line.trim().split('\t'); if (parts.length >= 2) { const name = parts[0]; const quantity = parseInt(parts[1]); if (name && !isNaN(quantity)) { const newBillItem = await addBillItem(job.id, { name, quantity }); materials.push(newBillItem); } } } job.consumedMaterials = materials; await updateJob(job.id, { consumedMaterials: materials.map(item => item.id) }); return job; }; const exportBillOfMaterials = (): string => { return billOfMaterials.map(item => `${item.name} ${item.quantity}`).join('\n'); }; const exportConsumedMaterials = (): string => { return consumedMaterials.map(item => `${item.name}\t${item.quantity}`).join('\n'); }; const handleImportBom = async () => { const parsed = await parseBillOfMaterials(bomInput); onBillOfMaterialsUpdate(parsed.billOfMaterials); setBomInput(''); }; const handleImportConsumed = async () => { const parsed = await parseConsumedMaterials(consumedInput); onConsumedMaterialsUpdate(parsed.consumedMaterials); setConsumedInput(''); }; const handleExportBom = () => { const exported = exportBillOfMaterials(); navigator.clipboard.writeText(exported); }; const handleExportConsumed = () => { const exported = exportConsumedMaterials(); navigator.clipboard.writeText(exported); }; return ( Materials Management