import { useState, useEffect } from "react"; import AuthenticatedLayout from "@/Layouts/AuthenticatedLayout"; import { Head, router, usePage, Link } from "@inertiajs/react"; import { Button } from "@/Components/ui/button"; import { Input } from "@/Components/ui/input"; import { Label } from "@/Components/ui/label"; import { Textarea } from "@/Components/ui/textarea"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/Components/ui/table"; import { Badge } from "@/Components/ui/badge"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, DialogFooter, } from "@/Components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/Components/ui/select"; import { Plus, Save, Trash2, ArrowLeft, CheckCircle, Ban, History, Package } from "lucide-react"; import { toast } from "sonner"; import axios from "axios"; export default function Show({ auth, order }) { const [items, setItems] = useState(order.items || []); const [remarks, setRemarks] = useState(order.remarks || ""); const [isSaving, setIsSaving] = useState(false); // Product Selection const [isProductDialogOpen, setIsProductDialogOpen] = useState(false); const [availableInventory, setAvailableInventory] = useState([]); const [loadingInventory, setLoadingInventory] = useState(false); useEffect(() => { if (isProductDialogOpen) { loadInventory(); } }, [isProductDialogOpen]); const loadInventory = async () => { setLoadingInventory(true); try { // Fetch inventory from SOURCE warehouse const response = await axios.get(route('api.warehouses.inventories', order.from_warehouse_id)); setAvailableInventory(response.data); } catch (error) { console.error("Failed to load inventory", error); toast.error("無法載入庫存資料"); } finally { setLoadingInventory(false); } }; const handleAddItem = (inventoryItem) => { // Check if already added const exists = items.find(i => i.product_id === inventoryItem.product_id && i.batch_number === inventoryItem.batch_number ); if (exists) { toast.error("該商品與批號已在列表中"); return; } setItems([...items, { product_id: inventoryItem.product_id, product_name: inventoryItem.product_name, product_code: inventoryItem.product_code, batch_number: inventoryItem.batch_number, unit: inventoryItem.unit_name, quantity: 1, // Default 1 max_quantity: inventoryItem.quantity, // Max available notes: "", }]); setIsProductDialogOpen(false); }; const handleUpdateItem = (index, field, value) => { const newItems = [...items]; newItems[index][field] = value; setItems(newItems); }; const handleRemoveItem = (index) => { const newItems = items.filter((_, i) => i !== index); setItems(newItems); }; const handleSave = async () => { setIsSaving(true); try { await router.put(route('inventory.transfer.update', [order.id]), { items: items, remarks: remarks, }, { onSuccess: () => toast.success("儲存成功"), onError: () => toast.error("儲存失敗,請檢查輸入"), }); } finally { setIsSaving(false); } }; const handlePost = () => { if (!confirm("確定要過帳嗎?過帳後庫存將立即轉移且無法修改。")) return; router.put(route('inventory.transfer.update', [order.id]), { action: 'post' }); }; const handleDelete = () => { if (!confirm("確定要刪除此草稿嗎?")) return; router.delete(route('inventory.transfer.destroy', [order.id])); }; const isReadOnly = order.status !== 'draft'; return (

調撥單詳情 ({order.doc_no})

{!isReadOnly && ( <> )}
{/* Header Info */}
{order.from_warehouse_name}
{order.to_warehouse_name}
{order.status === 'draft' && 草稿} {order.status === 'completed' && 已完成} {order.status === 'voided' && 已作廢}
{isReadOnly ? (
{order.remarks || '-'}
) : ( setRemarks(e.target.value)} className="mt-1" placeholder="填寫備註..." /> )}
{/* Items */}

調撥明細

{!isReadOnly && ( 選擇來源庫存 ({order.from_warehouse_name})
{loadingInventory ? (
載入中...
) : ( 商品代號 品名 批號 現有庫存 {availableInventory.map((inv) => ( {inv.product_code} {inv.product_name} {inv.batch_number || '-'} {inv.quantity} {inv.unit_name} ))}
)}
)}
# 商品 批號 調撥數量 單位 備註 {!isReadOnly && } {items.length === 0 ? ( 尚未加入商品 ) : ( items.map((item, index) => ( {index + 1}
{item.product_name}
{item.product_code}
{item.batch_number || '-'} {isReadOnly ? ( item.quantity ) : (
handleUpdateItem(index, 'quantity', e.target.value)} /> {item.max_quantity && ( 上限: {item.max_quantity} )}
)}
{item.unit} {isReadOnly ? ( item.notes ) : ( handleUpdateItem(index, 'notes', e.target.value)} placeholder="備註" /> )} {!isReadOnly && ( )}
)) )}
); }