diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-03 10:35:57 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-03 10:35:57 +0000 |
| commit | a2bc455f654e011c53968b0d3a14389d7259847e (patch) | |
| tree | 6ff60b8ef0880aaa4cf2c9d4f234772fb0a74537 /lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx | |
| parent | bfe354f7633f62350e61eb784cbf1926079339d1 (diff) | |
(최겸) 구매 입찰 개발(벤더 응찰 개발 및 기본계약 요청 개발 필)
Diffstat (limited to 'lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx')
| -rw-r--r-- | lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx | 152 |
1 files changed, 149 insertions, 3 deletions
diff --git a/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx b/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx index 00daa005..ca9ffc60 100644 --- a/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx +++ b/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx @@ -2,38 +2,184 @@ import * as React from "react" import { type Table } from "@tanstack/react-table" +import { useRouter } from "next/navigation" +import { useTransition } from "react" import { Button } from "@/components/ui/button" -import { Plus } from "lucide-react" -import { QuotationVendor } from "@/lib/bidding/detail/service" +import { Plus, Send, RotateCcw, XCircle } from "lucide-react" +import { QuotationVendor, registerBidding, markAsDisposal, createRebidding } from "@/lib/bidding/detail/service" import { BiddingDetailVendorCreateDialog } from "./bidding-detail-vendor-create-dialog" +import { Bidding } from "@/db/schema" +import { useToast } from "@/hooks/use-toast" interface BiddingDetailVendorToolbarActionsProps { table: Table<QuotationVendor> biddingId: number + bidding: Bidding onOpenItemsDialog: () => void onOpenTargetPriceDialog: () => void onOpenSelectionReasonDialog: () => void - onSuccess: () => void } export function BiddingDetailVendorToolbarActions({ table, biddingId, + bidding, onOpenItemsDialog, onOpenTargetPriceDialog, onOpenSelectionReasonDialog, onSuccess }: BiddingDetailVendorToolbarActionsProps) { + const router = useRouter() + const { toast } = useToast() + const [isPending, startTransition] = useTransition() const [isCreateDialogOpen, setIsCreateDialogOpen] = React.useState(false) const handleCreateVendor = () => { setIsCreateDialogOpen(true) } + const handleRegister = () => { + // 상태 검증 + if (bidding.status !== 'bidding_generated') { + toast({ + title: '실행 불가', + description: '입찰 등록은 입찰 생성 상태에서만 가능합니다.', + variant: 'destructive', + }) + return + } + + if (!confirm('입찰을 등록하시겠습니까?')) return + + startTransition(async () => { + const result = await registerBidding(bidding.id, 'current-user') // TODO: 실제 사용자 ID + + if (result.success) { + toast({ + title: '성공', + description: result.message, + }) + router.refresh() + } else { + toast({ + title: '오류', + description: result.error, + variant: 'destructive', + }) + } + }) + } + + const handleMarkAsDisposal = () => { + // 상태 검증 + if (bidding.status !== 'bidding_closed') { + toast({ + title: '실행 불가', + description: '유찰 처리는 입찰 마감 상태에서만 가능합니다.', + variant: 'destructive', + }) + return + } + + if (!confirm('입찰을 유찰 처리하시겠습니까?')) return + + startTransition(async () => { + const result = await markAsDisposal(bidding.id, 'current-user') // TODO: 실제 사용자 ID + + if (result.success) { + toast({ + title: '성공', + description: result.message, + }) + router.refresh() + } else { + toast({ + title: '오류', + description: result.error, + variant: 'destructive', + }) + } + }) + } + + const handleCreateRebidding = () => { + // 상태 검증 + if (bidding.status !== 'bidding_disposal') { + toast({ + title: '실행 불가', + description: '재입찰은 유찰 상태에서만 가능합니다.', + variant: 'destructive', + }) + return + } + + if (!confirm('재입찰을 생성하시겠습니까?')) return + + startTransition(async () => { + const result = await createRebidding(bidding.id, 'current-user') // TODO: 실제 사용자 ID + + if (result.success) { + toast({ + title: '성공', + description: result.message, + }) + if (result.data?.redirectTo) { + router.push(result.data.redirectTo) + } else { + router.refresh() + } + } else { + toast({ + title: '오류', + description: result.error, + variant: 'destructive', + }) + } + }) + } + return ( <> <div className="flex items-center gap-2"> + {/* 상태별 액션 버튼 */} + {/* {bidding.status === 'bidding_generated' && ( + <Button + variant="default" + size="sm" + onClick={handleRegister} + disabled={isPending} + > + <Send className="mr-2 h-4 w-4" /> + 입찰 등록 + </Button> + )} + + {bidding.status === 'bidding_closed' && ( + <Button + variant="destructive" + size="sm" + onClick={handleMarkAsDisposal} + disabled={isPending} + > + <XCircle className="mr-2 h-4 w-4" /> + 유찰 처리 + </Button> + )} + + {bidding.status === 'bidding_disposal' && ( + <Button + variant="outline" + size="sm" + onClick={handleCreateRebidding} + disabled={isPending} + > + <RotateCcw className="mr-2 h-4 w-4" /> + 재입찰 생성 + </Button> + )} */} + + {/* 기존 버튼들 */} <Button variant="outline" size="sm" |
