summaryrefslogtreecommitdiff
path: root/lib/knox-api
diff options
context:
space:
mode:
Diffstat (limited to 'lib/knox-api')
-rw-r--r--lib/knox-api/approval/service.ts30
-rw-r--r--lib/knox-api/organization-service.ts95
2 files changed, 110 insertions, 15 deletions
diff --git a/lib/knox-api/approval/service.ts b/lib/knox-api/approval/service.ts
index 6ef1b1f6..0bd817a6 100644
--- a/lib/knox-api/approval/service.ts
+++ b/lib/knox-api/approval/service.ts
@@ -1,7 +1,7 @@
"use server"
import db from '@/db/db';
import { ApprovalLine } from "./approval";
-import { approval } from '@/db/schema/knox/approvals';
+import { approvalLogs } from '@/db/schema/knox/approvals';
import { eq, and } from 'drizzle-orm';
// ========== 데이터베이스 서비스 함수들 ==========
@@ -21,7 +21,7 @@ export async function saveApprovalToDatabase(
aplns: ApprovalLine[]
): Promise<void> {
try {
- await db.insert(approval).values({
+ await db.insert(approvalLogs).values({
apInfId,
userId,
epId,
@@ -51,12 +51,12 @@ export async function updateApprovalStatus(
): Promise<void> {
try {
await db
- .update(approval)
+ .update(approvalLogs)
.set({
status,
updatedAt: new Date(),
})
- .where(eq(approval.apInfId, apInfId));
+ .where(eq(approvalLogs.apInfId, apInfId));
} catch (error) {
console.error('결재 상태 업데이트 실패:', error);
throw new Error('결재 상태를 업데이트하는 중 오류가 발생했습니다.');
@@ -69,15 +69,15 @@ export async function updateApprovalStatus(
export async function getApprovalFromDatabase(
apInfId: string,
includeDeleted: boolean = false
-): Promise<typeof approval.$inferSelect | null> {
+): Promise<typeof approvalLogs.$inferSelect | null> {
try {
const whereCondition = includeDeleted
- ? eq(approval.apInfId, apInfId)
- : and(eq(approval.apInfId, apInfId), eq(approval.isDeleted, false));
+ ? eq(approvalLogs.apInfId, apInfId)
+ : and(eq(approvalLogs.apInfId, apInfId), eq(approvalLogs.isDeleted, false));
const result = await db
.select()
- .from(approval)
+ .from(approvalLogs)
.where(whereCondition)
.limit(1);
@@ -96,17 +96,17 @@ export async function getApprovalsByUser(
limit: number = 50,
offset: number = 0,
includeDeleted: boolean = false
-): Promise<typeof approval.$inferSelect[]> {
+): Promise<typeof approvalLogs.$inferSelect[]> {
try {
const whereCondition = includeDeleted
- ? eq(approval.userId, userId)
- : and(eq(approval.userId, userId), eq(approval.isDeleted, false));
+ ? eq(approvalLogs.userId, userId)
+ : and(eq(approvalLogs.userId, userId), eq(approvalLogs.isDeleted, false));
const result = await db
.select()
- .from(approval)
+ .from(approvalLogs)
.where(whereCondition)
- .orderBy(approval.createdAt)
+ .orderBy(approvalLogs.createdAt)
.limit(limit)
.offset(offset);
@@ -125,12 +125,12 @@ export async function deleteApprovalFromDatabase(
): Promise<void> {
try {
await db
- .update(approval)
+ .update(approvalLogs)
.set({
isDeleted: true,
updatedAt: new Date(),
})
- .where(eq(approval.apInfId, apInfId));
+ .where(eq(approvalLogs.apInfId, apInfId));
} catch (error) {
console.error('결재 데이터 삭제 실패:', error);
throw new Error('결재 데이터를 삭제하는 중 오류가 발생했습니다.');
diff --git a/lib/knox-api/organization-service.ts b/lib/knox-api/organization-service.ts
new file mode 100644
index 00000000..c90b00f7
--- /dev/null
+++ b/lib/knox-api/organization-service.ts
@@ -0,0 +1,95 @@
+'use server';
+
+import db from '@/db/db';
+import { organization as organizationTable } from '@/db/schema/knox/organization';
+import { count, ilike, isNotNull } from 'drizzle-orm';
+
+
+// ----------------------------------------------------
+// 조직 관리자 검색 함수
+// ----------------------------------------------------
+
+interface SearchOrganizationsForManagerInput {
+ search: string;
+ page: number;
+ perPage: number;
+}
+
+interface SearchOrganizationsForManagerResult {
+ data: Array<{
+ id: string;
+ departmentCode: string;
+ departmentName: string;
+ managerId: string;
+ managerName: string;
+ managerTitle: string;
+ companyCode: string;
+ companyName: string;
+ }>;
+ total: number;
+ pageCount: number;
+}
+
+export async function searchOrganizationsForManager(
+ input: SearchOrganizationsForManagerInput
+): Promise<SearchOrganizationsForManagerResult> {
+ const offset = (input.page - 1) * input.perPage;
+
+ // 검색 조건 구성
+ const searchTerm = `%${input.search}%`;
+
+ const results = await db
+ .select({
+ id: organizationTable.departmentCode,
+ departmentCode: organizationTable.departmentCode,
+ departmentName: organizationTable.departmentName,
+ managerId: organizationTable.managerId,
+ managerName: organizationTable.managerName,
+ managerTitle: organizationTable.managerTitle,
+ companyCode: organizationTable.companyCode,
+ companyName: organizationTable.companyName,
+ })
+ .from(organizationTable)
+ .where(
+ // 관리자가 있고, 부서명 또는 관리자명으로 검색
+ isNotNull(organizationTable.managerId)
+ )
+ .having(
+ // 부서명 또는 관리자명으로 검색
+ ilike(organizationTable.departmentName, searchTerm) ||
+ ilike(organizationTable.managerName, searchTerm)
+ )
+ .orderBy(organizationTable.departmentName)
+ .limit(input.perPage)
+ .offset(offset);
+
+ // 전체 개수 조회
+ const totalResult = await db
+ .select({ count: count() })
+ .from(organizationTable)
+ .where(
+ isNotNull(organizationTable.managerId)
+ )
+ .having(
+ ilike(organizationTable.departmentName, searchTerm) ||
+ ilike(organizationTable.managerName, searchTerm)
+ );
+
+ const total = totalResult[0]?.count ?? 0;
+ const pageCount = Math.ceil(total / input.perPage);
+
+ return {
+ data: results as Array<{
+ id: string;
+ departmentCode: string;
+ departmentName: string;
+ managerId: string;
+ managerName: string;
+ managerTitle: string;
+ companyCode: string;
+ companyName: string;
+ }>,
+ total,
+ pageCount,
+ };
+} \ No newline at end of file