From 6f22fc9ebc8d175041aa18cf0986592e57d03f63 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Thu, 3 Jul 2025 02:47:09 +0000 Subject: (최겸) 기술영업 벤더별 아이템 조회 기능 추가 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table/excel-template.tsx | 137 +++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 lib/tech-vendor-possible-items/table/excel-template.tsx (limited to 'lib/tech-vendor-possible-items/table/excel-template.tsx') diff --git a/lib/tech-vendor-possible-items/table/excel-template.tsx b/lib/tech-vendor-possible-items/table/excel-template.tsx new file mode 100644 index 00000000..70a7eddf --- /dev/null +++ b/lib/tech-vendor-possible-items/table/excel-template.tsx @@ -0,0 +1,137 @@ +import * as ExcelJS from 'exceljs'; +import { saveAs } from "file-saver"; + +/** + * 기술영업 벤더 가능 아이템 Import를 위한 Excel 템플릿 파일 생성 및 다운로드 + */ +export async function exportTechVendorPossibleItemsTemplate() { + // 워크북 생성 + const workbook = new ExcelJS.Workbook(); + workbook.creator = 'Tech Vendor Possible Items Management System'; + workbook.created = new Date(); + + // 워크시트 생성 + const worksheet = workbook.addWorksheet('기술영업 벤더 가능 아이템'); + + // 컬럼 헤더 정의 및 스타일 적용 + worksheet.columns = [ + { header: '아이템코드', key: 'itemCode', width: 20 }, + { header: '벤더코드', key: 'vendorCode', width: 15 }, + { header: '벤더이메일', key: 'vendorEmail', width: 30 }, + ]; + + // 헤더 스타일 적용 + const headerRow = worksheet.getRow(1); + headerRow.eachCell((cell) => { + cell.fill = { + type: 'pattern', + pattern: 'solid', + fgColor: { argb: 'FFE6F3FF' } + }; + cell.font = { + bold: true, + color: { argb: 'FF1F4E79' } + }; + cell.border = { + top: { style: 'thin' }, + left: { style: 'thin' }, + bottom: { style: 'thin' }, + right: { style: 'thin' } + }; + cell.alignment = { + vertical: 'middle', + horizontal: 'center' + }; + }); + + // 샘플 데이터 추가 + const sampleData = [ + { itemCode: 'ITEM001', vendorCode: 'V001', vendorEmail: '' }, + { itemCode: 'ITEM001', vendorCode: 'V002', vendorEmail: '' }, + { itemCode: 'ITEM002', vendorCode: '', vendorEmail: 'vendor@example.com' }, + { itemCode: 'ITEM002', vendorCode: 'V002', vendorEmail: '' }, + { itemCode: 'ITEM004', vendorCode: '', vendorEmail: 'vendor2@example.com' }, + ]; + + sampleData.forEach((data) => { + const row = worksheet.addRow(data); + row.eachCell((cell) => { + cell.border = { + top: { style: 'thin' }, + left: { style: 'thin' }, + bottom: { style: 'thin' }, + right: { style: 'thin' } + }; + cell.alignment = { + vertical: 'middle', + horizontal: 'left' + }; + }); + }); + + // 안내사항 워크시트 생성 + const guideSheet = workbook.addWorksheet('사용 가이드'); + + const guideData = [ + ['기술영업 벤더 가능 아이템 Import 템플릿', ''], + ['', ''], + ['📋 사용 방법:', ''], + ['1. "기술영업 벤더 가능 아이템" 시트에 데이터를 입력하세요', ''], + ['2. 벤더 식별: 벤더코드 또는 벤더이메일 중 하나는 반드시 입력', ''], + [' • 벤더코드가 있으면 벤더코드를 우선 사용', ''], + [' • 벤더코드가 없으면 벤더이메일로 벤더 검색', ''], + ['3. 아이템코드는 실제 존재하는 아이템코드를 사용하세요', ''], + ['4. 한 아이템코드에 여러 벤더를 매핑할 수 있습니다 (1:N 관계)', ''], + ['5. 중복된 벤더-아이템 조합은 무시됩니다', ''], + ['6. 파일 저장 후 시스템에서 업로드하세요', ''], + ['', ''], + ['⚠️ 중요 사항:', ''], + ['- 벤더코드 또는 벤더이메일 중 하나는 반드시 필요', ''], + ['- 벤더코드가 우선, 없으면 벤더이메일로 검색', ''], + ['- 중복된 벤더-아이템 조합은 건너뜁니다', ''], + ['- 오류가 있는 항목은 별도 파일로 다운로드됩니다', ''], + ['- 빈 셀이 있으면 해당 행은 무시됩니다', ''], + ['', ''], + ['💡 팁:', ''], + ['- 벤더코드만 존재하면 어떤 아이템코드든 입력 가능합니다', ''], + ['- 아이템코드는 그대로 시스템에 저장됩니다', ''], + ['', ''], + ['📞 문의사항이 있으시면 시스템 관리자에게 연락하세요.', ''], + ]; + + guideData.forEach((rowData, index) => { + const row = guideSheet.addRow(rowData); + if (index === 0) { + // 제목 스타일 + row.getCell(1).font = { bold: true, size: 16, color: { argb: 'FF1F4E79' } }; + } else if (rowData[0]?.includes(':')) { + // 섹션 제목 스타일 + row.getCell(1).font = { bold: true, color: { argb: 'FF1F4E79' } }; + } else if (rowData[0]?.includes('•') || rowData[0]?.includes('-')) { + // 리스트 아이템 스타일 + row.getCell(1).font = { color: { argb: 'FF333333' } }; + } + }); + + guideSheet.getColumn(1).width = 70; + guideSheet.getColumn(2).width = 20; + + // 파일 생성 및 다운로드 + try { + const buffer = await workbook.xlsx.writeBuffer(); + const blob = new Blob([buffer], { + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + }); + + const fileName = `기술영업_벤더_가능_아이템_템플릿_${new Date().toISOString().split('T')[0]}.xlsx`; + saveAs(blob, fileName); + + return { success: true }; + } catch (error) { + console.error("Excel 템플릿 생성 중 오류:", error); + return { + success: false, + error: error instanceof Error ? error.message : "템플릿 생성 중 오류가 발생했습니다." + }; + } +} \ No newline at end of file -- cgit v1.2.3