diff options
Diffstat (limited to 'lib/techsales-rfq/table/tech-sales-rfq-attachments-sheet.tsx')
| -rw-r--r-- | lib/techsales-rfq/table/tech-sales-rfq-attachments-sheet.tsx | 143 |
1 files changed, 138 insertions, 5 deletions
diff --git a/lib/techsales-rfq/table/tech-sales-rfq-attachments-sheet.tsx b/lib/techsales-rfq/table/tech-sales-rfq-attachments-sheet.tsx index f2ae1084..95d4e1a3 100644 --- a/lib/techsales-rfq/table/tech-sales-rfq-attachments-sheet.tsx +++ b/lib/techsales-rfq/table/tech-sales-rfq-attachments-sheet.tsx @@ -49,6 +49,10 @@ import { import prettyBytes from "pretty-bytes"
import { formatDate } from "@/lib/utils"
import { processTechSalesRfqAttachments } from "@/lib/techsales-rfq/service"
+import { mapTechSalesRfqSendToTemplateVariables } from "@/lib/techsales-rfq/approval-handlers"
+import { requestRfqResendWithDrmApproval } from "@/lib/techsales-rfq/approval-actions"
+import { ApplicationReasonDialog } from "@/lib/rfq-last/vendor/application-reason-dialog"
+import { ApprovalPreviewDialog } from "@/lib/approval/client"
import { useSession } from "next-auth/react"
const MAX_FILE_SIZE = 6e8 // 600MB
@@ -130,6 +134,18 @@ export function TechSalesRfqAttachmentsSheet({ }: TechSalesRfqAttachmentsSheetProps) {
const [isPending, setIsPending] = React.useState(false)
const session = useSession()
+ const [drmApprovalData, setDrmApprovalData] = React.useState<{
+ attachments: Array<{
+ id: number
+ fileName?: string | null
+ fileSize?: number | null
+ attachmentType?: string | null
+ }>
+ } | null>(null)
+ const [applicationReason, setApplicationReason] = React.useState("")
+ const [approvalPreviewVariables, setApprovalPreviewVariables] = React.useState<Record<string, string> | null>(null)
+ const [showApplicationReasonDialog, setShowApplicationReasonDialog] = React.useState(false)
+ const [showApprovalPreview, setShowApprovalPreview] = React.useState(false)
// 파일 다운로드 핸들러
const handleDownloadClick = React.useCallback(async (filePath: string, fileName: string) => {
@@ -266,6 +282,77 @@ export function TechSalesRfqAttachmentsSheet({ removeExisting(index)
}, [removeExisting])
+ // DRM 해제 결재 - 신청사유 확인
+ const handleApplicationReasonConfirm = React.useCallback(async (reason: string) => {
+ if (!drmApprovalData || !rfq) {
+ toast.error("결재 데이터가 없습니다.")
+ return
+ }
+
+ try {
+ const templateVariables = await mapTechSalesRfqSendToTemplateVariables({
+ attachments: drmApprovalData.attachments.map(att => ({
+ fileName: att.fileName,
+ fileSize: att.fileSize,
+ })),
+ vendorNames: [],
+ applicationReason: reason,
+ })
+
+ setApplicationReason(reason)
+ setApprovalPreviewVariables(templateVariables)
+ setShowApprovalPreview(true)
+ } catch (error) {
+ console.error("템플릿 변수 생성 실패:", error)
+ toast.error("결재 문서 생성에 실패했습니다.")
+ }
+ }, [drmApprovalData, rfq])
+
+ // DRM 해제 결재 - 상신
+ const handleApprovalConfirm = React.useCallback(async (approvalData: {
+ approvers: string[];
+ title: string;
+ description?: string;
+ }) => {
+ if (!drmApprovalData || !rfq) {
+ toast.error("결재 데이터가 없습니다.")
+ return
+ }
+
+ if (!session.data?.user?.epId) {
+ toast.error("Knox EP ID가 필요합니다.")
+ return
+ }
+
+ try {
+ const result = await requestRfqResendWithDrmApproval({
+ rfqId: rfq.id,
+ rfqCode: rfq.rfqCode || undefined,
+ drmAttachmentIds: drmApprovalData.attachments.map(att => att.id),
+ drmAttachments: drmApprovalData.attachments,
+ applicationReason,
+ currentUser: {
+ id: parseInt(session.data?.user.id || "0"),
+ epId: session.data.user.epId || null,
+ name: session.data.user.name || undefined,
+ email: session.data.user.email || undefined,
+ },
+ approvers: approvalData.approvers,
+ })
+
+ toast.success(result.message || "DRM 해제 결재가 상신되었습니다.")
+ setShowApprovalPreview(false)
+ setShowApplicationReasonDialog(false)
+ setDrmApprovalData(null)
+ setApprovalPreviewVariables(null)
+ // 결재 상신 후 시트 닫기
+ props.onOpenChange?.(false)
+ } catch (error) {
+ console.error("DRM 해제 결재 상신 실패:", error)
+ toast.error(error instanceof Error ? error.message : "DRM 해제 결재 상신에 실패했습니다.")
+ }
+ }, [applicationReason, drmApprovalData, rfq, session.data?.user?.email, session.data?.user?.epId, session.data?.user?.id, session.data?.user?.name, props])
+
// Handle form submission
const onSubmit = async (data: AttachmentsFormValues) => {
if (!rfq) {
@@ -314,11 +401,26 @@ export function TechSalesRfqAttachmentsSheet({ } else if (deletedCount > 0) {
successMessage = `${deletedCount}개 파일이 삭제되었습니다.`
}
-
- toast.success(successMessage)
-
- // 다이얼로그 자동 닫기
- props.onOpenChange?.(false)
+
+ const requiresDrmApproval = (result as any)?.requiresDrmApproval
+ const drmAttachments = ((result as any)?.drmAttachments as ExistingTechSalesAttachment[] | undefined) || []
+
+ if (requiresDrmApproval) {
+ toast.success(`${successMessage} DRM 첨부파일이 포함되어 결재가 필요합니다.`)
+ setDrmApprovalData({
+ attachments: drmAttachments.map(att => ({
+ id: att.id,
+ fileName: att.originalFileName || att.fileName,
+ fileSize: att.fileSize,
+ attachmentType: att.attachmentType,
+ }))
+ })
+ setShowApplicationReasonDialog(true)
+ } else {
+ toast.success(successMessage)
+ // 다이얼로그 자동 닫기
+ props.onOpenChange?.(false)
+ }
// // 즉시 첨부파일 목록 새로고침
// const refreshResult = await getTechSalesRfqAttachments(rfq.id)
@@ -565,6 +667,37 @@ export function TechSalesRfqAttachmentsSheet({ </form>
</Form>
</SheetContent>
+
+ {/* DRM 첨부 결재 - 신청사유 입력 */}
+ {drmApprovalData && (
+ <ApplicationReasonDialog
+ open={showApplicationReasonDialog}
+ onOpenChange={setShowApplicationReasonDialog}
+ onConfirm={handleApplicationReasonConfirm}
+ vendorCount={0}
+ attachmentCount={drmApprovalData.attachments.length}
+ />
+ )}
+
+ {/* DRM 첨부 결재 - 미리보기 */}
+ {drmApprovalData && approvalPreviewVariables && (
+ <ApprovalPreviewDialog
+ open={showApprovalPreview}
+ onOpenChange={setShowApprovalPreview}
+ templateName="암호화해제 신청"
+ variables={approvalPreviewVariables}
+ title={`DRM 첨부파일 해제 - ${rfq?.rfqCode || "RFQ"}`}
+ currentUser={{
+ id: parseInt(session.data?.user.id || "0"),
+ epId: session.data?.user.epId,
+ name: session.data?.user.name || undefined,
+ email: session.data?.user.email || undefined,
+ }}
+ onConfirm={handleApprovalConfirm}
+ allowTitleEdit={false}
+ allowDescriptionEdit={false}
+ />
+ )}
</Sheet>
)
}
\ No newline at end of file |
