summaryrefslogtreecommitdiff
path: root/lib/vendor-basic-info/actions.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-09-01 09:09:15 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-09-01 09:09:15 +0000
commit089c70ffbe2303ab5e2611a152ddd3aed0e6e718 (patch)
tree1ce91012dba99495dde5eb8b414b2732197bfec4 /lib/vendor-basic-info/actions.ts
parent69648a25c2ac62bbc3354b3a0e41abc932273b7c (diff)
(최겸) 구매 pq, 기본정보 수정
Diffstat (limited to 'lib/vendor-basic-info/actions.ts')
-rw-r--r--lib/vendor-basic-info/actions.ts193
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