diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-03 10:35:57 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-03 10:35:57 +0000 |
| commit | a2bc455f654e011c53968b0d3a14389d7259847e (patch) | |
| tree | 6ff60b8ef0880aaa4cf2c9d4f234772fb0a74537 /components/bidding/price-adjustment-dialog.tsx | |
| parent | bfe354f7633f62350e61eb784cbf1926079339d1 (diff) | |
(최겸) 구매 입찰 개발(벤더 응찰 개발 및 기본계약 요청 개발 필)
Diffstat (limited to 'components/bidding/price-adjustment-dialog.tsx')
| -rw-r--r-- | components/bidding/price-adjustment-dialog.tsx | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/components/bidding/price-adjustment-dialog.tsx b/components/bidding/price-adjustment-dialog.tsx new file mode 100644 index 00000000..b53f9ef1 --- /dev/null +++ b/components/bidding/price-adjustment-dialog.tsx @@ -0,0 +1,200 @@ +'use client' + +import React from 'react' +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' +import { Badge } from '@/components/ui/badge' +import { Separator } from '@/components/ui/separator' + +interface PriceAdjustmentData { + id: number + itemName?: string | null + adjustmentReflectionPoint?: string | null + majorApplicableRawMaterial?: string | null + adjustmentFormula?: string | null + rawMaterialPriceIndex?: string | null + referenceDate?: Date | null + comparisonDate?: Date | null + adjustmentRatio?: string | null + notes?: string | null + adjustmentConditions?: string | null + majorNonApplicableRawMaterial?: string | null + adjustmentPeriod?: string | null + contractorWriter?: string | null + adjustmentDate?: Date | null + nonApplicableReason?: string | null + createdAt: Date + updatedAt: Date +} + +interface PriceAdjustmentDialogProps { + open: boolean + onOpenChange: (open: boolean) => void + data: PriceAdjustmentData | null + vendorName: string +} + +function formatDate(date: Date | null | undefined): string { + if (!date) return '-' + return new Date(date).toLocaleDateString('ko-KR', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + }) +} + +export function PriceAdjustmentDialog({ + open, + onOpenChange, + data, + vendorName, +}: PriceAdjustmentDialogProps) { + if (!data) return null + + return ( + <Dialog open={open} onOpenChange={onOpenChange}> + <DialogContent className="max-w-4xl max-h-[80vh] overflow-y-auto"> + <DialogHeader> + <DialogTitle className="flex items-center gap-2"> + <span>하도급대금등 연동표</span> + <Badge variant="secondary">{vendorName}</Badge> + </DialogTitle> + <DialogDescription> + 협력업체가 제출한 연동제 적용 정보입니다. + </DialogDescription> + </DialogHeader> + + <div className="space-y-6"> + {/* 기본 정보 */} + <div> + <h3 className="text-sm font-medium text-gray-900 mb-3">기본 정보</h3> + <div className="grid grid-cols-2 gap-4"> + <div> + <label className="text-xs text-gray-500">품목등의 명칭</label> + <p className="text-sm font-medium">{data.itemName || '-'}</p> + </div> + <div> + <label className="text-xs text-gray-500">조정대금 반영시점</label> + <p className="text-sm font-medium">{data.adjustmentReflectionPoint || '-'}</p> + </div> + </div> + </div> + + <Separator /> + + {/* 원재료 정보 */} + <div> + <h3 className="text-sm font-medium text-gray-900 mb-3">원재료 정보</h3> + <div className="space-y-4"> + <div> + <label className="text-xs text-gray-500">연동대상 주요 원재료</label> + <p className="text-sm font-medium whitespace-pre-wrap"> + {data.majorApplicableRawMaterial || '-'} + </p> + </div> + <div> + <label className="text-xs text-gray-500">연동 미적용 주요 원재료</label> + <p className="text-sm font-medium whitespace-pre-wrap"> + {data.majorNonApplicableRawMaterial || '-'} + </p> + </div> + <div> + <label className="text-xs text-gray-500">연동 미적용 사유</label> + <p className="text-sm font-medium whitespace-pre-wrap"> + {data.nonApplicableReason || '-'} + </p> + </div> + </div> + </div> + + <Separator /> + + {/* 연동 공식 및 지표 */} + <div> + <h3 className="text-sm font-medium text-gray-900 mb-3">연동 공식 및 지표</h3> + <div className="space-y-4"> + <div> + <label className="text-xs text-gray-500">하도급대금등 연동 산식</label> + <div className="p-3 bg-gray-50 rounded-md"> + <p className="text-sm font-mono whitespace-pre-wrap"> + {data.adjustmentFormula || '-'} + </p> + </div> + </div> + <div> + <label className="text-xs text-gray-500">원재료 가격 기준지표</label> + <p className="text-sm font-medium whitespace-pre-wrap"> + {data.rawMaterialPriceIndex || '-'} + </p> + </div> + <div className="grid grid-cols-2 gap-4"> + <div> + <label className="text-xs text-gray-500">기준시점</label> + <p className="text-sm font-medium">{formatDate(data.referenceDate)}</p> + </div> + <div> + <label className="text-xs text-gray-500">비교시점</label> + <p className="text-sm font-medium">{formatDate(data.comparisonDate)}</p> + </div> + </div> + <div> + <label className="text-xs text-gray-500">연동 비율</label> + <p className="text-sm font-medium"> + {data.adjustmentRatio ? `${data.adjustmentRatio}%` : '-'} + </p> + </div> + </div> + </div> + + <Separator /> + + {/* 조정 조건 및 기타 */} + <div> + <h3 className="text-sm font-medium text-gray-900 mb-3">조정 조건 및 기타</h3> + <div className="space-y-4"> + <div> + <label className="text-xs text-gray-500">조정요건</label> + <p className="text-sm font-medium whitespace-pre-wrap"> + {data.adjustmentConditions || '-'} + </p> + </div> + <div className="grid grid-cols-2 gap-4"> + <div> + <label className="text-xs text-gray-500">조정주기</label> + <p className="text-sm font-medium">{data.adjustmentPeriod || '-'}</p> + </div> + <div> + <label className="text-xs text-gray-500">조정일</label> + <p className="text-sm font-medium">{formatDate(data.adjustmentDate)}</p> + </div> + </div> + <div> + <label className="text-xs text-gray-500">수탁기업(협력사) 작성자</label> + <p className="text-sm font-medium">{data.contractorWriter || '-'}</p> + </div> + <div> + <label className="text-xs text-gray-500">기타 사항</label> + <p className="text-sm font-medium whitespace-pre-wrap"> + {data.notes || '-'} + </p> + </div> + </div> + </div> + + <Separator /> + + {/* 메타 정보 */} + <div className="text-xs text-gray-500 space-y-1"> + <p>작성일: {formatDate(data.createdAt)}</p> + <p>수정일: {formatDate(data.updatedAt)}</p> + </div> + </div> + </DialogContent> + </Dialog> + ) +} |
