summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-10-14 08:35:00 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-10-14 08:35:00 +0000
commit5fe800c27ff8caabbb0ac64c5dab8062aac43684 (patch)
treec2326545a2c10144b2b8334c6cafae07c6328049 /lib
parent80ab33adc277904e71dcf8c08e59390600226075 (diff)
(최겸) 구매 입찰 status 별 중복 응답 제한 및 기타 요구사항 반영
Diffstat (limited to 'lib')
-rw-r--r--lib/bidding/detail/table/bidding-detail-vendor-columns.tsx11
-rw-r--r--lib/bidding/detail/table/bidding-detail-vendor-edit-dialog.tsx24
-rw-r--r--lib/bidding/detail/table/bidding-detail-vendor-table.tsx7
-rw-r--r--lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx5
-rw-r--r--lib/bidding/list/biddings-table-columns.tsx8
-rw-r--r--lib/bidding/vendor/partners-bidding-detail.tsx12
6 files changed, 52 insertions, 15 deletions
diff --git a/lib/bidding/detail/table/bidding-detail-vendor-columns.tsx b/lib/bidding/detail/table/bidding-detail-vendor-columns.tsx
index 782c5f7a..1de7c768 100644
--- a/lib/bidding/detail/table/bidding-detail-vendor-columns.tsx
+++ b/lib/bidding/detail/table/bidding-detail-vendor-columns.tsx
@@ -24,13 +24,15 @@ interface GetVendorColumnsProps {
onViewItemDetails?: (vendor: QuotationVendor) => void
onSendBidding?: (vendor: QuotationVendor) => void
onUpdateParticipation?: (vendor: QuotationVendor, participated: boolean) => void
+ biddingStatus?: string // 입찰 상태 정보 추가
}
export function getBiddingDetailVendorColumns({
onEdit,
onViewItemDetails,
onSendBidding,
- onUpdateParticipation
+ onUpdateParticipation,
+ biddingStatus
}: GetVendorColumnsProps): ColumnDef<QuotationVendor>[] {
return [
{
@@ -168,14 +170,17 @@ export function getBiddingDetailVendorColumns({
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuLabel>작업</DropdownMenuLabel>
- <DropdownMenuItem
+ <DropdownMenuItem
onClick={() => onEdit(vendor)}
- disabled={vendor.isBiddingParticipated !== true}
+ disabled={vendor.isBiddingParticipated !== true || biddingStatus === 'vendor_selected'}
>
발주비율 산정
{vendor.isBiddingParticipated !== true && (
<span className="text-xs text-muted-foreground ml-2">(입찰참여 필요)</span>
)}
+ {biddingStatus === 'vendor_selected' && (
+ <span className="text-xs text-muted-foreground ml-2">(낙찰 완료)</span>
+ )}
</DropdownMenuItem>
{/* 입찰 참여여부 관리 */}
diff --git a/lib/bidding/detail/table/bidding-detail-vendor-edit-dialog.tsx b/lib/bidding/detail/table/bidding-detail-vendor-edit-dialog.tsx
index f43e850a..1a1b331e 100644
--- a/lib/bidding/detail/table/bidding-detail-vendor-edit-dialog.tsx
+++ b/lib/bidding/detail/table/bidding-detail-vendor-edit-dialog.tsx
@@ -22,13 +22,17 @@ interface BiddingDetailVendorEditDialogProps {
open: boolean
onOpenChange: (open: boolean) => void
onSuccess: () => void
+ biddingAwardCount?: string // 낙찰수 정보 추가
+ biddingStatus?: string // 입찰 상태 정보 추가
}
export function BiddingDetailVendorEditDialog({
vendor,
open,
onOpenChange,
- onSuccess
+ onSuccess,
+ biddingAwardCount,
+ biddingStatus
}: BiddingDetailVendorEditDialogProps) {
const { toast } = useToast()
const [isPending, startTransition] = useTransition()
@@ -41,11 +45,13 @@ export function BiddingDetailVendorEditDialog({
// vendor가 변경되면 폼 데이터 업데이트
React.useEffect(() => {
if (vendor) {
+ // 낙찰수가 단수인 경우 발주비율을 100%로 자동 설정
+ const defaultAwardRatio = biddingAwardCount === 'single' ? 100 : (vendor.awardRatio || 0)
setFormData({
- awardRatio: vendor.awardRatio || 0,
+ awardRatio: defaultAwardRatio,
})
}
- }, [vendor])
+ }, [vendor, biddingAwardCount])
const handleEdit = () => {
if (!vendor) return
@@ -129,13 +135,23 @@ export function BiddingDetailVendorEditDialog({
value={formData.awardRatio}
onChange={(e) => setFormData({ ...formData, awardRatio: Number(e.target.value) })}
placeholder="발주비율을 입력하세요"
- disabled={vendor?.isBiddingParticipated !== true}
+ disabled={vendor?.isBiddingParticipated !== true || biddingAwardCount === 'single' || biddingStatus === 'vendor_selected'}
/>
{vendor?.isBiddingParticipated !== true && (
<p className="text-sm text-muted-foreground">
입찰에 참여한 업체만 발주비율을 설정할 수 있습니다.
</p>
)}
+ {biddingAwardCount === 'single' && vendor?.isBiddingParticipated === true && (
+ <p className="text-sm text-blue-600">
+ 단수 낙찰의 경우 발주비율은 자동으로 100%로 설정됩니다.
+ </p>
+ )}
+ {biddingStatus === 'vendor_selected' && (
+ <p className="text-sm text-red-600">
+ 낙찰이 완료되어 발주비율을 수정할 수 없습니다.
+ </p>
+ )}
</div>
</div>
<DialogFooter>
diff --git a/lib/bidding/detail/table/bidding-detail-vendor-table.tsx b/lib/bidding/detail/table/bidding-detail-vendor-table.tsx
index 3e8adda9..f2b05d4e 100644
--- a/lib/bidding/detail/table/bidding-detail-vendor-table.tsx
+++ b/lib/bidding/detail/table/bidding-detail-vendor-table.tsx
@@ -130,9 +130,10 @@ export function BiddingDetailVendorTableContent({
() => getBiddingDetailVendorColumns({
onEdit: onEdit || handleEdit,
onViewPriceAdjustment: handleViewPriceAdjustment,
- onViewItemDetails: onViewItemDetails
+ onViewItemDetails: onViewItemDetails,
+ biddingStatus: bidding.status
}),
- [onEdit, handleEdit, handleViewPriceAdjustment, onViewItemDetails]
+ [onEdit, handleEdit, handleViewPriceAdjustment, onViewItemDetails, bidding.status]
)
const { table } = useDataTable({
@@ -174,6 +175,8 @@ export function BiddingDetailVendorTableContent({
open={isEditDialogOpen}
onOpenChange={setIsEditDialogOpen}
onSuccess={onRefresh}
+ biddingAwardCount={bidding.awardCount}
+ biddingStatus={bidding.status}
/>
<BiddingAwardDialog
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 4655ed9f..e3b5c288 100644
--- a/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx
+++ b/lib/bidding/detail/table/bidding-detail-vendor-toolbar-actions.tsx
@@ -189,10 +189,13 @@ export function BiddingDetailVendorToolbarActions({
variant="default"
size="sm"
onClick={handleRegister}
- disabled={isPending}
+ disabled={isPending || bidding.status === 'received_quotation'}
>
<Send className="mr-2 h-4 w-4" />
입찰 등록
+ {bidding.status === 'received_quotation' && (
+ <span className="text-xs text-muted-foreground ml-2">(사전견적 제출 완료)</span>
+ )}
</Button>
<Button
variant="destructive"
diff --git a/lib/bidding/list/biddings-table-columns.tsx b/lib/bidding/list/biddings-table-columns.tsx
index 4900d18a..d6044e93 100644
--- a/lib/bidding/list/biddings-table-columns.tsx
+++ b/lib/bidding/list/biddings-table-columns.tsx
@@ -601,9 +601,15 @@ export function getBiddingsColumns({ setRowAction }: GetColumnsProps): ColumnDef
<Eye className="mr-2 h-4 w-4" />
상세보기
</DropdownMenuItem>
- <DropdownMenuItem onClick={() => setRowAction({ row, type: "update" })}>
+ <DropdownMenuItem
+ onClick={() => setRowAction({ row, type: "update" })}
+ disabled={['bidding_opened', 'bidding_closed', 'vendor_selected'].includes(row.original.status)}
+ >
<Edit className="mr-2 h-4 w-4" />
수정
+ {['bidding_opened', 'bidding_closed', 'vendor_selected'].includes(row.original.status) && (
+ <span className="text-xs text-muted-foreground ml-2">(수정 불가)</span>
+ )}
</DropdownMenuItem>
{/* <DropdownMenuSeparator />
<DropdownMenuItem onClick={() => setRowAction({ row, type: "copy" })}>
diff --git a/lib/bidding/vendor/partners-bidding-detail.tsx b/lib/bidding/vendor/partners-bidding-detail.tsx
index d134bc3b..f9241f7b 100644
--- a/lib/bidding/vendor/partners-bidding-detail.tsx
+++ b/lib/bidding/vendor/partners-bidding-detail.tsx
@@ -689,8 +689,8 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD
)}
{/* 응찰 제출 버튼 - 참여 확정 상태일 때만 표시 */}
<div className="flex justify-end pt-4 gap-2">
- <Button
- variant="outline"
+ <Button
+ variant="outline"
onClick={handleSaveDraft}
disabled={isSavingDraft || isSubmitting}
className="min-w-[100px]"
@@ -698,9 +698,13 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD
<Save className="w-4 h-4 mr-2" />
{isSavingDraft ? '저장 중...' : '임시 저장'}
</Button>
- <Button onClick={handleSubmitResponse} disabled={isSubmitting || isSavingDraft} className="min-w-[100px]">
+ <Button
+ onClick={handleSubmitResponse}
+ disabled={isSubmitting || isSavingDraft || !!biddingDetail.responseSubmittedAt}
+ className="min-w-[100px]"
+ >
<Send className="w-4 h-4 mr-2" />
- {isSubmitting ? '제출 중...' : '응찰 제출'}
+ {isSubmitting ? '제출 중...' : biddingDetail.responseSubmittedAt ? '응찰 완료' : '응찰 제출'}
</Button>
</div>
</CardContent>