import { Head, useForm } from '@inertiajs/react'; import { useMemo } from 'react'; import AppLayout from '@/layouts/app-layout'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label';
import { CrmSelect } from '@/components/crm-select';
import { Textarea } from '@/components/ui/textarea';
type P={id:number;sku:string;name:string;unit:string;price:string|number;stock:number}; type Props={customers:{id:number;name:string}[];sales:{id:number;name:string}[];products:P[];visitId:number|null};
type Item={product_id:string;qty:string;unit_price:string;discount_amount:string};
export default function Create({customers,sales,products,visitId}:Props){const f=useForm<{customer_id:string;sales_id:string;visit_id:string;order_date:string;discount_total:string;tax_total:string;notes:string;items:Item[]}>({customer_id:'',sales_id:'',visit_id:visitId?String(visitId):'',order_date:new Date().toISOString().slice(0,10),discount_total:'0',tax_total:'0',notes:'',items:[{product_id:'',qty:'1',unit_price:'0',discount_amount:'0'}]}); const subtotal=useMemo(()=>f.data.items.reduce((s,i)=>s+(Number(i.qty)||0)*(Number(i.unit_price)||0)-(Number(i.discount_amount)||0),0),[f.data.items]); const total=Math.max(0,subtotal-(Number(f.data.discount_total)||0)+(Number(f.data.tax_total)||0)); const setItem=(idx:number,key:keyof Item,val:string)=>f.setData('items',f.data.items.map((it,i)=>i===idx?{...it,[key]:val}:it)); const chooseProduct=(idx:number,id:string)=>{const p=products.find(x=>String(x.id)===id);f.setData('items',f.data.items.map((it,i)=>i===idx?{...it,product_id:id,unit_price:p?String(p.price):'0'}:it));}; const submit=(e:any)=>{e.preventDefault();f.post('/crm/orders')};return <AppLayout breadcrumbs={[{title:'Orders',href:'/crm/orders'},{title:'Buat Order',href:'/crm/orders/create'}]}><Head title="Buat Order"/><div className="space-y-5 p-6"><div><h1 className="text-2xl font-semibold">Buat Order</h1><p className="text-sm text-muted-foreground">Harga dapat disesuaikan per item sesuai kesepakatan customer.</p></div><form onSubmit={submit} className="space-y-5"><div className="grid gap-4 rounded-xl border p-5 md:grid-cols-4"><div><Label>Customer</Label><CrmSelect className="mt-1 w-full rounded-md border bg-background px-3 py-2" value={f.data.customer_id} onChange={e=>f.setData('customer_id',e.target.value)}><option value="">- Pilih -</option>{customers.map(c=><option key={c.id} value={c.id}>{c.name}</option>)}</CrmSelect></div><div><Label>Sales</Label><CrmSelect className="mt-1 w-full rounded-md border bg-background px-3 py-2" value={f.data.sales_id} onChange={e=>f.setData('sales_id',e.target.value)}><option value="">- Pilih -</option>{sales.map(s=><option key={s.id} value={s.id}>{s.name}</option>)}</CrmSelect></div><div><Label>Tanggal</Label><Input type="date" value={f.data.order_date} onChange={e=>f.setData('order_date',e.target.value)}/></div><div><Label>Visit ID</Label><Input value={f.data.visit_id} onChange={e=>f.setData('visit_id',e.target.value)} placeholder="opsional"/></div></div><div className="space-y-3 rounded-xl border p-5"><div className="flex items-center justify-between"><h2 className="font-medium">Item Order</h2><Button type="button" variant="outline" onClick={()=>f.setData('items',[...f.data.items,{product_id:'',qty:'1',unit_price:'0',discount_amount:'0'}])}>Tambah Item</Button></div>{f.data.items.map((it,idx)=><div key={idx} className="grid gap-2 md:grid-cols-[2fr_100px_160px_160px_90px]"><CrmSelect className="rounded-md border bg-background px-3 py-2" value={it.product_id} onChange={e=>chooseProduct(idx,e.target.value)}><option value="">- Produk -</option>{products.map(p=><option key={p.id} value={p.id}>{p.sku} — {p.name} (stok {p.stock})</option>)}</CrmSelect><Input type="number" min="1" value={it.qty} onChange={e=>setItem(idx,'qty',e.target.value)}/><Input type="number" min="0" value={it.unit_price} onChange={e=>setItem(idx,'unit_price',e.target.value)}/><Input type="number" min="0" value={it.discount_amount} onChange={e=>setItem(idx,'discount_amount',e.target.value)}/><Button type="button" variant="ghost" disabled={f.data.items.length===1} onClick={()=>f.setData('items',f.data.items.filter((_,i)=>i!==idx))}>Hapus</Button></div>)}</div><div className="grid gap-5 lg:grid-cols-[1fr_360px]"><div className="rounded-xl border p-5"><Label>Catatan</Label><Textarea className="mt-1 min-h-28 w-full rounded-md border bg-background p-3" value={f.data.notes} onChange={e=>f.setData('notes',e.target.value)}/></div><div className="space-y-3 rounded-xl border p-5"><div className="flex justify-between"><span>Subtotal</span><b>Rp {subtotal.toLocaleString('id-ID')}</b></div><div><Label>Diskon Order</Label><Input type="number" value={f.data.discount_total} onChange={e=>f.setData('discount_total',e.target.value)}/></div><div><Label>Pajak</Label><Input type="number" value={f.data.tax_total} onChange={e=>f.setData('tax_total',e.target.value)}/></div><div className="flex justify-between border-t pt-3 text-lg"><span>Total</span><b>Rp {total.toLocaleString('id-ID')}</b></div><Button className="w-full" disabled={f.processing}>Simpan Order</Button></div></div></form></div></AppLayout>}
