diff options
Diffstat (limited to 'lib')
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> |
