diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-10-30 10:44:47 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-10-30 10:44:47 +0000 |
| commit | 871a6d46a769cbe9e87146434f4bcb2d6792ab81 (patch) | |
| tree | acc25b3645e2253625e68f3721a203131ff4f3c4 /lib/vendor-regular-registrations/service.ts | |
| parent | 17b9d2016be7c0ab6571de6aba36b3f4ea37bdb1 (diff) | |
(최겸) 구매 PQ/실사 재개발(테스트 필요), 정규업체등록 결재 개발, 실사 의뢰 결재 후처리 등
Diffstat (limited to 'lib/vendor-regular-registrations/service.ts')
| -rw-r--r-- | lib/vendor-regular-registrations/service.ts | 487 |
1 files changed, 106 insertions, 381 deletions
diff --git a/lib/vendor-regular-registrations/service.ts b/lib/vendor-regular-registrations/service.ts index 372212fc..2a6695fa 100644 --- a/lib/vendor-regular-registrations/service.ts +++ b/lib/vendor-regular-registrations/service.ts @@ -35,13 +35,13 @@ async function updatePendingApprovals() { const threeMonthsAgo = new Date();
threeMonthsAgo.setMonth(threeMonthsAgo.getMonth() - 3);
- // 3개월 이상 정규등록검토 상태인 등록들을 조회
+ // 3개월 이상 조건충족 상태인 등록들을 조회
const outdatedRegistrations = await db
.select()
.from(vendorRegularRegistrations)
.where(
and(
- eq(vendorRegularRegistrations.status, "in_review"),
+ eq(vendorRegularRegistrations.status, "approval_ready"),
lt(vendorRegularRegistrations.updatedAt, threeMonthsAgo)
)
);
@@ -51,12 +51,13 @@ async function updatePendingApprovals() { await db
.update(vendorRegularRegistrations)
.set({
- status: "pending_approval",
+ status: "registration_failed",
updatedAt: new Date(),
+ remarks: "3개월 이상 조건충족 상태로 장기미등록으로 변경",
})
.where(
and(
- eq(vendorRegularRegistrations.status, "in_review"),
+ eq(vendorRegularRegistrations.status, "approval_ready"),
lt(vendorRegularRegistrations.updatedAt, threeMonthsAgo)
)
);
@@ -141,152 +142,6 @@ export async function getCurrentUserInfo() { };
}
-export async function createVendorRegistration(data: {
- vendorId: number;
- status?: string;
- potentialCode?: string;
- majorItems?: Record<string, unknown>[];
- assignedDepartment?: string;
- assignedDepartmentCode?: string;
- assignedUser?: string;
- assignedUserCode?: string;
- remarks?: string;
-}) {
- try {
- const majorItemsJson = data.majorItems ? JSON.stringify(data.majorItems) : undefined;
-
- const registration = await createVendorRegularRegistration({
- ...data,
- status: data.status || "under_review", // 기본 상태를 '검토중'으로 설정
- majorItems: majorItemsJson,
- });
-
- // 캐시 무효화
- revalidateTag("vendor-regular-registrations");
-
- return { success: true, data: registration };
- } catch (error) {
- console.error("Error in createVendorRegistration:", error);
- return {
- success: false,
- error: error instanceof Error ? error.message : "정규업체 등록을 생성하는 중 오류가 발생했습니다.",
- };
- }
-}
-
-export async function updateVendorRegistration(
- id: number,
- data: Partial<{
- status: string;
- potentialCode: string;
- majorItems: Record<string, unknown>[];
- registrationRequestDate: string;
- assignedDepartment: string;
- assignedDepartmentCode: string;
- assignedUser: string;
- assignedUserCode: string;
- remarks: string;
- }>
-) {
- try {
- const updateData: Partial<{
- status: string;
- potentialCode: string;
- majorItems: string;
- registrationRequestDate: string;
- assignedDepartment: string;
- assignedDepartmentCode: string;
- assignedUser: string;
- assignedUserCode: string;
- remarks: string;
- }> = {};
-
- // majorItems를 제외한 다른 필드들을 복사
- Object.keys(data).forEach(key => {
- if (key !== 'majorItems') {
- updateData[key as keyof typeof updateData] = data[key as keyof typeof data] as never;
- }
- });
-
- if (data.majorItems) {
- updateData.majorItems = JSON.stringify(data.majorItems);
- }
-
- const registration = await updateVendorRegularRegistration(id, updateData);
-
- // 캐시 무효화
- revalidateTag("vendor-regular-registrations");
-
- return { success: true, data: registration };
- } catch (error) {
- console.error("Error in updateVendorRegistration:", error);
- return {
- success: false,
- error: error instanceof Error ? error.message : "정규업체 등록을 수정하는 중 오류가 발생했습니다.",
- };
- }
-}
-
-export async function fetchVendorRegistrationById(id: number) {
- try {
- const registration = await getVendorRegularRegistrationById(id);
- return { success: true, data: registration };
- } catch (error) {
- console.error("Error in fetchVendorRegistrationById:", error);
- return {
- success: false,
- error: error instanceof Error ? error.message : "정규업체 등록 정보를 가져오는 중 오류가 발생했습니다.",
- };
- }
-}
-
-
-
-export async function requestRegularRegistration(registrationId: number) {
- try {
- // 정규업체 등록 요청 처리
- const now = new Date().toISOString().split('T')[0];
-
- const registration = await updateVendorRegularRegistration(registrationId, {
- status: "in_review",
- registrationRequestDate: now,
- });
-
- // 캐시 무효화
- revalidateTag("vendor-regular-registrations");
-
- return { success: true, message: "정규업체 등록 요청이 완료되었습니다.", data: registration };
- } catch (error) {
- console.error("Error in requestRegularRegistration:", error);
- return {
- success: false,
- error: error instanceof Error ? error.message : "정규업체 등록 요청 중 오류가 발생했습니다.",
- };
- }
-}
-
-export async function approveRegularRegistration(registrationId: number) {
- try {
- // 정규업체 등록 승인 처리
- const registration = await updateVendorRegularRegistration(registrationId, {
- status: "approval_ready",
- });
-
- // 캐시 무효화
- revalidateTag("vendor-regular-registrations");
-
- return { success: true, message: "정규업체 등록이 승인되었습니다.", data: registration };
- } catch (error) {
- console.error("Error in approveRegularRegistration:", error);
- return {
- success: false,
- error: error instanceof Error ? error.message : "정규업체 등록 승인 중 오류가 발생했습니다.",
- };
- }
-}
-
-
-
// 누락계약요청 이메일 발송
export async function sendMissingContractRequestEmails(vendorIds: number[]) {
try {
@@ -530,90 +385,6 @@ export async function skipLegalReview(vendorIds: number[], skipReason: string) { }
}
-// 안전적격성평가 Skip 기능 (삭제됨 - 개별 입력으로 대체)
-/*
-export async function skipSafetyQualification(vendorIds: number[], skipReason: string) {
- try {
- const session = await getServerSession(authOptions);
- if (!session?.user) {
- return { success: false, error: "로그인이 필요합니다." };
- }
-
- let successCount = 0;
- let errorCount = 0;
-
- for (const vendorId of vendorIds) {
- try {
- // 해당 벤더의 registration 찾기 또는 생성
- const vendorList = await db
- .select({ id: vendors.id })
- .from(vendors)
- .where(eq(vendors.id, vendorId));
-
- if (vendorList.length === 0) {
- errorCount++;
- continue;
- }
-
- // registration 조회
- const existingRegistrations = await db
- .select()
- .from(vendorRegularRegistrations)
- .where(eq(vendorRegularRegistrations.vendorId, vendorId));
-
- let registrationId;
- if (existingRegistrations.length === 0) {
- // 새로 생성
- const newRegistration = await createVendorRegularRegistration({
- vendorId: vendorId,
- status: "audit_pass",
- remarks: `안전적격성평가 Skip: ${skipReason}`,
- });
- registrationId = newRegistration.id;
- } else {
- // 기존 registration 업데이트
- registrationId = existingRegistrations[0].id;
- const currentRemarks = existingRegistrations[0].remarks || "";
- const newRemarks = currentRemarks
- ? `${currentRemarks}\n안전적격성평가 Skip: ${skipReason}`
- : `안전적격성평가 Skip: ${skipReason}`;
-
- await updateVendorRegularRegistration(registrationId, {
- remarks: newRemarks,
- });
- }
-
- // 안전적격성평가 상태를 완료로 처리 (계약 동의 현황은 이제 실시간으로 조회하므로 별도 처리 불필요)
- // updateContractAgreement 함수는 제거되었으므로 계약 동의 현황은 basic_contract와 vendor_pq_submissions에서 실시간으로 조회됩니다.
-
- successCount++;
- } catch (error) {
- console.error(`Failed to skip safety qualification for vendor ${vendorId}:`, error);
- errorCount++;
- }
- }
-
- if (errorCount > 0) {
- return {
- success: false,
- error: `${successCount}개 업체 처리 성공, ${errorCount}개 업체 처리 실패`,
- };
- }
-
- return {
- success: true,
- message: `${successCount}개 업체의 안전적격성평가를 Skip 처리했습니다.`,
- };
- } catch (error) {
- console.error("Error skipping safety qualification:", error);
- return {
- success: false,
- error: error instanceof Error ? error.message : "안전적격성평가 Skip 처리 중 오류가 발생했습니다.",
- };
- }
-}
-*/
-
// 주요품목 업데이트
export async function updateMajorItems(
registrationId: number,
@@ -1045,52 +816,6 @@ export async function updateSafetyQualification( }
}
-// GTC Skip 처리
-export async function updateGtcSkip(
- registrationId: number,
- skipReason: string
-) {
- try {
- const session = await getServerSession(authOptions);
- if (!session?.user) {
- return { success: false, error: "로그인이 필요합니다." };
- }
-
- // 현재 비고 가져오기
- const existingRegistration = await getVendorRegularRegistrationById(registrationId);
- if (!existingRegistration) {
- return { success: false, error: "등록 정보를 찾을 수 없습니다." };
- }
-
- const currentRemarks = existingRegistration.remarks || "";
- const newRemarks = currentRemarks
- ? `${currentRemarks}\nGTC Skip: ${skipReason}`
- : `GTC Skip: ${skipReason}`;
-
- const result = await updateVendorRegularRegistration(registrationId, {
- gtcSkipped: true,
- remarks: newRemarks,
- });
-
- if (!result) {
- return { success: false, error: "등록 정보를 찾을 수 없습니다." };
- }
-
- // 캐시 무효화
- revalidateTag("vendor-regular-registrations");
-
- return {
- success: true,
- message: "GTC Skip이 처리되었습니다.",
- };
- } catch (error) {
- console.error("Error updating GTC skip:", error);
- return {
- success: false,
- error: error instanceof Error ? error.message : "GTC Skip 처리 중 오류가 발생했습니다.",
- };
- }
-}
// 정규업체 등록 요청을 위한 상세 데이터 조회
export async function fetchRegistrationRequestData(registrationId: number) {
@@ -1166,108 +891,108 @@ export async function fetchRegistrationRequestData(registrationId: number) { }
// 정규업체 등록 요청 서버 액션
-export async function submitRegistrationRequest(
- registrationId: number,
- requestData: RegistrationRequestData
-) {
- try {
- const session = await getServerSession(authOptions);
- if (!session?.user) {
- return { success: false, error: "인증이 필요합니다." };
- }
-
- // 현재 등록 정보 조회
- const registration = await db
- .select()
- .from(vendorRegularRegistrations)
- .where(eq(vendorRegularRegistrations.id, registrationId))
- .limit(1);
-
- if (!registration[0]) {
- return { success: false, error: "등록 정보를 찾을 수 없습니다." };
- }
-
- // 조건충족 상태인지 확인
- console.log("📋 업데이트 전 현재 데이터:", {
- registrationId,
- currentStatus: registration[0].status,
- currentRemarks: registration[0].remarks,
- currentUpdatedAt: registration[0].updatedAt
- });
-
- if (registration[0].status !== "approval_ready") {
- return { success: false, error: "조건충족 상태가 아닙니다." };
- }
-
- // 정규업체 등록 요청 데이터를 JSON으로 저장
- const registrationRequestData = {
- requestDate: new Date(),
- requestedBy: session.user.id,
- requestedByName: session.user.name,
- requestData: requestData,
- status: "requested" // 요청됨
- };
-
- // 트랜잭션으로 상태 변경
- const updateResult = await db.transaction(async (tx) => {
- return await tx
- .update(vendorRegularRegistrations)
- .set({
- status: "registration_requested",
- remarks: `정규업체 등록 요청됨 - ${new Date().toISOString()}\n요청자: ${session.user.name}`,
- updatedAt: new Date(),
- })
- .where(eq(vendorRegularRegistrations.id, registrationId));
- });
-
- console.log("🔄 업데이트 결과:", {
- registrationId,
- updateResult,
- statusToSet: "registration_requested"
- });
-
-
-
- // MDG 인터페이스 연동
- const mdgResult = await sendRegistrationRequestToMDG(registrationId, requestData);
+// export async function submitRegistrationRequest(
+// registrationId: number,
+// requestData: RegistrationRequestData
+// ) {
+// try {
+// const session = await getServerSession(authOptions);
+// if (!session?.user) {
+// return { success: false, error: "인증이 필요합니다." };
+// }
+
+// // 현재 등록 정보 조회
+// const registration = await db
+// .select()
+// .from(vendorRegularRegistrations)
+// .where(eq(vendorRegularRegistrations.id, registrationId))
+// .limit(1);
+
+// if (!registration[0]) {
+// return { success: false, error: "등록 정보를 찾을 수 없습니다." };
+// }
+
+// // 조건충족 상태인지 확인
+// console.log("📋 업데이트 전 현재 데이터:", {
+// registrationId,
+// currentStatus: registration[0].status,
+// currentRemarks: registration[0].remarks,
+// currentUpdatedAt: registration[0].updatedAt
+// });
+
+// if (registration[0].status !== "approval_ready") {
+// return { success: false, error: "조건충족 상태가 아닙니다." };
+// }
+
+// // 정규업체 등록 요청 데이터를 JSON으로 저장
+// const registrationRequestData = {
+// requestDate: new Date(),
+// requestedBy: session.user.id,
+// requestedByName: session.user.name,
+// requestData: requestData,
+// status: "requested" // 요청됨
+// };
+
+// // 트랜잭션으로 상태 변경
+// const updateResult = await db.transaction(async (tx) => {
+// return await tx
+// .update(vendorRegularRegistrations)
+// .set({
+// status: "registration_requested",
+// remarks: `정규업체 등록 요청됨 - ${new Date().toISOString()}\n요청자: ${session.user.name}`,
+// updatedAt: new Date(),
+// })
+// .where(eq(vendorRegularRegistrations.id, registrationId));
+// });
+
+// console.log("🔄 업데이트 결과:", {
+// registrationId,
+// updateResult,
+// statusToSet: "registration_requested"
+// });
+
+
+
+// // MDG 인터페이스 연동
+// const mdgResult = await sendRegistrationRequestToMDG(registrationId, requestData);
- if (!mdgResult.success) {
- console.error('❌ MDG 송신 실패:', mdgResult.error);
- // MDG 송신 실패해도 등록 요청은 성공으로 처리 (재시도 가능하도록)
- } else {
- console.log('✅ MDG 송신 성공:', mdgResult.message);
- }
-
- // Knox 결재 연동은 별도의 결재 워크플로우에서 처리됩니다.
- // UI에서 registerVendorWithApproval()을 호출하여 결재 프로세스를 시작합니다.
-
- console.log("✅ 정규업체 등록 요청 데이터:", {
- registrationId,
- companyName: requestData.companyNameKor,
- businessNumber: requestData.businessNumber,
- representative: requestData.representativeNameKor,
- requestedBy: session.user.name,
- requestDate: new Date().toISOString()
- });
-
- // 캐시 무효화 - 더 강력한 무효화
- revalidateTag("vendor-regular-registrations");
- revalidateTag(`vendor-regular-registration-${registrationId}`);
- revalidateTag("vendor-registration-status");
-
- return {
- success: true,
- message: `정규업체 등록 요청이 성공적으로 제출되었습니다.\n${mdgResult.success ? 'MDG 인터페이스 연동이 완료되었습니다.' : 'MDG 인터페이스 연동에 실패했습니다. (재시도 가능)'}\n결재 승인 후 정규업체 등록이 완료됩니다.`
- };
-
- } catch (error) {
- console.error("정규업체 등록 요청 오류:", error);
- return {
- success: false,
- error: error instanceof Error ? error.message : "정규업체 등록 요청 중 오류가 발생했습니다."
- };
- }
-}
+// if (!mdgResult.success) {
+// console.error('❌ MDG 송신 실패:', mdgResult.error);
+// // MDG 송신 실패해도 등록 요청은 성공으로 처리 (재시도 가능하도록)
+// } else {
+// console.log('✅ MDG 송신 성공:', mdgResult.message);
+// }
+
+// // Knox 결재 연동은 별도의 결재 워크플로우에서 처리됩니다.
+// // UI에서 registerVendorWithApproval()을 호출하여 결재 프로세스를 시작합니다.
+
+// console.log("✅ 정규업체 등록 요청 데이터:", {
+// registrationId,
+// companyName: requestData.companyNameKor,
+// businessNumber: requestData.businessNumber,
+// representative: requestData.representativeNameKor,
+// requestedBy: session.user.name,
+// requestDate: new Date().toISOString()
+// });
+
+// // 캐시 무효화 - 더 강력한 무효화
+// revalidateTag("vendor-regular-registrations");
+// revalidateTag(`vendor-regular-registration-${registrationId}`);
+// revalidateTag("vendor-registration-status");
+
+// return {
+// success: true,
+// message: `정규업체 등록 요청이 성공적으로 제출되었습니다.\n${mdgResult.success ? 'MDG 인터페이스 연동이 완료되었습니다.' : 'MDG 인터페이스 연동에 실패했습니다. (재시도 가능)'}\n결재 승인 후 정규업체 등록이 완료됩니다.`
+// };
+
+// } catch (error) {
+// console.error("정규업체 등록 요청 오류:", error);
+// return {
+// success: false,
+// error: error instanceof Error ? error.message : "정규업체 등록 요청 중 오류가 발생했습니다."
+// };
+// }
+// }
// MDG로 정규업체 등록 요청 데이터를 보내는 함수
export async function sendRegistrationRequestToMDG(
|
