diff options
Diffstat (limited to 'lib/vendor-regular-registrations/table/vendor-regular-registrations-table-toolbar-actions.tsx')
| -rw-r--r-- | lib/vendor-regular-registrations/table/vendor-regular-registrations-table-toolbar-actions.tsx | 119 |
1 files changed, 108 insertions, 11 deletions
diff --git a/lib/vendor-regular-registrations/table/vendor-regular-registrations-table-toolbar-actions.tsx b/lib/vendor-regular-registrations/table/vendor-regular-registrations-table-toolbar-actions.tsx index df2ab53a..d88cd7b7 100644 --- a/lib/vendor-regular-registrations/table/vendor-regular-registrations-table-toolbar-actions.tsx +++ b/lib/vendor-regular-registrations/table/vendor-regular-registrations-table-toolbar-actions.tsx @@ -15,7 +15,12 @@ import { import { useState } from "react"
import { SkipReasonDialog } from "@/components/vendor-regular-registrations/skip-reason-dialog"
import { RegistrationRequestDialog } from "@/components/vendor-regular-registrations/registration-request-dialog"
+import { ApprovalPreviewDialog } from "@/components/approval/ApprovalPreviewDialog"
import { useRouter } from "next/navigation"
+import { useSession } from "next-auth/react"
+import { registerVendorWithApproval } from "../approval-actions"
+import { mapRegistrationToTemplateVariables } from "../handlers"
+import type { RegistrationRequestData } from "@/components/vendor-regular-registrations/registration-request-dialog"
interface VendorRegularRegistrationsTableToolbarActionsProps {
table: Table<VendorRegularRegistration>
@@ -25,6 +30,8 @@ export function VendorRegularRegistrationsTableToolbarActions({ table,
}: VendorRegularRegistrationsTableToolbarActionsProps) {
const router = useRouter()
+ const { data: session } = useSession()
+
const [syncLoading, setSyncLoading] = useState<{
missingContract: boolean;
additionalInfo: boolean;
@@ -43,6 +50,7 @@ export function VendorRegularRegistrationsTableToolbarActions({ legalReview: false,
})
+ // 2-step 결재 프로세스를 위한 상태
const [registrationRequestDialog, setRegistrationRequestDialog] = useState<{
open: boolean;
registration: VendorRegularRegistration | null;
@@ -51,6 +59,18 @@ export function VendorRegularRegistrationsTableToolbarActions({ registration: null,
})
+ const [approvalDialog, setApprovalDialog] = useState<{
+ open: boolean;
+ registration: VendorRegularRegistration | null;
+ }>({
+ open: false,
+ registration: null,
+ })
+
+ // 결재를 위한 중간 상태 저장
+ const [registrationFormData, setRegistrationFormData] = useState<RegistrationRequestData | null>(null)
+ const [approvalVariables, setApprovalVariables] = useState<Record<string, string>>({})
+
const selectedRows = table.getFilteredSelectedRowModel().rows.map(row => row.original)
@@ -129,7 +149,7 @@ export function VendorRegularRegistrationsTableToolbarActions({ }
};
- // 등록요청 핸들러
+ // 등록요청 핸들러 - Step 1: 정보 입력
const handleRegistrationRequest = () => {
const approvalReadyRows = selectedRows.filter(row => row.status === "approval_ready");
@@ -149,22 +169,73 @@ export function VendorRegularRegistrationsTableToolbarActions({ });
};
- const handleRegistrationRequestSubmit = async (requestData: any) => {
- if (!registrationRequestDialog.registration) return;
+ // 등록요청 정보 입력 완료 - Step 1에서 Step 2로 전환
+ const handleRegistrationRequestSubmit = async (requestData: RegistrationRequestData) => {
+ if (!registrationRequestDialog.registration || !session?.user) return;
+
+ try {
+ // 폼 데이터 저장
+ setRegistrationFormData(requestData);
+
+ // 결재 템플릿 변수 생성
+ const requestedAt = new Date();
+ const variables = await mapRegistrationToTemplateVariables({
+ requestData,
+ requestedAt,
+ });
+
+ setApprovalVariables(variables);
+
+ // RegistrationRequestDialog 닫고 ApprovalPreviewDialog 열기
+ setRegistrationRequestDialog({ open: false, registration: null });
+ setApprovalDialog({
+ open: true,
+ registration: registrationRequestDialog.registration,
+ });
+ } catch (error) {
+ console.error("결재 준비 중 오류 발생:", error);
+ toast.error("결재 준비 중 오류가 발생했습니다.");
+ }
+ };
+
+ // 결재 상신 - Step 2: 결재선 선택 후 최종 상신
+ const handleApprovalSubmit = async (approvers: any[]) => {
+ if (!approvalDialog.registration || !registrationFormData || !session?.user) {
+ toast.error("세션 정보가 없습니다.");
+ return;
+ }
setSyncLoading(prev => ({ ...prev, registrationRequest: true }));
try {
- const result = await submitRegistrationRequest(registrationRequestDialog.registration.id, requestData);
- if (result.success) {
- toast.success(result.message);
- setRegistrationRequestDialog({ open: false, registration: null });
+ // 결재선에서 EP ID 추출 (상신자 제외)
+ const approverEpIds = approvers
+ .filter((line) => line.seq !== "0" && line.epId)
+ .map((line) => line.epId!);
+
+ // 결재 워크플로우 시작
+ const result = await registerVendorWithApproval({
+ registrationId: approvalDialog.registration.id,
+ requestData: registrationFormData,
+ vendorId: approvalDialog.registration.vendorId, // vendors 테이블에서 정보를 가져오기 위한 vendorId
+ currentUser: {
+ id: Number(session.user.id),
+ epId: session.user.epId || null,
+ email: session.user.email || undefined,
+ },
+ approvers: approverEpIds,
+ });
+
+ if (result.status === 'pending_approval') {
+ // 성공 시에만 상태 초기화 및 페이지 리로드
+ setRegistrationFormData(null);
+ setApprovalVariables({});
+ setApprovalDialog({ open: false, registration: null });
+ toast.success("정규업체 등록 결재가 상신되었습니다.");
router.refresh();
- } else {
- toast.error(result.error);
}
} catch (error) {
- console.error("등록요청 오류:", error);
- toast.error("등록요청 중 오류가 발생했습니다.");
+ console.error("결재 상신 중 오류:", error);
+ toast.error("결재 상신 중 오류가 발생했습니다.");
} finally {
setSyncLoading(prev => ({ ...prev, registrationRequest: false }));
}
@@ -233,6 +304,32 @@ export function VendorRegularRegistrationsTableToolbarActions({ registration={registrationRequestDialog.registration}
onSubmit={handleRegistrationRequestSubmit}
/>
+
+ {/* 결재 미리보기 Dialog - 정규업체 등록 */}
+ {session?.user && approvalDialog.registration && (
+ <ApprovalPreviewDialog
+ open={approvalDialog.open}
+ onOpenChange={(open) => {
+ setApprovalDialog(prev => ({ ...prev, open }));
+ if (!open) {
+ // 다이얼로그가 닫히면 폼 데이터도 초기화
+ setRegistrationFormData(null);
+ setApprovalVariables({});
+ }
+ }}
+ templateName="정규업체 등록"
+ variables={approvalVariables}
+ title={`정규업체 등록 - ${approvalDialog.registration.companyName}`}
+ description={`${approvalDialog.registration.companyName} 정규업체 등록 요청`}
+ currentUser={{
+ id: Number(session.user.id),
+ epId: session.user.epId || null,
+ name: session.user.name || null,
+ email: session.user.email || '',
+ }}
+ onSubmit={handleApprovalSubmit}
+ />
+ )}
</div>
)
}
|
