summaryrefslogtreecommitdiff
path: root/lib/vendor-candidates/table/excel-template-download.tsx
blob: b69ab821cf0872e3f25ce174edef68b4ac37f6d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
"use client"

import { type Table } from "@tanstack/react-table"
import ExcelJS from "exceljs"
import { VendorCandidates } from "@/db/schema/vendors"

/**
 * Export an empty template for vendor candidates with column headers
 * matching the expected import format
 */
export async function exportVendorCandidateTemplate() {
  // Create a new workbook and worksheet
  const workbook = new ExcelJS.Workbook()
  const worksheet = workbook.addWorksheet("Vendor Candidates")
  
  // Define the columns with expected headers
  const columns = [
    { header: "Company Name", key: "companyName", width: 30 },
    { header: "Contact Email", key: "contactEmail", width: 30 },
    { header: "Contact Phone", key: "contactPhone", width: 20 },
    { header: "Country", key: "country", width: 20 },
    { header: "Source", key: "source", width: 20 },
    { header: "Status", key: "status", width: 15 },
  ]
  
  // Add columns to the worksheet
  worksheet.columns = columns
  
  // Style the header row
  const headerRow = worksheet.getRow(1)
  headerRow.font = { bold: true }
  headerRow.alignment = { horizontal: "center" }
  headerRow.eachCell((cell) => {
    cell.fill = {
      type: "pattern",
      pattern: "solid",
      fgColor: { argb: "FFCCCCCC" },
    }
  })
  
  // Add example data rows
  const exampleData = [
    {
      companyName: "ABC Corporation",
      contactEmail: "contact@abc.com",
      contactPhone: "+1-123-456-7890",
      country: "US",
      source: "Website",
      status: "COLLECTED",
    },
    {
      companyName: "XYZ Ltd.",
      contactEmail: "info@xyz.com",
      contactPhone: "+44-987-654-3210",
      country: "GB",
      source: "Referral",
      status: "COLLECTED",
    },
  ]
  
  // Add the example rows to the worksheet
  exampleData.forEach((data) => {
    worksheet.addRow(data)
  })
  
  // Add data validation for Status column
  const statusValues = ["COLLECTED", "INVITED", "DISCARDED"]
  for (let i = 2; i <= 100; i++) { // Apply to rows 2-100
    worksheet.getCell(`F${i}`).dataValidation = {
      type: 'list',
      allowBlank: true,
      formulae: [`"${statusValues.join(',')}"`]
    }
  }
  
  // Add instructions row
  worksheet.insertRow(1, ["Please fill in the data below. Required fields: Company Name, Contact Email"])
  worksheet.mergeCells("A1:F1")
  const instructionRow = worksheet.getRow(1)
  instructionRow.font = { bold: true, color: { argb: "FF0000FF" } }
  instructionRow.alignment = { horizontal: "center" }
  
  // Download the workbook
  const buffer = await workbook.xlsx.writeBuffer()
  const blob = new Blob([buffer], {
    type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  })
  const url = URL.createObjectURL(blob)
  const link = document.createElement("a")
  link.href = url
  link.download = "vendor-candidates-template.xlsx"
  link.click()
  URL.revokeObjectURL(url)
}