summaryrefslogtreecommitdiff
path: root/lib/vendor-regular-registrations
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendor-regular-registrations')
-rw-r--r--lib/vendor-regular-registrations/repository.ts614
1 files changed, 307 insertions, 307 deletions
diff --git a/lib/vendor-regular-registrations/repository.ts b/lib/vendor-regular-registrations/repository.ts
index 314afb6c..3713f628 100644
--- a/lib/vendor-regular-registrations/repository.ts
+++ b/lib/vendor-regular-registrations/repository.ts
@@ -1,307 +1,307 @@
-import db from "@/db/db";
-import {
- vendorRegularRegistrations,
- vendors,
- vendorAttachments,
- vendorInvestigationAttachments,
- basicContract,
- basicContractTemplates,
- vendorPQSubmissions,
- vendorInvestigations,
- vendorBusinessContacts,
- vendorAdditionalInfo,
-} from "@/db/schema";
-import { eq, desc, and, sql, inArray } from "drizzle-orm";
-import type { VendorRegularRegistration } from "@/config/vendorRegularRegistrationsColumnsConfig";
-
-export async function getVendorRegularRegistrations(
-): Promise<VendorRegularRegistration[]> {
- try {
- // DB 레코드 기준으로 정규업체등록 데이터를 가져옴
- const registrations = await db
- .select({
- // 정규업체등록 정보
- id: vendorRegularRegistrations.id,
- vendorId: vendorRegularRegistrations.vendorId,
- status: vendorRegularRegistrations.status,
- potentialCode: vendorRegularRegistrations.potentialCode,
- majorItems: vendorRegularRegistrations.majorItems,
- registrationRequestDate: vendorRegularRegistrations.registrationRequestDate,
- assignedDepartment: vendorRegularRegistrations.assignedDepartment,
- assignedUser: vendorRegularRegistrations.assignedUser,
- remarks: vendorRegularRegistrations.remarks,
- // 새로 추가된 필드들
- safetyQualificationContent: vendorRegularRegistrations.safetyQualificationContent,
- gtcSkipped: vendorRegularRegistrations.gtcSkipped,
- // 벤더 기본 정보
- businessNumber: vendors.taxId,
- companyName: vendors.vendorName,
- establishmentDate: vendors.createdAt,
- representative: vendors.representativeName,
- // 국가 정보 추가
- country: vendors.country,
- })
- .from(vendorRegularRegistrations)
- .innerJoin(vendors, eq(vendorRegularRegistrations.vendorId, vendors.id))
- .orderBy(desc(vendorRegularRegistrations.createdAt));
-
- // 벤더 ID 배열 생성
- const vendorIds = registrations.map(r => r.vendorId);
-
- // 벤더 첨부파일 정보 조회 - 벤더별로 그룹화
- const vendorAttachmentsList = vendorIds.length > 0 ? await db
- .select()
- .from(vendorAttachments)
- .where(inArray(vendorAttachments.vendorId, vendorIds)) : [];
-
- // 실사 첨부파일 정보 조회 - 실사 ID를 통해 벤더 ID 매핑
- const investigationAttachmentsList = vendorIds.length > 0 ? await db
- .select({
- vendorId: vendorInvestigations.vendorId,
- attachmentId: vendorInvestigationAttachments.id,
- fileName: vendorInvestigationAttachments.fileName,
- attachmentType: vendorInvestigationAttachments.attachmentType,
- createdAt: vendorInvestigationAttachments.createdAt,
- })
- .from(vendorInvestigationAttachments)
- .innerJoin(vendorInvestigations, eq(vendorInvestigationAttachments.investigationId, vendorInvestigations.id))
- .where(inArray(vendorInvestigations.vendorId, vendorIds)) : [];
-
- // 기본 계약 정보 조회 (템플릿별로 가장 최신 것만)
- const basicContractsList = vendorIds.length > 0 ? await db
- .select({
- vendorId: basicContract.vendorId,
- templateId: basicContract.templateId,
- status: basicContract.status,
- templateName: basicContractTemplates.templateName,
- createdAt: basicContract.createdAt,
- filePath: basicContract.filePath,
- fileName: basicContract.fileName,
- })
- .from(basicContract)
- .leftJoin(basicContractTemplates, eq(basicContract.templateId, basicContractTemplates.id))
- .where(inArray(basicContract.vendorId, vendorIds))
- .orderBy(desc(basicContract.createdAt)) : [];
-
- // 추가정보 입력 상태 조회 (업무담당자 정보)
- const businessContactsList = vendorIds.length > 0 ? await db
- .select({
- vendorId: vendorBusinessContacts.vendorId,
- contactType: vendorBusinessContacts.contactType,
- })
- .from(vendorBusinessContacts)
- .where(inArray(vendorBusinessContacts.vendorId, vendorIds)) : [];
-
- // 추가정보 테이블 조회
- const additionalInfoList = vendorIds.length > 0 ? await db
- .select({
- vendorId: vendorAdditionalInfo.vendorId,
- })
- .from(vendorAdditionalInfo)
- .where(inArray(vendorAdditionalInfo.vendorId, vendorIds)) : [];
-
- // 각 등록 레코드별로 데이터를 매핑하여 결과 반환
- return registrations.map((registration) => {
- // 벤더별 첨부파일 필터링
- const vendorFiles = vendorAttachmentsList.filter(att => att.vendorId === registration.vendorId);
- const investigationFiles = investigationAttachmentsList.filter(att => att.vendorId === registration.vendorId);
- const allVendorContracts = basicContractsList.filter(contract => contract.vendorId === registration.vendorId);
- const vendorContacts = businessContactsList.filter(contact => contact.vendorId === registration.vendorId);
- const vendorAdditionalInfoData = additionalInfoList.filter(info => info.vendorId === registration.vendorId);
-
- // 기술자료 동의서, 비밀유지계약서 제외 필터링
- const filteredContracts = allVendorContracts.filter(contract => {
- const templateName = contract.templateName?.toLowerCase() || '';
- return !templateName.includes('기술자료') && !templateName.includes('비밀유지');
- });
-
- // 템플릿명 기준으로 가장 최신 계약만 유지 (중복 제거)
- const vendorContracts = filteredContracts.reduce((acc, contract) => {
- const existing = acc.find(c => c.templateName === contract.templateName);
- if (!existing || (contract.createdAt && existing.createdAt && contract.createdAt > existing.createdAt)) {
- // 기존에 같은 템플릿명이 없거나, 더 최신인 경우 추가/교체
- return acc.filter(c => c.templateName !== contract.templateName).concat(contract);
- }
- return acc;
- }, [] as typeof filteredContracts);
-
- // 문서 제출 현황 - 국가별 요구사항 적용
- const isForeign = registration.country !== 'KR';
- const documentSubmissionsStatus = {
- businessRegistration: vendorFiles.some(f => f.attachmentType === "BUSINESS_REGISTRATION"),
- creditEvaluation: vendorFiles.some(f => f.attachmentType === "CREDIT_REPORT"),
- bankCopy: isForeign ? vendorFiles.some(f => f.attachmentType === "BANK_ACCOUNT_COPY") : true, // 내자는 통장사본 불필요
- auditResult: investigationFiles.length > 0, // 실사 첨부파일이 하나라도 있으면 true
- };
-
- // 문서별 파일 정보 (다운로드용)
- const documentFiles = {
- businessRegistration: vendorFiles.filter(f => f.attachmentType === "BUSINESS_REGISTRATION"),
- creditEvaluation: vendorFiles.filter(f => f.attachmentType === "CREDIT_REPORT"),
- bankCopy: vendorFiles.filter(f => f.attachmentType === "BANK_ACCOUNT_COPY"),
- auditResult: investigationFiles,
- };
-
- // 계약 동의 현황 - 실제 기본 계약 데이터 기반으로 단순화
- const contractAgreementsStatus = {
- cp: vendorContracts.some(c => c.status === "COMPLETED") ? "completed" : "not_submitted",
- gtc: registration.gtcSkipped ? "completed" : (vendorContracts.some(c => c.templateName?.includes("GTC") && c.status === "COMPLETED") ? "completed" : "not_submitted"),
- standardSubcontract: vendorContracts.some(c => c.templateName?.includes("표준하도급") && c.status === "COMPLETED") ? "completed" : "not_submitted",
- safetyHealth: vendorContracts.some(c => c.templateName?.includes("안전보건") && c.status === "COMPLETED") ? "completed" : "not_submitted",
- ethics: vendorContracts.some(c => c.templateName?.includes("윤리") && c.status === "COMPLETED") ? "completed" : "not_submitted",
- domesticCredit: vendorContracts.some(c => c.templateName?.includes("내국신용장") && c.status === "COMPLETED") ? "completed" : "not_submitted",
- };
-
- // 추가정보 입력 완료 여부 - 5개 필수 업무담당자 타입 + 추가정보 테이블 모두 입력되었는지 확인
- const requiredContactTypes = ["sales", "design", "delivery", "quality", "tax_invoice"];
- const contactsCompleted = requiredContactTypes.every(type =>
- vendorContacts.some(contact => contact.contactType === type)
- );
- const additionalInfoTableCompleted = vendorAdditionalInfoData.length > 0;
- const additionalInfoCompleted = contactsCompleted && additionalInfoTableCompleted;
-
- // 모든 조건 충족 여부 확인
- const allDocumentsSubmitted = Object.values(documentSubmissionsStatus).every(status => status === true);
- // 진행현황과 dialog에서 VENDOR_SIGNED도 완료로 간주하므로, 조건충족 체크도 동일하게 처리
- const allContractsCompleted = vendorContracts.length > 0 && vendorContracts.every(c => c.status === "COMPLETED" || c.status === "VENDOR_SIGNED");
- const safetyQualificationCompleted = !!registration.safetyQualificationContent;
-
- // 모든 조건이 충족되면 status를 "approval_ready"(조건충족)로 자동 변경
- const shouldUpdateStatus = allDocumentsSubmitted && allContractsCompleted && safetyQualificationCompleted && additionalInfoCompleted;
-
- // 현재 상태가 조건충족이 아닌데 모든 조건이 충족되면 상태 업데이트
- // 단, 결재진행중(pending_approval) 또는 등록요청완료(registration_completed), 등록실패(registration_failed) 상태인 경우 무시
- if (shouldUpdateStatus && registration.status !== "approval_ready" && registration.status !== "pending_approval" && registration.status !== "registration_completed" && registration.status !== "registration_failed") {
- // 비동기 업데이트 (백그라운드에서 실행)
- updateVendorRegularRegistration(registration.id, {
- status: "approval_ready"
- }).catch(error => {
- console.error(`상태 자동 업데이트 실패 (벤더 ID: ${registration.vendorId}):`, error);
- });
- }
-
- return {
- id: registration.id,
- vendorId: registration.vendorId,
- status: registration.status || "audit_pass",
- potentialCode: registration.potentialCode,
- businessNumber: registration.businessNumber || "",
- companyName: registration.companyName || "",
- majorItems: registration.majorItems,
- establishmentDate: registration.establishmentDate?.toISOString() || null,
- representative: registration.representative,
- country: registration.country,
- documentSubmissions: documentSubmissionsStatus,
- documentFiles: documentFiles, // 파일 정보 추가
- contractAgreements: contractAgreementsStatus,
- // 새로 추가된 필드들
- safetyQualificationContent: registration.safetyQualificationContent,
- gtcSkipped: registration.gtcSkipped || false,
- additionalInfo: additionalInfoCompleted,
- // 기본계약 정보
- basicContracts: vendorContracts.map((contract: any) => ({
- templateId: contract.templateId,
- templateName: contract.templateName,
- status: contract.status,
- createdAt: contract.createdAt,
- filePath: contract.filePath,
- fileName: contract.fileName,
- })),
- registrationRequestDate: registration.registrationRequestDate || null,
- assignedDepartment: registration.assignedDepartment,
- assignedUser: registration.assignedUser,
- remarks: registration.remarks,
- };
- });
- } catch (error) {
- console.error("Error fetching vendor regular registrations:", error);
- throw new Error("정규업체 등록 목록을 가져오는 중 오류가 발생했습니다.");
- }
-}
-
-export async function createVendorRegularRegistration(data: {
- vendorId: number;
- status?: string;
- potentialCode?: string;
- majorItems?: string;
- assignedDepartment?: string;
- assignedDepartmentCode?: string;
- assignedUser?: string;
- assignedUserCode?: string;
- remarks?: string;
- safetyQualificationContent?: string;
- gtcSkipped?: boolean;
-}) {
- try {
- const [registration] = await db
- .insert(vendorRegularRegistrations)
- .values({
- vendorId: data.vendorId,
- status: data.status || "under_review",
- potentialCode: data.potentialCode,
- majorItems: data.majorItems,
- assignedDepartment: data.assignedDepartment,
- assignedDepartmentCode: data.assignedDepartmentCode,
- assignedUser: data.assignedUser,
- assignedUserCode: data.assignedUserCode,
- remarks: data.remarks,
- safetyQualificationContent: data.safetyQualificationContent,
- gtcSkipped: data.gtcSkipped || false,
- })
- .returning();
-
- return registration;
- } catch (error) {
- console.error("Error creating vendor regular registration:", error);
- throw new Error("정규업체 등록을 생성하는 중 오류가 발생했습니다.");
- }
-}
-
-export async function updateVendorRegularRegistration(
- id: number,
- data: Partial<{
- status: string;
- potentialCode: string;
- majorItems: string;
- registrationRequestDate: string;
- assignedDepartment: string;
- assignedDepartmentCode: string;
- assignedUser: string;
- assignedUserCode: string;
- remarks: string;
- safetyQualificationContent: string;
- gtcSkipped: boolean;
- }>
-) {
- try {
- const [registration] = await db
- .update(vendorRegularRegistrations)
- .set({
- ...data,
- updatedAt: new Date(),
- })
- .where(eq(vendorRegularRegistrations.id, id))
- .returning();
-
- return registration;
- } catch (error) {
- console.error("Error updating vendor regular registration:", error);
- throw new Error("정규업체 등록을 업데이트하는 중 오류가 발생했습니다.");
- }
-}
-
-export async function getVendorRegularRegistrationById(id: number) {
- try {
- const [registration] = await db
- .select()
- .from(vendorRegularRegistrations)
- .where(eq(vendorRegularRegistrations.id, id));
-
- return registration;
- } catch (error) {
- console.error("Error fetching vendor regular registration by id:", error);
- throw new Error("정규업체 등록 정보를 가져오는 중 오류가 발생했습니다.");
- }
-}
-
-
+import db from "@/db/db";
+import {
+ vendorRegularRegistrations,
+ vendors,
+ vendorAttachments,
+ vendorInvestigationAttachments,
+ basicContract,
+ basicContractTemplates,
+ vendorPQSubmissions,
+ vendorInvestigations,
+ vendorBusinessContacts,
+ vendorAdditionalInfo,
+} from "@/db/schema";
+import { eq, desc, and, sql, inArray } from "drizzle-orm";
+import type { VendorRegularRegistration } from "@/config/vendorRegularRegistrationsColumnsConfig";
+
+export async function getVendorRegularRegistrations(
+): Promise<VendorRegularRegistration[]> {
+ try {
+ // DB 레코드 기준으로 정규업체등록 데이터를 가져옴
+ const registrations = await db
+ .select({
+ // 정규업체등록 정보
+ id: vendorRegularRegistrations.id,
+ vendorId: vendorRegularRegistrations.vendorId,
+ status: vendorRegularRegistrations.status,
+ potentialCode: vendorRegularRegistrations.potentialCode,
+ majorItems: vendorRegularRegistrations.majorItems,
+ registrationRequestDate: vendorRegularRegistrations.registrationRequestDate,
+ assignedDepartment: vendorRegularRegistrations.assignedDepartment,
+ assignedUser: vendorRegularRegistrations.assignedUser,
+ remarks: vendorRegularRegistrations.remarks,
+ // 새로 추가된 필드들
+ safetyQualificationContent: vendorRegularRegistrations.safetyQualificationContent,
+ gtcSkipped: vendorRegularRegistrations.gtcSkipped,
+ // 벤더 기본 정보
+ businessNumber: vendors.taxId,
+ companyName: vendors.vendorName,
+ establishmentDate: vendors.createdAt,
+ representative: vendors.representativeName,
+ // 국가 정보 추가
+ country: vendors.country,
+ })
+ .from(vendorRegularRegistrations)
+ .innerJoin(vendors, eq(vendorRegularRegistrations.vendorId, vendors.id))
+ .orderBy(desc(vendorRegularRegistrations.createdAt));
+
+ // 벤더 ID 배열 생성
+ const vendorIds = registrations.map(r => r.vendorId);
+
+ // 벤더 첨부파일 정보 조회 - 벤더별로 그룹화
+ const vendorAttachmentsList = vendorIds.length > 0 ? await db
+ .select()
+ .from(vendorAttachments)
+ .where(inArray(vendorAttachments.vendorId, vendorIds)) : [];
+
+ // 실사 첨부파일 정보 조회 - 실사 ID를 통해 벤더 ID 매핑
+ const investigationAttachmentsList = vendorIds.length > 0 ? await db
+ .select({
+ vendorId: vendorInvestigations.vendorId,
+ attachmentId: vendorInvestigationAttachments.id,
+ fileName: vendorInvestigationAttachments.fileName,
+ attachmentType: vendorInvestigationAttachments.attachmentType,
+ createdAt: vendorInvestigationAttachments.createdAt,
+ })
+ .from(vendorInvestigationAttachments)
+ .innerJoin(vendorInvestigations, eq(vendorInvestigationAttachments.investigationId, vendorInvestigations.id))
+ .where(inArray(vendorInvestigations.vendorId, vendorIds)) : [];
+
+ // 기본 계약 정보 조회 (템플릿별로 가장 최신 것만)
+ const basicContractsList = vendorIds.length > 0 ? await db
+ .select({
+ vendorId: basicContract.vendorId,
+ templateId: basicContract.templateId,
+ status: basicContract.status,
+ templateName: basicContractTemplates.templateName,
+ createdAt: basicContract.createdAt,
+ filePath: basicContract.filePath,
+ fileName: basicContract.fileName,
+ })
+ .from(basicContract)
+ .leftJoin(basicContractTemplates, eq(basicContract.templateId, basicContractTemplates.id))
+ .where(inArray(basicContract.vendorId, vendorIds))
+ .orderBy(desc(basicContract.createdAt)) : [];
+
+ // 추가정보 입력 상태 조회 (업무담당자 정보)
+ const businessContactsList = vendorIds.length > 0 ? await db
+ .select({
+ vendorId: vendorBusinessContacts.vendorId,
+ contactType: vendorBusinessContacts.contactType,
+ })
+ .from(vendorBusinessContacts)
+ .where(inArray(vendorBusinessContacts.vendorId, vendorIds)) : [];
+
+ // 추가정보 테이블 조회
+ const additionalInfoList = vendorIds.length > 0 ? await db
+ .select({
+ vendorId: vendorAdditionalInfo.vendorId,
+ })
+ .from(vendorAdditionalInfo)
+ .where(inArray(vendorAdditionalInfo.vendorId, vendorIds)) : [];
+
+ // 각 등록 레코드별로 데이터를 매핑하여 결과 반환
+ return registrations.map((registration) => {
+ // 벤더별 첨부파일 필터링
+ const vendorFiles = vendorAttachmentsList.filter(att => att.vendorId === registration.vendorId);
+ const investigationFiles = investigationAttachmentsList.filter(att => att.vendorId === registration.vendorId);
+ const allVendorContracts = basicContractsList.filter(contract => contract.vendorId === registration.vendorId);
+ const vendorContacts = businessContactsList.filter(contact => contact.vendorId === registration.vendorId);
+ const vendorAdditionalInfoData = additionalInfoList.filter(info => info.vendorId === registration.vendorId);
+
+ // 기술자료 동의서, 비밀유지계약서 제외 필터링
+ const filteredContracts = allVendorContracts.filter(contract => {
+ const templateName = contract.templateName?.toLowerCase() || '';
+ return !templateName.includes('기술자료') && !templateName.includes('비밀유지');
+ });
+
+ // 템플릿명 기준으로 가장 최신 계약만 유지 (중복 제거)
+ const vendorContracts = filteredContracts.reduce((acc, contract) => {
+ const existing = acc.find(c => c.templateName === contract.templateName);
+ if (!existing || (contract.createdAt && existing.createdAt && contract.createdAt > existing.createdAt)) {
+ // 기존에 같은 템플릿명이 없거나, 더 최신인 경우 추가/교체
+ return acc.filter(c => c.templateName !== contract.templateName).concat(contract);
+ }
+ return acc;
+ }, [] as typeof filteredContracts);
+
+ // 문서 제출 현황 - 국가별 요구사항 적용
+ const isForeign = registration.country !== 'KR';
+ const documentSubmissionsStatus = {
+ businessRegistration: vendorFiles.some(f => f.attachmentType === "BUSINESS_REGISTRATION"),
+ creditEvaluation: vendorFiles.some(f => f.attachmentType === "CREDIT_REPORT"),
+ bankCopy: isForeign ? vendorFiles.some(f => f.attachmentType === "BANK_ACCOUNT_COPY") : true, // 내자는 통장사본 불필요
+ auditResult: investigationFiles.length > 0, // 실사 첨부파일이 하나라도 있으면 true
+ };
+
+ // 문서별 파일 정보 (다운로드용)
+ const documentFiles = {
+ businessRegistration: vendorFiles.filter(f => f.attachmentType === "BUSINESS_REGISTRATION"),
+ creditEvaluation: vendorFiles.filter(f => f.attachmentType === "CREDIT_REPORT"),
+ bankCopy: vendorFiles.filter(f => f.attachmentType === "BANK_ACCOUNT_COPY"),
+ auditResult: investigationFiles,
+ };
+
+ // 계약 동의 현황 - 실제 기본 계약 데이터 기반으로 단순화
+ const contractAgreementsStatus = {
+ cp: vendorContracts.some(c => c.status === "COMPLETED") ? "completed" : "not_submitted",
+ gtc: registration.gtcSkipped ? "completed" : (vendorContracts.some(c => c.templateName?.includes("GTC") && c.status === "COMPLETED") ? "completed" : "not_submitted"),
+ standardSubcontract: vendorContracts.some(c => c.templateName?.includes("표준하도급") && c.status === "COMPLETED") ? "completed" : "not_submitted",
+ safetyHealth: vendorContracts.some(c => c.templateName?.includes("안전보건") && c.status === "COMPLETED") ? "completed" : "not_submitted",
+ ethics: vendorContracts.some(c => c.templateName?.includes("윤리") && c.status === "COMPLETED") ? "completed" : "not_submitted",
+ domesticCredit: vendorContracts.some(c => c.templateName?.includes("내국신용장") && c.status === "COMPLETED") ? "completed" : "not_submitted",
+ };
+
+ // 추가정보 입력 완료 여부 - 5개 필수 업무담당자 타입 + 추가정보 테이블 모두 입력되었는지 확인
+ const requiredContactTypes = ["sales", "design", "delivery", "quality", "tax_invoice"];
+ const contactsCompleted = requiredContactTypes.every(type =>
+ vendorContacts.some(contact => contact.contactType === type)
+ );
+ const additionalInfoTableCompleted = vendorAdditionalInfoData.length > 0;
+ const additionalInfoCompleted = contactsCompleted && additionalInfoTableCompleted;
+
+ // 모든 조건 충족 여부 확인
+ const allDocumentsSubmitted = Object.values(documentSubmissionsStatus).every(status => status === true);
+ // 진행현황과 dialog에서 VENDOR_SIGNED도 완료로 간주하므로, 조건충족 체크도 동일하게 처리
+ const allContractsCompleted = vendorContracts.length > 0 && vendorContracts.every(c => c.status === "COMPLETED" || c.status === "VENDOR_SIGNED");
+ const safetyQualificationCompleted = !!registration.safetyQualificationContent;
+
+ // 모든 조건이 충족되면 status를 "approval_ready"(조건충족)로 자동 변경
+ const shouldUpdateStatus = allDocumentsSubmitted && allContractsCompleted && safetyQualificationCompleted && additionalInfoCompleted;
+
+ // 현재 상태가 조건충족이 아닌데 모든 조건이 충족되면 상태 업데이트
+ // 단, 결재진행중(pending_approval) 또는 등록요청완료(registration_completed), 등록실패(registration_failed) 상태인 경우 무시
+ if (shouldUpdateStatus && registration.status !== "approval_ready" && registration.status !== "pending_approval" && registration.status !== "registration_completed" && registration.status !== "registration_failed") {
+ // 비동기 업데이트 (백그라운드에서 실행)
+ updateVendorRegularRegistration(registration.id, {
+ status: "approval_ready"
+ }).catch(error => {
+ console.error(`상태 자동 업데이트 실패 (벤더 ID: ${registration.vendorId}):`, error);
+ });
+ }
+
+ return {
+ id: registration.id,
+ vendorId: registration.vendorId,
+ status: registration.status || "audit_pass",
+ potentialCode: registration.potentialCode,
+ businessNumber: registration.businessNumber || "",
+ companyName: registration.companyName || "",
+ majorItems: registration.majorItems,
+ establishmentDate: registration.establishmentDate?.toISOString() || null,
+ representative: registration.representative,
+ country: registration.country,
+ documentSubmissions: documentSubmissionsStatus,
+ documentFiles: documentFiles, // 파일 정보 추가
+ contractAgreements: contractAgreementsStatus,
+ // 새로 추가된 필드들
+ safetyQualificationContent: registration.safetyQualificationContent,
+ gtcSkipped: registration.gtcSkipped || false,
+ additionalInfo: additionalInfoCompleted,
+ // 기본계약 정보
+ basicContracts: vendorContracts.map((contract: any) => ({
+ templateId: contract.templateId,
+ templateName: contract.templateName,
+ status: contract.status,
+ createdAt: contract.createdAt,
+ filePath: contract.filePath,
+ fileName: contract.fileName,
+ })),
+ registrationRequestDate: registration.registrationRequestDate || null,
+ assignedDepartment: registration.assignedDepartment,
+ assignedUser: registration.assignedUser,
+ remarks: registration.remarks,
+ };
+ });
+ } catch (error) {
+ console.error("Error fetching vendor regular registrations:", error);
+ throw new Error("정규업체 등록 목록을 가져오는 중 오류가 발생했습니다.");
+ }
+}
+
+export async function createVendorRegularRegistration(data: {
+ vendorId: number;
+ status?: string;
+ potentialCode?: string;
+ majorItems?: string;
+ assignedDepartment?: string;
+ assignedDepartmentCode?: string;
+ assignedUser?: string;
+ assignedUserCode?: string;
+ remarks?: string;
+ safetyQualificationContent?: string;
+ gtcSkipped?: boolean;
+}) {
+ try {
+ const [registration] = await db
+ .insert(vendorRegularRegistrations)
+ .values({
+ vendorId: data.vendorId,
+ status: data.status || "under_review",
+ potentialCode: data.potentialCode,
+ majorItems: data.majorItems,
+ assignedDepartment: data.assignedDepartment,
+ assignedDepartmentCode: data.assignedDepartmentCode,
+ assignedUser: data.assignedUser,
+ assignedUserCode: data.assignedUserCode,
+ remarks: data.remarks,
+ safetyQualificationContent: data.safetyQualificationContent,
+ gtcSkipped: data.gtcSkipped || false,
+ })
+ .returning();
+
+ return registration;
+ } catch (error) {
+ console.error("Error creating vendor regular registration:", error);
+ throw new Error("정규업체 등록을 생성하는 중 오류가 발생했습니다.");
+ }
+}
+
+export async function updateVendorRegularRegistration(
+ id: number,
+ data: Partial<{
+ status: string;
+ potentialCode: string;
+ majorItems: string;
+ registrationRequestDate: string;
+ assignedDepartment: string;
+ assignedDepartmentCode: string;
+ assignedUser: string;
+ assignedUserCode: string;
+ remarks: string;
+ safetyQualificationContent: string;
+ gtcSkipped: boolean;
+ }>
+) {
+ try {
+ const [registration] = await db
+ .update(vendorRegularRegistrations)
+ .set({
+ ...data,
+ updatedAt: new Date(),
+ })
+ .where(eq(vendorRegularRegistrations.id, id))
+ .returning();
+
+ return registration;
+ } catch (error) {
+ console.error("Error updating vendor regular registration:", error);
+ throw new Error("정규업체 등록을 업데이트하는 중 오류가 발생했습니다.");
+ }
+}
+
+export async function getVendorRegularRegistrationById(id: number) {
+ try {
+ const [registration] = await db
+ .select()
+ .from(vendorRegularRegistrations)
+ .where(eq(vendorRegularRegistrations.id, id));
+
+ return registration;
+ } catch (error) {
+ console.error("Error fetching vendor regular registration by id:", error);
+ throw new Error("정규업체 등록 정보를 가져오는 중 오류가 발생했습니다.");
+ }
+}
+
+