summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/shi-api/shi-api-utils.ts14
-rw-r--r--lib/users/department-domain/service.ts110
2 files changed, 123 insertions, 1 deletions
diff --git a/lib/shi-api/shi-api-utils.ts b/lib/shi-api/shi-api-utils.ts
index c0b62b0d..bb80c454 100644
--- a/lib/shi-api/shi-api-utils.ts
+++ b/lib/shi-api/shi-api-utils.ts
@@ -4,6 +4,7 @@ import { nonsapUser, users } from '@/db/schema';
import db from '@/db/db';
import { debugError, debugLog, debugWarn, debugSuccess } from '@/lib/debug-utils';
import { bulkUpsert } from '@/lib/soap/batch-utils';
+import { autoAssignPendingUsersDomains } from '@/lib/users/department-domain/service';
const shiApiBaseUrl = process.env.SHI_API_BASE_URL;
const shiNonsapUserSegment = process.env.SHI_NONSAP_USER_SEGMENT;
@@ -110,10 +111,11 @@ export const getAllNonsapUser = async () => {
knoxId: u.MYSNG_ID || undefined,
name: u.USR_NM || undefined,
email: u.EMAIL_ADR || undefined,
- epId: u.MYSNG_ID || undefined,
+ epId: u.MYSNG_USR_ID || undefined,
deptCode: u.DEPTCD || undefined,
deptName: u.DEPTNM || undefined,
phone: u.HP_NO || undefined,
+ domain: 'pending', // SHI-API를 통해 동기화되는 사용자는 pending 도메인으로 설정
isAbsent,
isDeletedOnNonSap: isDeleted,
isActive,
@@ -155,6 +157,16 @@ export const getAllNonsapUser = async () => {
// 휴직 사용자도 API에서 수신하므로, 기존 사용자와의 비교를 통한 휴직 처리 로직은 더 이상 필요하지 않음
+ // ** 4. 사용자 동기화 완료 후 부서별 도메인 자동 할당 처리 **
+ debugLog('[DOMAIN-AUTO-ASSIGN] SHI-API 동기화 완료 후 부서별 도메인 자동 할당 시작');
+ try {
+ const domainAssignResult = await autoAssignPendingUsersDomains();
+ debugSuccess(`[DOMAIN-AUTO-ASSIGN] 부서별 도메인 자동 할당 완료: ${domainAssignResult.message}`);
+ } catch (domainError) {
+ debugError('[DOMAIN-AUTO-ASSIGN] 부서별 도메인 자동 할당 실패', domainError);
+ // 도메인 할당 실패해도 메인 동기화 결과는 반환
+ }
+
return {
fetched: Array.isArray(data) ? data.length : 0,
staged: Array.isArray(data) ? data.length : 0,
diff --git a/lib/users/department-domain/service.ts b/lib/users/department-domain/service.ts
index 570ef2cf..834de83a 100644
--- a/lib/users/department-domain/service.ts
+++ b/lib/users/department-domain/service.ts
@@ -7,6 +7,7 @@ import {
departmentDomainAssignments,
departmentDomainAssignmentHistory
} from "@/db/schema/departmentDomainAssignments";
+import { users } from "@/db/schema/users";
import { and, eq, inArray, desc } from "drizzle-orm";
import { getServerSession } from "next-auth/next";
import { authOptions } from "@/app/api/auth/[...nextauth]/route";
@@ -436,4 +437,113 @@ export async function getDepartmentDomainStats() {
tags: ["department-domain-assignments"],
}
)();
+}
+
+// pending 도메인 사용자들의 부서별 도메인 자동 할당
+export async function autoAssignPendingUsersDomains() {
+ unstable_noStore();
+
+ try {
+ console.log('[DOMAIN-AUTO-ASSIGN] pending 사용자 도메인 자동 할당 시작');
+
+ // 1. pending 도메인 사용자들의 부서 정보 조회
+ const pendingUsers = await db
+ .select({
+ id: users.id,
+ email: users.email,
+ name: users.name,
+ deptCode: users.deptCode,
+ deptName: users.deptName,
+ })
+ .from(users)
+ .where(eq(users.domain, 'pending'));
+
+ console.log(`[DOMAIN-AUTO-ASSIGN] pending 사용자 ${pendingUsers.length}명 발견`);
+
+ if (pendingUsers.length === 0) {
+ console.log('[DOMAIN-AUTO-ASSIGN] pending 도메인 사용자가 없습니다.');
+ return {
+ success: true,
+ processedCount: 0,
+ assignedCount: 0,
+ skippedCount: 0,
+ message: 'pending 도메인 사용자가 없습니다.',
+ };
+ }
+
+ // 2. 모든 활성 부서별 도메인 할당 정보 조회
+ const domainAssignments = await db
+ .select({
+ companyCode: departmentDomainAssignments.companyCode,
+ departmentCode: departmentDomainAssignments.departmentCode,
+ assignedDomain: departmentDomainAssignments.assignedDomain,
+ })
+ .from(departmentDomainAssignments)
+ .where(eq(departmentDomainAssignments.isActive, true));
+
+ // 3. 부서별 도메인 매핑을 위한 Map 생성
+ const domainMap = new Map<string, string>();
+ domainAssignments.forEach(assignment => {
+ const key = `${assignment.companyCode}-${assignment.departmentCode}`;
+ domainMap.set(key, assignment.assignedDomain);
+ });
+
+ console.log(`[DOMAIN-AUTO-ASSIGN] ${domainAssignments.length}개 부서의 도메인 할당 정보 로드됨`);
+
+ let assignedCount = 0;
+ let skippedCount = 0;
+
+ // 4. 각 pending 사용자에 대해 도메인 할당 처리
+ for (const user of pendingUsers) {
+ try {
+ // 사용자의 부서에 대한 도메인 할당 정보 확인
+ // 현재 회사 코드 사용 (환경변수 또는 기본값)
+ const companyCode = process.env.CURRENT_COMPANY_CODE || 'D60';
+ const domainKey = `${companyCode}-${user.deptCode || ''}`;
+ const assignedDomain = domainMap.get(domainKey);
+
+ if (assignedDomain && assignedDomain !== 'pending') {
+ // 도메인 할당 정보가 있으면 업데이트
+ await db
+ .update(users)
+ .set({
+ domain: assignedDomain as UserDomain,
+ updatedAt: new Date(),
+ })
+ .where(eq(users.id, user.id));
+
+ assignedCount++;
+ console.log(`[DOMAIN-AUTO-ASSIGN] 사용자 ${user.name}(${user.email}) -> ${assignedDomain} 도메인 할당`);
+ } else {
+ // 할당 정보가 없으면 pending 유지
+ skippedCount++;
+ console.log(`[DOMAIN-AUTO-ASSIGN] 사용자 ${user.name}(${user.email}) -> 부서(${user.deptCode})에 대한 도메인 할당 정보 없음, pending 유지`);
+ }
+ } catch (error) {
+ console.error(`[DOMAIN-AUTO-ASSIGN] 사용자 ${user.email} 처리 실패:`, error);
+ skippedCount++;
+ }
+ }
+
+ const result = {
+ success: true,
+ processedCount: pendingUsers.length,
+ assignedCount,
+ skippedCount,
+ message: `${assignedCount}명의 사용자에게 도메인이 자동 할당되었습니다. (스킵: ${skippedCount}명)`,
+ };
+
+ console.log(`[DOMAIN-AUTO-ASSIGN] 완료: ${JSON.stringify(result)}`);
+ return result;
+
+ } catch (error) {
+ console.error('[DOMAIN-AUTO-ASSIGN] pending 사용자 도메인 자동 할당 실패:', error);
+ return {
+ success: false,
+ processedCount: 0,
+ assignedCount: 0,
+ skippedCount: 0,
+ message: getErrorMessage(error),
+ };
+ }
} \ No newline at end of file