From 1540eac291761ffd8fc1947ed626e4e4a4407922 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 17 Oct 2025 08:08:33 +0000 Subject: (최겸) 견적입찰 비교관련 수정 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/rfq-last/quotation-compare-view.tsx | 466 +++++++++++++++++++++----------- 1 file changed, 306 insertions(+), 160 deletions(-) (limited to 'lib/rfq-last/quotation-compare-view.tsx') diff --git a/lib/rfq-last/quotation-compare-view.tsx b/lib/rfq-last/quotation-compare-view.tsx index 723d1044..527fc4d8 100644 --- a/lib/rfq-last/quotation-compare-view.tsx +++ b/lib/rfq-last/quotation-compare-view.tsx @@ -28,6 +28,8 @@ import { X, RefreshCw, Clock, + Download, + Paperclip, } from "lucide-react"; import { cn } from "@/lib/utils"; import { format } from "date-fns"; @@ -193,13 +195,14 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { switch (selectedContractType) { case "PO": + const poSelectionReason: string | undefined = selectedVendor.selectionReason || undefined; result = await createPO({ rfqId: data.rfqInfo.id, vendorId: selectedVendor.vendorId, vendorName: selectedVendor.vendorName, totalAmount: selectedVendor.totalAmount, currency: selectedVendor.currency, - selectionReason: selectedVendor.selectionReason, + selectionReason: poSelectionReason, }); break; @@ -712,18 +715,29 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { - - + + + {data.vendors.map((vendor) => ( - + + + ))} @@ -731,21 +745,28 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { {/* 통화 */} - {data.vendors.map((vendor) => { const latestResponse = vendor.responses[0]; // 최신 응답 (이미 정렬되어 있음) return ( - + + + + ); })} @@ -753,42 +774,47 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { {/* 지급조건 */} - {data.vendors.map((vendor) => { const latestResponse = vendor.responses[0]; return ( - + + + ); })} @@ -796,42 +822,47 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { {/* 인코텀즈 */} - {data.vendors.map((vendor) => { const latestResponse = vendor.responses[0]; return ( - + + + ); })} @@ -839,22 +870,29 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { {/* 선적지 */} - {data.vendors.map((vendor) => { const latestResponse = vendor.responses[0]; return ( - + + + + ); })} @@ -862,22 +900,29 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { {/* 하역지 */} - {data.vendors.map((vendor) => { const latestResponse = vendor.responses[0]; return ( - + + + + ); })} @@ -885,30 +930,35 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { {/* 납기일 */} - {data.vendors.map((vendor) => { const latestResponse = vendor.responses[0]; return ( - + + + + ); })} @@ -916,22 +966,29 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { {/* 세금조건 */} - {data.vendors.map((vendor) => { const latestResponse = vendor.responses[0]; return ( - + + + + ); })} @@ -939,22 +996,29 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { {/* 계약기간 */} - {data.vendors.map((vendor) => { const latestResponse = vendor.responses[0]; return ( - + + + + ); })} @@ -980,11 +1044,13 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { + + + - - + @@ -994,15 +1060,30 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { return ( - - + + + + - ); @@ -1054,6 +1130,76 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { )} + + {/* 첨부파일 */} + {selectedResponse?.attachments && selectedResponse.attachments.length > 0 && ( +
+

+ + 제출 문서 ({selectedResponse.attachments.length}건) +

+
+ {selectedResponse.attachments.map((attachment) => ( +
+
+ +
+

+ {attachment.originalFileName} +

+
+ + {attachment.attachmentType} + + {attachment.documentNo && ( + 문서번호: {attachment.documentNo} + )} + {attachment.fileSize && ( + {(attachment.fileSize / 1024).toFixed(1)} KB + )} + {attachment.uploadedAt && ( + + 업로드: {format(new Date(attachment.uploadedAt), "yyyy-MM-dd HH:mm")} + + )} +
+ {attachment.description && ( +

+ {attachment.description} +

+ )} + {(attachment.validFrom || attachment.validTo) && ( +

+ 유효기간: {attachment.validFrom ? format(new Date(attachment.validFrom), "yyyy-MM-dd") : "-"} ~ {attachment.validTo ? format(new Date(attachment.validTo), "yyyy-MM-dd") : "-"} +

+ )} +
+
+ +
+ ))} +
+
+ )} -- cgit v1.2.3
항목구매자 제시항목
- {vendor.vendorName} + + + SHI 제시 + +
+ {vendor.vendorName} +
{vendor.isSelected && ( 선정 )} -
통화{data.vendors[0]?.buyerConditions.currency} -
- {latestResponse?.vendorConditions?.currency || vendor.buyerConditions.currency} - {latestResponse?.vendorConditions?.currency && latestResponse.vendorConditions.currency !== vendor.buyerConditions.currency && ( - 변경 - )} -
-
+ {vendor.buyerConditions.currency} + +
+ {latestResponse?.vendorConditions?.currency || vendor.buyerConditions.currency} + {latestResponse?.vendorConditions?.currency && latestResponse.vendorConditions.currency !== vendor.buyerConditions.currency && ( + 변경 + )} +
+
지급조건 - - - - {data.vendors[0]?.buyerConditions.paymentTermsCode} - - - {data.vendors[0]?.buyerConditions.paymentTermsDesc} - - - - -
+ +
- {latestResponse?.vendorConditions?.paymentTermsCode || vendor.buyerConditions.paymentTermsCode} + {vendor.buyerConditions.paymentTermsCode} - {latestResponse?.vendorConditions?.paymentTermsDesc || vendor.buyerConditions.paymentTermsDesc} + {vendor.buyerConditions.paymentTermsDesc} - {latestResponse?.vendorConditions?.paymentTermsCode && - latestResponse.vendorConditions.paymentTermsCode !== vendor.buyerConditions.paymentTermsCode && ( - 변경 - )} - - +
+ + + + {latestResponse?.vendorConditions?.paymentTermsCode || vendor.buyerConditions.paymentTermsCode} + + + {latestResponse?.vendorConditions?.paymentTermsDesc || vendor.buyerConditions.paymentTermsDesc} + + + + {latestResponse?.vendorConditions?.paymentTermsCode && + latestResponse.vendorConditions.paymentTermsCode !== vendor.buyerConditions.paymentTermsCode && ( + 변경 + )} +
+
인코텀즈 - - - - {data.vendors[0]?.buyerConditions.incotermsCode} - - - {data.vendors[0]?.buyerConditions.incotermsDesc} - - - - -
+ +
- {latestResponse?.vendorConditions?.incotermsCode || vendor.buyerConditions.incotermsCode} + {vendor.buyerConditions.incotermsCode} - {latestResponse?.vendorConditions?.incotermsDesc || vendor.buyerConditions.incotermsDesc} + {vendor.buyerConditions.incotermsDesc} - {latestResponse?.vendorConditions?.incotermsCode && - latestResponse.vendorConditions.incotermsCode !== vendor.buyerConditions.incotermsCode && ( - 변경 - )} - - +
+ + + + {latestResponse?.vendorConditions?.incotermsCode || vendor.buyerConditions.incotermsCode} + + + {latestResponse?.vendorConditions?.incotermsDesc || vendor.buyerConditions.incotermsDesc} + + + + {latestResponse?.vendorConditions?.incotermsCode && + latestResponse.vendorConditions.incotermsCode !== vendor.buyerConditions.incotermsCode && ( + 변경 + )} +
+
선적지{data.vendors[0]?.buyerConditions.placeOfShipping || "-"} -
- {latestResponse?.vendorConditions?.placeOfShipping || vendor.buyerConditions.placeOfShipping || "-"} - {latestResponse?.vendorConditions?.placeOfShipping && - latestResponse.vendorConditions.placeOfShipping !== vendor.buyerConditions.placeOfShipping && ( - 변경 - )} -
-
+ {vendor.buyerConditions.placeOfShipping || "-"} + +
+ {latestResponse?.vendorConditions?.placeOfShipping || vendor.buyerConditions.placeOfShipping || "-"} + {latestResponse?.vendorConditions?.placeOfShipping && + latestResponse.vendorConditions.placeOfShipping !== vendor.buyerConditions.placeOfShipping && ( + 변경 + )} +
+
하역지{data.vendors[0]?.buyerConditions.placeOfDestination || "-"} -
- {latestResponse?.vendorConditions?.placeOfDestination || vendor.buyerConditions.placeOfDestination || "-"} - {latestResponse?.vendorConditions?.placeOfDestination && - latestResponse.vendorConditions.placeOfDestination !== vendor.buyerConditions.placeOfDestination && ( - 변경 - )} -
-
+ {vendor.buyerConditions.placeOfDestination || "-"} + +
+ {latestResponse?.vendorConditions?.placeOfDestination || vendor.buyerConditions.placeOfDestination || "-"} + {latestResponse?.vendorConditions?.placeOfDestination && + latestResponse.vendorConditions.placeOfDestination !== vendor.buyerConditions.placeOfDestination && ( + 변경 + )} +
+
납기일 - {data.vendors[0]?.buyerConditions.deliveryDate - ? format(new Date(data.vendors[0].buyerConditions.deliveryDate), "yyyy-MM-dd") - : "-"} - -
- {latestResponse?.vendorConditions?.deliveryDate - ? format(new Date(latestResponse.vendorConditions.deliveryDate), "yyyy-MM-dd") - : vendor.buyerConditions.deliveryDate - ? format(new Date(vendor.buyerConditions.deliveryDate), "yyyy-MM-dd") - : "-"} - {latestResponse?.vendorConditions?.deliveryDate && vendor.buyerConditions.deliveryDate && - new Date(latestResponse.vendorConditions.deliveryDate).getTime() !== new Date(vendor.buyerConditions.deliveryDate).getTime() && ( - 변경 - )} -
-
+ {vendor.buyerConditions.deliveryDate + ? format(new Date(vendor.buyerConditions.deliveryDate), "yyyy-MM-dd") + : "-"} + +
+ {latestResponse?.vendorConditions?.deliveryDate + ? format(new Date(latestResponse.vendorConditions.deliveryDate), "yyyy-MM-dd") + : vendor.buyerConditions.deliveryDate + ? format(new Date(vendor.buyerConditions.deliveryDate), "yyyy-MM-dd") + : "-"} + {/* {latestResponse?.vendorConditions?.deliveryDate && vendor.buyerConditions.deliveryDate && + new Date(latestResponse.vendorConditions.deliveryDate).getTime() !== new Date(vendor.buyerConditions.deliveryDate).getTime() && ( + 변경 + )} */} +
+
세금조건{data.vendors[0]?.buyerConditions.taxCode || "-"} -
- {latestResponse?.vendorConditions?.taxCode || vendor.buyerConditions.taxCode || "-"} - {latestResponse?.vendorConditions?.taxCode && - latestResponse.vendorConditions.taxCode !== vendor.buyerConditions.taxCode && ( - 변경 - )} -
-
+ {vendor.buyerConditions.taxCode || "-"} + +
+ {latestResponse?.vendorConditions?.taxCode || vendor.buyerConditions.taxCode || "-"} + {latestResponse?.vendorConditions?.taxCode && + latestResponse.vendorConditions.taxCode !== vendor.buyerConditions.taxCode && ( + 변경 + )} +
+
계약기간{data.vendors[0]?.buyerConditions.contractDuration || "-"} -
- {latestResponse?.vendorConditions?.contractDuration || vendor.buyerConditions.contractDuration || "-"} - {latestResponse?.vendorConditions?.contractDuration && - latestResponse.vendorConditions.contractDuration !== vendor.buyerConditions.contractDuration && ( - 변경 - )} -
-
+ {vendor.buyerConditions.contractDuration || "-"} + +
+ {latestResponse?.vendorConditions?.contractDuration || vendor.buyerConditions.contractDuration || "-"} + {latestResponse?.vendorConditions?.contractDuration && + latestResponse.vendorConditions.contractDuration !== vendor.buyerConditions.contractDuration && ( + 변경 + )} +
+
품목코드 품목명자재분류 수량규격중량 단가 총액납기제조사납기일자
{prItem.materialCode} -

{prItem.materialDescription}

+
+

{prItem.materialCode}

{prItem.prNo} • {prItem.prItem}

+

{prItem.materialDescription}

+ {prItem.remark && ( +

{prItem.remark}

+ )} +
+ {prItem.materialCategory || "-"} + - {quoteItem.quantity} {prItem.uom} +

{quoteItem.quantity} {prItem.uom}

+

요청: {prItem.requestedQuantity}

+
+ {prItem.size || "-"} + + {prItem.grossWeight ? `${prItem.grossWeight} ${prItem.gwUom || ""}` : "-"} {formatAmount(quoteItem.unitPrice, quoteItem.currency)} @@ -1016,16 +1097,11 @@ export function QuotationCompareView({ data }: QuotationCompareViewProps) { : quoteItem.leadTime ? `${quoteItem.leadTime}일` : "-"} - - {quoteItem.manufacturer ? ( -
-

{quoteItem.manufacturer}

- {quoteItem.modelNo && ( -

{quoteItem.modelNo}

- )} -
- ) : "-"} + {prItem.requestedDeliveryDate && ( +

+ 요청: {format(new Date(prItem.requestedDeliveryDate), "yyyy-MM-dd")} +

+ )}