/** * 採購單表單管理 Hook */ import { useState, useEffect } from "react"; import type { PurchaseOrder, PurchaseOrderItem, Supplier, PurchaseOrderStatus } from "@/types/purchase-order"; import { calculateSubtotal } from "@/utils/purchase-order"; interface UsePurchaseOrderFormProps { order?: PurchaseOrder; suppliers: Supplier[]; } export function usePurchaseOrderForm({ order, suppliers }: UsePurchaseOrderFormProps) { const [supplierId, setSupplierId] = useState(""); const [expectedDate, setExpectedDate] = useState(""); const [items, setItems] = useState([]); const [notes, setNotes] = useState(""); const [status, setStatus] = useState("draft"); const [warehouseId, setWarehouseId] = useState(""); // 載入編輯訂單資料 useEffect(() => { if (order) { setSupplierId(order.supplierId); setExpectedDate(order.expectedDate); setItems(order.items); setNotes(order.remark || ""); setStatus(order.status); setWarehouseId(order.warehouse_id || ""); } }, [order]); const resetForm = () => { setSupplierId(""); setExpectedDate(""); setItems([]); setNotes(""); setStatus("draft"); setWarehouseId(""); }; const selectedSupplier = suppliers.find((s) => String(s.id) === String(supplierId)); const isOrderSent = order && order.status !== "draft"; // 新增商品項目 const addItem = () => { if (!selectedSupplier) return; setItems([ ...items, { productId: "", productName: "", quantity: 1, unitPrice: 0, subtotal: 0, selectedUnit: "base", }, ]); }; // 移除商品項目 const removeItem = (index: number) => { setItems(items.filter((_, i) => i !== index)); }; // 更新商品項目 const updateItem = (index: number, field: keyof PurchaseOrderItem, value: any) => { const newItems = [...items]; const item = { ...newItems[index] }; if (field === "productId" && selectedSupplier) { // value is productId string const product = selectedSupplier.commonProducts.find((p) => p.productId === value); if (product) { // @ts-ignore item.productId = value; item.productName = product.productName; item.base_unit_id = product.base_unit_id; item.base_unit_name = product.base_unit_name; item.large_unit_id = product.large_unit_id; item.large_unit_name = product.large_unit_name; item.purchase_unit_id = product.purchase_unit_id; item.conversion_rate = product.conversion_rate; item.unitPrice = product.lastPrice; item.previousPrice = product.lastPrice; // 決定預設單位 // 若有採購單位且等於大單位,預設為大單位 const isPurchaseUnitLarge = product.purchase_unit_id && product.large_unit_id && product.purchase_unit_id === product.large_unit_id; if (isPurchaseUnitLarge) { item.selectedUnit = 'large'; item.unitId = product.large_unit_id; } else { item.selectedUnit = 'base'; item.unitId = product.base_unit_id; } } } else if (field === "selectedUnit") { // @ts-ignore item.selectedUnit = value; if (value === 'large') { item.unitId = item.large_unit_id; } else { item.unitId = item.base_unit_id; } } else { // @ts-ignore item[field] = value; } // 計算小計 if (field === "quantity" || field === "unitPrice" || field === "productId") { item.subtotal = calculateSubtotal( Number(item.quantity), Number(item.unitPrice) ); } newItems[index] = item; setItems(newItems); }; return { // State supplierId, expectedDate, items, notes, status, selectedSupplier, isOrderSent, warehouseId, // Setters setSupplierId, setExpectedDate, setNotes, setStatus, setWarehouseId, // Methods addItem, removeItem, updateItem, resetForm, }; }