[agent-pipeline] pipe-20260305133525-uca5 round-3

This commit is contained in:
DDD1542 2026-03-05 22:47:07 +09:00
parent f93dc26338
commit 7d6ca6403a
2 changed files with 255 additions and 0 deletions

View File

@ -90,6 +90,7 @@ export interface ApprovalLineTemplateStep {
step_id: number;
template_id: number;
step_order: number;
step_type?: "approval" | "consensus" | "notification";
approver_type: "user" | "position" | "dept";
approver_user_id?: string;
approver_position?: string;
@ -98,6 +99,23 @@ export interface ApprovalLineTemplateStep {
company_code: string;
}
export interface ApprovalProxySetting {
id: number;
original_user_id: string;
original_user_name?: string;
original_dept_name?: string;
proxy_user_id: string;
proxy_user_name?: string;
proxy_dept_name?: string;
start_date: string;
end_date: string;
reason?: string;
is_active: string;
company_code: string;
created_at: string;
updated_at: string;
}
export interface ApprovalRequest {
request_id: number;
title: string;
@ -157,12 +175,15 @@ export interface CreateApprovalRequestInput {
screen_id?: number;
button_component_id?: string;
approval_mode?: "sequential" | "parallel";
approval_type?: "self" | "escalation" | "consensus" | "post";
approvers: {
approver_id: string;
approver_name?: string;
approver_position?: string;
approver_dept?: string;
approver_label?: string;
step_type?: "approval" | "consensus" | "notification";
step_order?: number;
}[];
}
@ -451,3 +472,175 @@ export async function processApprovalLine(
return { success: false, error: error.message };
}
}
// ============================================================
// 대결 위임 설정 (Proxy Settings) API
// ============================================================
export async function getProxySettings(): Promise<ApiResponse<ApprovalProxySetting[]>> {
try {
const response = await fetch(`${API_BASE}/approval/proxy-settings`, {
headers: getAuthHeaders(),
credentials: "include",
});
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}
export async function createProxySetting(data: {
original_user_id: string;
proxy_user_id: string;
start_date: string;
end_date: string;
reason?: string;
}): Promise<ApiResponse<ApprovalProxySetting>> {
try {
const response = await fetch(`${API_BASE}/approval/proxy-settings`, {
method: "POST",
headers: getAuthHeaders(),
credentials: "include",
body: JSON.stringify(data),
});
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}
export async function updateProxySetting(
id: number,
data: {
proxy_user_id?: string;
start_date?: string;
end_date?: string;
reason?: string;
is_active?: string;
}
): Promise<ApiResponse<ApprovalProxySetting>> {
try {
const response = await fetch(`${API_BASE}/approval/proxy-settings/${id}`, {
method: "PUT",
headers: getAuthHeaders(),
credentials: "include",
body: JSON.stringify(data),
});
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}
export async function deleteProxySetting(id: number): Promise<ApiResponse<void>> {
try {
const response = await fetch(`${API_BASE}/approval/proxy-settings/${id}`, {
method: "DELETE",
headers: getAuthHeaders(),
credentials: "include",
});
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}
export async function checkActiveProxy(
userId: string
): Promise<ApiResponse<{ proxy_user_id: string; proxy_user_name?: string } | null>> {
try {
const response = await fetch(
`${API_BASE}/approval/proxy-settings/check/${encodeURIComponent(userId)}`,
{ headers: getAuthHeaders(), credentials: "include" }
);
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}
// ============================================================
// 후결 승인 API
// ============================================================
export async function postApproveRequest(requestId: number): Promise<ApiResponse<void>> {
try {
const response = await fetch(`${API_BASE}/approval/requests/${requestId}/post-approve`, {
method: "POST",
headers: getAuthHeaders(),
credentials: "include",
});
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}
// ============================================================
// 결재선 템플릿 단계 (Template Steps) API
// ============================================================
export async function getTemplateSteps(
templateId: number
): Promise<ApiResponse<ApprovalLineTemplateStep[]>> {
try {
const response = await fetch(`${API_BASE}/approval/templates/${templateId}/steps`, {
headers: getAuthHeaders(),
credentials: "include",
});
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}
export async function createTemplateStep(
templateId: number,
data: Omit<ApprovalLineTemplateStep, "step_id" | "template_id" | "company_code">
): Promise<ApiResponse<ApprovalLineTemplateStep>> {
try {
const response = await fetch(`${API_BASE}/approval/templates/${templateId}/steps`, {
method: "POST",
headers: getAuthHeaders(),
credentials: "include",
body: JSON.stringify(data),
});
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}
export async function updateTemplateStep(
templateId: number,
stepId: number,
data: Partial<Omit<ApprovalLineTemplateStep, "step_id" | "template_id" | "company_code">>
): Promise<ApiResponse<ApprovalLineTemplateStep>> {
try {
const response = await fetch(`${API_BASE}/approval/templates/${templateId}/steps/${stepId}`, {
method: "PUT",
headers: getAuthHeaders(),
credentials: "include",
body: JSON.stringify(data),
});
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}
export async function deleteTemplateStep(
templateId: number,
stepId: number
): Promise<ApiResponse<void>> {
try {
const response = await fetch(`${API_BASE}/approval/templates/${templateId}/steps/${stepId}`, {
method: "DELETE",
headers: getAuthHeaders(),
credentials: "include",
});
return await response.json();
} catch (error: any) {
return { success: false, error: error.message };
}
}

View File

@ -0,0 +1,62 @@
# Page snapshot
```yaml
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e4]:
- complementary [ref=e5]:
- img "WACE 솔루션 로고" [ref=e9]
- generic [ref=e11]:
- img [ref=e12]
- generic [ref=e16]:
- paragraph [ref=e17]: 현재 관리 회사
- paragraph [ref=e18]: WACE (최고 관리자)
- generic [ref=e19]:
- button "관리자 메뉴로 전환" [ref=e20] [cursor=pointer]:
- img
- text: 관리자 메뉴로 전환
- button "회사 선택" [ref=e21] [cursor=pointer]:
- img
- text: 회사 선택
- navigation [ref=e23]:
- generic [ref=e25] [cursor=pointer]:
- generic [ref=e26]:
- img [ref=e27]
- generic "DTG 이력관리" [ref=e29]
- img [ref=e31]
- generic [ref=e34] [cursor=pointer]:
- generic [ref=e35]:
- img [ref=e36]
- generic "물류 통합관제" [ref=e39]
- img [ref=e41]
- generic [ref=e45] [cursor=pointer]:
- img [ref=e46]
- generic "카테고리" [ref=e49]
- generic [ref=e52] [cursor=pointer]:
- img [ref=e53]
- generic "견적관리 테스트" [ref=e56]
- generic [ref=e59] [cursor=pointer]:
- img [ref=e60]
- generic "피벗테스트" [ref=e63]
- button "관리자 관리자 해외영업부" [ref=e65] [cursor=pointer]:
- img "관리자" [ref=e67]
- generic [ref=e68]:
- paragraph [ref=e69]: 관리자
- paragraph [ref=e70]: 해외영업부
- main [ref=e71]:
- generic [ref=e75]:
- heading "Vexplor에 오신 것을 환영합니다!" [level=3] [ref=e76]
- paragraph [ref=e77]: 제품 수명 주기 관리 시스템을 통해 효율적인 업무를 시작하세요.
- generic [ref=e78]:
- generic [ref=e79]: Node.js
- generic [ref=e80]: Next.js
- generic [ref=e81]: Shadcn/ui
- region "Notifications alt+T"
- generic [ref=e82]:
- img [ref=e84]
- button "Open Tanstack query devtools" [ref=e132] [cursor=pointer]:
- img [ref=e133]
- button "Open Next.js Dev Tools" [ref=e186] [cursor=pointer]:
- img [ref=e187]
- alert [ref=e190]
```