import { Form, Head, Link } from '@inertiajs/react'; import { ArrowLeft, Plus, Trash2 } from 'lucide-react'; import { useCallback, useState } from 'react'; import { toast } from 'sonner'; import { ConfirmDialog } from '@/components/dialogs'; import { DatePicker, PhoneNumberInput } from '@/components/inputs'; import { RupiahInput } from '@/components/inputs'; import { InputError } from '@/components/ui'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Textarea } from '@/components/ui/textarea'; import { formatCurrency } from '@/lib/utils'; import { index as invoiceIndex, store } from '@/routes/admin/manage/invoices'; type ItemRow = { name: string; quantity: string; price: number; }; function toDateInputValue(date: Date | undefined) { return date ? date.toISOString().split('T')[0] : ''; } function emptyItem(): ItemRow { return { name: '', quantity: '1', price: 0 }; } type Props = { statusOptions: { value: string; label: string }[]; }; export default function InvoiceCreate({ statusOptions }: Props) { const [invoiceNumber, setInvoiceNumber] = useState(''); const [customerName, setCustomerName] = useState(''); const [date, setDate] = useState(new Date()); const [dueDate, setDueDate] = useState(undefined); const [status, setStatus] = useState('unpaid'); const [description, setDescription] = useState(''); const [items, setItems] = useState([emptyItem()]); const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false); const [deleteItemIndex, setDeleteItemIndex] = useState( null, ); const addItem = useCallback(() => { setItems((prev) => [...prev, emptyItem()]); }, []); const removeItem = useCallback((index: number) => { setItems((prev) => prev.filter((_, i) => i !== index)); }, []); const confirmRemoveItem = useCallback( (index: number) => { if (items.length <= 1) { removeItem(index); return; } setDeleteItemIndex(index); setDeleteConfirmOpen(true); }, [items.length, removeItem], ); const updateItem = useCallback( (index: number, field: keyof ItemRow, value: string | number) => { setItems((prev) => { const updated = [...prev]; (updated[index] as Record)[field] = value; return updated; }); }, [], ); const total = items.reduce( (sum, item) => sum + (parseInt(item.quantity, 10) || 0) * item.price, 0, ); function getPayload() { return { invoice_number: invoiceNumber, customer_name: customerName, date: toDateInputValue(date), due_date: dueDate ? toDateInputValue(dueDate) : null, status, description: description || null, items: items.map((item) => ({ name: item.name, quantity: parseInt(item.quantity, 10) || 0, price: item.price, })), }; } return ( <>

Tambah Invoice

({ ...data, ...getPayload(), })} onError={() => { toast.error( 'Ada data yang belum sesuai, silakan periksa kembali input Anda.', ); }} > {({ errors, processing }) => (
Informasi Invoice
setInvoiceNumber( e.target.value, ) } placeholder="Masukkan nomor invoice" />
setCustomerName( e.target.value, ) } placeholder="Masukkan nama pelanggan" />