sales-frontend-oz 0.0.55 → 0.0.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/oz/constant/comment-pen-param.ts","../src/oz/constant/oz-param.ts","../src/oz/constant/pdf-param.ts","../src/oz/hooks/use-document-info.tsx","../src/oz/hooks/use-oz-event-listener.tsx","../src/oz/types/oz-event.types.ts","../src/oz/utils/bridge-util/alert-util.ts","../src/internal/const/test-data.ts","../src/internal/utils/internal-common-utils.ts","../src/oz/utils/common-util.ts","../src/oz/utils/bridge-util/fetch-util.ts","../src/oz/utils/bridge-util/oz-wrapper-util.ts","../src/oz/utils/bridge-util/create-report-util.ts","../src/oz/utils/bridge-util/get-draft-data-util.ts","../src/oz/utils/bridge-util/focus-util.ts","../src/oz/utils/bridge-util/save-pdf-util.ts","../src/oz/utils/bridge-util/validation-util.ts","../src/oz/utils/value-change-debounce-util.ts"],"names":["useMemo","ozdFile","useCallback","useEffect","OZViewerEvent","OZTriggerExternalEvent","Bridge","base64ToFile","fileToBase64","idx","debounce"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 형광펜 편집 관련 상수\n */\n\nconst commentPenDefaultParam = [\n `comment.selectedpen=highlightpen`,\n `comment.highlightpen_thick=15`,\n]\n\nexport const commentPenYellow = [...commentPenDefaultParam, `comment.highlightpen_color=ffd900`];\nexport const commentPenPink = [...commentPenDefaultParam, `comment.highlightpen_color=f48fb1`];\nexport const commentPenGreen = [...commentPenDefaultParam, `comment.highlightpen_color=81c784`];\nexport const commentPenEraser = [`comment.selectedpen=eraser`,];","/**\n * 모든페이지 공용으로 쓰는 OZ 뷰어파라미터\n */\n\nconst informationOzParam = [\n // 뷰어 콘솔 로그 정보의 수준(Level)을 설정합니다. - 뷰어 수행에 필요한 디버깅용 메시지를 자바 콘솔에 출력\n `information.debug = true`,\n];\nconst globalOzParam = [\n // 다중 보고서 호출 시 부모 보고서의 파라미터 값을 자식 보고서가 상속받을지 여부를 설정합니다.\n `global.inheritparameter=true`,\n // 멀티 보고서를 하나의 보고서처럼 사용할지 여부를 설정합니다.\n `global.concatpage=true`,\n // 멀티 보고서를 하나의 보고서처럼 설정한 경우 각각의 보고서별로 페이지 번호를 부여할지 여부를 설정합니다.\n // `global.eachpagenumberatconcatpage=true`,\n];\nconst eformOzParam = [\n `eform.signpad_type=embedded`,\n // `eform.signpad_type=keypad`,\n `eform.show_prev_next_input=true`,\n // `eform.signpad_prev_next_iconposition=sign_top_left`,\n `eform.signpad_prev_next_iconposition=sign_top`,\n `eform.signpad_show_draw_erase_button=false`,\n `eform.signpad_viewtype=keepratioandfittoframe`,\n `eform.radiobutton_type=ensurevisible_at_prev_next`,\n `eform.checkbox_type=ensurevisible_at_prev_next`,\n `eform.prev_next_required_rule=required_only`,\n `eform.prev_next_navigation_rule=required_only`,\n `eform.prev_next_constraint_rule=empty_only`,\n `eform.imagepicker_camera_iconposition = camera_top`,\n `eform.inputeventcommand=true`,\n // 서명 입력 중간중간에 onValueChanged가 호출 / 디폴트는 입력끝나고 창이 닫힐때 호출\n `eform.onvaluechanged_callrule_json=${JSON.stringify({ signpad: 'changed' })}`,\n `eform.inputcomponent_toolbar_button_json=${JSON.stringify({\n // 서명패드 버튼 배열 수정\n \"all\": {\n // 왼쪽에 [이전, 창닫기]\n \"left_align\": \"prev,ok\",\n // 오른쪽에 [다시쓰기, 성명,서명 불러오기, 다음]\n \"right_align\": \"clear,reusablesign,next\"\n }\n })}`,\n `eform.imagepicker_id_info=${JSON.stringify({\n ids: [\n {\n id: '1',\n name: '운전면허증_최신',\n size: '86x54',\n margin: '3',\n mask: [\n { name: '주민번호', area: '0,0,0,0' },\n { name: '운전면허번호', area: '0,0,0,0' },\n { name: '발급번호', area: '0,0,0,0' },\n { name: '발급날짜', area: '0,0,0,0' }\n ]\n },\n {\n id: '2',\n name: '운전면허증_구형',\n size: '86x54',\n margin: '3',\n mask: [\n { name: '주민번호', area: '0,0,0,0' },\n { name: '운전면허번호', area: '0,0,0,0' },\n { name: '발급번호', area: '0,0,0,0' },\n { name: '발급날짜', area: '0,0,0,0' }\n ]\n },\n {\n id: '3',\n name: '주민등록증',\n size: '86x54',\n margin: '3',\n mask: [\n { name: '주민번호', area: '0,0,0,0' },\n { name: '발급날짜', area: '0,0,0,0' }\n ]\n },\n {\n id: '4',\n name: '외국인등록증 앞면',\n size: '86x54',\n margin: '3',\n mask: [\n { name: '외국인등록번호1', area: '0,0,0,0' },\n { name: '외국인등록번호2', area: '0,0,0,0' },\n { name: '성명', area: '0,0,0,0' },\n { name: '성별', area: '0,0,0,0' },\n { name: '국가지역', area: '0,0,0,0' },\n { name: '체류자격', area: '0,0,0,0' },\n { name: '발급일자', area: '0,0,0,0' }\n ]\n },\n { id: '5', name: '외국인등록증 뒷면', size: '86x54', margin: '3', mask: [{ name: '외국인', area: '0,0,0,0' }] }\n ],\n choice: { title: '신분증을 선택하세요.', items: '1,2,3,4,5' }\n })}`\n];\n\nconst viewerOzPram = [\n `viewer.pagenavigate_by_prev_next=true`,\n `viewer.zoombymouse=false`,\n `viewer.zoombydoubletap=false`,\n `viewer.pagedisplay=singlepagecontinuous`,\n `viewer.usetoolbar=false`,\n `viewer.usestatusbar=false`,\n `viewer.useprogressbar=false`,\n `viewer.zoom=137`,\n `viewer.viewmode=fittowidth`,\n `viewer.hidehorizontalscroll=false`,\n `viewer.progresscommand=true`,\n `viewer.pagechangecommand=true`,\n `viewer.exportcommand=true`,\n `viewer.errorcommand=true`,\n `viewer.reportchangecommand=true`,\n `viewer.pagebindcommandinterval=500`,\n];\n\nconst ozdOzParam = [\n // connection.args=key=value로 넘기는 정보들은 ozr에서만 유효하나 ozd에서도 유효하도록 허용\n `ozd.allowreplaceformparam=true`\n]\n\nexport const commonOzParam = [\n ...informationOzParam,\n ...globalOzParam,\n ...eformOzParam,\n ...viewerOzPram,\n ...ozdOzParam,\n];","/**\n * PDF export시 공통으로 필요한 파라미터\n *\n * 제공하지 않는 파라미터\n * - filename\n * - ex) `pdf.filename=test.pdf`\n * - pages\n * - ex) `export.pages=1-2`\n * - userpassword\n * - ex) `pdf.userpassword=123213`\n */\nexport const commonPdfExportParam = [\n // `pdf.filename=${\"test.pdf\"}`,\n // `export.pages=${i.startPage}-${i.endPage}`,\n // \"pdf.userpassword=$pdfPassword\",G\n 'export.pagerange=range',\n 'export.confirmsave=false',\n 'export.mode=silent',\n // pdf에 폰트를 포함시킨다\n `pdf.fontembedding=true`,\n // 폰트를 포함시킬때 사용하는 글자만 포함시킨다\n `pdf.fontembedding_subset=true`\n];","import { useMemo } from \"react\";\n\nimport type { FormInfo } from \"sales-frontend-bridge\";\n\n/**\n * documentInfo를 여러가지 형태로 가공해주는 hook\n */\nexport function useDocumentInfo(initialValue: FormInfo[]) {\n\n /** 서식 목록 */\n const documentInfo = initialValue;\n\n /** 글로벌 문서 목록 */\n const documentList = useMemo(() => documentInfo.map((i) => i.doc).flat(1), [documentInfo]);\n\n /** 글로벌 문서 맵 { 문서코드: 글로벌 인덱스} */\n const documentIndexMap = documentList.reduce((acc, cur, index) => {\n acc[cur.docCode] = index;\n\n return acc;\n }, {} as Record<string, number>)\n\n /** 글로벌 문서 맵 { 문서코드: 속한 서식 } */\n const documentTemplateMap = useMemo(() => documentInfo.reduce((map, template) => {\n template.doc.forEach(ozdFile => {\n map[ozdFile.docCode] = { ...template };\n });\n\n return map;\n\n }, {} as Record<string, FormInfo>), [documentInfo]);\n\n // 글로벌 문서 맵 { 서식이름: 서식 }\n const nameTemplateMap = documentInfo.reduce((acc, doc) => {\n acc[doc.name] = doc;\n\n return acc;\n }, {} as Record<string, FormInfo>);\n\n // 글로벌 문서 배열 { 글로벌인덱스: [동료서식 글로벌인덱스, 동료서식 글로벌인덱스] }\n const groupIndexes = useMemo(() => (\n documentInfo.reduce((acc, item) => {\n item.doc.forEach((ozdFile) => {\n const currentIndex = documentIndexMap[ozdFile.docCode] as number;\n\n // 각 globalIndex에 해당하는 그룹 인덱스를 추가\n if (!acc[currentIndex]) {\n acc[currentIndex] = []; // 배열로 초기화\n }\n\n // 해당 파일이 속한 그룹의 인덱스를 추가\n item.doc.forEach((ozdFile) => {\n acc[currentIndex]!.push(documentIndexMap[ozdFile.docCode]!);\n });\n });\n\n return acc;\n }, [] as Array<Array<number>>)\n ), [documentIndexMap, documentInfo]);\n\n // 모든 서식이 완료되었는지 확인\n const isAllComplete = useMemo(() => (documentInfo.every(i => i.complete)), [documentInfo]);\n\n return {\n documentList,\n documentTemplateMap,\n documentIndexMap,\n nameTemplateMap,\n groupIndexes,\n isAllComplete\n }\n}","import { useCallback, useEffect } from 'react';\n\nimport { OZViewerEvent } from \"../types\"\n\ntype Props<T, R = void> = {\n event: OZViewerEvent;\n handler: (e: CustomEvent<T>) => Promise<R>;\n};\n/**\n * OZ 뷰어 콜백 이벤트를 구독해주는 Hook\n */\nexport function useOzEventListener<T, R = void>({ event, handler }: Props<T, R>) {\n const handleEvent = useCallback(\n async (e: Event) => {\n const customEvent = e as CustomEvent<T>;\n\n return await handler(customEvent);\n },\n [handler]\n );\n\n useEffect(() => {\n window.addEventListener(event, handleEvent);\n\n return () => {\n window.removeEventListener(event, handleEvent);\n };\n }, [handleEvent, event]);\n}\n","/**\n * OZ 뷰어에 관련된 이벤트 목록\n */\nexport enum OZViewerEvent {\n /**\n * 보고서 생성 단계별로 발생하는 이벤트\n * - `OZViewerProgressEvent` 이벤트와 매칭된다\n * - `viewer.progresscommand=true` 설정이 필요하다\n * - `OZViewerProgressEvent`와 매칭된다\n * - 모든 문서가 로딩되면 `OZReportCreated` 이벤트를 트리거시켜주어야 한다\n */\n OZProgressCommand = 'OZProgressCommand',\n /**\n * 에러 발생 시 발생하는 이벤트\n * - `viewer.errorcommand=true` 설정이 필요하다\n * - `OZViewerErrorEvent`와 매칭된다\n */\n OZErrorCommand = 'OZErrorCommand',\n /**\n * 화면에 표시되는 페이지가 변경된 후 발생하는 이벤트\n * - `viewer.pagechangecommand=true` 설정이 필요하다\n * - `OZViewerChangeEvent`와 매칭된다\n */\n OZPageChangeCommand = 'OZPageChangeCommand',\n /**\n * 화면에 표시되는 보고서가 변경된 후 발생하는 이벤트\n * - `viewer.reportchangecommand=true` 설정이 필요하다\n * - `OZViewerChangeEvent`와 매칭된다\n */\n OZReportChangeCommand = 'OZReportChangeCommand',\n /**\n * `OZUserEvent` _TriggerOCXUserEvent 함수 실행 시 발생하는 이벤트\n * - `OZViewerUserEvent`와 매칭된다\n */\n OZUserEvent = 'OZUserEvent',\n /**\n * `OZPageBindCommand` 페이지가 바인딩된 후 발생하는 이벤트\n * - `viewer.pagebindcommandinterval` 파라미터에서 설정한 주기별로 동작\n * - ex) `viewer.pagebindcommandinterval=500`\n * - `OZViewerPageBindEvent`와 매칭된다\n */\n OZPageBindCommand = 'OZPageBindCommand',\n /**\n * 사용자가 입력 컴포넌트를 클릭하거나 값을 변경하여 이벤트가 실행된 경우 발생되는 이벤트'\n * - 호환되는 이벤트\n * - `OnClick`\n * - `OnFinish`\n * - `OnFocus`\n * - `OnKillFocus`\n * - `OnPause`\n * - `OnPlay`\n * - `OnStop`\n * - `OnValueChanged`\n * - `eform.inputeventcommand=true` 설정이 필요하다\n * - `OZEFormInputEvent`와 매칭된다\n */\n OZEFormInputEventCommand = 'OZEFormInputEventCommand',\n /**\n * 보고서 저장 시 발생하는 이벤트\n * - `OZExportEvent`와 매칭된다\n */\n OZExportCommand = 'OZExportCommand',\n\n /**\n * 오즈뷰어, (오즈전용)PDF 뷰어 내 버튼 클릭시 발생하는 이벤트\n * - `OZBtnTouchEvent`와 매칭된다\n */\n OZBtnTouchEvent = 'btnTouchEvent',\n\n /**\n * `OZProgressCommand` 이벤트가 문서 갯수만큼 불리면 이 이벤트를 트리거한다\n * - 웹에서 직접 트리거 하는 이벤트\n */\n OZReportCreated = 'OZReportCreated',\n}\n\n/**\n * TriggerExternal에 사용할 param1인자를 정의한 enum\n * - GetDraftData 중간저장 서명이미지 추출\n * - cropimage 서명이미지 크롭\n */\nexport enum OZTriggerExternalEvent {\n GetDraftData = 'getDraftData',\n CropImage = 'cropimage'\n}\n\n/**\n * `OZViewerEvent.OZProgressCommand` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZProgressCommand, (e) => { console.log(e.detail); });\n * ```\n *\n * `step과` `state`는 step => state 방식으로 진행된다\n *\n * 예시\n * ```bash\n * # step0 뷰어실행\n * [step=0][state=0] # 뷰어 실행 시작\n * [step=0][state=1] # 뷰어 실행 완료\n * # step2 보고서 템플릿 생성\n * [step=1][state=0] # 보고서 템플릿 생성 시작\n * [step=1][state=1] # 보고서 템플릿 생성 완료\n * ```\n */\nexport type OZViewerProgressEvent = {\n /**\n * 보고서 생성 단계\n * - 0 : 뷰어 실행 옵션 설정\n * - 1 : 보고서 파일 다운로드\n * - 2 : 보고서 템플릿 생성\n * - 3 : 데이터 다운로드\n * - 4 : 보고서 바인딩\n */\n step: '0' | '1' | '2' | '3' | '4';\n /**\n * 보고서 생성 상태\n * - 1 : 시작\n * - 2 : 완료\n */\n state: '1' | '2';\n /** 보고서 이름 */\n reportname: string;\n};\n\n/**\n * `OZViewerEvent.OZErrorCommand` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZErrorCommand, (e) => { console.log(e.detail); });\n * ```\n */\nexport type OZViewerErrorEvent = {\n /** 에러 메시지 코드 */\n code: string;\n /** 에러 기본 메시지 */\n message: string;\n /** 에러 상세 메시지 */\n detailmessage: string;\n /** 보고서 이름 */\n reportname: string;\n};\n\n/**\n * 두 이벤트의 공용 타입\n * - `OZViewerEvent.OZPageChangeCommand` 이벤트의 `e.detail` 타입 정의\n * - `OZViewerEvent.OZReportChangeCommand` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZPageChangeCommand, (e) => { console.log(e.detail); });\n * window.addEventListener(OZViewerEvent.OZViewerChangeCommand, (e) => { console.log(e.detail); });\n * ```\n */\nexport type OZViewerChangeEvent = {\n /** 보고서 인덱스(zero-based index) */\n docindex: number;\n};\n\n/**\n * `OZViewerEvent.OZUserEvent` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZUserEvent, (e) => { console.log(e.detail); });\n * ```\n */\nexport type OZViewerUserEvent = {\n /** _TriggerOCXUserEvent 함수에서 전달한 첫 번째 값 */\n param1: string;\n /** _TriggerOCXUserEvent 함수에서 전달한 두 번째 값 */\n param2: string;\n /** _TriggerOCXUserEvent 함수에서 전달한 세 번째 값 */\n param3: string;\n /** 보고서 인덱스(zero-based index) */\n docindex: string;\n};\n\n/**\n * `OZViewerEvent.OZPageBindCommand` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZPageBindCommand, (e) => { console.log(e.detail); });\n * ```\n */\nexport type OZViewerPageBindEvent = {\n /** 보고서 인덱스(zero-based index) */\n docindex: string;\n /** 바인딩된 페이지 번호 */\n pagecount: string;\n};\n\nexport type OZEFormInputEvent = {\n /** 보고서 인덱스(zero-based index) */\n docindex: string;\n /** 이벤트가 발생한 컴포넌트의 FormID. FormID가 설정되지 않은 경우 컴포넌트의 이름이 리턴됨 */\n formid: string;\n eventname: string;\n mainscreen: boolean;\n}\n\nexport type OZExportEvent = {\n /**\n * 저장 성공 여부\n * - `0` 실패\n * - `1` 성공\n */\n code: \"0\" | \"1\"\n /** 파일 경로 */\n path: string;\n /** 파일 이름 */\n filename: string;\n /** 저장된 페이지 수. 여러 페이지의 보고서를 한 페이지로 저장한 경우에는 1이 리턴됨 */\n pagecount: string;\n /**\n * 뷰어가 실제 저장한 모든 파일의 경로와 이름.\n * \n * 파일이 여러 개일 경우 `|`를 구분자로 하여 리턴됨\n */\n filepaths: string;\n}\n\n/**\n * 상단 전체목록 보기 버튼 내 서식 클릭이벤트\n * - 선택된 서식의 텍스트가 btnID로 넘어온다\n */\nexport type CategoryEvent = {\n type: \"category\";\n /** 자유 입력 가능한 버튼 ID */\n btnID: string;\n};\n\n/**\n * 상단 버튼 클릭 이벤트(전체목록 버튼 제외)\n * - 예: 나가기 버튼\n */\nexport type TopEvent = {\n type: \"top\";\n btnID: \"btnExit\";\n};\n\n/**\n * 성명,서명, 덧쓰기 관련 버튼 클릭 이벤트\n * - `signatureInProgress` 서명 바로가기 버튼\n * - `signatureInMissing` 미입력 항목 입력하기 버튼(느낌표 버튼)\n * - `signatureComplete` 청약문서 최종 확인하기\n */\nexport type SignatureEvent = {\n type: \"signature\";\n btnID: \"signatureInProgress\" | \"signatureInMissing\" | \"signatureComplete\";\n};\n\n/**\n * pdf 뷰어 내 버튼 클릭 이벤트\n * - `modify` 성명 서명 덧쓰기 수정하러 가기\n * - `submit` 최종 제출하기\n */\nexport type PdfEvent = {\n type: \"pdf\";\n btnID: \"modify\" | \"submit\";\n};\n\n/**\n * comment(형광펜) 관련 버튼 클릭 이벤트\n * - `yellow` 노랑색 형광펜 활성화\n * - `pink` 분홍색 형광펜 활성화\n * - `green` 초록색 형광펜 활성화\n * - `eraser` 지우개 활성화\n * - `disable` 형광펜 모드 종료\n */\nexport type CommentEvent = {\n type: \"comment\";\n btnID: \"yellow\" | \"pink\" | \"green\" | \"eraser\" | \"disable\";\n};\n\n/**\n * OZ 문서 시스템 내 버튼 클릭 이벤트 통합 타입\n *\n * type(카테고리)에 따라 btnID 값이 다르게 제한됩니다.\n */\nexport type OZBtnTouchEvent =\n | CategoryEvent\n | TopEvent\n | SignatureEvent\n | PdfEvent\n | CommentEvent;\n\n/**\n * 문서코드별 입력 데이터 및 추가 파라미터 매핑 타입\n *\n * 각 문서코드에 대해 `inputJson` (임의의 key-value 쌍)과\n * \n * 선택적으로 `extraParam` (기타 추가 파라미터)을 포함하는 객체입니다.\n *\n * 예시:\n * ```javascript\n * {\n * A0010: {\n * inputJson: {\n * A0010_mynm_sg: 'data:image/png;base64,iVBORw0K...', // 예: 이미지 데이터\n * A0010_mysg_sign: 'data:image/png;base64,iVBORw0KG...', // 예: 이미지 데이터\n * custom_field: 'some value', // 임의의 데이터도 가능\n * },\n * args: [`roleCd=11,21`]\n * extraParam: [`viewer.zoom=137`]\n * },\n * C0401: {\n * inputJson: {\n * mynm_sg: 'data:image/png;base64,iVBORw0K...', // 예: 이미지 데이터\n * mysg_sign: 'data:image/png;base64,iVBORw0KG...', // 예: 이미지 데이터\n * another_field: 'another value', // 임의의 데이터\n * }\n * },\n * }\n * ```\n */\nexport type ExtraDataType = Record<string, {\n /** connection.inputJson으로 전달할 `{ \"key1\": \"value1\", \"key2\": \"value2\" }` 형식의 데이터 (예: 문자열, base64 이미지 등) */\n inputJson?: Record<string, string>;\n /** connection.arg로 전달할 `[\"key1=value1\", \"key2=value2\"]` 형식의 데이터 */\n args?: string[];\n /** 추가 파라미터 목록 (선택 사항) */\n extraParam?: string[];\n}>;\n","import { Bridge } from \"sales-frontend-bridge\";\n\n/**\n * ### 발생 상황 및 에러 메시지 정리\n * 1. 비정형에서 OZD 다운로드 시 → 청약문서를 불러오지 못했습니다\n * 2. 백엔드에서 중간저장 데이터 로딩 시 → 일시적인 오류가 발생했습니다\n * 3. 오즈뷰어(솔루션) 초기화(OZD 파일 + 중간저장 데이터) 시 → 일시적인 오류가 발생했습니다\n * 4. 성명/서명/덧쓰기 진행 시 → 일시적인 오류가 발생했습니다\n * 5. 서식 완료 후 서명 중간저장(비정형 저장) 시 → 일시적인 오류가 발생했습니다\n * 6. PDF Export(개별문서/통합문서) 시 → 청약문서를 불러오지 못했습니다\n * 7. PDF 뷰어 초기화(Export된 PDF를 화면에 렌더링) 시 → 청약문서를 불러오지 못했습니다\n *\n * ### 에러 발생 시 처리 동작\n * - 에러 발생시 재시도 혹은 탈출을 위해 이전 화면으로 돌아간다\n * - 1~5단계 에서 에러 발생 시 → 확인버튼 클릭 → OZ 뷰어 종료 브릿지 호출\n * - 6~7단계 에서 에러 발생 시 → 확인버튼 클릭 → PDF 뷰어 종료 브릿지 호출\n * \n * ### 일반적인 상황에서는 아래 두 함수를 사용하고 커스텀한 상황애서는 showAlert을 직접 조합하여 사용한다\n */\n\n\n/**\n * OZ 뷰어 및 비정형 처리 과정에서 일시적인 오류가 발생했을 때 표시되는 경고창.\n * #### 처리 동작\n * - 확인 버튼 클릭 시 OZ 뷰어 종료 브릿지 호출\n */\nexport async function AlertTemporaryError() {\n return await Bridge.nativeOz.showAlert({\n title: \"일시적인 오류가 발생했습니다\",\n message: \"문제가 지속될 경우 IT콜센터(1522-6379)로 문의해주세요.\",\n buttons: { close: false, main: \"확인\" }\n });\n}\n\n/**\n * 청약문서를 불러오지 못했을 때 표시되는 경고창.\n * #### 처리 동작\n * - 확인 버튼 클릭 시 PDF 뷰어 종료 브릿지 호출\n */\nexport async function AlertDocumentLoadError() {\n return await Bridge.nativeOz.showAlert({\n title: \"청약문서를 불러오지 못했습니다\",\n message: \"문제가 지속될 경우 IT콜센터(1522-6379)로 문의해주세요.\",\n buttons: { close: false, main: \"확인\" }\n });\n}","import type { CSSProperties } from 'react';\n\nimport type { ExtraDataType } from '../../oz';\nimport type { FormInfo } from \"sales-frontend-bridge\";\nexport const wrapperStyle: CSSProperties = { display: 'flex', flexFlow: 'column', gap: '10px' };\nexport const btnStyle: CSSProperties = { border: '1px solid red', minHeight: '40px' };\n\n/** 테스트용 하드코딩 문서목록 */\nexport const DownloadDocumentList: Array<FormInfo> = [\n { name: '[A0010]청약서', doc: [{ docCode: 'A0010', fileID: '2msKWTCPgZs9uKkAA', }] },\n { name: '[A0100]비교안내확인서', doc: [{ docCode: 'A0100', fileID: 'Hio2lLCPgZyq6KkAA' }] },\n // { name: '[A0900]상품설명서', doc: [{ docCode: 'A0900', fileID: 'CYQdBKCPgZ3BIKkAA' }] },\n // { name: '[A1500]청약부속정보확인서', doc: [{ docCode: 'A1500', fileID: 'sRbTYdCPgZ8aPKkAA' }] },\n // { name: '[A2215]보험계약대출이행관리동의서', doc: [{ docCode: 'A2215', fileID: 'YKAM55CPgZ_d5KkAA' }] },\n // { name: '[A2800]계약전알릴의무', doc: [{ docCode: 'A2800', fileID: 'JUYBzOCPgaEu_KkAA' }] },\n // { name: '[A3503]청약서별지(변액용)', doc: [{ docCode: 'A3503', fileID: 'l4oxhwCPgaIxLKkAA' }] },\n // { name: '[B0101]보험계약체결동의서', doc: [{ docCode: 'B0101', fileID: 'Ivk9FACPgaMTgKkAA' }] },\n // { name: '[C0400]계약체결이행동의서', doc: [{ docCode: 'C0400', fileID: 'X0gI1rCPgaQg8KkAA' }] },\n // { name: '[C0401]상품소개상세동의서', doc: [{ docCode: 'C0401', fileID: 'EfA9ldCPgaUHqKkAA' }] },\n // { name: '[C1000]보험상품판매체크리스트', doc: [{ docCode: 'C1000', fileID: 'nqqFywCPgaYOFKkAA' }] },\n // { name: '[C1100]완전판매안내확인서', doc: [{ docCode: 'C1100', fileID: 'FiSFniCPgawR_KkAA' }] },\n // { name: '[C1200]대면설명확인서', doc: [{ docCode: 'C1200', fileID: 't7yFAoCPgay4RKkAA' }] },\n // { name: '[C1300]계약체결고지의무확인서', doc: [{ docCode: 'C1300', fileID: 'WdUzi6CPgaccbKkAA' }] },\n // { name: '[C1400]보험상품비교설명확인서', doc: [{ docCode: 'C1400', fileID: 'kgoT28CPgaf4YKkAA' }] },\n // // C0200은 스크립트 작업이 안되어있어서 서명테스트 안됨\n // { name: '[C0200]고객거래확인서', doc: [{ docCode: 'C0200', fileID: '5QJ3eSCPlEDWDKkAA' }] },\n].map((i) => ({\n ...i,\n // 모든 서명 입력이 완료되었는지 여부 (클라이언트에서 상태로 관리)\n complete: false,\n // 현재 서식이 포커스 상태인지 여부 (UI 제어용)\n focus: false,\n // 서식의 시작 페이지 번호 (페이지 매핑 시 사용)\n startPage: 0,\n // 서식의 종료 페이지 번호 (페이지 매핑 시 사용)\n endPage: 0,\n // 서식을 구성하는 개별 OZD 문서 목록\n doc: i.doc.map((j) => ({\n ...j,\n // OZD 파일의 로컬 저장 경로 (앱 다운로드 후 설정됨)\n filePath: \"\",\n // OZD 문서가 시작되는 페이지 번호\n startPage: 0,\n // OZD 문서가 종료되는 페이지 번호\n endPage: 0,\n })),\n}));\n/** FP 성명 사인 */\nconst fp_nm = `data:image/png;base64,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`;\n/** FP 서명 사인 */\nconst fp_nm_sign = `data:image/png;base64,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`;\n\n/** FP 성명 사인 펜 두께 4 */\nconst fp_nm_w4 = `data:image/png;base64,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`;\n/** FP 서명 사인 펜 두께 4+ ratio 4:1 */\nconst fp_nm_sign_w4_r41 = `data:image/png;base64,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`;\n\n/** 테스트용 하드코딩 데이터 */\nexport const ExtraData: ExtraDataType = {\n // 문서코드\n A0010: {\n // connection.inputjson으로 바인딩할 데이터\n inputJson: {\n // 계약자 성명 사인정보\n A0010_mynm_sg: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAABDUlEQVR4nOzSMQ0CQBQEUSAnAAU0iEAAPWKQgQU04gED10z1IXlPwWay6/78HH7P+3qZnrBxmh7wT8QKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECtZjvaY3bNzOx+kJG54ViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgVfAMAAP//tD4Eb/yjIncAAAAASUVORK5CYII=',\n // 계약자 서명 사인정보\n A0010_mysg_sign: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAABDElEQVR4nOzSsQkCYRgEUZXDVgTtxdDIYgR7sFkTG/iTiT4P3qtgGXa7vp+H//M5PqYnLJymB+yJWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgVjBdj9fpjcsvG7f6QkLnhWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBX8AgAA//9+7gTkg4AcBQAAAABJRU5ErkJggg=='\n },\n // 기타 공통으로 사용하지 않을 파라미터\n extraParam: [], // aaa=bbb\n args: []\n },\n C0200: {\n inputJson: {\n C0200_FP_Sign: fp_nm_sign\n }\n },\n // 스마트폰 전자청약에 의한 주요 알릴사항 안내 확인\n C1100: {\n inputJson: {\n // C1100_ANSR_001 보험 모집자 성명\n C1100_fp_nm: fp_nm_w4,\n // C1100_ANSR_002 보험 모집자 서명\n C1100_fp_nm_sign: fp_nm_sign_w4_r41,\n // C1100_ANSR_003\n C1100_insurance_num: '데이터없음',\n // C1100_ANSR_004\n C1100_ozformlist: '데이터없음',\n // C1100_ANSR_005\n Date: '데이터없음'\n }\n },\n // 대면설명확인서\n C1200: {\n inputJson: {\n // C1200_ANSR_001\n C1200_date: \"20251120\",\n // C1200_ANSR_002\n C1200_time: \"17:00\",\n // C1200_ANSR_003\n C1200_place: \"고객 집 주변\",\n // C1200_ANSR_004\n C1200_way: \"상품설명서로 직접 설명\",\n // C1200_ANSR_005\n C1200_confirm: \"1\", // 대면 설명 여부\n // C1200_ANSR_006\n C1200_fp_nm2: fp_nm,\n // C1200_ANSR_007\n C1200_fp_nm_sign: fp_nm_sign,\n // C1200_ANSR_008\n C1200_insurance_num: '데이터없음',\n // C1200_ANSR_009\n C1200_fp_nm1: '데이터없음',\n // C1200_ANSR_010\n C1200_fp_nm4: '데이터없음',\n // C1200_ANSR_011\n C1200_con_nm: '데이터없음',\n // C1200_ANSR_012\n date2: '데이터없음',\n // C1200_ANSR_001 + C1200_ANSR_002\n date1: `데이터없음`,\n }\n },\n}\n\n\n/** 테스트용 증번 */\nexport const policyNumber = '300034894';\n/** 테스트용 FP 정보 */\nexport const fpInfo = { uniqNo: '2210000' };\n/** 테스트용 청약작성자목록 - 계약 관계자 코드 */\nexport const roleCode = [`11`, `28`]\n/** 테스트용 native에 전달할 X-DUD-Authorization 토큰 */\nexport const xdudheaders = `Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJXNWRtc1g1MkVWZGV0YThJRy90YmlZY281bnVCdzRZOXhGZjlWakZzdWxnbU00YnkiLCJpYXQiOjE3NjEwNDMyNjgsImV4cCI6MTc2NjI5OTI2OH0.KDnF7ZhkmnEApGCvOcItwcHnLWe5iJu64g93GACT2yo`;","/**\n * `Promise.withResolvers()` 폴리필\n */\nexport function PromiseWithResolvers<T>() {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * 주어진 입력값이 배열이 아니면 빈 배열을 반환하고, 배열이면 깊은 복사하여 반환합니다.\n *\n * @param arg - 입력값으로, 배열일 수도 있고 아닐 수도 있습니다.\n * @returns 주어진 입력값이 배열이면 깊은 복사본을 반환하고, 배열이 아니면 빈 배열을 반환합니다.\n */\nexport function ensureArray<T>(arg?: T[]): T[] {\n return (Array.isArray(arg) ? DeepCopy(arg) : []);\n}\n\n/**\n * 주어진 객체를 깊은 복사하여 새로운 복사본을 반환합니다.\n * - 내부 유틸용이라 export 하지 않았음\n *\n * @param arg - 깊은 복사를 원하는 객체\n * @returns 주어진 객체의 깊은 복사본\n */\nexport function DeepCopy<T>(arg: T): T {\n return JSON.parse(JSON.stringify(arg)) as T;\n}\n","import { DeepCopy } from \"../../internal\";\n\nimport type { FormInfo } from \"sales-frontend-bridge\";\n\n/**\n * 비동기 처리를 일정 시간 지연시키는 함수\n * @param ms - 지연 시간 (밀리초). 기본값은 10ms\n */\nexport async function sleep(ms = 10): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * 문서 데이터에 페이지 범위를 채워주는 함수\n * @param {Array} data - 문서 그룹 데이터\n * @param {Array<number>} pages - 각 문서의 페이지 수\n * @returns {Array} - startPage, endPage가 채워진 새 데이터\n */\nexport function categorizeByPageRange(data: FormInfo[], pageCounts: number[]) {\n let currentPage = 1;\n let pageIndex = 0;\n\n // 깊은 복사로 원본 변형 방지\n const result = DeepCopy(data);\n\n result.forEach(group => {\n group.startPage = currentPage;\n\n group.doc.forEach(doc => {\n const pageCount = pageCounts[pageIndex++]!;\n doc.startPage = currentPage;\n doc.endPage = currentPage + pageCount - 1;\n currentPage += pageCount;\n });\n\n group.endPage = group.doc[group.doc.length - 1]!.endPage;\n });\n\n return result;\n}","import { Bridge } from \"sales-frontend-bridge\";\nimport { base64ToFile, fileToBase64 } from 'sales-frontend-utils';\n\nimport type { DownloadOzdOptions } from \"sales-frontend-bridge\";\n\n\n/**\n * ozd, 폰트 등 App 내 리소스를 fetch하는 브릿지 유틸\n */\n\n/**\n * OZD 목록을 다운받는 브릿지\n */\nexport async function fetchDocument(args: DownloadOzdOptions) {\n // 브릿지에 다운로드 요청\n const { data: result } = await Bridge.native.downloadDocument(args);\n\n // start,end 페이지 매핑\n return result.data.map((i) => ({ ...i, startPage: 0, endPage: 0 }));\n}\n\n/**\n * App에 설치된 폰트를 Oz Param 형식으로 불러오는 브릿지\n */\nexport async function fetchFont() {\n const { data: fontMap } = await Bridge.native.getOzFontParam();\n\n const fontParms = Object.keys(fontMap).map((i) => `font.${i}=${fontMap[i]}`);\n\n return fontParms;\n}\n\n/**\n * 비정형 서버에 성명,서명, 덧쓰기 이미지를 업로드한다\n * @deprecated 테스트페이지에서만 사용하는 API\n */\nexport async function postFiletoDud(imageStr: string) {\n const formData = new FormData();\n formData.append(\"data\", base64ToFile(imageStr, \"test.png\"));\n formData.append(\"fileIdentifierValue\", \"string\");\n formData.append(\"fileExtendContent1\", \"string\");\n formData.append(\"fileExtendContent2\", \"string\");\n formData.append(\"preservationTerm\", \"1\");\n formData.append(\"fileType\", \"png\");\n\n // 비동기 호출\n const response = await fetch(\"/api/v1/post/file\", {\n headers: {\n \"x-channel-appversion\": \"3.1\",\n \"x-channel-carriername\": \"SK\",\n \"x-channel-deviceid\": \"deviceid\",\n \"x-channel-devicemodel\": \"iPHONE13\",\n \"x-channel-formfactor\": \"Phone\",\n \"x-channel-loginchannel\": \"DSP\",\n \"x-channel-logintype\": \"ONPA_PIN\",\n \"x-channel-networktype\": \"LTE\",\n \"x-channel-platformversion\": \"15.4.1\",\n \"x-channel-screenid\": \"ScreenId\",\n \"x-dud-authorization\": \"Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJXNWRtc1g1MkVWZGV0YThJRy90YmlZY281bnVCdzRZOXhGZjlWakZzdWxnbU00YnkiLCJpYXQiOjE3NjEwNDMyNjgsImV4cCI6MTc2NjI5OTI2OH0.KDnF7ZhkmnEApGCvOcItwcHnLWe5iJu64g93GACT2yo\",\n \"x-x-channel-platformname\": \"IOS\"\n },\n method: \"POST\",\n body: formData\n });\n const json = await response.json();\n // console.log('json', json);\n\n return json;\n}\n\n/**\n * 비정형에서 중간저장해놓은 서명이미지를 다운받는다\n * @deprecated 테스트페이지에서만 사용하는 API\n */\nexport async function getFileFromDud(fileMgmtId: string) {\n const outputType = \"binary\"\n const response = await fetch('/api/v1/get/file', {\n headers: {\n \"content-type\": \"application/json\",\n \"x-channel-appversion\": \"3.1\",\n \"x-channel-carriername\": \"SK\",\n \"x-channel-deviceid\": \"deviceid\",\n \"x-channel-devicemodel\": \"iPHONE13\",\n \"x-channel-formfactor\": \"Phone\",\n \"x-channel-loginchannel\": \"DSP\",\n \"x-channel-logintype\": \"ONPA_PIN\",\n \"x-channel-networktype\": \"LTE\",\n \"x-channel-platformversion\": \"15.4.1\",\n \"x-channel-screenid\": \"ScreenId\",\n \"x-dud-authorization\": \"Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJXNWRtc1g1MkVWZGV0YThJRy90YmlZY281bnVCdzRZOXhGZjlWakZzdWxnbU00YnkiLCJpYXQiOjE3NjEwNDMyNjgsImV4cCI6MTc2NjI5OTI2OH0.KDnF7ZhkmnEApGCvOcItwcHnLWe5iJu64g93GACT2yo\",\n \"x-x-channel-platformname\": \"IOS\"\n },\n method: \"POST\",\n body: JSON.stringify({ fileMgmtId, outputType })\n });\n const blob = await response.blob();\n\n const base64String = await fileToBase64(blob);\n // console.log('base64String', base64String)\n\n return base64String;\n}","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { PromiseWithResolvers } from '../../../internal';\nimport { OZViewerEvent } from '../../types';\n\nimport { AlertTemporaryError } from './alert-util';\n\n/**\n * OZ 뷰어 함수를 단순 래핑한 브릿지 유틸\n */\n\n/**\n * OZ Viewer 생성 함수\n * 1. `CreateReport` 함수 호출하여 OZ 리포트 생성\n * 2. `OZProgressCommand` 이벤트가 `ozd` 개수만큼 발생\n * 3. `OZProgressCommand` 이벤트 내부에서 `OZReportCreated` 이벤트 발행\n * 4. `CreateOzViewer` 이벤트가 종료\n */\nexport async function CreateOzViewer(ozParam: string[]) {\n const { promise, resolve, reject } = PromiseWithResolvers();\n\n const handleTimeout = () => {\n // 이벤트리스너 제거\n window.removeEventListener(OZViewerEvent.OZReportCreated, handleOZCreated);\n // promise reject 처리\n reject(new Error(\"createOZViewer TimeOut\"));\n };\n // 3분 대기 후 이벤트가 종료되지 않으면 에러 처리\n const timeout = setTimeout(handleTimeout, 1000 * 60 * 3);\n\n const handleOZCreated = (e: Event) => {\n // 성공 시 타이머 해제\n clearTimeout(timeout);\n resolve(e);\n };\n\n window.addEventListener(\n OZViewerEvent.OZReportCreated,\n // OZReportCreated가 트리거되면 promise resolve 처리\n handleOZCreated,\n // 이벤트 리스너는 한 번만 실행되도록 설정\n { once: true }\n )\n\n try {\n await Bridge.native.createOZViewer({ param: ozParam.join(\"\\n\") });\n\n return await promise;\n } catch (e) {\n // createOZViewer 자체가 에러가 발생한경우 타이머 초기화\n clearTimeout(timeout);\n // 일시적인 오류가 발생했습니다\n await AlertTemporaryError();\n // 오즈뷰어 초기화에 실패했으므로 오즈뷰어 종료\n await Bridge.native.hideOZViewer();\n }\n}\n\n/**\n * 특정 페이지로 스크롤 이동\n */\nexport async function MovePage(page: number) {\n return await Bridge.nativeOz.script({ command: `movepage=${page}` });\n}\n\n/**\n * 현재 페이지 번호를 구한다(one base index)\n */\nexport async function getCurrentPage() {\n const { data } = await Bridge.nativeOz.getInformation({ command: `CURRENT_PAGE` })\n if (data === null) {\n throw new Error(`Bridge returned null for command: CURRENT_PAGE`);\n }\n\n return Number(data);\n}\n\n/**\n * 랜딩되어있는 보고서들의 전체 페이지 수\n */\nexport const getTotalPageMemo = (() => {\n // ✅ 전체 페이지수를 캐싱\n let cache: Promise<number> | null = null;\n\n async function getTotalPage(): Promise<number> {\n if (cache) {\n // 캐시에 이미 결과(Promise)가 있다면 재사용\n return cache;\n }\n // ⚙️ 네이티브 호출을 Promise로 감싸서 즉시 캐시에 저장\n // (중복 요청을 방지하기 위함)\n cache = (async () => {\n try {\n const { data } = await Bridge.nativeOz.getInformation({ command: 'TOTAL_PAGE' });\n\n return Number(data);\n } catch (e) {\n // ⚠️ 호출 실패 시 캐시에서 제거하여 다음 요청 시 재시도 가능하도록 함\n cache = null;\n throw e;\n }\n })();\n\n return await cache;\n }\n\n // 캐시 초기화 함수\n getTotalPage.clearCache = () => {\n cache = null;\n };\n\n return getTotalPage;\n})();\n\n/**\n * 랜딩되어있는 보고서의 총 갯수(ozd 파일의 갯수)\n */\nexport const getReportCountMemo = (() => {\n // ✅ 보고서의 총 갯수(ozd 파일의 갯수)를 캐싱\n let cache: Promise<number> | null = null;\n\n async function getReportCount(): Promise<number> {\n if (cache) {\n return await cache;\n }\n // ⚙️ 네이티브 호출을 Promise로 감싸서 즉시 캐시에 저장\n // (중복 요청을 방지하기 위함)\n cache = (async () => {\n try {\n const { data } = await Bridge.nativeOz.getInformation({ command: 'REPORT_COUNT' });\n if (data === null) {\n throw new Error(`Bridge returned null for command: REPORT_COUNT`);\n }\n\n return Number(data);\n } catch (e) {\n // ⚠️ 호출 실패 시 캐시에서 제거하여 다음 요청 시 재시도 가능하도록 함\n cache = null;\n throw e;\n }\n })();\n\n return await cache;\n }\n\n // 캐시 초기화 함수\n getReportCount.clearCache = () => {\n cache = null;\n };\n\n return getReportCount;\n})();\n","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { ensureArray } from '../../../internal';\nimport { commonOzParam } from '../../constant';\nimport { OZTriggerExternalEvent } from '../../types';\nimport { sleep } from \"../common-util\";\n\nimport { fetchFont } from './fetch-util';\nimport { getReportCountMemo } from './oz-wrapper-util';\n\nimport type { ExtraDataType } from '../../types';\nimport type { OzdFile } from \"sales-frontend-bridge\";\n\n\n/**\n * OZ 리포트 생성 및 초기화에 필요한 브릿지 유틸\n */\n\ntype CreateOzParamProps = {\n documentList: OzdFile[];\n extraData?: ExtraDataType;\n /**\n * 청약을 작성하는 사람들의 roleCode 목록\n *\n * ex)`홍길동|11,홍길순|22`\n */\n roleCd: string;\n /**\n * 지정대리인 정보\n * - 지정대리인이 없을때 ''\n * - 지정대리인이 1명일때 ex) `성명|주민등록번호|관계명|관계코드`\n * - 지정대리인이 2명일때 ex) `성명|주민등록번호|관계명|관계코드`,`성명|주민등록번호|관계명|관계코드`\n */\n jijungInfo?: string;\n}\n/**\n * OZ 리포트 최초 생성시 OZ에 넘길 파라미터를 생성하는 함수\n */\nexport async function CreateOzParam({ documentList, extraData = {}, roleCd, jijungInfo = '' }: CreateOzParamProps) {\n if (documentList.length === 0) {\n throw new Error('문서목록이 비어있습니다');\n }\n const fontParms = await fetchFont();\n const connectionParams = documentList.map(({ filePath }, idx) =>\n idx === 0 ? `connection.openfile=${filePath}` : `child${idx}.connection.openfile=${filePath}`\n );\n const childCount = documentList.length - 1;\n const extraParams = documentList.map((ozdFile, idx) => {\n const result: string[] = [];\n\n // 파일 이름에서 경로 및 확장자 제거 (ex: \"A0010.ozd\" → \"A0010\")\n const docCode = ozdFile.docCode.replace(/^.*[\\\\/]|(\\.[^/.]+)$/g, '');\n\n const prefix = idx === 0 ? '' : `child${idx}.`;\n\n // 문서코드에 바인딩할 데이터가 있는지 확인\n const data = extraData[docCode] || {};\n\n if (data.inputJson) {\n result.push(`${prefix}connection.inputjson=${JSON.stringify(data.inputJson)}`);\n }\n\n // args로 전달할 param이 있으면 반영\n const args = [\n // 모든서식에 공통으로 필요한 docCd param 추가\n `docCd=${docCode}`,\n // 모든서식에 공통으로 필요한 roleCode 정보 추가\n `roleCd=${roleCd}`,\n // 모든서식에 공통으로 필요한 지정대리인 정보 추가\n `jijungInfo=${jijungInfo}`,\n ...ensureArray(data.args)\n ];\n args.forEach((arg, idx) => result.push(`${prefix}connection.args${idx + 1}=${arg}`));\n\n // 그 외 추가 파라미터 목록이 있으면 반영\n const extraParam = [\n // connection.args의 갯수만큼 pcount 보정\n `connection.pcount=${args.length}`,\n ...ensureArray(data.extraParam)\n ];\n extraParam.forEach((param) => (result.push(`${prefix}${param}`)))\n\n return result;\n });\n\n // createReport용 ozParam\n const params = [\n ...(childCount > 0 ? [`viewer.childcount=${childCount}`] : []),\n ...connectionParams,\n ...commonOzParam,\n ...fontParms,\n ...extraParams.flat(1)\n ];\n\n return params;\n}\n\n/**\n * 모든 문서에 대해 checkeForm을 Y로 설정하는 명령을 순차적으로 한 번씩 호출합니다.\n * \n * 각 호출 사이에 기본 지연(sleep)을 넣어 처리 속도를 조절합니다.\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function setCheckEform(reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n for (let i = 0; i < count; i++) {\n await sleep();\n await Bridge.nativeOz.setGlobal({ key: 'checkeForm', value: 'Y', docIndex: i })\n }\n}\n\n/**\n * 모든 문서에 대해 INPUT_TRIGGER_CLICK 명령을 순차적으로 한 번씩 호출합니다.\n * \n * 각 호출 사이에 기본 지연(sleep)을 넣어 처리 속도를 조절합니다.\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function triggerClickOnAllDocuments(reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n for (let i = 0; i < count; i++) {\n await sleep();\n const command = `INPUT_TRIGGER_CLICK_AT=${i}`;\n await Bridge.nativeOz.getInformation({ command });\n }\n}\n\n/**\n * 모든 문서에 대해 서명 부분 이미지 컷팅 명령을 순차적으로 한 번씩 호출합니다.\n * \n * 각 호출 사이에 기본 지연(sleep)을 넣어 처리 속도를 조절합니다.\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function triggerCropImageOnAllDocuments(reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n for (let i = 0; i < count; i++) {\n await sleep();\n // 사인 이미지 크롭처리\n await Bridge.nativeOz.triggerExternalEventByDocIndex({ param1: OZTriggerExternalEvent.CropImage, docIndex: Number(i) });\n }\n}\n\n/**\n * 모든 문서에 대해 전체 페이지 수를 계산하는 명령을 순차적으로 한 번씩 호출합니다.\n * \n * 각 호출 사이에 기본 지연(sleep)을 넣어 처리 속도를 조절합니다.\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function getTotalPageOnAllDocuments(reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n const totalPages = [];\n for (let i = 0; i < count; i++) {\n await sleep();\n const command = `TOTAL_PAGE_OF_REPORT_FILE_AT=${i}`\n const { data } = await Bridge.nativeOz.getInformation({ command });\n totalPages.push(Number(data));\n }\n\n return totalPages;\n}","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { OZTriggerExternalEvent } from \"../../types\";\nimport { sleep } from \"../common-util\";\n\n\ntype OzDraftRequest = Record<string, string> & { docCd: string };\n\n/**\n * OZ에서 getDraftData 요청 시 반환할 데이터를 생성하는 함수\n * \n * - OZ로부터 전달받은 JSON 문자열(`arg`)을 파싱하여 문서 코드(docCd)를 추출하고,\n * 해당 문서의 JSON 정보를 가져와 필요한 사인 정보만 key-value 형태로 반환한다.\n * - 사인FormId 값이 null일 경우, getInformation 결과로 채워진다.\n */\nexport async function getDraftDataHandler(\n rawOzRequest: string,\n documentIndexMap: Record<string, number>\n) {\n // 1️⃣ OZ에서 전달된 요청 데이터 파싱\n const parsedRequest = JSON.parse(rawOzRequest) as OzDraftRequest;\n // 문서코드와 formId:null 형태의 객체를 추출\n const { docCd, ...signKeyMap } = parsedRequest;\n\n // 2️⃣ 문서 코드(docCd)에 해당하는 글로벌 인덱스 조회\n const documentIndex = documentIndexMap[docCd];\n if (documentIndex === undefined) {\n throw new Error(`Invalid document code: ${docCd}`);\n }\n\n // 3️⃣ Bridge를 통해 해당 문서의 JSON 데이터 조회\n const { data } = await Bridge.nativeOz.getInformation({ command: `INPUT_JSON_AT=${documentIndex}` });\n if (data === null) {\n throw new Error(`Bridge returned null for document: ${docCd} (command=INPUT_JSON_AT=${documentIndex})`);\n }\n const documentJson = JSON.parse(data);\n\n // 4️⃣ 필요한 사인 정보만 key-value 형태로 반환\n const signDataMap = Object.keys(signKeyMap).reduce((acc, key) => {\n acc[key] = documentJson[key];\n\n return acc;\n }, {} as Record<string, string>);\n\n return { signDataMap, docCd };\n}\n\n/**\n * 주어진 문서 인덱스 목록(`indexList`)에 대해\n * 각 문서의 중간저장 데이터를 순차적으로 요청합니다.\n * \n * 각 페이지 검사 사이에 기본 지연(sleep)을 추가하여 처리 속도를 제어합니다.\n *\n * @param indexList - 중간저장 데이터를 요청할 문서의 인덱스 배열\n */\nexport async function triggerDraftDataByIndexList(indexList: number[]) {\n for (let i = 0; i < indexList.length; i++) {\n await sleep();\n await Bridge.nativeOz.triggerExternalEventByDocIndex({ param1: OZTriggerExternalEvent.GetDraftData, docIndex: indexList[i]!, });\n }\n}","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { sleep } from \"../common-util\";\n\nimport { getReportCountMemo } from './oz-wrapper-util';\n\n/**\n * 서식 검증 시, 빈 서식에 포커스를 줄지 제어하는 브릿지 유틸\n */\n\n/**\n * 유효성 검사 시 미입력된 컴포넌트에 포커스 설정 여부를 지정\n * \n * @param enable - true면 포커스 활성화, false면 비활성화\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nasync function setFocusOnValidation(enable: boolean, reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n const expectedValue = enable ? '1' : '0';\n\n const { data: prev } = await Bridge.nativeOz.getGlobal({ key: 'chkFlag', docIndex: 0 });\n\n // 첫번째 doc에 대해서 기 입력된 값을 검사해서 일치하면 조기탈출\n if (prev === expectedValue) {\n return;\n }\n\n for (let i = 0; i < count; i++) {\n await sleep();\n await Bridge.nativeOz.setGlobal({ key: 'chkFlag', value: expectedValue, docIndex: i });\n }\n\n return;\n}\n\n/**\n * 유효성 검사 시 미입력된 컴포넌트에 자동으로 포커스를 맞추도록 설정\n * \n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function enableFocusOnValidation(reportCount?: number) {\n return setFocusOnValidation(true, reportCount);\n}\n\n/**\n * 유효성 검사 시 미입력된 컴포넌트에 포커스가 가지 않도록 설정\n * \n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function disableFocusOnValidation(reportCount?: number) {\n return setFocusOnValidation(false, reportCount);\n}\n","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { PromiseWithResolvers } from '../../../internal';\nimport { commonPdfExportParam } from \"../../constant\";\nimport { OZExportEvent, OZViewerEvent } from \"../../types\";\n\nimport { getTotalPageMemo } from \"./oz-wrapper-util\";\n\nimport type { OzdFile } from \"sales-frontend-bridge\";\n\n\n/**\n * PDF 저장을 비동기적으로 처리하고, 저장된 파일 경로를 반환하는 함수\n * - OZD 전체를 하나의 PDF로 저장\n */\nexport async function SaveTotalPdf(policyNumber: string, fileName: string) {\n\n // 1페이지부터\n const startPage = 1;\n // 전체 페이지 수 가져오기\n const endPage = await getTotalPageMemo();\n\n return await SavePdf({ policyNumber, fileName, startPage, endPage });\n\n}\n\n/**\n * PDF 저장을 비동기적으로 처리하고, 저장된 파일 경로를 반환하는 함수\n * - 개별 OZD를 PDF로 저장하는 함수\n */\nexport async function SaveSinglePdf(\n policyNumber: string,\n { startPage, endPage, docCode: fileName }: OzdFile\n) {\n\n return await SavePdf({ policyNumber, fileName, startPage, endPage });\n}\n\n\ntype SavePdfProps = Pick<OzdFile, \"startPage\" | \"endPage\"> & {\n /** 증권번호 */\n policyNumber: string;\n /** PDF 파일이름(확장자 제외) */\n fileName: string;\n}\nasync function SavePdf({ policyNumber, fileName, startPage, endPage }: SavePdfProps) {\n // CustomEvent로부터 전달될 파일 경로를 기다리기 위한 Promise 생성\n const { promise, resolve } = PromiseWithResolvers<string>();\n\n // OZExportCommand 이벤트가 발생하면, 파일 경로를 resolve하여 Promise 완료\n window.addEventListener(\n OZViewerEvent.OZExportCommand,\n // 이벤트를 CustomEvent로 타입 캐스팅하고, detail에서 파일 경로 추출\n (e: Event) => resolve((e as CustomEvent<OZExportEvent>).detail.filepaths),\n // 이벤트 리스너는 한 번만 실행되도록 설정\n { once: true }\n );\n\n\n // OZ 브릿지를 통해 PDF 저장 명령 실행\n await Bridge.nativeOz.savePdf({\n // PDF 저장은 증번폴더/파일이름.pdf로 생성\n policyNumber,\n param: [\n // 저장할 파일명 설정\n `pdf.filename=${fileName}.pdf`,\n // 1페이지부터 마지막 페이지까지 저장\n `export.pages=${startPage}-${endPage}`,\n // 공통 PDF 내보내기 파라미터 추가\n ...commonPdfExportParam\n ].join('\\n')\n });\n\n // OZExportCommand 이벤트로부터 전달된 파일 경로를 기다림\n const filepath = await promise;\n\n // 최종적으로 파일 경로 반환\n return filepath;\n}","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { sleep } from \"../common-util\";\n\nimport { getTotalPageMemo } from './oz-wrapper-util';\n\n/**\n * OZ 서식 검증용 브릿지 유틸\n */\n\n/**\n * 유효성을 체크할 doc들의 index를 배열로 입력받는다\n *\n * 모두 유효하면 true를 리턴한다\n *\n * documentInfo의 complete를 계산할때 사용한다\n *\n * 서명패드가 열려있는 상태에서 INPUT_CHECK_VALIDITY로 검사하면 서명패드가 꺼져서 onValueChange에서는 INVALID_INFO_JSON을 사용한다\n */\nexport async function checkDocumentsValidityByIndex(indexList: number[]) {\n // INVALID_INFO_JSON_AT은 valid한 경우 ''를 리턴한다\n const VALID = '';\n for (let i = 0; i < indexList.length; i++) {\n await sleep();\n const command = `INVALID_INFO_JSON_AT=${indexList[i]}`;\n const { data } = await Bridge.nativeOz.getInformation({ command });\n\n if (data !== VALID) {\n // 유효하지 않으면 조기탈출\n return false;\n }\n }\n\n return true\n}\n\n/**\n * 지정된 페이지 범위에 대해 유효성 검사를 수행합니다.\n * \n * 유효성 검사는 1페이지부터 지정된 마지막 페이지까지 진행되며,\n * 각 페이지 검사 사이에 기본 지연(sleep)을 추가하여 처리 속도를 제어합니다.\n * - pageChange 이벤트 내부에서는 현재 페이지 이전까지만 검사\n * - 서명바로가기, 미입력 서명 바로가기, 청약문서 최종 확인하기 버튼을 눌렀을때는 전체 페이지 검사\n * \n * @param pageCount - 유효성 검사를 수행할 페이지의 총 개수. (생략하면 자동으로 전체 페이지 수를 계산하여 사용)\n * @returns 모든 페이지가 유효한 경우 true, 하나라도 유효하지 않으면 false를 반환합니다.\n */\nexport async function validateAllPages(pageCount?: number) {\n // pageCount가 주어지지 않으면 전체 페이지 수를 계산하여 사용\n const count = pageCount ?? await getTotalPageMemo();\n\n for (let i = 1; i <= count; i++) {\n // 각 페이지 검사 사이에 지연을 추가\n await sleep();\n // 캐시 기반 validation 검사\n const isValid = await checkValidPageMemo(i);\n\n // 페이지 유효성 검사가 실패하면 즉시 종료\n if (!isValid) {\n return false;\n }\n }\n\n // 모든 페이지가 유효한 경우 true 반환\n return true;\n}\n\n\n/**\n * 페이지 유효성 검사 결과를 캐싱하는 유틸리티\n *\n * - 동일 페이지에 대한 중복 호출을 방지\n * - validation 결과가 false인 경우에는 캐시에 저장하지 않음\n */\nexport const checkValidPageMemo = (() => {\n // ✅ 페이지 번호를 키로 사용하여 Promise<boolean> 형태로 결과를 캐싱\n const cache = new Map<number, Promise<boolean>>();\n\n /**\n * 주어진 페이지가 유효한지 검사\n *\n * @param page 검사할 페이지 번호\n * @returns 페이지 유효 여부 (Promise<boolean>)\n */\n async function checkValidPage(page: number): Promise<boolean> {\n const cached = cache.get(page);\n if (cached) {\n // 캐시에 이미 결과(Promise)가 있다면 재사용\n return cached;\n }\n\n const VALID = 'valid';\n const command = `INPUT_CHECK_VALIDITY_PAGE_AT=${page}`;\n\n // ⚙️ 네이티브 호출을 Promise로 감싸서 즉시 캐시에 저장\n // (중복 요청을 방지하기 위함)\n const promise = (async () => {\n try {\n const { data } = await Bridge.nativeOz.getInformation({ command });\n const isValid = data === VALID;\n\n // ❌ 유효하지 않은(false) 결과는 캐시에 저장하지 않음\n if (!isValid) {\n cache.delete(page);\n }\n\n return isValid;\n } catch (err) {\n // ⚠️ 호출 실패 시 캐시에서 제거하여 다음 요청 시 재시도 가능하도록 함\n cache.delete(page);\n throw err;\n }\n })();\n\n // ⏳ 진행 중인 Promise를 캐시에 저장 (중복 호출 방지)\n cache.set(page, promise);\n\n // 결과 반환\n return promise;\n }\n\n /**\n * 전체 캐시를 초기화합니다.\n */\n checkValidPage.clearCache = () => {\n cache.clear();\n };\n\n /**\n * 특정 페이지의 캐시만 삭제합니다.\n * \n * @param page 삭제할 페이지 번호\n */\n checkValidPage.clearCacheByPage = (page: number) => {\n cache.delete(page);\n };\n\n return checkValidPage;\n})();\n","import { debounce } from 'sales-frontend-utils';\n\n/**\n * 📘 ValueChangeDebounceUtil\n *\n * 문서의 OnValueChange 이벤트를 debounce 처리하기 위한 유틸\n *\n * - 동일한 문서 인덱스에서 연속 호출 시 debounce\n * - 다른 문서 인덱스는 독립적으로 debounce 처리\n */\n\n// 문서 인덱스별로 debounce 핸들러를 저장\nconst valueChangeDebounceMap = new Map<string, ReturnType<typeof debounce>>();\n\n/**\n * 특정 문서 인덱스의 OnValueChanged 핸들러를 debounce 처리하여 반환\n *\n * @param docIndex - 문서 인덱스 (string)\n * @param onValueChanged - debounce 후 실행할 콜백\n * @returns debounce된 핸들러 함수\n */\nexport function getDebouncedValueChangeHandler(\n docIndex: string,\n onValueChanged: (docIndex: string) => void\n) {\n // 서명패드에 수정이 일어나면 0.5초동안 디바운스 처리\n const DEBOUNCE_DELAY = 1000 * 0.5;\n\n // 이미 debounce된 핸들러가 있다면 그대로 사용\n const existingHandler = valueChangeDebounceMap.get(docIndex);\n if (existingHandler) {\n return existingHandler;\n }\n\n // 새로운 debounce 핸들러 생성\n const debouncedHandler = debounce((idx: string) => {\n onValueChanged(idx);\n }, DEBOUNCE_DELAY);\n\n valueChangeDebounceMap.set(docIndex, debouncedHandler);\n\n return debouncedHandler;\n}\n\n/**\n * 모든 문서 인덱스의 debounce 핸들러 초기화\n */\nexport function clearValueChangeDebounceHandlers() {\n valueChangeDebounceMap.clear();\n}\n"]}
1
+ {"version":3,"sources":["../src/oz/constant/comment-pen-param.ts","../src/oz/constant/oz-param.ts","../src/oz/constant/pdf-param.ts","../src/oz/hooks/use-document-info.tsx","../src/oz/hooks/use-oz-event-listener.tsx","../src/oz/types/oz-event.types.ts","../src/oz/utils/bridge-util/alert-util.ts","../src/internal/const/test-data.ts","../src/internal/utils/internal-common-utils.ts","../src/oz/utils/common-util.ts","../src/oz/utils/bridge-util/fetch-util.ts","../src/oz/utils/bridge-util/oz-wrapper-util.ts","../src/oz/utils/bridge-util/create-report-util.ts","../src/oz/utils/bridge-util/get-draft-data-util.ts","../src/oz/utils/bridge-util/focus-util.ts","../src/oz/utils/bridge-util/save-pdf-util.ts","../src/oz/utils/bridge-util/validation-util.ts","../src/oz/utils/value-change-debounce-util.ts"],"names":["useMemo","ozdFile","useCallback","useEffect","OZViewerEvent","OZTriggerExternalEvent","Bridge","base64ToFile","fileToBase64","idx","debounce"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 형광펜 편집 관련 상수\n */\n\nconst commentPenDefaultParam = [\n `comment.selectedpen=highlightpen`,\n `comment.highlightpen_thick=15`,\n]\n\nexport const commentPenYellow = [...commentPenDefaultParam, `comment.highlightpen_color=ffd900`];\nexport const commentPenPink = [...commentPenDefaultParam, `comment.highlightpen_color=f48fb1`];\nexport const commentPenGreen = [...commentPenDefaultParam, `comment.highlightpen_color=81c784`];\nexport const commentPenEraser = [`comment.selectedpen=eraser`,];","/**\n * 모든페이지 공용으로 쓰는 OZ 뷰어파라미터\n */\n\nconst informationOzParam = [\n // 뷰어 콘솔 로그 정보의 수준(Level)을 설정합니다. - 뷰어 수행에 필요한 디버깅용 메시지를 자바 콘솔에 출력\n `information.debug = true`,\n];\nconst globalOzParam = [\n // 다중 보고서 호출 시 부모 보고서의 파라미터 값을 자식 보고서가 상속받을지 여부를 설정합니다.\n `global.inheritparameter=true`,\n // 멀티 보고서를 하나의 보고서처럼 사용할지 여부를 설정합니다.\n `global.concatpage=true`,\n // 멀티 보고서를 하나의 보고서처럼 설정한 경우 각각의 보고서별로 페이지 번호를 부여할지 여부를 설정합니다.\n // `global.eachpagenumberatconcatpage=true`,\n];\nconst eformOzParam = [\n `eform.signpad_type=embedded`,\n // `eform.signpad_type=keypad`,\n `eform.show_prev_next_input=true`,\n // `eform.signpad_prev_next_iconposition=sign_top_left`,\n `eform.signpad_prev_next_iconposition=sign_top`,\n `eform.signpad_show_draw_erase_button=false`,\n `eform.signpad_viewtype=keepratioandfittoframe`,\n `eform.radiobutton_type=ensurevisible_at_prev_next`,\n `eform.checkbox_type=ensurevisible_at_prev_next`,\n `eform.prev_next_required_rule=required_only`,\n `eform.prev_next_navigation_rule=required_only`,\n `eform.prev_next_constraint_rule=empty_only`,\n `eform.imagepicker_camera_iconposition = camera_top`,\n `eform.inputeventcommand=true`,\n // 서명 입력 중간중간에 onValueChanged가 호출 / 디폴트는 입력끝나고 창이 닫힐때 호출\n `eform.onvaluechanged_callrule_json=${JSON.stringify({ signpad: 'changed' })}`,\n `eform.inputcomponent_toolbar_button_json=${JSON.stringify({\n // 서명패드 버튼 배열 수정\n \"all\": {\n // 왼쪽에 [이전, 창닫기]\n \"left_align\": \"prev,ok\",\n // 오른쪽에 [다시쓰기, 성명,서명 불러오기, 다음]\n \"right_align\": \"clear,reusablesign,next\"\n }\n })}`,\n `eform.imagepicker_id_info=${JSON.stringify({\n ids: [\n {\n id: '1',\n name: '운전면허증_최신',\n size: '86x54',\n margin: '3',\n mask: [\n { name: '주민번호', area: '0,0,0,0' },\n { name: '운전면허번호', area: '0,0,0,0' },\n { name: '발급번호', area: '0,0,0,0' },\n { name: '발급날짜', area: '0,0,0,0' }\n ]\n },\n {\n id: '2',\n name: '운전면허증_구형',\n size: '86x54',\n margin: '3',\n mask: [\n { name: '주민번호', area: '0,0,0,0' },\n { name: '운전면허번호', area: '0,0,0,0' },\n { name: '발급번호', area: '0,0,0,0' },\n { name: '발급날짜', area: '0,0,0,0' }\n ]\n },\n {\n id: '3',\n name: '주민등록증',\n size: '86x54',\n margin: '3',\n mask: [\n { name: '주민번호', area: '0,0,0,0' },\n { name: '발급날짜', area: '0,0,0,0' }\n ]\n },\n {\n id: '4',\n name: '외국인등록증 앞면',\n size: '86x54',\n margin: '3',\n mask: [\n { name: '외국인등록번호1', area: '0,0,0,0' },\n { name: '외국인등록번호2', area: '0,0,0,0' },\n { name: '성명', area: '0,0,0,0' },\n { name: '성별', area: '0,0,0,0' },\n { name: '국가지역', area: '0,0,0,0' },\n { name: '체류자격', area: '0,0,0,0' },\n { name: '발급일자', area: '0,0,0,0' }\n ]\n },\n { id: '5', name: '외국인등록증 뒷면', size: '86x54', margin: '3', mask: [{ name: '외국인', area: '0,0,0,0' }] }\n ],\n choice: { title: '신분증을 선택하세요.', items: '1,2,3,4,5' }\n })}`\n];\n\nconst viewerOzPram = [\n `viewer.pagenavigate_by_prev_next=true`,\n `viewer.zoombymouse=false`,\n `viewer.zoombydoubletap=false`,\n `viewer.pagedisplay=singlepagecontinuous`,\n `viewer.usetoolbar=false`,\n `viewer.usestatusbar=false`,\n `viewer.useprogressbar=false`,\n `viewer.zoom=137`,\n `viewer.viewmode=fittowidth`,\n `viewer.hidehorizontalscroll=false`,\n `viewer.progresscommand=true`,\n `viewer.pagechangecommand=true`,\n `viewer.exportcommand=true`,\n `viewer.errorcommand=true`,\n `viewer.reportchangecommand=true`,\n `viewer.pagebindcommandinterval=500`,\n];\n\nconst ozdOzParam = [\n // connection.args=key=value로 넘기는 정보들은 ozr에서만 유효하나 ozd에서도 유효하도록 허용\n `ozd.allowreplaceformparam=true`\n]\n\nexport const commonOzParam = [\n ...informationOzParam,\n ...globalOzParam,\n ...eformOzParam,\n ...viewerOzPram,\n ...ozdOzParam,\n];","/**\n * PDF export시 공통으로 필요한 파라미터\n *\n * 제공하지 않는 파라미터\n * - filename\n * - ex) `pdf.filename=test.pdf`\n * - pages\n * - ex) `export.pages=1-2`\n * - userpassword\n * - ex) `pdf.userpassword=123213`\n */\nexport const commonPdfExportParam = [\n // `pdf.filename=${\"test.pdf\"}`,\n // `export.pages=${i.startPage}-${i.endPage}`,\n // \"pdf.userpassword=$pdfPassword\",G\n 'export.pagerange=range',\n 'export.confirmsave=false',\n 'export.mode=silent',\n // pdf에 폰트를 포함시킨다\n `pdf.fontembedding=true`,\n // 폰트를 포함시킬때 사용하는 글자만 포함시킨다\n `pdf.fontembedding_subset=true`\n];","import { useMemo } from \"react\";\n\nimport type { FormInfo } from \"sales-frontend-bridge\";\n\n/**\n * documentInfo를 여러가지 형태로 가공해주는 hook\n */\nexport function useDocumentInfo(initialValue: FormInfo[]) {\n\n /** 서식 목록 */\n const documentInfo = initialValue;\n\n /** 글로벌 문서 목록 */\n const documentList = useMemo(() => documentInfo.map((i) => i.doc).flat(1), [documentInfo]);\n\n /** 글로벌 문서 맵 { 문서코드: 글로벌 인덱스} */\n const documentIndexMap = documentList.reduce((acc, cur, index) => {\n acc[cur.docCode] = index;\n\n return acc;\n }, {} as Record<string, number>)\n\n /** 글로벌 문서 맵 { 문서코드: 속한 서식 } */\n const documentTemplateMap = useMemo(() => documentInfo.reduce((map, template) => {\n template.doc.forEach(ozdFile => {\n map[ozdFile.docCode] = { ...template };\n });\n\n return map;\n\n }, {} as Record<string, FormInfo>), [documentInfo]);\n\n // 글로벌 문서 맵 { 서식이름: 서식 }\n const nameTemplateMap = documentInfo.reduce((acc, doc) => {\n acc[doc.name] = doc;\n\n return acc;\n }, {} as Record<string, FormInfo>);\n\n // 글로벌 문서 배열 { 글로벌인덱스: [동료서식 글로벌인덱스, 동료서식 글로벌인덱스] }\n const groupIndexes = useMemo(() => (\n documentInfo.reduce((acc, item) => {\n item.doc.forEach((ozdFile) => {\n const currentIndex = documentIndexMap[ozdFile.docCode] as number;\n\n // 각 globalIndex에 해당하는 그룹 인덱스를 추가\n if (!acc[currentIndex]) {\n acc[currentIndex] = []; // 배열로 초기화\n }\n\n // 해당 파일이 속한 그룹의 인덱스를 추가\n item.doc.forEach((ozdFile) => {\n acc[currentIndex]!.push(documentIndexMap[ozdFile.docCode]!);\n });\n });\n\n return acc;\n }, [] as Array<Array<number>>)\n ), [documentIndexMap, documentInfo]);\n\n // 모든 서식이 완료되었는지 확인\n const isAllComplete = useMemo(() => (documentInfo.every(i => i.complete)), [documentInfo]);\n\n return {\n documentList,\n documentTemplateMap,\n documentIndexMap,\n nameTemplateMap,\n groupIndexes,\n isAllComplete\n }\n}","import { useCallback, useEffect } from 'react';\n\nimport { OZViewerEvent } from \"../types\"\n\ntype Props<T, R = void> = {\n event: OZViewerEvent;\n handler: (e: CustomEvent<T>) => Promise<R>;\n};\n/**\n * OZ 뷰어 콜백 이벤트를 구독해주는 Hook\n */\nexport function useOzEventListener<T, R = void>({ event, handler }: Props<T, R>) {\n const handleEvent = useCallback(\n async (e: Event) => {\n const customEvent = e as CustomEvent<T>;\n\n return await handler(customEvent);\n },\n [handler]\n );\n\n useEffect(() => {\n window.addEventListener(event, handleEvent);\n\n return () => {\n window.removeEventListener(event, handleEvent);\n };\n }, [handleEvent, event]);\n}\n","/**\n * OZ 뷰어에 관련된 이벤트 목록\n */\nexport enum OZViewerEvent {\n /**\n * 보고서 생성 단계별로 발생하는 이벤트\n * - `OZViewerProgressEvent` 이벤트와 매칭된다\n * - `viewer.progresscommand=true` 설정이 필요하다\n * - `OZViewerProgressEvent`와 매칭된다\n * - 모든 문서가 로딩되면 `OZReportCreated` 이벤트를 트리거시켜주어야 한다\n */\n OZProgressCommand = 'OZProgressCommand',\n /**\n * 에러 발생 시 발생하는 이벤트\n * - `viewer.errorcommand=true` 설정이 필요하다\n * - `OZViewerErrorEvent`와 매칭된다\n */\n OZErrorCommand = 'OZErrorCommand',\n /**\n * 화면에 표시되는 페이지가 변경된 후 발생하는 이벤트\n * - `viewer.pagechangecommand=true` 설정이 필요하다\n * - `OZViewerChangeEvent`와 매칭된다\n */\n OZPageChangeCommand = 'OZPageChangeCommand',\n /**\n * 화면에 표시되는 보고서가 변경된 후 발생하는 이벤트\n * - `viewer.reportchangecommand=true` 설정이 필요하다\n * - `OZViewerChangeEvent`와 매칭된다\n */\n OZReportChangeCommand = 'OZReportChangeCommand',\n /**\n * `OZUserEvent` _TriggerOCXUserEvent 함수 실행 시 발생하는 이벤트\n * - `OZViewerUserEvent`와 매칭된다\n */\n OZUserEvent = 'OZUserEvent',\n /**\n * `OZPageBindCommand` 페이지가 바인딩된 후 발생하는 이벤트\n * - `viewer.pagebindcommandinterval` 파라미터에서 설정한 주기별로 동작\n * - ex) `viewer.pagebindcommandinterval=500`\n * - `OZViewerPageBindEvent`와 매칭된다\n */\n OZPageBindCommand = 'OZPageBindCommand',\n /**\n * 사용자가 입력 컴포넌트를 클릭하거나 값을 변경하여 이벤트가 실행된 경우 발생되는 이벤트'\n * - 호환되는 이벤트\n * - `OnClick`\n * - `OnFinish`\n * - `OnFocus`\n * - `OnKillFocus`\n * - `OnPause`\n * - `OnPlay`\n * - `OnStop`\n * - `OnValueChanged`\n * - `eform.inputeventcommand=true` 설정이 필요하다\n * - `OZEFormInputEvent`와 매칭된다\n */\n OZEFormInputEventCommand = 'OZEFormInputEventCommand',\n /**\n * 보고서 저장 시 발생하는 이벤트\n * - `OZExportEvent`와 매칭된다\n */\n OZExportCommand = 'OZExportCommand',\n\n /**\n * 오즈뷰어, (오즈전용)PDF 뷰어 내 버튼 클릭시 발생하는 이벤트\n * - `OZBtnTouchEvent`와 매칭된다\n */\n OZBtnTouchEvent = 'btnTouchEvent',\n\n /**\n * `OZProgressCommand` 이벤트가 문서 갯수만큼 불리면 이 이벤트를 트리거한다\n * - 웹에서 직접 트리거 하는 이벤트\n */\n OZReportCreated = 'OZReportCreated',\n}\n\n/**\n * TriggerExternal에 사용할 param1인자를 정의한 enum\n * - GetDraftData 중간저장 서명이미지 추출\n * - cropimage 서명이미지 크롭\n */\nexport enum OZTriggerExternalEvent {\n GetDraftData = 'getDraftData',\n CropImage = 'cropimage'\n}\n\n/**\n * `OZViewerEvent.OZProgressCommand` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZProgressCommand, (e) => { console.log(e.detail); });\n * ```\n *\n * `step과` `state`는 step => state 방식으로 진행된다\n *\n * 예시\n * ```bash\n * # step0 뷰어실행\n * [step=0][state=0] # 뷰어 실행 시작\n * [step=0][state=1] # 뷰어 실행 완료\n * # step2 보고서 템플릿 생성\n * [step=1][state=0] # 보고서 템플릿 생성 시작\n * [step=1][state=1] # 보고서 템플릿 생성 완료\n * ```\n */\nexport type OZViewerProgressEvent = {\n /**\n * 보고서 생성 단계\n * - 0 : 뷰어 실행 옵션 설정\n * - 1 : 보고서 파일 다운로드\n * - 2 : 보고서 템플릿 생성\n * - 3 : 데이터 다운로드\n * - 4 : 보고서 바인딩\n */\n step: '0' | '1' | '2' | '3' | '4';\n /**\n * 보고서 생성 상태\n * - 1 : 시작\n * - 2 : 완료\n */\n state: '1' | '2';\n /** 보고서 이름 */\n reportname: string;\n};\n\n/**\n * `OZViewerEvent.OZErrorCommand` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZErrorCommand, (e) => { console.log(e.detail); });\n * ```\n */\nexport type OZViewerErrorEvent = {\n /** 에러 메시지 코드 */\n code: string;\n /** 에러 기본 메시지 */\n message: string;\n /** 에러 상세 메시지 */\n detailmessage: string;\n /** 보고서 이름 */\n reportname: string;\n};\n\n/**\n * 두 이벤트의 공용 타입\n * - `OZViewerEvent.OZPageChangeCommand` 이벤트의 `e.detail` 타입 정의\n * - `OZViewerEvent.OZReportChangeCommand` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZPageChangeCommand, (e) => { console.log(e.detail); });\n * window.addEventListener(OZViewerEvent.OZViewerChangeCommand, (e) => { console.log(e.detail); });\n * ```\n */\nexport type OZViewerChangeEvent = {\n /** 보고서 인덱스(zero-based index) */\n docindex: number;\n};\n\n/**\n * `OZViewerEvent.OZUserEvent` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZUserEvent, (e) => { console.log(e.detail); });\n * ```\n */\nexport type OZViewerUserEvent = {\n /** _TriggerOCXUserEvent 함수에서 전달한 첫 번째 값 */\n param1: string;\n /** _TriggerOCXUserEvent 함수에서 전달한 두 번째 값 */\n param2: string;\n /** _TriggerOCXUserEvent 함수에서 전달한 세 번째 값 */\n param3: string;\n /** 보고서 인덱스(zero-based index) */\n docindex: string;\n};\n\n/**\n * `OZViewerEvent.OZPageBindCommand` 이벤트의 `e.detail` 타입 정의\n * ```tsx\n * import { OZViewerEvent } from 'sales-frontend-bridge';\n * window.addEventListener(OZViewerEvent.OZPageBindCommand, (e) => { console.log(e.detail); });\n * ```\n */\nexport type OZViewerPageBindEvent = {\n /** 보고서 인덱스(zero-based index) */\n docindex: string;\n /** 바인딩된 페이지 번호 */\n pagecount: string;\n};\n\nexport type OZEFormInputEvent = {\n /** 보고서 인덱스(zero-based index) */\n docindex: string;\n /** 이벤트가 발생한 컴포넌트의 FormID. FormID가 설정되지 않은 경우 컴포넌트의 이름이 리턴됨 */\n formid: string;\n eventname: string;\n mainscreen: boolean;\n}\n\nexport type OZExportEvent = {\n /**\n * 저장 성공 여부\n * - `0` 실패\n * - `1` 성공\n */\n code: \"0\" | \"1\"\n /** 파일 경로 */\n path: string;\n /** 파일 이름 */\n filename: string;\n /** 저장된 페이지 수. 여러 페이지의 보고서를 한 페이지로 저장한 경우에는 1이 리턴됨 */\n pagecount: string;\n /**\n * 뷰어가 실제 저장한 모든 파일의 경로와 이름.\n * \n * 파일이 여러 개일 경우 `|`를 구분자로 하여 리턴됨\n */\n filepaths: string;\n}\n\n/**\n * 상단 전체목록 보기 버튼 내 서식 클릭이벤트\n * - 선택된 서식의 텍스트가 btnID로 넘어온다\n */\nexport type CategoryEvent = {\n type: \"category\";\n /** 자유 입력 가능한 버튼 ID */\n btnID: string;\n};\n\n/**\n * 상단 버튼 클릭 이벤트(전체목록 버튼 제외)\n * - 예: 나가기 버튼\n */\nexport type TopEvent = {\n type: \"top\";\n btnID: \"btnExit\";\n};\n\n/**\n * 성명,서명, 덧쓰기 관련 버튼 클릭 이벤트\n * - `signatureInProgress` 서명 바로가기 버튼\n * - `signatureInMissing` 미입력 항목 입력하기 버튼(느낌표 버튼)\n * - `signatureComplete` 청약문서 최종 확인하기\n */\nexport type SignatureEvent = {\n type: \"signature\";\n btnID: \"signatureInProgress\" | \"signatureInMissing\" | \"signatureComplete\";\n};\n\n/**\n * pdf 뷰어 내 버튼 클릭 이벤트\n * - `modify` 성명 서명 덧쓰기 수정하러 가기\n * - `submit` 최종 제출하기\n */\nexport type PdfEvent = {\n type: \"pdf\";\n btnID: \"modify\" | \"submit\";\n};\n\n/**\n * comment(형광펜) 관련 버튼 클릭 이벤트\n * - `yellow` 노랑색 형광펜 활성화\n * - `pink` 분홍색 형광펜 활성화\n * - `green` 초록색 형광펜 활성화\n * - `eraser` 지우개 활성화\n * - `disable` 형광펜 모드 종료\n */\nexport type CommentEvent = {\n type: \"comment\";\n btnID: \"yellow\" | \"pink\" | \"green\" | \"eraser\" | \"disable\";\n};\n\n/**\n * OZ 문서 시스템 내 버튼 클릭 이벤트 통합 타입\n *\n * type(카테고리)에 따라 btnID 값이 다르게 제한됩니다.\n */\nexport type OZBtnTouchEvent =\n | CategoryEvent\n | TopEvent\n | SignatureEvent\n | PdfEvent\n | CommentEvent;\n\n/**\n * 문서코드별 입력 데이터 및 추가 파라미터 매핑 타입\n *\n * 각 문서코드에 대해 `inputJson` (임의의 key-value 쌍)과\n * \n * 선택적으로 `extraParam` (기타 추가 파라미터)을 포함하는 객체입니다.\n *\n * 예시:\n * ```javascript\n * {\n * A0010: {\n * inputJson: {\n * A0010_mynm_sg: 'data:image/png;base64,iVBORw0K...', // 예: 이미지 데이터\n * A0010_mysg_sign: 'data:image/png;base64,iVBORw0KG...', // 예: 이미지 데이터\n * custom_field: 'some value', // 임의의 데이터도 가능\n * },\n * args: [`roleCd=11,21`]\n * extraParam: [`viewer.zoom=137`]\n * },\n * C0401: {\n * inputJson: {\n * mynm_sg: 'data:image/png;base64,iVBORw0K...', // 예: 이미지 데이터\n * mysg_sign: 'data:image/png;base64,iVBORw0KG...', // 예: 이미지 데이터\n * another_field: 'another value', // 임의의 데이터\n * }\n * },\n * }\n * ```\n */\nexport type ExtraDataType = Record<string, {\n /** connection.inputJson으로 전달할 `{ \"key1\": \"value1\", \"key2\": \"value2\" }` 형식의 데이터 (예: 문자열, base64 이미지 등) */\n inputJson?: Record<string, string>;\n /** connection.arg로 전달할 `[\"key1=value1\", \"key2=value2\"]` 형식의 데이터 */\n args?: string[];\n /** 추가 파라미터 목록 (선택 사항) */\n extraParam?: string[];\n}>;\n","import { Bridge } from \"sales-frontend-bridge\";\n\n/**\n * ### 발생 상황 및 에러 메시지 정리\n * 1. 비정형에서 OZD 다운로드 시 → 청약문서를 불러오지 못했습니다\n * 2. 백엔드에서 중간저장 데이터 로딩 시 → 일시적인 오류가 발생했습니다\n * 3. 오즈뷰어(솔루션) 초기화(OZD 파일 + 중간저장 데이터) 시 → 일시적인 오류가 발생했습니다\n * 4. 성명/서명/덧쓰기 진행 시 → 일시적인 오류가 발생했습니다\n * 5. 서식 완료 후 서명 중간저장(비정형 저장) 시 → 일시적인 오류가 발생했습니다\n * 6. PDF Export(개별문서/통합문서) 시 → 청약문서를 불러오지 못했습니다\n * 7. PDF 뷰어 초기화(Export된 PDF를 화면에 렌더링) 시 → 청약문서를 불러오지 못했습니다\n *\n * ### 에러 발생 시 처리 동작\n * - 에러 발생시 재시도 혹은 탈출을 위해 이전 화면으로 돌아간다\n * - 1~5단계 에서 에러 발생 시 → 확인버튼 클릭 → OZ 뷰어 종료 브릿지 호출\n * - 6~7단계 에서 에러 발생 시 → 확인버튼 클릭 → PDF 뷰어 종료 브릿지 호출\n * \n * ### 일반적인 상황에서는 아래 두 함수를 사용하고 커스텀한 상황애서는 showAlert을 직접 조합하여 사용한다\n */\n\n\n/**\n * OZ 뷰어 및 비정형 처리 과정에서 일시적인 오류가 발생했을 때 표시되는 경고창.\n * #### 처리 동작\n * - 확인 버튼 클릭 시 OZ 뷰어 종료 브릿지 호출\n */\nexport async function AlertTemporaryError() {\n return await Bridge.nativeOz.showAlert({\n title: \"일시적인 오류가 발생했습니다\",\n message: \"문제가 지속될 경우 IT콜센터(1522-6379)로 문의해주세요.\",\n buttons: { close: false, main: \"확인\" }\n });\n}\n\n/**\n * 청약문서를 불러오지 못했을 때 표시되는 경고창.\n * #### 처리 동작\n * - 확인 버튼 클릭 시 PDF 뷰어 종료 브릿지 호출\n */\nexport async function AlertDocumentLoadError() {\n return await Bridge.nativeOz.showAlert({\n title: \"청약문서를 불러오지 못했습니다\",\n message: \"문제가 지속될 경우 IT콜센터(1522-6379)로 문의해주세요.\",\n buttons: { close: false, main: \"확인\" }\n });\n}","import type { CSSProperties } from 'react';\n\nimport type { ExtraDataType } from '../../oz';\nimport type { FormInfo } from \"sales-frontend-bridge\";\nexport const wrapperStyle: CSSProperties = { display: 'flex', flexFlow: 'column', gap: '10px' };\nexport const btnStyle: CSSProperties = { border: '1px solid red', minHeight: '40px' };\n\n/** 테스트용 하드코딩 문서목록 */\nexport const DownloadDocumentList: Array<FormInfo> = [\n { name: '[A0010]청약서', doc: [{ docCode: 'A0010', fileID: '2msKWTCPgZs9uKkAA', }] },\n { name: '[A0100]비교안내확인서', doc: [{ docCode: 'A0100', fileID: 'Hio2lLCPgZyq6KkAA' }] },\n // { name: '[A0900]상품설명서', doc: [{ docCode: 'A0900', fileID: 'CYQdBKCPgZ3BIKkAA' }] },\n // { name: '[A1500]청약부속정보확인서', doc: [{ docCode: 'A1500', fileID: 'sRbTYdCPgZ8aPKkAA' }] },\n // { name: '[A2215]보험계약대출이행관리동의서', doc: [{ docCode: 'A2215', fileID: 'YKAM55CPgZ_d5KkAA' }] },\n // { name: '[A2800]계약전알릴의무', doc: [{ docCode: 'A2800', fileID: 'JUYBzOCPgaEu_KkAA' }] },\n // { name: '[A3503]청약서별지(변액용)', doc: [{ docCode: 'A3503', fileID: 'l4oxhwCPgaIxLKkAA' }] },\n // { name: '[B0101]보험계약체결동의서', doc: [{ docCode: 'B0101', fileID: 'Ivk9FACPgaMTgKkAA' }] },\n // { name: '[C0400]계약체결이행동의서', doc: [{ docCode: 'C0400', fileID: 'X0gI1rCPgaQg8KkAA' }] },\n // { name: '[C0401]상품소개상세동의서', doc: [{ docCode: 'C0401', fileID: 'EfA9ldCPgaUHqKkAA' }] },\n // { name: '[C1000]보험상품판매체크리스트', doc: [{ docCode: 'C1000', fileID: 'nqqFywCPgaYOFKkAA' }] },\n // { name: '[C1100]완전판매안내확인서', doc: [{ docCode: 'C1100', fileID: 'FiSFniCPgawR_KkAA' }] },\n // { name: '[C1200]대면설명확인서', doc: [{ docCode: 'C1200', fileID: 't7yFAoCPgay4RKkAA' }] },\n // { name: '[C1300]계약체결고지의무확인서', doc: [{ docCode: 'C1300', fileID: 'WdUzi6CPgaccbKkAA' }] },\n // { name: '[C1400]보험상품비교설명확인서', doc: [{ docCode: 'C1400', fileID: 'kgoT28CPgaf4YKkAA' }] },\n // // C0200은 스크립트 작업이 안되어있어서 서명테스트 안됨\n // { name: '[C0200]고객거래확인서', doc: [{ docCode: 'C0200', fileID: '5QJ3eSCPlEDWDKkAA' }] },\n].map((i) => ({\n ...i,\n // 모든 서명 입력이 완료되었는지 여부 (클라이언트에서 상태로 관리)\n complete: false,\n // 현재 서식이 포커스 상태인지 여부 (UI 제어용)\n focus: false,\n // 서식의 시작 페이지 번호 (페이지 매핑 시 사용)\n startPage: 0,\n // 서식의 종료 페이지 번호 (페이지 매핑 시 사용)\n endPage: 0,\n // 서식을 구성하는 개별 OZD 문서 목록\n doc: i.doc.map((j) => ({\n ...j,\n // OZD 파일의 로컬 저장 경로 (앱 다운로드 후 설정됨)\n filePath: \"\",\n // OZD 문서가 시작되는 페이지 번호\n startPage: 0,\n // OZD 문서가 종료되는 페이지 번호\n endPage: 0,\n })),\n}));\n/** FP 성명 사인 */\nconst fp_nm = `data:image/png;base64,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`;\n/** FP 서명 사인 */\nconst fp_nm_sign = `data:image/png;base64,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`;\n\n/** FP 성명 사인 펜 두께 4 */\nconst fp_nm_w4 = `data:image/png;base64,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`;\n/** FP 서명 사인 펜 두께 4+ ratio 4:1 */\nconst fp_nm_sign_w4_r41 = `data:image/png;base64,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`;\n\n/** 테스트용 하드코딩 데이터 */\nexport const ExtraData: ExtraDataType = {\n // 문서코드\n A0010: {\n // connection.inputjson으로 바인딩할 데이터\n inputJson: {\n // 계약자 성명 사인정보\n A0010_mynm_sg: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAABDUlEQVR4nOzSMQ0CQBQEUSAnAAU0iEAAPWKQgQU04gED10z1IXlPwWay6/78HH7P+3qZnrBxmh7wT8QKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECsQKxArECtZjvaY3bNzOx+kJG54ViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgVfAMAAP//tD4Eb/yjIncAAAAASUVORK5CYII=',\n // 계약자 서명 사인정보\n A0010_mysg_sign: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAIAAAD/gAIDAAABDElEQVR4nOzSsQkCYRgEUZXDVgTtxdDIYgR7sFkTG/iTiT4P3qtgGXa7vp+H//M5PqYnLJymB+yJWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgVjBdj9fpjcsvG7f6QkLnhWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBWIFYgViBX8AgAA//9+7gTkg4AcBQAAAABJRU5ErkJggg=='\n },\n // 기타 공통으로 사용하지 않을 파라미터\n extraParam: [], // aaa=bbb\n args: []\n },\n C0200: {\n inputJson: {\n C0200_FP_Sign: fp_nm_sign\n }\n },\n // 스마트폰 전자청약에 의한 주요 알릴사항 안내 확인\n C1100: {\n inputJson: {\n // C1100_ANSR_001 보험 모집자 성명\n C1100_fp_nm: fp_nm_w4,\n // C1100_ANSR_002 보험 모집자 서명\n C1100_fp_nm_sign: fp_nm_sign_w4_r41,\n // C1100_ANSR_003\n C1100_insurance_num: '데이터없음',\n // C1100_ANSR_004\n C1100_ozformlist: '데이터없음',\n // C1100_ANSR_005\n Date: '데이터없음'\n }\n },\n // 대면설명확인서\n C1200: {\n inputJson: {\n // C1200_ANSR_001\n C1200_date: \"20251120\",\n // C1200_ANSR_002\n C1200_time: \"17:00\",\n // C1200_ANSR_003\n C1200_place: \"고객 집 주변\",\n // C1200_ANSR_004\n C1200_way: \"상품설명서로 직접 설명\",\n // C1200_ANSR_005\n C1200_confirm: \"1\", // 대면 설명 여부\n // C1200_ANSR_006\n C1200_fp_nm2: fp_nm,\n // C1200_ANSR_007\n C1200_fp_nm_sign: fp_nm_sign,\n // C1200_ANSR_008\n C1200_insurance_num: '데이터없음',\n // C1200_ANSR_009\n C1200_fp_nm1: '데이터없음',\n // C1200_ANSR_010\n C1200_fp_nm4: '데이터없음',\n // C1200_ANSR_011\n C1200_con_nm: '데이터없음',\n // C1200_ANSR_012\n date2: '데이터없음',\n // C1200_ANSR_001 + C1200_ANSR_002\n date1: `데이터없음`,\n }\n },\n}\n\n\n/** 테스트용 증번 */\nexport const policyNumber = '300034894';\n/** 테스트용 FP 정보 */\nexport const fpInfo = { uniqNo: '2210000' };\n/** 테스트용 청약작성자목록 - 계약 관계자 코드 */\nexport const roleCode = [`11`, `28`]\n/** 테스트용 native에 전달할 X-DUD-Authorization 토큰 */\nexport const xdudheaders = `Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJXNWRtc1g1MkVWZGV0YThJRy90YmlZY281bnVCdzRZOXhGZjlWakZzdWxnbU00YnkiLCJpYXQiOjE3NjEwNDMyNjgsImV4cCI6MTc2NjI5OTI2OH0.KDnF7ZhkmnEApGCvOcItwcHnLWe5iJu64g93GACT2yo`;","/**\n * `Promise.withResolvers()` 폴리필\n */\nexport function PromiseWithResolvers<T>() {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * 주어진 입력값이 배열이 아니면 빈 배열을 반환하고, 배열이면 깊은 복사하여 반환합니다.\n *\n * @param arg - 입력값으로, 배열일 수도 있고 아닐 수도 있습니다.\n * @returns 주어진 입력값이 배열이면 깊은 복사본을 반환하고, 배열이 아니면 빈 배열을 반환합니다.\n */\nexport function ensureArray<T>(arg?: T[]): T[] {\n return (Array.isArray(arg) ? DeepCopy(arg) : []);\n}\n\n/**\n * 주어진 객체를 깊은 복사하여 새로운 복사본을 반환합니다.\n * - 내부 유틸용이라 export 하지 않았음\n *\n * @param arg - 깊은 복사를 원하는 객체\n * @returns 주어진 객체의 깊은 복사본\n */\nexport function DeepCopy<T>(arg: T): T {\n return JSON.parse(JSON.stringify(arg)) as T;\n}\n","import { DeepCopy } from \"../../internal\";\n\nimport type { FormInfo } from \"sales-frontend-bridge\";\n\n/**\n * 비동기 처리를 일정 시간 지연시키는 함수\n * @param ms - 지연 시간 (밀리초). 기본값은 10ms\n */\nexport async function sleep(ms = 10): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * 문서 데이터에 페이지 범위를 채워주는 함수\n * @param {Array} data - 문서 그룹 데이터\n * @param {Array<number>} pages - 각 문서의 페이지 수\n * @returns {Array} - startPage, endPage가 채워진 새 데이터\n */\nexport function categorizeByPageRange(data: FormInfo[], pageCounts: number[]) {\n let currentPage = 1;\n let pageIndex = 0;\n\n // 깊은 복사로 원본 변형 방지\n const result = DeepCopy(data);\n\n result.forEach(group => {\n group.startPage = currentPage;\n\n group.doc.forEach(doc => {\n const pageCount = pageCounts[pageIndex++]!;\n doc.startPage = currentPage;\n doc.endPage = currentPage + pageCount - 1;\n currentPage += pageCount;\n });\n\n group.endPage = group.doc[group.doc.length - 1]!.endPage;\n });\n\n return result;\n}","import { Bridge } from \"sales-frontend-bridge\";\nimport { base64ToFile, fileToBase64 } from 'sales-frontend-utils';\n\nimport type { DownloadOzdOptions } from \"sales-frontend-bridge\";\n\n\n/**\n * ozd, 폰트 등 App 내 리소스를 fetch하는 브릿지 유틸\n */\n\n/**\n * OZD 목록을 다운받는 브릿지\n */\nexport async function fetchDocument(args: DownloadOzdOptions) {\n // 브릿지에 다운로드 요청\n const { data: result } = await Bridge.native.downloadDocument(args);\n\n // start,end 페이지 매핑\n return result.data.map((i) => ({ ...i, startPage: 0, endPage: 0 }));\n}\n\n/**\n * App에 설치된 폰트를 Oz Param 형식으로 불러오는 브릿지\n */\nexport async function fetchFont() {\n const { data: fontMap } = await Bridge.native.getOzFontParam();\n\n const fontParms = Object.keys(fontMap).map((i) => `font.${i}=${fontMap[i]}`);\n\n return fontParms;\n}\n\n/**\n * 비정형 서버에 성명,서명, 덧쓰기 이미지를 업로드한다\n * @deprecated 테스트페이지에서만 사용하는 API\n */\nexport async function postFiletoDud(imageStr: string) {\n const formData = new FormData();\n formData.append(\"data\", base64ToFile(imageStr, \"test.png\"));\n formData.append(\"fileIdentifierValue\", \"string\");\n formData.append(\"fileExtendContent1\", \"string\");\n formData.append(\"fileExtendContent2\", \"string\");\n formData.append(\"preservationTerm\", \"1\");\n formData.append(\"fileType\", \"png\");\n\n // 비동기 호출\n const response = await fetch(\"/api/v1/post/file\", {\n headers: {\n \"x-channel-appversion\": \"3.1\",\n \"x-channel-carriername\": \"SK\",\n \"x-channel-deviceid\": \"deviceid\",\n \"x-channel-devicemodel\": \"iPHONE13\",\n \"x-channel-formfactor\": \"Phone\",\n \"x-channel-loginchannel\": \"DSP\",\n \"x-channel-logintype\": \"ONPA_PIN\",\n \"x-channel-networktype\": \"LTE\",\n \"x-channel-platformversion\": \"15.4.1\",\n \"x-channel-screenid\": \"ScreenId\",\n \"x-dud-authorization\": \"Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJXNWRtc1g1MkVWZGV0YThJRy90YmlZY281bnVCdzRZOXhGZjlWakZzdWxnbU00YnkiLCJpYXQiOjE3NjEwNDMyNjgsImV4cCI6MTc2NjI5OTI2OH0.KDnF7ZhkmnEApGCvOcItwcHnLWe5iJu64g93GACT2yo\",\n \"x-x-channel-platformname\": \"IOS\"\n },\n method: \"POST\",\n body: formData\n });\n const json = await response.json();\n // console.log('json', json);\n\n return json;\n}\n\n/**\n * 비정형에서 중간저장해놓은 서명이미지를 다운받는다\n * @deprecated 테스트페이지에서만 사용하는 API\n */\nexport async function getFileFromDud(fileMgmtId: string) {\n const outputType = \"binary\"\n const response = await fetch('/api/v1/get/file', {\n headers: {\n \"content-type\": \"application/json\",\n \"x-channel-appversion\": \"3.1\",\n \"x-channel-carriername\": \"SK\",\n \"x-channel-deviceid\": \"deviceid\",\n \"x-channel-devicemodel\": \"iPHONE13\",\n \"x-channel-formfactor\": \"Phone\",\n \"x-channel-loginchannel\": \"DSP\",\n \"x-channel-logintype\": \"ONPA_PIN\",\n \"x-channel-networktype\": \"LTE\",\n \"x-channel-platformversion\": \"15.4.1\",\n \"x-channel-screenid\": \"ScreenId\",\n \"x-dud-authorization\": \"Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJXNWRtc1g1MkVWZGV0YThJRy90YmlZY281bnVCdzRZOXhGZjlWakZzdWxnbU00YnkiLCJpYXQiOjE3NjEwNDMyNjgsImV4cCI6MTc2NjI5OTI2OH0.KDnF7ZhkmnEApGCvOcItwcHnLWe5iJu64g93GACT2yo\",\n \"x-x-channel-platformname\": \"IOS\"\n },\n method: \"POST\",\n body: JSON.stringify({ fileMgmtId, outputType })\n });\n const blob = await response.blob();\n\n const base64String = await fileToBase64(blob);\n // console.log('base64String', base64String)\n\n return base64String;\n}","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { PromiseWithResolvers } from '../../../internal';\nimport { OZViewerEvent } from '../../types';\n\nimport { AlertTemporaryError } from './alert-util';\n\n/**\n * OZ 뷰어 함수를 단순 래핑한 브릿지 유틸\n */\n\n/**\n * OZ Viewer 생성 함수\n * 1. `CreateReport` 함수 호출하여 OZ 리포트 생성\n * 2. `OZProgressCommand` 이벤트가 `ozd` 개수만큼 발생\n * 3. `OZProgressCommand` 이벤트 내부에서 `OZReportCreated` 이벤트 발행\n * 4. `CreateOzViewer` 이벤트가 종료\n */\nexport async function CreateOzViewer(ozParam: string[]) {\n const { promise, resolve, reject } = PromiseWithResolvers();\n\n const handleTimeout = () => {\n // 이벤트리스너 제거\n window.removeEventListener(OZViewerEvent.OZReportCreated, handleOZCreated);\n // promise reject 처리\n reject(new Error(\"createOZViewer TimeOut\"));\n };\n // 3분 대기 후 이벤트가 종료되지 않으면 에러 처리\n const timeout = setTimeout(handleTimeout, 1000 * 60 * 3);\n\n const handleOZCreated = (e: Event) => {\n // 성공 시 타이머 해제\n clearTimeout(timeout);\n resolve(e);\n };\n\n window.addEventListener(\n OZViewerEvent.OZReportCreated,\n // OZReportCreated가 트리거되면 promise resolve 처리\n handleOZCreated,\n // 이벤트 리스너는 한 번만 실행되도록 설정\n { once: true }\n )\n\n try {\n await Bridge.native.createOZViewer({ param: ozParam.join(\"\\n\") });\n\n return await promise;\n } catch (e) {\n // createOZViewer 자체가 에러가 발생한경우 타이머 초기화\n clearTimeout(timeout);\n // 일시적인 오류가 발생했습니다\n await AlertTemporaryError();\n // 오즈뷰어 초기화에 실패했으므로 오즈뷰어 종료\n await Bridge.native.hideOZViewer();\n }\n}\n\n/**\n * 특정 페이지로 스크롤 이동\n */\nexport async function MovePage(page: number) {\n return await Bridge.nativeOz.script({ command: `movepage=${page}` });\n}\n\n/**\n * 현재 페이지 번호를 구한다(one base index)\n */\nexport async function getCurrentPage() {\n const { data } = await Bridge.nativeOz.getInformation({ command: `CURRENT_PAGE` })\n if (data === null) {\n throw new Error(`Bridge returned null for command: CURRENT_PAGE`);\n }\n\n return Number(data);\n}\n\n/**\n * 랜딩되어있는 보고서들의 전체 페이지 수\n */\nexport const getTotalPageMemo = (() => {\n // ✅ 전체 페이지수를 캐싱\n let cache: Promise<number> | null = null;\n\n async function getTotalPage(): Promise<number> {\n if (cache) {\n // 캐시에 이미 결과(Promise)가 있다면 재사용\n return cache;\n }\n // ⚙️ 네이티브 호출을 Promise로 감싸서 즉시 캐시에 저장\n // (중복 요청을 방지하기 위함)\n cache = (async () => {\n try {\n const { data } = await Bridge.nativeOz.getInformation({ command: 'TOTAL_PAGE' });\n\n return Number(data);\n } catch (e) {\n // ⚠️ 호출 실패 시 캐시에서 제거하여 다음 요청 시 재시도 가능하도록 함\n cache = null;\n throw e;\n }\n })();\n\n return await cache;\n }\n\n // 캐시 초기화 함수\n getTotalPage.clearCache = () => {\n cache = null;\n };\n\n return getTotalPage;\n})();\n\n/**\n * 랜딩되어있는 보고서의 총 갯수(ozd 파일의 갯수)\n */\nexport const getReportCountMemo = (() => {\n // ✅ 보고서의 총 갯수(ozd 파일의 갯수)를 캐싱\n let cache: Promise<number> | null = null;\n\n async function getReportCount(): Promise<number> {\n if (cache) {\n return await cache;\n }\n // ⚙️ 네이티브 호출을 Promise로 감싸서 즉시 캐시에 저장\n // (중복 요청을 방지하기 위함)\n cache = (async () => {\n try {\n const { data } = await Bridge.nativeOz.getInformation({ command: 'REPORT_COUNT' });\n if (data === null) {\n throw new Error(`Bridge returned null for command: REPORT_COUNT`);\n }\n\n return Number(data);\n } catch (e) {\n // ⚠️ 호출 실패 시 캐시에서 제거하여 다음 요청 시 재시도 가능하도록 함\n cache = null;\n throw e;\n }\n })();\n\n return await cache;\n }\n\n // 캐시 초기화 함수\n getReportCount.clearCache = () => {\n cache = null;\n };\n\n return getReportCount;\n})();\n","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { ensureArray } from '../../../internal';\nimport { commonOzParam } from '../../constant';\nimport { OZTriggerExternalEvent } from '../../types';\nimport { sleep } from \"../common-util\";\n\nimport { fetchFont } from './fetch-util';\nimport { getReportCountMemo } from './oz-wrapper-util';\n\nimport type { ExtraDataType } from '../../types';\nimport type { OzdFile } from \"sales-frontend-bridge\";\n\n\n/**\n * OZ 리포트 생성 및 초기화에 필요한 브릿지 유틸\n */\n\ntype CreateOzParamProps = {\n documentList: OzdFile[];\n extraData?: ExtraDataType;\n /**\n * 모든 문서에 공통으로 적용할 args\n * - connection.arg로 전달할 `[\"key1=value1\", \"key2=value2\"]` 형식의 데이터\n */\n commonArgs?: ExtraDataType[string][\"args\"];\n /**\n * 모든 문서에 공통으로 적용할 추가 파라미터 목록\n * - `[\"connection.pcount=1\"]`\n */\n commonExtraParams?: ExtraDataType[string][\"extraParam\"];\n /**\n * 청약을 작성하는 사람들의 roleCode 목록\n *\n * ex)`[{\"roleCode\":\"FP\",\"name\":\"동구시\",\"psatAbscDvsnCode\":null},{\"roleCode\":\"11\",\"name\":\"김여명\",\"psatAbscDvsnCode\":null}]`\n */\n roleCd: string;\n /**\n * 지정대리인 정보\n * - 지정대리인이 없을때 ''\n * - 지정대리인이 1명일때 ex) `성명|주민등록번호|관계명|관계코드`\n * - `connection.args3=jijungInfo=김이박|9201111mLLNeL|배우자|02`\n * - 지정대리인이 2명일때 ex) `성명|주민등록번호|관계명|관계코드`,`성명|주민등록번호|관계명|관계코드`\n */\n jijungInfo?: string;\n}\n/**\n * OZ 리포트 최초 생성시 OZ에 넘길 파라미터를 생성하는 함수\n */\nexport async function CreateOzParam({ documentList, extraData = {}, commonArgs = [], commonExtraParams = [], roleCd, jijungInfo = '' }: CreateOzParamProps) {\n if (documentList.length === 0) {\n throw new Error('문서목록이 비어있습니다');\n }\n const fontParms = await fetchFont();\n const connectionParams = documentList.map(({ filePath }, idx) =>\n idx === 0 ? `connection.openfile=${filePath}` : `child${idx}.connection.openfile=${filePath}`\n );\n const childCount = documentList.length - 1;\n const extraParams = documentList.map((ozdFile, idx) => {\n const result: string[] = [];\n\n // 파일 이름에서 경로 및 확장자 제거 (ex: \"A0010.ozd\" → \"A0010\")\n const docCode = ozdFile.docCode.replace(/^.*[\\\\/]|(\\.[^/.]+)$/g, '');\n\n const prefix = idx === 0 ? '' : `child${idx}.`;\n\n // 문서코드에 바인딩할 데이터가 있는지 확인\n const data = extraData[docCode] || {};\n\n if (data.inputJson) {\n result.push(`${prefix}connection.inputjson=${JSON.stringify(data.inputJson)}`);\n }\n\n // args로 전달할 param이 있으면 반영\n const args = [\n // 모든 서식에 공통으로 필요한 docCd param 추가\n `docCd=${docCode}`,\n // 모든 서식에 공통으로 필요한 roleCode 정보 추가\n `roleCd=${roleCd}`,\n // 모든 서식에 공통으로 필요한 지정대리인 정보 추가\n `jijungInfo=${jijungInfo}`,\n // 모든 서식에 공통으로 필요한 TABLET 구분값 정보 추가\n `TABLET=11`,\n // 모든 서식에 공통으로 필요한 추가 args\n ...commonArgs,\n // 특정 서식에 필요한 추가 args\n ...ensureArray(data.args)\n ];\n args.forEach((arg, idx) => result.push(`${prefix}connection.args${idx + 1}=${arg}`));\n\n // 그 외 추가 파라미터 목록이 있으면 반영\n const extraParam = [\n // connection.args의 갯수만큼 pcount 보정\n `connection.pcount=${args.length}`,\n // 모든 서식에 공통으로 필요한 추가 파라미터\n ...commonExtraParams,\n // 특정 서식에 필요한 추가 파라미터\n ...ensureArray(data.extraParam)\n ];\n extraParam.forEach((param) => (result.push(`${prefix}${param}`)))\n\n return result;\n });\n\n // createReport용 ozParam\n const params = [\n ...(childCount > 0 ? [`viewer.childcount=${childCount}`] : []),\n ...connectionParams,\n ...commonOzParam,\n ...fontParms,\n ...extraParams.flat(1)\n ];\n\n return params;\n}\n\n/**\n * 모든 문서에 대해 checkeForm을 Y로 설정하는 명령을 순차적으로 한 번씩 호출합니다.\n * \n * 각 호출 사이에 기본 지연(sleep)을 넣어 처리 속도를 조절합니다.\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function setCheckEform(reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n for (let i = 0; i < count; i++) {\n await sleep();\n await Bridge.nativeOz.setGlobal({ key: 'checkeForm', value: 'Y', docIndex: i })\n }\n}\n\n/**\n * 모든 문서에 대해 INPUT_TRIGGER_CLICK 명령을 순차적으로 한 번씩 호출합니다.\n * \n * 각 호출 사이에 기본 지연(sleep)을 넣어 처리 속도를 조절합니다.\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function triggerClickOnAllDocuments(reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n for (let i = 0; i < count; i++) {\n await sleep();\n const command = `INPUT_TRIGGER_CLICK_AT=${i}`;\n await Bridge.nativeOz.getInformation({ command });\n }\n}\n\n/**\n * 모든 문서에 대해 서명 부분 이미지 컷팅 명령을 순차적으로 한 번씩 호출합니다.\n * \n * 각 호출 사이에 기본 지연(sleep)을 넣어 처리 속도를 조절합니다.\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function triggerCropImageOnAllDocuments(reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n for (let i = 0; i < count; i++) {\n await sleep();\n // 사인 이미지 크롭처리\n await Bridge.nativeOz.triggerExternalEventByDocIndex({ param1: OZTriggerExternalEvent.CropImage, docIndex: Number(i) });\n }\n}\n\n/**\n * 모든 문서에 대해 전체 페이지 수를 계산하는 명령을 순차적으로 한 번씩 호출합니다.\n * \n * 각 호출 사이에 기본 지연(sleep)을 넣어 처리 속도를 조절합니다.\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function getTotalPageOnAllDocuments(reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n const totalPages = [];\n for (let i = 0; i < count; i++) {\n await sleep();\n const command = `TOTAL_PAGE_OF_REPORT_FILE_AT=${i}`\n const { data } = await Bridge.nativeOz.getInformation({ command });\n totalPages.push(Number(data));\n }\n\n return totalPages;\n}","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { OZTriggerExternalEvent } from \"../../types\";\nimport { sleep } from \"../common-util\";\n\n\ntype OzDraftRequest = Record<string, string> & { docCd: string };\n\n/**\n * OZ에서 getDraftData 요청 시 반환할 데이터를 생성하는 함수\n * \n * - OZ로부터 전달받은 JSON 문자열(`arg`)을 파싱하여 문서 코드(docCd)를 추출하고,\n * 해당 문서의 JSON 정보를 가져와 필요한 사인 정보만 key-value 형태로 반환한다.\n * - 사인FormId 값이 null일 경우, getInformation 결과로 채워진다.\n */\nexport async function getDraftDataHandler(\n rawOzRequest: string,\n documentIndexMap: Record<string, number>\n) {\n // 1️⃣ OZ에서 전달된 요청 데이터 파싱\n const parsedRequest = JSON.parse(rawOzRequest) as OzDraftRequest;\n // 문서코드와 formId:null 형태의 객체를 추출\n const { docCd, ...signKeyMap } = parsedRequest;\n\n // 2️⃣ 문서 코드(docCd)에 해당하는 글로벌 인덱스 조회\n const documentIndex = documentIndexMap[docCd];\n if (documentIndex === undefined) {\n throw new Error(`Invalid document code: ${docCd}`);\n }\n\n // 3️⃣ Bridge를 통해 해당 문서의 JSON 데이터 조회\n const { data } = await Bridge.nativeOz.getInformation({ command: `INPUT_JSON_AT=${documentIndex}` });\n if (data === null) {\n throw new Error(`Bridge returned null for document: ${docCd} (command=INPUT_JSON_AT=${documentIndex})`);\n }\n const documentJson = JSON.parse(data);\n\n // 4️⃣ 필요한 사인 정보만 key-value 형태로 반환\n const signDataMap = Object.keys(signKeyMap).reduce((acc, key) => {\n acc[key] = documentJson[key];\n\n return acc;\n }, {} as Record<string, string>);\n\n return { signDataMap, docCd };\n}\n\n/**\n * 주어진 문서 인덱스 목록(`indexList`)에 대해\n * 각 문서의 중간저장 데이터를 순차적으로 요청합니다.\n * \n * 각 페이지 검사 사이에 기본 지연(sleep)을 추가하여 처리 속도를 제어합니다.\n *\n * @param indexList - 중간저장 데이터를 요청할 문서의 인덱스 배열\n */\nexport async function triggerDraftDataByIndexList(indexList: number[]) {\n for (let i = 0; i < indexList.length; i++) {\n await sleep();\n await Bridge.nativeOz.triggerExternalEventByDocIndex({ param1: OZTriggerExternalEvent.GetDraftData, docIndex: indexList[i]!, });\n }\n}","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { sleep } from \"../common-util\";\n\nimport { getReportCountMemo } from './oz-wrapper-util';\n\n/**\n * 서식 검증 시, 빈 서식에 포커스를 줄지 제어하는 브릿지 유틸\n */\n\n/**\n * 유효성 검사 시 미입력된 컴포넌트에 포커스 설정 여부를 지정\n * \n * @param enable - true면 포커스 활성화, false면 비활성화\n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nasync function setFocusOnValidation(enable: boolean, reportCount?: number) {\n const count = reportCount ?? await getReportCountMemo();\n\n const expectedValue = enable ? '1' : '0';\n\n const { data: prev } = await Bridge.nativeOz.getGlobal({ key: 'chkFlag', docIndex: 0 });\n\n // 첫번째 doc에 대해서 기 입력된 값을 검사해서 일치하면 조기탈출\n if (prev === expectedValue) {\n return;\n }\n\n for (let i = 0; i < count; i++) {\n await sleep();\n await Bridge.nativeOz.setGlobal({ key: 'chkFlag', value: expectedValue, docIndex: i });\n }\n\n return;\n}\n\n/**\n * 유효성 검사 시 미입력된 컴포넌트에 자동으로 포커스를 맞추도록 설정\n * \n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function enableFocusOnValidation(reportCount?: number) {\n return setFocusOnValidation(true, reportCount);\n}\n\n/**\n * 유효성 검사 시 미입력된 컴포넌트에 포커스가 가지 않도록 설정\n * \n * @param reportCount - 리포트 개수 (생략 시 내부에서 자동 계산)\n */\nexport async function disableFocusOnValidation(reportCount?: number) {\n return setFocusOnValidation(false, reportCount);\n}\n","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { PromiseWithResolvers } from '../../../internal';\nimport { commonPdfExportParam } from \"../../constant\";\nimport { OZExportEvent, OZViewerEvent } from \"../../types\";\n\nimport { getTotalPageMemo } from \"./oz-wrapper-util\";\n\nimport type { OzdFile } from \"sales-frontend-bridge\";\n\n\n/**\n * PDF 저장을 비동기적으로 처리하고, 저장된 파일 경로를 반환하는 함수\n * - OZD 전체를 하나의 PDF로 저장\n */\nexport async function SaveTotalPdf(policyNumber: string, fileName: string) {\n\n // 1페이지부터\n const startPage = 1;\n // 전체 페이지 수 가져오기\n const endPage = await getTotalPageMemo();\n\n return await SavePdf({ policyNumber, fileName, startPage, endPage });\n\n}\n\n/**\n * PDF 저장을 비동기적으로 처리하고, 저장된 파일 경로를 반환하는 함수\n * - 개별 OZD를 PDF로 저장하는 함수\n */\nexport async function SaveSinglePdf(\n policyNumber: string,\n { startPage, endPage, docCode: fileName }: OzdFile\n) {\n\n return await SavePdf({ policyNumber, fileName, startPage, endPage });\n}\n\n\ntype SavePdfProps = Pick<OzdFile, \"startPage\" | \"endPage\"> & {\n /** 증권번호 */\n policyNumber: string;\n /** PDF 파일이름(확장자 제외) */\n fileName: string;\n}\nasync function SavePdf({ policyNumber, fileName, startPage, endPage }: SavePdfProps) {\n // CustomEvent로부터 전달될 파일 경로를 기다리기 위한 Promise 생성\n const { promise, resolve } = PromiseWithResolvers<string>();\n\n // OZExportCommand 이벤트가 발생하면, 파일 경로를 resolve하여 Promise 완료\n window.addEventListener(\n OZViewerEvent.OZExportCommand,\n // 이벤트를 CustomEvent로 타입 캐스팅하고, detail에서 파일 경로 추출\n (e: Event) => resolve((e as CustomEvent<OZExportEvent>).detail.filepaths),\n // 이벤트 리스너는 한 번만 실행되도록 설정\n { once: true }\n );\n\n\n // OZ 브릿지를 통해 PDF 저장 명령 실행\n await Bridge.nativeOz.savePdf({\n // PDF 저장은 증번폴더/파일이름.pdf로 생성\n policyNumber,\n param: [\n // 저장할 파일명 설정\n `pdf.filename=${fileName}.pdf`,\n // 1페이지부터 마지막 페이지까지 저장\n `export.pages=${startPage}-${endPage}`,\n // 공통 PDF 내보내기 파라미터 추가\n ...commonPdfExportParam\n ].join('\\n')\n });\n\n // OZExportCommand 이벤트로부터 전달된 파일 경로를 기다림\n const filepath = await promise;\n\n // 최종적으로 파일 경로 반환\n return filepath;\n}","import { Bridge } from \"sales-frontend-bridge\";\n\nimport { sleep } from \"../common-util\";\n\nimport { getTotalPageMemo } from './oz-wrapper-util';\n\n/**\n * OZ 서식 검증용 브릿지 유틸\n */\n\n/**\n * 유효성을 체크할 doc들의 index를 배열로 입력받는다\n *\n * 모두 유효하면 true를 리턴한다\n *\n * documentInfo의 complete를 계산할때 사용한다\n *\n * 서명패드가 열려있는 상태에서 INPUT_CHECK_VALIDITY로 검사하면 서명패드가 꺼져서 onValueChange에서는 INVALID_INFO_JSON을 사용한다\n */\nexport async function checkDocumentsValidityByIndex(indexList: number[]) {\n // INVALID_INFO_JSON_AT은 valid한 경우 ''를 리턴한다\n const VALID = '';\n for (let i = 0; i < indexList.length; i++) {\n await sleep();\n const command = `INVALID_INFO_JSON_AT=${indexList[i]}`;\n const { data } = await Bridge.nativeOz.getInformation({ command });\n\n if (data !== VALID) {\n // 유효하지 않으면 조기탈출\n return false;\n }\n }\n\n return true\n}\n\n/**\n * 지정된 페이지 범위에 대해 유효성 검사를 수행합니다.\n * \n * 유효성 검사는 1페이지부터 지정된 마지막 페이지까지 진행되며,\n * 각 페이지 검사 사이에 기본 지연(sleep)을 추가하여 처리 속도를 제어합니다.\n * - pageChange 이벤트 내부에서는 현재 페이지 이전까지만 검사\n * - 서명바로가기, 미입력 서명 바로가기, 청약문서 최종 확인하기 버튼을 눌렀을때는 전체 페이지 검사\n * \n * @param pageCount - 유효성 검사를 수행할 페이지의 총 개수. (생략하면 자동으로 전체 페이지 수를 계산하여 사용)\n * @returns 모든 페이지가 유효한 경우 true, 하나라도 유효하지 않으면 false를 반환합니다.\n */\nexport async function validateAllPages(pageCount?: number) {\n // pageCount가 주어지지 않으면 전체 페이지 수를 계산하여 사용\n const count = pageCount ?? await getTotalPageMemo();\n\n for (let i = 1; i <= count; i++) {\n // 각 페이지 검사 사이에 지연을 추가\n await sleep();\n // 캐시 기반 validation 검사\n const isValid = await checkValidPageMemo(i);\n\n // 페이지 유효성 검사가 실패하면 즉시 종료\n if (!isValid) {\n return false;\n }\n }\n\n // 모든 페이지가 유효한 경우 true 반환\n return true;\n}\n\n\n/**\n * 페이지 유효성 검사 결과를 캐싱하는 유틸리티\n *\n * - 동일 페이지에 대한 중복 호출을 방지\n * - validation 결과가 false인 경우에는 캐시에 저장하지 않음\n */\nexport const checkValidPageMemo = (() => {\n // ✅ 페이지 번호를 키로 사용하여 Promise<boolean> 형태로 결과를 캐싱\n const cache = new Map<number, Promise<boolean>>();\n\n /**\n * 주어진 페이지가 유효한지 검사\n *\n * @param page 검사할 페이지 번호\n * @returns 페이지 유효 여부 (Promise<boolean>)\n */\n async function checkValidPage(page: number): Promise<boolean> {\n const cached = cache.get(page);\n if (cached) {\n // 캐시에 이미 결과(Promise)가 있다면 재사용\n return cached;\n }\n\n const VALID = 'valid';\n const command = `INPUT_CHECK_VALIDITY_PAGE_AT=${page}`;\n\n // ⚙️ 네이티브 호출을 Promise로 감싸서 즉시 캐시에 저장\n // (중복 요청을 방지하기 위함)\n const promise = (async () => {\n try {\n const { data } = await Bridge.nativeOz.getInformation({ command });\n const isValid = data === VALID;\n\n // ❌ 유효하지 않은(false) 결과는 캐시에 저장하지 않음\n if (!isValid) {\n cache.delete(page);\n }\n\n return isValid;\n } catch (err) {\n // ⚠️ 호출 실패 시 캐시에서 제거하여 다음 요청 시 재시도 가능하도록 함\n cache.delete(page);\n throw err;\n }\n })();\n\n // ⏳ 진행 중인 Promise를 캐시에 저장 (중복 호출 방지)\n cache.set(page, promise);\n\n // 결과 반환\n return promise;\n }\n\n /**\n * 전체 캐시를 초기화합니다.\n */\n checkValidPage.clearCache = () => {\n cache.clear();\n };\n\n /**\n * 특정 페이지의 캐시만 삭제합니다.\n * \n * @param page 삭제할 페이지 번호\n */\n checkValidPage.clearCacheByPage = (page: number) => {\n cache.delete(page);\n };\n\n return checkValidPage;\n})();\n","import { debounce } from 'sales-frontend-utils';\n\n/**\n * 📘 ValueChangeDebounceUtil\n *\n * 문서의 OnValueChange 이벤트를 debounce 처리하기 위한 유틸\n *\n * - 동일한 문서 인덱스에서 연속 호출 시 debounce\n * - 다른 문서 인덱스는 독립적으로 debounce 처리\n */\n\n// 문서 인덱스별로 debounce 핸들러를 저장\nconst valueChangeDebounceMap = new Map<string, ReturnType<typeof debounce>>();\n\n/**\n * 특정 문서 인덱스의 OnValueChanged 핸들러를 debounce 처리하여 반환\n *\n * @param docIndex - 문서 인덱스 (string)\n * @param onValueChanged - debounce 후 실행할 콜백\n * @returns debounce된 핸들러 함수\n */\nexport function getDebouncedValueChangeHandler(\n docIndex: string,\n onValueChanged: (docIndex: string) => void\n) {\n // 서명패드에 수정이 일어나면 0.5초동안 디바운스 처리\n const DEBOUNCE_DELAY = 1000 * 0.5;\n\n // 이미 debounce된 핸들러가 있다면 그대로 사용\n const existingHandler = valueChangeDebounceMap.get(docIndex);\n if (existingHandler) {\n return existingHandler;\n }\n\n // 새로운 debounce 핸들러 생성\n const debouncedHandler = debounce((idx: string) => {\n onValueChanged(idx);\n }, DEBOUNCE_DELAY);\n\n valueChangeDebounceMap.set(docIndex, debouncedHandler);\n\n return debouncedHandler;\n}\n\n/**\n * 모든 문서 인덱스의 debounce 핸들러 초기화\n */\nexport function clearValueChangeDebounceHandlers() {\n valueChangeDebounceMap.clear();\n}\n"]}