import type { ReactNode } from 'react'; import { Link } from 'react-router'; import { Package } from 'lucide-react'; import { Card } from '@/components/ui/card'; import { InfoField } from './InfoField'; import { QuotationStatusBadge } from './StatusPill'; import type { QuotationData } from '@/api/generated/model/quotationData'; import { type Product, type Partner, type QuotationSetting, buildBidSummary, quotationTypeLabel, } from '../../types'; const fmtYn = (b: boolean | null | undefined, yes: string, no: string) => b == null ? '-' : b ? yes : no; /** 헤더 정보 카드 컨테이너. ui/Card 의 넉넉한 기본 여백을 촘촘하게 덮어쓴다. */ function SectionCard({ title, children }: { title: string; children: ReactNode }) { return ( {title} {children} ); } type DrawerHeaderCardsProps = { quotation: QuotationData; partners: Partner[]; quotationSettings: QuotationSetting[]; /** 현재 선택 세션의 상품(없으면 상품 카드는 빈 상태). */ currentProduct: Product | undefined; }; export function DrawerHeaderCards({ quotation, partners, quotationSettings, currentProduct, }: DrawerHeaderCardsProps) { // Quotations DDL 표시값 const q_name = quotation.name || '미지정'; const q_number = quotation.number || 'EST-000000-0000'; const q_round = quotation.round || 1; const q_end_time = quotation.end_time || '미지정'; const q_manager_name = quotation.manager_name || '홍길동 파트너'; const q_manager_email = quotation.manager_email || 'gildong@negodata.com'; const q_memo = quotation.memo || '안내사항 없음'; const bidSummaryObj = buildBidSummary(quotation, partners); const selectedSettingObj = quotationSettings.find((qs) => qs.qt_setting_id === quotation.qt_setting_id); // 상품 상세 패널 행(negowiz 협상대화의 상품 정보 대응). negodata 컬럼명: maker_name→manufacturer, min_order_quantity→moq. const productSpecRows = currentProduct ? [ { label: '상품코드', value: currentProduct.code || '-' }, { label: '단가', value: currentProduct.price != null ? `₩${Number(currentProduct.price).toLocaleString()}` : '-' }, { label: '모델명', value: currentProduct.model_name || '-' }, { label: '규격', value: currentProduct.spec || '-' }, { label: '제조사', value: currentProduct.manufacturer || '-' }, { label: '원산지', value: currentProduct.made_in || '-' }, { label: 'MOQ', value: currentProduct.moq || '-' }, { label: '리드타임', value: currentProduct.lead_time != null ? `${currentProduct.lead_time}일` : '-' }, { label: 'VAT', value: fmtYn(currentProduct.vat_yn, '포함', '별도') }, { label: '배송비', value: fmtYn(currentProduct.delivery_fee_yn, '포함', '별도') }, ] : []; return (
{/* 좌측 컬럼: 견적정보 + 진행상태 */}
{/* Quotations */}
{/* Bid Summary */}
{bidSummaryObj.equal_data}
{/* 우측 컬럼: 상품정보 + 세팅 */}
{/* 상품 정보 (협상 대상 상품) */} {currentProduct ? (
{currentProduct.image_url ? ( {currentProduct.name ) : ( )}
{currentProduct.name || '-'}
{productSpecRows.map((r) => ( ))}
) : (
상품 정보가 비어있습니다.
)}
{/* Quotation Settings */} {selectedSettingObj ? (
) : (
적용된 견적 세팅이 비어있습니다.
)}
); }