"use client"; /** * 수주서 문서 컴포넌트 (기획서 D1.8 기준 리디자인) * - 출고증(ShipmentOrderDocument)과 동일한 자재 섹션 구조 * - 수주서 전용 헤더 (결재란, 로트번호, 제품코드, 인정번호) * - 배차정보/LOT 컬럼 없음 */ import { useState } from "react"; import { getTodayString } from "@/lib/utils/date"; import { OrderItem } from "../actions"; import { ProductInfo } from "./OrderDocumentModal"; import { ConstructionApprovalTable } from "@/components/document-system"; import { formatNumber } from '@/lib/utils/amount'; interface SalesOrderDocumentProps { documentNumber?: string; orderNumber: string; certificationNumber?: string; orderDate?: string; client: string; siteName?: string; manager?: string; managerContact?: string; deliveryRequestDate?: string; expectedShipDate?: string; deliveryMethod?: string; address?: string; recipientName?: string; recipientContact?: string; shutterCount?: number; fee?: number; items?: OrderItem[]; products?: ProductInfo[]; remarks?: string; } // ===== 문서 전용 목데이터 (출고증과 동일 구조) ===== const MOCK_SCREEN_ROWS = [ { no: 1, type: '이(마)', code: 'FA123', openW: 4300, openH: 4300, madeW: 4300, madeH: 3000, guideRail: '백면형', shaft: 5, caseInch: 5, bracket: '500X300 380X180', capacity: 300, finish: 'SUS마감' }, { no: 2, type: '이(마)', code: 'FA123', openW: 4300, openH: 4300, madeW: 4300, madeH: 3000, guideRail: '백면형', shaft: 5, caseInch: 5, bracket: '500X300 380X180', capacity: 300, finish: 'SUS마감' }, ]; const MOCK_STEEL_ROWS = [ { no: 1, code: 'FA123', openW: 4300, openH: 3000, madeW: 4300, madeH: 3000, guideRail: '백면형', shaft: 5, jointBar: 5, caseInch: 5, bracket: '500X300 380X180', capacity: 300, finish: 'SUS마감' }, { no: 2, code: 'FA123', openW: 4300, openH: 3000, madeW: 4300, madeH: 3000, guideRail: '백면형', shaft: 5, jointBar: 5, caseInch: 5, bracket: '500X300 380X180', capacity: 300, finish: 'SUS마감' }, ]; const MOCK_MOTOR_LEFT = [ { item: '모터', type: '380V 단상', spec: 'KD-150K', qty: 6 }, { item: '브라켓트', type: '-', spec: '380X180', qty: 6 }, { item: '앵글', type: '밑침통 영금', spec: '40*40*380', qty: 4 }, ]; const MOCK_MOTOR_RIGHT = [ { item: '전동개폐기', type: '릴박스', spec: '-', qty: 1 }, { item: '전동개폐기', type: '매입', spec: '-', qty: 1 }, ]; const MOCK_GUIDE_RAIL_ITEMS = [ { name: '항목명', spec: 'L: 3,000', qty: 22 }, { name: '하부BASE', spec: '130X80', qty: 22 }, ]; const MOCK_GUIDE_SMOKE = { name: '연기차단재(W50)', spec: '2,438', qty: 4 }; const MOCK_CASE_ITEMS = [ { name: '500X330', spec: 'L: 4,000', qty: 3 }, { name: '500X330', spec: 'L: 5,000', qty: 4 }, { name: '상부덮개', spec: '1219X389', qty: 55 }, { name: '측면부 (마구리)', spec: '500X355', qty: '500X355' }, ]; const MOCK_CASE_SMOKE = { name: '연기차단재(W80)', spec: '3,000', qty: 4 }; const MOCK_BOTTOM_SCREEN = [ { name: '하단마감재', spec: '60X40', l1: 'L: 3,000', q1: 6, name2: '하단마감재', spec2: '60X40', l2: 'L: 4,000', q2: 6 }, { name: '하단보강엘비', spec: '60X17', l1: 'L: 3,000', q1: 6, name2: '하단보강엘비', spec2: '60X17', l2: 'L: 4,000', q2: 6 }, { name: '하단보강평철', spec: '-', l1: 'L: 3,000', q1: 6, name2: '하단보강평철', spec2: '-', l2: 'L: 4,000', q2: 6 }, { name: '하단무게평철', spec: '50X12T', l1: 'L: 3,000', q1: 6, name2: '하단무게평철', spec2: '50X12T', l2: 'L: 4,000', q2: 6 }, ]; const MOCK_BOTTOM_STEEL = { spec: '60X40', length: 'L: 3,000', qty: 22 }; const MOCK_SUBSIDIARY = [ { leftItem: '감기사프트', leftSpec: '4인치 4500', leftQty: 6, rightItem: '각파이프', rightSpec: '6000', rightQty: 4 }, { leftItem: '조인트바', leftSpec: '300', leftQty: 6, rightItem: '환봉', rightSpec: '3000', rightQty: 5 }, ]; // ===== 공통 스타일 ===== const thBase = 'border-r border-gray-400 px-1 py-1'; const tdBase = 'border-r border-gray-300 px-1 py-1'; const tdCenter = `${tdBase} text-center`; const imgPlaceholder = 'flex items-center justify-center border border-dashed border-gray-300 text-gray-400'; export function SalesOrderDocument({ documentNumber = "ABC123", orderNumber, certificationNumber = "-", orderDate = getTodayString(), client, siteName = "-", manager = "-", managerContact = "-", deliveryRequestDate = "-", expectedShipDate = "-", deliveryMethod = "상차", address = "-", recipientName = "-", recipientContact = "-", shutterCount = 0, items: _items = [], products = [], remarks, }: SalesOrderDocumentProps) { const [bottomFinishView, setBottomFinishView] = useState<'screen' | 'steel'>('screen'); const motorRows = Math.max(MOCK_MOTOR_LEFT.length, MOCK_MOTOR_RIGHT.length); return (
{/* ========== 헤더: 수주서 제목 + 결재란 ========== */}

