summaryrefslogtreecommitdiff
path: root/src/app/api/stock-opname/export/route.tsx
blob: 1595f2029767ef2db31aff4c1d6c4879a1484620 (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
import { StockOpnameLocationRes } from "@/common/types/stockOpname";
import { Product } from "@prisma/client";
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "prisma/client";
import * as XLSX from "xlsx"

const SELF_HOST = process.env.SELF_HOST as string

export async function GET(request: NextRequest) {
  const searchParams = request.nextUrl.searchParams
  const paramCompanyId = searchParams.get('companyId')

  if (!paramCompanyId) return NextResponse.json({ error: 'Bad Request. Missing companyId' }, { status: 400 })

  const companyId = parseInt(paramCompanyId)

  const stockOpnames = await prisma.stockOpname.groupBy({
    by: ['productId'],
    where: { companyId }
  })

  type SOLocationProduct = (StockOpnameLocationRes & { product: Product | null })

  const datas: SOLocationProduct[] = []

  for (const opname of stockOpnames) {
    const requestParams = new URLSearchParams({
      productId: opname.productId.toString(),
      companyId: companyId.toString()
    })
    const detailsFetch = await fetch(`${SELF_HOST}/api/stock-opname/location?${requestParams}`)
    const details: StockOpnameLocationRes[] = await detailsFetch.json()

    const product = await prisma.product.findFirst({ where: { id: opname.productId } })
    const mappedData: SOLocationProduct[] = details.map((data) => ({
      ...data,
      product
    }))

    datas.push(...mappedData)
  }

  const dataSheet = datas.map((data) => ({
    location: data.name,
    name: data.product?.name,
    itemCode: data.product?.itemCode,
    barcode: data.product?.barcode,
    onhandQty: data.product?.onhandQty,
    differenceQty: data.product?.differenceQty,
    count1: data.COUNT1.quantity,
    count2: data.COUNT2.quantity,
    count3: data.COUNT3.quantity,
    verification: data.VERIFICATION.quantity,
    isDifferent: data.product?.isDifferent
  }))

  const worksheet = XLSX.utils.json_to_sheet(dataSheet)
  const workbook = XLSX.utils.book_new()
  XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1")
  const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', 'type': 'buffer' })

  return new NextResponse(excelBuffer, {
    headers: {
      'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      'Content-Disposition': 'attachment; filename=export.xlsx'
    }
  })
}