summaryrefslogtreecommitdiff
path: root/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx
diff options
context:
space:
mode:
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.tsx89
1 files changed, 82 insertions, 7 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 f2c23de9..c1d59677 100644
--- a/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx
+++ b/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx
@@ -6,7 +6,7 @@ import { useTransition } from "react"
import { Button } from "@/components/ui/button"
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"
import { Plus, Send, RotateCcw, XCircle, Trophy, FileText, DollarSign, RotateCw } from "lucide-react"
-import { registerBidding, markAsDisposal, createRebidding } from "@/lib/bidding/detail/service"
+import { registerBidding, markAsDisposal, createRebidding, cancelAwardRatio } from "@/lib/bidding/detail/service"
import { sendBiddingBasicContracts, getSelectedVendorsForBidding } from "@/lib/bidding/pre-quote/service"
import { increaseRoundOrRebid } from "@/lib/bidding/service"
@@ -14,6 +14,7 @@ import { BiddingDetailVendorCreateDialog } from "../../../../components/bidding/
import { BiddingDocumentUploadDialog } from "./bidding-document-upload-dialog"
import { Bidding } from "@/db/schema"
import { useToast } from "@/hooks/use-toast"
+import { QuotationVendor } from "@/lib/bidding/detail/service"
interface BiddingDetailVendorToolbarActionsProps {
biddingId: number
@@ -21,6 +22,7 @@ interface BiddingDetailVendorToolbarActionsProps {
userId: string
onOpenAwardDialog: () => void
onSuccess: () => void
+ winnerVendor?: QuotationVendor | null // 100% 낙찰된 벤더
}
export function BiddingDetailVendorToolbarActions({
@@ -28,7 +30,8 @@ export function BiddingDetailVendorToolbarActions({
bidding,
userId,
onOpenAwardDialog,
- onSuccess
+ onSuccess,
+ winnerVendor
}: BiddingDetailVendorToolbarActionsProps) {
const router = useRouter()
const { toast } = useToast()
@@ -39,6 +42,7 @@ export function BiddingDetailVendorToolbarActions({
const [isBiddingInvitationDialogOpen, setIsBiddingInvitationDialogOpen] = React.useState(false)
const [selectedVendors, setSelectedVendors] = React.useState<any[]>([])
const [isRoundIncreaseDialogOpen, setIsRoundIncreaseDialogOpen] = React.useState(false)
+ const [isCancelAwardDialogOpen, setIsCancelAwardDialogOpen] = React.useState(false)
// 본입찰 초대 다이얼로그가 열릴 때 선정된 업체들 조회
React.useEffect(() => {
@@ -178,26 +182,51 @@ export function BiddingDetailVendorToolbarActions({
})
}
+ const handleCancelAward = () => {
+ if (!winnerVendor) return
+
+ startTransition(async () => {
+ const result = await cancelAwardRatio(winnerVendor.id)
+
+ if (result.success) {
+ toast({
+ title: "성공",
+ description: result.message,
+ })
+ setIsCancelAwardDialogOpen(false)
+ onSuccess()
+ } else {
+ toast({
+ title: "오류",
+ description: result.error || "발주비율 취소 중 오류가 발생했습니다.",
+ variant: 'destructive',
+ })
+ }
+ })
+ }
+
const handleRoundIncreaseWithNavigation = () => {
startTransition(async () => {
const result = await increaseRoundOrRebid(bidding.id, userId, 'round_increase')
if (result.success) {
+ const successResult = result as { success: true; message: string; biddingId: number; biddingNumber: string }
toast({
title: "성공",
- description: result.message,
+ description: successResult.message,
})
// 새로 생성된 입찰의 상세 페이지로 이동
- if (result.biddingId) {
- router.push(`/evcp/bid/${result.biddingId}`)
+ if (successResult.biddingId) {
+ router.push(`/evcp/bid/${successResult.biddingId}/info`)
} else {
- router.push(`/evcp/bid`)
+ router.push(`/evcp/bid/${biddingId}/info`)
}
onSuccess()
} else {
+ const errorResult = result as { success: false; error: string }
toast({
title: "오류",
- description: result.error || "차수증가 중 오류가 발생했습니다.",
+ description: errorResult.error || "차수증가 중 오류가 발생했습니다.",
variant: 'destructive',
})
}
@@ -244,6 +273,19 @@ export function BiddingDetailVendorToolbarActions({
</Button>
</>
)}
+
+ {/* 발주비율 취소: 100% 낙찰된 벤더가 있는 경우 */}
+ {winnerVendor && (
+ <Button
+ variant="outline"
+ size="sm"
+ onClick={() => setIsCancelAwardDialogOpen(true)}
+ disabled={isPending}
+ >
+ <RotateCcw className="mr-2 h-4 w-4" />
+ 발주비율 취소
+ </Button>
+ )}
{/* 구분선 */}
{(bidding.status === 'bidding_generated' ||
bidding.status === 'bidding_disposal') && (
@@ -307,6 +349,39 @@ export function BiddingDetailVendorToolbarActions({
</DialogContent>
</Dialog>
+ {/* 발주비율 취소 확인 다이얼로그 */}
+ <Dialog open={isCancelAwardDialogOpen} onOpenChange={setIsCancelAwardDialogOpen}>
+ <DialogContent>
+ <DialogHeader>
+ <DialogTitle>발주비율 취소 확인</DialogTitle>
+ <DialogDescription>
+ {winnerVendor && (
+ <>
+ <strong>{winnerVendor.vendorName}</strong> 업체의 발주비율(100%)을 취소하시겠습니까?
+ <br />
+ 취소 후 다른 업체의 발주비율을 설정할 수 있습니다.
+ </>
+ )}
+ </DialogDescription>
+ </DialogHeader>
+ <DialogFooter>
+ <Button
+ variant="outline"
+ onClick={() => setIsCancelAwardDialogOpen(false)}
+ >
+ 아니오
+ </Button>
+ <Button
+ variant="destructive"
+ onClick={handleCancelAward}
+ disabled={isPending}
+ >
+ 취소하기
+ </Button>
+ </DialogFooter>
+ </DialogContent>
+ </Dialog>
+
</>
)
}