수 주 서

문서번호: {documentNumber} 작성일자: {orderDate}
{/* ========== 로트번호 / 제품명 / 제품코드 / 인정번호 ========== */}
로트번호 {orderNumber} 제품명 {products[0]?.productName || "-"} 제품코드 KWS01 인정번호 {certificationNumber}
{/* ========== 3열 섹션: 신청업체 | 신청내용 | 납품정보 ========== */}
{/* 신청업체 */}
신청업체
수주일 {orderDate}
수주처 {client}
수주 담당자 {manager}
담당자 연락처 {managerContact}
{/* 신청내용 */}
신청내용
현장명 {siteName}
납기요청일 {deliveryRequestDate}
출고일 {expectedShipDate}
셔터출수량 {shutterCount}개소
{/* 납품정보 */}
납품정보
현장명 {siteName}
인수담당자 {recipientName}
인수자연락처 {recipientContact}
배송방법 {deliveryMethod}
{/* 배송지 주소 - 한 줄 병합 */}
배송지 주소
{address}

아래와 같이 주문하오니 품질 및 납기일을 준수하여 주시기 바랍니다.

{/* ========== 1. 스크린 ========== */}

1. 스크린

{MOCK_SCREEN_ROWS.map((row) => ( ))}
No 품류 부호 오픈사이즈 제작사이즈 가이드
레일
사프트
(인치)
케이스
(인치)
모터 마감
가로 세로 가로 세로 브라켓트 용량Kg
{row.no} {row.type} {row.code} {formatNumber(row.openW)} {formatNumber(row.openH)} {formatNumber(row.madeW)} {formatNumber(row.madeH)} {row.guideRail} {row.shaft} {row.caseInch} {row.bracket} {row.capacity} {row.finish}
{/* ========== 2. 철재 ========== */}

