diff options
Diffstat (limited to 'lib/bidding/vendor')
| -rw-r--r-- | lib/bidding/vendor/partners-bidding-attachments-dialog.tsx | 9 | ||||
| -rw-r--r-- | lib/bidding/vendor/partners-bidding-detail.tsx | 81 | ||||
| -rw-r--r-- | lib/bidding/vendor/partners-bidding-list-columns.tsx | 2 |
3 files changed, 52 insertions, 40 deletions
diff --git a/lib/bidding/vendor/partners-bidding-attachments-dialog.tsx b/lib/bidding/vendor/partners-bidding-attachments-dialog.tsx index f5206c71..14d42a46 100644 --- a/lib/bidding/vendor/partners-bidding-attachments-dialog.tsx +++ b/lib/bidding/vendor/partners-bidding-attachments-dialog.tsx @@ -57,12 +57,13 @@ const documentTypes = [ { value: 'specification', label: '사양서' }, { value: 'specification_meeting', label: '사양설명회' }, { value: 'contract_draft', label: '계약서 초안' }, + { value: 'company_proposal', label: '협력업체용 첨부파일' }, { value: 'financial_doc', label: '재무 관련 문서' }, { value: 'technical_doc', label: '기술 관련 문서' }, { value: 'certificate', label: '인증서류' }, { value: 'pr_document', label: 'PR 문서' }, { value: 'spec_document', label: 'SPEC 문서' }, - { value: 'evaluation_doc', label: '평가 관련 문서' }, + { value: 'evaluation_doc', label: 'SHI용 첨부파일' }, { value: 'bid_attachment', label: '입찰 첨부파일' }, { value: 'other', label: '기타' } ] @@ -183,7 +184,7 @@ export function PartnersBiddingAttachmentsDialog({ <TableHead>파일명</TableHead> <TableHead>크기</TableHead> <TableHead>업로드일</TableHead> - <TableHead>작성자</TableHead> + {/* <TableHead>작성자</TableHead> */} <TableHead className="w-24">작업</TableHead> </TableRow> </TableHeader> @@ -212,12 +213,12 @@ export function PartnersBiddingAttachmentsDialog({ {new Date(doc.uploadedAt).toLocaleDateString('ko-KR')} </div> </TableCell> - <TableCell className="text-sm text-gray-500"> + {/* <TableCell className="text-sm text-gray-500"> <div className="flex items-center gap-1"> <User className="w-3 h-3" /> {doc.uploadedBy} </div> - </TableCell> + </TableCell> */} <TableCell> <Button variant="outline" diff --git a/lib/bidding/vendor/partners-bidding-detail.tsx b/lib/bidding/vendor/partners-bidding-detail.tsx index 66c90eaf..0215bcb6 100644 --- a/lib/bidding/vendor/partners-bidding-detail.tsx +++ b/lib/bidding/vendor/partners-bidding-detail.tsx @@ -94,6 +94,7 @@ interface BiddingDetail { responseSubmittedAt: Date | null priceAdjustmentResponse: boolean | null // 연동제 적용 여부 isPreQuoteParticipated: boolean | null // 사전견적 참여 여부 + isPriceAdjustmentApplicableQuestion: boolean // 연동제 적용요건 문의 여부 } interface PrItem { @@ -485,7 +486,21 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD // 임시 저장 핸들러 const handleSaveDraft = async () => { if (!biddingDetail || !userId) return - + + // 제출 마감일 체크 + if (biddingDetail.submissionEndDate) { + const now = new Date() + const deadline = new Date(biddingDetail.submissionEndDate) + if (deadline < now) { + toast({ + title: "접근 제한", + description: "제출 마감일이 지났습니다. 더 이상 입찰에 참여할 수 없습니다.", + variant: "destructive", + }) + return + } + } + // 입찰 마감 상태 체크 const biddingStatus = biddingDetail.status const isClosed = biddingStatus === 'bidding_closed' || biddingStatus === 'vendor_selected' || biddingStatus === 'bidding_disposal' @@ -606,6 +621,21 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD const handleSubmitResponse = () => { if (!biddingDetail) return + + // 제출 마감일 체크 + if (biddingDetail.submissionEndDate) { + const now = new Date() + const deadline = new Date(biddingDetail.submissionEndDate) + if (deadline < now) { + toast({ + title: "접근 제한", + description: "제출 마감일이 지났습니다. 더 이상 입찰에 참여할 수 없습니다.", + variant: "destructive", + }) + return + } + } + // 입찰 마감 상태 체크 const biddingStatus = biddingDetail.status const isClosed = biddingStatus === 'bidding_closed' || biddingStatus === 'vendor_selected' || biddingStatus === 'bidding_disposal' @@ -661,6 +691,9 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD proposedContractDeliveryDate: responseData.proposedContractDeliveryDate, additionalProposals: responseData.additionalProposals, isFinalSubmission, // 최종제출 여부 추가 + // 연동제 데이터 추가 (연동제 적용요건 문의가 있는 경우만) + priceAdjustmentResponse: biddingDetail.isPriceAdjustmentApplicableQuestion ? responseData.priceAdjustmentResponse : undefined, + priceAdjustmentForm: biddingDetail.isPriceAdjustmentApplicableQuestion && responseData.priceAdjustmentResponse !== null ? priceAdjustmentForm : undefined, prItemQuotations: prItemQuotations.length > 0 ? prItemQuotations.map(q => ({ prItemId: q.prItemId, bidUnitPrice: q.bidUnitPrice, @@ -781,7 +814,7 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD <div className="mt-1">{biddingTypeLabels[biddingDetail.biddingType]}</div> </div> <div> - <Label className="text-sm font-medium text-muted-foreground">낙찰수</Label> + <Label className="text-sm font-medium text-muted-foreground">낙찰업체 수</Label> <div className="mt-1">{biddingDetail.awardCount === 'single' ? '단수' : biddingDetail.awardCount === 'multiple' ? '복수' : '미설정'}</div> </div> <div> @@ -816,7 +849,7 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD {/* 제출 마감일 D-day */} - {/* {biddingDetail.submissionEndDate && ( + {biddingDetail.submissionEndDate && ( <div className="pt-4 border-t"> <Label className="text-sm font-medium text-muted-foreground mb-2 block">제출 마감 정보</Label> {(() => { @@ -826,13 +859,13 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD const timeLeft = deadline.getTime() - now.getTime() const daysLeft = Math.floor(timeLeft / (1000 * 60 * 60 * 24)) const hoursLeft = Math.floor((timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)) - + return ( <div className={`p-3 rounded-lg border-2 ${ - isExpired - ? 'border-red-200 bg-red-50' - : daysLeft <= 1 - ? 'border-orange-200 bg-orange-50' + isExpired + ? 'border-red-200 bg-red-50' + : daysLeft <= 1 + ? 'border-orange-200 bg-orange-50' : 'border-green-200 bg-green-50' }`}> <div className="flex items-center justify-between"> @@ -866,7 +899,7 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD ) })()} </div> - )} */} + )} {/* 일정 정보 */} <div className="pt-4 border-t"> @@ -991,12 +1024,12 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD </div> </div> - <div> + {/* <div> <Label className="text-muted-foreground">연동제 적용</Label> <div className="mt-1 p-3 bg-muted rounded-md"> <p className="font-medium">{biddingConditions.isPriceAdjustmentApplicable ? "적용 가능" : "적용 불가"}</p> </div> - </div> + </div> */} <div > @@ -1110,8 +1143,8 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD /> )} - {/* 연동제 적용 여부 - SHI가 연동제를 요구하고, 사전견적에서 답변하지 않은 경우만 표시 */} - {biddingConditions?.isPriceAdjustmentApplicable && biddingDetail.priceAdjustmentResponse === null && ( + {/* 연동제 적용 여부 - 협력업체 별 연동제 적용요건 문의 여부에 따라 표시 */} + {biddingDetail.isPriceAdjustmentApplicableQuestion && ( <> <div className="space-y-3 p-4 border rounded-lg bg-muted/30"> <Label className="font-semibold text-base">연동제 적용 여부 *</Label> @@ -1346,28 +1379,6 @@ export function PartnersBiddingDetail({ biddingId, companyId }: PartnersBiddingD </> )} - {/* 사전견적에서 이미 답변한 경우 - 읽기 전용으로 표시 */} - {biddingDetail.priceAdjustmentResponse !== null && ( - <Card> - <CardHeader> - <CardTitle className="text-lg">연동제 적용 정보 (사전견적 제출 완료)</CardTitle> - </CardHeader> - <CardContent> - <div className="p-4 bg-muted/30 rounded-lg"> - <div className="flex items-center gap-2 mb-2"> - <CheckCircle className="w-5 h-5 text-green-600" /> - <span className="font-semibold"> - {biddingDetail.priceAdjustmentResponse ? '연동제 적용' : '연동제 미적용'} - </span> - </div> - <p className="text-sm text-muted-foreground"> - 사전견적에서 이미 연동제 관련 정보를 제출하였습니다. 본입찰에서는 별도의 연동제 정보 입력이 필요하지 않습니다. - </p> - </div> - </CardContent> - </Card> - )} - {/* 최종제출 체크박스 */} {!biddingDetail.isFinalSubmission && ( <div className="flex items-center space-x-2 p-4 border rounded-lg bg-muted/30"> diff --git a/lib/bidding/vendor/partners-bidding-list-columns.tsx b/lib/bidding/vendor/partners-bidding-list-columns.tsx index ba8efae6..ba47ce50 100644 --- a/lib/bidding/vendor/partners-bidding-list-columns.tsx +++ b/lib/bidding/vendor/partners-bidding-list-columns.tsx @@ -119,7 +119,7 @@ export function getPartnersBiddingListColumns({ setRowAction }: PartnersBiddingL // 첨부파일 columnHelper.display({ id: 'attachments', - header: 'SHI 첨부파일', + header: '첨부파일', cell: ({ row }) => { const handleViewDocumentsClick = (e: React.MouseEvent) => { e.stopPropagation() |
