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'
}
})
}
|