diff options
| -rw-r--r-- | lib/pdftron/serverSDK/createBasicContractPdf.ts | 133 | ||||
| -rw-r--r-- | lib/vendors/table/request-pq-dialog.tsx | 267 | ||||
| -rw-r--r-- | pages/api/pdftron/createBasicContractPdf.ts | 16 |
3 files changed, 199 insertions, 217 deletions
diff --git a/lib/pdftron/serverSDK/createBasicContractPdf.ts b/lib/pdftron/serverSDK/createBasicContractPdf.ts index a2e0b350..706508e6 100644 --- a/lib/pdftron/serverSDK/createBasicContractPdf.ts +++ b/lib/pdftron/serverSDK/createBasicContractPdf.ts @@ -1,4 +1,7 @@ const { PDFNet } = require("@pdftron/pdfnet-node"); +const fs = require('fs').promises; +const path = require('path'); +import { file as tmpFile } from "tmp-promise"; type CreateBasicContractPdf = ( templateBuffer: Buffer, @@ -15,99 +18,43 @@ export const createBasicContractPdf: CreateBasicContractPdf = async ( templateBuffer, templateData ) => { - const main = async () => { - await PDFNet.initialize(process.env.NEXT_PUBLIC_PDFTRON_SERVER_KEY); + const result = await PDFNet.runWithCleanup(async () => { console.log("π PDFTron κΈ°λ³Έκ³μ½μ PDF λ³ν μμ"); console.log("π ν
νλ¦Ώ λ°μ΄ν°:", JSON.stringify(templateData, null, 2)); - // ν
νλ¦Ώ λ°μ΄ν°κ° μλ κ²½μ° λ³μ μΉν ν PDF λ³ν - if (Object.keys(templateData).length > 0) { - console.log("π ν
νλ¦Ώ λ³μ μΉν μμ"); - - try { - // createReport.ts λ°©μμ²λΌ ν
νλ¦Ώ λ³μ μΉν (UTF-8 μΈμ½λ© μ§μ) - const options = new PDFNet.Convert.OfficeToPDFOptions(); - - // UTF-8 μΈμ½λ© λͺ
μ μ€μ μλ - try { - options.setCharset("UTF-8"); - console.log("β
UTF-8 μΈμ½λ© μ€μ μλ£"); - } catch (charsetError) { - console.warn("β οΈ UTF-8 μΈμ½λ© μ€μ μ€ν¨, κΈ°λ³Έ μ€μ μ¬μ©:", charsetError); - } - - // ν
νλ¦Ώ λ°μ΄ν°λ₯Ό UTF-8λ‘ λͺ
μμ μΌλ‘ μΈμ½λ© - const templateDataJson = JSON.stringify(templateData, null, 2); - const utf8TemplateData = Buffer.from(templateDataJson, 'utf8').toString('utf8'); - console.log("π UTF-8 μΈμ½λ©λ ν
νλ¦Ώ λ°μ΄ν°:", utf8TemplateData); - - const tempPath = `/tmp/temp_template_${Date.now()}.docx`; - - // νμΌλ UTF-8λ‘ μ μ₯ (λ°μ΄λ리 λ°μ΄ν°λ κ·Έλλ‘ μ μ§) - require('fs').writeFileSync(tempPath, templateBuffer, { encoding: null }); // λ°μ΄λλ¦¬λ‘ μ μ₯ + // μμ νμΌ μμ± + const { path: tempDocxPath, cleanup } = await tmpFile({ + postfix: ".docx", + }); + + try { + // ν
νλ¦Ώ λ²νΌλ₯Ό μμ νμΌλ‘ μ μ₯ + await fs.writeFile(tempDocxPath, templateBuffer); + + let resultDoc; + + // ν
νλ¦Ώ λ°μ΄ν°κ° μλ κ²½μ° λ³μ μΉν, μμΌλ©΄ λ¨μ λ³ν + if (templateData && Object.keys(templateData).length > 0) { + console.log("π ν
νλ¦Ώ λ³μ μΉν μμ"); - // Office ν
νλ¦Ώ μμ± λ° λ³μ μΉν - const templateDoc = await PDFNet.Convert.createOfficeTemplateWithPath( - tempPath, - options + const template = await PDFNet.Convert.createOfficeTemplateWithPath( + tempDocxPath ); - - const filledDoc = await templateDoc.fillTemplateJson(utf8TemplateData); - - // μμ νμΌ μμ - require('fs').unlinkSync(tempPath); - - console.log("β
ν
νλ¦Ώ λ³μ μΉν λ° PDF λ³ν μλ£"); - - const buffer = await filledDoc.saveMemoryBuffer( - PDFNet.SDFDoc.SaveOptions.e_linearized + resultDoc = await template.fillTemplateJson( + JSON.stringify(templateData) ); - - return { - result: true, - buffer, - }; - } catch (templateError) { - console.warn("β οΈ ν
νλ¦Ώ λ³μ μΉν μ€ν¨, κΈ°λ³Έ λ³ν μν:", templateError); - - // ν
νλ¦Ώ μ²λ¦¬ μ€ν¨ μ κΈ°λ³Έ PDF λ³νλ§ μν (UTF-8 μΈμ½λ© μ μ©) - const fallbackOptions = new PDFNet.Convert.OfficeToPDFOptions(); - try { - fallbackOptions.setCharset("UTF-8"); - } catch (charsetError) { - console.warn("β οΈ ν΄λ°± UTF-8 μΈμ½λ© μ€μ μ€ν¨:", charsetError); - } + console.log("β
ν
νλ¦Ώ λ³μ μΉν λ° PDF λ³ν μλ£"); + } else { + console.log("π λ¨μ PDF λ³ν μν"); - const buf = await PDFNet.Convert.office2PDFBuffer(templateBuffer, fallbackOptions); - const templateDoc = await PDFNet.PDFDoc.createFromBuffer(buf); + resultDoc = await PDFNet.Convert.office2PDF(tempDocxPath); - const buffer = await templateDoc.saveMemoryBuffer( - PDFNet.SDFDoc.SaveOptions.e_linearized - ); - - return { - result: true, - buffer, - }; + console.log("β
λ¨μ PDF λ³ν μλ£"); } - } else { - // ν
νλ¦Ώ λ°μ΄ν°κ° μλ κ²½μ° λ¨μ λ³ν (UTF-8 μΈμ½λ© μ μ©) - console.log("π λ¨μ PDF λ³ν μν (UTF-8 μΈμ½λ©)"); - - const simpleOptions = new PDFNet.Convert.OfficeToPDFOptions(); - try { - simpleOptions.setCharset("UTF-8"); - console.log("β
λ¨μ λ³ν UTF-8 μΈμ½λ© μ€μ μλ£"); - } catch (charsetError) { - console.warn("β οΈ λ¨μ λ³ν UTF-8 μΈμ½λ© μ€μ μ€ν¨:", charsetError); - } - - const buf = await PDFNet.Convert.office2PDFBuffer(templateBuffer, simpleOptions); - const templateDoc = await PDFNet.PDFDoc.createFromBuffer(buf); - - const buffer = await templateDoc.saveMemoryBuffer( + + const buffer = await resultDoc.saveMemoryBuffer( PDFNet.SDFDoc.SaveOptions.e_linearized ); @@ -115,23 +62,13 @@ export const createBasicContractPdf: CreateBasicContractPdf = async ( result: true, buffer, }; + + } finally { + // μμ νμΌ μ 리 + await cleanup(); } - }; - - const result = await PDFNet.runWithCleanup( - main, + }, process.env.NEXT_PUBLIC_PDFTRON_SERVER_KEY - ) - .catch((err: any) => { - console.error("β PDFTron κΈ°λ³Έκ³μ½μ PDF λ³ν μ€λ₯:", err); - return { - result: false, - error: err, - }; - }) - .then(async (data: any) => { - return data; - }); - + ); return result; }; diff --git a/lib/vendors/table/request-pq-dialog.tsx b/lib/vendors/table/request-pq-dialog.tsx index 1df2d72c..226a053f 100644 --- a/lib/vendors/table/request-pq-dialog.tsx +++ b/lib/vendors/table/request-pq-dialog.tsx @@ -43,6 +43,7 @@ import { useSession } from "next-auth/react" import { DatePicker } from "@/components/ui/date-picker"
import { getALLBasicContractTemplates } from "@/lib/basic-contract/service"
import type { BasicContractTemplate } from "@/db/schema"
+// import { PQContractViewer } from "../pq-contract-viewer" // λ μ΄μ μ¬μ©νμ§ μμ
interface RequestPQDialogProps extends React.ComponentPropsWithoutRef<typeof Dialog> {
vendors: Row<Vendor>["original"][]
@@ -78,6 +79,7 @@ export function RequestPQDialog({ vendors, showTrigger = true, onSuccess, ...pro const [selectedTemplateIds, setSelectedTemplateIds] = React.useState<number[]>([])
const [isLoadingTemplates, setIsLoadingTemplates] = React.useState(false)
+
React.useEffect(() => {
if (type === "PROJECT") {
setIsLoadingProjects(true)
@@ -104,6 +106,7 @@ export function RequestPQDialog({ vendors, showTrigger = true, onSuccess, ...pro setPqItems("")
setExtraNote("")
setSelectedTemplateIds([])
+
}
}, [props.open])
@@ -116,7 +119,7 @@ export function RequestPQDialog({ vendors, showTrigger = true, onSuccess, ...pro startApproveTransition(async () => {
try {
// 1λ¨κ³: PQ μμ±
- console.log("π 1λ¨κ³: PQ μμ± μμ")
+ console.log("π PQ μμ± μμ")
const { error: pqError } = await requestPQVendors({
ids: vendors.map((v) => v.id),
userId: Number(session.user.id),
@@ -133,128 +136,156 @@ export function RequestPQDialog({ vendors, showTrigger = true, onSuccess, ...pro toast.error(`PQ μμ± μ€ν¨: ${pqError}`)
return
}
- console.log("β
1λ¨κ³: PQ μμ± μλ£")
+ console.log("β
PQ μμ± μλ£")
+ toast.success("PQκ° μ±κ³΅μ μΌλ‘ μμ²λμμ΅λλ€")
- // 2λ¨κ³ & 3λ¨κ³: κΈ°λ³Έκ³μ½μ ν
νλ¦Ώμ΄ μ νλ κ²½μ°μλ§ μ€ν (μ¬λ¬ ν
νλ¦Ώ μ²λ¦¬)
+ // 2λ¨κ³: κΈ°λ³Έκ³μ½μ ν
νλ¦Ώμ΄ μ νλ κ²½μ° λ°±κ·ΈλΌμ΄λμμ μ²λ¦¬
if (selectedTemplateIds.length > 0) {
- console.log(`π 2λ¨κ³ & 3λ¨κ³: ${selectedTemplateIds.length}κ° ν
νλ¦Ώ μ²λ¦¬ μμ`)
+ const templates = basicContractTemplates.filter(t =>
+ selectedTemplateIds.includes(t.id)
+ )
- let successCount = 0
- let errorCount = 0
- const errors: string[] = []
-
- // ν
νλ¦Ώλ³λ‘ λ°λ³΅ μ²λ¦¬
- for (let i = 0; i < selectedTemplateIds.length; i++) {
- const templateId = selectedTemplateIds[i]
- const selectedTemplate = basicContractTemplates.find(t => t.id === templateId)
-
- if (!selectedTemplate) {
- console.error(`ν
νλ¦Ώ ID ${templateId}λ₯Ό μ°Ύμ μ μμ΅λλ€`)
- errorCount++
- errors.push(`ν
νλ¦Ώ ID ${templateId}λ₯Ό μ°Ύμ μ μμ΅λλ€`)
- continue
- }
-
- try {
- console.log(`π [${i+1}/${selectedTemplateIds.length}] ${selectedTemplate.templateName} - 2λ¨κ³: DOCX to PDF λ³ν μμ`)
-
- // ν
νλ¦Ώ νμΌμ κ°μ Έμμ PDFλ‘ λ³ν
- const formData = new FormData()
-
- // ν
νλ¦Ώ νμΌ κ°μ Έμ€κΈ° (μλ²μμ νμΌ μ½κΈ°)
- const templateResponse = await fetch('/api/basic-contract/get-template', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ templateId })
- })
-
- if (!templateResponse.ok) {
- throw new Error(`ν
νλ¦Ώ νμΌμ κ°μ Έμ¬ μ μμ΅λλ€: ${selectedTemplate.templateName}`)
- }
- console.log(`β
[${i+1}/${selectedTemplateIds.length}] ${selectedTemplate.templateName} - ν
νλ¦Ώ νμΌ κ°μ Έμ€κΈ° μλ£`)
-
- const templateBlob = await templateResponse.blob()
- const templateFile = new File([templateBlob], selectedTemplate.fileName || 'template.docx')
-
- // ν
νλ¦Ώ λ°μ΄ν° μμ± (첫 λ²μ§Έ νλ ₯μ
체 μ 보 κΈ°λ°)
- const firstVendor = vendors[0]
- const templateData = {
- // μλ¬Έ λ³μλͺ
μΌλ‘ λ³κ²½ (PDFTronμ΄ νκΈ λ³μλͺ
μ μ§μνμ§ μμ)
- vendor_name: firstVendor?.vendorName || 'νλ ₯μ
체λͺ
',
- address: firstVendor?.address || 'μ£Όμ',
- representative_name: firstVendor?.representativeName || 'λνμλͺ
',
- today_date: new Date().toLocaleDateString('ko-KR'),
- }
-
- console.log(`π [${i+1}/${selectedTemplateIds.length}] ${selectedTemplate.templateName} - μμ±λ ν
νλ¦Ώ λ°μ΄ν°:`, templateData)
-
- formData.append('templateFile', templateFile)
- formData.append('outputFileName', `${selectedTemplate.templateName}_converted.pdf`)
- formData.append('templateData', JSON.stringify(templateData))
-
- // PDF λ³ν νΈμΆ
- const pdfResponse = await fetch('/api/pdftron/createBasicContractPdf', {
- method: 'POST',
- body: formData,
- })
- console.log(`β
[${i+1}/${selectedTemplateIds.length}] ${selectedTemplate.templateName} - PDF λ³ν νΈμΆ μλ£`)
-
- if (!pdfResponse.ok) {
- const errorText = await pdfResponse.text()
- throw new Error(`PDF λ³ν μ€ν¨ (${selectedTemplate.templateName}): ${errorText}`)
- }
-
- const pdfBuffer = await pdfResponse.arrayBuffer()
- console.log(`β
[${i+1}/${selectedTemplateIds.length}] ${selectedTemplate.templateName} - PDF λ³ν μλ£`)
-
- // 3λ¨κ³: λ³νλ PDFλ‘ κΈ°λ³Έκ³μ½ μμ±
- console.log(`π [${i+1}/${selectedTemplateIds.length}] ${selectedTemplate.templateName} - 3λ¨κ³: κΈ°λ³Έκ³μ½ μμ± μμ`)
- const { error: contractError } = await requestBasicContractInfo({
- vendorIds: vendors.map((v) => v.id),
- requestedBy: Number(session.user.id),
- templateId,
- pdfBuffer: new Uint8Array(pdfBuffer), // ArrayBufferλ₯Ό Uint8Arrayλ‘ λ³ννμ¬ μ λ¬
- })
-
- if (contractError) {
- console.error(`κΈ°λ³Έκ³μ½ μμ± μ€λ₯ (${selectedTemplate.templateName}):`, contractError)
- errorCount++
- errors.push(`${selectedTemplate.templateName}: ${contractError}`)
- } else {
- console.log(`β
[${i+1}/${selectedTemplateIds.length}] ${selectedTemplate.templateName} - 3λ¨κ³: κΈ°λ³Έκ³μ½ μμ± μλ£`)
- successCount++
- }
- } catch (templateError) {
- console.error(`ν
νλ¦Ώ μ²λ¦¬ μ€λ₯ (${selectedTemplate.templateName}):`, templateError)
- errorCount++
- errors.push(`${selectedTemplate.templateName}: ${templateError instanceof Error ? templateError.message : 'μ μ μλ μ€λ₯'}`)
- }
- }
-
- // κ²°κ³Ό ν μ€νΈ λ©μμ§
- if (successCount > 0 && errorCount === 0) {
- toast.success(`PQ μμ² λ° ${successCount}κ° κΈ°λ³Έκ³μ½μ μμ±μ΄ λͺ¨λ μλ£λμμ΅λλ€!`)
- } else if (successCount > 0 && errorCount > 0) {
- toast.success(`PQλ μ±κ³΅μ μΌλ‘ μμ²λμμ΅λλ€. ${successCount}κ° κΈ°λ³Έκ³μ½μ μ±κ³΅, ${errorCount}κ° μ€ν¨`)
- console.error('κΈ°λ³Έκ³μ½μ μμ± μ€λ₯λ€:', errors)
- } else if (errorCount > 0) {
- toast.error(`PQλ μ±κ³΅μ μΌλ‘ μμ²λμμ§λ§, λͺ¨λ κΈ°λ³Έκ³μ½μ μμ±μ΄ μ€ν¨νμ΅λλ€`)
- console.error('κΈ°λ³Έκ³μ½μ μμ± μ€λ₯λ€:', errors)
- }
- } else {
- // κΈ°λ³Έκ³μ½μ ν
νλ¦Ώμ΄ μ νλμ§ μμ κ²½μ°
- toast.success("PQκ° μ±κ³΅μ μΌλ‘ μμ²λμμ΅λλ€")
+ console.log("π κΈ°λ³Έκ³μ½μ λ°±κ·ΈλΌμ΄λ μ²λ¦¬ μμ", templates.length, "κ° ν
νλ¦Ώ")
+ await processBasicContractsInBackground(templates, vendors)
}
-
+
+ // μλ£ ν λ€μ΄μΌλ‘κ·Έ λ«κΈ°
props.onOpenChange?.(false)
onSuccess?.()
+
} catch (error) {
- console.error('μ 체 νλ‘μΈμ€ μ€λ₯:', error)
+ console.error('PQ μμ± μ€λ₯:', error)
toast.error(`μ²λ¦¬ μ€ μ€λ₯κ° λ°μνμ΅λλ€: ${error instanceof Error ? error.message : 'μ μ μλ μ€λ₯'}`)
}
})
}
+ // λ°±κ·ΈλΌμ΄λμμ κΈ°λ³Έκ³μ½μ μ²λ¦¬
+ const processBasicContractsInBackground = async (templates: BasicContractTemplate[], vendors: any[]) => {
+ if (!session?.user?.id) {
+ toast.error("μΈμ¦ μ λ³΄κ° μμ΅λλ€")
+ return
+ }
+
+ try {
+ const totalContracts = templates.length * vendors.length
+ let processedCount = 0
+
+ // κ° λ²€λλ³λ‘, κ° ν
νλ¦Ώμ μ²λ¦¬
+ for (let vendorIndex = 0; vendorIndex < vendors.length; vendorIndex++) {
+ const vendor = vendors[vendorIndex]
+
+ // λ²€λλ³ ν
νλ¦Ώ λ°μ΄ν° μμ±
+ const templateData = {
+ vendor_name: vendor.vendorName || 'νλ ₯μ
체λͺ
',
+ address: vendor.address || 'μ£Όμ',
+ representative_name: vendor.representativeName || 'λνμλͺ
',
+ today_date: new Date().toLocaleDateString('ko-KR'),
+ }
+
+ console.log(`π λ²€λ ${vendorIndex + 1}/${vendors.length} ν
νλ¦Ώ λ°μ΄ν°:`, templateData)
+
+ // ν΄λΉ λ²€λμ λν΄ κ° ν
νλ¦Ώμ μμ°¨μ μΌλ‘ μ²λ¦¬
+ for (let templateIndex = 0; templateIndex < templates.length; templateIndex++) {
+ const template = templates[templateIndex]
+ processedCount++
+
+ console.log(`π μ²λ¦¬ μ€: ${vendor.vendorName} - ${template.templateName} (${processedCount}/${totalContracts})`)
+
+ // κ°λ³ λ²€λμ λν κΈ°λ³Έκ³μ½ μμ±
+ await processTemplate(template, templateData, [vendor])
+
+ console.log(`β
μλ£: ${vendor.vendorName} - ${template.templateName}`)
+ }
+ }
+
+ toast.success(`μ΄ ${totalContracts}κ° κΈ°λ³Έκ³μ½μ΄ λͺ¨λ μμ±λμμ΅λλ€`)
+
+ } catch (error) {
+ console.error('κΈ°λ³Έκ³μ½ μ²λ¦¬ μ€ μ€λ₯:', error)
+ toast.error(`κΈ°λ³Έκ³μ½ μ²λ¦¬ μ€ μ€λ₯κ° λ°μνμ΅λλ€: ${error instanceof Error ? error.message : 'μ μ μλ μ€λ₯'}`)
+ }
+ }
+
+ const processTemplate = async (template: BasicContractTemplate, templateData: any, vendors: any[]) => {
+ try {
+ // 1. ν
νλ¦Ώ νμΌ κ°μ Έμ€κΈ°
+ const templateResponse = await fetch('/api/basic-contract/get-template', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ templateId: template.id })
+ })
+
+ if (!templateResponse.ok) {
+ throw new Error(`ν
νλ¦Ώ νμΌμ κ°μ Έμ¬ μ μμ΅λλ€: ${template.templateName}`)
+ }
+
+ const templateBlob = await templateResponse.blob()
+
+ // 2. PDFTronμ μ¬μ©ν΄μ λ³μ μΉν λ° PDF λ³ν
+ // @ts-ignore
+ const WebViewer = await import("@pdftron/webviewer").then(({ default: WebViewer }) => WebViewer)
+
+ // μμ WebViewer μΈμ€ν΄μ€ μμ± (DOMμ μΆκ°νμ§ μμ)
+ const tempDiv = document.createElement('div')
+ tempDiv.style.display = 'none'
+ document.body.appendChild(tempDiv)
+
+ const instance = await WebViewer(
+ {
+ path: "/pdftronWeb",
+ licenseKey: process.env.NEXT_PUBLIC_PDFTRON_WEBVIEW_KEY,
+ fullAPI: true,
+ },
+ tempDiv
+ )
+
+ try {
+ const { Core } = instance
+ const { createDocument } = Core
+
+ // 3. ν
νλ¦Ώ λ¬Έμ μμ± λ° λ³μ μΉν
+ const templateDoc = await createDocument(templateBlob, {
+ filename: template.fileName || 'template.docx',
+ extension: 'docx',
+ })
+
+ console.log("π λ³μ μΉν μμ:", templateData)
+ await templateDoc.applyTemplateValues(templateData)
+ console.log("β
λ³μ μΉν μλ£")
+
+ // 4. PDF λ³ν
+ const fileData = await templateDoc.getFileData()
+ const pdfBuffer = await Core.officeToPDFBuffer(fileData, { extension: 'docx' })
+
+ console.log(`β
PDF λ³ν μλ£: ${template.templateName}`, `ν¬κΈ°: ${pdfBuffer.byteLength} bytes`)
+
+ // 5. κΈ°λ³Έκ³μ½ μμ± μμ²
+ const { error: contractError } = await requestBasicContractInfo({
+ vendorIds: vendors.map((v) => v.id),
+ requestedBy: Number(session!.user.id),
+ templateId: template.id,
+ pdfBuffer: new Uint8Array(pdfBuffer),
+ })
+
+ if (contractError) {
+ throw new Error(contractError)
+ }
+
+ console.log(`β
κΈ°λ³Έκ³μ½ μμ± μλ£: ${template.templateName}`)
+
+ } finally {
+ // μμ WebViewer μ 리
+ instance.UI.dispose()
+ document.body.removeChild(tempDiv)
+ }
+
+ } catch (error) {
+ console.error(`β ν
νλ¦Ώ μ²λ¦¬ μ€ν¨: ${template.templateName}`, error)
+ throw error
+ }
+ }
+
const dialogContent = (
<div className="space-y-4 py-2">
{/* μ νλ νλ ₯μ
체 μ 보 */}
@@ -309,7 +340,15 @@ export function RequestPQDialog({ vendors, showTrigger = true, onSuccess, ...pro <Label htmlFor="dueDate">PQ μ μΆ λ§κ°μΌ</Label>
<DatePicker
date={dueDate ? new Date(dueDate) : undefined}
- onSelect={(date?: Date) => setDueDate(date ? date.toISOString().slice(0, 10) : "")}
+ onSelect={(date?: Date) => {
+ if (date) {
+ // νκ΅ μκ°λλ‘ λ μ§ λ³ν (UTC λ³νμΌλ‘ μΈν λ μ§ λ³κ²½ λ°©μ§)
+ const kstDate = new Date(date.getTime() - date.getTimezoneOffset() * 60000)
+ setDueDate(kstDate.toISOString().slice(0, 10))
+ } else {
+ setDueDate("")
+ }
+ }}
placeholder="λ§κ°μΌ μ ν"
/>
</div>
@@ -421,6 +460,8 @@ export function RequestPQDialog({ vendors, showTrigger = true, onSuccess, ...pro </Button>
</DialogFooter>
</DialogContent>
+
+
</Dialog>
)
}
@@ -452,6 +493,8 @@ export function RequestPQDialog({ vendors, showTrigger = true, onSuccess, ...pro </Button>
</DrawerFooter>
</DrawerContent>
+
+
</Drawer>
)
}
diff --git a/pages/api/pdftron/createBasicContractPdf.ts b/pages/api/pdftron/createBasicContractPdf.ts index 1122c022..376d8540 100644 --- a/pages/api/pdftron/createBasicContractPdf.ts +++ b/pages/api/pdftron/createBasicContractPdf.ts @@ -294,13 +294,15 @@ export default async function handler( // 4. μλ³Έ νμΌ μ½κΈ° const originalBuffer = await fs.readFile(templateFile.filepath); - + // const publicDir = path.join(process.cwd(), "public", "basicContract"); + // const testBuffer = await fs.readFile(path.join(publicDir, "test123.docx")); + // console.log(testBuffer); // 5. DRM 볡νΈν μ²λ¦¬ (보μ κ²μ¦ ν¬ν¨) - console.log(`π [${requestId}] DRM 볡νΈν μμ: ${templateFile.originalFilename || 'unknown'}`); - const decryptedBuffer = await decryptBufferWithDRM( - originalBuffer, - templateFile.originalFilename || 'template.docx' - ); + // console.log(`π [${requestId}] DRM 볡νΈν μμ: ${templateFile.originalFilename || 'unknown'}`); + // const decryptedBuffer = await decryptBufferWithDRM( + // originalBuffer, + // templateFile.originalFilename || 'template.docx' + // ); // 6. 볡νΈνλ λ²νΌλ‘ κΈ°λ³Έκ³μ½μ PDF μμ± console.log(`π [${requestId}] κΈ°λ³Έκ³μ½μ PDF μμ± μμ`); @@ -308,7 +310,7 @@ export default async function handler( result, buffer: pdfBuffer, error, - } = await createBasicContractPdf(decryptedBuffer, templateData); + } = await createBasicContractPdf(originalBuffer, templateData); if (result && pdfBuffer) { console.log(`β
[${requestId}] κΈ°λ³Έκ³μ½μ PDF μμ± μ±κ³΅: ${outputFileName}`); |