2. 철재

{MOCK_STEEL_ROWS.map((row) => ( ))}
No. 부호 오픈사이즈 제작사이즈 가이드
레일
사프트
(인치)
조인트바
(규격)
케이스
(인치)
모터 마감
가로 세로 가로 세로 브라켓트 용량Kg
{row.no} {row.code} {formatNumber(row.openW)} {formatNumber(row.openH)} {formatNumber(row.madeW)} {formatNumber(row.madeH)} {row.guideRail} {row.shaft} {row.jointBar} {row.caseInch} {row.bracket} {row.capacity} {row.finish}
{/* ========== 3. 모터 ========== */}

3. 모터

{Array.from({ length: motorRows }).map((_, i) => { const left = MOCK_MOTOR_LEFT[i]; const right = MOCK_MOTOR_RIGHT[i]; return ( ); })}
항목 구분 규격 수량 항목 구분 규격 수량
{left?.item || ''} {left?.type || ''} {left?.spec || ''} {left?.qty ?? ''} {right?.item || ''} {right?.type || ''} {right?.spec || ''} {right?.qty ?? ''}
{/* ========== 4. 절곡물 ========== */}

4. 절곡물

{/* 4-1. 가이드레일 */}

4-1. 가이드레일 - EGI 1.5ST + 마감재 EGI 1.1ST + 별도마감재 SUS 1.1ST

{MOCK_GUIDE_RAIL_ITEMS.map((item, i) => ( {i === 0 && ( )} ))}
백면형 (120X70) 항목 규격 수량
IMG
{item.name} {item.spec} {item.qty}
{/* 연기차단재 */}
  항목 규격 수량
IMG
{MOCK_GUIDE_SMOKE.name} {MOCK_GUIDE_SMOKE.spec} {MOCK_GUIDE_SMOKE.qty}

* 가이드레일 마감재 양측에 설치 - EGI 0.8T + 화이버글라스코팅직물

{/* 4-2. 케이스(셔터박스) */}

4-2. 케이스(셔터박스) - EGI 1.5ST

{MOCK_CASE_ITEMS.map((item, i) => ( {i === 0 && ( )} ))}
  항목 규격 수량
IMG
{item.name} {item.spec} {item.qty}
{/* 연기차단재 */}
  항목 규격 수량
IMG
{MOCK_CASE_SMOKE.name} {MOCK_CASE_SMOKE.spec} {MOCK_CASE_SMOKE.qty}

* 전면부, 판넬부 양측에 설치 - EGI 0.8T + 화이버글라스코팅직물

{/* 4-3. 하단마감재 (토글: 스크린 / 절재) */}
{bottomFinishView === 'screen' ? ( <>

4-3. 하단마감재 - 하단마감재(EGI 1.5ST) + 하단보강엘비(EGI 1.5ST) + 하단 보강평철(EGI 1.1ST) + 하단 무게평철(50X12T)

{MOCK_BOTTOM_SCREEN.map((row, i) => ( ))}
항목 규격 길이 수량 항목 규격 길이 수량
{row.name} {row.spec} {row.l1} {row.q1} {row.name2} {row.spec2} {row.l2} {row.q2}
) : ( <>

4-3. 하단마감재 -EGI 1.5ST

하단마감재 규격 길이 수량
IMG
{MOCK_BOTTOM_STEEL.spec} {MOCK_BOTTOM_STEEL.length} {MOCK_BOTTOM_STEEL.qty}
)}
{/* ========== 5. 부자재 ========== */}

5. 부자재

{MOCK_SUBSIDIARY.map((row, i) => ( ))}
항목 규격 수량 항목 규격 수량
{row.leftItem} {row.leftSpec} {row.leftQty} {row.rightItem} {row.rightSpec} {row.rightQty}
{/* ========== 특이사항 ========== */} {remarks && (

【 특이사항 】

{remarks}
)}
); }