diff options
Diffstat (limited to 'lib/vendor-basic-info/actions.ts')
| -rw-r--r-- | lib/vendor-basic-info/actions.ts | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/lib/vendor-basic-info/actions.ts b/lib/vendor-basic-info/actions.ts new file mode 100644 index 00000000..8428deb9 --- /dev/null +++ b/lib/vendor-basic-info/actions.ts @@ -0,0 +1,193 @@ +"use server"; + +import { getVendorBasicInfo } from "@/lib/vendors/service"; +import { VendorFormData } from "./types"; +import { getPQDataByVendorId } from "@/lib/pq/service"; +import db from "@/db/db" +import { vendorPQSubmissions, vendorPqCriteriaAnswers, pqCriterias, vendorCriteriaAttachments, vendorAdditionalInfo } from "@/db/schema" +import { vendorBusinessContacts } from "@/db/schema" + +import { eq } from "drizzle-orm"; + +/** + * 벤더 기본정보를 가져오는 서버 액션 + */ +export async function getVendorData(vendorId: string) { + try { + const id = parseInt(vendorId); + if (isNaN(id)) { + return null; + } + + const vendorData = await getVendorBasicInfo(id); + return vendorData; + } catch (error) { + console.error("Error in getVendorData:", error); + return null; + } +} + +/** + * 벤더의 PQ 데이터를 가져오는 서버 액션 + */ +export async function getVendorPQData(vendorId: string) { + try { + const id = parseInt(vendorId); + if (isNaN(id)) { + return null; + } + + const pqData = await getPQDataByVendorId(id); + return pqData; + } catch (error) { + console.error("Error in getVendorPQData:", error); + return null; + } +} + +/** + * 벤더의 PQ 제출 데이터와 답변을 가져오는 서버 액션 + */ +export async function getVendorPQSubmissionData(vendorId: string) { + try { + const id = parseInt(vendorId); + if (isNaN(id)) { + return null; + } + + // 벤더의 모든 PQ 제출 데이터 조회 + const submissions = await db + .select() + .from(vendorPQSubmissions) + .where(eq(vendorPQSubmissions.vendorId, id)); + + if (submissions.length === 0) { + return null; + } + + // 각 제출에 대한 답변 데이터 조회 + const submissionData = await Promise.all( + submissions.map(async (submission) => { + const answers = await db + .select({ + id: vendorPqCriteriaAnswers.id, + vendorId: vendorPqCriteriaAnswers.vendorId, + criteriaId: vendorPqCriteriaAnswers.criteriaId, + projectId: vendorPqCriteriaAnswers.projectId, + answer: vendorPqCriteriaAnswers.answer, + shiComment: vendorPqCriteriaAnswers.shiComment, + vendorReply: vendorPqCriteriaAnswers.vendorReply, + createdAt: vendorPqCriteriaAnswers.createdAt, + updatedAt: vendorPqCriteriaAnswers.updatedAt, + criteriaCode: pqCriterias.code, + checkPoint: pqCriterias.checkPoint, + description: pqCriterias.description, + groupName: pqCriterias.groupName, + subGroupName: pqCriterias.subGroupName, + inputFormat: pqCriterias.inputFormat + }) + .from(vendorPqCriteriaAnswers) + .leftJoin(pqCriterias, eq(vendorPqCriteriaAnswers.criteriaId, pqCriterias.id)) + .where(eq(vendorPqCriteriaAnswers.vendorId, id)); + + // 각 답변에 대한 첨부파일 정보 조회 + const answersWithAttachments = await Promise.all( + answers.map(async (answer) => { + const attachments = await db + .select({ + id: vendorCriteriaAttachments.id, + fileName: vendorCriteriaAttachments.fileName, + originalFileName: vendorCriteriaAttachments.originalFileName, + filePath: vendorCriteriaAttachments.filePath, + fileType: vendorCriteriaAttachments.fileType, + fileSize: vendorCriteriaAttachments.fileSize + }) + .from(vendorCriteriaAttachments) + .where(eq(vendorCriteriaAttachments.vendorCriteriaAnswerId, answer.id)); + + return { + ...answer, + uploadedFiles: attachments + }; + }) + ); + + return { + submission, + answers: answersWithAttachments + }; + }) + ); + + return submissionData; + } catch (error) { + console.error("Error in getVendorPQSubmissionData:", error); + return null; + } +} + +/** + * 벤더의 추가정보를 가져오는 서버 액션 + */ +export async function getVendorAdditionalInfo(vendorId: string) { + try { + const id = parseInt(vendorId); + if (isNaN(id)) { + return null; + } + + const additionalInfo = await db + .select() + .from(vendorAdditionalInfo) + .where(eq(vendorAdditionalInfo.vendorId, id)); + + return additionalInfo.length > 0 ? additionalInfo[0] : null; + } catch (error) { + console.error("Error in getVendorAdditionalInfo:", error); + return null; + } +} + +/** + * 벤더의 업무담당자 정보를 가져오는 서버 액션 + */ +export async function getVendorBusinessContacts(vendorId: string) { + try { + const id = parseInt(vendorId); + if (isNaN(id)) { + return []; + } + + const rows = await db + .select() + .from(vendorBusinessContacts) + .where(eq(vendorBusinessContacts.vendorId, id)); + + return rows; + } catch (error) { + console.error("Error in getVendorBusinessContacts:", error); + return []; + } +} + +/** + * 벤더 기본정보를 업데이트하는 서버 액션 (향후 구현) + */ +export async function updateVendorData(vendorId: string, formData: VendorFormData) { + try { + // TODO: 실제 업데이트 로직 구현 + console.log("Updating vendor data:", { vendorId, formData }); + + // 임시로 성공 응답 반환 + return { + success: true, + message: "(개발중입니다) 벤더 정보가 성공적으로 업데이트되었습니다.", + }; + } catch (error) { + console.error("Error in updateVendorData:", error); + return { + success: false, + message: "업데이트 중 오류가 발생했습니다.", + }; + } +}
\ No newline at end of file |
