summaryrefslogtreecommitdiff
path: root/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-09-03 10:35:57 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-09-03 10:35:57 +0000
commita2bc455f654e011c53968b0d3a14389d7259847e (patch)
tree6ff60b8ef0880aaa4cf2c9d4f234772fb0a74537 /lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx
parentbfe354f7633f62350e61eb784cbf1926079339d1 (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.tsx152
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"