'use client'; import { Dialog, DialogContent, DialogTitle, VisuallyHidden, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Edit, Trash2, Printer, X } from 'lucide-react'; import { toast } from 'sonner'; import { printArea } from '@/lib/print-utils'; import type { ProgressBillingDetailFormData } from '../types'; // 숫자 포맷팅 (천단위 콤마) function formatNumber(num: number | undefined): string { if (num === undefined || num === null) return '-'; return num.toLocaleString('ko-KR'); } interface DirectConstructionModalProps { open: boolean; onOpenChange: (open: boolean) => void; data: ProgressBillingDetailFormData; } // 직접 공사 내역 아이템 타입 interface DirectConstructionItem { id: string; name: string; product: string; width: number; height: number; quantity: number; unit: string; contractUnitPrice: number; contractAmount: number; prevQuantity: number; prevAmount: number; currentQuantity: number; currentAmount: number; cumulativeQuantity: number; cumulativeAmount: number; remark?: string; } // 목업 데이터 생성 function generateMockItems(billingItems: ProgressBillingDetailFormData['billingItems']): DirectConstructionItem[] { return billingItems.map((item, index) => ({ id: item.id, name: item.name || '명칭', product: item.product || '제품명', width: item.width || 2500, height: item.height || 3200, quantity: 1, unit: 'EA', contractUnitPrice: 2500000, contractAmount: 2500000, prevQuantity: index < 4 ? 0 : 0.8, prevAmount: index < 4 ? 0 : 1900000, currentQuantity: 0.8, currentAmount: 1900000, cumulativeQuantity: 0.8, cumulativeAmount: 1900000, remark: '', })); } export function DirectConstructionModal({ open, onOpenChange, data, }: DirectConstructionModalProps) { // 핸들러 const handleEdit = () => { toast.info('수정 기능은 준비 중입니다.'); }; const handleDelete = () => { toast.info('삭제 기능은 준비 중입니다.'); }; const handlePrint = () => { printArea({ title: '직접 공사 내역서 인쇄' }); }; // 목업 데이터 const items = generateMockItems(data.billingItems); // 합계 계산 const totalContractAmount = items.reduce((sum, item) => sum + item.contractAmount, 0); const totalCurrentAmount = items.reduce((sum, item) => sum + item.currentAmount, 0); const totalCumulativeAmount = items.reduce((sum, item) => sum + item.cumulativeAmount, 0); return ( 직접 공사 내역서 {/* 헤더 영역 */}

직접 공사 내역서

{/* 버튼 영역 */}
{/* 문서 영역 */}
{/* 상단: 제목 + 결재란 */}
{/* 좌측: 제목 및 문서 정보 */}

직접 공사 내역서

문서번호: {data.billingNumber || 'ABC123'} | 작성일자: 2025년 11월 11일
{/* 우측: 결재란 */}

작성 승인
홍길동 이름
부서명 부서명
{/* 기성내역 제목 */}
기성내역 제{data.billingRound || 1}회 ({data.billingYearMonth || '2025년 11월'})
{/* 현장 정보 */}
■ 현장: {data.siteName || '현장명'}
{/* 테이블 */}
{/* 1행: 상위 헤더 */} {/* 2행: 하위 헤더 */} {items.map((item, index) => ( ))} {/* 합계 행 */}
No. 명칭 제품 규격 mm 수량 단위 계약금액 전회기성 금회기성 누계기성 비고
가로 세로 단가 금액 수량 금액 수량 금액 수량 금액
{index + 1} {item.name} {item.product} {formatNumber(item.width)} {formatNumber(item.height)} {item.quantity} {item.unit} {formatNumber(item.contractUnitPrice)} {formatNumber(item.contractAmount)} {item.prevQuantity || '-'} {item.prevAmount ? formatNumber(item.prevAmount) : '-'} {item.currentQuantity} {formatNumber(item.currentAmount)} {item.cumulativeQuantity} {formatNumber(item.cumulativeAmount)} {item.remark || ''}
합계 {formatNumber(totalContractAmount)} {formatNumber(totalCurrentAmount)} {formatNumber(totalCumulativeAmount)}
); }