import React, { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { toast } from 'react-hot-toast'; import InfoCard from './InfoCard'; import Tooltip from './Tooltip'; import { tooltips, infoNotes } from './tooltips'; import { Icon } from '@iconify/react'; export interface InvoiceItem { quantity: number; item_name: string; unit_cost: number; } interface InvoiceData { items: InvoiceItem[]; tax: number; tip: number; total: number; vendor: string; } export interface ASFundingSectionProps { onDataChange?: (data: any) => void; onItemizedItemsUpdate?: (items: InvoiceItem[]) => void; } const ASFundingSection: React.FC = ({ onDataChange, onItemizedItemsUpdate }) => { const [invoiceData, setInvoiceData] = useState({ items: [{ quantity: 1, item_name: '', unit_cost: 0 }], tax: 0, tip: 0, total: 0, vendor: '' }); const handleItemChange = (index: number, field: keyof InvoiceItem, value: string | number) => { const newItems = [...invoiceData.items]; newItems[index] = { ...newItems[index], [field]: value }; // Calculate new total const itemsTotal = newItems.reduce((sum, item) => sum + (item.quantity * item.unit_cost), 0); const newTotal = itemsTotal + (invoiceData.tax || 0) + (invoiceData.tip || 0); const newInvoiceData = { ...invoiceData, items: newItems, total: newTotal }; setInvoiceData(newInvoiceData); // Send the entire invoice data object onDataChange?.({ itemized_invoice: newInvoiceData, total_amount: newTotal }); // Update parent with itemized items and invoice data onItemizedItemsUpdate?.(newItems); document.querySelector('input[name="itemized_invoice"]')?.setAttribute('value', JSON.stringify(newInvoiceData)); }; const addItem = () => { const newItems = [...invoiceData.items, { quantity: 1, item_name: '', unit_cost: 0 }]; const itemsTotal = newItems.reduce((sum, item) => sum + (item.quantity * item.unit_cost), 0); const newTotal = itemsTotal + (invoiceData.tax || 0) + (invoiceData.tip || 0); const newInvoiceData = { ...invoiceData, items: newItems, total: newTotal }; setInvoiceData(newInvoiceData); onDataChange?.({ itemized_invoice: newInvoiceData, total_amount: newTotal }); onItemizedItemsUpdate?.(newItems); document.querySelector('input[name="itemized_invoice"]')?.setAttribute('value', JSON.stringify(newInvoiceData)); toast('New item added'); }; const removeItem = (index: number) => { if (invoiceData.items.length > 1) { const newItems = invoiceData.items.filter((_, i) => i !== index); const itemsTotal = newItems.reduce((sum, item) => sum + (item.quantity * item.unit_cost), 0); const newTotal = itemsTotal + (invoiceData.tax || 0) + (invoiceData.tip || 0); const newInvoiceData = { ...invoiceData, items: newItems, total: newTotal }; setInvoiceData(newInvoiceData); onDataChange?.({ itemized_invoice: newInvoiceData, total_amount: newTotal }); onItemizedItemsUpdate?.(newItems); document.querySelector('input[name="itemized_invoice"]')?.setAttribute('value', JSON.stringify(newInvoiceData)); toast('Item removed'); } }; const handleExtraChange = (field: 'tax' | 'tip' | 'vendor', value: string | number) => { const numValue = field !== 'vendor' ? Number(value) : value; const itemsTotal = invoiceData.items.reduce((sum, item) => sum + (item.quantity * item.unit_cost), 0); const newTotal = field === 'tax' ? itemsTotal + Number(value) + (invoiceData.tip || 0) : field === 'tip' ? itemsTotal + (invoiceData.tax || 0) + Number(value) : itemsTotal + (invoiceData.tax || 0) + (invoiceData.tip || 0); const newInvoiceData = { ...invoiceData, [field]: numValue, total: field !== 'vendor' ? newTotal : invoiceData.total }; setInvoiceData(newInvoiceData); onDataChange?.({ itemized_invoice: newInvoiceData, total_amount: newTotal }); document.querySelector('input[name="itemized_invoice"]')?.setAttribute('value', JSON.stringify(newInvoiceData)); }; const handleFileUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { onDataChange?.({ invoice: file }); toast('Invoice file uploaded'); } }; return (
AS Funding Details
handleExtraChange('vendor', e.target.value)} required />
{invoiceData.items.map((item, index) => (
handleItemChange(index, 'quantity', Number(e.target.value))} required />
handleItemChange(index, 'item_name', e.target.value)} required />
handleItemChange(index, 'unit_cost', Number(e.target.value))} required />
$
removeItem(index)} disabled={invoiceData.items.length === 1} >
))}
Add Item
handleExtraChange('tax', Number(e.target.value))} required />
$
handleExtraChange('tip', Number(e.target.value))} required />
$
$
); }; export default ASFundingSection;