@connextable/popbill 1.1.0 → 2.0.0

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,"file":"index.mjs","names":["removeUndefinedProperties","documentMappers.mapTaxInvoiceDocument","responseMappers.mapTaxInvoiceIssueResult","documentMappers.mapTaxInvoiceDocuments","responseMappers.mapTaxInvoiceBulkSubmitResult","responseMappers.mapTaxInvoiceBulkIssueSubmissionResult","responseMappers.mapTaxInvoiceOperationResult","invoiceInfoMappers.mapTaxInvoiceInfo","responseMappers.mapTaxInvoiceInfos","responseMappers.mapTaxInvoiceDocumentOutput","responseMappers.mapTaxInvoiceInvoiceManagementKeyUsage","responseMappers.mapTaxInvoiceXmlResult","responseMappers.mapTaxInvoiceSearchResult","responseMappers.mapTaxInvoiceLogs","responseMappers.mapTaxInvoiceAccessUrlFromString","responseMappers.mapTaxInvoiceAccessUrl","responseMappers.mapTaxInvoiceAttachedFiles","responseMappers.mapTaxInvoiceEmailSendSettings","responseMappers.mapTaxInvoiceSendToNationalTaxServiceSetting","responseMappers.mapTaxInvoiceTaxCertificateExpiration","responseMappers.mapTaxInvoiceTaxCertificateInfo","taxInvoiceTypes.TaxInvoiceDateType","taxInvoiceTypes.TaxInvoiceSearchInvoiceTypeCodes","taxInvoiceTypes.TaxInvoiceSearchTaxationTypeCodes","taxInvoiceTypes.TaxInvoiceSortOrder","taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierTypes","taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities","taxInvoiceTypes.TaxInvoiceSearchInteroperabilityTypes","taxInvoiceTypes.TaxInvoiceSearchIssueTypeCodes","taxInvoiceTypes.TaxInvoiceSearchRegistrationTypeCodes","taxInvoiceTypes.TaxInvoiceCloseDownStateCodes","taxInvoiceTypes.TaxInvoiceStatementItemCodes","taxInvoiceTypes.TaxInvoiceEmailTypes","DEFAULT_REQUEST_TIMEOUT_MILLISECONDS","DEFAULT_ACCEPT_ENCODING"],"sources":["../src/services/tax-invoice/adapters/error.ts","../src/services/tax-invoice/mappers/document.ts","../src/services/tax-invoice/mappers/invoice-info.ts","../src/services/tax-invoice/types/document.ts","../src/services/tax-invoice/types/response.ts","../src/services/tax-invoice/types/index.ts","../src/services/tax-invoice/mappers/response.ts","../src/services/tax-invoice/service.ts","../src/internal/compat/tax-invoice-service.ts","../src/client/index.ts","../src/services/tax-invoice/methods.ts"],"sourcesContent":["import { normalizePopbillError } from '@connextable/popbill-compat/errors'\nimport type { PopbillApiError } from '@/errors'\n\n/**\n * TaxInvoice facade 메서드 공통 에러 처리 컨텍스트입니다.\n */\nexport interface TaxInvoiceErrorHandlingContext {\n onError?: (error: PopbillApiError) => void\n}\n\n/**\n * TaxInvoice facade 메서드를 실행하고 예외를 `PopbillApiError`로 표준화합니다.\n */\nexport async function invokeTaxInvoiceMethod<T>(context: TaxInvoiceErrorHandlingContext, operation: string, handler: () => Promise<T>): Promise<T> {\n try {\n return await handler()\n } catch (error) {\n const normalizedError = normalizePopbillError(error, { operation })\n const throwableError = toThrowablePopbillError(normalizedError)\n safelyDispatchError(context.onError, throwableError)\n throw throwableError\n }\n}\n\n/**\n * 에러 훅이 예외를 던져도 원래 API 에러를 보존하기 위해 안전하게 호출합니다.\n */\nfunction safelyDispatchError(handler: ((error: PopbillApiError) => void) | undefined, error: PopbillApiError): void {\n if (!handler) {\n return\n }\n\n try {\n void Promise.resolve(handler(error)).catch(() => undefined)\n } catch {\n // onError 훅 예외는 삼켜서 원래 API 에러를 유지합니다.\n }\n}\n\nfunction toThrowablePopbillError(error: PopbillApiError): Error & PopbillApiError {\n return Object.assign(new Error(error.message), error)\n}\n","import type {\n TaxInvoiceAdditionalContactInput,\n TaxInvoiceBuyerInput,\n TaxInvoiceDocumentInput,\n TaxInvoiceLineItemInput,\n TaxInvoicePartyInput,\n} from '@/services/tax-invoice/types'\nimport type * as Spec from '@connextable/popbill-spec'\n\n/**\n * modern 세금계산서 문서 입력을 compat 세금계산서 API 모델로 변환합니다.\n */\nexport function mapTaxInvoiceDocument(taxInvoiceDocumentInput: TaxInvoiceDocumentInput): Spec.TaxInvoiceApiModel {\n return removeUndefinedProperties({\n writeSpecification: taxInvoiceDocumentInput.writeSpecificationEnabled,\n writeDate: taxInvoiceDocumentInput.writtenDate,\n chargeDirection: taxInvoiceDocumentInput.chargeDirection,\n issueType: taxInvoiceDocumentInput.issueType,\n purposeType: taxInvoiceDocumentInput.purposeType,\n issueTiming: taxInvoiceDocumentInput.issueTimingCode,\n taxType: taxInvoiceDocumentInput.taxType,\n ...mapSupplierFields(taxInvoiceDocumentInput.supplier),\n ...mapBuyerFields(taxInvoiceDocumentInput.buyer),\n ...mapTrusteeFields(taxInvoiceDocumentInput.trustee),\n taxTotal: taxInvoiceDocumentInput.paymentSummary?.totalTaxAmount,\n supplyCostTotal: taxInvoiceDocumentInput.paymentSummary?.totalSupplyCostAmount,\n totalAmount: taxInvoiceDocumentInput.paymentSummary?.totalAmount,\n cash: taxInvoiceDocumentInput.paymentSummary?.cashAmount,\n chkBill: taxInvoiceDocumentInput.paymentSummary?.checkAmount,\n note: taxInvoiceDocumentInput.paymentSummary?.promissoryNoteAmount,\n credit: taxInvoiceDocumentInput.paymentSummary?.creditAmount,\n modifyCode: taxInvoiceDocumentInput.modification?.modificationReasonCode,\n orgNTSConfirmNum: taxInvoiceDocumentInput.modification?.originalNationalTaxServiceConfirmationNumber,\n serialNum: taxInvoiceDocumentInput.taxInvoiceSerialNumber,\n remark1: taxInvoiceDocumentInput.remarkOne,\n remark2: taxInvoiceDocumentInput.remarkTwo,\n remark3: taxInvoiceDocumentInput.remarkThree,\n kwon: taxInvoiceDocumentInput.bookVolumeNumber,\n ho: taxInvoiceDocumentInput.bookIssueNumber,\n businessLicenseYN: taxInvoiceDocumentInput.includeBusinessLicenseImage,\n bankBookYN: taxInvoiceDocumentInput.includeBankBookImage,\n detailList: taxInvoiceDocumentInput.lineItems?.map(mapLineItem),\n addContactList: taxInvoiceDocumentInput.additionalContacts?.map(mapAdditionalContact),\n })\n}\n\n/**\n * modern 세금계산서 문서 입력 목록을 compat 세금계산서 API 모델 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceDocuments(taxInvoiceDocumentInputs: TaxInvoiceDocumentInput[]): Spec.TaxInvoiceApiModel[] {\n return taxInvoiceDocumentInputs.map(mapTaxInvoiceDocument)\n}\n\n/**\n * 공급자 입력을 raw 공급자 필드로 변환합니다.\n */\nfunction mapSupplierFields(supplierInput: TaxInvoicePartyInput | undefined): Partial<Spec.TaxInvoiceApiModel> {\n if (!supplierInput) {\n return {}\n }\n\n return removeUndefinedProperties({\n invoicerCorpNum: supplierInput.businessNumber,\n invoicerMgtKey: supplierInput.managementKey,\n invoicerTaxRegID: supplierInput.taxRegistrationIdentifier,\n invoicerCorpName: supplierInput.companyName,\n invoicerCEOName: supplierInput.chiefExecutiveOfficerName,\n invoicerAddr: supplierInput.address,\n invoicerBizClass: supplierInput.businessClass,\n invoicerBizType: supplierInput.businessType,\n invoicerContactName: supplierInput.contactName,\n invoicerTEL: supplierInput.telephoneNumber,\n invoicerHP: supplierInput.mobilePhoneNumber,\n invoicerEmail: supplierInput.emailAddress,\n invoicerSMSSendYN: supplierInput.sendTextMessage,\n invoicerPrintYN: supplierInput.printEnabled,\n invoicerRDN: supplierInput.residentRegistrationNumber,\n invoicerOLN: supplierInput.foreignerRegistrationNumber,\n invoicerTaxNum: supplierInput.branchBusinessNumber,\n invoicerPSerialNum: supplierInput.branchSerialNumber,\n invoicerCorpCls: supplierInput.corporationClassification,\n invoicerDeptName: supplierInput.departmentName,\n })\n}\n\n/**\n * 공급받는자 입력을 raw 공급받는자 필드로 변환합니다.\n */\nfunction mapBuyerFields(buyerInput: TaxInvoiceBuyerInput | undefined): Partial<Spec.TaxInvoiceApiModel> {\n if (!buyerInput) {\n return {}\n }\n\n return removeUndefinedProperties({\n invoiceeType: buyerInput.recipientType,\n invoiceeCorpNum: buyerInput.businessNumber,\n invoiceeMgtKey: buyerInput.managementKey,\n invoiceeTaxRegID: buyerInput.taxRegistrationIdentifier,\n invoiceeCorpName: buyerInput.companyName,\n invoiceeCEOName: buyerInput.chiefExecutiveOfficerName,\n invoiceeAddr: buyerInput.address,\n invoiceeBizClass: buyerInput.businessClass,\n invoiceeBizType: buyerInput.businessType,\n invoiceeContactName1: buyerInput.contactName,\n invoiceeTEL1: buyerInput.telephoneNumber,\n invoiceeHP1: buyerInput.mobilePhoneNumber,\n invoiceeEmail1: buyerInput.emailAddress,\n invoiceeContactName2: buyerInput.secondaryContactName,\n invoiceeTEL2: buyerInput.secondaryTelephoneNumber,\n invoiceeHP2: buyerInput.secondaryMobilePhoneNumber,\n invoiceeEmail2: buyerInput.secondaryEmailAddress,\n invoiceeSMSSendYN: buyerInput.sendTextMessage,\n invoiceePrintYN: buyerInput.printEnabled,\n invoiceeRDN: buyerInput.residentRegistrationNumber,\n invoiceeOLN: buyerInput.foreignerRegistrationNumber,\n invoiceeTaxNum: buyerInput.branchBusinessNumber,\n invoiceePSerialNum: buyerInput.branchSerialNumber,\n invoiceeCorpCls: buyerInput.corporationClassification,\n invoiceeDeptName1: buyerInput.primaryDepartmentName ?? buyerInput.departmentName,\n invoiceeDeptName2: buyerInput.secondaryDepartmentName,\n closeDownState: buyerInput.businessStatus,\n closeDownStateDate: buyerInput.businessStatusDate,\n })\n}\n\n/**\n * 수탁자 입력을 raw 수탁자 필드로 변환합니다.\n */\nfunction mapTrusteeFields(trusteeInput: TaxInvoicePartyInput | undefined): Partial<Spec.TaxInvoiceApiModel> {\n if (!trusteeInput) {\n return {}\n }\n\n return removeUndefinedProperties({\n trusteeCorpNum: trusteeInput.businessNumber,\n trusteeMgtKey: trusteeInput.managementKey,\n trusteeTaxRegID: trusteeInput.taxRegistrationIdentifier,\n trusteeCorpName: trusteeInput.companyName,\n trusteeCEOName: trusteeInput.chiefExecutiveOfficerName,\n trusteeAddr: trusteeInput.address,\n trusteeBizClass: trusteeInput.businessClass,\n trusteeBizType: trusteeInput.businessType,\n trusteeContactName: trusteeInput.contactName,\n trusteeTEL: trusteeInput.telephoneNumber,\n trusteeHP: trusteeInput.mobilePhoneNumber,\n trusteeEmail: trusteeInput.emailAddress,\n trusteeSMSSendYN: trusteeInput.sendTextMessage,\n trusteePrintYN: trusteeInput.printEnabled,\n trusteeRDN: trusteeInput.residentRegistrationNumber,\n trusteeOLN: trusteeInput.foreignerRegistrationNumber,\n trusteeTaxNum: trusteeInput.branchBusinessNumber,\n trusteePSerialNum: trusteeInput.branchSerialNumber,\n trusteeCorpCls: trusteeInput.corporationClassification,\n trusteeDeptName: trusteeInput.departmentName,\n })\n}\n\n/**\n * 상세 품목 입력을 raw 상세 품목 모델로 변환합니다.\n */\nfunction mapLineItem(lineItemInput: TaxInvoiceLineItemInput): NonNullable<Spec.TaxInvoiceApiModel['detailList']>[number] {\n return {\n serialNum: lineItemInput.lineNumber,\n purchaseDT: lineItemInput.transactionDate,\n itemName: lineItemInput.itemName,\n spec: lineItemInput.specification,\n qty: lineItemInput.quantity,\n unitCost: lineItemInput.unitCostAmount,\n supplyCost: lineItemInput.supplyCostAmount,\n tax: lineItemInput.taxAmount,\n remark: lineItemInput.remark,\n }\n}\n\n/**\n * 추가 담당자 입력을 raw 추가 담당자 모델로 변환합니다.\n */\nfunction mapAdditionalContact(\n additionalContactInput: TaxInvoiceAdditionalContactInput\n): NonNullable<Spec.TaxInvoiceApiModel['addContactList']>[number] {\n return {\n serialNum: additionalContactInput.sequenceNumber,\n contactName: additionalContactInput.contactName,\n email: additionalContactInput.emailAddress,\n }\n}\n\n/**\n * 객체에서 `undefined` 값만 제거하여 API 요청 본문을 정리합니다.\n */\nfunction removeUndefinedProperties<T extends Record<string, unknown>>(sourceObject: T): T {\n const definedEntries = Object.entries(sourceObject).filter(([, value]) => value !== undefined)\n return Object.fromEntries(definedEntries) as T\n}\n","import { toBoolean } from '@connextable/popbill-utils'\nimport type { TaxInvoiceInfo } from '@/services/tax-invoice/types'\nimport type * as Spec from '@connextable/popbill-spec'\n\n/**\n * compat `getInfo` 응답을 modern TaxInvoiceInfo로 변환합니다.\n */\nexport function mapTaxInvoiceInfo(response: Spec.TaxInvoiceGetInfoApiResponse): TaxInvoiceInfo {\n return {\n itemKey: response.itemKey,\n taxType: response.taxType,\n writtenDate: response.writeDate,\n registeredAt: response.regDT,\n issueType: response.issueType,\n totalSupplyCost: response.supplyCostTotal,\n totalTax: response.taxTotal,\n purposeType: response.purposeType,\n issuedAt: response.issueDT,\n isLateIssued: toBoolean(response.lateIssueYN),\n isOpen: toBoolean(response.openYN),\n openedAt: response.openDT,\n stateMemo: response.stateMemo,\n stateCode: toRequiredStateCode(response.stateCode),\n stateChangedAt: response.stateDT,\n nationalTaxServiceConfirmationNumber: response.ntsconfirmNum,\n nationalTaxServiceResult: response.ntsresult,\n nationalTaxServiceSentAt: response.ntssendDT,\n nationalTaxServiceResultReceivedAt: response.ntsresultDT,\n nationalTaxServiceSendErrorCode: response.ntssendErrCode,\n modificationCode: response.modifyCode,\n isApiLinkedDocument: toBoolean(response.interOPYN),\n supplierCompanyName: response.invoicerCorpName,\n supplierBusinessNumber: response.invoicerCorpNum,\n supplierManagementKey: response.invoicerMgtKey,\n isSupplierPrinted: toBoolean(response.invoicerPrintYN),\n buyerCompanyName: response.invoiceeCorpName,\n buyerBusinessNumber: response.invoiceeCorpNum,\n buyerManagementKey: response.invoiceeMgtKey,\n isBuyerPrinted: toBoolean(response.invoiceePrintYN),\n buyerBusinessStatus: response.closeDownState,\n buyerBusinessStatusDate: response.closeDownStateDate,\n trusteeCompanyName: response.trusteeCorpName,\n trusteeBusinessNumber: response.trusteeCorpNum,\n trusteeManagementKey: response.trusteeMgtKey,\n isTrusteePrinted: response.trusteePrintYN === undefined ? undefined : toBoolean(response.trusteePrintYN),\n }\n}\n\nfunction toRequiredStateCode(value: number | string): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const normalizedNumber = Number(value)\n if (Number.isFinite(normalizedNumber)) {\n return normalizedNumber\n }\n }\n\n throw new Error(`유효하지 않은 stateCode 응답값입니다. (${String(value)})`)\n}\n","/**\n * 작성일/일시 문자열 타입입니다.\n */\nexport type TaxInvoiceDateString = string\n\n/**\n * 세금계산서 과금 방향 값입니다.\n */\nexport const TaxInvoiceChargeDirectionValues = {\n /**\n * 값: `정과금`, 의미: 공급자에게 과금되는 일반 방향\n */\n NormalCharge: '정과금',\n /**\n * 값: `역과금`, 의미: 공급받는자에게 과금되는 역방향\n */\n ReverseCharge: '역과금',\n} as const\n\n/**\n * 세금계산서 과금 방향 타입입니다.\n */\nexport type TaxInvoiceChargeDirection = (typeof TaxInvoiceChargeDirectionValues)[keyof typeof TaxInvoiceChargeDirectionValues]\n\n/**\n * 세금계산서 발행 형태 값입니다.\n */\nexport const TaxInvoiceIssueTypes = {\n /**\n * 값: `정발행`, 의미: 공급자 중심의 일반 발행\n */\n Normal: '정발행',\n /**\n * 값: `역발행`, 의미: 공급받는자 요청 기반 발행\n */\n Reverse: '역발행',\n /**\n * 값: `위수탁`, 의미: 수탁자 대행 발행\n */\n Trustee: '위수탁',\n} as const\n\n/**\n * 세금계산서 발행 형태 타입입니다.\n */\nexport type TaxInvoiceIssueType = (typeof TaxInvoiceIssueTypes)[keyof typeof TaxInvoiceIssueTypes]\n\n/**\n * 세금계산서 영수/청구 값입니다.\n */\nexport const TaxInvoicePurposeTypes = {\n /**\n * 값: `영수`, 의미: 영수 목적\n */\n Receipt: '영수',\n /**\n * 값: `청구`, 의미: 청구 목적\n */\n Claim: '청구',\n /**\n * 값: `없음`, 의미: 목적 구분 없음\n */\n None: '없음',\n} as const\n\n/**\n * 세금계산서 영수/청구 타입입니다.\n */\nexport type TaxInvoicePurposeType = (typeof TaxInvoicePurposeTypes)[keyof typeof TaxInvoicePurposeTypes]\n\n/**\n * 세금계산서 과세 유형 값입니다.\n */\nexport const TaxInvoiceTaxationTypes = {\n /**\n * 값: `과세`, 의미: 일반 과세\n */\n Taxable: '과세',\n /**\n * 값: `영세`, 의미: 영세율\n */\n ZeroRated: '영세',\n /**\n * 값: `면세`, 의미: 면세\n */\n Exempt: '면세',\n} as const\n\n/**\n * 세금계산서 과세 유형 타입입니다.\n */\nexport type TaxInvoiceTaxationType = (typeof TaxInvoiceTaxationTypes)[keyof typeof TaxInvoiceTaxationTypes]\n\n/**\n * 공급받는자 구분 값입니다.\n */\nexport const TaxInvoiceRecipientTypes = {\n /**\n * 값: `사업자`, 의미: 사업자 번호 기반\n */\n Business: '사업자',\n /**\n * 값: `개인`, 의미: 주민등록번호 기반\n */\n Individual: '개인',\n /**\n * 값: `외국인`, 의미: 외국인 식별번호 기반\n */\n Foreigner: '외국인',\n} as const\n\n/**\n * 공급받는자 구분 타입입니다.\n */\nexport type TaxInvoiceRecipientType = (typeof TaxInvoiceRecipientTypes)[keyof typeof TaxInvoiceRecipientTypes]\n\n/**\n * 공급받는자 휴폐업 상태 값입니다.\n */\nexport const TaxInvoiceBusinessStatusValues = {\n /**\n * 값: `null`, 의미: 미확인\n */\n NotChecked: null,\n /**\n * 값: `0`, 의미: 미등록\n */\n NotRegistered: 0,\n /**\n * 값: `1`, 의미: 사업중\n */\n Operating: 1,\n /**\n * 값: `2`, 의미: 폐업\n */\n Closed: 2,\n /**\n * 값: `3`, 의미: 휴업\n */\n Suspended: 3,\n /**\n * 값: `4`, 의미: 확인실패\n */\n CheckFailed: 4,\n} as const\n\n/**\n * 공급받는자 휴폐업 상태 타입입니다.\n */\nexport type TaxInvoiceBusinessStatus = (typeof TaxInvoiceBusinessStatusValues)[keyof typeof TaxInvoiceBusinessStatusValues]\n\n/**\n * 수정세금계산서 사유코드 값입니다.\n */\nexport const TaxInvoiceModificationReasonCodes = {\n /**\n * 값: `1`, 의미: 기재사항 착오 정정\n */\n CorrectingEntryErrors: 1,\n /**\n * 값: `2`, 의미: 공급가액 변동\n */\n SupplyAmountAdjustment: 2,\n /**\n * 값: `3`, 의미: 환입\n */\n Return: 3,\n /**\n * 값: `4`, 의미: 계약의 해제\n */\n ContractCancellation: 4,\n /**\n * 값: `5`, 의미: 내국신용장 사후 개설\n */\n PostIssuedDomesticLetterOfCredit: 5,\n /**\n * 값: `6`, 의미: 착오에 의한 이중 발급\n */\n DuplicateIssuanceByMistake: 6,\n} as const\n\n/**\n * 수정세금계산서 사유코드 타입입니다.\n */\nexport type TaxInvoiceModificationReasonCode = (typeof TaxInvoiceModificationReasonCodes)[keyof typeof TaxInvoiceModificationReasonCodes]\n\n/**\n * 세금계산서 상세 품목 입력입니다.\n */\nexport interface TaxInvoiceLineItemInput {\n /**\n * 상세 품목의 순번입니다.\n */\n lineNumber: number\n /**\n * 거래일자(yyyyMMdd)입니다.\n */\n transactionDate?: TaxInvoiceDateString\n /**\n * 품목명입니다.\n */\n itemName?: string\n /**\n * 규격입니다.\n */\n specification?: string\n /**\n * 수량입니다.\n */\n quantity?: string\n /**\n * 단가입니다.\n */\n unitCostAmount?: string\n /**\n * 공급가액입니다.\n */\n supplyCostAmount?: string\n /**\n * 세액입니다.\n */\n taxAmount?: string\n /**\n * 품목 비고입니다.\n */\n remark?: string\n}\n\n/**\n * 세금계산서 추가 담당자 입력입니다.\n */\nexport interface TaxInvoiceAdditionalContactInput {\n /**\n * 추가 담당자의 순번입니다.\n */\n sequenceNumber: number\n /**\n * 추가 담당자 이름입니다.\n */\n contactName?: string\n /**\n * 추가 담당자 이메일 주소입니다.\n */\n emailAddress: string\n}\n\n/**\n * 세금계산서 당사자 공통 입력입니다.\n */\nexport interface TaxInvoicePartyInput {\n /**\n * 사업자번호입니다.\n */\n businessNumber?: string\n /**\n * 문서 관리번호입니다.\n */\n managementKey?: string\n /**\n * 종사업장 식별번호입니다.\n */\n taxRegistrationIdentifier?: string\n /**\n * 상호입니다.\n */\n companyName?: string\n /**\n * 대표자 성명입니다.\n */\n chiefExecutiveOfficerName?: string\n /**\n * 주소입니다.\n */\n address?: string\n /**\n * 업태입니다.\n */\n businessClass?: string\n /**\n * 종목입니다.\n */\n businessType?: string\n /**\n * 담당자 이름입니다.\n */\n contactName?: string\n /**\n * 담당자 전화번호입니다.\n */\n telephoneNumber?: string\n /**\n * 담당자 휴대폰번호입니다.\n */\n mobilePhoneNumber?: string\n /**\n * 담당자 이메일 주소입니다.\n */\n emailAddress?: string\n /**\n * 담당자 휴대폰 문자 발송 여부입니다.\n */\n sendTextMessage?: boolean\n /**\n * 인쇄 여부입니다.\n */\n printEnabled?: boolean\n /**\n * 주민등록번호입니다.\n */\n residentRegistrationNumber?: string\n /**\n * 외국인 등록번호입니다.\n */\n foreignerRegistrationNumber?: string\n /**\n * 종사업자번호입니다.\n */\n branchBusinessNumber?: string\n /**\n * 종사업자 일련번호입니다.\n */\n branchSerialNumber?: string\n /**\n * 법인 구분값입니다.\n */\n corporationClassification?: string\n /**\n * 부서명입니다.\n */\n departmentName?: string\n}\n\n/**\n * 세금계산서 공급받는자 입력입니다.\n */\nexport interface TaxInvoiceBuyerInput extends TaxInvoicePartyInput {\n /**\n * 공급받는자 구분입니다.\n */\n recipientType?: TaxInvoiceRecipientType\n /**\n * 예비 담당자 이름입니다.\n */\n secondaryContactName?: string\n /**\n * 예비 담당자 전화번호입니다.\n */\n secondaryTelephoneNumber?: string\n /**\n * 예비 담당자 휴대폰번호입니다.\n */\n secondaryMobilePhoneNumber?: string\n /**\n * 예비 담당자 이메일 주소입니다.\n */\n secondaryEmailAddress?: string\n /**\n * 주 담당 부서명입니다.\n */\n primaryDepartmentName?: string\n /**\n * 예비 담당 부서명입니다.\n */\n secondaryDepartmentName?: string\n /**\n * 휴폐업 상태입니다.\n */\n businessStatus?: TaxInvoiceBusinessStatus\n /**\n * 휴폐업일자(yyyyMMdd)입니다.\n */\n businessStatusDate?: TaxInvoiceDateString\n}\n\n/**\n * 세금계산서 결제/합계 금액 입력입니다.\n */\nexport interface TaxInvoicePaymentSummaryInput {\n /**\n * 세액 합계입니다.\n */\n totalTaxAmount?: string\n /**\n * 공급가액 합계입니다.\n */\n totalSupplyCostAmount?: string\n /**\n * 합계 금액입니다.\n */\n totalAmount?: string\n /**\n * 현금 금액입니다.\n */\n cashAmount?: string\n /**\n * 수표 금액입니다.\n */\n checkAmount?: string\n /**\n * 어음 금액입니다.\n */\n promissoryNoteAmount?: string\n /**\n * 외상 금액입니다.\n */\n creditAmount?: string\n}\n\n/**\n * 세금계산서 수정 사유 입력입니다.\n */\nexport interface TaxInvoiceModificationInput {\n /**\n * 수정 사유코드입니다.\n */\n modificationReasonCode?: TaxInvoiceModificationReasonCode\n /**\n * 원본 문서의 국세청 승인번호입니다.\n */\n originalNationalTaxServiceConfirmationNumber?: string\n}\n\n/**\n * 세금계산서 문서 입력입니다.\n */\nexport interface TaxInvoiceDocumentInput {\n /**\n * 거래명세서 동시작성 여부입니다.\n */\n writeSpecificationEnabled?: boolean\n /**\n * 작성일자(yyyyMMdd)입니다.\n */\n writtenDate?: TaxInvoiceDateString\n /**\n * 과금 방향입니다.\n */\n chargeDirection?: TaxInvoiceChargeDirection\n /**\n * 발행 형태입니다.\n */\n issueType?: TaxInvoiceIssueType\n /**\n * 영수/청구 구분입니다.\n */\n purposeType?: TaxInvoicePurposeType\n /**\n * 발행시기 코드입니다.\n */\n issueTimingCode?: string\n /**\n * 과세 유형입니다.\n */\n taxType?: TaxInvoiceTaxationType\n /**\n * 공급자 정보입니다.\n */\n supplier?: TaxInvoicePartyInput\n /**\n * 공급받는자 정보입니다.\n */\n buyer?: TaxInvoiceBuyerInput\n /**\n * 수탁자 정보입니다.\n */\n trustee?: TaxInvoicePartyInput\n /**\n * 금액 정보입니다.\n */\n paymentSummary?: TaxInvoicePaymentSummaryInput\n /**\n * 수정세금계산서 정보입니다.\n */\n modification?: TaxInvoiceModificationInput\n /**\n * 기재상 일련번호입니다.\n */\n taxInvoiceSerialNumber?: string\n /**\n * 비고1입니다.\n */\n remarkOne?: string\n /**\n * 비고2입니다.\n */\n remarkTwo?: string\n /**\n * 비고3입니다.\n */\n remarkThree?: string\n /**\n * 책번호 권 항목입니다.\n */\n bookVolumeNumber?: number | string\n /**\n * 책번호 호 항목입니다.\n */\n bookIssueNumber?: number | string\n /**\n * 사업자등록증 이미지 첨부 여부입니다.\n */\n includeBusinessLicenseImage?: boolean\n /**\n * 통장사본 이미지 첨부 여부입니다.\n */\n includeBankBookImage?: boolean\n /**\n * 상세 품목 목록입니다.\n */\n lineItems?: TaxInvoiceLineItemInput[]\n /**\n * 추가 담당자 목록입니다.\n */\n additionalContacts?: TaxInvoiceAdditionalContactInput[]\n}\n","import type * as document from './document'\n\n/**\n * 세금계산서 공통 처리 결과입니다.\n */\nexport interface TaxInvoiceOperationResult {\n /**\n * 처리 결과 코드입니다.\n */\n resultCode: number\n /**\n * 처리 결과 메시지입니다.\n */\n resultMessage: string\n}\n\n/**\n * 발행 처리 결과입니다.\n */\nexport interface TaxInvoiceIssueResult extends TaxInvoiceOperationResult {\n /**\n * 국세청 승인번호입니다.\n */\n nationalTaxServiceConfirmationNumber?: string\n /**\n * 발행일시(yyyyMMddHHmmss)입니다.\n */\n issuedAt?: string\n}\n\n/**\n * 초대량 접수 결과입니다.\n */\nexport interface TaxInvoiceBulkSubmitResult extends TaxInvoiceOperationResult {\n /**\n * 접수 식별자입니다.\n */\n receiptIdentifier?: string\n}\n\n/**\n * 초대량 처리 상태 값입니다.\n */\nexport const TaxInvoiceBulkIssueSubmissionTransactionStates = {\n /**\n * 값: `0`, 의미: 미처리 상태\n */\n NotProcessed: 0,\n /**\n * 값: `1`, 의미: 처리중 상태\n */\n Processing: 1,\n /**\n * 값: `2`, 의미: 완료 상태\n */\n Completed: 2,\n} as const\n\n/**\n * 초대량 처리 상태 타입입니다.\n */\nexport type TaxInvoiceBulkIssueSubmissionTransactionState =\n (typeof TaxInvoiceBulkIssueSubmissionTransactionStates)[keyof typeof TaxInvoiceBulkIssueSubmissionTransactionStates]\n\n/**\n * 초대량 발행 개별 처리 결과입니다.\n */\nexport interface TaxInvoiceBulkIssueSubmissionResultItem {\n /**\n * 문서번호 유형 코드입니다.\n */\n invoiceDocumentKeyTypeCode?: string\n /**\n * 공급자 문서번호입니다.\n */\n supplierInvoiceManagementKey?: string\n /**\n * 수탁자 문서번호입니다.\n */\n trusteeInvoiceManagementKey?: string\n /**\n * 개별 처리 결과 코드입니다.\n */\n resultCode?: number\n /**\n * 개별 처리 결과 메시지입니다.\n */\n resultMessage?: string\n /**\n * 국세청 승인번호입니다.\n */\n nationalTaxServiceConfirmationNumber?: string\n /**\n * 접수일시(yyyyMMddHHmmss)입니다.\n */\n receivedAt?: string\n /**\n * 발행일시(yyyyMMddHHmmss)입니다.\n */\n issuedAt?: string\n}\n\n/**\n * 초대량 접수결과 조회 결과입니다.\n */\nexport interface TaxInvoiceBulkIssueSubmissionResult extends TaxInvoiceOperationResult {\n /**\n * 접수 식별자입니다.\n */\n receiptIdentifier?: string\n /**\n * 접수일시(yyyyMMddHHmmss)입니다.\n */\n receivedAt?: string\n /**\n * 제출 식별자입니다.\n */\n submissionIdentifier?: string\n /**\n * 제출 건수입니다.\n */\n submittedDocumentCount?: number\n /**\n * 성공 건수입니다.\n */\n succeededDocumentCount?: number\n /**\n * 실패 건수입니다.\n */\n failedDocumentCount?: number\n /**\n * 처리 상태입니다.\n */\n transactionState?: TaxInvoiceBulkIssueSubmissionTransactionState\n /**\n * 처리 시작일시(yyyyMMddHHmmss)입니다.\n */\n transactionStartedAt?: string\n /**\n * 처리 완료일시(yyyyMMddHHmmss)입니다.\n */\n transactionCompletedAt?: string\n /**\n * 처리 결과 코드입니다.\n */\n transactionResultCode?: number\n /**\n * 개별 처리 결과 목록입니다.\n */\n issueResults?: TaxInvoiceBulkIssueSubmissionResultItem[]\n}\n\n/**\n * 문서 요약정보 조회 결과입니다.\n */\nexport interface TaxInvoiceInfo {\n /**\n * 팝빌 문서 식별키(ItemKey)입니다.\n */\n itemKey: string\n /**\n * 과세유형입니다.\n */\n taxType: document.TaxInvoiceTaxationType\n /**\n * 작성일자(yyyyMMdd)입니다.\n */\n writtenDate: string\n /**\n * 등록일시(yyyyMMddHHmmss)입니다.\n */\n registeredAt: string\n /**\n * 발행유형입니다.\n */\n issueType: document.TaxInvoiceIssueType\n /**\n * 공급가액 합계입니다.\n */\n totalSupplyCost: string\n /**\n * 세액 합계입니다.\n */\n totalTax: string\n /**\n * 영수/청구 구분입니다.\n */\n purposeType: document.TaxInvoicePurposeType\n /**\n * 발행일시(yyyyMMddHHmmss)입니다.\n */\n issuedAt?: string\n /**\n * 지연발행 여부입니다.\n */\n isLateIssued: boolean\n /**\n * 개봉 여부입니다.\n */\n isOpen: boolean\n /**\n * 개봉일시(yyyyMMddHHmmss)입니다.\n */\n openedAt?: string\n /**\n * 상태 메모입니다.\n */\n stateMemo?: string\n /**\n * 상태 코드입니다.\n */\n stateCode: number\n /**\n * 상태 변경일시(yyyyMMddHHmmss)입니다.\n */\n stateChangedAt: string\n /**\n * 국세청 승인번호입니다.\n */\n nationalTaxServiceConfirmationNumber?: string\n /**\n * 국세청 전송 결과 코드입니다.\n */\n nationalTaxServiceResult?: string\n /**\n * 국세청 전송일시(yyyyMMddHHmmss)입니다.\n */\n nationalTaxServiceSentAt?: string\n /**\n * 국세청 결과 수신일시(yyyyMMddHHmmss)입니다.\n */\n nationalTaxServiceResultReceivedAt?: string\n /**\n * 국세청 전송 오류 코드입니다.\n */\n nationalTaxServiceSendErrorCode?: string\n /**\n * 수정사유코드입니다.\n */\n modificationCode?: document.TaxInvoiceModificationReasonCode\n /**\n * 연동 문서 여부입니다.\n */\n isApiLinkedDocument: boolean\n /**\n * 공급자 상호입니다.\n */\n supplierCompanyName: string\n /**\n * 공급자 사업자번호입니다.\n */\n supplierBusinessNumber: string\n /**\n * 공급자 문서번호입니다.\n */\n supplierManagementKey?: string\n /**\n * 공급자 인쇄 여부입니다.\n */\n isSupplierPrinted: boolean\n /**\n * 공급받는자 상호입니다.\n */\n buyerCompanyName: string\n /**\n * 공급받는자 사업자번호입니다.\n */\n buyerBusinessNumber: string\n /**\n * 공급받는자 문서번호입니다.\n */\n buyerManagementKey?: string\n /**\n * 공급받는자 인쇄 여부입니다.\n */\n isBuyerPrinted: boolean\n /**\n * 공급받는자 휴폐업 상태입니다.\n */\n buyerBusinessStatus?: document.TaxInvoiceBusinessStatus\n /**\n * 공급받는자 휴폐업일자(yyyyMMdd)입니다.\n */\n buyerBusinessStatusDate?: string\n /**\n * 수탁자 상호입니다.\n */\n trusteeCompanyName?: string\n /**\n * 수탁자 사업자번호입니다.\n */\n trusteeBusinessNumber?: string\n /**\n * 수탁자 문서번호입니다.\n */\n trusteeManagementKey?: string\n /**\n * 수탁자 인쇄 여부입니다.\n */\n isTrusteePrinted?: boolean\n}\n\n/**\n * 문서 상세조회 결과입니다.\n */\nexport interface TaxInvoiceDocumentOutput extends document.TaxInvoiceDocumentInput {\n /**\n * 발행일시(yyyyMMddHHmmss)입니다.\n */\n issuedAt?: string\n /**\n * 상태 코드입니다.\n */\n stateCode?: number\n /**\n * 상태 변경일시(yyyyMMddHHmmss)입니다.\n */\n stateChangedAt?: string\n /**\n * 지연발행 여부입니다.\n */\n isLateIssued?: boolean\n /**\n * 개봉 여부입니다.\n */\n isOpen?: boolean\n /**\n * 개봉일시(yyyyMMddHHmmss)입니다.\n */\n openedAt?: string\n /**\n * 국세청 승인번호입니다.\n */\n nationalTaxServiceConfirmationNumber?: string\n /**\n * 국세청 전송 결과 코드입니다.\n */\n nationalTaxServiceResultCode?: string\n /**\n * 국세청 전송일시(yyyyMMddHHmmss)입니다.\n */\n nationalTaxServiceSentAt?: string\n /**\n * 국세청 결과 수신일시(yyyyMMddHHmmss)입니다.\n */\n nationalTaxServiceResultReceivedAt?: string\n /**\n * 국세청 전송 오류 코드입니다.\n */\n nationalTaxServiceSendErrorCode?: string\n /**\n * API 연동 문서 여부입니다.\n */\n isApiLinkedDocument?: boolean\n}\n\n/**\n * 문서번호 사용 여부 조회 결과입니다.\n */\nexport interface TaxInvoiceInvoiceManagementKeyUsage {\n /**\n * 문서번호 사용 여부입니다.\n */\n isInUse: boolean\n /**\n * 사용중인 경우 팝빌 문서 식별키입니다.\n */\n itemKey?: string\n}\n\n/**\n * XML 조회 결과입니다.\n */\nexport interface TaxInvoiceXmlResult {\n /**\n * 처리 결과입니다.\n */\n operationResult?: TaxInvoiceOperationResult\n /**\n * 팝빌 문서 식별키입니다.\n */\n itemKey?: string\n /**\n * 문서번호입니다.\n */\n invoiceManagementKey?: string\n /**\n * XML 원문입니다.\n */\n xmlContent?: string\n}\n\n/**\n * 검색 조회 결과입니다.\n */\nexport interface TaxInvoiceSearchResult {\n /**\n * 처리 결과입니다.\n */\n operationResult: TaxInvoiceOperationResult\n /**\n * 총 검색 건수입니다.\n */\n totalCount?: number\n /**\n * 페이지당 건수입니다.\n */\n pageSize?: number\n /**\n * 현재 페이지 번호입니다.\n */\n pageNumber?: number\n /**\n * 전체 페이지 수입니다.\n */\n pageCount?: number\n /**\n * 문서 요약 목록입니다.\n */\n invoiceSummaries: TaxInvoiceInfo[]\n}\n\n/**\n * 문서 상태 이력 항목입니다.\n */\nexport interface TaxInvoiceLogEntry {\n /**\n * 문서 이력 유형 코드입니다.\n */\n documentLogTypeCode?: number\n /**\n * 로그 메시지입니다.\n */\n logMessage?: string\n /**\n * 처리 유형 코드입니다.\n */\n processTypeCode?: string\n /**\n * 처리 회사명입니다.\n */\n processCompanyName?: string\n /**\n * 처리 담당자명입니다.\n */\n processContactName?: string\n /**\n * 처리 설명입니다.\n */\n processDescription?: string\n /**\n * 등록일시(yyyyMMddHHmmss)입니다.\n */\n registeredAt?: string\n /**\n * 처리 IP 주소입니다.\n */\n ipAddress?: string\n}\n\n/**\n * URL 응답 결과입니다.\n */\nexport interface TaxInvoiceAccessUrl {\n /**\n * 접근 URL입니다.\n */\n accessUrl: string\n}\n\n/**\n * 첨부파일 메타데이터입니다.\n */\nexport interface TaxInvoiceAttachedFile {\n /**\n * 첨부 순번입니다.\n */\n sequenceNumber?: number\n /**\n * 파일 식별자입니다.\n */\n fileIdentifier?: string\n /**\n * 표시 이름입니다.\n */\n displayName?: string\n /**\n * 등록일시(yyyyMMddHHmmss)입니다.\n */\n registeredAt?: string\n}\n\n/**\n * 이메일 전송 설정 항목입니다.\n */\nexport interface TaxInvoiceEmailSendSetting {\n /**\n * 메일 유형 코드입니다.\n */\n emailTypeCode?: string\n /**\n * 전송 활성화 여부입니다.\n */\n sendEnabled?: boolean\n}\n\n/**\n * 국세청 전송 설정입니다.\n */\nexport interface TaxInvoiceSendToNationalTaxServiceSetting {\n /**\n * 즉시 전송 여부입니다.\n */\n sendToNationalTaxServiceEnabled: boolean\n}\n\n/**\n * 인증서 만료일 조회 결과입니다.\n */\nexport interface TaxInvoiceTaxCertificateExpiration {\n /**\n * 만료일시(yyyyMMddHHmmss)입니다.\n */\n expirationDateTime: string\n}\n\n/**\n * 인증서 정보 조회 결과입니다.\n */\nexport interface TaxInvoiceTaxCertificateInfo {\n /**\n * 등록일시(yyyyMMddHHmmss)입니다.\n */\n registeredAt?: string\n /**\n * 만료일시(yyyyMMddHHmmss)입니다.\n */\n expiredAt?: string\n /**\n * 발급자 DN입니다.\n */\n issuerDistinguishedName?: string\n /**\n * 인증서 DN입니다.\n */\n subjectDistinguishedName?: string\n /**\n * 인증서 종류명입니다.\n */\n issuerName?: string\n /**\n * 인증서 정책 OID입니다.\n */\n policyObjectIdentifier?: string\n /**\n * 등록 담당자 이름입니다.\n */\n registeredContactName?: string\n /**\n * 등록 담당자 아이디입니다.\n */\n registeredContactIdentifier?: string\n}\n","import {\n TaxInvoiceModificationReasonCodes,\n type TaxInvoiceDateString,\n type TaxInvoiceDocumentInput,\n type TaxInvoiceModificationReasonCode,\n} from './document'\nimport type * as response from './response'\nexport {\n TaxInvoiceBusinessStatusValues,\n TaxInvoiceChargeDirectionValues,\n TaxInvoiceIssueTypes,\n TaxInvoiceModificationReasonCodes,\n TaxInvoicePurposeTypes,\n TaxInvoiceRecipientTypes,\n TaxInvoiceTaxationTypes,\n} from './document'\nexport type {\n TaxInvoiceAdditionalContactInput,\n TaxInvoiceBusinessStatus,\n TaxInvoiceChargeDirection,\n TaxInvoiceDateString,\n TaxInvoiceDocumentInput,\n TaxInvoiceIssueType,\n TaxInvoiceLineItemInput,\n TaxInvoiceModificationReasonCode,\n TaxInvoicePartyInput,\n TaxInvoicePurposeType,\n TaxInvoiceRecipientType,\n TaxInvoiceTaxationType,\n TaxInvoiceBuyerInput,\n} from './document'\nexport * from './response'\n\n/**\n * 세금계산서 문서번호 유형 상수입니다.\n */\nexport const TaxInvoiceDocumentKeyTypes = {\n /**\n * 코드: `SELL`, 설명: 매출 문서번호 유형\n */\n Sales: 'SELL',\n /**\n * 코드: `BUY`, 설명: 매입 문서번호 유형\n */\n Purchase: 'BUY',\n /**\n * 코드: `TRUSTEE`, 설명: 위수탁 문서번호 유형\n */\n Trustee: 'TRUSTEE',\n} as const\n\n/**\n * 세금계산서 문서번호 유형입니다.\n */\nexport type TaxInvoiceDocumentKeyType = (typeof TaxInvoiceDocumentKeyTypes)[keyof typeof TaxInvoiceDocumentKeyTypes]\nexport type TaxInvoiceOutboundDocumentKeyType = Extract<\n TaxInvoiceDocumentKeyType,\n typeof TaxInvoiceDocumentKeyTypes.Sales | typeof TaxInvoiceDocumentKeyTypes.Trustee\n>\nexport type TaxInvoiceReverseRequestDocumentKeyType = typeof TaxInvoiceDocumentKeyTypes.Purchase\nexport type TaxInvoiceReverseRefuseDocumentKeyType = typeof TaxInvoiceDocumentKeyTypes.Sales\n\n/**\n * 세금계산서 문서함 범위 상수입니다.\n */\nexport const TaxInvoiceBoxScopes = {\n /**\n * 코드: `TBOX`, 설명: 임시 문서함\n */\n TemporaryDocumentBox: 'TBOX',\n /**\n * 코드: `SWBOX`, 설명: 매출 발행 대기함\n */\n SalesIssueWaitingBox: 'SWBOX',\n /**\n * 코드: `SBOX`, 설명: 매출 문서함\n */\n SalesDocumentBox: 'SBOX',\n /**\n * 코드: `PWBOX`, 설명: 매입 발행 대기함\n */\n PurchaseIssueWaitingBox: 'PWBOX',\n /**\n * 코드: `PBOX`, 설명: 매입 문서함\n */\n PurchaseDocumentBox: 'PBOX',\n /**\n * 코드: `WRITE`, 설명: 정발행 작성\n */\n WriteInvoice: 'WRITE',\n} as const\n\n/**\n * 세금계산서 문서함 범위 값입니다.\n */\nexport type TaxInvoiceBoxScope = (typeof TaxInvoiceBoxScopes)[keyof typeof TaxInvoiceBoxScopes]\n\n/**\n * 검색일자 유형 상수입니다.\n */\nexport const TaxInvoiceDateType = {\n /**\n * 코드: `R`, 설명: 등록일자\n */\n Registered: 'R',\n /**\n * 코드: `W`, 설명: 작성일자\n */\n Written: 'W',\n /**\n * 코드: `I`, 설명: 발행일자\n */\n Issued: 'I',\n} as const\n\n/**\n * 검색일자 유형입니다.\n */\nexport type TaxInvoiceDateType = (typeof TaxInvoiceDateType)[keyof typeof TaxInvoiceDateType]\n\n/**\n * `packages/popbill` 검색 입력에서 허용하는 일자 타입입니다.\n */\nexport type TaxInvoiceDateInput = TaxInvoiceDateString | Date\n\n/**\n * 검색 정렬 방향 상수입니다.\n */\nexport const TaxInvoiceSortOrder = {\n /**\n * 코드: `D`, 설명: 내림차순\n */\n Descending: 'D',\n /**\n * 코드: `A`, 설명: 오름차순\n */\n Ascending: 'A',\n} as const\n\n/**\n * 검색 정렬 방향 코드입니다.\n */\nexport type TaxInvoiceSortOrder = (typeof TaxInvoiceSortOrder)[keyof typeof TaxInvoiceSortOrder]\n\n/**\n * 검색 상태코드 패턴입니다.\n *\n * 첫 자리는 숫자, 2/3번째 자리는 숫자 또는 `*`를 허용합니다.\n * 예) `300`, `3**`, `60*`\n */\nexport type TaxInvoiceSearchStateCode = string\n\n/**\n * 검색 문서유형 코드 상수입니다.\n */\nexport const TaxInvoiceSearchInvoiceTypeCodes = {\n /**\n * 코드: `N`, 설명: 세금계산서\n */\n Normal: 'N',\n /**\n * 코드: `M`, 설명: 수정세금계산서\n */\n Modified: 'M',\n} as const\n\n/**\n * 검색 문서유형 코드입니다.\n */\nexport type TaxInvoiceSearchInvoiceTypeCode = (typeof TaxInvoiceSearchInvoiceTypeCodes)[keyof typeof TaxInvoiceSearchInvoiceTypeCodes]\n\n/**\n * 검색 과세형태 코드 상수입니다.\n */\nexport const TaxInvoiceSearchTaxationTypeCodes = {\n /**\n * 코드: `T`, 설명: 과세\n */\n Taxable: 'T',\n /**\n * 코드: `N`, 설명: 면세\n */\n Exempt: 'N',\n /**\n * 코드: `Z`, 설명: 영세\n */\n ZeroRated: 'Z',\n} as const\n\n/**\n * 검색 과세형태 코드입니다.\n */\nexport type TaxInvoiceSearchTaxationTypeCode = (typeof TaxInvoiceSearchTaxationTypeCodes)[keyof typeof TaxInvoiceSearchTaxationTypeCodes]\n\n/**\n * 검색 발행형태 코드 상수입니다.\n */\nexport const TaxInvoiceSearchIssueTypeCodes = {\n /**\n * 코드: `N`, 설명: 정발행\n */\n Normal: 'N',\n /**\n * 코드: `R`, 설명: 역발행\n */\n Reverse: 'R',\n /**\n * 코드: `T`, 설명: 위수탁\n */\n Trustee: 'T',\n} as const\n\n/**\n * 검색 발행형태 코드입니다.\n */\nexport type TaxInvoiceSearchIssueTypeCode = (typeof TaxInvoiceSearchIssueTypeCodes)[keyof typeof TaxInvoiceSearchIssueTypeCodes]\n\n/**\n * 검색 종사업장번호 주체 코드 상수입니다.\n */\nexport const TaxInvoiceSearchTaxRegistrationIdentifierTypes = {\n /**\n * 코드: `S`, 설명: 공급자\n */\n Supplier: 'S',\n /**\n * 코드: `B`, 설명: 공급받는자\n */\n Buyer: 'B',\n /**\n * 코드: `T`, 설명: 수탁자\n */\n Trustee: 'T',\n} as const\n\n/**\n * 검색 종사업장번호 주체 코드입니다.\n */\nexport type TaxInvoiceSearchTaxRegistrationIdentifierType =\n (typeof TaxInvoiceSearchTaxRegistrationIdentifierTypes)[keyof typeof TaxInvoiceSearchTaxRegistrationIdentifierTypes]\n\n/**\n * 검색 종사업장번호 유무 코드 상수입니다.\n */\nexport const TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities = {\n /**\n * 코드: `0`, 설명: 종사업장번호 없음\n */\n No: '0',\n /**\n * 코드: `1`, 설명: 종사업장번호 있음\n */\n Yes: '1',\n} as const\n\n/**\n * 검색 종사업장번호 유무 코드입니다.\n */\nexport type TaxInvoiceSearchTaxRegistrationIdentifierAvailability =\n (typeof TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities)[keyof typeof TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities]\n\n/**\n * 검색 작성유형 코드 상수입니다.\n */\nexport const TaxInvoiceSearchInteroperabilityTypes = {\n /**\n * 코드: `0`, 설명: 팝빌 웹 작성\n */\n PopbillWeb: '0',\n /**\n * 코드: `1`, 설명: API 작성\n */\n Api: '1',\n} as const\n\n/**\n * 검색 작성유형 코드입니다.\n */\nexport type TaxInvoiceSearchInteroperabilityType = (typeof TaxInvoiceSearchInteroperabilityTypes)[keyof typeof TaxInvoiceSearchInteroperabilityTypes]\n\n/**\n * 검색 등록유형 코드 상수입니다.\n */\nexport const TaxInvoiceSearchRegistrationTypeCodes = {\n /**\n * 코드: `P`, 설명: 팝빌 등록(발행)\n */\n Popbill: 'P',\n /**\n * 코드: `H`, 설명: 홈택스/ASP 등록(발행)\n */\n HomeTax: 'H',\n} as const\n\n/**\n * 검색 등록유형 코드입니다.\n */\nexport type TaxInvoiceSearchRegistrationTypeCode = (typeof TaxInvoiceSearchRegistrationTypeCodes)[keyof typeof TaxInvoiceSearchRegistrationTypeCodes]\n\n/**\n * 검색 조건의 휴폐업 상태 상수입니다.\n */\nexport const TaxInvoiceCloseDownStateCodes = {\n /**\n * 코드: `N`, 설명: 미확인\n */\n NotChecked: 'N',\n /**\n * 코드: `0`, 설명: 미등록\n */\n NotRegistered: '0',\n /**\n * 코드: `1`, 설명: 사업중\n */\n Operating: '1',\n /**\n * 코드: `2`, 설명: 폐업\n */\n Closed: '2',\n /**\n * 코드: `3`, 설명: 휴업\n */\n Suspended: '3',\n /**\n * 코드: `4`, 설명: 확인실패\n */\n CheckFailed: '4',\n} as const\n\n/**\n * 검색 조건의 휴폐업 상태 코드입니다.\n */\nexport type TaxInvoiceCloseDownStateCode = (typeof TaxInvoiceCloseDownStateCodes)[keyof typeof TaxInvoiceCloseDownStateCodes]\n\n/**\n * 전자명세서 문서유형 코드 상수입니다.\n */\nexport const TaxInvoiceStatementItemCodes = {\n /**\n * 코드: `121`, 설명: 거래명세서\n */\n TradeStatement: 121,\n /**\n * 코드: `122`, 설명: 청구서\n */\n Invoice: 122,\n /**\n * 코드: `123`, 설명: 견적서\n */\n Estimate: 123,\n /**\n * 코드: `124`, 설명: 발주서\n */\n PurchaseOrder: 124,\n /**\n * 코드: `125`, 설명: 입금표\n */\n Deposit: 125,\n /**\n * 코드: `126`, 설명: 영수증\n */\n Receipt: 126,\n} as const\n\n/**\n * 전자명세서 문서유형 코드입니다.\n */\nexport type TaxInvoiceStatementItemCode = (typeof TaxInvoiceStatementItemCodes)[keyof typeof TaxInvoiceStatementItemCodes]\n\n/**\n * 메일 전송 유형 코드 상수입니다.\n */\nexport const TaxInvoiceEmailTypes = {\n /**\n * 코드: `ETC_CERT_EXPIRATION`, 설명: 인증서 만료 안내\n */\n EtcCertExpiration: 'ETC_CERT_EXPIRATION',\n /**\n * 코드: `TAX_CANCEL_ISSUE`, 설명: 발행취소\n */\n TaxCancelIssue: 'TAX_CANCEL_ISSUE',\n /**\n * 코드: `TAX_CANCEL_REQUEST`, 설명: 역발행 요청 취소\n */\n TaxCancelRequest: 'TAX_CANCEL_REQUEST',\n /**\n * 코드: `TAX_CHECK`, 설명: 수신확인\n */\n TaxCheck: 'TAX_CHECK',\n /**\n * 코드: `TAX_CLOSEDOWN`, 설명: 휴폐업 알림\n */\n TaxClosedown: 'TAX_CLOSEDOWN',\n /**\n * 코드: `TAX_ISSUE`, 설명: 발행완료(수신자)\n */\n TaxIssue: 'TAX_ISSUE',\n /**\n * 코드: `TAX_ISSUE_INVOICER`, 설명: 발행완료(공급자)\n */\n TaxIssueInvoicer: 'TAX_ISSUE_INVOICER',\n /**\n * 코드: `TAX_NTSFAIL_INVOICER`, 설명: 국세청 전송실패(공급자)\n */\n TaxNtsFailInvoicer: 'TAX_NTSFAIL_INVOICER',\n /**\n * 코드: `TAX_REFUSE`, 설명: 역발행 거부\n */\n TaxRefuse: 'TAX_REFUSE',\n /**\n * 코드: `TAX_REQUEST`, 설명: 역발행 요청\n */\n TaxRequest: 'TAX_REQUEST',\n /**\n * 코드: `TAX_REVERSE_ISSUE`, 설명: 역발행 완료\n */\n TaxReverseIssue: 'TAX_REVERSE_ISSUE',\n /**\n * 코드: `TAX_TRUST_CANCEL_ISSUE`, 설명: 위수탁 발행취소\n */\n TaxTrustCancelIssue: 'TAX_TRUST_CANCEL_ISSUE',\n /**\n * 코드: `TAX_TRUST_CANCEL_ISSUE_INVOICER`, 설명: 위수탁 발행취소(공급자)\n */\n TaxTrustCancelIssueInvoicer: 'TAX_TRUST_CANCEL_ISSUE_INVOICER',\n /**\n * 코드: `TAX_TRUST_ISSUE`, 설명: 위수탁 발행완료\n */\n TaxTrustIssue: 'TAX_TRUST_ISSUE',\n /**\n * 코드: `TAX_TRUST_ISSUE_INVOICER`, 설명: 위수탁 발행완료(공급자)\n */\n TaxTrustIssueInvoicer: 'TAX_TRUST_ISSUE_INVOICER',\n /**\n * 코드: `TAX_TRUST_ISSUE_TRUSTEE`, 설명: 위수탁 발행완료(수탁자)\n */\n TaxTrustIssueTrustee: 'TAX_TRUST_ISSUE_TRUSTEE',\n /**\n * 코드: `TAX_ACCEPT`, 설명: 역발행 승인(legacy)\n */\n TaxAccept: 'TAX_ACCEPT',\n /**\n * 코드: `TAX_DENY`, 설명: 역발행 거부(legacy)\n */\n TaxDeny: 'TAX_DENY',\n /**\n * 코드: `TAX_CANCEL_SEND`, 설명: 발행안함 취소(legacy)\n */\n TaxCancelSend: 'TAX_CANCEL_SEND',\n} as const\n\n/**\n * 메일 전송 유형 코드입니다.\n */\nexport type TaxInvoiceEmailType = (typeof TaxInvoiceEmailTypes)[keyof typeof TaxInvoiceEmailTypes]\n\n/**\n * 수정세금계산서 사유코드입니다.\n */\nexport const TaxInvoiceModificationCodes = TaxInvoiceModificationReasonCodes\n\n/**\n * 수정세금계산서 사유코드입니다.\n */\nexport type TaxInvoiceModificationCode = TaxInvoiceModificationReasonCode\n\n/**\n * 사업자번호 입력이 필요한 요청의 공통 필드입니다.\n */\nexport interface TaxInvoiceBusinessRequest {\n /**\n * 팝빌 회원 사업자번호입니다.\n */\n businessNumber: string\n}\n\n/**\n * 문서 식별(문서번호 유형 + 문서번호)이 필요한 요청의 공통 필드입니다.\n */\nexport interface TaxInvoiceDocumentRequest<TKeyType extends TaxInvoiceDocumentKeyType = TaxInvoiceDocumentKeyType> extends TaxInvoiceBusinessRequest {\n /**\n * 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TKeyType\n /**\n * 파트너가 관리하는 문서번호입니다.\n */\n invoiceManagementKey: string\n}\n\n/**\n * 즉시 발행 요청 입력입니다.\n */\nexport interface IssueInvoiceImmediatelyInput extends TaxInvoiceBusinessRequest {\n /**\n * 발행할 세금계산서 문서 원본입니다.\n */\n taxInvoiceDocument: TaxInvoiceDocumentInput\n /**\n * 거래명세서 동시작성 여부입니다.\n */\n writeSpecification?: boolean\n /**\n * 지연발행 허용 여부입니다.\n */\n forceIssue?: boolean\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo?: string\n /**\n * 발행 안내 메일 제목입니다.\n */\n emailSubject?: string\n /**\n * 거래명세서 관리번호입니다.\n */\n dealInvoiceManagementKey?: string\n}\n\n/**\n * 초대량 발행 접수 요청 입력입니다.\n */\nexport interface SubmitBulkIssueInput extends TaxInvoiceBusinessRequest {\n /**\n * 초대량 접수 식별자(SubmitID)입니다.\n */\n submissionIdentifier: string\n /**\n * 접수할 세금계산서 문서 목록입니다.\n */\n taxInvoiceDocuments: TaxInvoiceDocumentInput[]\n /**\n * 지연발행 허용 여부입니다.\n */\n forceIssue?: boolean\n}\n\n/**\n * 초대량 접수결과 조회 요청 입력입니다.\n */\nexport interface GetBulkIssueSubmissionResultInput extends TaxInvoiceBusinessRequest {\n /**\n * 조회할 초대량 접수 식별자(SubmitID)입니다.\n */\n submissionIdentifier: string\n}\n\n/**\n * 임시저장 요청 입력입니다.\n */\nexport interface RegisterInvoiceInput extends TaxInvoiceBusinessRequest {\n /**\n * 임시저장할 세금계산서 문서 원본입니다.\n */\n taxInvoiceDocument: TaxInvoiceDocumentInput\n}\n\n/**\n * 문서 수정 요청 입력입니다.\n */\nexport interface UpdateInvoiceInput extends TaxInvoiceDocumentRequest<TaxInvoiceOutboundDocumentKeyType> {\n /**\n * 수정 대상 문서번호 유형입니다. 매출(`SELL`) 또는 위수탁(`TRUSTEE`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceOutboundDocumentKeyType\n /**\n * 수정할 세금계산서 문서 원본입니다.\n */\n taxInvoiceDocument: TaxInvoiceDocumentInput\n}\n\n/**\n * 저장된 문서 발행 요청 입력입니다.\n */\nexport interface IssueInvoiceInput extends TaxInvoiceDocumentRequest<TaxInvoiceOutboundDocumentKeyType> {\n /**\n * 발행 대상 문서번호 유형입니다. 매출(`SELL`) 또는 위수탁(`TRUSTEE`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceOutboundDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n /**\n * 발행 안내 메일 제목입니다.\n */\n emailSubject?: string\n /**\n * 지연발행 허용 여부입니다.\n */\n forceIssue?: boolean\n}\n\n/**\n * 발행취소 요청 입력입니다.\n */\nexport interface CancelIssuedInvoiceInput extends TaxInvoiceDocumentRequest<TaxInvoiceOutboundDocumentKeyType> {\n /**\n * 발행취소 대상 문서번호 유형입니다. 매출(`SELL`) 또는 위수탁(`TRUSTEE`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceOutboundDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/**\n * 역발행 즉시 요청 입력입니다.\n */\nexport interface RequestReverseIssueImmediatelyInput extends TaxInvoiceBusinessRequest {\n /**\n * 역발행 요청할 세금계산서 문서 원본입니다.\n */\n taxInvoiceDocument: TaxInvoiceDocumentInput\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/**\n * 역발행 요청 입력입니다.\n */\nexport interface RequestReverseIssueInput extends TaxInvoiceDocumentRequest<TaxInvoiceReverseRequestDocumentKeyType> {\n /**\n * 역발행 요청 대상 문서번호 유형입니다. 매입(`BUY`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceReverseRequestDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/**\n * 역발행 요청취소 입력입니다.\n */\nexport interface CancelReverseIssueRequestInput extends TaxInvoiceDocumentRequest<TaxInvoiceReverseRequestDocumentKeyType> {\n /**\n * 역발행 요청취소 대상 문서번호 유형입니다. 매입(`BUY`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceReverseRequestDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/**\n * 역발행 요청거부 입력입니다.\n */\nexport interface RefuseReverseIssueRequestInput extends TaxInvoiceDocumentRequest<TaxInvoiceReverseRefuseDocumentKeyType> {\n /**\n * 역발행 요청거부 대상 문서번호 유형입니다. 매출(`SELL`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceReverseRefuseDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/**\n * 국세청 즉시 전송 입력입니다.\n */\nexport interface SendInvoiceToNationalTaxServiceInput extends TaxInvoiceDocumentRequest<TaxInvoiceOutboundDocumentKeyType> {\n /**\n * 국세청 전송 대상 문서번호 유형입니다. 매출(`SELL`) 또는 위수탁(`TRUSTEE`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceOutboundDocumentKeyType\n}\n\n/**\n * 다건 상태 조회 요청 입력입니다.\n */\nexport interface GetInvoicesInfoInput extends TaxInvoiceBusinessRequest {\n /**\n * 조회 대상 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TaxInvoiceDocumentKeyType\n /**\n * 조회 대상 문서번호 목록입니다.\n */\n invoiceManagementKeys: string[]\n}\n\n/**\n * 검색 요청 입력입니다.\n */\nexport interface SearchInvoicesInput extends TaxInvoiceBusinessRequest {\n /**\n * 조회 대상 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TaxInvoiceDocumentKeyType\n /**\n * 검색 기준 일자 유형입니다.\n */\n searchDateType: TaxInvoiceDateType\n /**\n * 검색 시작일자(yyyyMMdd)입니다. `Date` 입력 시 KST 기준으로 변환됩니다.\n */\n startDate: TaxInvoiceDateInput\n /**\n * 검색 종료일자(yyyyMMdd)입니다. `Date` 입력 시 KST 기준으로 변환됩니다.\n */\n endDate: TaxInvoiceDateInput\n /**\n * 세금계산서 상태코드 필터입니다. 2/3번째 자리는 와일드카드(`*`)를 허용합니다. 예) `3**`, `60*`\n */\n invoiceStateCodes: TaxInvoiceSearchStateCode[]\n /**\n * 문서 유형 필터입니다.\n */\n invoiceTypeCodes: TaxInvoiceSearchInvoiceTypeCode[]\n /**\n * 과세형태 필터입니다.\n */\n taxationTypeCodes: TaxInvoiceSearchTaxationTypeCode[]\n /**\n * 지연발행 문서만 조회할지 여부입니다.\n */\n lateIssueOnly: boolean | null\n /**\n * 정렬 방향입니다.\n */\n sortOrder: TaxInvoiceSortOrder\n /**\n * 조회할 페이지 번호입니다.\n */\n pageNumber: number\n /**\n * 페이지당 조회 건수입니다.\n */\n pageSize: number\n /**\n * 종사업장번호 주체 필터입니다.\n */\n taxRegistrationIdentifierType?: TaxInvoiceSearchTaxRegistrationIdentifierType\n /**\n * 종사업장번호 존재 여부 필터입니다.\n */\n taxRegistrationIdentifierAvailability?: TaxInvoiceSearchTaxRegistrationIdentifierAvailability\n /**\n * 종사업장번호 필터입니다.\n */\n taxRegistrationIdentifier?: string\n /**\n * 검색어(상호/사업자번호/문서번호 등)입니다.\n */\n queryText?: string\n /**\n * 작성유형(연동/API) 필터입니다.\n */\n interoperabilityType?: TaxInvoiceSearchInteroperabilityType\n /**\n * 발행형태 필터입니다.\n */\n issueTypeCodes?: TaxInvoiceSearchIssueTypeCode[]\n /**\n * 등록유형 필터입니다.\n */\n registrationTypeCodes?: TaxInvoiceSearchRegistrationTypeCode[]\n /**\n * 휴폐업상태 필터입니다.\n */\n closeDownStateCodes?: TaxInvoiceCloseDownStateCode[]\n /**\n * 문서번호 또는 국세청승인번호 필터입니다.\n */\n invoiceManagementKeyOrNationalTaxServiceConfirmationNumber?: string\n}\n\n/**\n * 문서함 URL 조회 요청 입력입니다.\n */\nexport interface GetTaxInvoiceBoxURLInput extends TaxInvoiceBusinessRequest {\n /**\n * 조회할 세금계산서 문서함 범위입니다.\n */\n taxInvoiceBoxScope: TaxInvoiceBoxScope\n}\n\n/**\n * 다건 인쇄 URL 요청 입력입니다.\n */\nexport interface GetBulkInvoicePrintURLInput extends TaxInvoiceBusinessRequest {\n /**\n * 인쇄 대상 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TaxInvoiceDocumentKeyType\n /**\n * 인쇄 대상 문서번호 목록입니다.\n */\n invoiceManagementKeys: string[]\n}\n\n/**\n * 인감 및 첨부문서 등록 URL 조회 요청 입력입니다.\n */\nexport type GetSealAndAttachmentRegistrationURLInput = TaxInvoiceBusinessRequest\n\n/**\n * 파일 경로 기반 첨부 요청 입력입니다.\n */\nexport interface AttachFileFromPathInput extends TaxInvoiceDocumentRequest {\n /**\n * 팝빌에 표시할 첨부파일명입니다.\n */\n displayName: string\n /**\n * 업로드할 파일의 로컬 경로입니다.\n */\n filePath: string\n}\n\n/**\n * 바이너리 기반 첨부 요청 입력입니다.\n */\nexport interface AttachFileFromBinaryInput extends TaxInvoiceDocumentRequest {\n /**\n * 업로드할 파일명입니다.\n */\n fileName: string\n /**\n * 업로드할 파일 바이너리 데이터입니다.\n */\n fileData: Buffer\n}\n\n/**\n * 첨부파일 삭제 요청 입력입니다.\n */\nexport interface DeleteAttachedFileInput extends TaxInvoiceDocumentRequest {\n /**\n * 삭제할 첨부파일 식별자(FileID)입니다.\n */\n fileIdentifier: string\n}\n\n/**\n * 이메일 재전송 요청 입력입니다.\n */\nexport interface ResendInvoiceEmailInput extends TaxInvoiceDocumentRequest {\n /**\n * 재전송할 수신자 이메일 주소입니다.\n */\n receiverEmailAddress: string\n}\n\n/**\n * 문자 재전송 요청 입력입니다.\n */\nexport interface ResendInvoiceSMSInput extends TaxInvoiceDocumentRequest {\n /**\n * 발신자 전화번호입니다.\n */\n senderPhoneNumber: string\n /**\n * 수신자 전화번호입니다.\n */\n receiverPhoneNumber: string\n /**\n * 재전송할 문자 본문입니다.\n */\n messageBody: string\n}\n\n/**\n * 팩스 재전송 요청 입력입니다.\n */\nexport interface ResendInvoiceFAXInput extends TaxInvoiceDocumentRequest {\n /**\n * 발신 팩스번호입니다.\n */\n senderNumber: string\n /**\n * 수신 팩스번호입니다.\n */\n receiverNumber: string\n}\n\n/**\n * 전자명세서 첨부 요청 입력입니다.\n */\nexport interface AttachInvoiceStatementInput extends TaxInvoiceDocumentRequest {\n /**\n * 첨부할 전자명세서 문서 유형 코드입니다.\n */\n statementItemCode: TaxInvoiceStatementItemCode\n /**\n * 첨부할 전자명세서 관리번호입니다.\n */\n statementManagementKey: string\n}\n\n/**\n * 전자명세서 첨부해제 요청 입력입니다.\n */\nexport interface DetachInvoiceStatementInput extends TaxInvoiceDocumentRequest {\n /**\n * 첨부해제할 전자명세서 문서 유형 코드입니다.\n */\n statementItemCode: TaxInvoiceStatementItemCode\n /**\n * 첨부해제할 전자명세서 관리번호입니다.\n */\n statementManagementKey: string\n}\n\n/**\n * 문서번호 할당 요청 입력입니다.\n */\nexport interface AssignInvoiceManagementKeyInput extends TaxInvoiceBusinessRequest {\n /**\n * 할당 대상 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TaxInvoiceDocumentKeyType\n /**\n * 팝빌 문서 식별키(ItemKey)입니다.\n */\n itemKey: string\n /**\n * 새로 할당할 문서번호입니다.\n */\n invoiceManagementKey: string\n}\n\n/**\n * 이메일 전송설정 수정 입력입니다.\n */\nexport interface UpdateEmailSendSettingsInput extends TaxInvoiceBusinessRequest {\n /**\n * 수정할 메일 전송 유형 코드입니다.\n */\n emailType: TaxInvoiceEmailType\n /**\n * 전송 활성화 여부입니다.\n */\n sendEnabled: boolean\n}\n\n/**\n * TaxInvoice modern facade 서비스 인터페이스입니다.\n *\n * 모든 메서드는 `input`만 받으며,\n * 실패 시 `PopbillApiError`를 throw 합니다.\n */\nexport interface TaxInvoiceService {\n /**\n * 등록과 동시에 세금계산서를 즉시 발행합니다.\n *\n * Compat: `registIssue`\n */\n issueInvoiceImmediately(input: IssueInvoiceImmediatelyInput): Promise<response.TaxInvoiceIssueResult>\n\n /**\n * 초대량 발행을 접수합니다.\n *\n * Compat: `bulkSubmit`\n */\n submitBulkIssue(input: SubmitBulkIssueInput): Promise<response.TaxInvoiceBulkSubmitResult>\n\n /**\n * 초대량 발행 접수결과를 조회합니다.\n *\n * Compat: `getBulkResult`\n */\n getBulkIssueSubmissionResult(input: GetBulkIssueSubmissionResultInput): Promise<response.TaxInvoiceBulkIssueSubmissionResult>\n\n /**\n * 세금계산서를 임시저장합니다.\n *\n * Compat: `register`\n */\n registerInvoice(input: RegisterInvoiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 임시저장 문서를 수정합니다.\n *\n * Compat: `update`\n */\n updateInvoice(input: UpdateInvoiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 저장된 문서를 발행합니다.\n *\n * Compat: `issue`\n */\n issueInvoice(input: IssueInvoiceInput): Promise<response.TaxInvoiceIssueResult>\n\n /**\n * 발행된 문서를 취소합니다.\n *\n * Compat: `cancelIssue`\n */\n cancelIssuedInvoice(input: CancelIssuedInvoiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 등록과 동시에 역발행 요청을 보냅니다.\n *\n * Compat: `registRequest`\n */\n requestReverseIssueImmediately(input: RequestReverseIssueImmediatelyInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 저장된 문서로 역발행 요청을 보냅니다.\n *\n * Compat: `request`\n */\n requestReverseIssue(input: RequestReverseIssueInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 역발행 요청을 취소합니다.\n *\n * Compat: `cancelRequest`\n */\n cancelReverseIssueRequest(input: CancelReverseIssueRequestInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 역발행 요청을 거부합니다.\n *\n * Compat: `refuse`\n */\n refuseReverseIssueRequest(input: RefuseReverseIssueRequestInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 문서를 삭제합니다.\n *\n * Compat: `delete`\n */\n deleteInvoice(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 문서를 국세청으로 즉시 전송합니다.\n *\n * Compat: `sendToNTS`\n */\n sendInvoiceToNTS(input: SendInvoiceToNationalTaxServiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 문서 1건의 상태 요약정보를 조회합니다.\n *\n * Compat: `getInfo`\n */\n getInvoiceInfo(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceInfo>\n\n /**\n * 문서 다건의 상태 요약정보를 조회합니다.\n *\n * Compat: `getInfos`\n */\n getInvoicesInfo(input: GetInvoicesInfoInput): Promise<response.TaxInvoiceInfo[]>\n\n /**\n * 문서 1건의 상세정보를 조회합니다.\n *\n * Compat: `getDetailInfo`\n */\n getInvoiceDetailInfo(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceDocumentOutput>\n\n /**\n * 문서번호 사용 여부를 확인합니다.\n *\n * Compat: `checkMgtKeyInUse`\n */\n checkInvoiceManagementKeyInUse(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceInvoiceManagementKeyUsage>\n\n /**\n * 문서 XML 정보를 조회합니다.\n *\n * Compat: `getXML`\n */\n getInvoiceXML(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceXmlResult>\n\n /**\n * 검색조건으로 문서를 조회합니다.\n *\n * Compat: `search`\n */\n searchInvoices(input: SearchInvoicesInput): Promise<response.TaxInvoiceSearchResult>\n\n /**\n * 문서 상태 변경이력을 조회합니다.\n *\n * Compat: `getLogs`\n */\n getInvoiceLogs(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceLogEntry[]>\n\n /**\n * 세금계산서 문서함 팝업 URL을 조회합니다.\n *\n * Compat: `getURL`\n */\n getTaxInvoiceBoxURL(input: GetTaxInvoiceBoxURLInput): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 문서 팝업 URL을 조회합니다.\n *\n * Compat: `getPopUpURL`\n */\n getInvoicePopupURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 보기 전용 팝업 URL을 조회합니다.\n *\n * Compat: `getViewURL`\n */\n getInvoiceViewURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 공급자 인쇄 팝업 URL을 조회합니다.\n *\n * Compat: `getPrintURL`\n */\n getSupplierInvoicePrintURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 공급받는자 인쇄 팝업 URL을 조회합니다.\n *\n * Compat: `getEPrintURL`\n */\n getBuyerInvoicePrintURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 다건 인쇄 팝업 URL을 조회합니다.\n *\n * Compat: `getMassPrintURL`\n */\n getBulkInvoicePrintURL(input: GetBulkInvoicePrintURLInput): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 메일 보기 URL을 조회합니다.\n *\n * Compat: `getMailURL`\n */\n getInvoiceMailURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * PDF 다운로드 URL을 조회합니다.\n *\n * Compat: `getPDFURL`\n */\n getInvoicePDFURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 인감 및 첨부문서 등록 URL을 조회합니다.\n *\n * Compat: `getSealURL`\n */\n getSealAndAttachmentRegistrationURL(input: GetSealAndAttachmentRegistrationURLInput): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 파일 경로 기반 첨부를 수행합니다.\n *\n * Compat: `attachFile`\n */\n attachFileFromPath(input: AttachFileFromPathInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 바이너리 기반 첨부를 수행합니다.\n *\n * Compat: `attachFileBinary`\n */\n attachFileFromBinary(input: AttachFileFromBinaryInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 첨부파일을 삭제합니다.\n *\n * Compat: `deleteFile`\n */\n deleteAttachedFile(input: DeleteAttachedFileInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 첨부파일 목록을 조회합니다.\n *\n * Compat: `getFiles`\n */\n getAttachedFiles(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAttachedFile[]>\n\n /**\n * 안내 메일을 재전송합니다.\n *\n * Compat: `sendEmail`\n */\n resendInvoiceEmail(input: ResendInvoiceEmailInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 안내 문자를 재전송합니다.\n *\n * Compat: `sendSMS`\n */\n resendInvoiceSMS(input: ResendInvoiceSMSInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 안내 팩스를 재전송합니다.\n *\n * Compat: `sendFAX`\n */\n resendInvoiceFAX(input: ResendInvoiceFAXInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 전자명세서를 첨부합니다.\n *\n * Compat: `attachStatement`\n */\n attachInvoiceStatement(input: AttachInvoiceStatementInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 전자명세서 첨부를 해제합니다.\n *\n * Compat: `detachStatement`\n */\n detachInvoiceStatement(input: DetachInvoiceStatementInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 문서번호를 할당합니다.\n *\n * Compat: `assignMgtKey`\n */\n assignInvoiceManagementKey(input: AssignInvoiceManagementKeyInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 이메일 발송설정을 조회합니다.\n *\n * Compat: `listEmailConfig`\n */\n getEmailSendSettings(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceEmailSendSetting[]>\n\n /**\n * 이메일 발송설정을 수정합니다.\n *\n * Compat: `updateEmailConfig`\n */\n updateEmailSendSettings(input: UpdateEmailSendSettingsInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 국세청 전송설정을 조회합니다.\n *\n * Compat: `getSendToNTSConfig`\n */\n getSendToNTSSettings(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceSendToNationalTaxServiceSetting>\n\n /**\n * 인증서 등록 URL을 조회합니다.\n *\n * Compat: `getTaxCertURL`\n */\n getTaxCertificateRegistrationURL(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 인증서 만료일을 조회합니다.\n *\n * Compat: `getCertificateExpireDate`\n */\n getTaxCertificateExpirationDate(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceTaxCertificateExpiration>\n\n /**\n * 인증서 유효성을 점검합니다.\n *\n * Compat: `checkCertValidation`\n */\n checkTaxCertificateValidation(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 인증서 정보를 조회합니다.\n *\n * Compat: `getTaxCertInfo`\n */\n getTaxCertificateInfo(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceTaxCertificateInfo>\n}\n","import { toBoolean } from '@connextable/popbill-utils'\nimport { mapTaxInvoiceInfo } from './invoice-info'\nimport { TaxInvoiceChargeDirectionValues } from '@/services/tax-invoice/types'\nimport type {\n TaxInvoiceAccessUrl,\n TaxInvoiceAttachedFile,\n TaxInvoiceBulkIssueSubmissionResult,\n TaxInvoiceBulkIssueSubmissionResultItem,\n TaxInvoiceBulkIssueSubmissionTransactionState,\n TaxInvoiceBulkSubmitResult,\n TaxInvoiceBuyerInput,\n TaxInvoiceChargeDirection,\n TaxInvoiceDocumentOutput,\n TaxInvoiceEmailSendSetting,\n TaxInvoiceInfo,\n TaxInvoiceInvoiceManagementKeyUsage,\n TaxInvoiceIssueResult,\n TaxInvoiceLogEntry,\n TaxInvoiceOperationResult,\n TaxInvoicePartyInput,\n TaxInvoiceSearchResult,\n TaxInvoiceSendToNationalTaxServiceSetting,\n TaxInvoiceTaxCertificateExpiration,\n TaxInvoiceTaxCertificateInfo,\n TaxInvoiceXmlResult,\n} from '@/services/tax-invoice/types'\nimport type * as Spec from '@connextable/popbill-spec'\n\n/**\n * 공통 API 처리결과를 도메인 처리결과로 변환합니다.\n */\nexport function mapTaxInvoiceOperationResult(\n taxInvoiceApiResponse: Spec.TaxInvoiceApiResponseBase | { code: number | string; message: string }\n): TaxInvoiceOperationResult {\n return {\n resultCode: toRequiredNumber(taxInvoiceApiResponse.code, 'code'),\n resultMessage: taxInvoiceApiResponse.message,\n }\n}\n\n/**\n * 발행 결과를 도메인 발행 결과로 변환합니다.\n */\nexport function mapTaxInvoiceIssueResult(taxInvoiceApiResponse: Spec.TaxInvoiceIssueApiResponse): TaxInvoiceIssueResult {\n return removeUndefinedProperties({\n ...mapTaxInvoiceOperationResult(taxInvoiceApiResponse),\n nationalTaxServiceConfirmationNumber: taxInvoiceApiResponse.ntsConfirmNum,\n issuedAt: taxInvoiceApiResponse.issueDT ?? undefined,\n })\n}\n\n/**\n * 초대량 접수 결과를 도메인 결과로 변환합니다.\n */\nexport function mapTaxInvoiceBulkSubmitResult(taxInvoiceApiResponse: Spec.TaxInvoiceBulkSubmitApiResponse): TaxInvoiceBulkSubmitResult {\n return removeUndefinedProperties({\n ...mapTaxInvoiceOperationResult(taxInvoiceApiResponse),\n receiptIdentifier: taxInvoiceApiResponse.receiptID,\n })\n}\n\n/**\n * 초대량 접수결과 조회 응답을 도메인 결과로 변환합니다.\n */\nexport function mapTaxInvoiceBulkIssueSubmissionResult(\n taxInvoiceApiResponse: Spec.TaxInvoiceGetBulkResultApiResponse\n): TaxInvoiceBulkIssueSubmissionResult {\n return removeUndefinedProperties({\n ...mapTaxInvoiceOperationResult(taxInvoiceApiResponse),\n receiptIdentifier: taxInvoiceApiResponse.receiptID,\n submissionIdentifier: taxInvoiceApiResponse.submitID,\n receivedAt: taxInvoiceApiResponse.receiptDT,\n submittedDocumentCount: toOptionalNumber(taxInvoiceApiResponse.submitCount),\n succeededDocumentCount: toOptionalNumber(taxInvoiceApiResponse.successCount),\n failedDocumentCount: toOptionalNumber(taxInvoiceApiResponse.failCount),\n transactionState: toTaxInvoiceBulkIssueSubmissionTransactionState(taxInvoiceApiResponse.txState),\n transactionStartedAt: taxInvoiceApiResponse.txStartDT,\n transactionCompletedAt: taxInvoiceApiResponse.txEndDT,\n transactionResultCode: toOptionalNumber(taxInvoiceApiResponse.txResultCode),\n issueResults: taxInvoiceApiResponse.issueResult?.map(mapTaxInvoiceBulkIssueSubmissionResultItem),\n })\n}\n\n/**\n * 다건 문서 요약 응답을 도메인 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceInfos(taxInvoiceApiResponse: Spec.TaxInvoiceGetInfosApiResponse): TaxInvoiceInfo[] {\n return taxInvoiceApiResponse.map(mapTaxInvoiceInfo)\n}\n\n/**\n * 문서 상세 응답을 도메인 문서 상세로 변환합니다.\n */\nexport function mapTaxInvoiceDocumentOutput(taxInvoiceApiResponse: Spec.TaxInvoiceGetDetailInfoApiResponse): TaxInvoiceDocumentOutput {\n return removeUndefinedProperties({\n writeSpecificationEnabled: taxInvoiceApiResponse.writeSpecification,\n writtenDate: taxInvoiceApiResponse.writeDate,\n chargeDirection: toTaxInvoiceChargeDirection(taxInvoiceApiResponse.chargeDirection),\n issueType: taxInvoiceApiResponse.issueType,\n purposeType: taxInvoiceApiResponse.purposeType,\n issueTimingCode: taxInvoiceApiResponse.issueTiming,\n taxType: taxInvoiceApiResponse.taxType,\n supplier: mapSupplierOutput(taxInvoiceApiResponse),\n buyer: mapBuyerOutput(taxInvoiceApiResponse),\n trustee: mapTrusteeOutput(taxInvoiceApiResponse),\n paymentSummary: removeUndefinedProperties({\n totalTaxAmount: taxInvoiceApiResponse.taxTotal,\n totalSupplyCostAmount: taxInvoiceApiResponse.supplyCostTotal,\n totalAmount: taxInvoiceApiResponse.totalAmount,\n cashAmount: taxInvoiceApiResponse.cash,\n checkAmount: taxInvoiceApiResponse.chkBill,\n promissoryNoteAmount: taxInvoiceApiResponse.note,\n creditAmount: taxInvoiceApiResponse.credit,\n }),\n modification: removeUndefinedProperties({\n modificationReasonCode: taxInvoiceApiResponse.modifyCode,\n originalNationalTaxServiceConfirmationNumber: taxInvoiceApiResponse.orgNTSConfirmNum,\n }),\n taxInvoiceSerialNumber: taxInvoiceApiResponse.serialNum,\n remarkOne: taxInvoiceApiResponse.remark1,\n remarkTwo: taxInvoiceApiResponse.remark2,\n remarkThree: taxInvoiceApiResponse.remark3,\n bookVolumeNumber: taxInvoiceApiResponse.kwon,\n bookIssueNumber: taxInvoiceApiResponse.ho,\n includeBusinessLicenseImage: toOptionalBoolean(taxInvoiceApiResponse.businessLicenseYN),\n includeBankBookImage: toOptionalBoolean(taxInvoiceApiResponse.bankBookYN),\n lineItems: taxInvoiceApiResponse.detailList?.map((lineItem) =>\n removeUndefinedProperties({\n lineNumber: lineItem.serialNum,\n transactionDate: lineItem.purchaseDT,\n itemName: lineItem.itemName,\n specification: lineItem.spec,\n quantity: lineItem.qty,\n unitCostAmount: lineItem.unitCost,\n supplyCostAmount: lineItem.supplyCost,\n taxAmount: lineItem.tax,\n remark: lineItem.remark,\n })\n ),\n additionalContacts: taxInvoiceApiResponse.addContactList?.map((additionalContact) =>\n removeUndefinedProperties({\n sequenceNumber: additionalContact.serialNum,\n contactName: additionalContact.contactName,\n emailAddress: additionalContact.email,\n })\n ),\n issuedAt: taxInvoiceApiResponse.issueDT,\n stateCode: toOptionalNumber(taxInvoiceApiResponse.stateCode),\n stateChangedAt: taxInvoiceApiResponse.stateDT,\n isLateIssued: toOptionalBoolean(taxInvoiceApiResponse.lateIssueYN),\n isOpen: toOptionalBoolean(taxInvoiceApiResponse.openYN),\n openedAt: taxInvoiceApiResponse.openDT,\n nationalTaxServiceConfirmationNumber: taxInvoiceApiResponse.ntsconfirmNum,\n nationalTaxServiceResultCode: taxInvoiceApiResponse.ntsresult,\n nationalTaxServiceSentAt: taxInvoiceApiResponse.ntssendDT,\n nationalTaxServiceResultReceivedAt: taxInvoiceApiResponse.ntsresultDT,\n nationalTaxServiceSendErrorCode: taxInvoiceApiResponse.ntssendErrCode,\n isApiLinkedDocument: toOptionalBoolean(taxInvoiceApiResponse.interOPYN),\n })\n}\n\n/**\n * 문서번호 사용 여부 응답을 도메인 결과로 변환합니다.\n */\nexport function mapTaxInvoiceInvoiceManagementKeyUsage(taxInvoiceApiResponse: boolean | { itemKey?: string }): TaxInvoiceInvoiceManagementKeyUsage {\n if (typeof taxInvoiceApiResponse === 'boolean') {\n return {\n isInUse: taxInvoiceApiResponse,\n }\n }\n\n return removeUndefinedProperties({\n isInUse: typeof taxInvoiceApiResponse.itemKey === 'string' && taxInvoiceApiResponse.itemKey.length > 0,\n itemKey: taxInvoiceApiResponse.itemKey,\n })\n}\n\n/**\n * XML 조회 응답을 도메인 결과로 변환합니다.\n */\nexport function mapTaxInvoiceXmlResult(taxInvoiceApiResponse: Spec.TaxInvoiceGetXmlApiResponse): TaxInvoiceXmlResult {\n return removeUndefinedProperties({\n operationResult:\n taxInvoiceApiResponse.code === undefined || taxInvoiceApiResponse.message === undefined\n ? undefined\n : mapTaxInvoiceOperationResult({\n code: taxInvoiceApiResponse.code,\n message: taxInvoiceApiResponse.message,\n }),\n itemKey: taxInvoiceApiResponse.itemKey,\n invoiceManagementKey: taxInvoiceApiResponse.mgtKey,\n xmlContent: taxInvoiceApiResponse.retObject,\n })\n}\n\n/**\n * 검색 응답을 도메인 검색 결과로 변환합니다.\n */\nexport function mapTaxInvoiceSearchResult(taxInvoiceApiResponse: Spec.TaxInvoiceSearchApiResponse): TaxInvoiceSearchResult {\n return removeUndefinedProperties({\n operationResult: mapTaxInvoiceOperationResult(taxInvoiceApiResponse),\n totalCount: toOptionalNumber(taxInvoiceApiResponse.total),\n pageSize: toOptionalNumber(taxInvoiceApiResponse.perPage),\n pageNumber: toOptionalNumber(taxInvoiceApiResponse.pageNum),\n pageCount: toOptionalNumber(taxInvoiceApiResponse.pageCount),\n invoiceSummaries: (taxInvoiceApiResponse.list ?? []).map(mapTaxInvoiceInfo),\n })\n}\n\n/**\n * 문서 로그 응답을 도메인 로그 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceLogs(taxInvoiceApiResponse: Spec.TaxInvoiceGetLogsApiResponse): TaxInvoiceLogEntry[] {\n return taxInvoiceApiResponse.map((logEntry) =>\n removeUndefinedProperties({\n documentLogTypeCode: toOptionalNumber(logEntry.docLogType),\n logMessage: logEntry.log,\n processTypeCode: logEntry.procType,\n processCompanyName: logEntry.procCorpName,\n processContactName: logEntry.procContactName,\n processDescription: logEntry.procMemo,\n registeredAt: logEntry.regDT,\n ipAddress: logEntry.ip,\n })\n )\n}\n\n/**\n * URL 문자열을 URL 응답으로 래핑합니다.\n */\nexport function mapTaxInvoiceAccessUrlFromString(accessUrl: string): TaxInvoiceAccessUrl {\n return { accessUrl }\n}\n\n/**\n * URL 객체를 URL 응답으로 변환합니다.\n */\nexport function mapTaxInvoiceAccessUrl(taxInvoiceApiResponse: { url: string }): TaxInvoiceAccessUrl {\n return { accessUrl: taxInvoiceApiResponse.url }\n}\n\n/**\n * 첨부파일 목록 응답을 도메인 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceAttachedFiles(taxInvoiceApiResponse: Spec.TaxInvoiceGetFilesApiResponse): TaxInvoiceAttachedFile[] {\n return taxInvoiceApiResponse.map((attachedFile) =>\n removeUndefinedProperties({\n sequenceNumber: attachedFile.serialNum,\n fileIdentifier: attachedFile.attachedFile,\n displayName: attachedFile.displayName,\n registeredAt: attachedFile.regDT,\n })\n )\n}\n\n/**\n * 이메일 전송설정 응답을 도메인 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceEmailSendSettings(taxInvoiceApiResponse: Spec.TaxInvoiceListEmailConfigApiResponse): TaxInvoiceEmailSendSetting[] {\n return taxInvoiceApiResponse.map((emailSendSetting) =>\n removeUndefinedProperties({\n emailTypeCode: emailSendSetting.emailType,\n sendEnabled: toOptionalBoolean(emailSendSetting.sendYN),\n })\n )\n}\n\n/**\n * 국세청 전송설정 응답을 도메인 설정으로 변환합니다.\n */\nexport function mapTaxInvoiceSendToNationalTaxServiceSetting(\n taxInvoiceApiResponse: Spec.TaxInvoiceGetSendToNTSConfigApiResponse\n): TaxInvoiceSendToNationalTaxServiceSetting {\n return {\n sendToNationalTaxServiceEnabled: toBoolean(taxInvoiceApiResponse.sendToNTS),\n }\n}\n\n/**\n * 인증서 만료일 문자열을 도메인 결과로 래핑합니다.\n */\nexport function mapTaxInvoiceTaxCertificateExpiration(expirationDateTime: string): TaxInvoiceTaxCertificateExpiration {\n return { expirationDateTime }\n}\n\n/**\n * 인증서 정보 응답을 도메인 정보로 변환합니다.\n */\nexport function mapTaxInvoiceTaxCertificateInfo(taxInvoiceApiResponse: Spec.TaxInvoiceGetTaxCertInfoApiResponse): TaxInvoiceTaxCertificateInfo {\n return removeUndefinedProperties({\n registeredAt: taxInvoiceApiResponse.regDT,\n expiredAt: taxInvoiceApiResponse.expireDT,\n issuerDistinguishedName: taxInvoiceApiResponse.issuerDN,\n subjectDistinguishedName: taxInvoiceApiResponse.subjectDN,\n issuerName: taxInvoiceApiResponse.issuerName,\n policyObjectIdentifier: taxInvoiceApiResponse.OID ?? taxInvoiceApiResponse.oid,\n registeredContactName: taxInvoiceApiResponse.regContactName,\n registeredContactIdentifier: taxInvoiceApiResponse.regContactID,\n })\n}\n\n/**\n * 초대량 개별 처리 결과를 도메인 항목으로 변환합니다.\n */\nfunction mapTaxInvoiceBulkIssueSubmissionResultItem(\n taxInvoiceApiResponse: NonNullable<Spec.TaxInvoiceGetBulkResultApiResponse['issueResult']>[number]\n): TaxInvoiceBulkIssueSubmissionResultItem {\n return removeUndefinedProperties({\n invoiceDocumentKeyTypeCode: taxInvoiceApiResponse.keyType,\n supplierInvoiceManagementKey: taxInvoiceApiResponse.invoicerMgtKey,\n trusteeInvoiceManagementKey: taxInvoiceApiResponse.trusteeMgtKey,\n resultCode: toOptionalNumber(taxInvoiceApiResponse.code),\n resultMessage: taxInvoiceApiResponse.message,\n nationalTaxServiceConfirmationNumber: taxInvoiceApiResponse.ntsconfirmNum,\n receivedAt: taxInvoiceApiResponse.receiptDT,\n issuedAt: taxInvoiceApiResponse.issueDT,\n })\n}\n\n/**\n * 공급자 응답 필드를 도메인 공급자 정보로 변환합니다.\n */\nfunction mapSupplierOutput(taxInvoiceApiResponse: Spec.TaxInvoiceApiModel): TaxInvoicePartyInput | undefined {\n return compactOptionalObject({\n businessNumber: taxInvoiceApiResponse.invoicerCorpNum,\n managementKey: taxInvoiceApiResponse.invoicerMgtKey,\n taxRegistrationIdentifier: taxInvoiceApiResponse.invoicerTaxRegID,\n companyName: taxInvoiceApiResponse.invoicerCorpName,\n chiefExecutiveOfficerName: taxInvoiceApiResponse.invoicerCEOName,\n address: taxInvoiceApiResponse.invoicerAddr,\n businessClass: taxInvoiceApiResponse.invoicerBizClass,\n businessType: taxInvoiceApiResponse.invoicerBizType,\n contactName: taxInvoiceApiResponse.invoicerContactName,\n telephoneNumber: taxInvoiceApiResponse.invoicerTEL,\n mobilePhoneNumber: taxInvoiceApiResponse.invoicerHP,\n emailAddress: taxInvoiceApiResponse.invoicerEmail,\n sendTextMessage: toOptionalBoolean(taxInvoiceApiResponse.invoicerSMSSendYN),\n printEnabled: toOptionalBoolean(taxInvoiceApiResponse.invoicerPrintYN),\n residentRegistrationNumber: taxInvoiceApiResponse.invoicerRDN,\n foreignerRegistrationNumber: taxInvoiceApiResponse.invoicerOLN,\n branchBusinessNumber: taxInvoiceApiResponse.invoicerTaxNum,\n branchSerialNumber: taxInvoiceApiResponse.invoicerPSerialNum,\n corporationClassification: taxInvoiceApiResponse.invoicerCorpCls,\n departmentName: taxInvoiceApiResponse.invoicerDeptName,\n })\n}\n\n/**\n * 공급받는자 응답 필드를 도메인 공급받는자 정보로 변환합니다.\n */\nfunction mapBuyerOutput(taxInvoiceApiResponse: Spec.TaxInvoiceApiModel): TaxInvoiceBuyerInput | undefined {\n return compactOptionalObject({\n recipientType: taxInvoiceApiResponse.invoiceeType,\n businessNumber: taxInvoiceApiResponse.invoiceeCorpNum,\n managementKey: taxInvoiceApiResponse.invoiceeMgtKey,\n taxRegistrationIdentifier: taxInvoiceApiResponse.invoiceeTaxRegID,\n companyName: taxInvoiceApiResponse.invoiceeCorpName,\n chiefExecutiveOfficerName: taxInvoiceApiResponse.invoiceeCEOName,\n address: taxInvoiceApiResponse.invoiceeAddr,\n businessClass: taxInvoiceApiResponse.invoiceeBizClass,\n businessType: taxInvoiceApiResponse.invoiceeBizType,\n contactName: taxInvoiceApiResponse.invoiceeContactName1,\n telephoneNumber: taxInvoiceApiResponse.invoiceeTEL1,\n mobilePhoneNumber: taxInvoiceApiResponse.invoiceeHP1,\n emailAddress: taxInvoiceApiResponse.invoiceeEmail1,\n secondaryContactName: taxInvoiceApiResponse.invoiceeContactName2,\n secondaryTelephoneNumber: taxInvoiceApiResponse.invoiceeTEL2,\n secondaryMobilePhoneNumber: taxInvoiceApiResponse.invoiceeHP2,\n secondaryEmailAddress: taxInvoiceApiResponse.invoiceeEmail2,\n sendTextMessage: toOptionalBoolean(taxInvoiceApiResponse.invoiceeSMSSendYN),\n printEnabled: toOptionalBoolean(taxInvoiceApiResponse.invoiceePrintYN),\n residentRegistrationNumber: taxInvoiceApiResponse.invoiceeRDN,\n foreignerRegistrationNumber: taxInvoiceApiResponse.invoiceeOLN,\n branchBusinessNumber: taxInvoiceApiResponse.invoiceeTaxNum,\n branchSerialNumber: taxInvoiceApiResponse.invoiceePSerialNum,\n corporationClassification: taxInvoiceApiResponse.invoiceeCorpCls,\n departmentName: taxInvoiceApiResponse.invoiceeDeptName1,\n primaryDepartmentName: taxInvoiceApiResponse.invoiceeDeptName1,\n secondaryDepartmentName: taxInvoiceApiResponse.invoiceeDeptName2,\n businessStatus: taxInvoiceApiResponse.closeDownState,\n businessStatusDate: taxInvoiceApiResponse.closeDownStateDate,\n })\n}\n\n/**\n * 수탁자 응답 필드를 도메인 수탁자 정보로 변환합니다.\n */\nfunction mapTrusteeOutput(taxInvoiceApiResponse: Spec.TaxInvoiceApiModel): TaxInvoicePartyInput | undefined {\n return compactOptionalObject({\n businessNumber: taxInvoiceApiResponse.trusteeCorpNum,\n managementKey: taxInvoiceApiResponse.trusteeMgtKey,\n taxRegistrationIdentifier: taxInvoiceApiResponse.trusteeTaxRegID,\n companyName: taxInvoiceApiResponse.trusteeCorpName,\n chiefExecutiveOfficerName: taxInvoiceApiResponse.trusteeCEOName,\n address: taxInvoiceApiResponse.trusteeAddr,\n businessClass: taxInvoiceApiResponse.trusteeBizClass,\n businessType: taxInvoiceApiResponse.trusteeBizType,\n contactName: taxInvoiceApiResponse.trusteeContactName,\n telephoneNumber: taxInvoiceApiResponse.trusteeTEL,\n mobilePhoneNumber: taxInvoiceApiResponse.trusteeHP,\n emailAddress: taxInvoiceApiResponse.trusteeEmail,\n sendTextMessage: toOptionalBoolean(taxInvoiceApiResponse.trusteeSMSSendYN),\n printEnabled: toOptionalBoolean(taxInvoiceApiResponse.trusteePrintYN),\n residentRegistrationNumber: taxInvoiceApiResponse.trusteeRDN,\n foreignerRegistrationNumber: taxInvoiceApiResponse.trusteeOLN,\n branchBusinessNumber: taxInvoiceApiResponse.trusteeTaxNum,\n branchSerialNumber: taxInvoiceApiResponse.trusteePSerialNum,\n corporationClassification: taxInvoiceApiResponse.trusteeCorpCls,\n departmentName: taxInvoiceApiResponse.trusteeDeptName,\n })\n}\n\n/**\n * 문자열/숫자 값을 숫자로 안전하게 변환합니다.\n */\nfunction toOptionalNumber(value: number | string | undefined): number | undefined {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : undefined\n }\n\n if (typeof value !== 'string' || value.trim() === '') {\n return undefined\n }\n\n const normalizedNumber = Number(value)\n return Number.isFinite(normalizedNumber) ? normalizedNumber : undefined\n}\n\nfunction toRequiredNumber(value: number | string | undefined, fieldName: string): number {\n const normalizedNumber = toOptionalNumber(value)\n if (normalizedNumber !== undefined) {\n return normalizedNumber\n }\n\n throw new Error(`유효하지 않은 ${fieldName} 응답값입니다. (${String(value)})`)\n}\n\n/**\n * 초대량 처리 상태를 지원하는 도메인 상태값으로 정규화합니다.\n */\nfunction toTaxInvoiceBulkIssueSubmissionTransactionState(\n value: number | string | undefined\n): TaxInvoiceBulkIssueSubmissionTransactionState | undefined {\n const transactionState = toOptionalNumber(value)\n return transactionState === 0 || transactionState === 1 || transactionState === 2 ? transactionState : undefined\n}\n\n/**\n * 불리언 문자열/값을 불리언으로 안전하게 변환합니다.\n */\nfunction toOptionalBoolean(value: boolean | string | undefined): boolean | undefined {\n if (value === undefined) {\n return undefined\n }\n\n return toBoolean(value)\n}\n\n/**\n * 과금 방향 문자열을 도메인 과금 방향으로 안전하게 정규화합니다.\n */\nfunction toTaxInvoiceChargeDirection(chargeDirection: string | undefined): TaxInvoiceChargeDirection | undefined {\n if (chargeDirection === TaxInvoiceChargeDirectionValues.NormalCharge) {\n return TaxInvoiceChargeDirectionValues.NormalCharge\n }\n\n if (chargeDirection === TaxInvoiceChargeDirectionValues.ReverseCharge) {\n return TaxInvoiceChargeDirectionValues.ReverseCharge\n }\n\n return undefined\n}\n\n/**\n * 모든 필드가 비어있으면 `undefined`를 반환하고, 아니면 정리된 객체를 반환합니다.\n */\nfunction compactOptionalObject<T extends Record<string, unknown>>(sourceObject: T): T | undefined {\n const normalizedObject = removeUndefinedProperties(sourceObject)\n return Object.keys(normalizedObject).length === 0 ? undefined : normalizedObject\n}\n\n/**\n * 객체에서 `undefined` 값만 제거합니다.\n */\nfunction removeUndefinedProperties<T extends Record<string, unknown>>(sourceObject: T): T {\n const definedEntries = Object.entries(sourceObject).filter(([, value]) => value !== undefined)\n return Object.fromEntries(definedEntries) as T\n}\n","import { invokeTaxInvoiceMethod } from './adapters/error'\nimport * as documentMappers from './mappers/document'\nimport * as invoiceInfoMappers from './mappers/invoice-info'\nimport * as responseMappers from './mappers/response'\nimport * as taxInvoiceTypes from './types'\nimport { createInputValidationError } from '@connextable/popbill-compat/errors'\nimport type { TaxinvoicePromiseService as CompatTaxInvoiceService } from '@connextable/popbill-compat/factory'\nimport { PopbillErrorStage, type PopbillApiError } from '@/errors'\n\nconst KOREA_TIME_ZONE = 'Asia/Seoul'\nconst SEARCH_STATE_CODE_PATTERN = /^\\d[\\d*][\\d*]$/\nconst KOREA_DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n timeZone: KOREA_TIME_ZONE,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n})\nconst SEARCH_INVOICES_OPERATION = 'taxInvoice.searchInvoices'\n\ninterface CreateTaxInvoiceServiceInput {\n compatTaxInvoiceService: CompatTaxInvoiceService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\n/**\n * TaxInvoice modern facade 서비스를 생성합니다.\n *\n * 입력 DTO를 compat positional 인자로 변환하고,\n * compat 에러를 `PopbillApiError`로 표준화하여 재throw 합니다.\n */\nexport function createTaxInvoiceService(input: CreateTaxInvoiceServiceInput): taxInvoiceTypes.TaxInvoiceService {\n const compatTaxInvoiceService = input.compatTaxInvoiceService\n\n return {\n issueInvoiceImmediately(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.issueInvoiceImmediately', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.registIssue(\n request.businessNumber,\n documentMappers.mapTaxInvoiceDocument(request.taxInvoiceDocument),\n request.writeSpecification,\n request.forceIssue,\n request.historyMemo,\n request.emailSubject,\n request.dealInvoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceIssueResult(taxInvoiceApiResponse)\n })\n },\n\n submitBulkIssue(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.submitBulkIssue', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.bulkSubmit(\n request.businessNumber,\n request.submissionIdentifier,\n documentMappers.mapTaxInvoiceDocuments(request.taxInvoiceDocuments),\n request.forceIssue,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceBulkSubmitResult(taxInvoiceApiResponse)\n })\n },\n\n getBulkIssueSubmissionResult(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getBulkIssueSubmissionResult', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getBulkResult(\n request.businessNumber,\n request.submissionIdentifier,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceBulkIssueSubmissionResult(taxInvoiceApiResponse)\n })\n },\n\n registerInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.registerInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.register(\n request.businessNumber,\n documentMappers.mapTaxInvoiceDocument(request.taxInvoiceDocument),\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n updateInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.updateInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.update(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n documentMappers.mapTaxInvoiceDocument(request.taxInvoiceDocument),\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n issueInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.issueInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.issue(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n request.emailSubject,\n request.forceIssue,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceIssueResult(taxInvoiceApiResponse)\n })\n },\n\n cancelIssuedInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.cancelIssuedInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.cancelIssue(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n requestReverseIssueImmediately(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.requestReverseIssueImmediately', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.registRequest(\n request.businessNumber,\n documentMappers.mapTaxInvoiceDocument(request.taxInvoiceDocument),\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n requestReverseIssue(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.requestReverseIssue', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.request(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n cancelReverseIssueRequest(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.cancelReverseIssueRequest', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.cancelRequest(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n refuseReverseIssueRequest(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.refuseReverseIssueRequest', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.refuse(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n deleteInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.deleteInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.delete(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n sendInvoiceToNTS(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.sendInvoiceToNTS', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.sendToNTS(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n async getInvoiceInfo(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceInfo', async () => {\n const apiResponse = await compatTaxInvoiceService.getInfo(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return invoiceInfoMappers.mapTaxInvoiceInfo(apiResponse)\n })\n },\n\n getInvoicesInfo(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoicesInfo', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getInfos(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKeys,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceInfos(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceDetailInfo(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceDetailInfo', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getDetailInfo(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceDocumentOutput(taxInvoiceApiResponse)\n })\n },\n\n checkInvoiceManagementKeyInUse(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.checkInvoiceManagementKeyInUse', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.checkMgtKeyInUse(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceInvoiceManagementKeyUsage(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceXML(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceXML', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getXML(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceXmlResult(taxInvoiceApiResponse)\n })\n },\n\n searchInvoices(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.searchInvoices', async () => {\n const normalizedSearchRequest = normalizeSearchInvoicesRequest(request)\n const taxInvoiceApiResponse = await compatTaxInvoiceService.search(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n normalizedSearchRequest.searchDateType,\n normalizedSearchRequest.startDate,\n normalizedSearchRequest.endDate,\n normalizedSearchRequest.invoiceStateCodes,\n normalizedSearchRequest.invoiceTypeCodes,\n normalizedSearchRequest.taxationTypeCodes,\n normalizedSearchRequest.lateIssueOnly,\n normalizedSearchRequest.sortOrder,\n normalizedSearchRequest.pageNumber,\n normalizedSearchRequest.pageSize,\n normalizedSearchRequest.taxRegistrationIdentifierType,\n normalizedSearchRequest.taxRegistrationIdentifierAvailability,\n normalizedSearchRequest.taxRegistrationIdentifier,\n normalizedSearchRequest.queryText,\n normalizedSearchRequest.interoperabilityType,\n input.defaultUserId,\n normalizedSearchRequest.issueTypeCodes,\n normalizedSearchRequest.registrationTypeCodes,\n toCompatCloseDownStateCodes(normalizedSearchRequest.closeDownStateCodes),\n normalizedSearchRequest.invoiceManagementKeyOrNationalTaxServiceConfirmationNumber\n )\n\n return responseMappers.mapTaxInvoiceSearchResult(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceLogs(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceLogs', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getLogs(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceLogs(taxInvoiceApiResponse)\n })\n },\n\n getTaxInvoiceBoxURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getTaxInvoiceBoxURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getURL(request.businessNumber, request.taxInvoiceBoxScope, input.defaultUserId)\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getInvoicePopupURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoicePopupURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getPopUpURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceViewURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceViewURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getViewURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getSupplierInvoicePrintURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getSupplierInvoicePrintURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getPrintURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getBuyerInvoicePrintURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getBuyerInvoicePrintURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getEPrintURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getBulkInvoicePrintURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getBulkInvoicePrintURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getMassPrintURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKeys,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceMailURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceMailURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getMailURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getInvoicePDFURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoicePDFURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getPDFURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getSealAndAttachmentRegistrationURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getSealAndAttachmentRegistrationURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getSealURL(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceAccessUrl(taxInvoiceApiResponse)\n })\n },\n\n attachFileFromPath(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.attachFileFromPath', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.attachFile(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.displayName,\n request.filePath,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n attachFileFromBinary(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.attachFileFromBinary', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.attachFileBinary(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n {\n fileName: request.fileName,\n fileData: request.fileData,\n },\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n deleteAttachedFile(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.deleteAttachedFile', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.deleteFile(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.fileIdentifier,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n getAttachedFiles(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getAttachedFiles', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getFiles(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAttachedFiles(taxInvoiceApiResponse)\n })\n },\n\n resendInvoiceEmail(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.resendInvoiceEmail', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.sendEmail(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.receiverEmailAddress,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n resendInvoiceSMS(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.resendInvoiceSMS', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.sendSMS(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.senderPhoneNumber,\n request.receiverPhoneNumber,\n request.messageBody,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n resendInvoiceFAX(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.resendInvoiceFAX', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.sendFAX(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.senderNumber,\n request.receiverNumber,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n attachInvoiceStatement(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.attachInvoiceStatement', async () => {\n const statementItemCode = normalizeStatementItemCode(request.statementItemCode, 'taxInvoice.attachInvoiceStatement')\n const taxInvoiceApiResponse = await compatTaxInvoiceService.attachStatement(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n statementItemCode,\n request.statementManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n detachInvoiceStatement(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.detachInvoiceStatement', async () => {\n const statementItemCode = normalizeStatementItemCode(request.statementItemCode, 'taxInvoice.detachInvoiceStatement')\n const taxInvoiceApiResponse = await compatTaxInvoiceService.detachStatement(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n statementItemCode,\n request.statementManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n assignInvoiceManagementKey(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.assignInvoiceManagementKey', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.assignMgtKey(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.itemKey,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n getEmailSendSettings(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getEmailSendSettings', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.listEmailConfig(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceEmailSendSettings(taxInvoiceApiResponse)\n })\n },\n\n updateEmailSendSettings(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.updateEmailSendSettings', async () => {\n const emailType = normalizeEmailType(request.emailType, 'taxInvoice.updateEmailSendSettings')\n const taxInvoiceApiResponse = await compatTaxInvoiceService.updateEmailConfig(\n request.businessNumber,\n emailType,\n request.sendEnabled,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n getSendToNTSSettings(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getSendToNTSSettings', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getSendToNTSConfig(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceSendToNationalTaxServiceSetting(taxInvoiceApiResponse)\n })\n },\n\n getTaxCertificateRegistrationURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getTaxCertificateRegistrationURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getTaxCertURL(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceAccessUrl(taxInvoiceApiResponse)\n })\n },\n\n getTaxCertificateExpirationDate(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getTaxCertificateExpirationDate', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getCertificateExpireDate(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceTaxCertificateExpiration(taxInvoiceApiResponse)\n })\n },\n\n checkTaxCertificateValidation(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.checkTaxCertificateValidation', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.checkCertValidation(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n getTaxCertificateInfo(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getTaxCertificateInfo', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getTaxCertInfo(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceTaxCertificateInfo(taxInvoiceApiResponse)\n })\n },\n }\n}\n\ninterface NormalizedSearchInvoicesRequest {\n searchDateType: taxInvoiceTypes.TaxInvoiceDateType\n startDate: string\n endDate: string\n invoiceStateCodes: taxInvoiceTypes.TaxInvoiceSearchStateCode[]\n invoiceTypeCodes: taxInvoiceTypes.TaxInvoiceSearchInvoiceTypeCode[]\n taxationTypeCodes: taxInvoiceTypes.TaxInvoiceSearchTaxationTypeCode[]\n lateIssueOnly: boolean | null\n sortOrder: taxInvoiceTypes.TaxInvoiceSortOrder\n pageNumber: number\n pageSize: number\n taxRegistrationIdentifierType?: taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierType\n taxRegistrationIdentifierAvailability?: taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierAvailability\n taxRegistrationIdentifier?: string\n queryText?: string\n interoperabilityType?: taxInvoiceTypes.TaxInvoiceSearchInteroperabilityType\n issueTypeCodes?: taxInvoiceTypes.TaxInvoiceSearchIssueTypeCode[]\n registrationTypeCodes?: taxInvoiceTypes.TaxInvoiceSearchRegistrationTypeCode[]\n closeDownStateCodes?: taxInvoiceTypes.TaxInvoiceCloseDownStateCode[]\n invoiceManagementKeyOrNationalTaxServiceConfirmationNumber?: string\n}\n\nfunction normalizeSearchInvoicesRequest(request: taxInvoiceTypes.SearchInvoicesInput): NormalizedSearchInvoicesRequest {\n return {\n searchDateType: normalizeCodeValue(\n request.searchDateType,\n Object.values(taxInvoiceTypes.TaxInvoiceDateType),\n 'searchDateType',\n SEARCH_INVOICES_OPERATION\n ),\n startDate: normalizeSearchDateInput(request.startDate, 'startDate', SEARCH_INVOICES_OPERATION),\n endDate: normalizeSearchDateInput(request.endDate, 'endDate', SEARCH_INVOICES_OPERATION),\n invoiceStateCodes: normalizeSearchStateCodes(request.invoiceStateCodes),\n invoiceTypeCodes: normalizeCodeArray(\n request.invoiceTypeCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchInvoiceTypeCodes),\n 'invoiceTypeCodes',\n SEARCH_INVOICES_OPERATION\n ),\n taxationTypeCodes: normalizeCodeArray(\n request.taxationTypeCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchTaxationTypeCodes),\n 'taxationTypeCodes',\n SEARCH_INVOICES_OPERATION\n ),\n lateIssueOnly: request.lateIssueOnly,\n sortOrder: normalizeCodeValue(request.sortOrder, Object.values(taxInvoiceTypes.TaxInvoiceSortOrder), 'sortOrder', SEARCH_INVOICES_OPERATION),\n pageNumber: request.pageNumber,\n pageSize: request.pageSize,\n taxRegistrationIdentifierType: normalizeOptionalCodeValue(\n request.taxRegistrationIdentifierType,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierTypes),\n 'taxRegistrationIdentifierType',\n SEARCH_INVOICES_OPERATION\n ),\n taxRegistrationIdentifierAvailability: normalizeOptionalCodeValue(\n request.taxRegistrationIdentifierAvailability,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities),\n 'taxRegistrationIdentifierAvailability',\n SEARCH_INVOICES_OPERATION\n ),\n taxRegistrationIdentifier: request.taxRegistrationIdentifier,\n queryText: request.queryText,\n interoperabilityType: normalizeOptionalCodeValue(\n request.interoperabilityType,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchInteroperabilityTypes),\n 'interoperabilityType',\n SEARCH_INVOICES_OPERATION\n ),\n issueTypeCodes: normalizeOptionalCodeArray(\n request.issueTypeCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchIssueTypeCodes),\n 'issueTypeCodes',\n SEARCH_INVOICES_OPERATION\n ),\n registrationTypeCodes: normalizeOptionalCodeArray(\n request.registrationTypeCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchRegistrationTypeCodes),\n 'registrationTypeCodes',\n SEARCH_INVOICES_OPERATION\n ),\n closeDownStateCodes: normalizeOptionalCodeArray(\n request.closeDownStateCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceCloseDownStateCodes),\n 'closeDownStateCodes',\n SEARCH_INVOICES_OPERATION\n ),\n invoiceManagementKeyOrNationalTaxServiceConfirmationNumber: request.invoiceManagementKeyOrNationalTaxServiceConfirmationNumber,\n }\n}\n\nfunction toCompatCloseDownStateCodes(\n closeDownStateCodes: taxInvoiceTypes.TaxInvoiceCloseDownStateCode[] | undefined\n): (0 | 1 | 2 | 3 | 4)[] | undefined {\n return closeDownStateCodes as unknown as (0 | 1 | 2 | 3 | 4)[] | undefined\n}\n\nfunction normalizeSearchStateCodes(searchStateCodes: unknown): taxInvoiceTypes.TaxInvoiceSearchStateCode[] {\n if (!Array.isArray(searchStateCodes)) {\n throw createInputValidationError('invoiceStateCodes는 배열이어야 해.', {\n operation: SEARCH_INVOICES_OPERATION,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n return searchStateCodes.map((searchStateCode, index) => {\n if (typeof searchStateCode !== 'string' || !SEARCH_STATE_CODE_PATTERN.test(searchStateCode)) {\n throw createInputValidationError(\n `invoiceStateCodes[${index}]에 유효하지 않은 상태코드가 있어. 허용 패턴: 숫자 3자리 또는 2/3자리 와일드카드 (예: 300, 3**, 60*)`,\n {\n operation: SEARCH_INVOICES_OPERATION,\n stage: PopbillErrorStage.ValidateInput,\n }\n )\n }\n\n return searchStateCode\n })\n}\n\nfunction normalizeSearchDateInput(dateInput: taxInvoiceTypes.TaxInvoiceDateInput, fieldName: string, operation: string): string {\n if (dateInput instanceof Date) {\n if (!Number.isFinite(dateInput.getTime())) {\n throw createInputValidationError(`${fieldName}는 유효한 Date여야 해.`, {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n return formatDateToKoreaDateString(dateInput)\n }\n\n if (typeof dateInput !== 'string') {\n throw createInputValidationError(`${fieldName}는 yyyyMMdd 문자열 또는 Date여야 해.`, {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n const normalizedDateInput = dateInput.trim()\n if (!isValidDateString(normalizedDateInput)) {\n throw createInputValidationError(`${fieldName}는 yyyyMMdd 형식의 유효한 날짜여야 해.`, {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n return normalizedDateInput\n}\n\nfunction formatDateToKoreaDateString(date: Date): string {\n let year = ''\n let month = ''\n let day = ''\n\n for (const datePart of KOREA_DATE_FORMATTER.formatToParts(date)) {\n if (datePart.type === 'year') {\n year = datePart.value\n continue\n }\n\n if (datePart.type === 'month') {\n month = datePart.value\n continue\n }\n\n if (datePart.type === 'day') {\n day = datePart.value\n }\n }\n\n return `${year}${month}${day}`\n}\n\nfunction isValidDateString(dateString: string): boolean {\n const match = /^(\\d{4})(\\d{2})(\\d{2})$/.exec(dateString)\n if (!match) {\n return false\n }\n\n const year = Number(match[1])\n const month = Number(match[2])\n const day = Number(match[3])\n const normalizedDate = new Date(Date.UTC(year, month - 1, day))\n\n return normalizedDate.getUTCFullYear() === year && normalizedDate.getUTCMonth() === month - 1 && normalizedDate.getUTCDate() === day\n}\n\nfunction normalizeStatementItemCode(\n statementItemCode: unknown,\n operation: 'taxInvoice.attachInvoiceStatement' | 'taxInvoice.detachInvoiceStatement'\n): taxInvoiceTypes.TaxInvoiceStatementItemCode {\n return normalizeCodeValue(statementItemCode, Object.values(taxInvoiceTypes.TaxInvoiceStatementItemCodes), 'statementItemCode', operation)\n}\n\nfunction normalizeEmailType(emailType: unknown, operation: 'taxInvoice.updateEmailSendSettings'): taxInvoiceTypes.TaxInvoiceEmailType {\n return normalizeCodeValue(emailType, Object.values(taxInvoiceTypes.TaxInvoiceEmailTypes), 'emailType', operation)\n}\n\nfunction normalizeOptionalCodeValue<T extends string | number>(\n codeValue: unknown,\n allowedValues: readonly T[],\n fieldName: string,\n operation: string\n): T | undefined {\n if (codeValue === undefined) {\n return undefined\n }\n\n return normalizeCodeValue(codeValue, allowedValues, fieldName, operation)\n}\n\nfunction normalizeOptionalCodeArray<T extends string | number>(\n codeValues: unknown,\n allowedValues: readonly T[],\n fieldName: string,\n operation: string\n): T[] | undefined {\n if (codeValues === undefined) {\n return undefined\n }\n\n return normalizeCodeArray(codeValues, allowedValues, fieldName, operation)\n}\n\nfunction normalizeCodeArray<T extends string | number>(codeValues: unknown, allowedValues: readonly T[], fieldName: string, operation: string): T[] {\n if (!Array.isArray(codeValues)) {\n throw createInputValidationError(`${fieldName}는 배열이어야 해.`, {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n return codeValues.map((codeValue, index) => normalizeCodeValue(codeValue, allowedValues, `${fieldName}[${index}]`, operation))\n}\n\nfunction normalizeCodeValue<T extends string | number>(codeValue: unknown, allowedValues: readonly T[], fieldName: string, operation: string): T {\n for (const allowedValue of allowedValues) {\n if (codeValue === allowedValue) {\n return allowedValue\n }\n }\n\n throw createInputValidationError(\n `${fieldName}에 유효하지 않은 값이 있어. 허용값: ${allowedValues.map((allowedValue) => String(allowedValue)).join(', ')} (입력값: ${String(codeValue)})`,\n {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n }\n )\n}\n","import { createTaxinvoicePromiseService, type CompatConfig, type TaxinvoicePromiseService } from '@connextable/popbill-compat/factory'\nimport { normalizeOptionalString } from '@connextable/popbill-utils'\n\nconst DEFAULT_REQUEST_TIMEOUT_MILLISECONDS = 180_000\nconst DEFAULT_ACCEPT_ENCODING = 'gzip'\n\n/**\n * TaxInvoice compat service 생성을 위한 입력 설정입니다.\n */\nexport interface CreateCompatTaxInvoiceServiceInput {\n linkId: string\n secretKey: string\n isTest?: boolean\n useStaticIp?: boolean\n useGaIp?: boolean\n useLocalTime?: boolean\n ipRestrictOnOff?: boolean\n requestTimeoutMilliseconds?: number\n acceptLanguage?: string\n acceptEncoding?: string | null\n}\n\n/**\n * `@connextable/popbill-compat` Taxinvoice promise 서비스를 client 단위 인스턴스로 생성합니다.\n */\nexport function createCompatTaxInvoiceService(input: CreateCompatTaxInvoiceServiceInput): TaxinvoicePromiseService {\n const compatConfig: CompatConfig = {\n LinkID: input.linkId,\n SecretKey: input.secretKey,\n IsTest: input.isTest ?? false,\n UseStaticIP: input.useStaticIp ?? false,\n UseGAIP: input.useGaIp ?? false,\n UseLocalTimeYN: input.useLocalTime ?? true,\n IPRestrictOnOff: input.ipRestrictOnOff ?? true,\n requestTimeoutMs: input.requestTimeoutMilliseconds ?? DEFAULT_REQUEST_TIMEOUT_MILLISECONDS,\n acceptLanguage: normalizeOptionalString(input.acceptLanguage),\n acceptEncoding: input.acceptEncoding === undefined ? DEFAULT_ACCEPT_ENCODING : input.acceptEncoding,\n }\n\n return createTaxinvoicePromiseService(compatConfig)\n}\n","import type { PopbillClient, PopbillClientConfig } from './types'\nimport { createTaxInvoiceService } from '@/services/tax-invoice'\nimport { createCompatTaxInvoiceService } from '@/internal/compat'\nimport type { PopbillApiError } from '@/errors'\nimport { normalizeOptionalString, normalizeRequiredString } from '@connextable/popbill-utils'\n\nconst DEFAULT_REQUEST_TIMEOUT_MILLISECONDS = 180_000\nconst MAX_REQUEST_TIMEOUT_MILLISECONDS = 2_147_483_647\nconst DEFAULT_ACCEPT_ENCODING = 'gzip'\n\ninterface ResolvedPopbillClientConfig {\n linkId: string\n secretKey: string\n userId: string\n isTest: boolean\n useStaticIp: boolean\n useGaIp: boolean\n useLocalTime: boolean\n ipRestrictOnOff: boolean\n acceptEncoding: string | null\n acceptLanguage?: string\n requestTimeoutMilliseconds: number\n onError?: (error: PopbillApiError) => void\n}\n\n/**\n * modern Popbill client를 생성합니다.\n */\nexport function createPopbillClient(config: PopbillClientConfig): PopbillClient {\n const normalizedConfig = normalizeClientConfiguration(config)\n const compatTaxInvoiceService = createCompatTaxInvoiceService(normalizedConfig)\n\n const taxInvoiceService = createTaxInvoiceService({\n compatTaxInvoiceService,\n defaultUserId: normalizedConfig.userId,\n onError: normalizedConfig.onError,\n })\n\n return {\n services: {\n taxInvoice: taxInvoiceService,\n },\n }\n}\n\n/**\n * 입력 설정을 런타임 안전성 기준으로 정규화합니다.\n */\nfunction normalizeClientConfiguration(config: PopbillClientConfig): ResolvedPopbillClientConfig {\n const linkId = normalizeRequiredString(config.linkId, 'linkId는 필수입니다.')\n const secretKey = normalizeRequiredString(config.secretKey, 'secretKey는 필수입니다.')\n const userId = normalizeRequiredString(config.userId, 'userId는 필수입니다.')\n\n return {\n linkId,\n secretKey,\n userId,\n isTest: config.isTest ?? false,\n useStaticIp: config.useStaticIp ?? false,\n useGaIp: config.useGaIp ?? false,\n useLocalTime: config.useLocalTime ?? true,\n ipRestrictOnOff: config.ipRestrictOnOff ?? true,\n acceptEncoding: config.acceptEncoding === undefined ? DEFAULT_ACCEPT_ENCODING : config.acceptEncoding,\n acceptLanguage: normalizeOptionalString(config.acceptLanguage),\n requestTimeoutMilliseconds: normalizeRequestTimeoutMilliseconds(config.requestTimeoutMs),\n onError: config.onError,\n }\n}\n\nfunction normalizeRequestTimeoutMilliseconds(requestTimeoutMs: number | undefined): number {\n if (requestTimeoutMs === undefined) {\n return DEFAULT_REQUEST_TIMEOUT_MILLISECONDS\n }\n\n if (!Number.isInteger(requestTimeoutMs) || requestTimeoutMs <= 0 || requestTimeoutMs > MAX_REQUEST_TIMEOUT_MILLISECONDS) {\n throw new Error(`requestTimeoutMs는 1 이상 ${MAX_REQUEST_TIMEOUT_MILLISECONDS} 이하의 정수여야 합니다.`)\n }\n\n return requestTimeoutMs\n}\n","import type { TaxInvoiceService } from './types'\n\n/**\n * TaxInvoice modern facade 공개 메서드 목록입니다.\n * 문서 섹션(발행/전송, 정보확인, 보기/인쇄, 부가기능, 인증서 관리) 순서를 유지합니다.\n */\nexport const TAX_INVOICE_METHODS = [\n // 발행/전송\n 'issueInvoiceImmediately',\n 'submitBulkIssue',\n 'getBulkIssueSubmissionResult',\n 'registerInvoice',\n 'updateInvoice',\n 'issueInvoice',\n 'cancelIssuedInvoice',\n 'requestReverseIssueImmediately',\n 'requestReverseIssue',\n 'cancelReverseIssueRequest',\n 'refuseReverseIssueRequest',\n 'deleteInvoice',\n 'sendInvoiceToNTS',\n\n // 정보확인\n 'getInvoiceInfo',\n 'getInvoicesInfo',\n 'getInvoiceDetailInfo',\n 'checkInvoiceManagementKeyInUse',\n 'getInvoiceXML',\n 'searchInvoices',\n 'getInvoiceLogs',\n 'getTaxInvoiceBoxURL',\n\n // 보기/인쇄\n 'getInvoicePopupURL',\n 'getInvoiceViewURL',\n 'getSupplierInvoicePrintURL',\n 'getBuyerInvoicePrintURL',\n 'getBulkInvoicePrintURL',\n 'getInvoiceMailURL',\n 'getInvoicePDFURL',\n\n // 부가기능\n 'getSealAndAttachmentRegistrationURL',\n 'attachFileFromPath',\n 'attachFileFromBinary',\n 'deleteAttachedFile',\n 'getAttachedFiles',\n 'resendInvoiceEmail',\n 'resendInvoiceSMS',\n 'resendInvoiceFAX',\n 'attachInvoiceStatement',\n 'detachInvoiceStatement',\n 'assignInvoiceManagementKey',\n 'getEmailSendSettings',\n 'updateEmailSendSettings',\n 'getSendToNTSSettings',\n\n // 인증서 관리\n 'getTaxCertificateRegistrationURL',\n 'getTaxCertificateExpirationDate',\n 'checkTaxCertificateValidation',\n 'getTaxCertificateInfo',\n] as const satisfies readonly (keyof TaxInvoiceService)[]\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["operation","invokeCommonMethod","map.operation","map.company","map.contact","map.payment","map.page","map.use","map.refund","invalid","mapLineItem","documentMappers.mapTaxInvoiceDocument","responseMappers.mapTaxInvoiceIssueResult","documentMappers.mapTaxInvoiceDocuments","responseMappers.mapTaxInvoiceBulkSubmitResult","responseMappers.mapTaxInvoiceBulkIssueSubmissionResult","responseMappers.mapTaxInvoiceOperationResult","invoiceInfoMappers.mapTaxInvoiceInfo","responseMappers.mapTaxInvoiceInfos","responseMappers.mapTaxInvoiceDocumentOutput","responseMappers.mapTaxInvoiceInvoiceManagementKeyUsage","responseMappers.mapTaxInvoiceXmlResult","documentMappers.mapTaxInvoicePdfPrintCopy","responseMappers.mapTaxInvoicePdfDocument","responseMappers.mapTaxInvoiceSearchResult","responseMappers.mapTaxInvoiceLogs","responseMappers.mapTaxInvoiceAccessUrlFromString","responseMappers.mapTaxInvoiceAccessUrl","responseMappers.mapTaxInvoiceAttachedFiles","responseMappers.mapTaxInvoiceEmailSendSettings","responseMappers.mapTaxInvoiceSendToNationalTaxServiceSetting","responseMappers.mapTaxInvoiceEmailPublicKeys","responseMappers.mapTaxInvoiceTaxCertificateExpiration","responseMappers.mapTaxInvoiceTaxCertificateInfo","responseMappers.mapTaxInvoiceChargeInfo","responseMappers.mapTaxInvoiceUnitCost","taxInvoiceTypes.TaxInvoiceDateType","taxInvoiceTypes.TaxInvoiceSearchInvoiceTypeCodes","taxInvoiceTypes.TaxInvoiceSearchTaxationTypeCodes","taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierTypes","taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities","taxInvoiceTypes.TaxInvoiceSearchInteroperabilityTypes","taxInvoiceTypes.TaxInvoiceSearchIssueTypeCodes","taxInvoiceTypes.TaxInvoiceSearchRegistrationTypeCodes","taxInvoiceTypes.TaxInvoiceCloseDownStateCodes","taxInvoiceTypes.TaxInvoiceSortOrder","taxInvoiceTypes.TaxInvoiceStatementItemCodes","taxInvoiceTypes.TaxInvoiceEmailTypes","invokeCashbillMethod","mappers.mapCashbillIssueResult","mappers.mapCashbillBulkSubmissionResult","mappers.mapCashbillBulkResult","mappers.mapCashbillOperationResult","mappers.mapCashbillInfo","mappers.mapCashbillDocumentOutput","mappers.mapCashbillSearchResult","mappers.mapCashbillLog","mappers.mapCashbillAccessUrl","mappers.mapCashbillEmailSendSetting","mappers.mapCashbillChargeInfo","types.CashbillDateType","types.CashbillSortOrder","invokeStatementMethod","mappers.mapStatementIssueResult","mappers.mapStatementOperationResult","statementInfoMappers.mapStatementInfo","mappers.mapStatementDocumentOutput","mappers.mapStatementSearchResult","mappers.mapStatementLog","mappers.mapStatementAccessUrl","mappers.mapStatementAttachedFile","mappers.mapStatementEmailSendSetting","mappers.mapStatementChargeInfo","types.StatementDateType","types.StatementItemCodes","types.StatementSortOrder","mapOperation","mapSummary","mapFlatRateState","mappers.mapOperation","mappers.mapJob","mappers.mapSearch","mappers.mapTotals","mappers.mapDocument","mappers.mapFlatRateState","PopbillErrorStage","normalizeSearch","mapSearchResult","mapSummary","invokeHomeTaxCashbillMethod","mappers.mapCollectionJobState","normalizeSearch","mappers.mapSearchResult","mappers.mapSummary","mappers.mapFlatRateState","invokeClosedownMethod","invokeBizInfoCheckMethod","invokeEasyFinBankMethod","mappers.mapOperation","mappers.mapBankAccount","mappers.mapCollectionStatus","mappers.mapSearchResult","mappers.mapSummary","mappers.mapSubscription","mappers.mapChargeInfo","invokeAccountCheckMethod","invokeKakaoMethod","map.channel","map.sender","map.operation","map.notificationTemplate","map.brandTemplate","map.image","map.messages","map.search","invokeMessageMethod","invokeFaxMethod","bridges.createCompatCommonService","bridges.createCompatTaxInvoiceService","bridges.createCompatCashbillService","bridges.createCompatStatementService","bridges.createCompatHomeTaxTaxInvoiceService","bridges.createCompatHomeTaxCashbillService","bridges.createCompatClosedownService","bridges.createCompatBizInfoCheckService","bridges.createCompatEasyFinBankService","bridges.createCompatAccountCheckService","bridges.createCompatKakaoService","bridges.createCompatMessageService","bridges.createCompatFaxService"],"sources":["../src/internal/lookup-service.ts","../src/services/common/mappers/document.ts","../src/services/common/mappers/response.ts","../src/services/common/service.ts","../src/services/common/methods.ts","../src/services/tax-invoice/adapters/error.ts","../src/services/tax-invoice/mappers/document.ts","../src/services/tax-invoice/mappers/invoice-info.ts","../src/services/tax-invoice/mappers/response.ts","../src/services/tax-invoice/types/document.ts","../src/services/tax-invoice/types/response.ts","../src/services/tax-invoice/types/index.ts","../src/services/tax-invoice/service.ts","../src/services/cashbill/mappers/document.ts","../src/services/cashbill/mappers/response.ts","../src/services/cashbill/types/document.ts","../src/services/cashbill/types/index.ts","../src/services/cashbill/service.ts","../src/services/cashbill/methods.ts","../src/services/statement/mappers/document.ts","../src/services/statement/mappers/statement-info.ts","../src/services/statement/mappers/response.ts","../src/services/statement/types/document.ts","../src/services/statement/types/index.ts","../src/services/statement/service.ts","../src/services/home-tax-tax-invoice/adapters/error.ts","../src/services/home-tax-tax-invoice/mappers/response.ts","../src/services/home-tax-tax-invoice/service.ts","../src/services/home-tax-tax-invoice/methods.ts","../src/services/home-tax-tax-invoice/types/index.ts","../src/services/home-tax-cashbill/adapters/validation.ts","../src/services/home-tax-cashbill/mappers/response.ts","../src/services/home-tax-cashbill/service.ts","../src/services/home-tax-cashbill/types/index.ts","../src/services/closedown/mappers/response.ts","../src/services/closedown/service.ts","../src/services/biz-info-check/mappers/response.ts","../src/services/biz-info-check/service.ts","../src/services/easy-fin-bank/methods.ts","../src/services/easy-fin-bank/mappers/document.ts","../src/services/easy-fin-bank/mappers/response.ts","../src/services/easy-fin-bank/service.ts","../src/services/account-check/mappers/response.ts","../src/services/account-check/service.ts","../src/services/kakao/mappers/document.ts","../src/services/kakao/mappers/response.ts","../src/services/kakao/service.ts","../src/services/kakao/methods.ts","../src/services/message/mappers/document.ts","../src/services/message/mappers/response.ts","../src/services/message/service.ts","../src/services/message/methods.ts","../src/services/fax/mappers/document.ts","../src/services/fax/mappers/response.ts","../src/services/fax/service.ts","../src/internal/compat/config.ts","../src/internal/compat/common-service.ts","../src/internal/compat/tax-invoice-service.ts","../src/internal/compat/cashbill-service.ts","../src/internal/compat/statement-service.ts","../src/internal/compat/home-tax-tax-invoice-service.ts","../src/internal/compat/home-tax-cashbill-service.ts","../src/internal/compat/closedown-service.ts","../src/internal/compat/biz-info-check-service.ts","../src/internal/compat/easy-fin-bank-service.ts","../src/internal/compat/account-check-service.ts","../src/internal/compat/kakao-service.ts","../src/internal/compat/message-service.ts","../src/internal/compat/fax-service.ts","../src/client/index.ts","../src/services/tax-invoice/methods.ts","../src/services/statement/methods.ts","../src/services/home-tax-cashbill/methods.ts","../src/services/closedown/methods.ts","../src/services/biz-info-check/methods.ts","../src/services/account-check/methods.ts","../src/services/fax/methods.ts"],"sourcesContent":["import { normalizePopbillError } from '@connextable/popbill-compat/errors'\nimport { invokeUserCallback } from '@connextable/popbill-utils'\nimport type { PopbillApiError } from '@/errors'\n\nexport async function invokeLookupMethod<T>(\n context: { onError?: (error: PopbillApiError) => void },\n operation: string,\n handler: () => Promise<T>\n): Promise<T> {\n try {\n return await handler()\n } catch (error) {\n const normalized = normalizePopbillError(error, { operation })\n const throwable = Object.assign(new Error(normalized.message), normalized)\n invokeUserCallback(() => context.onError?.(throwable), undefined)\n throw throwable\n }\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport type { CommonCompanyInfo, CommonContactInput } from '../types'\nexport function mapCompany(input: CommonCompanyInfo): Spec.CommonCorpInfoApiModel {\n return {\n corpName: input.companyName,\n ceoname: input.chiefExecutiveOfficerName,\n addr: input.address,\n bizType: input.businessType,\n bizClass: input.businessClass,\n }\n}\nexport function mapContact(input: CommonContactInput): Spec.CommonContactInputApiModel {\n return { id: input.userId, personName: input.personName, tel: input.phoneNumber, email: input.emailAddress, searchRole: input.searchRole }\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport { removeUndefinedProperties } from '@connextable/popbill-utils'\nimport type * as Types from '../types'\nexport function operation(response: Spec.CommonOperationApiResponse): Types.CommonOperationResult {\n return { resultCode: response.code, resultMessage: response.message }\n}\nexport function company(response: Spec.CommonCorpInfoApiModel): Types.CommonCompany {\n return {\n companyName: response.corpName,\n chiefExecutiveOfficerName: response.ceoname,\n address: response.addr,\n businessType: response.bizType,\n businessClass: response.bizClass,\n }\n}\nexport function contact(response: Spec.CommonContactApiModel): Types.CommonContact {\n return removeUndefinedProperties({\n userId: response.id,\n personName: response.personName,\n phoneNumber: response.tel,\n emailAddress: response.email,\n searchRole: response.searchRole,\n isManager: response.mgrYN,\n stateCode: response.state,\n registeredAt: response.regDT,\n })\n}\nexport function payment(response: Spec.CommonPaymentHistoryApiModel): Types.CommonPaymentHistory {\n return removeUndefinedProperties({\n productType: response.productType,\n productName: response.productName,\n paymentType: response.settleType,\n contactName: response.settlerName,\n contactEmailAddress: response.settlerEmail,\n paymentAmount: response.settleCost,\n chargedPoints: response.settlePoint,\n stateCode: response.settleState,\n registeredAt: response.regDT,\n stateChangedAt: response.stateDT,\n })\n}\nexport function use(response: Spec.CommonUseHistoryApiModel): Types.CommonPointUseHistory {\n return removeUndefinedProperties({\n serviceCode: response.itemCode,\n serviceUserId: response.serviceUserID,\n userId: response.userID,\n userName: response.userName,\n transactionPoints: response.txPoint,\n remainingPoints: response.balance,\n transactionTypeCode: response.txType,\n transactedAt: response.txDT,\n })\n}\nexport function refund(response: Spec.CommonRefundHistoryApiModel): Types.CommonRefundHistory {\n return removeUndefinedProperties({\n bankName: response.accountBank,\n accountNumber: response.accountNum,\n accountHolderName: response.accountName,\n requestedPoints: response.requestPoint,\n reason: response.reason,\n stateCode: response.state,\n requestedAt: response.reqDT,\n })\n}\nexport function page<T, R>(response: Spec.CommonPageApiResponse<T>, mapper: (value: T) => R): Types.CommonHistoryResult<R> {\n return removeUndefinedProperties({\n resultCode: response.code,\n resultMessage: response.message,\n pageNumber: response.pageNum,\n pageSize: response.perPage,\n pageCount: response.pageCount,\n totalCount: response.total,\n items: response.list.map(mapper),\n })\n}\n","import type { CommonPromiseService } from '@connextable/popbill-compat/factory'\nimport { createInputValidationError } from '@connextable/popbill-compat/errors'\nimport { isValidCalendarDate8, parseSafeInteger } from '@connextable/popbill-utils'\nimport { PopbillErrorStage, type PopbillApiError } from '@/errors'\nimport { invokeCommonMethod } from './adapters/error'\nimport { mapCompany, mapContact } from './mappers/document'\nimport * as map from './mappers/response'\nimport type * as Types from './types'\n\nexport interface CreateCommonServiceInput {\n compatCommonService: CommonPromiseService\n defaultUserId: string\n linkId: string\n onError?: (error: PopbillApiError) => void\n}\nexport function createCommonService(input: CreateCommonServiceInput): Types.CommonService {\n const compat = input.compatCommonService\n const userId = input.defaultUserId\n const invoke = <T>(method: keyof Types.CommonService, handler: () => Promise<T>): Promise<T> =>\n invokeCommonMethod(input, `common.${method}`, handler)\n return {\n checkMemberRegistration(request) {\n return invoke('checkMemberRegistration', async () => {\n const result = await compat.checkIsMember(request.businessNumber)\n return { ...map.operation(result), isMember: parseSafeInteger(result.code) === 1 }\n })\n },\n checkUserIdUsage(request) {\n return invoke('checkUserIdUsage', async () => {\n const result = await compat.checkID(request.userId)\n return { ...map.operation(result), isInUse: parseSafeInteger(result.code) === 1 }\n })\n },\n registerMember(request) {\n return invoke('registerMember', async () =>\n map.operation(\n await compat.joinMember({\n LinkID: input.linkId,\n CorpNum: request.businessNumber,\n ID: request.userId,\n Password: request.password,\n CorpName: request.company.companyName,\n CEOName: request.company.chiefExecutiveOfficerName,\n Addr: request.company.address,\n BizType: request.company.businessType,\n BizClass: request.company.businessClass,\n ContactName: request.contactName,\n ContactTEL: request.contactPhoneNumber,\n ContactEmail: request.contactEmailAddress,\n })\n )\n )\n },\n quitMember(request) {\n return invoke('quitMember', async () => map.operation(await compat.quitMember(request.businessNumber, request.reason, userId)))\n },\n getCompanyInfo(request) {\n return invoke('getCompanyInfo', async () => map.company(await compat.getCorpInfo(request.businessNumber, userId)))\n },\n updateCompanyInfo(request) {\n return invoke('updateCompanyInfo', async () =>\n map.operation(await compat.updateCorpInfo(request.businessNumber, userId, mapCompany(request.company)))\n )\n },\n registerContact(request) {\n return invoke('registerContact', async () =>\n map.operation(\n await compat.registContact(request.businessNumber, userId, { ...mapContact(request.contact), password: request.contact.password })\n )\n )\n },\n getContactInfo(request) {\n return invoke('getContactInfo', async () => map.contact(await compat.getContactInfo(request.businessNumber, request.contactUserId, userId)))\n },\n listContacts(request) {\n return invoke('listContacts', async () => (await compat.listContact(request.businessNumber, userId)).map(map.contact))\n },\n updateContact(request) {\n return invoke('updateContact', async () =>\n map.operation(await compat.updateContact(request.businessNumber, userId, mapContact(request.contact)))\n )\n },\n deleteContact(request) {\n return invoke('deleteContact', async () => map.operation(await compat.deleteContact(request.businessNumber, request.contactUserId, userId)))\n },\n getLoginURL(request) {\n return invoke('getLoginURL', async () => ({ accessUrl: await compat.getAccessURL(request.businessNumber, userId) }))\n },\n getMemberPointBalance(request) {\n return invoke('getMemberPointBalance', async () => ({ remainingPoints: await compat.getBalance(request.businessNumber) }))\n },\n getPartnerPointBalance(request) {\n return invoke('getPartnerPointBalance', async () => ({ remainingPoints: await compat.getPartnerBalance(request.businessNumber) }))\n },\n getMemberPointChargeURL(request) {\n return invoke('getMemberPointChargeURL', async () => ({ accessUrl: await compat.getChargeURL(request.businessNumber, userId) }))\n },\n getPartnerPointChargeURL(request) {\n return invoke('getPartnerPointChargeURL', async () => ({ accessUrl: await compat.getPartnerURL(request.businessNumber, 'CHRG') }))\n },\n requestPointPayment(request) {\n return invoke('requestPointPayment', async () => {\n const result = await compat.paymentRequest(\n request.businessNumber,\n {\n paymentName: request.paymentName,\n settleCost: request.paymentAmount,\n settlerName: request.contactName,\n settlerEmail: request.contactEmailAddress,\n notifyHP: request.notificationPhoneNumber,\n },\n userId\n )\n return { settlementCode: result.settleCode, ...map.operation(result) }\n })\n },\n getPointPaymentInfo(request) {\n return invoke('getPointPaymentInfo', async () =>\n map.payment(await compat.getSettleResult(request.businessNumber, request.settlementCode, userId))\n )\n },\n getPointPaymentHistory(request) {\n return invoke('getPointPaymentHistory', async () => {\n validateHistory(request, 'getPointPaymentHistory')\n return map.page(\n await compat.getPaymentHistory(request.businessNumber, request.startDate, request.endDate, request.pageNumber, request.pageSize, userId),\n map.payment\n )\n })\n },\n getPointPaymentHistoryURL(request) {\n return invoke('getPointPaymentHistoryURL', async () => ({ accessUrl: await compat.getPaymentURL(request.businessNumber, userId) }))\n },\n getPointUseHistory(request) {\n return invoke('getPointUseHistory', async () => {\n validateHistory(request, 'getPointUseHistory')\n if (request.sortOrder !== undefined && request.sortOrder !== 'A' && request.sortOrder !== 'D')\n invalid('sortOrder가 올바르지 않습니다.', 'getPointUseHistory')\n return map.page(\n await compat.getUseHistory(\n request.businessNumber,\n request.startDate,\n request.endDate,\n request.pageNumber,\n request.pageSize,\n request.sortOrder,\n userId\n ),\n map.use\n )\n })\n },\n getPointUseHistoryURL(request) {\n return invoke('getPointUseHistoryURL', async () => ({ accessUrl: await compat.getUseHistoryURL(request.businessNumber, userId) }))\n },\n getRefundablePointBalance(request) {\n return invoke('getRefundablePointBalance', async () => ({\n refundablePoints: (await compat.getRefundableBalance(request.businessNumber, userId)).refundableBalance,\n }))\n },\n requestPointRefund(request) {\n return invoke('requestPointRefund', async () => {\n const result = await compat.refund(\n request.businessNumber,\n {\n accountbank: request.bankName,\n accountnum: request.accountNumber,\n accountname: request.accountHolderName,\n requestpoint: request.requestedPoints,\n contactname: request.contactName,\n tel: request.phoneNumber,\n reason: request.reason,\n },\n userId\n )\n return { refundCode: result.refundCode, ...map.operation(result) }\n })\n },\n getPointRefundInfo(request) {\n return invoke('getPointRefundInfo', async () => map.refund(await compat.getRefundInfo(request.businessNumber, request.refundCode, userId)))\n },\n getPointRefundHistory(request) {\n return invoke('getPointRefundHistory', async () => {\n validatePage(request, 'getPointRefundHistory')\n return map.page(await compat.getRefundHistory(request.businessNumber, request.pageNumber, request.pageSize, userId), map.refund)\n })\n },\n }\n}\nfunction invalid(message: string, method: keyof Types.CommonService): never {\n throw createInputValidationError(message, { operation: `common.${method}`, stage: PopbillErrorStage.ValidateInput })\n}\nfunction validatePage(request: Types.CommonPageInput, method: keyof Types.CommonService): void {\n if (request.pageNumber !== undefined && (!Number.isInteger(request.pageNumber) || request.pageNumber < 1))\n invalid('pageNumber는 1 이상의 정수여야 합니다.', method)\n if (request.pageSize !== undefined && (!Number.isInteger(request.pageSize) || request.pageSize < 1))\n invalid('pageSize는 1 이상의 정수여야 합니다.', method)\n}\nfunction validateHistory(request: Types.CommonHistoryInput, method: keyof Types.CommonService): void {\n validatePage(request, method)\n for (const date of [request.startDate, request.endDate]) {\n if (!/^\\d{8}$/.test(date)) invalid('조회일자는 yyyyMMdd 형식이어야 합니다.', method)\n // History dates previously serialized the year without leading zeroes.\n if (!isValidCalendarDate8(date) || date.startsWith('0')) invalid('유효한 조회일자를 입력해야 합니다.', method)\n }\n if (request.startDate > request.endDate) invalid('startDate는 endDate 이후일 수 없습니다.', method)\n}\n","import type { CommonService } from './types'\nexport const COMMON_METHODS = [\n // 회원관리\n 'checkMemberRegistration',\n 'checkUserIdUsage',\n 'registerMember',\n 'quitMember',\n // 기업정보\n 'getCompanyInfo',\n 'updateCompanyInfo',\n // 담당자관리\n 'registerContact',\n 'getContactInfo',\n 'listContacts',\n 'updateContact',\n 'deleteContact',\n // 접근 URL\n 'getLoginURL',\n // 포인트\n 'getMemberPointBalance',\n 'getPartnerPointBalance',\n 'getMemberPointChargeURL',\n 'getPartnerPointChargeURL',\n // 결제\n 'requestPointPayment',\n 'getPointPaymentInfo',\n 'getPointPaymentHistory',\n 'getPointPaymentHistoryURL',\n // 사용내역\n 'getPointUseHistory',\n 'getPointUseHistoryURL',\n // 환불\n 'getRefundablePointBalance',\n 'requestPointRefund',\n 'getPointRefundInfo',\n 'getPointRefundHistory',\n] as const satisfies readonly (keyof CommonService)[]\n","import { normalizePopbillError } from '@connextable/popbill-compat/errors'\nimport { invokeUserCallback } from '@connextable/popbill-utils'\nimport type { PopbillApiError } from '@/errors'\n\n/**\n * TaxInvoice facade 메서드 공통 에러 처리 컨텍스트입니다.\n */\nexport interface TaxInvoiceErrorHandlingContext {\n onError?: (error: PopbillApiError) => void\n}\n\n/**\n * TaxInvoice facade 메서드를 실행하고 예외를 `PopbillApiError`로 표준화합니다.\n */\nexport async function invokeTaxInvoiceMethod<T>(context: TaxInvoiceErrorHandlingContext, operation: string, handler: () => Promise<T>): Promise<T> {\n try {\n return await handler()\n } catch (error) {\n const normalizedError = normalizePopbillError(error, { operation })\n const throwableError = Object.assign(new Error(normalizedError.message), normalizedError)\n invokeUserCallback(context.onError, throwableError)\n throw throwableError\n }\n}\n","import type {\n TaxInvoiceAdditionalContactInput,\n TaxInvoiceBuyerInput,\n TaxInvoiceDocumentInput,\n TaxInvoiceLineItemInput,\n TaxInvoicePartyInput,\n} from '@/services/tax-invoice/types'\nimport type * as Spec from '@connextable/popbill-spec'\nimport { createInputValidationError } from '@connextable/popbill-compat/errors'\nimport { removeUndefinedProperties } from '@connextable/popbill-utils'\nimport { PopbillErrorStage } from '@/errors'\n\nexport function mapTaxInvoicePdfPrintCopy(printCopy: unknown): Spec.TaxInvoiceGetPdfApiRequestQuery['PdfInvoiceType'] {\n if (printCopy === undefined) return undefined\n if (printCopy === 'supplier') return '1'\n if (printCopy === 'buyer') return '2'\n throw createInputValidationError('printCopy는 supplier 또는 buyer여야 합니다.', {\n operation: 'taxInvoice.downloadInvoicePDF',\n stage: PopbillErrorStage.ValidateInput,\n })\n}\n\n/**\n * modern 세금계산서 문서 입력을 compat 세금계산서 API 모델로 변환합니다.\n */\nexport function mapTaxInvoiceDocument(taxInvoiceDocumentInput: TaxInvoiceDocumentInput): Spec.TaxInvoiceApiModel {\n return removeUndefinedProperties({\n writeSpecification: taxInvoiceDocumentInput.writeSpecificationEnabled,\n writeDate: taxInvoiceDocumentInput.writtenDate,\n chargeDirection: taxInvoiceDocumentInput.chargeDirection,\n issueType: taxInvoiceDocumentInput.issueType,\n purposeType: taxInvoiceDocumentInput.purposeType,\n issueTiming: taxInvoiceDocumentInput.issueTimingCode,\n taxType: taxInvoiceDocumentInput.taxType,\n ...mapSupplierFields(taxInvoiceDocumentInput.supplier),\n ...mapBuyerFields(taxInvoiceDocumentInput.buyer),\n ...mapTrusteeFields(taxInvoiceDocumentInput.trustee),\n taxTotal: taxInvoiceDocumentInput.paymentSummary?.totalTaxAmount,\n supplyCostTotal: taxInvoiceDocumentInput.paymentSummary?.totalSupplyCostAmount,\n totalAmount: taxInvoiceDocumentInput.paymentSummary?.totalAmount,\n cash: taxInvoiceDocumentInput.paymentSummary?.cashAmount,\n chkBill: taxInvoiceDocumentInput.paymentSummary?.checkAmount,\n note: taxInvoiceDocumentInput.paymentSummary?.promissoryNoteAmount,\n credit: taxInvoiceDocumentInput.paymentSummary?.creditAmount,\n modifyCode: taxInvoiceDocumentInput.modification?.modificationReasonCode,\n orgNTSConfirmNum: taxInvoiceDocumentInput.modification?.originalNationalTaxServiceConfirmationNumber,\n serialNum: taxInvoiceDocumentInput.taxInvoiceSerialNumber,\n remark1: taxInvoiceDocumentInput.remarkOne,\n remark2: taxInvoiceDocumentInput.remarkTwo,\n remark3: taxInvoiceDocumentInput.remarkThree,\n kwon: taxInvoiceDocumentInput.bookVolumeNumber,\n ho: taxInvoiceDocumentInput.bookIssueNumber,\n businessLicenseYN: taxInvoiceDocumentInput.includeBusinessLicenseImage,\n bankBookYN: taxInvoiceDocumentInput.includeBankBookImage,\n detailList: taxInvoiceDocumentInput.lineItems?.map(mapLineItem),\n addContactList: taxInvoiceDocumentInput.additionalContacts?.map(mapAdditionalContact),\n })\n}\n\n/**\n * modern 세금계산서 문서 입력 목록을 compat 세금계산서 API 모델 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceDocuments(taxInvoiceDocumentInputs: TaxInvoiceDocumentInput[]): Spec.TaxInvoiceApiModel[] {\n return taxInvoiceDocumentInputs.map(mapTaxInvoiceDocument)\n}\n\n/**\n * 공급자 입력을 raw 공급자 필드로 변환합니다.\n */\nfunction mapSupplierFields(supplierInput: TaxInvoicePartyInput | undefined): Partial<Spec.TaxInvoiceApiModel> {\n if (!supplierInput) {\n return {}\n }\n\n return removeUndefinedProperties({\n invoicerCorpNum: supplierInput.businessNumber,\n invoicerMgtKey: supplierInput.managementKey,\n invoicerTaxRegID: supplierInput.taxRegistrationIdentifier,\n invoicerCorpName: supplierInput.companyName,\n invoicerCEOName: supplierInput.chiefExecutiveOfficerName,\n invoicerAddr: supplierInput.address,\n invoicerBizClass: supplierInput.businessClass,\n invoicerBizType: supplierInput.businessType,\n invoicerContactName: supplierInput.contactName,\n invoicerTEL: supplierInput.telephoneNumber,\n invoicerHP: supplierInput.mobilePhoneNumber,\n invoicerEmail: supplierInput.emailAddress,\n invoicerSMSSendYN: supplierInput.sendTextMessage,\n invoicerPrintYN: supplierInput.printEnabled,\n invoicerRDN: supplierInput.residentRegistrationNumber,\n invoicerOLN: supplierInput.foreignerRegistrationNumber,\n invoicerTaxNum: supplierInput.branchBusinessNumber,\n invoicerPSerialNum: supplierInput.branchSerialNumber,\n invoicerCorpCls: supplierInput.corporationClassification,\n invoicerDeptName: supplierInput.departmentName,\n })\n}\n\n/**\n * 공급받는자 입력을 raw 공급받는자 필드로 변환합니다.\n */\nfunction mapBuyerFields(buyerInput: TaxInvoiceBuyerInput | undefined): Partial<Spec.TaxInvoiceApiModel> {\n if (!buyerInput) {\n return {}\n }\n\n return removeUndefinedProperties({\n invoiceeType: buyerInput.recipientType,\n invoiceeCorpNum: buyerInput.businessNumber,\n invoiceeMgtKey: buyerInput.managementKey,\n invoiceeTaxRegID: buyerInput.taxRegistrationIdentifier,\n invoiceeCorpName: buyerInput.companyName,\n invoiceeCEOName: buyerInput.chiefExecutiveOfficerName,\n invoiceeAddr: buyerInput.address,\n invoiceeBizClass: buyerInput.businessClass,\n invoiceeBizType: buyerInput.businessType,\n invoiceeContactName1: buyerInput.contactName,\n invoiceeTEL1: buyerInput.telephoneNumber,\n invoiceeHP1: buyerInput.mobilePhoneNumber,\n invoiceeEmail1: buyerInput.emailAddress,\n invoiceeContactName2: buyerInput.secondaryContactName,\n invoiceeTEL2: buyerInput.secondaryTelephoneNumber,\n invoiceeHP2: buyerInput.secondaryMobilePhoneNumber,\n invoiceeEmail2: buyerInput.secondaryEmailAddress,\n invoiceeSMSSendYN: buyerInput.sendTextMessage,\n invoiceePrintYN: buyerInput.printEnabled,\n invoiceeRDN: buyerInput.residentRegistrationNumber,\n invoiceeOLN: buyerInput.foreignerRegistrationNumber,\n invoiceeTaxNum: buyerInput.branchBusinessNumber,\n invoiceePSerialNum: buyerInput.branchSerialNumber,\n invoiceeCorpCls: buyerInput.corporationClassification,\n invoiceeDeptName1: buyerInput.primaryDepartmentName ?? buyerInput.departmentName,\n invoiceeDeptName2: buyerInput.secondaryDepartmentName,\n closeDownState: buyerInput.businessStatus,\n closeDownStateDate: buyerInput.businessStatusDate,\n })\n}\n\n/**\n * 수탁자 입력을 raw 수탁자 필드로 변환합니다.\n */\nfunction mapTrusteeFields(trusteeInput: TaxInvoicePartyInput | undefined): Partial<Spec.TaxInvoiceApiModel> {\n if (!trusteeInput) {\n return {}\n }\n\n return removeUndefinedProperties({\n trusteeCorpNum: trusteeInput.businessNumber,\n trusteeMgtKey: trusteeInput.managementKey,\n trusteeTaxRegID: trusteeInput.taxRegistrationIdentifier,\n trusteeCorpName: trusteeInput.companyName,\n trusteeCEOName: trusteeInput.chiefExecutiveOfficerName,\n trusteeAddr: trusteeInput.address,\n trusteeBizClass: trusteeInput.businessClass,\n trusteeBizType: trusteeInput.businessType,\n trusteeContactName: trusteeInput.contactName,\n trusteeTEL: trusteeInput.telephoneNumber,\n trusteeHP: trusteeInput.mobilePhoneNumber,\n trusteeEmail: trusteeInput.emailAddress,\n trusteeSMSSendYN: trusteeInput.sendTextMessage,\n trusteePrintYN: trusteeInput.printEnabled,\n trusteeRDN: trusteeInput.residentRegistrationNumber,\n trusteeOLN: trusteeInput.foreignerRegistrationNumber,\n trusteeTaxNum: trusteeInput.branchBusinessNumber,\n trusteePSerialNum: trusteeInput.branchSerialNumber,\n trusteeCorpCls: trusteeInput.corporationClassification,\n trusteeDeptName: trusteeInput.departmentName,\n })\n}\n\n/**\n * 상세 품목 입력을 raw 상세 품목 모델로 변환합니다.\n */\nfunction mapLineItem(lineItemInput: TaxInvoiceLineItemInput): NonNullable<Spec.TaxInvoiceApiModel['detailList']>[number] {\n return {\n serialNum: lineItemInput.lineNumber,\n purchaseDT: lineItemInput.transactionDate,\n itemName: lineItemInput.itemName,\n spec: lineItemInput.specification,\n qty: lineItemInput.quantity,\n unitCost: lineItemInput.unitCostAmount,\n supplyCost: lineItemInput.supplyCostAmount,\n tax: lineItemInput.taxAmount,\n remark: lineItemInput.remark,\n }\n}\n\n/**\n * 추가 담당자 입력을 raw 추가 담당자 모델로 변환합니다.\n */\nfunction mapAdditionalContact(\n additionalContactInput: TaxInvoiceAdditionalContactInput\n): NonNullable<Spec.TaxInvoiceApiModel['addContactList']>[number] {\n return {\n serialNum: additionalContactInput.sequenceNumber,\n contactName: additionalContactInput.contactName,\n email: additionalContactInput.emailAddress,\n }\n}\n","import { preserveBooleanResponse, preserveNumericCode } from '@connextable/popbill-utils'\nimport type { TaxInvoiceInfo } from '@/services/tax-invoice/types'\nimport type * as Spec from '@connextable/popbill-spec'\n\n/**\n * compat `getInfo` 응답을 modern TaxInvoiceInfo로 변환합니다.\n */\nexport function mapTaxInvoiceInfo(response: Spec.TaxInvoiceGetInfoApiResponse): TaxInvoiceInfo {\n return {\n itemKey: response.itemKey,\n nationalTaxServiceConfirmationNumber: response.ntsconfirmNum,\n supplierBusinessNumber: response.invoicerCorpNum,\n supplierManagementKey: response.invoicerMgtKey,\n buyerBusinessNumber: response.invoiceeCorpNum,\n buyerManagementKey: response.invoiceeMgtKey,\n trusteeBusinessNumber: response.trusteeCorpNum,\n trusteeManagementKey: response.trusteeMgtKey,\n taxType: response.taxType,\n issueType: response.issueType,\n purposeType: response.purposeType,\n totalSupplyCost: response.supplyCostTotal,\n totalTax: response.taxTotal,\n modificationCode: preserveNumericCode(response.modifyCode),\n supplierCompanyName: response.invoicerCorpName,\n buyerCompanyName: response.invoiceeCorpName,\n trusteeCompanyName: response.trusteeCorpName,\n stateCode: preserveNumericCode(response.stateCode),\n stateMemo: response.stateMemo,\n nationalTaxServiceResult: response.ntsresult,\n nationalTaxServiceSendErrorCode: response.ntssendErrCode,\n isLateIssued: preserveBooleanResponse(response.lateIssueYN),\n isOpen: preserveBooleanResponse(response.openYN),\n isApiLinkedDocument: preserveBooleanResponse(response.interOPYN),\n isSupplierPrinted: preserveBooleanResponse(response.invoicerPrintYN),\n isBuyerPrinted: preserveBooleanResponse(response.invoiceePrintYN),\n isTrusteePrinted: preserveBooleanResponse(response.trusteePrintYN),\n buyerBusinessStatus: preserveNumericCode(response.closeDownState),\n writtenDate: response.writeDate,\n registeredAt: response.regDT,\n issuedAt: response.issueDT,\n stateChangedAt: response.stateDT,\n openedAt: response.openDT,\n nationalTaxServiceSentAt: response.ntssendDT,\n nationalTaxServiceResultReceivedAt: response.ntsresultDT,\n buyerBusinessStatusDate: response.closeDownStateDate,\n }\n}\n","import { mapTaxInvoiceInfo } from './invoice-info'\nimport {\n compactOptionalObject,\n optionalResponseNumber,\n preserveBooleanResponse,\n preserveNumericCode,\n removeUndefinedProperties,\n type ProviderNumericCode,\n} from '@connextable/popbill-utils'\nimport type {\n TaxInvoiceAccessUrl,\n TaxInvoiceAttachedFile,\n TaxInvoiceBulkIssueSubmissionResult,\n TaxInvoiceBulkIssueSubmissionResultItem,\n TaxInvoiceBulkSubmitResult,\n TaxInvoiceBuyerOutput,\n TaxInvoiceChargeInfo,\n TaxInvoiceDocumentOutput,\n TaxInvoiceEmailPublicKeys,\n TaxInvoiceEmailSendSetting,\n TaxInvoiceInfo,\n TaxInvoiceInvoiceManagementKeyUsage,\n TaxInvoiceIssueResult,\n TaxInvoiceLogEntry,\n TaxInvoiceOperationResult,\n TaxInvoicePartyOutput,\n TaxInvoicePdfDocument,\n TaxInvoiceSearchResult,\n TaxInvoiceSendToNationalTaxServiceSetting,\n TaxInvoiceTaxCertificateExpiration,\n TaxInvoiceTaxCertificateInfo,\n TaxInvoiceXmlResult,\n TaxInvoiceUnitCost,\n} from '@/services/tax-invoice/types'\nimport type * as Spec from '@connextable/popbill-spec'\n\n/**\n * 공통 API 처리결과를 도메인 처리결과로 변환합니다.\n */\nexport function mapTaxInvoiceOperationResult(\n taxInvoiceApiResponse: Spec.TaxInvoiceApiResponseBase | { code?: ProviderNumericCode; message: string }\n): TaxInvoiceOperationResult {\n return {\n resultCode: preserveNumericCode(taxInvoiceApiResponse.code),\n resultMessage: taxInvoiceApiResponse.message,\n }\n}\n\n/**\n * 발행 결과를 도메인 발행 결과로 변환합니다.\n */\nexport function mapTaxInvoiceIssueResult(taxInvoiceApiResponse: Spec.TaxInvoiceIssueApiResponse): TaxInvoiceIssueResult {\n return removeUndefinedProperties({\n ...mapTaxInvoiceOperationResult(taxInvoiceApiResponse),\n nationalTaxServiceConfirmationNumber: taxInvoiceApiResponse.ntsConfirmNum,\n issuedAt: taxInvoiceApiResponse.issueDT ?? undefined,\n })\n}\n\n/**\n * 초대량 접수 결과를 도메인 결과로 변환합니다.\n */\nexport function mapTaxInvoiceBulkSubmitResult(taxInvoiceApiResponse: Spec.TaxInvoiceBulkSubmitApiResponse): TaxInvoiceBulkSubmitResult {\n return removeUndefinedProperties({\n ...mapTaxInvoiceOperationResult(taxInvoiceApiResponse),\n receiptIdentifier: taxInvoiceApiResponse.receiptID,\n })\n}\n\n/**\n * 초대량 접수결과 조회 응답을 도메인 결과로 변환합니다.\n */\nexport function mapTaxInvoiceBulkIssueSubmissionResult(\n taxInvoiceApiResponse: Spec.TaxInvoiceGetBulkResultApiResponse\n): TaxInvoiceBulkIssueSubmissionResult {\n return removeUndefinedProperties({\n ...mapTaxInvoiceOperationResult(taxInvoiceApiResponse),\n submissionIdentifier: taxInvoiceApiResponse.submitID,\n receiptIdentifier: taxInvoiceApiResponse.receiptID,\n submittedDocumentCount: optionalResponseNumber(taxInvoiceApiResponse.submitCount),\n succeededDocumentCount: optionalResponseNumber(taxInvoiceApiResponse.successCount),\n failedDocumentCount: optionalResponseNumber(taxInvoiceApiResponse.failCount),\n transactionState: preserveNumericCode(taxInvoiceApiResponse.txState),\n transactionResultCode: preserveNumericCode(taxInvoiceApiResponse.txResultCode),\n issueResults: taxInvoiceApiResponse.issueResult?.map(mapTaxInvoiceBulkIssueSubmissionResultItem),\n receivedAt: taxInvoiceApiResponse.receiptDT,\n transactionStartedAt: taxInvoiceApiResponse.txStartDT,\n transactionCompletedAt: taxInvoiceApiResponse.txEndDT,\n })\n}\n\n/**\n * 다건 문서 요약 응답을 도메인 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceInfos(taxInvoiceApiResponse: Spec.TaxInvoiceGetInfosApiResponse): TaxInvoiceInfo[] {\n return taxInvoiceApiResponse.map(mapTaxInvoiceInfo)\n}\n\n/**\n * 문서 상세 응답을 도메인 문서 상세로 변환합니다.\n */\nexport function mapTaxInvoiceDocumentOutput(taxInvoiceApiResponse: Spec.TaxInvoiceGetDetailInfoApiResponse): TaxInvoiceDocumentOutput {\n return removeUndefinedProperties({\n taxInvoiceSerialNumber: taxInvoiceApiResponse.serialNum,\n bookVolumeNumber: taxInvoiceApiResponse.kwon,\n bookIssueNumber: taxInvoiceApiResponse.ho,\n writtenDate: taxInvoiceApiResponse.writeDate,\n issueType: taxInvoiceApiResponse.issueType,\n issueTimingCode: taxInvoiceApiResponse.issueTiming,\n taxType: taxInvoiceApiResponse.taxType,\n purposeType: taxInvoiceApiResponse.purposeType,\n chargeDirection: taxInvoiceApiResponse.chargeDirection,\n supplier: mapSupplierOutput(taxInvoiceApiResponse),\n buyer: mapBuyerOutput(taxInvoiceApiResponse),\n trustee: mapTrusteeOutput(taxInvoiceApiResponse),\n paymentSummary: removeUndefinedProperties({\n totalSupplyCostAmount: taxInvoiceApiResponse.supplyCostTotal,\n totalTaxAmount: taxInvoiceApiResponse.taxTotal,\n totalAmount: taxInvoiceApiResponse.totalAmount,\n cashAmount: taxInvoiceApiResponse.cash,\n checkAmount: taxInvoiceApiResponse.chkBill,\n promissoryNoteAmount: taxInvoiceApiResponse.note,\n creditAmount: taxInvoiceApiResponse.credit,\n }),\n modification: removeUndefinedProperties({\n modificationReasonCode: preserveNumericCode(taxInvoiceApiResponse.modifyCode),\n originalNationalTaxServiceConfirmationNumber: taxInvoiceApiResponse.orgNTSConfirmNum,\n }),\n lineItems: taxInvoiceApiResponse.detailList?.map((lineItem) =>\n removeUndefinedProperties({\n lineNumber: lineItem.serialNum,\n transactionDate: lineItem.purchaseDT,\n itemName: lineItem.itemName,\n specification: lineItem.spec,\n quantity: lineItem.qty,\n unitCostAmount: lineItem.unitCost,\n supplyCostAmount: lineItem.supplyCost,\n taxAmount: lineItem.tax,\n remark: lineItem.remark,\n })\n ),\n additionalContacts: taxInvoiceApiResponse.addContactList?.map((additionalContact) =>\n removeUndefinedProperties({\n sequenceNumber: additionalContact.serialNum,\n contactName: additionalContact.contactName,\n emailAddress: additionalContact.email,\n })\n ),\n remarkOne: taxInvoiceApiResponse.remark1,\n remarkTwo: taxInvoiceApiResponse.remark2,\n remarkThree: taxInvoiceApiResponse.remark3,\n writeSpecificationEnabled: preserveBooleanResponse(taxInvoiceApiResponse.writeSpecification),\n includeBusinessLicenseImage: preserveBooleanResponse(taxInvoiceApiResponse.businessLicenseYN),\n includeBankBookImage: preserveBooleanResponse(taxInvoiceApiResponse.bankBookYN),\n nationalTaxServiceConfirmationNumber: taxInvoiceApiResponse.ntsconfirmNum,\n stateCode: preserveNumericCode(taxInvoiceApiResponse.stateCode),\n nationalTaxServiceResultCode: taxInvoiceApiResponse.ntsresult,\n nationalTaxServiceSendErrorCode: taxInvoiceApiResponse.ntssendErrCode,\n isLateIssued: preserveBooleanResponse(taxInvoiceApiResponse.lateIssueYN),\n isOpen: preserveBooleanResponse(taxInvoiceApiResponse.openYN),\n isApiLinkedDocument: preserveBooleanResponse(taxInvoiceApiResponse.interOPYN),\n issuedAt: taxInvoiceApiResponse.issueDT,\n stateChangedAt: taxInvoiceApiResponse.stateDT,\n openedAt: taxInvoiceApiResponse.openDT,\n nationalTaxServiceSentAt: taxInvoiceApiResponse.ntssendDT,\n nationalTaxServiceResultReceivedAt: taxInvoiceApiResponse.ntsresultDT,\n })\n}\n\n/**\n * 문서번호 사용 여부 응답을 도메인 결과로 변환합니다.\n */\nexport function mapTaxInvoiceInvoiceManagementKeyUsage(taxInvoiceApiResponse: boolean | { itemKey?: string }): TaxInvoiceInvoiceManagementKeyUsage {\n if (typeof taxInvoiceApiResponse === 'boolean') {\n return {\n isInUse: taxInvoiceApiResponse,\n }\n }\n\n return removeUndefinedProperties({\n isInUse: typeof taxInvoiceApiResponse.itemKey === 'string' && taxInvoiceApiResponse.itemKey.length > 0,\n itemKey: taxInvoiceApiResponse.itemKey,\n })\n}\n\n/**\n * XML 조회 응답을 도메인 결과로 변환합니다.\n */\nexport function mapTaxInvoiceXmlResult(taxInvoiceApiResponse: Spec.TaxInvoiceGetXmlApiResponse): TaxInvoiceXmlResult {\n return removeUndefinedProperties({\n operationResult:\n taxInvoiceApiResponse.code === undefined || taxInvoiceApiResponse.message === undefined\n ? undefined\n : mapTaxInvoiceOperationResult({\n code: taxInvoiceApiResponse.code,\n message: taxInvoiceApiResponse.message,\n }),\n itemKey: taxInvoiceApiResponse.itemKey,\n invoiceManagementKey: taxInvoiceApiResponse.mgtKey,\n xmlContent: taxInvoiceApiResponse.retObject,\n })\n}\n\nexport function mapTaxInvoicePdfDocument(fileData: Uint8Array): TaxInvoicePdfDocument {\n return { fileData: new Uint8Array(fileData) }\n}\n\n/**\n * 검색 응답을 도메인 검색 결과로 변환합니다.\n */\nexport function mapTaxInvoiceSearchResult(taxInvoiceApiResponse: Spec.TaxInvoiceSearchApiResponse): TaxInvoiceSearchResult {\n return removeUndefinedProperties({\n operationResult: mapTaxInvoiceOperationResult(taxInvoiceApiResponse),\n pageNumber: optionalResponseNumber(taxInvoiceApiResponse.pageNum),\n pageSize: optionalResponseNumber(taxInvoiceApiResponse.perPage),\n pageCount: optionalResponseNumber(taxInvoiceApiResponse.pageCount),\n totalCount: optionalResponseNumber(taxInvoiceApiResponse.total),\n invoiceSummaries: (taxInvoiceApiResponse.list ?? []).map(mapTaxInvoiceInfo),\n })\n}\n\n/**\n * 문서 로그 응답을 도메인 로그 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceLogs(taxInvoiceApiResponse: Spec.TaxInvoiceGetLogsApiResponse): TaxInvoiceLogEntry[] {\n return taxInvoiceApiResponse.map((logEntry) =>\n removeUndefinedProperties({\n documentLogTypeCode: preserveNumericCode(logEntry.docLogType),\n logMessage: logEntry.log,\n processTypeCode: logEntry.procType,\n processCompanyName: logEntry.procCorpName,\n processContactName: logEntry.procContactName,\n processDescription: logEntry.procMemo,\n registeredAt: logEntry.regDT,\n ipAddress: logEntry.ip,\n })\n )\n}\n\n/**\n * URL 문자열을 URL 응답으로 래핑합니다.\n */\nexport function mapTaxInvoiceAccessUrlFromString(accessUrl: string): TaxInvoiceAccessUrl {\n return { accessUrl }\n}\n\n/**\n * URL 객체를 URL 응답으로 변환합니다.\n */\nexport function mapTaxInvoiceAccessUrl(taxInvoiceApiResponse: { url: string }): TaxInvoiceAccessUrl {\n return { accessUrl: taxInvoiceApiResponse.url }\n}\n\n/**\n * 첨부파일 목록 응답을 도메인 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceAttachedFiles(taxInvoiceApiResponse: Spec.TaxInvoiceGetFilesApiResponse): TaxInvoiceAttachedFile[] {\n return taxInvoiceApiResponse.map((attachedFile) =>\n removeUndefinedProperties({\n sequenceNumber: attachedFile.serialNum,\n fileIdentifier: attachedFile.attachedFile,\n displayName: attachedFile.displayName,\n registeredAt: attachedFile.regDT,\n })\n )\n}\n\n/**\n * 이메일 전송설정 응답을 도메인 목록으로 변환합니다.\n */\nexport function mapTaxInvoiceEmailSendSettings(taxInvoiceApiResponse: Spec.TaxInvoiceListEmailConfigApiResponse): TaxInvoiceEmailSendSetting[] {\n return taxInvoiceApiResponse.map((emailSendSetting) =>\n removeUndefinedProperties({\n emailTypeCode: emailSendSetting.emailType,\n sendEnabled: preserveBooleanResponse(emailSendSetting.sendYN),\n })\n )\n}\n\n/**\n * 국세청 전송설정 응답을 도메인 설정으로 변환합니다.\n */\nexport function mapTaxInvoiceSendToNationalTaxServiceSetting(\n taxInvoiceApiResponse: Spec.TaxInvoiceGetSendToNTSConfigApiResponse\n): TaxInvoiceSendToNationalTaxServiceSetting {\n return {\n sendToNationalTaxServiceEnabled: preserveBooleanResponse(taxInvoiceApiResponse.sendToNTS),\n }\n}\n\n/** 공개되지 않은 유통메일 공개키 응답을 손실 없이 보존합니다. */\nexport function mapTaxInvoiceEmailPublicKeys(response: Spec.TaxInvoiceGetEmailPublicKeysApiResponse): TaxInvoiceEmailPublicKeys {\n return { publicKeys: response }\n}\n\n/**\n * 인증서 만료일 문자열을 도메인 결과로 래핑합니다.\n */\nexport function mapTaxInvoiceTaxCertificateExpiration(expirationDateTime: string): TaxInvoiceTaxCertificateExpiration {\n return { expirationDateTime }\n}\n\n/**\n * 인증서 정보 응답을 도메인 정보로 변환합니다.\n */\nexport function mapTaxInvoiceTaxCertificateInfo(taxInvoiceApiResponse: Spec.TaxInvoiceGetTaxCertInfoApiResponse): TaxInvoiceTaxCertificateInfo {\n return removeUndefinedProperties({\n issuerDistinguishedName: taxInvoiceApiResponse.issuerDN,\n subjectDistinguishedName: taxInvoiceApiResponse.subjectDN,\n issuerName: taxInvoiceApiResponse.issuerName,\n policyObjectIdentifier: taxInvoiceApiResponse.OID ?? taxInvoiceApiResponse.oid,\n registeredContactIdentifier: taxInvoiceApiResponse.regContactID,\n registeredContactName: taxInvoiceApiResponse.regContactName,\n registeredAt: taxInvoiceApiResponse.regDT,\n expiredAt: taxInvoiceApiResponse.expireDT,\n })\n}\n\nexport function mapTaxInvoiceChargeInfo(response: Spec.TaxInvoiceGetChargeInfoApiResponse): TaxInvoiceChargeInfo {\n return { unitCost: response.unitCost, chargeMethod: response.chargeMethod, rateSystem: response.rateSystem }\n}\n\nexport function mapTaxInvoiceUnitCost(unitCost: string): TaxInvoiceUnitCost {\n return { unitCost }\n}\n\n/**\n * 초대량 개별 처리 결과를 도메인 항목으로 변환합니다.\n */\nfunction mapTaxInvoiceBulkIssueSubmissionResultItem(\n taxInvoiceApiResponse: NonNullable<Spec.TaxInvoiceGetBulkResultApiResponse['issueResult']>[number]\n): TaxInvoiceBulkIssueSubmissionResultItem {\n return removeUndefinedProperties({\n invoiceDocumentKeyTypeCode: taxInvoiceApiResponse.keyType,\n supplierInvoiceManagementKey: taxInvoiceApiResponse.invoicerMgtKey,\n trusteeInvoiceManagementKey: taxInvoiceApiResponse.trusteeMgtKey,\n resultCode: preserveNumericCode(taxInvoiceApiResponse.code),\n resultMessage: taxInvoiceApiResponse.message,\n nationalTaxServiceConfirmationNumber: taxInvoiceApiResponse.ntsconfirmNum,\n receivedAt: taxInvoiceApiResponse.receiptDT,\n issuedAt: taxInvoiceApiResponse.issueDT,\n })\n}\n\n/**\n * 공급자 응답 필드를 도메인 공급자 정보로 변환합니다.\n */\nfunction mapSupplierOutput(taxInvoiceApiResponse: Spec.TaxInvoiceApiModel): TaxInvoicePartyOutput | undefined {\n return compactOptionalObject({\n businessNumber: taxInvoiceApiResponse.invoicerCorpNum,\n managementKey: taxInvoiceApiResponse.invoicerMgtKey,\n taxRegistrationIdentifier: taxInvoiceApiResponse.invoicerTaxRegID,\n residentRegistrationNumber: taxInvoiceApiResponse.invoicerRDN,\n foreignerRegistrationNumber: taxInvoiceApiResponse.invoicerOLN,\n branchBusinessNumber: taxInvoiceApiResponse.invoicerTaxNum,\n branchSerialNumber: taxInvoiceApiResponse.invoicerPSerialNum,\n corporationClassification: taxInvoiceApiResponse.invoicerCorpCls,\n companyName: taxInvoiceApiResponse.invoicerCorpName,\n chiefExecutiveOfficerName: taxInvoiceApiResponse.invoicerCEOName,\n address: taxInvoiceApiResponse.invoicerAddr,\n businessType: taxInvoiceApiResponse.invoicerBizType,\n businessClass: taxInvoiceApiResponse.invoicerBizClass,\n departmentName: taxInvoiceApiResponse.invoicerDeptName,\n contactName: taxInvoiceApiResponse.invoicerContactName,\n telephoneNumber: taxInvoiceApiResponse.invoicerTEL,\n mobilePhoneNumber: taxInvoiceApiResponse.invoicerHP,\n emailAddress: taxInvoiceApiResponse.invoicerEmail,\n sendTextMessage: preserveBooleanResponse(taxInvoiceApiResponse.invoicerSMSSendYN),\n printEnabled: preserveBooleanResponse(taxInvoiceApiResponse.invoicerPrintYN),\n })\n}\n\n/**\n * 공급받는자 응답 필드를 도메인 공급받는자 정보로 변환합니다.\n */\nfunction mapBuyerOutput(taxInvoiceApiResponse: Spec.TaxInvoiceApiModel): TaxInvoiceBuyerOutput | undefined {\n return compactOptionalObject({\n businessNumber: taxInvoiceApiResponse.invoiceeCorpNum,\n managementKey: taxInvoiceApiResponse.invoiceeMgtKey,\n taxRegistrationIdentifier: taxInvoiceApiResponse.invoiceeTaxRegID,\n residentRegistrationNumber: taxInvoiceApiResponse.invoiceeRDN,\n foreignerRegistrationNumber: taxInvoiceApiResponse.invoiceeOLN,\n branchBusinessNumber: taxInvoiceApiResponse.invoiceeTaxNum,\n branchSerialNumber: taxInvoiceApiResponse.invoiceePSerialNum,\n corporationClassification: taxInvoiceApiResponse.invoiceeCorpCls,\n companyName: taxInvoiceApiResponse.invoiceeCorpName,\n chiefExecutiveOfficerName: taxInvoiceApiResponse.invoiceeCEOName,\n address: taxInvoiceApiResponse.invoiceeAddr,\n businessType: taxInvoiceApiResponse.invoiceeBizType,\n businessClass: taxInvoiceApiResponse.invoiceeBizClass,\n departmentName: taxInvoiceApiResponse.invoiceeDeptName1,\n contactName: taxInvoiceApiResponse.invoiceeContactName1,\n telephoneNumber: taxInvoiceApiResponse.invoiceeTEL1,\n mobilePhoneNumber: taxInvoiceApiResponse.invoiceeHP1,\n emailAddress: taxInvoiceApiResponse.invoiceeEmail1,\n sendTextMessage: preserveBooleanResponse(taxInvoiceApiResponse.invoiceeSMSSendYN),\n printEnabled: preserveBooleanResponse(taxInvoiceApiResponse.invoiceePrintYN),\n recipientType: taxInvoiceApiResponse.invoiceeType,\n primaryDepartmentName: taxInvoiceApiResponse.invoiceeDeptName1,\n secondaryDepartmentName: taxInvoiceApiResponse.invoiceeDeptName2,\n secondaryContactName: taxInvoiceApiResponse.invoiceeContactName2,\n secondaryTelephoneNumber: taxInvoiceApiResponse.invoiceeTEL2,\n secondaryMobilePhoneNumber: taxInvoiceApiResponse.invoiceeHP2,\n secondaryEmailAddress: taxInvoiceApiResponse.invoiceeEmail2,\n businessStatus: preserveNumericCode(taxInvoiceApiResponse.closeDownState),\n businessStatusDate: taxInvoiceApiResponse.closeDownStateDate,\n })\n}\n\n/**\n * 수탁자 응답 필드를 도메인 수탁자 정보로 변환합니다.\n */\nfunction mapTrusteeOutput(taxInvoiceApiResponse: Spec.TaxInvoiceApiModel): TaxInvoicePartyOutput | undefined {\n return compactOptionalObject({\n businessNumber: taxInvoiceApiResponse.trusteeCorpNum,\n managementKey: taxInvoiceApiResponse.trusteeMgtKey,\n taxRegistrationIdentifier: taxInvoiceApiResponse.trusteeTaxRegID,\n residentRegistrationNumber: taxInvoiceApiResponse.trusteeRDN,\n foreignerRegistrationNumber: taxInvoiceApiResponse.trusteeOLN,\n branchBusinessNumber: taxInvoiceApiResponse.trusteeTaxNum,\n branchSerialNumber: taxInvoiceApiResponse.trusteePSerialNum,\n corporationClassification: taxInvoiceApiResponse.trusteeCorpCls,\n companyName: taxInvoiceApiResponse.trusteeCorpName,\n chiefExecutiveOfficerName: taxInvoiceApiResponse.trusteeCEOName,\n address: taxInvoiceApiResponse.trusteeAddr,\n businessType: taxInvoiceApiResponse.trusteeBizType,\n businessClass: taxInvoiceApiResponse.trusteeBizClass,\n departmentName: taxInvoiceApiResponse.trusteeDeptName,\n contactName: taxInvoiceApiResponse.trusteeContactName,\n telephoneNumber: taxInvoiceApiResponse.trusteeTEL,\n mobilePhoneNumber: taxInvoiceApiResponse.trusteeHP,\n emailAddress: taxInvoiceApiResponse.trusteeEmail,\n sendTextMessage: preserveBooleanResponse(taxInvoiceApiResponse.trusteeSMSSendYN),\n printEnabled: preserveBooleanResponse(taxInvoiceApiResponse.trusteePrintYN),\n })\n}\n","/**\n * 작성일/일시 문자열 타입입니다.\n */\nexport type TaxInvoiceDateString = string\n\n/**\n * 세금계산서 과금 방향 값입니다.\n */\nexport const TaxInvoiceChargeDirectionValues = {\n /**\n * 값: `정과금`, 의미: 공급자에게 과금되는 일반 방향\n */\n NormalCharge: '정과금',\n /**\n * 값: `역과금`, 의미: 공급받는자에게 과금되는 역방향\n */\n ReverseCharge: '역과금',\n} as const\n\n/**\n * 세금계산서 과금 방향 타입입니다.\n */\nexport type TaxInvoiceChargeDirection = (typeof TaxInvoiceChargeDirectionValues)[keyof typeof TaxInvoiceChargeDirectionValues]\n\n/**\n * 세금계산서 발행 형태 값입니다.\n */\nexport const TaxInvoiceIssueTypes = {\n /**\n * 값: `정발행`, 의미: 공급자 중심의 일반 발행\n */\n Normal: '정발행',\n /**\n * 값: `역발행`, 의미: 공급받는자 요청 기반 발행\n */\n Reverse: '역발행',\n /**\n * 값: `위수탁`, 의미: 수탁자 대행 발행\n */\n Trustee: '위수탁',\n} as const\n\n/**\n * 세금계산서 발행 형태 타입입니다.\n */\nexport type TaxInvoiceIssueType = (typeof TaxInvoiceIssueTypes)[keyof typeof TaxInvoiceIssueTypes]\n\n/**\n * 세금계산서 영수/청구 값입니다.\n */\nexport const TaxInvoicePurposeTypes = {\n /**\n * 값: `영수`, 의미: 영수 목적\n */\n Receipt: '영수',\n /**\n * 값: `청구`, 의미: 청구 목적\n */\n Claim: '청구',\n /**\n * 값: `없음`, 의미: 목적 구분 없음\n */\n None: '없음',\n} as const\n\n/**\n * 세금계산서 영수/청구 타입입니다.\n */\nexport type TaxInvoicePurposeType = (typeof TaxInvoicePurposeTypes)[keyof typeof TaxInvoicePurposeTypes]\n\n/**\n * 세금계산서 과세 유형 값입니다.\n */\nexport const TaxInvoiceTaxationTypes = {\n /**\n * 값: `과세`, 의미: 일반 과세\n */\n Taxable: '과세',\n /**\n * 값: `영세`, 의미: 영세율\n */\n ZeroRated: '영세',\n /**\n * 값: `면세`, 의미: 면세\n */\n Exempt: '면세',\n} as const\n\n/**\n * 세금계산서 과세 유형 타입입니다.\n */\nexport type TaxInvoiceTaxationType = (typeof TaxInvoiceTaxationTypes)[keyof typeof TaxInvoiceTaxationTypes]\n\n/**\n * 공급받는자 구분 값입니다.\n */\nexport const TaxInvoiceRecipientTypes = {\n /**\n * 값: `사업자`, 의미: 사업자 번호 기반\n */\n Business: '사업자',\n /**\n * 값: `개인`, 의미: 주민등록번호 기반\n */\n Individual: '개인',\n /**\n * 값: `외국인`, 의미: 외국인 식별번호 기반\n */\n Foreigner: '외국인',\n} as const\n\n/**\n * 공급받는자 구분 타입입니다.\n */\nexport type TaxInvoiceRecipientType = (typeof TaxInvoiceRecipientTypes)[keyof typeof TaxInvoiceRecipientTypes]\n\n/**\n * 공급받는자 휴폐업 상태 값입니다.\n */\nexport const TaxInvoiceBusinessStatusValues = {\n /**\n * 값: `null`, 의미: 미확인\n */\n NotChecked: null,\n /**\n * 값: `0`, 의미: 미등록\n */\n NotRegistered: 0,\n /**\n * 값: `1`, 의미: 사업중\n */\n Operating: 1,\n /**\n * 값: `2`, 의미: 폐업\n */\n Closed: 2,\n /**\n * 값: `3`, 의미: 휴업\n */\n Suspended: 3,\n /**\n * 값: `4`, 의미: 확인실패\n */\n CheckFailed: 4,\n} as const\n\n/**\n * 공급받는자 휴폐업 상태 타입입니다.\n */\nexport type TaxInvoiceBusinessStatus = (typeof TaxInvoiceBusinessStatusValues)[keyof typeof TaxInvoiceBusinessStatusValues]\n\n/**\n * 수정세금계산서 사유코드 값입니다.\n */\nexport const TaxInvoiceModificationReasonCodes = {\n /**\n * 값: `1`, 의미: 기재사항 착오 정정\n */\n CorrectingEntryErrors: 1,\n /**\n * 값: `2`, 의미: 공급가액 변동\n */\n SupplyAmountAdjustment: 2,\n /**\n * 값: `3`, 의미: 환입\n */\n Return: 3,\n /**\n * 값: `4`, 의미: 계약의 해제\n */\n ContractCancellation: 4,\n /**\n * 값: `5`, 의미: 내국신용장 사후 개설\n */\n PostIssuedDomesticLetterOfCredit: 5,\n /**\n * 값: `6`, 의미: 착오에 의한 이중 발급\n */\n DuplicateIssuanceByMistake: 6,\n} as const\n\n/**\n * 수정세금계산서 사유코드 타입입니다.\n */\nexport type TaxInvoiceModificationReasonCode = (typeof TaxInvoiceModificationReasonCodes)[keyof typeof TaxInvoiceModificationReasonCodes]\n\n/**\n * 세금계산서 상세 품목 입력입니다.\n */\nexport interface TaxInvoiceLineItemInput {\n /**\n * 상세 품목의 순번입니다.\n */\n lineNumber: number\n /**\n * 거래일자(yyyyMMdd)입니다.\n */\n transactionDate?: TaxInvoiceDateString\n /**\n * 품목명입니다.\n */\n itemName?: string\n /**\n * 규격입니다.\n */\n specification?: string\n /**\n * 수량입니다.\n */\n quantity?: string\n /**\n * 단가입니다.\n */\n unitCostAmount?: string\n /**\n * 공급가액입니다.\n */\n supplyCostAmount?: string\n /**\n * 세액입니다.\n */\n taxAmount?: string\n /**\n * 품목 비고입니다.\n */\n remark?: string\n}\n\n/**\n * 세금계산서 추가 담당자 입력입니다.\n */\nexport interface TaxInvoiceAdditionalContactInput {\n /**\n * 추가 담당자의 순번입니다.\n */\n sequenceNumber: number\n /**\n * 추가 담당자 이름입니다.\n */\n contactName?: string\n /**\n * 추가 담당자 이메일 주소입니다.\n */\n emailAddress: string\n}\n\n/**\n * 세금계산서 당사자 공통 입력입니다.\n */\nexport interface TaxInvoicePartyInput {\n /**\n * 사업자번호입니다.\n */\n businessNumber?: string\n /**\n * 문서 관리번호입니다.\n */\n managementKey?: string\n /**\n * 종사업장 식별번호입니다.\n */\n taxRegistrationIdentifier?: string\n /**\n * 주민등록번호입니다.\n */\n residentRegistrationNumber?: string\n /**\n * 외국인 등록번호입니다.\n */\n foreignerRegistrationNumber?: string\n /**\n * 종사업자번호입니다.\n */\n branchBusinessNumber?: string\n /**\n * 종사업자 일련번호입니다.\n */\n branchSerialNumber?: string\n /**\n * 법인 구분값입니다.\n */\n corporationClassification?: string\n /**\n * 상호입니다.\n */\n companyName?: string\n /**\n * 대표자 성명입니다.\n */\n chiefExecutiveOfficerName?: string\n /**\n * 주소입니다.\n */\n address?: string\n /**\n * 종목입니다.\n */\n businessType?: string\n /**\n * 업태입니다.\n */\n businessClass?: string\n /**\n * 부서명입니다.\n */\n departmentName?: string\n /**\n * 담당자 이름입니다.\n */\n contactName?: string\n /**\n * 담당자 전화번호입니다.\n */\n telephoneNumber?: string\n /**\n * 담당자 휴대폰번호입니다.\n */\n mobilePhoneNumber?: string\n /**\n * 담당자 이메일 주소입니다.\n */\n emailAddress?: string\n /**\n * 담당자 휴대폰 문자 발송 여부입니다.\n */\n sendTextMessage?: boolean\n /**\n * 인쇄 여부입니다.\n */\n printEnabled?: boolean\n}\n\n/**\n * 세금계산서 공급받는자 입력입니다.\n */\nexport interface TaxInvoiceBuyerInput extends TaxInvoicePartyInput {\n /**\n * 공급받는자 구분입니다.\n */\n recipientType?: TaxInvoiceRecipientType\n /**\n * 주 담당 부서명입니다.\n */\n primaryDepartmentName?: string\n /**\n * 예비 담당 부서명입니다.\n */\n secondaryDepartmentName?: string\n /**\n * 예비 담당자 이름입니다.\n */\n secondaryContactName?: string\n /**\n * 예비 담당자 전화번호입니다.\n */\n secondaryTelephoneNumber?: string\n /**\n * 예비 담당자 휴대폰번호입니다.\n */\n secondaryMobilePhoneNumber?: string\n /**\n * 예비 담당자 이메일 주소입니다.\n */\n secondaryEmailAddress?: string\n /**\n * 휴폐업 상태입니다.\n */\n businessStatus?: TaxInvoiceBusinessStatus\n /**\n * 휴폐업일자(yyyyMMdd)입니다.\n */\n businessStatusDate?: TaxInvoiceDateString\n}\n\n/**\n * 세금계산서 결제/합계 금액 입력입니다.\n */\nexport interface TaxInvoicePaymentSummaryInput {\n /**\n * 공급가액 합계입니다.\n */\n totalSupplyCostAmount?: string\n /**\n * 세액 합계입니다.\n */\n totalTaxAmount?: string\n /**\n * 합계 금액입니다.\n */\n totalAmount?: string\n /**\n * 현금 금액입니다.\n */\n cashAmount?: string\n /**\n * 수표 금액입니다.\n */\n checkAmount?: string\n /**\n * 어음 금액입니다.\n */\n promissoryNoteAmount?: string\n /**\n * 외상 금액입니다.\n */\n creditAmount?: string\n}\n\n/**\n * 세금계산서 수정 사유 입력입니다.\n */\nexport interface TaxInvoiceModificationInput {\n /**\n * 수정 사유코드입니다.\n */\n modificationReasonCode?: TaxInvoiceModificationReasonCode\n /**\n * 원본 문서의 국세청 승인번호입니다.\n */\n originalNationalTaxServiceConfirmationNumber?: string\n}\n\n/**\n * 세금계산서 문서 입력입니다.\n */\nexport interface TaxInvoiceDocumentInput {\n /**\n * 기재상 일련번호입니다.\n */\n taxInvoiceSerialNumber?: string\n /**\n * 책번호 권 항목입니다.\n */\n bookVolumeNumber?: number | string\n /**\n * 책번호 호 항목입니다.\n */\n bookIssueNumber?: number | string\n /**\n * 작성일자(yyyyMMdd)입니다.\n */\n writtenDate?: TaxInvoiceDateString\n /**\n * 발행 형태입니다.\n */\n issueType?: TaxInvoiceIssueType\n /**\n * 발행시기 코드입니다.\n */\n issueTimingCode?: string\n /**\n * 과세 유형입니다.\n */\n taxType?: TaxInvoiceTaxationType\n /**\n * 영수/청구 구분입니다.\n */\n purposeType?: TaxInvoicePurposeType\n /**\n * 과금 방향입니다.\n */\n chargeDirection?: TaxInvoiceChargeDirection\n /**\n * 공급자 정보입니다.\n */\n supplier?: TaxInvoicePartyInput\n /**\n * 공급받는자 정보입니다.\n */\n buyer?: TaxInvoiceBuyerInput\n /**\n * 수탁자 정보입니다.\n */\n trustee?: TaxInvoicePartyInput\n /**\n * 금액 정보입니다.\n */\n paymentSummary?: TaxInvoicePaymentSummaryInput\n /**\n * 수정세금계산서 정보입니다.\n */\n modification?: TaxInvoiceModificationInput\n /**\n * 상세 품목 목록입니다.\n */\n lineItems?: TaxInvoiceLineItemInput[]\n /**\n * 추가 담당자 목록입니다.\n */\n additionalContacts?: TaxInvoiceAdditionalContactInput[]\n /**\n * 비고1입니다.\n */\n remarkOne?: string\n /**\n * 비고2입니다.\n */\n remarkTwo?: string\n /**\n * 비고3입니다.\n */\n remarkThree?: string\n /**\n * 거래명세서 동시작성 여부입니다.\n */\n writeSpecificationEnabled?: boolean\n /**\n * 사업자등록증 이미지 첨부 여부입니다.\n */\n includeBusinessLicenseImage?: boolean\n /**\n * 통장사본 이미지 첨부 여부입니다.\n */\n includeBankBookImage?: boolean\n}\n","import type * as document from './document'\nimport type { ProviderBoolean, ProviderNumericCode } from '@connextable/popbill-utils'\n\n/**\n * 세금계산서 공통 처리 결과입니다.\n */\nexport interface TaxInvoiceOperationResult {\n /**\n * 처리 결과 코드입니다.\n */\n resultCode: ProviderNumericCode | undefined\n /**\n * 처리 결과 메시지입니다.\n */\n resultMessage: string\n}\n\n/**\n * 발행 처리 결과입니다.\n */\nexport interface TaxInvoiceIssueResult extends TaxInvoiceOperationResult {\n /**\n * 국세청 승인번호입니다.\n */\n nationalTaxServiceConfirmationNumber?: string\n /**\n * 발행일시(yyyyMMddHHmmss)입니다.\n */\n issuedAt?: string\n}\n\n/**\n * 초대량 접수 결과입니다.\n */\nexport interface TaxInvoiceBulkSubmitResult extends TaxInvoiceOperationResult {\n /**\n * 접수 식별자입니다.\n */\n receiptIdentifier?: string\n}\n\n/**\n * 초대량 처리 상태 값입니다.\n */\nexport const TaxInvoiceBulkIssueSubmissionTransactionStates = {\n /**\n * 값: `0`, 의미: 미처리 상태\n */\n NotProcessed: 0,\n /**\n * 값: `1`, 의미: 처리중 상태\n */\n Processing: 1,\n /**\n * 값: `2`, 의미: 완료 상태\n */\n Completed: 2,\n} as const\n\n/**\n * 초대량 처리 상태 타입입니다.\n */\nexport type TaxInvoiceBulkIssueSubmissionTransactionState = ProviderNumericCode\n\n/**\n * 초대량 발행 개별 처리 결과입니다.\n */\nexport interface TaxInvoiceBulkIssueSubmissionResultItem {\n /**\n * 문서번호 유형 코드입니다.\n */\n invoiceDocumentKeyTypeCode?: string\n /**\n * 공급자 문서번호입니다.\n */\n supplierInvoiceManagementKey?: string\n /**\n * 수탁자 문서번호입니다.\n */\n trusteeInvoiceManagementKey?: string\n /**\n * 개별 처리 결과 코드입니다.\n */\n resultCode?: ProviderNumericCode\n /**\n * 개별 처리 결과 메시지입니다.\n */\n resultMessage?: string\n /**\n * 국세청 승인번호입니다.\n */\n nationalTaxServiceConfirmationNumber?: string\n /**\n * 접수일시(yyyyMMddHHmmss)입니다.\n */\n receivedAt?: string\n /**\n * 발행일시(yyyyMMddHHmmss)입니다.\n */\n issuedAt?: string\n}\n\n/**\n * 초대량 접수결과 조회 결과입니다.\n */\nexport interface TaxInvoiceBulkIssueSubmissionResult extends TaxInvoiceOperationResult {\n /**\n * 제출 식별자입니다.\n */\n submissionIdentifier?: string\n /**\n * 접수 식별자입니다.\n */\n receiptIdentifier?: string\n /**\n * 제출 건수입니다.\n */\n submittedDocumentCount?: number\n /**\n * 성공 건수입니다.\n */\n succeededDocumentCount?: number\n /**\n * 실패 건수입니다.\n */\n failedDocumentCount?: number\n /**\n * 처리 상태입니다.\n */\n transactionState?: TaxInvoiceBulkIssueSubmissionTransactionState\n /**\n * 처리 결과 코드입니다.\n */\n transactionResultCode?: ProviderNumericCode\n /**\n * 개별 처리 결과 목록입니다.\n */\n issueResults?: TaxInvoiceBulkIssueSubmissionResultItem[]\n /**\n * 접수일시(yyyyMMddHHmmss)입니다.\n */\n receivedAt?: string\n /**\n * 처리 시작일시(yyyyMMddHHmmss)입니다.\n */\n transactionStartedAt?: string\n /**\n * 처리 완료일시(yyyyMMddHHmmss)입니다.\n */\n transactionCompletedAt?: string\n}\n\n/**\n * 문서 요약정보 조회 결과입니다.\n */\nexport interface TaxInvoiceInfo {\n /**\n * 팝빌 문서 식별키(ItemKey)입니다.\n */\n itemKey: string\n /**\n * 국세청 승인번호입니다.\n */\n nationalTaxServiceConfirmationNumber?: string\n /**\n * 공급자 사업자번호입니다.\n */\n supplierBusinessNumber: string\n /**\n * 공급자 문서번호입니다.\n */\n supplierManagementKey?: string\n /**\n * 공급받는자 사업자번호입니다.\n */\n buyerBusinessNumber: string\n /**\n * 공급받는자 문서번호입니다.\n */\n buyerManagementKey?: string\n /**\n * 수탁자 사업자번호입니다.\n */\n trusteeBusinessNumber?: string\n /**\n * 수탁자 문서번호입니다.\n */\n trusteeManagementKey?: string\n /**\n * 과세유형입니다.\n */\n taxType: string | null\n /**\n * 발행유형입니다.\n */\n issueType: string | null\n /**\n * 영수/청구 구분입니다.\n */\n purposeType: string | null\n /**\n * 공급가액 합계입니다.\n */\n totalSupplyCost: string\n /**\n * 세액 합계입니다.\n */\n totalTax: string\n /**\n * 수정사유코드입니다.\n */\n modificationCode?: ProviderNumericCode\n /**\n * 공급자 상호입니다.\n */\n supplierCompanyName: string\n /**\n * 공급받는자 상호입니다.\n */\n buyerCompanyName: string\n /**\n * 수탁자 상호입니다.\n */\n trusteeCompanyName?: string\n /**\n * 상태 코드입니다.\n */\n stateCode?: ProviderNumericCode\n /**\n * 상태 메모입니다.\n */\n stateMemo?: string\n /**\n * 국세청 전송 결과 코드입니다.\n */\n nationalTaxServiceResult?: ProviderNumericCode\n /**\n * 국세청 전송 오류 코드입니다.\n */\n nationalTaxServiceSendErrorCode?: ProviderNumericCode\n /**\n * 지연발행 여부입니다.\n */\n isLateIssued?: ProviderBoolean\n /**\n * 개봉 여부입니다.\n */\n isOpen?: ProviderBoolean\n /**\n * 연동 문서 여부입니다.\n */\n isApiLinkedDocument?: ProviderBoolean\n /**\n * 공급자 인쇄 여부입니다.\n */\n isSupplierPrinted?: ProviderBoolean\n /**\n * 공급받는자 인쇄 여부입니다.\n */\n isBuyerPrinted?: ProviderBoolean\n /**\n * 수탁자 인쇄 여부입니다.\n */\n isTrusteePrinted?: ProviderBoolean\n /**\n * 공급받는자 휴폐업 상태입니다.\n */\n buyerBusinessStatus?: ProviderNumericCode\n /**\n * 작성일자(yyyyMMdd)입니다.\n */\n writtenDate: string\n /**\n * 등록일시(yyyyMMddHHmmss)입니다.\n */\n registeredAt: string\n /**\n * 발행일시(yyyyMMddHHmmss)입니다.\n */\n issuedAt?: string\n /**\n * 상태 변경일시(yyyyMMddHHmmss)입니다.\n */\n stateChangedAt: string\n /**\n * 개봉일시(yyyyMMddHHmmss)입니다.\n */\n openedAt?: string\n /**\n * 국세청 전송일시(yyyyMMddHHmmss)입니다.\n */\n nationalTaxServiceSentAt?: string\n /**\n * 국세청 결과 수신일시(yyyyMMddHHmmss)입니다.\n */\n nationalTaxServiceResultReceivedAt?: string\n /**\n * 공급받는자 휴폐업일자(yyyyMMdd)입니다.\n */\n buyerBusinessStatusDate?: string\n}\n\n/**\n * 서버가 반환한 공급자·수탁자 플래그를 보존하는 정보입니다.\n */\nexport interface TaxInvoicePartyOutput extends Omit<document.TaxInvoicePartyInput, 'sendTextMessage' | 'printEnabled'> {\n sendTextMessage?: ProviderBoolean\n printEnabled?: ProviderBoolean\n}\n\n/** 공급받는자 분류와 플래그는 새로운 서버 값도 보존합니다. */\nexport interface TaxInvoiceBuyerOutput extends Omit<\n document.TaxInvoiceBuyerInput,\n 'sendTextMessage' | 'printEnabled' | 'recipientType' | 'businessStatus'\n> {\n sendTextMessage?: ProviderBoolean\n printEnabled?: ProviderBoolean\n recipientType?: string | null\n businessStatus?: ProviderNumericCode\n}\n\n/** 서버가 반환한 수정사유 코드를 보존합니다. */\nexport interface TaxInvoiceModificationOutput extends Omit<document.TaxInvoiceModificationInput, 'modificationReasonCode'> {\n modificationReasonCode?: ProviderNumericCode\n}\n\n/** 문서 상세조회 결과입니다. 입력 enum과 별도로 서버의 새 분류값을 보존합니다. */\nexport interface TaxInvoiceDocumentOutput extends Omit<\n document.TaxInvoiceDocumentInput,\n | 'issueType'\n | 'taxType'\n | 'purposeType'\n | 'chargeDirection'\n | 'supplier'\n | 'buyer'\n | 'trustee'\n | 'modification'\n | 'writeSpecificationEnabled'\n | 'includeBusinessLicenseImage'\n | 'includeBankBookImage'\n> {\n issueType?: string | null\n taxType?: string | null\n purposeType?: string | null\n chargeDirection?: string | null\n supplier?: TaxInvoicePartyOutput\n buyer?: TaxInvoiceBuyerOutput\n trustee?: TaxInvoicePartyOutput\n modification?: TaxInvoiceModificationOutput\n writeSpecificationEnabled?: ProviderBoolean\n includeBusinessLicenseImage?: ProviderBoolean\n includeBankBookImage?: ProviderBoolean\n /**\n * 국세청 승인번호입니다.\n */\n nationalTaxServiceConfirmationNumber?: string\n /**\n * 상태 코드입니다.\n */\n stateCode?: ProviderNumericCode\n /**\n * 국세청 전송 결과 코드입니다.\n */\n nationalTaxServiceResultCode?: ProviderNumericCode\n /**\n * 국세청 전송 오류 코드입니다.\n */\n nationalTaxServiceSendErrorCode?: ProviderNumericCode\n /**\n * 지연발행 여부입니다.\n */\n isLateIssued?: ProviderBoolean\n /**\n * 개봉 여부입니다.\n */\n isOpen?: ProviderBoolean\n /**\n * API 연동 문서 여부입니다.\n */\n isApiLinkedDocument?: ProviderBoolean\n /**\n * 발행일시(yyyyMMddHHmmss)입니다.\n */\n issuedAt?: string\n /**\n * 상태 변경일시(yyyyMMddHHmmss)입니다.\n */\n stateChangedAt?: string\n /**\n * 개봉일시(yyyyMMddHHmmss)입니다.\n */\n openedAt?: string\n /**\n * 국세청 전송일시(yyyyMMddHHmmss)입니다.\n */\n nationalTaxServiceSentAt?: string\n /**\n * 국세청 결과 수신일시(yyyyMMddHHmmss)입니다.\n */\n nationalTaxServiceResultReceivedAt?: string\n}\n\n/**\n * 문서번호 사용 여부 조회 결과입니다.\n */\nexport interface TaxInvoiceInvoiceManagementKeyUsage {\n /**\n * 문서번호 사용 여부입니다.\n */\n isInUse: boolean\n /**\n * 사용중인 경우 팝빌 문서 식별키입니다.\n */\n itemKey?: string\n}\n\n/**\n * XML 조회 결과입니다.\n */\nexport interface TaxInvoiceXmlResult {\n /**\n * 처리 결과입니다.\n */\n operationResult?: TaxInvoiceOperationResult\n /**\n * 팝빌 문서 식별키입니다.\n */\n itemKey?: string\n /**\n * 문서번호입니다.\n */\n invoiceManagementKey?: string\n /**\n * XML 원문입니다.\n */\n xmlContent?: string\n}\n\nexport interface TaxInvoicePdfDocument {\n /** PDF 원본 바이트. */\n fileData: Uint8Array\n}\n\n/**\n * 검색 조회 결과입니다.\n */\nexport interface TaxInvoiceSearchResult {\n /**\n * 처리 결과입니다.\n */\n operationResult: TaxInvoiceOperationResult\n /**\n * 현재 페이지 번호입니다.\n */\n pageNumber?: number\n /**\n * 페이지당 건수입니다.\n */\n pageSize?: number\n /**\n * 전체 페이지 수입니다.\n */\n pageCount?: number\n /**\n * 총 검색 건수입니다.\n */\n totalCount?: number\n /**\n * 문서 요약 목록입니다.\n */\n invoiceSummaries: TaxInvoiceInfo[]\n}\n\n/**\n * 문서 상태 이력 항목입니다.\n */\nexport interface TaxInvoiceLogEntry {\n /**\n * 문서 이력 유형 코드입니다.\n */\n documentLogTypeCode?: ProviderNumericCode\n /**\n * 로그 메시지입니다.\n */\n logMessage?: string\n /**\n * 처리 유형 코드입니다.\n */\n processTypeCode?: string | null\n /**\n * 처리 회사명입니다.\n */\n processCompanyName?: string\n /**\n * 처리 담당자명입니다.\n */\n processContactName?: string\n /**\n * 처리 설명입니다.\n */\n processDescription?: string\n /**\n * 등록일시(yyyyMMddHHmmss)입니다.\n */\n registeredAt?: string\n /**\n * 처리 IP 주소입니다.\n */\n ipAddress?: string\n}\n\n/**\n * URL 응답 결과입니다.\n */\nexport interface TaxInvoiceAccessUrl {\n /**\n * 접근 URL입니다.\n */\n accessUrl: string\n}\n\n/**\n * 첨부파일 메타데이터입니다.\n */\nexport interface TaxInvoiceAttachedFile {\n /**\n * 첨부 순번입니다.\n */\n sequenceNumber?: number\n /**\n * 파일 식별자입니다.\n */\n fileIdentifier?: string\n /**\n * 표시 이름입니다.\n */\n displayName?: string\n /**\n * 등록일시(yyyyMMddHHmmss)입니다.\n */\n registeredAt?: string\n}\n\n/**\n * 이메일 전송 설정 항목입니다.\n */\nexport interface TaxInvoiceEmailSendSetting {\n /**\n * 메일 유형 코드입니다.\n */\n emailTypeCode?: string | null\n /**\n * 전송 활성화 여부입니다.\n */\n sendEnabled?: ProviderBoolean\n}\n\n/**\n * 국세청 전송 설정입니다.\n */\nexport interface TaxInvoiceSendToNationalTaxServiceSetting {\n /**\n * 즉시 전송 여부입니다.\n */\n sendToNationalTaxServiceEnabled?: ProviderBoolean\n}\n\n/** ASP사업자 유통메일 공개키 조회 결과입니다. */\nexport interface TaxInvoiceEmailPublicKeys {\n /** 공식 SDK의 원본 응답입니다. 공개된 필드 계약이 없어 사용 전에 구조를 확인해야 합니다. */\n publicKeys: unknown\n}\n\n/**\n * 인증서 만료일 조회 결과입니다.\n */\nexport interface TaxInvoiceTaxCertificateExpiration {\n /**\n * 만료일시(yyyyMMddHHmmss)입니다.\n */\n expirationDateTime: string\n}\n\n/**\n * 인증서 정보 조회 결과입니다.\n */\nexport interface TaxInvoiceTaxCertificateInfo {\n /**\n * 발급자 DN입니다.\n */\n issuerDistinguishedName?: string\n /**\n * 인증서 DN입니다.\n */\n subjectDistinguishedName?: string\n /**\n * 인증서 종류명입니다.\n */\n issuerName?: string\n /**\n * 인증서 정책 OID입니다.\n */\n policyObjectIdentifier?: string\n /**\n * 등록 담당자 아이디입니다.\n */\n registeredContactIdentifier?: string\n /**\n * 등록 담당자 이름입니다.\n */\n registeredContactName?: string\n /**\n * 등록일시(yyyyMMddHHmmss)입니다.\n */\n registeredAt?: string\n /**\n * 만료일시(yyyyMMddHHmmss)입니다.\n */\n expiredAt?: string\n}\n\n/** 전자세금계산서 과금정보. */\nexport interface TaxInvoiceChargeInfo {\n /** 정밀도 손실 없는 단가 문자열. */\n unitCost: string\n chargeMethod: string | null\n rateSystem: string | null\n}\n\nexport interface TaxInvoiceUnitCost {\n unitCost: string\n}\n","import {\n TaxInvoiceModificationReasonCodes,\n type TaxInvoiceDateString,\n type TaxInvoiceDocumentInput,\n type TaxInvoiceModificationReasonCode,\n} from './document'\nimport type * as response from './response'\nexport {\n TaxInvoiceBusinessStatusValues,\n TaxInvoiceChargeDirectionValues,\n TaxInvoiceIssueTypes,\n TaxInvoiceModificationReasonCodes,\n TaxInvoicePurposeTypes,\n TaxInvoiceRecipientTypes,\n TaxInvoiceTaxationTypes,\n} from './document'\nexport type {\n TaxInvoiceAdditionalContactInput,\n TaxInvoiceBusinessStatus,\n TaxInvoiceChargeDirection,\n TaxInvoiceDateString,\n TaxInvoiceDocumentInput,\n TaxInvoiceIssueType,\n TaxInvoiceLineItemInput,\n TaxInvoiceModificationReasonCode,\n TaxInvoicePartyInput,\n TaxInvoicePurposeType,\n TaxInvoiceRecipientType,\n TaxInvoiceTaxationType,\n TaxInvoiceBuyerInput,\n} from './document'\nexport * from './response'\n\n/**\n * 세금계산서 문서번호 유형 상수입니다.\n */\nexport const TaxInvoiceDocumentKeyTypes = {\n /**\n * 코드: `SELL`, 설명: 매출 문서번호 유형\n */\n Sales: 'SELL',\n /**\n * 코드: `BUY`, 설명: 매입 문서번호 유형\n */\n Purchase: 'BUY',\n /**\n * 코드: `TRUSTEE`, 설명: 위수탁 문서번호 유형\n */\n Trustee: 'TRUSTEE',\n} as const\n\n/**\n * 세금계산서 문서번호 유형입니다.\n */\nexport type TaxInvoiceDocumentKeyType = (typeof TaxInvoiceDocumentKeyTypes)[keyof typeof TaxInvoiceDocumentKeyTypes]\nexport type TaxInvoiceOutboundDocumentKeyType = Extract<\n TaxInvoiceDocumentKeyType,\n typeof TaxInvoiceDocumentKeyTypes.Sales | typeof TaxInvoiceDocumentKeyTypes.Trustee\n>\nexport type TaxInvoiceReverseRequestDocumentKeyType = typeof TaxInvoiceDocumentKeyTypes.Purchase\nexport type TaxInvoiceReverseRefuseDocumentKeyType = typeof TaxInvoiceDocumentKeyTypes.Sales\n\n/**\n * 세금계산서 문서함 범위 상수입니다.\n */\nexport const TaxInvoiceBoxScopes = {\n /**\n * 코드: `TBOX`, 설명: 임시 문서함\n */\n TemporaryDocumentBox: 'TBOX',\n /**\n * 코드: `SWBOX`, 설명: 매출 발행 대기함\n */\n SalesIssueWaitingBox: 'SWBOX',\n /**\n * 코드: `SBOX`, 설명: 매출 문서함\n */\n SalesDocumentBox: 'SBOX',\n /**\n * 코드: `PWBOX`, 설명: 매입 발행 대기함\n */\n PurchaseIssueWaitingBox: 'PWBOX',\n /**\n * 코드: `PBOX`, 설명: 매입 문서함\n */\n PurchaseDocumentBox: 'PBOX',\n /**\n * 코드: `WRITE`, 설명: 정발행 작성\n */\n WriteInvoice: 'WRITE',\n} as const\n\n/**\n * 세금계산서 문서함 범위 값입니다.\n */\nexport type TaxInvoiceBoxScope = (typeof TaxInvoiceBoxScopes)[keyof typeof TaxInvoiceBoxScopes]\n\n/**\n * 검색일자 유형 상수입니다.\n */\nexport const TaxInvoiceDateType = {\n /**\n * 코드: `R`, 설명: 등록일자\n */\n Registered: 'R',\n /**\n * 코드: `W`, 설명: 작성일자\n */\n Written: 'W',\n /**\n * 코드: `I`, 설명: 발행일자\n */\n Issued: 'I',\n} as const\n\n/**\n * 검색일자 유형입니다.\n */\nexport type TaxInvoiceDateType = (typeof TaxInvoiceDateType)[keyof typeof TaxInvoiceDateType]\n\n/**\n * `packages/popbill` 검색 입력에서 허용하는 일자 타입입니다.\n */\nexport type TaxInvoiceDateInput = TaxInvoiceDateString | Date\n\n/**\n * 검색 정렬 방향 상수입니다.\n */\nexport const TaxInvoiceSortOrder = {\n /**\n * 코드: `D`, 설명: 내림차순\n */\n Descending: 'D',\n /**\n * 코드: `A`, 설명: 오름차순\n */\n Ascending: 'A',\n} as const\n\n/**\n * 검색 정렬 방향 코드입니다.\n */\nexport type TaxInvoiceSortOrder = (typeof TaxInvoiceSortOrder)[keyof typeof TaxInvoiceSortOrder]\n\n/**\n * 검색 상태코드 패턴입니다.\n *\n * 첫 자리는 숫자, 2/3번째 자리는 숫자 또는 `*`를 허용합니다.\n * 예) `300`, `3**`, `60*`\n */\nexport type TaxInvoiceSearchStateCode = string\n\n/**\n * 검색 문서유형 코드 상수입니다.\n */\nexport const TaxInvoiceSearchInvoiceTypeCodes = {\n /**\n * 코드: `N`, 설명: 세금계산서\n */\n Normal: 'N',\n /**\n * 코드: `M`, 설명: 수정세금계산서\n */\n Modified: 'M',\n} as const\n\n/**\n * 검색 문서유형 코드입니다.\n */\nexport type TaxInvoiceSearchInvoiceTypeCode = (typeof TaxInvoiceSearchInvoiceTypeCodes)[keyof typeof TaxInvoiceSearchInvoiceTypeCodes]\n\n/**\n * 검색 과세형태 코드 상수입니다.\n */\nexport const TaxInvoiceSearchTaxationTypeCodes = {\n /**\n * 코드: `T`, 설명: 과세\n */\n Taxable: 'T',\n /**\n * 코드: `N`, 설명: 면세\n */\n Exempt: 'N',\n /**\n * 코드: `Z`, 설명: 영세\n */\n ZeroRated: 'Z',\n} as const\n\n/**\n * 검색 과세형태 코드입니다.\n */\nexport type TaxInvoiceSearchTaxationTypeCode = (typeof TaxInvoiceSearchTaxationTypeCodes)[keyof typeof TaxInvoiceSearchTaxationTypeCodes]\n\n/**\n * 검색 발행형태 코드 상수입니다.\n */\nexport const TaxInvoiceSearchIssueTypeCodes = {\n /**\n * 코드: `N`, 설명: 정발행\n */\n Normal: 'N',\n /**\n * 코드: `R`, 설명: 역발행\n */\n Reverse: 'R',\n /**\n * 코드: `T`, 설명: 위수탁\n */\n Trustee: 'T',\n} as const\n\n/**\n * 검색 발행형태 코드입니다.\n */\nexport type TaxInvoiceSearchIssueTypeCode = (typeof TaxInvoiceSearchIssueTypeCodes)[keyof typeof TaxInvoiceSearchIssueTypeCodes]\n\n/**\n * 검색 종사업장번호 주체 코드 상수입니다.\n */\nexport const TaxInvoiceSearchTaxRegistrationIdentifierTypes = {\n /**\n * 코드: `S`, 설명: 공급자\n */\n Supplier: 'S',\n /**\n * 코드: `B`, 설명: 공급받는자\n */\n Buyer: 'B',\n /**\n * 코드: `T`, 설명: 수탁자\n */\n Trustee: 'T',\n} as const\n\n/**\n * 검색 종사업장번호 주체 코드입니다.\n */\nexport type TaxInvoiceSearchTaxRegistrationIdentifierType =\n (typeof TaxInvoiceSearchTaxRegistrationIdentifierTypes)[keyof typeof TaxInvoiceSearchTaxRegistrationIdentifierTypes]\n\n/**\n * 검색 종사업장번호 유무 코드 상수입니다.\n */\nexport const TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities = {\n /**\n * 코드: `0`, 설명: 종사업장번호 없음\n */\n No: '0',\n /**\n * 코드: `1`, 설명: 종사업장번호 있음\n */\n Yes: '1',\n} as const\n\n/**\n * 검색 종사업장번호 유무 코드입니다.\n */\nexport type TaxInvoiceSearchTaxRegistrationIdentifierAvailability =\n (typeof TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities)[keyof typeof TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities]\n\n/**\n * 검색 작성유형 코드 상수입니다.\n */\nexport const TaxInvoiceSearchInteroperabilityTypes = {\n /**\n * 코드: `0`, 설명: 팝빌 웹 작성\n */\n PopbillWeb: '0',\n /**\n * 코드: `1`, 설명: API 작성\n */\n Api: '1',\n} as const\n\n/**\n * 검색 작성유형 코드입니다.\n */\nexport type TaxInvoiceSearchInteroperabilityType = (typeof TaxInvoiceSearchInteroperabilityTypes)[keyof typeof TaxInvoiceSearchInteroperabilityTypes]\n\n/**\n * 검색 등록유형 코드 상수입니다.\n */\nexport const TaxInvoiceSearchRegistrationTypeCodes = {\n /**\n * 코드: `P`, 설명: 팝빌 등록(발행)\n */\n Popbill: 'P',\n /**\n * 코드: `H`, 설명: 홈택스/ASP 등록(발행)\n */\n HomeTax: 'H',\n} as const\n\n/**\n * 검색 등록유형 코드입니다.\n */\nexport type TaxInvoiceSearchRegistrationTypeCode = (typeof TaxInvoiceSearchRegistrationTypeCodes)[keyof typeof TaxInvoiceSearchRegistrationTypeCodes]\n\n/**\n * 검색 조건의 휴폐업 상태 상수입니다.\n */\nexport const TaxInvoiceCloseDownStateCodes = {\n /**\n * 코드: `N`, 설명: 미확인\n */\n NotChecked: 'N',\n /**\n * 코드: `0`, 설명: 미등록\n */\n NotRegistered: '0',\n /**\n * 코드: `1`, 설명: 사업중\n */\n Operating: '1',\n /**\n * 코드: `2`, 설명: 폐업\n */\n Closed: '2',\n /**\n * 코드: `3`, 설명: 휴업\n */\n Suspended: '3',\n /**\n * 코드: `4`, 설명: 확인실패\n */\n CheckFailed: '4',\n} as const\n\n/**\n * 검색 조건의 휴폐업 상태 코드입니다.\n */\nexport type TaxInvoiceCloseDownStateCode = (typeof TaxInvoiceCloseDownStateCodes)[keyof typeof TaxInvoiceCloseDownStateCodes]\n\n/**\n * 전자명세서 문서유형 코드 상수입니다.\n */\nexport const TaxInvoiceStatementItemCodes = {\n /**\n * 코드: `121`, 설명: 거래명세서\n */\n TradeStatement: 121,\n /**\n * 코드: `122`, 설명: 청구서\n */\n Invoice: 122,\n /**\n * 코드: `123`, 설명: 견적서\n */\n Estimate: 123,\n /**\n * 코드: `124`, 설명: 발주서\n */\n PurchaseOrder: 124,\n /**\n * 코드: `125`, 설명: 입금표\n */\n Deposit: 125,\n /**\n * 코드: `126`, 설명: 영수증\n */\n Receipt: 126,\n} as const\n\n/**\n * 전자명세서 문서유형 코드입니다.\n */\nexport type TaxInvoiceStatementItemCode = (typeof TaxInvoiceStatementItemCodes)[keyof typeof TaxInvoiceStatementItemCodes]\n\n/**\n * 메일 전송 유형 코드 상수입니다.\n */\nexport const TaxInvoiceEmailTypes = {\n /**\n * 코드: `ETC_CERT_EXPIRATION`, 설명: 인증서 만료 안내\n */\n EtcCertExpiration: 'ETC_CERT_EXPIRATION',\n /**\n * 코드: `TAX_CANCEL_ISSUE`, 설명: 발행취소\n */\n TaxCancelIssue: 'TAX_CANCEL_ISSUE',\n /**\n * 코드: `TAX_CANCEL_REQUEST`, 설명: 역발행 요청 취소\n */\n TaxCancelRequest: 'TAX_CANCEL_REQUEST',\n /**\n * 코드: `TAX_CHECK`, 설명: 수신확인\n */\n TaxCheck: 'TAX_CHECK',\n /**\n * 코드: `TAX_CLOSEDOWN`, 설명: 휴폐업 알림\n */\n TaxClosedown: 'TAX_CLOSEDOWN',\n /**\n * 코드: `TAX_ISSUE`, 설명: 발행완료(수신자)\n */\n TaxIssue: 'TAX_ISSUE',\n /**\n * 코드: `TAX_ISSUE_INVOICER`, 설명: 발행완료(공급자)\n */\n TaxIssueInvoicer: 'TAX_ISSUE_INVOICER',\n /**\n * 코드: `TAX_NTSFAIL_INVOICER`, 설명: 국세청 전송실패(공급자)\n */\n TaxNtsFailInvoicer: 'TAX_NTSFAIL_INVOICER',\n /**\n * 코드: `TAX_REFUSE`, 설명: 역발행 거부\n */\n TaxRefuse: 'TAX_REFUSE',\n /**\n * 코드: `TAX_REQUEST`, 설명: 역발행 요청\n */\n TaxRequest: 'TAX_REQUEST',\n /**\n * 코드: `TAX_REVERSE_ISSUE`, 설명: 역발행 완료\n */\n TaxReverseIssue: 'TAX_REVERSE_ISSUE',\n /**\n * 코드: `TAX_TRUST_CANCEL_ISSUE`, 설명: 위수탁 발행취소\n */\n TaxTrustCancelIssue: 'TAX_TRUST_CANCEL_ISSUE',\n /**\n * 코드: `TAX_TRUST_CANCEL_ISSUE_INVOICER`, 설명: 위수탁 발행취소(공급자)\n */\n TaxTrustCancelIssueInvoicer: 'TAX_TRUST_CANCEL_ISSUE_INVOICER',\n /**\n * 코드: `TAX_TRUST_ISSUE`, 설명: 위수탁 발행완료\n */\n TaxTrustIssue: 'TAX_TRUST_ISSUE',\n /**\n * 코드: `TAX_TRUST_ISSUE_INVOICER`, 설명: 위수탁 발행완료(공급자)\n */\n TaxTrustIssueInvoicer: 'TAX_TRUST_ISSUE_INVOICER',\n /**\n * 코드: `TAX_TRUST_ISSUE_TRUSTEE`, 설명: 위수탁 발행완료(수탁자)\n */\n TaxTrustIssueTrustee: 'TAX_TRUST_ISSUE_TRUSTEE',\n /**\n * 코드: `TAX_ACCEPT`, 설명: 역발행 승인(legacy)\n */\n TaxAccept: 'TAX_ACCEPT',\n /**\n * 코드: `TAX_DENY`, 설명: 역발행 거부(legacy)\n */\n TaxDeny: 'TAX_DENY',\n /**\n * 코드: `TAX_CANCEL_SEND`, 설명: 발행안함 취소(legacy)\n */\n TaxCancelSend: 'TAX_CANCEL_SEND',\n} as const\n\n/**\n * 메일 전송 유형 코드입니다.\n */\nexport type TaxInvoiceEmailType = (typeof TaxInvoiceEmailTypes)[keyof typeof TaxInvoiceEmailTypes]\n\n/**\n * 수정세금계산서 사유코드입니다.\n */\nexport const TaxInvoiceModificationCodes = TaxInvoiceModificationReasonCodes\n\n/**\n * 수정세금계산서 사유코드입니다.\n */\nexport type TaxInvoiceModificationCode = TaxInvoiceModificationReasonCode\n\n/**\n * 사업자번호 입력이 필요한 요청의 공통 필드입니다.\n */\nexport interface TaxInvoiceBusinessRequest {\n /**\n * 팝빌 회원 사업자번호입니다.\n */\n businessNumber: string\n}\n\n/**\n * 문서 식별(문서번호 유형 + 문서번호)이 필요한 요청의 공통 필드입니다.\n */\nexport interface TaxInvoiceDocumentRequest<TKeyType extends TaxInvoiceDocumentKeyType = TaxInvoiceDocumentKeyType> extends TaxInvoiceBusinessRequest {\n /**\n * 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TKeyType\n /**\n * 파트너가 관리하는 문서번호입니다.\n */\n invoiceManagementKey: string\n}\n\n/**\n * 즉시 발행 요청 입력입니다.\n */\nexport interface IssueInvoiceImmediatelyInput extends TaxInvoiceBusinessRequest {\n /**\n * 발행할 세금계산서 문서 원본입니다.\n */\n taxInvoiceDocument: TaxInvoiceDocumentInput\n /**\n * 거래명세서 동시작성 여부입니다.\n */\n writeSpecification?: boolean\n /**\n * 지연발행 허용 여부입니다.\n */\n forceIssue?: boolean\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo?: string\n /**\n * 발행 안내 메일 제목입니다.\n */\n emailSubject?: string\n /**\n * 거래명세서 관리번호입니다.\n */\n dealInvoiceManagementKey?: string\n}\n\n/**\n * 초대량 발행 접수 요청 입력입니다.\n */\nexport interface SubmitBulkIssueInput extends TaxInvoiceBusinessRequest {\n /**\n * 초대량 접수 식별자(SubmitID)입니다.\n */\n submissionIdentifier: string\n /**\n * 접수할 세금계산서 문서 목록입니다.\n */\n taxInvoiceDocuments: TaxInvoiceDocumentInput[]\n /**\n * 지연발행 허용 여부입니다.\n */\n forceIssue?: boolean\n}\n\n/**\n * 초대량 접수결과 조회 요청 입력입니다.\n */\nexport interface GetBulkIssueSubmissionResultInput extends TaxInvoiceBusinessRequest {\n /**\n * 조회할 초대량 접수 식별자(SubmitID)입니다.\n */\n submissionIdentifier: string\n}\n\n/**\n * 임시저장 요청 입력입니다.\n */\nexport interface RegisterInvoiceInput extends TaxInvoiceBusinessRequest {\n /**\n * 임시저장할 세금계산서 문서 원본입니다.\n */\n taxInvoiceDocument: TaxInvoiceDocumentInput\n}\n\n/**\n * 문서 수정 요청 입력입니다.\n */\nexport interface UpdateInvoiceInput extends TaxInvoiceDocumentRequest<TaxInvoiceOutboundDocumentKeyType> {\n /**\n * 수정 대상 문서번호 유형입니다. 매출(`SELL`) 또는 위수탁(`TRUSTEE`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceOutboundDocumentKeyType\n /**\n * 수정할 세금계산서 문서 원본입니다.\n */\n taxInvoiceDocument: TaxInvoiceDocumentInput\n}\n\n/**\n * 저장된 문서 발행 요청 입력입니다.\n */\nexport interface IssueInvoiceInput extends TaxInvoiceDocumentRequest<TaxInvoiceOutboundDocumentKeyType> {\n /**\n * 발행 대상 문서번호 유형입니다. 매출(`SELL`) 또는 위수탁(`TRUSTEE`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceOutboundDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n /**\n * 발행 안내 메일 제목입니다.\n */\n emailSubject?: string\n /**\n * 지연발행 허용 여부입니다.\n */\n forceIssue?: boolean\n}\n\n/**\n * 발행취소 요청 입력입니다.\n */\nexport interface CancelIssuedInvoiceInput extends TaxInvoiceDocumentRequest<TaxInvoiceOutboundDocumentKeyType> {\n /**\n * 발행취소 대상 문서번호 유형입니다. 매출(`SELL`) 또는 위수탁(`TRUSTEE`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceOutboundDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/**\n * 역발행 즉시 요청 입력입니다.\n */\nexport interface RequestReverseIssueImmediatelyInput extends TaxInvoiceBusinessRequest {\n /**\n * 역발행 요청할 세금계산서 문서 원본입니다.\n */\n taxInvoiceDocument: TaxInvoiceDocumentInput\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/**\n * 역발행 요청 입력입니다.\n */\nexport interface RequestReverseIssueInput extends TaxInvoiceDocumentRequest<TaxInvoiceReverseRequestDocumentKeyType> {\n /**\n * 역발행 요청 대상 문서번호 유형입니다. 매입(`BUY`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceReverseRequestDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/**\n * 역발행 요청취소 입력입니다.\n */\nexport interface CancelReverseIssueRequestInput extends TaxInvoiceDocumentRequest<TaxInvoiceReverseRequestDocumentKeyType> {\n /**\n * 역발행 요청취소 대상 문서번호 유형입니다. 매입(`BUY`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceReverseRequestDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/**\n * 역발행 요청거부 입력입니다.\n */\nexport interface RefuseReverseIssueRequestInput extends TaxInvoiceDocumentRequest<TaxInvoiceReverseRefuseDocumentKeyType> {\n /**\n * 역발행 요청거부 대상 문서번호 유형입니다. 매출(`SELL`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceReverseRefuseDocumentKeyType\n /**\n * 상태 이력에 남길 메모입니다.\n */\n historyMemo: string\n}\n\n/** 공식 SDK의 발행예정 전송 요청입니다. 현재 공개 HTTP 문서에는 설명되지 않은 레거시 동작입니다. */\nexport interface SendInvoiceInput extends TaxInvoiceDocumentRequest {\n /** 상태 이력에 남길 메모입니다. */\n historyMemo?: string\n /** 전송 안내 메일 제목입니다. */\n emailSubject?: string\n}\n\n/** 공식 SDK의 발행예정 전송 취소 요청입니다. */\nexport interface CancelInvoiceSendInput extends TaxInvoiceDocumentRequest {\n /** 상태 이력에 남길 메모입니다. */\n historyMemo?: string\n}\n\n/** 공식 SDK의 세금계산서 승인 요청입니다. */\nexport interface AcceptInvoiceInput extends TaxInvoiceDocumentRequest {\n /** 상태 이력에 남길 메모입니다. */\n historyMemo?: string\n}\n\n/** 공식 SDK의 세금계산서 거부 요청입니다. */\nexport interface DenyInvoiceInput extends TaxInvoiceDocumentRequest {\n /** 상태 이력에 남길 메모입니다. */\n historyMemo?: string\n}\n\n/**\n * 국세청 즉시 전송 입력입니다.\n */\nexport interface SendInvoiceToNationalTaxServiceInput extends TaxInvoiceDocumentRequest<TaxInvoiceOutboundDocumentKeyType> {\n /**\n * 국세청 전송 대상 문서번호 유형입니다. 매출(`SELL`) 또는 위수탁(`TRUSTEE`)만 사용할 수 있습니다.\n */\n invoiceDocumentKeyType: TaxInvoiceOutboundDocumentKeyType\n}\n\n/**\n * 다건 상태 조회 요청 입력입니다.\n */\nexport interface GetInvoicesInfoInput extends TaxInvoiceBusinessRequest {\n /**\n * 조회 대상 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TaxInvoiceDocumentKeyType\n /**\n * 조회 대상 문서번호 목록입니다.\n */\n invoiceManagementKeys: string[]\n}\n\n/** 세금계산서 PDF 원본 다운로드 입력입니다. */\nexport interface DownloadInvoicePdfInput extends TaxInvoiceDocumentRequest {\n /** 출력할 사본. 생략하면 공급자용과 공급받는자용을 모두 출력합니다. */\n printCopy?: 'supplier' | 'buyer'\n}\n\n/**\n * 검색 요청 입력입니다.\n */\nexport interface SearchInvoicesInput extends TaxInvoiceBusinessRequest {\n /**\n * 조회 대상 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TaxInvoiceDocumentKeyType\n /**\n * 검색 기준 일자 유형입니다.\n */\n searchDateType: TaxInvoiceDateType\n /**\n * 검색 시작일자(yyyyMMdd)입니다. `Date` 입력 시 KST 기준으로 변환됩니다.\n */\n startDate: TaxInvoiceDateInput\n /**\n * 검색 종료일자(yyyyMMdd)입니다. `Date` 입력 시 KST 기준으로 변환됩니다.\n */\n endDate: TaxInvoiceDateInput\n /**\n * 세금계산서 상태코드 필터입니다. 2/3번째 자리는 와일드카드(`*`)를 허용합니다. 예) `3**`, `60*`\n */\n invoiceStateCodes: TaxInvoiceSearchStateCode[]\n /**\n * 문서 유형 필터입니다.\n */\n invoiceTypeCodes: TaxInvoiceSearchInvoiceTypeCode[]\n /**\n * 과세형태 필터입니다.\n */\n taxationTypeCodes: TaxInvoiceSearchTaxationTypeCode[]\n /**\n * 지연발행 문서만 조회할지 여부입니다.\n */\n lateIssueOnly: boolean | null\n /**\n * 종사업장번호 주체 필터입니다.\n */\n taxRegistrationIdentifierType?: TaxInvoiceSearchTaxRegistrationIdentifierType\n /**\n * 종사업장번호 존재 여부 필터입니다.\n */\n taxRegistrationIdentifierAvailability?: TaxInvoiceSearchTaxRegistrationIdentifierAvailability\n /**\n * 종사업장번호 필터입니다.\n */\n taxRegistrationIdentifier?: string\n /**\n * 작성유형(연동/API) 필터입니다.\n */\n interoperabilityType?: TaxInvoiceSearchInteroperabilityType\n /**\n * 발행형태 필터입니다.\n */\n issueTypeCodes?: TaxInvoiceSearchIssueTypeCode[]\n /**\n * 등록유형 필터입니다.\n */\n registrationTypeCodes?: TaxInvoiceSearchRegistrationTypeCode[]\n /**\n * 휴폐업상태 필터입니다.\n */\n closeDownStateCodes?: TaxInvoiceCloseDownStateCode[]\n /**\n * 문서번호 또는 국세청승인번호 필터입니다.\n */\n invoiceManagementKeyOrNationalTaxServiceConfirmationNumber?: string\n /**\n * 검색어(상호/사업자번호/문서번호 등)입니다.\n */\n queryText?: string\n /**\n * 정렬 방향입니다.\n */\n sortOrder: TaxInvoiceSortOrder\n /**\n * 조회할 페이지 번호입니다.\n */\n pageNumber: number\n /**\n * 페이지당 조회 건수입니다.\n */\n pageSize: number\n}\n\n/**\n * 문서함 URL 조회 요청 입력입니다.\n */\nexport interface GetTaxInvoiceBoxURLInput extends TaxInvoiceBusinessRequest {\n /**\n * 조회할 세금계산서 문서함 범위입니다.\n */\n taxInvoiceBoxScope: TaxInvoiceBoxScope\n}\n\n/**\n * 다건 인쇄 URL 요청 입력입니다.\n */\nexport interface GetBulkInvoicePrintURLInput extends TaxInvoiceBusinessRequest {\n /**\n * 인쇄 대상 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TaxInvoiceDocumentKeyType\n /**\n * 인쇄 대상 문서번호 목록입니다.\n */\n invoiceManagementKeys: string[]\n}\n\n/**\n * 인감 및 첨부문서 등록 URL 조회 요청 입력입니다.\n */\nexport type GetSealAndAttachmentRegistrationURLInput = TaxInvoiceBusinessRequest\n\n/**\n * 파일 경로 기반 첨부 요청 입력입니다.\n */\nexport interface AttachFileFromPathInput extends TaxInvoiceDocumentRequest {\n /**\n * 업로드할 파일의 로컬 경로입니다.\n */\n filePath: string\n /**\n * 팝빌에 표시할 첨부파일명입니다.\n */\n displayName: string\n}\n\n/**\n * 바이너리 기반 첨부 요청 입력입니다.\n */\nexport interface AttachFileFromBinaryInput extends TaxInvoiceDocumentRequest {\n /**\n * 업로드할 파일명입니다.\n */\n fileName: string\n /**\n * 업로드할 파일 바이너리 데이터입니다.\n */\n fileData: Buffer\n}\n\n/**\n * 첨부파일 삭제 요청 입력입니다.\n */\nexport interface DeleteAttachedFileInput extends TaxInvoiceDocumentRequest {\n /**\n * 삭제할 첨부파일 식별자(FileID)입니다.\n */\n fileIdentifier: string\n}\n\n/**\n * 이메일 재전송 요청 입력입니다.\n */\nexport interface ResendInvoiceEmailInput extends TaxInvoiceDocumentRequest {\n /**\n * 재전송할 수신자 이메일 주소입니다.\n */\n receiverEmailAddress: string\n}\n\n/**\n * 문자 재전송 요청 입력입니다.\n */\nexport interface ResendInvoiceSMSInput extends TaxInvoiceDocumentRequest {\n /**\n * 발신자 전화번호입니다.\n */\n senderPhoneNumber: string\n /**\n * 수신자 전화번호입니다.\n */\n receiverPhoneNumber: string\n /**\n * 재전송할 문자 본문입니다.\n */\n messageBody: string\n}\n\n/**\n * 팩스 재전송 요청 입력입니다.\n */\nexport interface ResendInvoiceFAXInput extends TaxInvoiceDocumentRequest {\n /**\n * 발신 팩스번호입니다.\n */\n senderNumber: string\n /**\n * 수신 팩스번호입니다.\n */\n receiverNumber: string\n}\n\n/**\n * 전자명세서 첨부 요청 입력입니다.\n */\nexport interface AttachInvoiceStatementInput extends TaxInvoiceDocumentRequest {\n /**\n * 첨부할 전자명세서 문서 유형 코드입니다.\n */\n statementItemCode: TaxInvoiceStatementItemCode\n /**\n * 첨부할 전자명세서 관리번호입니다.\n */\n statementManagementKey: string\n}\n\n/**\n * 전자명세서 첨부해제 요청 입력입니다.\n */\nexport interface DetachInvoiceStatementInput extends TaxInvoiceDocumentRequest {\n /**\n * 첨부해제할 전자명세서 문서 유형 코드입니다.\n */\n statementItemCode: TaxInvoiceStatementItemCode\n /**\n * 첨부해제할 전자명세서 관리번호입니다.\n */\n statementManagementKey: string\n}\n\n/**\n * 문서번호 할당 요청 입력입니다.\n */\nexport interface AssignInvoiceManagementKeyInput extends TaxInvoiceBusinessRequest {\n /**\n * 할당 대상 문서번호 유형입니다.\n */\n invoiceDocumentKeyType: TaxInvoiceDocumentKeyType\n /**\n * 팝빌 문서 식별키(ItemKey)입니다.\n */\n itemKey: string\n /**\n * 새로 할당할 문서번호입니다.\n */\n invoiceManagementKey: string\n}\n\n/**\n * 이메일 전송설정 수정 입력입니다.\n */\nexport interface UpdateEmailSendSettingsInput extends TaxInvoiceBusinessRequest {\n /**\n * 수정할 메일 전송 유형 코드입니다.\n */\n emailType: TaxInvoiceEmailType\n /**\n * 전송 활성화 여부입니다.\n */\n sendEnabled: boolean\n}\n\n/**\n * TaxInvoice modern facade 서비스 인터페이스입니다.\n * 모든 메서드는 `input`만 받으며 실패 시 `PopbillApiError`를 throw 합니다.\n */\nexport interface TaxInvoiceService {\n /**\n * 등록과 동시에 세금계산서를 즉시 발행합니다.\n *\n * Compat: `registIssue`\n */\n issueInvoiceImmediately(input: IssueInvoiceImmediatelyInput): Promise<response.TaxInvoiceIssueResult>\n\n /**\n * 초대량 발행을 접수합니다.\n *\n * Compat: `bulkSubmit`\n */\n submitBulkIssue(input: SubmitBulkIssueInput): Promise<response.TaxInvoiceBulkSubmitResult>\n\n /**\n * 초대량 발행 접수결과를 조회합니다.\n *\n * Compat: `getBulkResult`\n */\n getBulkIssueSubmissionResult(input: GetBulkIssueSubmissionResultInput): Promise<response.TaxInvoiceBulkIssueSubmissionResult>\n\n /**\n * 세금계산서를 임시저장합니다.\n *\n * Compat: `register`\n */\n registerInvoice(input: RegisterInvoiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 임시저장 문서를 수정합니다.\n *\n * Compat: `update`\n */\n updateInvoice(input: UpdateInvoiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 저장된 문서를 발행합니다.\n *\n * Compat: `issue`\n */\n issueInvoice(input: IssueInvoiceInput): Promise<response.TaxInvoiceIssueResult>\n\n /**\n * 발행된 문서를 취소합니다.\n *\n * Compat: `cancelIssue`\n */\n cancelIssuedInvoice(input: CancelIssuedInvoiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 등록과 동시에 역발행 요청을 보냅니다.\n *\n * Compat: `registRequest`\n */\n requestReverseIssueImmediately(input: RequestReverseIssueImmediatelyInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 저장된 문서로 역발행 요청을 보냅니다.\n *\n * Compat: `request`\n */\n requestReverseIssue(input: RequestReverseIssueInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 역발행 요청을 취소합니다.\n *\n * Compat: `cancelRequest`\n */\n cancelReverseIssueRequest(input: CancelReverseIssueRequestInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 역발행 요청을 거부합니다.\n *\n * Compat: `refuse`\n */\n refuseReverseIssueRequest(input: RefuseReverseIssueRequestInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 발행예정 문서를 전송합니다. 공식 SDK에 남아 있는 레거시 동작입니다.\n *\n * Compat: `send`\n */\n sendInvoice(input: SendInvoiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 발행예정 전송을 취소합니다.\n *\n * Compat: `cancelSend`\n */\n cancelInvoiceSend(input: CancelInvoiceSendInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 공식 SDK의 레거시 승인 동작을 요청합니다. 처리 가능한 문서 상태는 서버가 판단합니다.\n *\n * Compat: `accept`\n */\n acceptInvoice(input: AcceptInvoiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 공식 SDK의 레거시 거부 동작을 요청합니다. 처리 가능한 문서 상태는 서버가 판단합니다.\n *\n * Compat: `deny`\n */\n denyInvoice(input: DenyInvoiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 문서를 삭제합니다.\n *\n * Compat: `delete`\n */\n deleteInvoice(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 문서를 국세청으로 즉시 전송합니다.\n *\n * Compat: `sendToNTS`\n */\n sendInvoiceToNTS(input: SendInvoiceToNationalTaxServiceInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 문서 1건의 상태 요약정보를 조회합니다.\n *\n * Compat: `getInfo`\n */\n getInvoiceInfo(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceInfo>\n\n /**\n * 문서 다건의 상태 요약정보를 조회합니다.\n *\n * Compat: `getInfos`\n */\n getInvoicesInfo(input: GetInvoicesInfoInput): Promise<response.TaxInvoiceInfo[]>\n\n /**\n * 문서 1건의 상세정보를 조회합니다.\n *\n * Compat: `getDetailInfo`\n */\n getInvoiceDetailInfo(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceDocumentOutput>\n\n /**\n * 문서번호 사용 여부를 확인합니다.\n *\n * Compat: `checkMgtKeyInUse`\n */\n checkInvoiceManagementKeyInUse(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceInvoiceManagementKeyUsage>\n\n /**\n * 문서 XML 정보를 조회합니다.\n *\n * Compat: `getXML`\n */\n getInvoiceXML(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceXmlResult>\n\n /** 세금계산서 PDF 원본을 다운로드합니다. Compat: `getPDF` */\n downloadInvoicePDF(input: DownloadInvoicePdfInput): Promise<response.TaxInvoicePdfDocument>\n\n /**\n * 검색조건으로 문서를 조회합니다.\n *\n * Compat: `search`\n */\n searchInvoices(input: SearchInvoicesInput): Promise<response.TaxInvoiceSearchResult>\n\n /**\n * 문서 상태 변경이력을 조회합니다.\n *\n * Compat: `getLogs`\n */\n getInvoiceLogs(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceLogEntry[]>\n\n /**\n * 세금계산서 문서함 팝업 URL을 조회합니다.\n *\n * Compat: `getURL`\n */\n getTaxInvoiceBoxURL(input: GetTaxInvoiceBoxURLInput): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 문서 팝업 URL을 조회합니다.\n *\n * Compat: `getPopUpURL`\n */\n getInvoicePopupURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 보기 전용 팝업 URL을 조회합니다.\n *\n * Compat: `getViewURL`\n */\n getInvoiceViewURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 공급자 인쇄 팝업 URL을 조회합니다.\n *\n * Compat: `getPrintURL`\n */\n getSupplierInvoicePrintURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 공급받는자 인쇄 팝업 URL을 조회합니다.\n *\n * Compat: `getEPrintURL`\n */\n getBuyerInvoicePrintURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 구형 인쇄 팝업 URL을 조회합니다.\n *\n * Compat: `getOldPrintURL`\n */\n getLegacyInvoicePrintURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 다건 인쇄 팝업 URL을 조회합니다.\n *\n * Compat: `getMassPrintURL`\n */\n getBulkInvoicePrintURL(input: GetBulkInvoicePrintURLInput): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 메일 보기 URL을 조회합니다.\n *\n * Compat: `getMailURL`\n */\n getInvoiceMailURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * PDF 다운로드 URL을 조회합니다.\n *\n * Compat: `getPDFURL`\n */\n getInvoicePDFURL(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 인감 및 첨부문서 등록 URL을 조회합니다.\n *\n * Compat: `getSealURL`\n */\n getSealAndAttachmentRegistrationURL(input: GetSealAndAttachmentRegistrationURLInput): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 파일 경로 기반 첨부를 수행합니다.\n *\n * Compat: `attachFile`\n */\n attachFileFromPath(input: AttachFileFromPathInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 바이너리 기반 첨부를 수행합니다.\n *\n * Compat: `attachFileBinary`\n */\n attachFileFromBinary(input: AttachFileFromBinaryInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 첨부파일을 삭제합니다.\n *\n * Compat: `deleteFile`\n */\n deleteAttachedFile(input: DeleteAttachedFileInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 첨부파일 목록을 조회합니다.\n *\n * Compat: `getFiles`\n */\n getAttachedFiles(input: TaxInvoiceDocumentRequest): Promise<response.TaxInvoiceAttachedFile[]>\n\n /**\n * 안내 메일을 재전송합니다.\n *\n * Compat: `sendEmail`\n */\n resendInvoiceEmail(input: ResendInvoiceEmailInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 안내 문자를 재전송합니다.\n *\n * Compat: `sendSMS`\n */\n resendInvoiceSMS(input: ResendInvoiceSMSInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 안내 팩스를 재전송합니다.\n *\n * Compat: `sendFAX`\n */\n resendInvoiceFAX(input: ResendInvoiceFAXInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 전자명세서를 첨부합니다.\n *\n * Compat: `attachStatement`\n */\n attachInvoiceStatement(input: AttachInvoiceStatementInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 전자명세서 첨부를 해제합니다.\n *\n * Compat: `detachStatement`\n */\n detachInvoiceStatement(input: DetachInvoiceStatementInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 문서번호를 할당합니다.\n *\n * Compat: `assignMgtKey`\n */\n assignInvoiceManagementKey(input: AssignInvoiceManagementKeyInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 이메일 발송설정을 조회합니다.\n *\n * Compat: `listEmailConfig`\n */\n getEmailSendSettings(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceEmailSendSetting[]>\n\n /**\n * 이메일 발송설정을 수정합니다.\n *\n * Compat: `updateEmailConfig`\n */\n updateEmailSendSettings(input: UpdateEmailSendSettingsInput): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 국세청 전송설정을 조회합니다.\n *\n * Compat: `getSendToNTSConfig`\n */\n getSendToNTSSettings(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceSendToNationalTaxServiceSetting>\n\n /**\n * ASP사업자 유통메일 공개키 응답을 조회합니다. 공개되지 않은 응답 구조는 원문으로 보존합니다.\n *\n * Compat: `getEmailPublicKeys`\n */\n getEmailPublicKeys(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceEmailPublicKeys>\n\n /**\n * 인증서 등록 URL을 조회합니다.\n *\n * Compat: `getTaxCertURL`\n */\n getTaxCertificateRegistrationURL(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceAccessUrl>\n\n /**\n * 인증서 만료일을 조회합니다.\n *\n * Compat: `getCertificateExpireDate`\n */\n getTaxCertificateExpirationDate(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceTaxCertificateExpiration>\n\n /**\n * 인증서 유효성을 점검합니다.\n *\n * Compat: `checkCertValidation`\n */\n checkTaxCertificateValidation(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceOperationResult>\n\n /**\n * 인증서 정보를 조회합니다.\n *\n * Compat: `getTaxCertInfo`\n */\n getTaxCertificateInfo(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceTaxCertificateInfo>\n /** 세금계산서 서비스 과금정보를 조회합니다. Compat: `getChargeInfo` */\n getChargeInfo(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceChargeInfo>\n\n /** 세금계산서 발행단가를 문자열로 조회합니다. Compat: `getUnitCost` */\n getUnitCost(input: TaxInvoiceBusinessRequest): Promise<response.TaxInvoiceUnitCost>\n}\n","import { invokeTaxInvoiceMethod } from './adapters/error'\nimport * as documentMappers from './mappers/document'\nimport * as invoiceInfoMappers from './mappers/invoice-info'\nimport * as responseMappers from './mappers/response'\nimport * as taxInvoiceTypes from './types'\nimport { createInputValidationError } from '@connextable/popbill-compat/errors'\nimport type { TaxinvoicePromiseService as CompatTaxInvoiceService } from '@connextable/popbill-compat/factory'\nimport { isValidCalendarDate8 } from '@connextable/popbill-utils'\nimport { PopbillErrorStage, type PopbillApiError } from '@/errors'\n\nconst KOREA_TIME_ZONE = 'Asia/Seoul'\nconst SEARCH_STATE_CODE_PATTERN = /^\\d[\\d*][\\d*]$/\nconst KOREA_DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n timeZone: KOREA_TIME_ZONE,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n})\nconst SEARCH_INVOICES_OPERATION = 'taxInvoice.searchInvoices'\n\ninterface CreateTaxInvoiceServiceInput {\n compatTaxInvoiceService: CompatTaxInvoiceService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\n/**\n * TaxInvoice modern facade 서비스를 생성합니다.\n *\n * 입력 DTO를 compat positional 인자로 변환하고,\n * compat 에러를 `PopbillApiError`로 표준화하여 재throw 합니다.\n */\nexport function createTaxInvoiceService(input: CreateTaxInvoiceServiceInput): taxInvoiceTypes.TaxInvoiceService {\n const compatTaxInvoiceService = input.compatTaxInvoiceService\n\n return {\n issueInvoiceImmediately(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.issueInvoiceImmediately', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.registIssue(\n request.businessNumber,\n documentMappers.mapTaxInvoiceDocument(request.taxInvoiceDocument),\n request.writeSpecification,\n request.forceIssue,\n request.historyMemo,\n request.emailSubject,\n request.dealInvoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceIssueResult(taxInvoiceApiResponse)\n })\n },\n\n submitBulkIssue(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.submitBulkIssue', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.bulkSubmit(\n request.businessNumber,\n request.submissionIdentifier,\n documentMappers.mapTaxInvoiceDocuments(request.taxInvoiceDocuments),\n request.forceIssue,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceBulkSubmitResult(taxInvoiceApiResponse)\n })\n },\n\n getBulkIssueSubmissionResult(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getBulkIssueSubmissionResult', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getBulkResult(\n request.businessNumber,\n request.submissionIdentifier,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceBulkIssueSubmissionResult(taxInvoiceApiResponse)\n })\n },\n\n registerInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.registerInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.register(\n request.businessNumber,\n documentMappers.mapTaxInvoiceDocument(request.taxInvoiceDocument),\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n updateInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.updateInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.update(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n documentMappers.mapTaxInvoiceDocument(request.taxInvoiceDocument),\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n issueInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.issueInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.issue(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n request.emailSubject,\n request.forceIssue,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceIssueResult(taxInvoiceApiResponse)\n })\n },\n\n cancelIssuedInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.cancelIssuedInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.cancelIssue(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n requestReverseIssueImmediately(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.requestReverseIssueImmediately', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.registRequest(\n request.businessNumber,\n documentMappers.mapTaxInvoiceDocument(request.taxInvoiceDocument),\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n requestReverseIssue(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.requestReverseIssue', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.request(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n cancelReverseIssueRequest(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.cancelReverseIssueRequest', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.cancelRequest(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n refuseReverseIssueRequest(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.refuseReverseIssueRequest', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.refuse(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n sendInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.sendInvoice', async () => {\n const response = await compatTaxInvoiceService.send(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo ?? '',\n request.emailSubject,\n input.defaultUserId\n )\n return responseMappers.mapTaxInvoiceOperationResult(response)\n })\n },\n\n cancelInvoiceSend(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.cancelInvoiceSend', async () => {\n const response = await compatTaxInvoiceService.cancelSend(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo ?? '',\n input.defaultUserId\n )\n return responseMappers.mapTaxInvoiceOperationResult(response)\n })\n },\n\n acceptInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.acceptInvoice', async () => {\n const response = await compatTaxInvoiceService.accept(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo ?? '',\n input.defaultUserId\n )\n return responseMappers.mapTaxInvoiceOperationResult(response)\n })\n },\n\n denyInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.denyInvoice', async () => {\n const response = await compatTaxInvoiceService.deny(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.historyMemo ?? '',\n input.defaultUserId\n )\n return responseMappers.mapTaxInvoiceOperationResult(response)\n })\n },\n\n deleteInvoice(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.deleteInvoice', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.delete(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n sendInvoiceToNTS(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.sendInvoiceToNTS', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.sendToNTS(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n async getInvoiceInfo(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceInfo', async () => {\n const apiResponse = await compatTaxInvoiceService.getInfo(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return invoiceInfoMappers.mapTaxInvoiceInfo(apiResponse)\n })\n },\n\n getInvoicesInfo(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoicesInfo', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getInfos(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKeys,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceInfos(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceDetailInfo(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceDetailInfo', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getDetailInfo(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceDocumentOutput(taxInvoiceApiResponse)\n })\n },\n\n checkInvoiceManagementKeyInUse(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.checkInvoiceManagementKeyInUse', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.checkMgtKeyInUse(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceInvoiceManagementKeyUsage(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceXML(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceXML', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getXML(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceXmlResult(taxInvoiceApiResponse)\n })\n },\n\n downloadInvoicePDF(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.downloadInvoicePDF', async () => {\n const response = await compatTaxInvoiceService.getPDF(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId,\n documentMappers.mapTaxInvoicePdfPrintCopy(request.printCopy)\n )\n return responseMappers.mapTaxInvoicePdfDocument(response)\n })\n },\n\n searchInvoices(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.searchInvoices', async () => {\n const normalizedSearchRequest = normalizeSearchInvoicesRequest(request)\n const taxInvoiceApiResponse = await compatTaxInvoiceService.search(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n normalizedSearchRequest.searchDateType,\n normalizedSearchRequest.startDate,\n normalizedSearchRequest.endDate,\n normalizedSearchRequest.invoiceStateCodes,\n normalizedSearchRequest.invoiceTypeCodes,\n normalizedSearchRequest.taxationTypeCodes,\n normalizedSearchRequest.lateIssueOnly,\n normalizedSearchRequest.sortOrder,\n normalizedSearchRequest.pageNumber,\n normalizedSearchRequest.pageSize,\n normalizedSearchRequest.taxRegistrationIdentifierType,\n normalizedSearchRequest.taxRegistrationIdentifierAvailability,\n normalizedSearchRequest.taxRegistrationIdentifier,\n normalizedSearchRequest.queryText,\n normalizedSearchRequest.interoperabilityType,\n input.defaultUserId,\n normalizedSearchRequest.issueTypeCodes,\n normalizedSearchRequest.registrationTypeCodes,\n toCompatCloseDownStateCodes(normalizedSearchRequest.closeDownStateCodes),\n normalizedSearchRequest.invoiceManagementKeyOrNationalTaxServiceConfirmationNumber\n )\n\n return responseMappers.mapTaxInvoiceSearchResult(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceLogs(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceLogs', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getLogs(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceLogs(taxInvoiceApiResponse)\n })\n },\n\n getTaxInvoiceBoxURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getTaxInvoiceBoxURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getURL(request.businessNumber, request.taxInvoiceBoxScope, input.defaultUserId)\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getInvoicePopupURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoicePopupURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getPopUpURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceViewURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceViewURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getViewURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getSupplierInvoicePrintURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getSupplierInvoicePrintURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getPrintURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getBuyerInvoicePrintURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getBuyerInvoicePrintURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getEPrintURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getLegacyInvoicePrintURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getLegacyInvoicePrintURL', async () => {\n const response = await compatTaxInvoiceService.getOldPrintURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n return responseMappers.mapTaxInvoiceAccessUrlFromString(response)\n })\n },\n\n getBulkInvoicePrintURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getBulkInvoicePrintURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getMassPrintURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKeys,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getInvoiceMailURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoiceMailURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getMailURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getInvoicePDFURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getInvoicePDFURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getPDFURL(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAccessUrlFromString(taxInvoiceApiResponse)\n })\n },\n\n getSealAndAttachmentRegistrationURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getSealAndAttachmentRegistrationURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getSealURL(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceAccessUrl(taxInvoiceApiResponse)\n })\n },\n\n attachFileFromPath(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.attachFileFromPath', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.attachFile(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.displayName,\n request.filePath,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n attachFileFromBinary(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.attachFileFromBinary', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.attachFileBinary(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n {\n fileName: request.fileName,\n fileData: request.fileData,\n },\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n deleteAttachedFile(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.deleteAttachedFile', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.deleteFile(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.fileIdentifier,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n getAttachedFiles(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getAttachedFiles', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getFiles(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceAttachedFiles(taxInvoiceApiResponse)\n })\n },\n\n resendInvoiceEmail(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.resendInvoiceEmail', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.sendEmail(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.receiverEmailAddress,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n resendInvoiceSMS(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.resendInvoiceSMS', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.sendSMS(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.senderPhoneNumber,\n request.receiverPhoneNumber,\n request.messageBody,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n resendInvoiceFAX(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.resendInvoiceFAX', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.sendFAX(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n request.senderNumber,\n request.receiverNumber,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n attachInvoiceStatement(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.attachInvoiceStatement', async () => {\n const statementItemCode = normalizeStatementItemCode(request.statementItemCode, 'taxInvoice.attachInvoiceStatement')\n const taxInvoiceApiResponse = await compatTaxInvoiceService.attachStatement(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n statementItemCode,\n request.statementManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n detachInvoiceStatement(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.detachInvoiceStatement', async () => {\n const statementItemCode = normalizeStatementItemCode(request.statementItemCode, 'taxInvoice.detachInvoiceStatement')\n const taxInvoiceApiResponse = await compatTaxInvoiceService.detachStatement(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.invoiceManagementKey,\n statementItemCode,\n request.statementManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n assignInvoiceManagementKey(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.assignInvoiceManagementKey', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.assignMgtKey(\n request.businessNumber,\n request.invoiceDocumentKeyType,\n request.itemKey,\n request.invoiceManagementKey,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n getEmailSendSettings(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getEmailSendSettings', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.listEmailConfig(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceEmailSendSettings(taxInvoiceApiResponse)\n })\n },\n\n updateEmailSendSettings(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.updateEmailSendSettings', async () => {\n const emailType = normalizeEmailType(request.emailType, 'taxInvoice.updateEmailSendSettings')\n const taxInvoiceApiResponse = await compatTaxInvoiceService.updateEmailConfig(\n request.businessNumber,\n emailType,\n request.sendEnabled,\n input.defaultUserId\n )\n\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n getSendToNTSSettings(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getSendToNTSSettings', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getSendToNTSConfig(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceSendToNationalTaxServiceSetting(taxInvoiceApiResponse)\n })\n },\n\n getEmailPublicKeys(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getEmailPublicKeys', async () => {\n const response = await compatTaxInvoiceService.getEmailPublicKeys(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceEmailPublicKeys(response)\n })\n },\n\n getTaxCertificateRegistrationURL(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getTaxCertificateRegistrationURL', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getTaxCertURL(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceAccessUrl(taxInvoiceApiResponse)\n })\n },\n\n getTaxCertificateExpirationDate(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getTaxCertificateExpirationDate', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getCertificateExpireDate(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceTaxCertificateExpiration(taxInvoiceApiResponse)\n })\n },\n\n checkTaxCertificateValidation(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.checkTaxCertificateValidation', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.checkCertValidation(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceOperationResult(taxInvoiceApiResponse)\n })\n },\n\n getTaxCertificateInfo(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getTaxCertificateInfo', async () => {\n const taxInvoiceApiResponse = await compatTaxInvoiceService.getTaxCertInfo(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceTaxCertificateInfo(taxInvoiceApiResponse)\n })\n },\n getChargeInfo(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getChargeInfo', async () => {\n const response = await compatTaxInvoiceService.getChargeInfo(request.businessNumber, input.defaultUserId)\n return responseMappers.mapTaxInvoiceChargeInfo(response)\n })\n },\n\n getUnitCost(request) {\n return invokeTaxInvoiceMethod(input, 'taxInvoice.getUnitCost', async () => {\n const response = await compatTaxInvoiceService.getUnitCost(request.businessNumber)\n return responseMappers.mapTaxInvoiceUnitCost(response)\n })\n },\n }\n}\n\ninterface NormalizedSearchInvoicesRequest {\n searchDateType: taxInvoiceTypes.TaxInvoiceDateType\n startDate: string\n endDate: string\n invoiceStateCodes: taxInvoiceTypes.TaxInvoiceSearchStateCode[]\n invoiceTypeCodes: taxInvoiceTypes.TaxInvoiceSearchInvoiceTypeCode[]\n taxationTypeCodes: taxInvoiceTypes.TaxInvoiceSearchTaxationTypeCode[]\n lateIssueOnly: boolean | null\n taxRegistrationIdentifierType?: taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierType\n taxRegistrationIdentifierAvailability?: taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierAvailability\n taxRegistrationIdentifier?: string\n interoperabilityType?: taxInvoiceTypes.TaxInvoiceSearchInteroperabilityType\n issueTypeCodes?: taxInvoiceTypes.TaxInvoiceSearchIssueTypeCode[]\n registrationTypeCodes?: taxInvoiceTypes.TaxInvoiceSearchRegistrationTypeCode[]\n closeDownStateCodes?: taxInvoiceTypes.TaxInvoiceCloseDownStateCode[]\n invoiceManagementKeyOrNationalTaxServiceConfirmationNumber?: string\n queryText?: string\n sortOrder: taxInvoiceTypes.TaxInvoiceSortOrder\n pageNumber: number\n pageSize: number\n}\n\nfunction normalizeSearchInvoicesRequest(request: taxInvoiceTypes.SearchInvoicesInput): NormalizedSearchInvoicesRequest {\n return {\n searchDateType: normalizeCodeValue(\n request.searchDateType,\n Object.values(taxInvoiceTypes.TaxInvoiceDateType),\n 'searchDateType',\n SEARCH_INVOICES_OPERATION\n ),\n startDate: normalizeSearchDateInput(request.startDate, 'startDate', SEARCH_INVOICES_OPERATION),\n endDate: normalizeSearchDateInput(request.endDate, 'endDate', SEARCH_INVOICES_OPERATION),\n invoiceStateCodes: normalizeSearchStateCodes(request.invoiceStateCodes),\n invoiceTypeCodes: normalizeCodeArray(\n request.invoiceTypeCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchInvoiceTypeCodes),\n 'invoiceTypeCodes',\n SEARCH_INVOICES_OPERATION\n ),\n taxationTypeCodes: normalizeCodeArray(\n request.taxationTypeCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchTaxationTypeCodes),\n 'taxationTypeCodes',\n SEARCH_INVOICES_OPERATION\n ),\n lateIssueOnly: request.lateIssueOnly,\n taxRegistrationIdentifierType: normalizeOptionalCodeValue(\n request.taxRegistrationIdentifierType,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierTypes),\n 'taxRegistrationIdentifierType',\n SEARCH_INVOICES_OPERATION\n ),\n taxRegistrationIdentifierAvailability: normalizeOptionalCodeValue(\n request.taxRegistrationIdentifierAvailability,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchTaxRegistrationIdentifierAvailabilities),\n 'taxRegistrationIdentifierAvailability',\n SEARCH_INVOICES_OPERATION\n ),\n taxRegistrationIdentifier: request.taxRegistrationIdentifier,\n interoperabilityType: normalizeOptionalCodeValue(\n request.interoperabilityType,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchInteroperabilityTypes),\n 'interoperabilityType',\n SEARCH_INVOICES_OPERATION\n ),\n issueTypeCodes: normalizeOptionalCodeArray(\n request.issueTypeCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchIssueTypeCodes),\n 'issueTypeCodes',\n SEARCH_INVOICES_OPERATION\n ),\n registrationTypeCodes: normalizeOptionalCodeArray(\n request.registrationTypeCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceSearchRegistrationTypeCodes),\n 'registrationTypeCodes',\n SEARCH_INVOICES_OPERATION\n ),\n closeDownStateCodes: normalizeOptionalCodeArray(\n request.closeDownStateCodes,\n Object.values(taxInvoiceTypes.TaxInvoiceCloseDownStateCodes),\n 'closeDownStateCodes',\n SEARCH_INVOICES_OPERATION\n ),\n invoiceManagementKeyOrNationalTaxServiceConfirmationNumber: request.invoiceManagementKeyOrNationalTaxServiceConfirmationNumber,\n queryText: request.queryText,\n sortOrder: normalizeCodeValue(request.sortOrder, Object.values(taxInvoiceTypes.TaxInvoiceSortOrder), 'sortOrder', SEARCH_INVOICES_OPERATION),\n pageNumber: request.pageNumber,\n pageSize: request.pageSize,\n }\n}\n\nfunction toCompatCloseDownStateCodes(\n closeDownStateCodes: taxInvoiceTypes.TaxInvoiceCloseDownStateCode[] | undefined\n): (0 | 1 | 2 | 3 | 4)[] | undefined {\n return closeDownStateCodes as unknown as (0 | 1 | 2 | 3 | 4)[] | undefined\n}\n\nfunction normalizeSearchStateCodes(searchStateCodes: unknown): taxInvoiceTypes.TaxInvoiceSearchStateCode[] {\n if (!Array.isArray(searchStateCodes)) {\n throw createInputValidationError('invoiceStateCodes는 배열이어야 해.', {\n operation: SEARCH_INVOICES_OPERATION,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n return searchStateCodes.map((searchStateCode, index) => {\n if (typeof searchStateCode !== 'string' || !SEARCH_STATE_CODE_PATTERN.test(searchStateCode)) {\n throw createInputValidationError(\n `invoiceStateCodes[${index}]에 유효하지 않은 상태코드가 있어. 허용 패턴: 숫자 3자리 또는 2/3자리 와일드카드 (예: 300, 3**, 60*)`,\n {\n operation: SEARCH_INVOICES_OPERATION,\n stage: PopbillErrorStage.ValidateInput,\n }\n )\n }\n\n return searchStateCode\n })\n}\n\nfunction normalizeSearchDateInput(dateInput: taxInvoiceTypes.TaxInvoiceDateInput, fieldName: string, operation: string): string {\n if (dateInput instanceof Date) {\n if (!Number.isFinite(dateInput.getTime())) {\n throw createInputValidationError(`${fieldName}는 유효한 Date여야 해.`, {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n return formatDateToKoreaDateString(dateInput)\n }\n\n if (typeof dateInput !== 'string') {\n throw createInputValidationError(`${fieldName}는 yyyyMMdd 문자열 또는 Date여야 해.`, {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n const normalizedDateInput = dateInput.trim()\n if (!isValidCalendarDate8(normalizedDateInput)) {\n throw createInputValidationError(`${fieldName}는 yyyyMMdd 형식의 유효한 날짜여야 해.`, {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n return normalizedDateInput\n}\n\nfunction formatDateToKoreaDateString(date: Date): string {\n let year = ''\n let month = ''\n let day = ''\n\n for (const datePart of KOREA_DATE_FORMATTER.formatToParts(date)) {\n if (datePart.type === 'year') {\n year = datePart.value\n continue\n }\n\n if (datePart.type === 'month') {\n month = datePart.value\n continue\n }\n\n if (datePart.type === 'day') {\n day = datePart.value\n }\n }\n\n return `${year}${month}${day}`\n}\n\nfunction normalizeStatementItemCode(\n statementItemCode: unknown,\n operation: 'taxInvoice.attachInvoiceStatement' | 'taxInvoice.detachInvoiceStatement'\n): taxInvoiceTypes.TaxInvoiceStatementItemCode {\n return normalizeCodeValue(statementItemCode, Object.values(taxInvoiceTypes.TaxInvoiceStatementItemCodes), 'statementItemCode', operation)\n}\n\nfunction normalizeEmailType(emailType: unknown, operation: 'taxInvoice.updateEmailSendSettings'): taxInvoiceTypes.TaxInvoiceEmailType {\n return normalizeCodeValue(emailType, Object.values(taxInvoiceTypes.TaxInvoiceEmailTypes), 'emailType', operation)\n}\n\nfunction normalizeOptionalCodeValue<T extends string | number>(\n codeValue: unknown,\n allowedValues: readonly T[],\n fieldName: string,\n operation: string\n): T | undefined {\n if (codeValue === undefined) {\n return undefined\n }\n\n return normalizeCodeValue(codeValue, allowedValues, fieldName, operation)\n}\n\nfunction normalizeOptionalCodeArray<T extends string | number>(\n codeValues: unknown,\n allowedValues: readonly T[],\n fieldName: string,\n operation: string\n): T[] | undefined {\n if (codeValues === undefined) {\n return undefined\n }\n\n return normalizeCodeArray(codeValues, allowedValues, fieldName, operation)\n}\n\nfunction normalizeCodeArray<T extends string | number>(codeValues: unknown, allowedValues: readonly T[], fieldName: string, operation: string): T[] {\n if (!Array.isArray(codeValues)) {\n throw createInputValidationError(`${fieldName}는 배열이어야 해.`, {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n })\n }\n\n return codeValues.map((codeValue, index) => normalizeCodeValue(codeValue, allowedValues, `${fieldName}[${index}]`, operation))\n}\n\nfunction normalizeCodeValue<T extends string | number>(codeValue: unknown, allowedValues: readonly T[], fieldName: string, operation: string): T {\n for (const allowedValue of allowedValues) {\n if (codeValue === allowedValue) {\n return allowedValue\n }\n }\n\n throw createInputValidationError(\n `${fieldName}에 유효하지 않은 값이 있어. 허용값: ${allowedValues.map((allowedValue) => String(allowedValue)).join(', ')} (입력값: ${String(codeValue)})`,\n {\n operation,\n stage: PopbillErrorStage.ValidateInput,\n }\n )\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport { removeUndefinedProperties } from '@connextable/popbill-utils'\nimport type { CashbillDocumentInput } from '../types'\n\nexport function mapCashbillDocument(document: CashbillDocumentInput): Spec.CashbillApiModel {\n return removeUndefinedProperties({\n mgtKey: document.managementKey,\n tradeDT: document.transactedAt,\n tradeType: document.transactionType,\n tradeUsage: document.usageType,\n tradeOpt: document.tradeOption,\n taxationType: document.taxType,\n totalAmount: document.payment.totalAmount,\n supplyCost: document.payment.supplyCostAmount,\n tax: document.payment.taxAmount,\n serviceFee: document.payment.serviceFeeAmount,\n franchiseCorpNum: document.merchant.businessNumber,\n franchiseTaxRegID: document.merchant.taxRegistrationIdentifier,\n franchiseCorpName: document.merchant.companyName,\n franchiseCEOName: document.merchant.chiefExecutiveOfficerName,\n franchiseAddr: document.merchant.address,\n franchiseTEL: document.merchant.telephoneNumber,\n identityNum: document.buyer.identificationNumber,\n customerName: document.buyer.customerName,\n itemName: document.itemName,\n orderNumber: document.orderNumber,\n email: document.buyer.emailAddress,\n hp: document.buyer.mobilePhoneNumber,\n smssendYN: document.sendTextMessage,\n orgConfirmNum: document.originalConfirmationNumber,\n orgTradeDate: document.originalTransactionDate,\n cancelType: document.cancellationReason,\n })\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport {\n compactOptionalObject,\n optionalResponseNumber,\n preserveBooleanResponse,\n preserveNumericCode,\n removeUndefinedProperties,\n} from '@connextable/popbill-utils'\nimport type * as Types from '../types'\n\nexport function mapCashbillOperationResult(value: Spec.CashbillApiResponseBase): Types.CashbillOperationResult {\n return { resultCode: preserveNumericCode(value.code), resultMessage: value.message }\n}\n\nexport function mapCashbillIssueResult(value: Spec.CashbillIssueResultApiModel): Types.CashbillIssueResult {\n return removeUndefinedProperties({\n ...mapCashbillOperationResult(value),\n confirmationNumber: value.confirmNum,\n transactionDate: value.tradeDate,\n transactedAt: value.tradeDT,\n issuedAt: value.issueDT,\n })\n}\n\nexport function mapCashbillBulkSubmissionResult(value: Spec.CashbillBulkSubmitApiResponse): Types.CashbillBulkSubmissionResult {\n return removeUndefinedProperties({ ...mapCashbillOperationResult(value), receiptIdentifier: value.receiptID })\n}\n\nexport function mapCashbillBulkResult(value: Spec.CashbillGetBulkResultApiResponse): Types.CashbillBulkResult {\n return removeUndefinedProperties({\n ...mapCashbillOperationResult(value),\n submissionIdentifier: value.submitID,\n receiptIdentifier: value.receiptID,\n submittedCount: optionalResponseNumber(value.submitCount),\n successCount: optionalResponseNumber(value.successCount),\n failureCount: optionalResponseNumber(value.failCount),\n processingStateCode: preserveNumericCode(value.txState),\n processingResultCode: preserveNumericCode(value.txResultCode),\n issueResults: (value.issueResult ?? []).map((result) =>\n removeUndefinedProperties({ ...mapCashbillIssueResult(result), managementKey: result.mgtKey })\n ),\n receivedAt: value.receiptDT,\n processingStartedAt: value.txStartDT,\n processingCompletedAt: value.txEndDT,\n })\n}\n\nexport function mapCashbillInfo(value: Spec.CashbillInfoApiModel): Types.CashbillInfo {\n return removeUndefinedProperties({\n ...mapCashbillDocumentOutput(value),\n itemKey: value.itemKey,\n stateCode: preserveNumericCode(value.stateCode),\n stateMemo: value.stateMemo,\n nationalTaxServiceResultCode: value.ntsresultCode,\n nationalTaxServiceResultMessage: value.ntsresultMessage,\n isPrinted: preserveBooleanResponse(value.printYN),\n isIssuedThroughAPI: preserveBooleanResponse(value.interOPYN),\n registeredAt: value.regDT,\n issuedAt: value.issueDT,\n stateChangedAt: value.stateDT,\n nationalTaxServiceSentAt: value.ntssendDT,\n nationalTaxServiceResultReceivedAt: value.ntsresultDT,\n })\n}\n\nexport function mapCashbillDocumentOutput(value: Spec.CashbillApiModel): Types.CashbillDocumentOutput {\n return removeUndefinedProperties({\n managementKey: value.mgtKey,\n confirmationNumber: value.confirmNum,\n transactionType: value.tradeType,\n usageType: value.tradeUsage,\n tradeOption: value.tradeOpt,\n taxType: value.taxationType,\n merchant: compactOptionalObject({\n businessNumber: value.franchiseCorpNum,\n taxRegistrationIdentifier: value.franchiseTaxRegID,\n companyName: value.franchiseCorpName,\n chiefExecutiveOfficerName: value.franchiseCEOName,\n address: value.franchiseAddr,\n telephoneNumber: value.franchiseTEL,\n }),\n buyer: compactOptionalObject({\n identificationNumber: value.identityNum,\n customerName: value.customerName,\n emailAddress: value.email,\n mobilePhoneNumber: value.hp,\n }),\n payment: compactOptionalObject({\n totalAmount: value.totalAmount,\n supplyCostAmount: value.supplyCost,\n taxAmount: value.tax,\n serviceFeeAmount: value.serviceFee,\n }),\n itemName: value.itemName,\n orderNumber: value.orderNumber,\n originalConfirmationNumber: value.orgConfirmNum,\n originalTransactionDate: value.orgTradeDate,\n cancellationReason: preserveNumericCode(value.cancelType),\n transactedAt: value.tradeDT,\n sendTextMessage: preserveBooleanResponse(value.smssendYN),\n transactionDate: value.tradeDate,\n historyMemo: value.memo,\n emailSubject: value.emailSubject,\n })\n}\n\nexport function mapCashbillSearchResult(value: Spec.CashbillSearchApiResponse): Types.CashbillSearchResult {\n return removeUndefinedProperties({\n operationResult: mapCashbillOperationResult(value),\n pageNumber: optionalResponseNumber(value.pageNum),\n pageSize: optionalResponseNumber(value.perPage),\n pageCount: optionalResponseNumber(value.pageCount),\n totalCount: optionalResponseNumber(value.total),\n cashbillSummaries: (value.list ?? []).map(mapCashbillInfo),\n })\n}\n\nexport function mapCashbillLog(value: Spec.CashbillLogApiModel): Types.CashbillLogEntry {\n return removeUndefinedProperties({\n documentLogTypeCode: preserveNumericCode(value.docLogType),\n logMessage: value.log,\n processTypeCode: value.procType,\n processCompanyName: value.procCorpName,\n processContactName: value.procContactName,\n processDescription: value.procMemo,\n registeredAt: value.regDT,\n ipAddress: value.ip,\n })\n}\n\nexport function mapCashbillAccessUrl(accessUrl: string): Types.CashbillAccessUrl {\n return { accessUrl }\n}\n\nexport function mapCashbillEmailSendSetting(value: Spec.CashbillEmailConfigApiModel): Types.CashbillEmailSendSetting {\n return removeUndefinedProperties({ emailTypeCode: value.emailType, sendEnabled: preserveBooleanResponse(value.sendYN) })\n}\n\nexport function mapCashbillChargeInfo(value: Spec.CashbillChargeInfoApiResponse): Types.CashbillChargeInfo {\n return removeUndefinedProperties({ unitCost: value.unitCost, chargeMethod: value.chargeMethod, rateSystem: value.rateSystem })\n}\n","export const CashbillTransactionTypes = { Approval: '승인거래', Cancellation: '취소거래' } as const\nexport type CashbillTransactionType = (typeof CashbillTransactionTypes)[keyof typeof CashbillTransactionTypes]\nexport const CashbillUsageTypes = { IncomeDeduction: '소득공제용', ProofOfPurchase: '지출증빙용' } as const\nexport type CashbillUsageType = (typeof CashbillUsageTypes)[keyof typeof CashbillUsageTypes]\nexport const CashbillTradeOptions = { General: '일반', Culture: '도서공연', PublicTransportation: '대중교통' } as const\nexport type CashbillTradeOption = (typeof CashbillTradeOptions)[keyof typeof CashbillTradeOptions]\nexport const CashbillTaxTypes = { Taxable: '과세', Exempt: '비과세' } as const\nexport type CashbillTaxType = (typeof CashbillTaxTypes)[keyof typeof CashbillTaxTypes]\nexport const CashbillCancellationReasons = { TransactionCancelled: 1, IssuedInError: 2, Other: 3 } as const\nexport type CashbillCancellationReason = (typeof CashbillCancellationReasons)[keyof typeof CashbillCancellationReasons]\n\nexport interface CashbillMerchantInput {\n businessNumber: string\n taxRegistrationIdentifier?: string\n companyName?: string\n chiefExecutiveOfficerName?: string\n address?: string\n telephoneNumber?: string\n}\n\nexport interface CashbillBuyerInput {\n /** 휴대폰·주민등록·사업자·현금영수증 카드 식별번호입니다. */\n identificationNumber: string\n customerName?: string\n emailAddress?: string\n mobilePhoneNumber?: string\n}\n\n/** 금액을 반올림하거나 숫자로 변환하지 않습니다. */\nexport interface CashbillPaymentInput {\n totalAmount: string\n supplyCostAmount: string\n taxAmount: string\n serviceFeeAmount: string\n}\n\nexport interface CashbillDocumentInput {\n managementKey: string\n transactionType: CashbillTransactionType\n usageType: CashbillUsageType\n tradeOption?: CashbillTradeOption\n taxType: CashbillTaxType\n merchant: CashbillMerchantInput\n buyer: CashbillBuyerInput\n payment: CashbillPaymentInput\n itemName?: string\n orderNumber?: string\n originalConfirmationNumber?: string\n originalTransactionDate?: string\n cancellationReason?: CashbillCancellationReason\n /** yyyyMMddHHmmss. 생략 시 서버의 발행일시를 사용합니다. */\n transactedAt?: string\n sendTextMessage?: boolean\n}\n\n/** 승인 즉시발행과 초대량 발행은 승인거래 문서만 받습니다. */\nexport interface CashbillApprovalDocumentInput extends CashbillDocumentInput {\n transactionType: '승인거래'\n}\n","import type { CashbillApprovalDocumentInput, CashbillCancellationReason, CashbillDocumentInput, CashbillPaymentInput } from './document'\nimport type * as Response from './response'\nexport * from './document'\nexport type * from './response'\n\nexport const CashbillDateType = { Registered: 'R', Transacted: 'T', Issued: 'I' } as const\nexport type CashbillDateType = (typeof CashbillDateType)[keyof typeof CashbillDateType]\nexport const CashbillSortOrder = { Ascending: 'A', Descending: 'D' } as const\nexport type CashbillSortOrder = (typeof CashbillSortOrder)[keyof typeof CashbillSortOrder]\nexport const CashbillBoxScopes = { TemporaryDocumentBox: 'TBOX', IssuedDocumentBox: 'PBOX', CreateDocument: 'WRITE' } as const\nexport type CashbillBoxScope = (typeof CashbillBoxScopes)[keyof typeof CashbillBoxScopes]\n\nexport interface CashbillBusinessRequest {\n businessNumber: string\n}\nexport interface CashbillDocumentRequest extends CashbillBusinessRequest {\n managementKey: string\n}\n\nexport type CashbillCancellationAmounts =\n | { partialCancellation?: false; payment?: never }\n | { partialCancellation: true; payment: CashbillPaymentInput }\nexport interface IssueCashbillImmediatelyInput extends RegisterCashbillInput {\n document: CashbillApprovalDocumentInput\n historyMemo?: string\n emailSubject?: string\n}\nexport type RevokeCashbillInput = CashbillDocumentRequest &\n CashbillCancellationAmounts & {\n originalConfirmationNumber: string\n originalTransactionDate: string\n sendTextMessage?: boolean\n historyMemo?: string\n emailSubject?: string\n transactedAt?: string\n cancellationReason?: CashbillCancellationReason\n }\nexport interface SubmitCashbillsInput extends CashbillBusinessRequest {\n submissionIdentifier: string\n documents: CashbillApprovalDocumentInput[]\n historyMemo?: string\n emailSubject?: string\n}\nexport interface GetCashbillBulkResultInput extends CashbillBusinessRequest {\n submissionIdentifier: string\n}\nexport interface RegisterCashbillInput extends CashbillBusinessRequest {\n document: CashbillDocumentInput\n}\nexport type RegisterCashbillRevocationInput = CashbillDocumentRequest &\n CashbillCancellationAmounts & {\n originalConfirmationNumber: string\n originalTransactionDate: string\n sendTextMessage?: boolean\n cancellationReason?: CashbillCancellationReason\n }\nexport interface UpdateCashbillInput extends RegisterCashbillInput {\n managementKey: string\n}\nexport interface IssueCashbillInput extends CashbillDocumentRequest {\n historyMemo?: string\n}\nexport type CancelIssuedCashbillInput = IssueCashbillInput\nexport type DeleteCashbillInput = CashbillDocumentRequest\nexport type GetCashbillInfoInput = CashbillDocumentRequest\nexport interface GetCashbillsInfoInput extends CashbillBusinessRequest {\n managementKeys: string[]\n}\nexport type GetCashbillDetailInfoInput = CashbillDocumentRequest\nexport type CheckCashbillManagementKeyInUseInput = CashbillDocumentRequest\n\nexport interface SearchCashbillsInput extends CashbillBusinessRequest {\n searchDateType: CashbillDateType\n startDate: string\n endDate: string\n stateCodes?: string[]\n transactionTypes?: ('N' | 'C')[]\n usageTypes?: ('P' | 'C')[]\n tradeOptions?: ('N' | 'B' | 'T')[]\n taxTypes?: ('T' | 'N')[]\n merchantTaxRegistrationIdentifiers?: string[]\n queryText?: string\n sortOrder?: CashbillSortOrder\n pageNumber?: number\n pageSize?: number\n}\nexport type GetCashbillLogsInput = CashbillDocumentRequest\n\nexport interface GetCashbillBoxURLInput extends CashbillBusinessRequest {\n cashbillBoxScope: CashbillBoxScope\n}\nexport type GetCashbillPopupURLInput = CashbillDocumentRequest\nexport type GetCashbillViewURLInput = CashbillDocumentRequest\nexport type GetCashbillPrintURLInput = CashbillDocumentRequest\nexport type GetReceiverCashbillPrintURLInput = CashbillDocumentRequest\nexport type GetBulkCashbillPrintURLInput = GetCashbillsInfoInput\nexport type GetCashbillMailURLInput = CashbillDocumentRequest\nexport type GetCashbillPDFURLInput = CashbillDocumentRequest\nexport type DownloadCashbillPDFInput = CashbillDocumentRequest\nexport interface ResendCashbillEmailInput extends CashbillDocumentRequest {\n receiverEmailAddress: string\n}\nexport interface ResendCashbillSMSInput extends ResendCashbillFAXInput {\n messageBody: string\n}\nexport interface ResendCashbillFAXInput extends CashbillDocumentRequest {\n senderPhoneNumber: string\n receiverPhoneNumber: string\n}\nexport interface AssignCashbillManagementKeyInput extends CashbillDocumentRequest {\n itemKey: string\n}\nexport type GetCashbillEmailSendSettingsInput = CashbillBusinessRequest\nexport interface UpdateCashbillEmailSendSettingsInput extends CashbillBusinessRequest {\n emailTypeCode: 'CSH_ISSUE'\n sendEnabled: boolean\n}\nexport type GetCashbillChargeInfoInput = CashbillBusinessRequest\nexport type GetCashbillUnitCostInput = CashbillBusinessRequest\n\n/** 사용자 ID는 client 생성 시 지정하며, compatibility 별칭을 제공하지 않습니다. */\nexport interface CashbillService {\n /** Compat: `registIssue` */\n issueCashbillImmediately(input: IssueCashbillImmediatelyInput): Promise<Response.CashbillIssueResult>\n /** Compat: `revokeRegistIssue` */\n revokeCashbill(input: RevokeCashbillInput): Promise<Response.CashbillIssueResult>\n /** Compat: `bulkSubmit` */\n submitCashbills(input: SubmitCashbillsInput): Promise<Response.CashbillBulkSubmissionResult>\n /** Compat: `getBulkResult` */\n getCashbillBulkResult(input: GetCashbillBulkResultInput): Promise<Response.CashbillBulkResult>\n /** Compat: `register` */\n registerCashbill(input: RegisterCashbillInput): Promise<Response.CashbillOperationResult>\n /** Compat: `revokeRegister` */\n registerCashbillRevocation(input: RegisterCashbillRevocationInput): Promise<Response.CashbillOperationResult>\n /** Compat: `update` */\n updateCashbill(input: UpdateCashbillInput): Promise<Response.CashbillOperationResult>\n /** Compat: `issue` */\n issueCashbill(input: IssueCashbillInput): Promise<Response.CashbillIssueResult>\n /** Compat: `cancelIssue` */\n cancelIssuedCashbill(input: CancelIssuedCashbillInput): Promise<Response.CashbillOperationResult>\n /** Compat: `delete` */\n deleteCashbill(input: DeleteCashbillInput): Promise<Response.CashbillOperationResult>\n /** Compat: `getInfo` */\n getCashbillInfo(input: GetCashbillInfoInput): Promise<Response.CashbillInfo>\n /** Compat: `getInfos` */\n getCashbillsInfo(input: GetCashbillsInfoInput): Promise<Response.CashbillInfo[]>\n /** Compat: `getDetailInfo` */\n getCashbillDetailInfo(input: GetCashbillDetailInfoInput): Promise<Response.CashbillDocumentOutput>\n /** Compat: `checkMgtKeyInUse` */\n checkCashbillManagementKeyInUse(input: CheckCashbillManagementKeyInUseInput): Promise<Response.CashbillManagementKeyUsage>\n /** Compat: `search` */\n searchCashbills(input: SearchCashbillsInput): Promise<Response.CashbillSearchResult>\n /** Compat: `getLogs` */\n getCashbillLogs(input: GetCashbillLogsInput): Promise<Response.CashbillLogEntry[]>\n /** Compat: `getURL` */\n getCashbillBoxURL(input: GetCashbillBoxURLInput): Promise<Response.CashbillAccessUrl>\n /** Compat: `getPopUpURL` */\n getCashbillPopupURL(input: GetCashbillPopupURLInput): Promise<Response.CashbillAccessUrl>\n /** Compat: `getViewURL` */\n getCashbillViewURL(input: GetCashbillViewURLInput): Promise<Response.CashbillAccessUrl>\n /** Compat: `getPrintURL` */\n getCashbillPrintURL(input: GetCashbillPrintURLInput): Promise<Response.CashbillAccessUrl>\n /** Compat: `getEPrintURL` */\n getReceiverCashbillPrintURL(input: GetReceiverCashbillPrintURLInput): Promise<Response.CashbillAccessUrl>\n /** Compat: `getMassPrintURL` */\n getBulkCashbillPrintURL(input: GetBulkCashbillPrintURLInput): Promise<Response.CashbillAccessUrl>\n /** Compat: `getMailURL` */\n getCashbillMailURL(input: GetCashbillMailURLInput): Promise<Response.CashbillAccessUrl>\n /** Compat: `getPDFURL` */\n getCashbillPDFURL(input: GetCashbillPDFURLInput): Promise<Response.CashbillAccessUrl>\n /** Compat: `getPDF` */\n downloadCashbillPDF(input: DownloadCashbillPDFInput): Promise<Buffer>\n /** Compat: `sendEmail` */\n resendCashbillEmail(input: ResendCashbillEmailInput): Promise<Response.CashbillOperationResult>\n /** Compat: `sendSMS` */\n resendCashbillSMS(input: ResendCashbillSMSInput): Promise<Response.CashbillOperationResult>\n /** Compat: `sendFAX` */\n resendCashbillFAX(input: ResendCashbillFAXInput): Promise<Response.CashbillOperationResult>\n /** Compat: `assignMgtKey` */\n assignCashbillManagementKey(input: AssignCashbillManagementKeyInput): Promise<Response.CashbillOperationResult>\n /** Compat: `listEmailConfig` */\n getEmailSendSettings(input: GetCashbillEmailSendSettingsInput): Promise<Response.CashbillEmailSendSetting[]>\n /** Compat: `updateEmailConfig` */\n updateEmailSendSettings(input: UpdateCashbillEmailSendSettingsInput): Promise<Response.CashbillOperationResult>\n /** Compat: `getChargeInfo` */\n getChargeInfo(input: GetCashbillChargeInfoInput): Promise<Response.CashbillChargeInfo>\n /** Compat: `getUnitCost` */\n getUnitCost(input: GetCashbillUnitCostInput): Promise<Response.CashbillUnitCost>\n}\n","import type { CashbillPromiseService as CompatCashbillService } from '@connextable/popbill-compat/factory'\nimport { createInputValidationError } from '@connextable/popbill-compat/errors'\nimport { isValidCalendarDate8 } from '@connextable/popbill-utils'\nimport { PopbillErrorStage, type PopbillApiError } from '@/errors'\nimport { invokeCashbillMethod } from './adapters/error'\nimport { mapCashbillDocument } from './mappers/document'\nimport * as mappers from './mappers/response'\nimport * as types from './types'\n\ninterface CreateCashbillServiceInput {\n compatCashbillService: CompatCashbillService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\nexport function createCashbillService(input: CreateCashbillServiceInput): types.CashbillService {\n const compat = input.compatCashbillService\n const userId = input.defaultUserId\n const invoke = <T>(method: keyof types.CashbillService, handler: () => Promise<T>) => invokeCashbillMethod(input, `cashbill.${method}`, handler)\n return {\n issueCashbillImmediately(request) {\n return invoke('issueCashbillImmediately', async () =>\n mappers.mapCashbillIssueResult(\n await compat.registIssue(request.businessNumber, mapCashbillDocument(request.document), request.historyMemo, userId, request.emailSubject)\n )\n )\n },\n revokeCashbill(request) {\n return invoke('revokeCashbill', async () => {\n validateRevocation(request, 'revokeCashbill')\n return mappers.mapCashbillIssueResult(\n await compat.revokeRegistIssue(\n request.businessNumber,\n request.managementKey,\n request.originalConfirmationNumber,\n request.originalTransactionDate,\n request.sendTextMessage,\n request.historyMemo,\n userId,\n request.partialCancellation,\n request.cancellationReason,\n request.payment?.supplyCostAmount,\n request.payment?.taxAmount,\n request.payment?.serviceFeeAmount,\n request.payment?.totalAmount,\n request.emailSubject,\n request.transactedAt\n )\n )\n })\n },\n submitCashbills(request) {\n return invoke('submitCashbills', async () =>\n mappers.mapCashbillBulkSubmissionResult(\n await compat.bulkSubmit(\n request.businessNumber,\n request.submissionIdentifier,\n request.documents.map((document) => ({\n ...mapCashbillDocument(document),\n memo: request.historyMemo,\n emailSubject: request.emailSubject,\n })),\n userId\n )\n )\n )\n },\n getCashbillBulkResult(request) {\n return invoke('getCashbillBulkResult', async () =>\n mappers.mapCashbillBulkResult(await compat.getBulkResult(request.businessNumber, request.submissionIdentifier, userId))\n )\n },\n registerCashbill(request) {\n return invoke('registerCashbill', async () =>\n mappers.mapCashbillOperationResult(await compat.register(request.businessNumber, mapCashbillDocument(request.document), userId))\n )\n },\n registerCashbillRevocation(request) {\n return invoke('registerCashbillRevocation', async () => {\n validateRevocation(request, 'registerCashbillRevocation')\n return mappers.mapCashbillOperationResult(\n await compat.revokeRegister(\n request.businessNumber,\n request.managementKey,\n request.originalConfirmationNumber,\n request.originalTransactionDate,\n request.sendTextMessage,\n userId,\n request.partialCancellation,\n request.cancellationReason,\n request.payment?.supplyCostAmount,\n request.payment?.taxAmount,\n request.payment?.serviceFeeAmount,\n request.payment?.totalAmount\n )\n )\n })\n },\n updateCashbill(request) {\n return invoke('updateCashbill', async () =>\n mappers.mapCashbillOperationResult(\n await compat.update(request.businessNumber, request.managementKey, mapCashbillDocument(request.document), userId)\n )\n )\n },\n issueCashbill(request) {\n return invoke('issueCashbill', async () =>\n mappers.mapCashbillIssueResult(await compat.issue(request.businessNumber, request.managementKey, request.historyMemo, userId))\n )\n },\n cancelIssuedCashbill(request) {\n return invoke('cancelIssuedCashbill', async () =>\n mappers.mapCashbillOperationResult(await compat.cancelIssue(request.businessNumber, request.managementKey, request.historyMemo, userId))\n )\n },\n deleteCashbill(request) {\n return invoke('deleteCashbill', async () =>\n mappers.mapCashbillOperationResult(await compat.delete(request.businessNumber, request.managementKey, userId))\n )\n },\n getCashbillInfo(request) {\n return invoke('getCashbillInfo', async () =>\n mappers.mapCashbillInfo(await compat.getInfo(request.businessNumber, request.managementKey, userId))\n )\n },\n getCashbillsInfo(request) {\n return invoke('getCashbillsInfo', async () =>\n (await compat.getInfos(request.businessNumber, [...request.managementKeys], userId)).map(mappers.mapCashbillInfo)\n )\n },\n getCashbillDetailInfo(request) {\n return invoke('getCashbillDetailInfo', async () =>\n mappers.mapCashbillDocumentOutput(await compat.getDetailInfo(request.businessNumber, request.managementKey, userId))\n )\n },\n checkCashbillManagementKeyInUse(request) {\n return invoke('checkCashbillManagementKeyInUse', async () => ({\n isInUse: await compat.checkMgtKeyInUse(request.businessNumber, request.managementKey, userId),\n }))\n },\n searchCashbills(request) {\n return invoke('searchCashbills', async () => {\n validateSearch(request)\n return mappers.mapCashbillSearchResult(\n await compat.search(\n request.businessNumber,\n request.searchDateType,\n request.startDate,\n request.endDate,\n [...(request.stateCodes ?? [])],\n [...(request.transactionTypes ?? [])],\n [...(request.usageTypes ?? [])],\n [...(request.tradeOptions ?? [])],\n [...(request.taxTypes ?? [])],\n request.queryText ?? '',\n request.sortOrder ?? 'D',\n request.pageNumber ?? 1,\n request.pageSize ?? 100,\n request.merchantTaxRegistrationIdentifiers?.join(',') ?? '',\n userId\n )\n )\n })\n },\n getCashbillLogs(request) {\n return invoke('getCashbillLogs', async () =>\n (await compat.getLogs(request.businessNumber, request.managementKey, userId)).map(mappers.mapCashbillLog)\n )\n },\n getCashbillBoxURL(request) {\n return invoke('getCashbillBoxURL', async () =>\n mappers.mapCashbillAccessUrl(await compat.getURL(request.businessNumber, request.cashbillBoxScope, userId))\n )\n },\n getCashbillPopupURL(request) {\n return invoke('getCashbillPopupURL', async () =>\n mappers.mapCashbillAccessUrl(await compat.getPopUpURL(request.businessNumber, request.managementKey, userId))\n )\n },\n getCashbillViewURL(request) {\n return invoke('getCashbillViewURL', async () =>\n mappers.mapCashbillAccessUrl(await compat.getViewURL(request.businessNumber, request.managementKey, userId))\n )\n },\n getCashbillPrintURL(request) {\n return invoke('getCashbillPrintURL', async () =>\n mappers.mapCashbillAccessUrl(await compat.getPrintURL(request.businessNumber, request.managementKey, userId))\n )\n },\n getReceiverCashbillPrintURL(request) {\n return invoke('getReceiverCashbillPrintURL', async () =>\n mappers.mapCashbillAccessUrl(await compat.getEPrintURL(request.businessNumber, request.managementKey, userId))\n )\n },\n getBulkCashbillPrintURL(request) {\n return invoke('getBulkCashbillPrintURL', async () =>\n mappers.mapCashbillAccessUrl(await compat.getMassPrintURL(request.businessNumber, [...request.managementKeys], userId))\n )\n },\n getCashbillMailURL(request) {\n return invoke('getCashbillMailURL', async () =>\n mappers.mapCashbillAccessUrl(await compat.getMailURL(request.businessNumber, request.managementKey, userId))\n )\n },\n getCashbillPDFURL(request) {\n return invoke('getCashbillPDFURL', async () =>\n mappers.mapCashbillAccessUrl(await compat.getPDFURL(request.businessNumber, request.managementKey, userId))\n )\n },\n downloadCashbillPDF(request) {\n return invoke('downloadCashbillPDF', () => compat.getPDF(request.businessNumber, request.managementKey, userId))\n },\n resendCashbillEmail(request) {\n return invoke('resendCashbillEmail', async () =>\n mappers.mapCashbillOperationResult(\n await compat.sendEmail(request.businessNumber, request.managementKey, request.receiverEmailAddress, userId)\n )\n )\n },\n resendCashbillSMS(request) {\n return invoke('resendCashbillSMS', async () =>\n mappers.mapCashbillOperationResult(\n await compat.sendSMS(\n request.businessNumber,\n request.managementKey,\n request.senderPhoneNumber,\n request.receiverPhoneNumber,\n request.messageBody,\n userId\n )\n )\n )\n },\n resendCashbillFAX(request) {\n return invoke('resendCashbillFAX', async () =>\n mappers.mapCashbillOperationResult(\n await compat.sendFAX(request.businessNumber, request.managementKey, request.senderPhoneNumber, request.receiverPhoneNumber, userId)\n )\n )\n },\n assignCashbillManagementKey(request) {\n return invoke('assignCashbillManagementKey', async () =>\n mappers.mapCashbillOperationResult(await compat.assignMgtKey(request.businessNumber, request.itemKey, request.managementKey, userId))\n )\n },\n getEmailSendSettings(request) {\n return invoke('getEmailSendSettings', async () =>\n (await compat.listEmailConfig(request.businessNumber, userId)).map(mappers.mapCashbillEmailSendSetting)\n )\n },\n updateEmailSendSettings(request) {\n return invoke('updateEmailSendSettings', async () =>\n mappers.mapCashbillOperationResult(await compat.updateEmailConfig(request.businessNumber, request.emailTypeCode, request.sendEnabled, userId))\n )\n },\n getChargeInfo(request) {\n return invoke('getChargeInfo', async () => mappers.mapCashbillChargeInfo(await compat.getChargeInfo(request.businessNumber, userId)))\n },\n getUnitCost(request) {\n return invoke('getUnitCost', async () => ({ unitCost: await compat.getUnitCost(request.businessNumber) }))\n },\n }\n}\n\nfunction fail(message: string, operation: string): never {\n throw createInputValidationError(message, { operation: `cashbill.${operation}`, stage: PopbillErrorStage.ValidateInput })\n}\n\nfunction validateRevocation(request: types.RegisterCashbillRevocationInput, operation: 'revokeCashbill' | 'registerCashbillRevocation'): void {\n if (request.partialCancellation && !request.payment) fail('부분 취소에는 payment가 필요합니다.', operation)\n}\n\nfunction validateSearch(request: types.SearchCashbillsInput): void {\n const invalid = (message: string) => fail(message, 'searchCashbills')\n if (!Object.values(types.CashbillDateType).includes(request.searchDateType)) invalid('searchDateType이 올바르지 않습니다.')\n for (const [name, date] of [\n ['startDate', request.startDate],\n ['endDate', request.endDate],\n ]) {\n if (typeof date !== 'string' || !/^\\d{8}$/.test(date)) invalid(`${name}는 yyyyMMdd 형식이어야 합니다.`)\n if (!isValidCalendarDate8(date!)) invalid(`${name}가 유효한 날짜가 아닙니다.`)\n }\n if (request.startDate > request.endDate) invalid('startDate는 endDate 이후일 수 없습니다.')\n if (request.sortOrder !== undefined && !Object.values(types.CashbillSortOrder).includes(request.sortOrder))\n invalid('sortOrder가 올바르지 않습니다.')\n if (request.pageNumber !== undefined && (!Number.isInteger(request.pageNumber) || request.pageNumber < 1))\n invalid('pageNumber는 1 이상의 정수여야 합니다.')\n if (request.pageSize !== undefined && (!Number.isInteger(request.pageSize) || request.pageSize < 1)) invalid('pageSize는 1 이상의 정수여야 합니다.')\n}\n","import type { CashbillService } from './types'\n\nexport const CASHBILL_METHODS = [\n // 발행/취소\n 'issueCashbillImmediately',\n 'revokeCashbill',\n 'submitCashbills',\n 'getCashbillBulkResult',\n 'registerCashbill',\n 'registerCashbillRevocation',\n 'updateCashbill',\n 'issueCashbill',\n 'cancelIssuedCashbill',\n 'deleteCashbill',\n // 정보확인\n 'getCashbillInfo',\n 'getCashbillsInfo',\n 'getCashbillDetailInfo',\n 'checkCashbillManagementKeyInUse',\n 'searchCashbills',\n 'getCashbillLogs',\n 'getCashbillBoxURL',\n // 보기/인쇄\n 'getCashbillPopupURL',\n 'getCashbillViewURL',\n 'getCashbillPrintURL',\n 'getReceiverCashbillPrintURL',\n 'getBulkCashbillPrintURL',\n 'getCashbillMailURL',\n 'getCashbillPDFURL',\n 'downloadCashbillPDF',\n // 부가기능\n 'resendCashbillEmail',\n 'resendCashbillSMS',\n 'resendCashbillFAX',\n 'assignCashbillManagementKey',\n 'getEmailSendSettings',\n 'updateEmailSendSettings',\n // 과금정보\n 'getChargeInfo',\n 'getUnitCost',\n] as const satisfies readonly (keyof CashbillService)[]\n","import type * as Spec from '@connextable/popbill-spec'\nimport { removeUndefinedProperties } from '@connextable/popbill-utils'\nimport type { StatementAdditionalFieldNumber, StatementDocumentInput, StatementLineItemInput } from '../types'\n\nexport const ADDITIONAL_FIELD_NUMBERS: readonly StatementAdditionalFieldNumber[] = [\n 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,\n]\n\n/** 금액 문자열과 추가 속성을 유지하면서 API 문서로 변환합니다. */\nexport function mapStatementDocument(document: StatementDocumentInput): Spec.StatementApiModel {\n return removeUndefinedProperties({\n itemCode: document.documentTypeCode,\n mgtKey: document.managementKey,\n formCode: document.formCode,\n writeDate: document.writtenDate,\n taxType: document.taxType,\n purposeType: document.purposeType,\n serialNum: document.documentSerialNumber,\n taxTotal: document.paymentSummary?.totalTaxAmount,\n supplyCostTotal: document.paymentSummary?.totalSupplyCostAmount,\n totalAmount: document.paymentSummary?.totalAmount,\n remark1: document.remarkOne,\n remark2: document.remarkTwo,\n remark3: document.remarkThree,\n senderCorpNum: document.sender?.businessNumber,\n senderTaxRegID: document.sender?.taxRegistrationIdentifier,\n senderCorpName: document.sender?.companyName,\n senderCEOName: document.sender?.chiefExecutiveOfficerName,\n senderAddr: document.sender?.address,\n senderBizType: document.sender?.businessType,\n senderBizClass: document.sender?.businessClass,\n senderContactName: document.sender?.contactName,\n senderDeptName: document.sender?.departmentName,\n senderTEL: document.sender?.telephoneNumber,\n senderHP: document.sender?.mobilePhoneNumber,\n senderEmail: document.sender?.emailAddress,\n senderFAX: document.sender?.faxNumber,\n receiverCorpNum: document.receiver?.businessNumber,\n receiverTaxRegID: document.receiver?.taxRegistrationIdentifier,\n receiverCorpName: document.receiver?.companyName,\n receiverCEOName: document.receiver?.chiefExecutiveOfficerName,\n receiverAddr: document.receiver?.address,\n receiverBizType: document.receiver?.businessType,\n receiverBizClass: document.receiver?.businessClass,\n receiverContactName: document.receiver?.contactName,\n receiverDeptName: document.receiver?.departmentName,\n receiverTEL: document.receiver?.telephoneNumber,\n receiverHP: document.receiver?.mobilePhoneNumber,\n receiverEmail: document.receiver?.emailAddress,\n receiverFAX: document.receiver?.faxNumber,\n businessLicenseYN: document.includeBusinessLicenseImage,\n bankBookYN: document.includeBankBookImage,\n smssendYN: document.sendTextMessage,\n propertyBag: document.propertyBag === undefined ? undefined : { ...document.propertyBag },\n detailList: document.lineItems?.map(mapLineItem),\n })\n}\n\nfunction mapLineItem(item: StatementLineItemInput): Spec.StatementDetailApiModel {\n const mapped: Spec.StatementDetailApiModel = removeUndefinedProperties({\n serialNum: item.lineNumber,\n purchaseDT: item.transactionDate,\n itemName: item.itemName,\n spec: item.specification,\n qty: item.quantity,\n unitCost: item.unitCostAmount,\n supplyCost: item.supplyCostAmount,\n tax: item.taxAmount,\n remark: item.remark,\n })\n for (const number of ADDITIONAL_FIELD_NUMBERS) {\n const value = item.additionalFields?.[number]\n if (value !== undefined) mapped[`spare${number}`] = value\n }\n return mapped\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport type { StatementInfo } from '../types'\nimport { compactOptionalObject, preserveBooleanResponse, preserveNumericCode, removeUndefinedProperties } from '@connextable/popbill-utils'\n\n/** compat `getInfo` 응답을 modern StatementInfo로 변환합니다. */\nexport function mapStatementInfo(response: Spec.StatementInfo): StatementInfo {\n return removeUndefinedProperties({\n documentTypeCode: preserveNumericCode(response.itemCode),\n itemKey: response.itemKey,\n documentNumber: response.invoiceNum,\n managementKey: response.mgtKey,\n taxType: response.taxType,\n purposeType: response.purposeType,\n sender: compactOptionalObject({\n businessNumber: response.senderCorpNum,\n companyName: response.senderCorpName,\n printEnabled: preserveBooleanResponse(response.senderPrintYN),\n }),\n receiver: compactOptionalObject({\n businessNumber: response.receiverCorpNum,\n companyName: response.receiverCorpName,\n printEnabled: preserveBooleanResponse(response.receiverPrintYN),\n }),\n totalSupplyCostAmount: response.supplyCostTotal,\n totalTaxAmount: response.taxTotal,\n stateCode: preserveNumericCode(response.stateCode),\n stateMemo: response.stateMemo,\n isOpen: preserveBooleanResponse(response.openYN),\n writtenDate: response.writeDate,\n registeredAt: response.regDT,\n issuedAt: response.issueDT,\n stateChangedAt: response.stateDT,\n openedAt: response.openDT,\n })\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport type * as Types from '../types'\nimport {\n compactOptionalObject,\n optionalResponseNumber,\n preserveBooleanResponse,\n preserveNumericCode,\n removeUndefinedProperties,\n} from '@connextable/popbill-utils'\nimport { ADDITIONAL_FIELD_NUMBERS } from './document'\nimport { mapStatementInfo } from './statement-info'\n\nexport function mapStatementOperationResult(response: Spec.StatementApiResponseBase): Types.StatementOperationResult {\n return { resultCode: preserveNumericCode(response.code), resultMessage: response.message }\n}\n\nexport function mapStatementIssueResult(response: Spec.StatementRegistIssueApiResponse): Types.StatementIssueResult {\n return removeUndefinedProperties({\n ...mapStatementOperationResult(response),\n documentNumber: response.invoiceNum,\n issuedAt: response.issueDT,\n })\n}\n\nexport function mapStatementDocumentOutput(response: Spec.StatementGetDetailInfoApiResponse): Types.StatementDocumentOutput {\n return removeUndefinedProperties({\n documentTypeCode: preserveNumericCode(response.itemCode),\n managementKey: response.mgtKey,\n documentNumber: response.invoiceNum,\n documentSerialNumber: response.serialNum,\n formCode: response.formCode,\n writtenDate: response.writeDate,\n taxType: response.taxType,\n purposeType: response.purposeType,\n sender: compactOptionalObject({\n businessNumber: response.senderCorpNum,\n taxRegistrationIdentifier: response.senderTaxRegID,\n companyName: response.senderCorpName,\n chiefExecutiveOfficerName: response.senderCEOName,\n address: response.senderAddr,\n businessType: response.senderBizType,\n businessClass: response.senderBizClass,\n departmentName: response.senderDeptName,\n contactName: response.senderContactName,\n telephoneNumber: response.senderTEL,\n mobilePhoneNumber: response.senderHP,\n emailAddress: response.senderEmail,\n faxNumber: response.senderFAX,\n }),\n receiver: compactOptionalObject({\n businessNumber: response.receiverCorpNum,\n taxRegistrationIdentifier: response.receiverTaxRegID,\n companyName: response.receiverCorpName,\n chiefExecutiveOfficerName: response.receiverCEOName,\n address: response.receiverAddr,\n businessType: response.receiverBizType,\n businessClass: response.receiverBizClass,\n departmentName: response.receiverDeptName,\n contactName: response.receiverContactName,\n telephoneNumber: response.receiverTEL,\n mobilePhoneNumber: response.receiverHP,\n emailAddress: response.receiverEmail,\n faxNumber: response.receiverFAX,\n }),\n paymentSummary: compactOptionalObject({\n totalSupplyCostAmount: response.supplyCostTotal,\n totalTaxAmount: response.taxTotal,\n totalAmount: response.totalAmount,\n }),\n lineItems: response.detailList?.map((item) =>\n removeUndefinedProperties({\n lineNumber: optionalResponseNumber(item.serialNum),\n transactionDate: item.purchaseDT,\n itemName: item.itemName,\n specification: item.spec,\n quantity: item.qty,\n unitCostAmount: item.unitCost,\n supplyCostAmount: item.supplyCost,\n taxAmount: item.tax,\n remark: item.remark,\n additionalFields: mapAdditionalFields(item),\n })\n ),\n remarkOne: response.remark1,\n remarkTwo: response.remark2,\n remarkThree: response.remark3,\n propertyBag: response.propertyBag === undefined ? undefined : { ...response.propertyBag },\n includeBusinessLicenseImage: preserveBooleanResponse(response.businessLicenseYN),\n includeBankBookImage: preserveBooleanResponse(response.bankBookYN),\n sendTextMessage: preserveBooleanResponse(response.smssendYN),\n autoAcceptEnabled: preserveBooleanResponse(response.autoAcceptYN),\n sendFAXEnabled: preserveBooleanResponse(response.faxsendYN),\n })\n}\n\nexport function mapStatementSearchResult(response: Spec.StatementSearchApiResponse): Types.StatementSearchResult {\n return removeUndefinedProperties({\n operationResult: mapStatementOperationResult(response),\n pageNumber: optionalResponseNumber(response.pageNum),\n pageSize: optionalResponseNumber(response.perPage),\n pageCount: optionalResponseNumber(response.pageCount),\n totalCount: optionalResponseNumber(response.total),\n statementSummaries: (response.list ?? []).map(mapStatementInfo),\n })\n}\n\nexport function mapStatementLog(response: Spec.StatementLog): Types.StatementLogEntry {\n return removeUndefinedProperties({\n documentLogTypeCode: preserveNumericCode(response.docLogType),\n logMessage: response.log,\n processTypeCode: response.procType,\n processCompanyName: response.procCorpName,\n processContactName: response.procContactName,\n processDescription: response.procMemo,\n registeredAt: response.regDT,\n ipAddress: response.ip,\n })\n}\n\nexport function mapStatementAccessUrl(accessUrl: string): Types.StatementAccessUrl {\n return { accessUrl }\n}\n\nexport function mapStatementAttachedFile(response: Spec.StatementFile): Types.StatementAttachedFile {\n return removeUndefinedProperties({\n sequenceNumber: optionalResponseNumber(response.serialNum),\n fileIdentifier: response.attachedFile,\n fileSize: optionalResponseNumber(response.fileSize),\n displayName: response.displayName,\n registeredAt: response.regDT,\n })\n}\n\nexport function mapStatementEmailSendSetting(response: Spec.StatementEmailConfig): Types.StatementEmailSendSetting {\n return removeUndefinedProperties({ emailTypeCode: response.emailType, sendEnabled: preserveBooleanResponse(response.sendYN) })\n}\n\nexport function mapStatementChargeInfo(response: Spec.StatementChargeInfo): Types.StatementChargeInfo {\n return removeUndefinedProperties({ unitCost: response.unitCost, chargeMethod: response.chargeMethod, rateSystem: response.rateSystem })\n}\n\nfunction mapAdditionalFields(item: Spec.StatementDetailApiModel): Types.StatementLineItemInput['additionalFields'] {\n const mapped: NonNullable<Types.StatementLineItemInput['additionalFields']> = {}\n for (const number of ADDITIONAL_FIELD_NUMBERS) {\n const value = item[`spare${number}`]\n if (value !== undefined) mapped[number] = value\n }\n return Object.keys(mapped).length > 0 ? mapped : undefined\n}\n","/** 전자명세서 문서유형 코드입니다. */\nexport const StatementItemCodes = {\n TradeStatement: 121,\n Invoice: 122,\n Estimate: 123,\n PurchaseOrder: 124,\n Deposit: 125,\n Receipt: 126,\n} as const\n\nexport type StatementItemCode = (typeof StatementItemCodes)[keyof typeof StatementItemCodes]\n\n/** 전자명세서 영수/청구 구분입니다. */\nexport const StatementPurposeTypes = { Receipt: '영수', Claim: '청구', None: '없음' } as const\nexport type StatementPurposeType = (typeof StatementPurposeTypes)[keyof typeof StatementPurposeTypes]\n\n/** 전자명세서 과세 유형입니다. */\nexport const StatementTaxationTypes = { Taxable: '과세', ZeroRated: '영세', Exempt: '면세' } as const\nexport type StatementTaxationType = (typeof StatementTaxationTypes)[keyof typeof StatementTaxationTypes]\n\n/** 발신자 또는 수신자 정보입니다. 금액과 식별번호는 문자열 그대로 전송합니다. */\nexport interface StatementPartyInput {\n businessNumber?: string\n taxRegistrationIdentifier?: string\n companyName?: string\n chiefExecutiveOfficerName?: string\n address?: string\n businessType?: string\n businessClass?: string\n departmentName?: string\n contactName?: string\n telephoneNumber?: string\n mobilePhoneNumber?: string\n emailAddress?: string\n faxNumber?: string\n}\n\nexport interface StatementPaymentSummaryInput {\n totalSupplyCostAmount?: string\n totalTaxAmount?: string\n totalAmount?: string\n}\n\n/** 맞춤양식 품목 추가필드 번호(spare1~spare20)입니다. */\nexport type StatementAdditionalFieldNumber = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20\n\nexport interface StatementLineItemInput {\n lineNumber: number\n transactionDate?: string\n itemName?: string\n specification?: string\n quantity?: string\n unitCostAmount?: string\n supplyCostAmount?: string\n taxAmount?: string\n remark?: string\n additionalFields?: Partial<Record<StatementAdditionalFieldNumber, string>>\n}\n\n/** 6종 전자명세서의 공통 입력 문서입니다. */\nexport interface StatementDocumentInput {\n documentTypeCode: StatementItemCode\n managementKey?: string\n documentSerialNumber?: string\n formCode?: string\n writtenDate?: string\n taxType?: StatementTaxationType\n purposeType?: StatementPurposeType\n sender?: StatementPartyInput\n receiver?: StatementPartyInput\n paymentSummary?: StatementPaymentSummaryInput\n lineItems?: StatementLineItemInput[]\n remarkOne?: string\n remarkTwo?: string\n remarkThree?: string\n /** 문서 양식별 추가 속성입니다. 키와 값을 변경 없이 보존합니다. */\n propertyBag?: Record<string, string>\n includeBusinessLicenseImage?: boolean\n includeBankBookImage?: boolean\n sendTextMessage?: boolean\n}\n","import type { StatementDocumentInput, StatementItemCode } from './document'\nimport type * as response from './response'\n\nexport * from './document'\nexport type * from './response'\n\nexport const StatementDateType = { Registered: 'R', Written: 'W', Issued: 'I' } as const\nexport type StatementDateType = (typeof StatementDateType)[keyof typeof StatementDateType]\nexport const StatementSortOrder = { Descending: 'D', Ascending: 'A' } as const\nexport type StatementSortOrder = (typeof StatementSortOrder)[keyof typeof StatementSortOrder]\n/** 전자명세서 문서함입니다. SWBOX는 발행 문서함입니다. */\nexport const StatementBoxScopes = {\n TemporaryDocumentBox: 'TBOX',\n IssuedDocumentBox: 'SWBOX',\n} as const\nexport type StatementBoxScope = (typeof StatementBoxScopes)[keyof typeof StatementBoxScopes]\nexport const StatementStateCodes = { Registered: 100, Issued: 300, Cancelled: 500 } as const\nexport const StatementEmailTypes = {\n Issue: 'SMT_ISSUE',\n Accept: 'SMT_ACCEPT',\n Deny: 'SMT_DENY',\n Cancel: 'SMT_CANCEL',\n CancelIssue: 'SMT_CANCEL_ISSUE',\n} as const\nexport type StatementEmailType = (typeof StatementEmailTypes)[keyof typeof StatementEmailTypes]\n\nexport interface StatementBusinessRequest {\n businessNumber: string\n}\n\nexport interface StatementTypeRequest extends StatementBusinessRequest {\n documentTypeCode: StatementItemCode\n}\n\nexport interface StatementDocumentRequest extends StatementTypeRequest {\n managementKey: string\n}\n\nexport interface IssueStatementImmediatelyInput extends RegisterStatementInput {\n historyMemo?: string\n emailSubject?: string\n}\n\nexport interface RegisterStatementInput extends StatementBusinessRequest {\n document: StatementDocumentInput\n}\n\nexport interface UpdateStatementInput extends StatementDocumentRequest {\n document: StatementDocumentInput\n}\n\nexport interface IssueStatementInput extends StatementDocumentRequest {\n historyMemo?: string\n emailSubject?: string\n}\n\nexport interface CancelIssuedStatementInput extends StatementDocumentRequest {\n historyMemo?: string\n}\n\nexport type DeleteStatementInput = StatementDocumentRequest\nexport type GetStatementInfoInput = StatementDocumentRequest\n\nexport interface GetStatementsInfoInput extends StatementTypeRequest {\n managementKeys: string[]\n}\nexport type GetStatementDetailInfoInput = StatementDocumentRequest\nexport type CheckStatementManagementKeyInUseInput = StatementDocumentRequest\n\nexport interface SearchStatementsInput extends StatementBusinessRequest {\n searchDateType: StatementDateType\n /** 검색일자는 yyyyMMdd 형식입니다. 조회 기간은 최대 6개월입니다. */\n startDate: string\n endDate: string\n stateCodes?: string[]\n documentTypeCodes?: StatementItemCode[]\n queryText?: string\n sortOrder?: StatementSortOrder\n /** @default 1 */\n pageNumber?: number\n /** @default 100 */\n pageSize?: number\n}\nexport type GetStatementLogsInput = StatementDocumentRequest\n\nexport interface GetStatementBoxURLInput extends StatementBusinessRequest {\n statementBoxScope: StatementBoxScope\n}\n\nexport type GetStatementPopupURLInput = StatementDocumentRequest\nexport type GetStatementViewURLInput = StatementDocumentRequest\nexport type GetSenderStatementPrintURLInput = StatementDocumentRequest\nexport type GetReceiverStatementPrintURLInput = StatementDocumentRequest\nexport type GetBulkStatementPrintURLInput = GetStatementsInfoInput\nexport type GetStatementMailURLInput = StatementDocumentRequest\nexport type GetStatementSealAndAttachmentRegistrationURLInput = StatementBusinessRequest\n\nexport interface AttachStatementFileFromPathInput extends StatementDocumentRequest {\n filePath: string\n displayName: string\n}\n\nexport interface AttachStatementFileFromBinaryInput extends StatementDocumentRequest {\n fileName: string\n fileData: Buffer\n}\n\nexport interface DeleteStatementAttachedFileInput extends StatementDocumentRequest {\n fileIdentifier: string\n}\n\nexport type GetStatementAttachedFilesInput = StatementDocumentRequest\n\nexport interface ResendStatementEmailInput extends StatementDocumentRequest {\n receiverEmailAddress: string\n}\n\nexport interface ResendStatementSMSInput extends ResendStatementFAXInput {\n /** 필수 문자 본문입니다. 90바이트를 초과하는 부분은 팝빌에서 삭제합니다. */\n messageBody: string\n}\n\nexport interface ResendStatementFAXInput extends StatementDocumentRequest {\n senderPhoneNumber: string\n receiverPhoneNumber: string\n}\n\n/** 저장 없이 문서 내용을 팩스로 전송합니다. */\nexport interface SendStatementFAXInput extends RegisterStatementInput {\n senderPhoneNumber: string\n receiverPhoneNumber: string\n}\n\nexport interface AttachStatementInput extends StatementDocumentRequest {\n attachedDocumentTypeCode: StatementItemCode\n attachedManagementKey: string\n}\n\nexport type DetachStatementInput = AttachStatementInput\nexport type GetStatementEmailSendSettingsInput = StatementBusinessRequest\n\nexport interface UpdateStatementEmailSendSettingsInput extends StatementBusinessRequest {\n emailTypeCode: StatementEmailType\n sendEnabled: boolean\n}\n\nexport type GetStatementChargeInfoInput = StatementTypeRequest\nexport type GetStatementUnitCostInput = StatementTypeRequest\n\n/** 전자명세서 modern API입니다. 사용자 ID는 client 생성 시 지정합니다. */\nexport interface StatementService {\n /** 즉시발행합니다. Compat: `registIssue` */\n issueStatementImmediately(input: IssueStatementImmediatelyInput): Promise<response.StatementIssueResult>\n /** 임시저장합니다. Compat: `register` */\n registerStatement(input: RegisterStatementInput): Promise<response.StatementOperationResult>\n /** 임시저장 문서를 수정합니다. Compat: `update` */\n updateStatement(input: UpdateStatementInput): Promise<response.StatementOperationResult>\n /** 저장 문서를 발행합니다. Compat: `issue` */\n issueStatement(input: IssueStatementInput): Promise<response.StatementOperationResult>\n /** 발행을 취소합니다. Compat: `cancel` */\n cancelIssuedStatement(input: CancelIssuedStatementInput): Promise<response.StatementOperationResult>\n /** 문서를 삭제합니다. Compat: `delete` */\n deleteStatement(input: DeleteStatementInput): Promise<response.StatementOperationResult>\n /** 요약과 상태를 조회합니다. Compat: `getInfo` */\n getStatementInfo(input: GetStatementInfoInput): Promise<response.StatementInfo>\n /** 여러 문서의 상태를 조회합니다. Compat: `getInfos` */\n getStatementsInfo(input: GetStatementsInfoInput): Promise<response.StatementInfo[]>\n /** 문서 상세를 조회합니다. Compat: `getDetailInfo` */\n getStatementDetailInfo(input: GetStatementDetailInfoInput): Promise<response.StatementDocumentOutput>\n /** 관리번호 사용 여부를 조회합니다. Compat: `checkMgtKeyInUse` */\n checkStatementManagementKeyInUse(input: CheckStatementManagementKeyInUseInput): Promise<response.StatementManagementKeyUsage>\n /** 조건에 맞는 문서를 검색합니다. Compat: `search` */\n searchStatements(input: SearchStatementsInput): Promise<response.StatementSearchResult>\n /** 처리 이력을 조회합니다. Compat: `getLogs` */\n getStatementLogs(input: GetStatementLogsInput): Promise<response.StatementLogEntry[]>\n /** 문서함 URL을 조회합니다. Compat: `getURL` */\n getStatementBoxURL(input: GetStatementBoxURLInput): Promise<response.StatementAccessUrl>\n /** 문서 팝업 URL을 조회합니다. Compat: `getPopUpURL` */\n getStatementPopupURL(input: GetStatementPopupURLInput): Promise<response.StatementAccessUrl>\n /** 문서 보기 URL을 조회합니다. Compat: `getViewURL` */\n getStatementViewURL(input: GetStatementViewURLInput): Promise<response.StatementAccessUrl>\n /** 발신자용 인쇄 URL을 조회합니다. Compat: `getPrintURL` */\n getSenderStatementPrintURL(input: GetSenderStatementPrintURLInput): Promise<response.StatementAccessUrl>\n /** 수신자용 인쇄 URL을 조회합니다. Compat: `getEPrintURL` */\n getReceiverStatementPrintURL(input: GetReceiverStatementPrintURLInput): Promise<response.StatementAccessUrl>\n /** 여러 문서의 인쇄 URL을 조회합니다. Compat: `getMassPrintURL` */\n getBulkStatementPrintURL(input: GetBulkStatementPrintURLInput): Promise<response.StatementAccessUrl>\n /** 안내메일 링크 URL을 조회합니다. Compat: `getMailURL` */\n getStatementMailURL(input: GetStatementMailURLInput): Promise<response.StatementAccessUrl>\n /** 인감 및 첨부서류 등록 URL을 조회합니다. Compat: `getSealURL` */\n getSealAndAttachmentRegistrationURL(input: GetStatementSealAndAttachmentRegistrationURLInput): Promise<response.StatementAccessUrl>\n /** 경로의 파일을 첨부합니다. Compat: `attachFile` */\n attachFileFromPath(input: AttachStatementFileFromPathInput): Promise<response.StatementOperationResult>\n /** 바이너리 파일을 첨부합니다. Compat: `attachFileBinary` */\n attachFileFromBinary(input: AttachStatementFileFromBinaryInput): Promise<response.StatementOperationResult>\n /** 첨부파일을 삭제합니다. Compat: `deleteFile` */\n deleteAttachedFile(input: DeleteStatementAttachedFileInput): Promise<response.StatementOperationResult>\n /** 첨부파일을 조회합니다. Compat: `getFiles` */\n getAttachedFiles(input: GetStatementAttachedFilesInput): Promise<response.StatementAttachedFile[]>\n /** 안내메일을 재전송합니다. Compat: `sendEmail` */\n resendStatementEmail(input: ResendStatementEmailInput): Promise<response.StatementOperationResult>\n /** 문자를 재전송합니다. Compat: `sendSMS` */\n resendStatementSMS(input: ResendStatementSMSInput): Promise<response.StatementOperationResult>\n /** 팩스를 재전송합니다. Compat: `sendFAX` */\n resendStatementFAX(input: ResendStatementFAXInput): Promise<response.StatementOperationResult>\n /** 문서를 선팩스로 전송합니다. Compat: `FAXSend` */\n sendStatementFAX(input: SendStatementFAXInput): Promise<response.StatementFAXReceipt>\n /** 다른 전자명세서를 첨부합니다. Compat: `attachStatement` */\n attachStatement(input: AttachStatementInput): Promise<response.StatementOperationResult>\n /** 전자명세서 첨부를 해제합니다. Compat: `detachStatement` */\n detachStatement(input: DetachStatementInput): Promise<response.StatementOperationResult>\n /** 이메일 전송 설정을 조회합니다. Compat: `listEmailConfig` */\n getEmailSendSettings(input: GetStatementEmailSendSettingsInput): Promise<response.StatementEmailSendSetting[]>\n /** 이메일 전송 설정을 수정합니다. Compat: `updateEmailConfig` */\n updateEmailSendSettings(input: UpdateStatementEmailSendSettingsInput): Promise<response.StatementOperationResult>\n /** 과금 정보를 조회합니다. Compat: `getChargeInfo` */\n getChargeInfo(input: GetStatementChargeInfoInput): Promise<response.StatementChargeInfo>\n /** 발행 단가를 조회합니다. Compat: `getUnitCost` */\n getUnitCost(input: GetStatementUnitCostInput): Promise<response.StatementUnitCost>\n}\n","import type { StatementPromiseService as CompatStatementService } from '@connextable/popbill-compat/factory'\nimport { createInputValidationError } from '@connextable/popbill-compat/errors'\nimport { isValidCalendarDate8 } from '@connextable/popbill-utils'\nimport type { PopbillApiError } from '@/errors'\nimport { PopbillErrorStage } from '@/errors'\nimport { invokeStatementMethod } from './adapters/error'\nimport { mapStatementDocument } from './mappers/document'\nimport * as mappers from './mappers/response'\nimport * as statementInfoMappers from './mappers/statement-info'\nimport * as types from './types'\n\ninterface CreateStatementServiceInput {\n compatStatementService: CompatStatementService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\n/** 전자명세서 DTO를 compat의 위치 인자로 변환합니다. */\nexport function createStatementService(input: CreateStatementServiceInput): types.StatementService {\n const compat = input.compatStatementService\n const userId = input.defaultUserId\n const invoke = <T>(method: keyof types.StatementService, handler: () => Promise<T>): Promise<T> =>\n invokeStatementMethod(input, `statement.${method}`, handler)\n\n return {\n issueStatementImmediately(request) {\n return invoke('issueStatementImmediately', async () =>\n mappers.mapStatementIssueResult(\n await compat.registIssue(request.businessNumber, mapStatementDocument(request.document), request.historyMemo, userId, request.emailSubject)\n )\n )\n },\n registerStatement(request) {\n return invoke('registerStatement', async () =>\n mappers.mapStatementOperationResult(await compat.register(request.businessNumber, mapStatementDocument(request.document), userId))\n )\n },\n updateStatement(request) {\n return invoke('updateStatement', async () =>\n mappers.mapStatementOperationResult(\n await compat.update(request.businessNumber, request.documentTypeCode, request.managementKey, mapStatementDocument(request.document), userId)\n )\n )\n },\n issueStatement(request) {\n return invoke('issueStatement', async () =>\n mappers.mapStatementOperationResult(\n await compat.issue(\n request.businessNumber,\n request.documentTypeCode,\n request.managementKey,\n request.historyMemo,\n request.emailSubject,\n userId\n )\n )\n )\n },\n cancelIssuedStatement(request) {\n return invoke('cancelIssuedStatement', async () =>\n mappers.mapStatementOperationResult(\n await compat.cancel(request.businessNumber, request.documentTypeCode, request.managementKey, request.historyMemo, userId)\n )\n )\n },\n deleteStatement(request) {\n return invoke('deleteStatement', async () =>\n mappers.mapStatementOperationResult(await compat.delete(request.businessNumber, request.documentTypeCode, request.managementKey, userId))\n )\n },\n getStatementInfo(request) {\n return invoke('getStatementInfo', async () =>\n statementInfoMappers.mapStatementInfo(await compat.getInfo(request.businessNumber, request.documentTypeCode, request.managementKey, userId))\n )\n },\n getStatementsInfo(request) {\n return invoke('getStatementsInfo', async () =>\n (await compat.getInfos(request.businessNumber, request.documentTypeCode, [...request.managementKeys], userId)).map(\n statementInfoMappers.mapStatementInfo\n )\n )\n },\n getStatementDetailInfo(request) {\n return invoke('getStatementDetailInfo', async () =>\n mappers.mapStatementDocumentOutput(\n await compat.getDetailInfo(request.businessNumber, request.documentTypeCode, request.managementKey, userId)\n )\n )\n },\n checkStatementManagementKeyInUse(request) {\n return invoke('checkStatementManagementKeyInUse', async () => ({\n isInUse: await compat.checkMgtKeyInUse(request.businessNumber, request.documentTypeCode, request.managementKey, userId),\n }))\n },\n searchStatements(request) {\n return invoke('searchStatements', async () => {\n const normalized = normalizeSearchRequest(request)\n return mappers.mapStatementSearchResult(\n await compat.search(\n request.businessNumber,\n request.searchDateType,\n normalized.startDate,\n normalized.endDate,\n [...(request.stateCodes ?? [])],\n [...(request.documentTypeCodes ?? [])],\n request.queryText ?? '',\n normalized.sortOrder,\n normalized.pageNumber,\n normalized.pageSize,\n userId\n )\n )\n })\n },\n getStatementLogs(request) {\n return invoke('getStatementLogs', async () =>\n (await compat.getLogs(request.businessNumber, request.documentTypeCode, request.managementKey, userId)).map(mappers.mapStatementLog)\n )\n },\n getStatementBoxURL(request) {\n return invoke('getStatementBoxURL', async () =>\n mappers.mapStatementAccessUrl(await compat.getURL(request.businessNumber, request.statementBoxScope, userId))\n )\n },\n getStatementPopupURL(request) {\n return invoke('getStatementPopupURL', async () =>\n mappers.mapStatementAccessUrl(await compat.getPopUpURL(request.businessNumber, request.documentTypeCode, request.managementKey, userId))\n )\n },\n getStatementViewURL(request) {\n return invoke('getStatementViewURL', async () =>\n mappers.mapStatementAccessUrl(await compat.getViewURL(request.businessNumber, request.documentTypeCode, request.managementKey, userId))\n )\n },\n getSenderStatementPrintURL(request) {\n return invoke('getSenderStatementPrintURL', async () =>\n mappers.mapStatementAccessUrl(await compat.getPrintURL(request.businessNumber, request.documentTypeCode, request.managementKey, userId))\n )\n },\n getReceiverStatementPrintURL(request) {\n return invoke('getReceiverStatementPrintURL', async () =>\n mappers.mapStatementAccessUrl(await compat.getEPrintURL(request.businessNumber, request.documentTypeCode, request.managementKey, userId))\n )\n },\n getBulkStatementPrintURL(request) {\n return invoke('getBulkStatementPrintURL', async () =>\n mappers.mapStatementAccessUrl(\n await compat.getMassPrintURL(request.businessNumber, request.documentTypeCode, [...request.managementKeys], userId)\n )\n )\n },\n getStatementMailURL(request) {\n return invoke('getStatementMailURL', async () =>\n mappers.mapStatementAccessUrl(await compat.getMailURL(request.businessNumber, request.documentTypeCode, request.managementKey, userId))\n )\n },\n getSealAndAttachmentRegistrationURL(request) {\n return invoke('getSealAndAttachmentRegistrationURL', async () =>\n mappers.mapStatementAccessUrl(await compat.getSealURL(request.businessNumber, userId))\n )\n },\n attachFileFromPath(request) {\n return invoke('attachFileFromPath', async () =>\n mappers.mapStatementOperationResult(\n await compat.attachFile(\n request.businessNumber,\n request.documentTypeCode,\n request.managementKey,\n request.displayName,\n request.filePath,\n userId\n )\n )\n )\n },\n attachFileFromBinary(request) {\n return invoke('attachFileFromBinary', async () =>\n mappers.mapStatementOperationResult(\n await compat.attachFileBinary(\n request.businessNumber,\n request.documentTypeCode,\n request.managementKey,\n { fileName: request.fileName, fileData: request.fileData },\n userId\n )\n )\n )\n },\n deleteAttachedFile(request) {\n return invoke('deleteAttachedFile', async () =>\n mappers.mapStatementOperationResult(\n await compat.deleteFile(request.businessNumber, request.documentTypeCode, request.managementKey, request.fileIdentifier, userId)\n )\n )\n },\n getAttachedFiles(request) {\n return invoke('getAttachedFiles', async () =>\n (await compat.getFiles(request.businessNumber, request.documentTypeCode, request.managementKey, userId)).map(mappers.mapStatementAttachedFile)\n )\n },\n resendStatementEmail(request) {\n return invoke('resendStatementEmail', async () =>\n mappers.mapStatementOperationResult(\n await compat.sendEmail(request.businessNumber, request.documentTypeCode, request.managementKey, request.receiverEmailAddress, userId)\n )\n )\n },\n resendStatementSMS(request) {\n return invoke('resendStatementSMS', async () =>\n mappers.mapStatementOperationResult(\n await compat.sendSMS(\n request.businessNumber,\n request.documentTypeCode,\n request.managementKey,\n request.senderPhoneNumber,\n request.receiverPhoneNumber,\n request.messageBody,\n userId\n )\n )\n )\n },\n resendStatementFAX(request) {\n return invoke('resendStatementFAX', async () =>\n mappers.mapStatementOperationResult(\n await compat.sendFAX(\n request.businessNumber,\n request.documentTypeCode,\n request.managementKey,\n request.senderPhoneNumber,\n request.receiverPhoneNumber,\n userId\n )\n )\n )\n },\n sendStatementFAX(request) {\n return invoke('sendStatementFAX', async () => ({\n receiptNumber: await compat.FAXSend(\n request.businessNumber,\n mapStatementDocument(request.document),\n request.senderPhoneNumber,\n request.receiverPhoneNumber,\n userId\n ),\n }))\n },\n attachStatement(request) {\n return invoke('attachStatement', async () =>\n mappers.mapStatementOperationResult(\n await compat.attachStatement(\n request.businessNumber,\n request.documentTypeCode,\n request.managementKey,\n request.attachedDocumentTypeCode,\n request.attachedManagementKey,\n userId\n )\n )\n )\n },\n detachStatement(request) {\n return invoke('detachStatement', async () =>\n mappers.mapStatementOperationResult(\n await compat.detachStatement(\n request.businessNumber,\n request.documentTypeCode,\n request.managementKey,\n request.attachedDocumentTypeCode,\n request.attachedManagementKey,\n userId\n )\n )\n )\n },\n getEmailSendSettings(request) {\n return invoke('getEmailSendSettings', async () =>\n (await compat.listEmailConfig(request.businessNumber, userId)).map(mappers.mapStatementEmailSendSetting)\n )\n },\n updateEmailSendSettings(request) {\n return invoke('updateEmailSendSettings', async () =>\n mappers.mapStatementOperationResult(\n await compat.updateEmailConfig(request.businessNumber, request.emailTypeCode, request.sendEnabled, userId)\n )\n )\n },\n getChargeInfo(request) {\n return invoke('getChargeInfo', async () =>\n mappers.mapStatementChargeInfo(await compat.getChargeInfo(request.businessNumber, request.documentTypeCode, userId))\n )\n },\n getUnitCost(request) {\n return invoke('getUnitCost', async () => ({ unitCost: await compat.getUnitCost(request.businessNumber, request.documentTypeCode) }))\n },\n }\n}\n\nfunction normalizeSearchRequest(request: types.SearchStatementsInput): {\n startDate: string\n endDate: string\n sortOrder: types.StatementSortOrder\n pageNumber: number\n pageSize: number\n} {\n const fail = (message: string): never => {\n throw createInputValidationError(message, { operation: 'statement.searchStatements', stage: PopbillErrorStage.ValidateInput })\n }\n if (!Object.values(types.StatementDateType).includes(request.searchDateType)) fail('searchDateType이 올바르지 않습니다.')\n const startDate = normalizeDate(request.startDate, 'startDate', fail)\n const endDate = normalizeDate(request.endDate, 'endDate', fail)\n if (startDate > endDate) fail('startDate는 endDate 이후일 수 없습니다.')\n if (\n request.stateCodes !== undefined &&\n (!Array.isArray(request.stateCodes) || request.stateCodes.some((code) => typeof code !== 'string' || !/^\\d[\\d*][\\d*]$/.test(code)))\n ) {\n fail('stateCodes는 숫자 3자리 또는 와일드카드 상태코드 배열이어야 합니다.')\n }\n if (\n request.documentTypeCodes !== undefined &&\n (!Array.isArray(request.documentTypeCodes) || request.documentTypeCodes.some((code) => !Object.values(types.StatementItemCodes).includes(code)))\n ) {\n fail('documentTypeCodes가 올바르지 않습니다.')\n }\n const sortOrder = request.sortOrder ?? types.StatementSortOrder.Descending\n if (!Object.values(types.StatementSortOrder).includes(sortOrder)) fail('sortOrder가 올바르지 않습니다.')\n const pageNumber = request.pageNumber ?? 1\n const pageSize = request.pageSize ?? 100\n if (!Number.isInteger(pageNumber) || pageNumber < 1) fail('pageNumber는 1 이상의 정수여야 합니다.')\n if (!Number.isInteger(pageSize) || pageSize < 1) fail('pageSize는 1 이상의 정수여야 합니다.')\n return { startDate, endDate, sortOrder, pageNumber, pageSize }\n}\n\nfunction normalizeDate(value: string, field: string, fail: (message: string) => never): string {\n if (typeof value !== 'string') fail(`${field}는 yyyyMMdd 형식이어야 합니다.`)\n const normalized = value.trim()\n if (!/^\\d{8}$/.test(normalized)) fail(`${field}는 yyyyMMdd 형식이어야 합니다.`)\n if (!isValidCalendarDate8(normalized)) fail(`${field}가 유효한 날짜가 아닙니다.`)\n return normalized\n}\n","import { invokeLookupMethod } from '@/internal/lookup-service'\nimport type { PopbillApiError } from '@/errors'\n\nexport async function invokeHomeTaxTaxInvoice<T>(\n context: { onError?: (error: PopbillApiError) => void },\n method: string,\n handler: () => Promise<T>\n): Promise<T> {\n return invokeLookupMethod(context, `homeTaxTaxInvoice.${method}`, handler)\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport { parseSafeInteger, preserveNumericCode } from '@connextable/popbill-utils'\nimport type * as types from '../types'\n\nexport function mapOperation(value: Spec.HomeTaxTaxInvoiceApiResponseBase): types.HomeTaxTaxInvoiceOperationResult {\n return { resultCode: value.code, resultMessage: value.message }\n}\nexport function mapJob(value: Spec.HomeTaxTaxInvoiceJobStateApiModel): types.HomeTaxTaxInvoiceJobState {\n const state = preserveNumericCode(value.jobState)\n return {\n jobId: value.jobID,\n invoiceDirection: value.queryType,\n searchDateType: value.queryDateType,\n startDate: value.queryStDate,\n endDate: value.queryEnDate,\n stateCode: state,\n resultCode: value.errorCode,\n resultMessage: value.errorReason,\n collectedCount: value.collectCount,\n isSearchable: state === 3 && parseSafeInteger(value.errorCode) === 1,\n requestedAt: value.regDT,\n startedAt: value.jobStartDT,\n completedAt: value.jobEndDT,\n }\n}\nexport function mapParties(value: Spec.HomeTaxTaxInvoicePartyApiModel): Pick<types.HomeTaxTaxInvoiceDocument, 'supplier' | 'recipient' | 'trustee'> {\n return {\n supplier: {\n businessNumber: value.invoicerCorpNum,\n managementKey: value.invoicerMgtKey,\n taxRegistrationId: value.invoicerTaxRegID,\n companyName: value.invoicerCorpName,\n representativeName: value.invoicerCEOName,\n address: value.invoicerAddr,\n businessType: value.invoicerBizType,\n businessCategory: value.invoicerBizClass,\n contactName: value.invoicerContactName,\n departmentName: value.invoicerDeptName,\n phoneNumber: value.invoicerTEL,\n emailAddress: value.invoicerEmail,\n },\n recipient: {\n businessNumber: value.invoiceeCorpNum,\n managementKey: value.invoiceeMgtKey,\n taxRegistrationId: value.invoiceeTaxRegID,\n companyName: value.invoiceeCorpName,\n representativeName: value.invoiceeCEOName,\n address: value.invoiceeAddr,\n businessType: value.invoiceeBizType,\n businessCategory: value.invoiceeBizClass,\n partyType: value.invoiceeType,\n contactName: value.invoiceeContactName1,\n departmentName: value.invoiceeDeptName1,\n phoneNumber: value.invoiceeTEL1,\n emailAddress: value.invoiceeEmail1,\n secondaryContactName: value.invoiceeContactName2,\n secondaryDepartmentName: value.invoiceeDeptName2,\n secondaryPhoneNumber: value.invoiceeTEL2,\n secondaryEmailAddress: value.invoiceeEmail2,\n },\n trustee: {\n businessNumber: value.trusteeCorpNum,\n managementKey: value.trusteeMgtKey,\n taxRegistrationId: value.trusteeTaxRegID,\n companyName: value.trusteeCorpName,\n representativeName: value.trusteeCEOName,\n address: value.trusteeAddr,\n businessType: value.trusteeBizType,\n businessCategory: value.trusteeBizClass,\n contactName: value.trusteeContactName,\n departmentName: value.trusteeDeptName,\n phoneNumber: value.trusteeTEL,\n emailAddress: value.trusteeEmail,\n },\n }\n}\nexport function mapLine(value: Spec.HomeTaxTaxInvoiceDetailApiModel): types.HomeTaxTaxInvoiceLineItem {\n return {\n sequenceNumber: value.serialNum,\n itemName: value.itemName,\n specification: value.spec,\n quantity: value.qty,\n unitCost: value.unitCost,\n supplyCostAmount: value.supplyCost,\n taxAmount: value.tax,\n remark: value.remark,\n transactionDate: value.purchaseDT,\n }\n}\nexport function mapSummary(value: Spec.HomeTaxTaxInvoiceSummaryApiModel): types.HomeTaxTaxInvoiceSummary {\n return {\n confirmationNumber: value.ntsconfirmNum,\n originalConfirmationNumber: value.orgNTSConfirmNum,\n invoiceDirection: value.invoiceType,\n taxType: value.taxType,\n purposeType: value.purposeType,\n isModified: value.modifyYN,\n ...mapParties(value),\n totalSupplyCostAmount: value.supplyCostTotal,\n totalTaxAmount: value.taxTotal,\n totalAmount: value.totalAmount,\n firstLineItem: mapLine({ ...value, purchaseDT: value.purchaseDate }),\n remark: value.remark1,\n writtenDate: value.writeDate,\n issuedDate: value.issueDate,\n sentDate: value.sendDate,\n }\n}\nexport function mapDocument(value: Spec.HomeTaxTaxInvoiceApiModel): types.HomeTaxTaxInvoiceDocument {\n return {\n confirmationNumber: value.ntsconfirmNum,\n originalConfirmationNumber: value.orgNTSConfirmNum,\n serialNumber: value.serialNum,\n invoiceTypeCode: value.invoiceType,\n taxType: value.taxType,\n purposeType: value.purposeType,\n modificationReasonCode: value.modifyCode,\n ...mapParties(value),\n totalSupplyCostAmount: value.supplyCostTotal,\n totalTaxAmount: value.taxTotal,\n totalAmount: value.totalAmount,\n cashAmount: value.cash,\n checkAmount: value.chkBill,\n creditAmount: value.credit,\n noteAmount: value.note,\n lineItems: (value.detailList ?? []).map(mapLine),\n remark1: value.remark1,\n remark2: value.remark2,\n remark3: value.remark3,\n writtenDate: value.writeDate,\n issuedAt: value.issueDT,\n }\n}\nexport function mapSearch(value: Spec.HomeTaxTaxInvoiceSearchApiResponse): types.HomeTaxTaxInvoiceSearchResult {\n return {\n resultCode: value.code,\n pageNumber: value.pageNum,\n pageSize: value.perPage,\n pageCount: value.pageCount,\n totalCount: value.total,\n invoices: (value.list ?? []).map(mapSummary),\n }\n}\nexport function mapTotals(value: Spec.HomeTaxTaxInvoiceSummaryApiResponse): types.HomeTaxTaxInvoiceTotals {\n return { count: value.count, totalSupplyCostAmount: value.supplyCostTotal, totalTaxAmount: value.taxTotal, totalAmount: value.amountTotal }\n}\nexport function mapFlatRateState(value: Spec.HomeTaxTaxInvoiceFlatRateStateApiModel): types.HomeTaxTaxInvoiceFlatRateState {\n return {\n businessNumber: value.referenceID,\n stateCode: value.state,\n terminationRequested: value.closeRequestYN,\n usageRestricted: value.useRestrictYN,\n terminateOnExpiration: value.closeOnExpired,\n hasUnpaidBalance: value.unPaidYN,\n billingDay: value.baseDate,\n contractedAt: value.contractDT,\n expiresOn: value.useEndDate,\n }\n}\n","import type { HTTaxinvoicePromiseService } from '@connextable/popbill-compat/factory'\nimport { createInputValidationError } from '@connextable/popbill-compat/errors'\nimport { isValidCalendarDate8 } from '@connextable/popbill-utils'\nimport type { PopbillApiError } from '@/errors'\nimport { invokeHomeTaxTaxInvoice } from './adapters/error'\nimport * as mappers from './mappers'\nimport type * as types from './types'\n\ninterface CreateHomeTaxTaxInvoiceServiceInput {\n compatHTTaxinvoiceService: HTTaxinvoicePromiseService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\nexport function createHomeTaxTaxInvoiceService(input: CreateHomeTaxTaxInvoiceServiceInput): types.HomeTaxTaxInvoiceService {\n const compat = input.compatHTTaxinvoiceService\n const userId = input.defaultUserId\n const invoke = <T>(method: keyof types.HomeTaxTaxInvoiceService, handler: () => Promise<T>) => invokeHomeTaxTaxInvoice(input, method, handler)\n return {\n getAuthenticationRegistrationUrl(request) {\n return invoke('getAuthenticationRegistrationUrl', async () => ({\n accessUrl: await compat.getCertificatePopUpURL(request.businessNumber, userId),\n }))\n },\n getCertificateExpiration(request) {\n return invoke('getCertificateExpiration', async () => ({ expiresAt: await compat.getCertificateExpireDate(request.businessNumber) }))\n },\n validateCertificate(request) {\n return invoke('validateCertificate', async () => mappers.mapOperation(await compat.checkCertValidation(request.businessNumber)))\n },\n registerDepartmentUser(request) {\n return invoke('registerDepartmentUser', async () => {\n if (request.identityNumber != null && request.identityNumber !== '' && !/^\\d{7}$/.test(request.identityNumber))\n invalid('identityNumber는 주민번호 앞 7자리여야 합니다.', 'registerDepartmentUser')\n return mappers.mapOperation(\n await compat.registDeptUser(request.businessNumber, request.departmentUserId, request.departmentPassword, request.identityNumber, userId)\n )\n })\n },\n checkDepartmentUserRegistration(request) {\n return invoke('checkDepartmentUserRegistration', async () => mappers.mapOperation(await compat.checkDeptUser(request.businessNumber, userId)))\n },\n validateDepartmentUserLogin(request) {\n return invoke('validateDepartmentUserLogin', async () => mappers.mapOperation(await compat.checkLoginDeptUser(request.businessNumber)))\n },\n deleteDepartmentUser(request) {\n return invoke('deleteDepartmentUser', async () => mappers.mapOperation(await compat.deleteDeptUser(request.businessNumber, userId)))\n },\n requestCollection(request) {\n return invoke('requestCollection', async () => {\n validateDateRange(request.startDate, request.endDate)\n return {\n jobId: await compat.requestJob(\n request.businessNumber,\n request.invoiceDirection,\n request.searchDateType,\n request.startDate,\n request.endDate,\n userId\n ),\n }\n })\n },\n getCollectionState(request) {\n return invoke('getCollectionState', async () => mappers.mapJob(await compat.getJobState(request.businessNumber, request.jobId, userId)))\n },\n listActiveCollections(request) {\n return invoke('listActiveCollections', async () => (await compat.listActiveJob(request.businessNumber, userId)).map(mappers.mapJob))\n },\n searchTaxInvoices(request) {\n return invoke('searchTaxInvoices', async () => {\n const pageNumber = request.pageNumber ?? 1\n const pageSize = request.pageSize ?? 500\n const order = request.sortOrder ?? 'D'\n if (!Number.isInteger(pageNumber) || pageNumber < 1) invalid('pageNumber는 1 이상의 정수여야 합니다.', 'searchTaxInvoices')\n if (!Number.isInteger(pageSize) || pageSize < 1) invalid('pageSize는 1 이상의 정수여야 합니다.', 'searchTaxInvoices')\n if (typeof order !== 'string' || order.trim() === '') invalid('sortOrder는 비어 있지 않은 문자열이어야 합니다.', 'searchTaxInvoices')\n const filters = mapFilters(request)\n return mappers.mapSearch(\n await compat.search(request.businessNumber, request.jobId, ...filters, pageNumber, pageSize, order, userId, request.queryText)\n )\n })\n },\n getTaxInvoiceTotals(request) {\n return invoke('getTaxInvoiceTotals', async () =>\n mappers.mapTotals(await compat.summary(request.businessNumber, request.jobId, ...mapFilters(request), userId, request.queryText))\n )\n },\n getTaxInvoice(request) {\n return invoke('getTaxInvoice', async () =>\n mappers.mapDocument(await compat.getTaxinvoice(request.businessNumber, request.confirmationNumber, userId))\n )\n },\n getTaxInvoiceXml(request) {\n return invoke('getTaxInvoiceXml', async () => {\n const value = await compat.getXML(request.businessNumber, request.confirmationNumber, userId)\n return { resultCode: value.ResultCode, resultMessage: value.Message, xml: value.retObject }\n })\n },\n getTaxInvoicePopupUrl(request) {\n return invoke('getTaxInvoicePopupUrl', async () => ({\n accessUrl: await compat.getPopUpURL(request.businessNumber, request.confirmationNumber, userId),\n }))\n },\n getTaxInvoicePrintUrl(request) {\n return invoke('getTaxInvoicePrintUrl', async () => ({\n accessUrl: await compat.getPrintURL(request.businessNumber, request.confirmationNumber, userId),\n }))\n },\n getFlatRateApplicationUrl(request) {\n return invoke('getFlatRateApplicationUrl', async () => ({ accessUrl: await compat.getFlatRatePopUpURL(request.businessNumber, userId) }))\n },\n getFlatRateState(request) {\n return invoke('getFlatRateState', async () => mappers.mapFlatRateState(await compat.getFlatRateState(request.businessNumber, userId)))\n },\n getChargeInfo(request) {\n return invoke('getChargeInfo', async () => ({ ...(await compat.getChargeInfo(request.businessNumber, userId)) }))\n },\n }\n}\nfunction mapFilters(\n request: types.HomeTaxTaxInvoiceFiltersInput\n): [string[] | undefined, string[] | undefined, string[] | undefined, string | undefined, string | undefined, string | undefined] {\n return [\n request.documentTypes,\n request.taxTypes,\n request.purposeTypes,\n request.taxRegistrationParty,\n request.hasTaxRegistrationId === undefined ? undefined : request.hasTaxRegistrationId ? '1' : '0',\n request.taxRegistrationIds?.join(','),\n ]\n}\nfunction invalid(message: string, method: string): never {\n throw createInputValidationError(message, { operation: `homeTaxTaxInvoice.${method}` })\n}\nfunction validateDateRange(startDate: string, endDate: string): void {\n for (const dateValue of [startDate, endDate]) {\n if (typeof dateValue !== 'string' || !/^\\d{8}$/.test(dateValue)) invalid('수집일자는 yyyyMMdd 형식이어야 합니다.', 'requestCollection')\n if (!isValidCalendarDate8(dateValue)) invalid('유효한 수집일자가 아닙니다.', 'requestCollection')\n }\n if (startDate > endDate) invalid('startDate는 endDate 이후일 수 없습니다.', 'requestCollection')\n}\n","import type { HomeTaxTaxInvoiceService } from './types'\nexport const HOME_TAX_TAX_INVOICE_METHODS = [\n // 인증관리\n 'getAuthenticationRegistrationUrl',\n 'getCertificateExpiration',\n 'validateCertificate',\n 'registerDepartmentUser',\n 'checkDepartmentUserRegistration',\n 'validateDepartmentUserLogin',\n 'deleteDepartmentUser',\n // 수집 요청/상태\n 'requestCollection',\n 'getCollectionState',\n 'listActiveCollections',\n // 정보확인\n 'searchTaxInvoices',\n 'getTaxInvoiceTotals',\n 'getTaxInvoice',\n 'getTaxInvoiceXml',\n // 보기/인쇄\n 'getTaxInvoicePopupUrl',\n 'getTaxInvoicePrintUrl',\n // 정액제/과금\n 'getFlatRateApplicationUrl',\n 'getFlatRateState',\n 'getChargeInfo',\n] as const satisfies readonly (keyof HomeTaxTaxInvoiceService)[]\n","import type * as response from './response'\nexport type * from './response'\n\nexport const HomeTaxTaxInvoiceDirection = { Sales: 'SELL', Purchases: 'BUY', Trustee: 'TRUSTEE' } as const\nexport type HomeTaxTaxInvoiceDirection = (typeof HomeTaxTaxInvoiceDirection)[keyof typeof HomeTaxTaxInvoiceDirection] | (string & {})\nexport const HomeTaxTaxInvoiceSearchDateType = { Written: 'W', Issued: 'I', Sent: 'S' } as const\nexport type HomeTaxTaxInvoiceSearchDateType = (typeof HomeTaxTaxInvoiceSearchDateType)[keyof typeof HomeTaxTaxInvoiceSearchDateType] | (string & {})\nexport const HomeTaxTaxInvoiceJobStateCodes = { Waiting: 1, Processing: 2, Completed: 3 } as const\nexport interface HomeTaxTaxInvoiceBusinessInput {\n businessNumber: string\n}\nexport interface RequestHomeTaxTaxInvoiceCollectionInput extends HomeTaxTaxInvoiceBusinessInput {\n /** yyyyMMdd 형식, 최대 3개월 단위로 요청합니다. */\n startDate: string\n endDate: string\n invoiceDirection: HomeTaxTaxInvoiceDirection\n searchDateType: HomeTaxTaxInvoiceSearchDateType\n}\nexport interface HomeTaxTaxInvoiceJobInput extends HomeTaxTaxInvoiceBusinessInput {\n jobId: string\n}\nexport interface HomeTaxTaxInvoiceFiltersInput extends HomeTaxTaxInvoiceJobInput {\n documentTypes?: ('N' | 'M' | (string & {}))[]\n taxTypes?: ('T' | 'N' | 'Z' | (string & {}))[]\n purposeTypes?: ('R' | 'C' | 'N' | (string & {}))[]\n taxRegistrationParty?: 'S' | 'B' | 'T' | (string & {})\n hasTaxRegistrationId?: boolean\n /** 여러 종사업장번호는 쉼표로 구분합니다. 선행 0을 보존합니다. */\n taxRegistrationIds?: string[]\n queryText?: string\n}\nexport interface SearchHomeTaxTaxInvoicesInput extends HomeTaxTaxInvoiceFiltersInput {\n sortOrder?: 'D' | 'A' | (string & {})\n /** 기본값 1 */\n pageNumber?: number\n /** 기본값 500. 페이지당 상한은 팝빌 서버에서 검증합니다. */\n pageSize?: number\n}\nexport interface HomeTaxTaxInvoiceDocumentInput extends HomeTaxTaxInvoiceBusinessInput {\n confirmationNumber: string\n}\nexport interface RegisterHomeTaxTaxInvoiceDepartmentUserInput extends HomeTaxTaxInvoiceBusinessInput {\n departmentUserId: string\n departmentPassword: string\n /** 대표자 주민번호 앞 7자리. 홈택스 2차인증 해제 시 생략합니다. */\n identityNumber?: string | null\n}\n/** 명시적으로 수집을 요청하고 상태를 확인합니다. 자동 재요청이나 polling은 수행하지 않습니다. */\nexport interface HomeTaxTaxInvoiceService {\n /** 인증정보 등록 URL. Compat: `getCertificatePopUpURL` */\n getAuthenticationRegistrationUrl(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceAccessUrl>\n /** 인증서 만료일시. Compat: `getCertificateExpireDate` */\n getCertificateExpiration(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceCertificateExpiration>\n /** 인증서 검증. Compat: `checkCertValidation` */\n validateCertificate(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceOperationResult>\n /** 부서사용자 등록. Compat: `registDeptUser` */\n registerDepartmentUser(input: RegisterHomeTaxTaxInvoiceDepartmentUserInput): Promise<response.HomeTaxTaxInvoiceOperationResult>\n /** 부서사용자 등록 여부. Compat: `checkDeptUser` */\n checkDepartmentUserRegistration(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceOperationResult>\n /** 부서사용자 로그인 검증. Compat: `checkLoginDeptUser` */\n validateDepartmentUserLogin(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceOperationResult>\n /** 부서사용자 삭제. Compat: `deleteDeptUser` */\n deleteDepartmentUser(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceOperationResult>\n /** 수집 요청. Compat: `requestJob` */\n requestCollection(input: RequestHomeTaxTaxInvoiceCollectionInput): Promise<response.HomeTaxTaxInvoiceJobReceipt>\n /** 수집 상태 확인. Compat: `getJobState` */\n getCollectionState(input: HomeTaxTaxInvoiceJobInput): Promise<response.HomeTaxTaxInvoiceJobState>\n /** 활성 수집 목록. Compat: `listActiveJob` */\n listActiveCollections(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceJobState[]>\n /** 수집 내역 검색. Compat: `search` */\n searchTaxInvoices(input: SearchHomeTaxTaxInvoicesInput): Promise<response.HomeTaxTaxInvoiceSearchResult>\n /** 수집 내역 합계. Compat: `summary` */\n getTaxInvoiceTotals(input: HomeTaxTaxInvoiceFiltersInput): Promise<response.HomeTaxTaxInvoiceTotals>\n /** 수집 상세 조회. Compat: `getTaxinvoice` */\n getTaxInvoice(input: HomeTaxTaxInvoiceDocumentInput): Promise<response.HomeTaxTaxInvoiceDocument>\n /** 수집 XML 조회. Compat: `getXML` */\n getTaxInvoiceXml(input: HomeTaxTaxInvoiceDocumentInput): Promise<response.HomeTaxTaxInvoiceXmlResult>\n /** 팝업 URL. Compat: `getPopUpURL` */\n getTaxInvoicePopupUrl(input: HomeTaxTaxInvoiceDocumentInput): Promise<response.HomeTaxTaxInvoiceAccessUrl>\n /** 인쇄 URL. Compat: `getPrintURL` */\n getTaxInvoicePrintUrl(input: HomeTaxTaxInvoiceDocumentInput): Promise<response.HomeTaxTaxInvoiceAccessUrl>\n /** 정액제 신청 URL. Compat: `getFlatRatePopUpURL` */\n getFlatRateApplicationUrl(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceAccessUrl>\n /** 정액제 상태. Compat: `getFlatRateState` */\n getFlatRateState(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceFlatRateState>\n /** 과금정보. Compat: `getChargeInfo` */\n getChargeInfo(input: HomeTaxTaxInvoiceBusinessInput): Promise<response.HomeTaxTaxInvoiceChargeInfo>\n}\n","import { createInputValidationError, PopbillErrorStage } from '@connextable/popbill-compat/errors'\nimport { isValidCalendarDate8 } from '@connextable/popbill-utils'\nimport type { HomeTaxCashbillFilterInput, RequestHomeTaxCashbillCollectionInput, SearchHomeTaxCashbillsInput } from '../types'\n\nexport function failInput(operation: string, message: string): never {\n throw createInputValidationError(message, { operation: `homeTaxCashbill.${operation}`, stage: PopbillErrorStage.ValidateInput })\n}\n\nexport function validateCollectionInput(input: RequestHomeTaxCashbillCollectionInput): void {\n const fail = (message: string): never => failInput('requestCollection', message)\n if (typeof input.receiptDirection !== 'string' || input.receiptDirection.trim() === '')\n fail('receiptDirection은 비어 있지 않은 문자열이어야 합니다.')\n for (const [field, value] of [\n ['startDate', input.startDate],\n ['endDate', input.endDate],\n ] as const) {\n if (typeof value !== 'string' || !/^\\d{8}$/.test(value)) fail(`${field}는 yyyyMMdd 형식이어야 합니다.`)\n if (!isValidCalendarDate8(value)) fail(`${field}가 유효한 날짜가 아닙니다.`)\n }\n if (input.startDate > input.endDate) fail('startDate는 endDate 이후일 수 없습니다.')\n}\n\nexport function validateFilters(input: HomeTaxCashbillFilterInput, operation: string): void {\n if (input.tradeTypes !== undefined && (!Array.isArray(input.tradeTypes) || input.tradeTypes.some((type) => typeof type !== 'string')))\n failInput(operation, 'tradeTypes는 문자열 배열이어야 합니다.')\n if (input.tradeUsages !== undefined && (!Array.isArray(input.tradeUsages) || input.tradeUsages.some((usage) => typeof usage !== 'string')))\n failInput(operation, 'tradeUsages는 문자열 배열이어야 합니다.')\n}\n\nexport function normalizeSearch(input: SearchHomeTaxCashbillsInput) {\n validateFilters(input, 'searchCashbills')\n const pageNumber = input.pageNumber ?? 1\n const pageSize = input.pageSize ?? 500\n const sortOrder = input.sortOrder ?? 'D'\n if (!Number.isInteger(pageNumber) || pageNumber < 1) failInput('searchCashbills', 'pageNumber는 1 이상의 정수여야 합니다.')\n if (!Number.isInteger(pageSize) || pageSize < 1) failInput('searchCashbills', 'pageSize는 1 이상의 정수여야 합니다.')\n if (typeof sortOrder !== 'string' || sortOrder.trim() === '') failInput('searchCashbills', 'sortOrder는 비어 있지 않은 문자열이어야 합니다.')\n return { pageNumber, pageSize, sortOrder }\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport { parseSafeInteger, preserveNumericCode } from '@connextable/popbill-utils'\nimport type * as Output from '../types/response'\n\nexport function mapCollectionJobState(raw: Spec.HomeTaxCashbillJobStateApiModel): Output.HomeTaxCashbillCollectionJobState {\n const stateCode = preserveNumericCode(raw.jobState)\n return {\n jobId: raw.jobID,\n receiptDirection: raw.queryType,\n dateType: raw.queryDateType,\n startDate: raw.queryStDate,\n endDate: raw.queryEnDate,\n stateCode,\n resultCode: raw.errorCode,\n resultMessage: raw.errorReason,\n collectedCount: raw.collectCount,\n collectionSucceeded: stateCode === 3 && parseSafeInteger(raw.errorCode) === 1,\n requestedAt: raw.regDT,\n startedAt: raw.jobStartDT,\n completedAt: raw.jobEndDT,\n }\n}\n\nexport function mapCashbill(raw: Spec.HomeTaxCashbillApiModel): Output.HomeTaxCashbillReceipt {\n return {\n ntsConfirmationNumber: raw.ntsconfirmNum,\n receiptDirection: raw.invoiceType,\n tradeType: raw.tradeType,\n tradeUsage: raw.tradeUsage,\n franchiseBusinessNumber: raw.franchiseCorpNum,\n franchiseBusinessName: raw.franchiseCorpName,\n franchiseBusinessTypeCode: preserveNumericCode(raw.franchiseCorpType),\n maskedIdentityNumber: raw.identityNum,\n identityNumberTypeCode: preserveNumericCode(raw.identityNumType),\n customerName: raw.customerName,\n cardOwnerName: raw.cardOwnerName,\n deductionTypeCode: preserveNumericCode(raw.deductionType),\n supplyAmount: raw.supplyCost,\n taxAmount: raw.tax,\n serviceFeeAmount: raw.serviceFee,\n totalAmount: raw.totalAmount,\n tradeDate: raw.tradeDate,\n tradedAt: raw.tradeDT,\n }\n}\n\nexport function mapSearchResult(raw: Spec.HomeTaxCashbillSearchApiResponse): Output.HomeTaxCashbillSearchResult {\n return {\n code: raw.code,\n message: raw.message,\n pageNumber: raw.pageNum,\n pageSize: raw.perPage,\n pageCount: raw.pageCount,\n totalCount: raw.total,\n receipts: (raw.list ?? []).map(mapCashbill),\n }\n}\n\nexport function mapSummary(raw: Spec.HomeTaxCashbillSummaryApiResponse): Output.HomeTaxCashbillSummary {\n return {\n receiptCount: raw.count,\n supplyAmountTotal: raw.supplyCostTotal,\n taxAmountTotal: raw.taxTotal,\n serviceFeeAmountTotal: raw.serviceFeeTotal,\n totalAmount: raw.amountTotal,\n }\n}\n\nexport function mapFlatRateState(raw: Spec.HomeTaxCashbillFlatRateStateApiModel): Output.HomeTaxCashbillFlatRateState {\n return {\n businessNumber: raw.referenceID,\n stateCode: raw.state,\n cancellationRequested: raw.closeRequestYN,\n useRestricted: raw.useRestrictYN,\n cancelOnExpiration: raw.closeOnExpired,\n hasUnpaidBalance: raw.unPaidYN,\n renewalPaymentDay: raw.baseDate,\n contractStartedAt: raw.contractDT,\n expiresOn: raw.useEndDate,\n }\n}\n","import type { HTCashbillPromiseService } from '@connextable/popbill-compat/factory'\nimport type { PopbillApiError } from '@/errors'\nimport { invokeHomeTaxCashbillMethod } from './adapters/error'\nimport { failInput, normalizeSearch, validateCollectionInput, validateFilters } from './adapters/validation'\nimport * as mappers from './mappers'\nimport type { HomeTaxCashbillService } from './types'\n\ninterface CreateHomeTaxCashbillServiceInput {\n compatHomeTaxCashbillService: HTCashbillPromiseService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\nexport function createHomeTaxCashbillService(input: CreateHomeTaxCashbillServiceInput): HomeTaxCashbillService {\n const compat = input.compatHomeTaxCashbillService\n const userId = input.defaultUserId\n const invoke = <T>(method: keyof HomeTaxCashbillService, handler: () => Promise<T>) =>\n invokeHomeTaxCashbillMethod(input, `homeTaxCashbill.${method}`, handler)\n return {\n getAuthenticationRegistrationUrl(request) {\n return invoke('getAuthenticationRegistrationUrl', async () => ({ url: await compat.getCertificatePopUpURL(request.businessNumber, userId) }))\n },\n getCertificateExpiration(request) {\n return invoke('getCertificateExpiration', async () => ({ expiresAt: await compat.getCertificateExpireDate(request.businessNumber) }))\n },\n validateCertificate(request) {\n return invoke('validateCertificate', () => compat.checkCertValidation(request.businessNumber))\n },\n registerDepartmentUser(request) {\n return invoke('registerDepartmentUser', async () => {\n if (\n request.representativeIdentityPrefix != null &&\n request.representativeIdentityPrefix !== '' &&\n !/^\\d{7}$/.test(request.representativeIdentityPrefix)\n )\n failInput('registerDepartmentUser', 'representativeIdentityPrefix는 숫자 7자리여야 합니다.')\n return compat.registDeptUser(\n request.businessNumber,\n request.departmentUserId,\n request.departmentUserPassword,\n request.representativeIdentityPrefix,\n userId\n )\n })\n },\n checkDepartmentUserRegistration(request) {\n return invoke('checkDepartmentUserRegistration', () => compat.checkDeptUser(request.businessNumber, userId))\n },\n validateDepartmentUser(request) {\n return invoke('validateDepartmentUser', () => compat.checkLoginDeptUser(request.businessNumber))\n },\n deleteDepartmentUser(request) {\n return invoke('deleteDepartmentUser', () => compat.deleteDeptUser(request.businessNumber, userId))\n },\n requestCollection(request) {\n return invoke('requestCollection', async () => {\n validateCollectionInput(request)\n return { jobId: await compat.requestJob(request.businessNumber, request.receiptDirection, request.startDate, request.endDate, userId) }\n })\n },\n getCollectionJobState(request) {\n return invoke('getCollectionJobState', async () =>\n mappers.mapCollectionJobState(await compat.getJobState(request.businessNumber, request.jobId, userId))\n )\n },\n listActiveCollectionJobs(request) {\n return invoke('listActiveCollectionJobs', async () =>\n (await compat.listActiveJob(request.businessNumber, userId)).map(mappers.mapCollectionJobState)\n )\n },\n searchCashbills(request) {\n return invoke('searchCashbills', async () => {\n const options = normalizeSearch(request)\n return mappers.mapSearchResult(\n await compat.search(\n request.businessNumber,\n request.jobId,\n request.tradeTypes,\n request.tradeUsages,\n options.pageNumber,\n options.pageSize,\n options.sortOrder,\n userId\n )\n )\n })\n },\n getCashbillSummary(request) {\n return invoke('getCashbillSummary', async () => {\n validateFilters(request, 'getCashbillSummary')\n return mappers.mapSummary(await compat.summary(request.businessNumber, request.jobId, request.tradeTypes, request.tradeUsages, userId))\n })\n },\n getFlatRateRegistrationUrl(request) {\n return invoke('getFlatRateRegistrationUrl', async () => ({ url: await compat.getFlatRatePopUpURL(request.businessNumber, userId) }))\n },\n getFlatRateState(request) {\n return invoke('getFlatRateState', async () => mappers.mapFlatRateState(await compat.getFlatRateState(request.businessNumber, userId)))\n },\n getChargeInfo(request) {\n return invoke('getChargeInfo', () => compat.getChargeInfo(request.businessNumber, userId))\n },\n }\n}\n","import type * as Response from './response'\nexport type * from './response'\n\nexport const HomeTaxCashbillDirection = { Sales: 'SELL', Purchases: 'BUY' } as const\nexport type HomeTaxCashbillDirection = (typeof HomeTaxCashbillDirection)[keyof typeof HomeTaxCashbillDirection] | (string & {})\nexport const HomeTaxCashbillTradeType = { Approved: 'N', Cancelled: 'C' } as const\nexport type HomeTaxCashbillTradeType = (typeof HomeTaxCashbillTradeType)[keyof typeof HomeTaxCashbillTradeType] | (string & {})\nexport const HomeTaxCashbillTradeUsage = { IncomeDeduction: 'P', ExpenseProof: 'C' } as const\nexport type HomeTaxCashbillTradeUsage = (typeof HomeTaxCashbillTradeUsage)[keyof typeof HomeTaxCashbillTradeUsage] | (string & {})\nexport const HomeTaxCashbillSortOrder = { Ascending: 'A', Descending: 'D' } as const\nexport type HomeTaxCashbillSortOrder = (typeof HomeTaxCashbillSortOrder)[keyof typeof HomeTaxCashbillSortOrder] | (string & {})\n\nexport interface HomeTaxCashbillBusinessInput {\n businessNumber: string\n}\nexport interface RequestHomeTaxCashbillCollectionInput extends HomeTaxCashbillBusinessInput {\n /** yyyyMMdd, 한 번에 최대 3개월. JobID는 요청 시점부터 1시간 유효합니다. */\n startDate: string\n endDate: string\n receiptDirection: HomeTaxCashbillDirection\n}\nexport interface HomeTaxCashbillJobInput extends HomeTaxCashbillBusinessInput {\n jobId: string\n}\nexport interface HomeTaxCashbillFilterInput extends HomeTaxCashbillJobInput {\n tradeTypes?: HomeTaxCashbillTradeType[]\n tradeUsages?: HomeTaxCashbillTradeUsage[]\n}\nexport interface SearchHomeTaxCashbillsInput extends HomeTaxCashbillFilterInput {\n /** @default D */\n sortOrder?: HomeTaxCashbillSortOrder\n /** @default 1 */\n pageNumber?: number\n /** @default 500 */\n pageSize?: number\n}\nexport interface RegisterHomeTaxCashbillDepartmentUserInput extends HomeTaxCashbillBusinessInput {\n departmentUserId: string\n departmentUserPassword: string\n /** 홈택스 2차인증 설정 시 대표자 주민번호 앞 7자리, 해제된 경우 생략합니다. */\n representativeIdentityPrefix?: string | null\n}\n\n/** 홈택스 현금영수증 수집 modern API. 자동 폴링 없이 작업아이디를 반환합니다. */\nexport interface HomeTaxCashbillService {\n /** Compat: `getCertificatePopUpURL` */\n getAuthenticationRegistrationUrl(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillAccessUrl>\n /** Compat: `getCertificateExpireDate` */\n getCertificateExpiration(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillCertificateExpiration>\n /** Compat: `checkCertValidation` */\n validateCertificate(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillOperationResult>\n /** Compat: `registDeptUser` */\n registerDepartmentUser(input: RegisterHomeTaxCashbillDepartmentUserInput): Promise<Response.HomeTaxCashbillOperationResult>\n /** Compat: `checkDeptUser` */\n checkDepartmentUserRegistration(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillOperationResult>\n /** Compat: `checkLoginDeptUser` */\n validateDepartmentUser(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillOperationResult>\n /** Compat: `deleteDeptUser` */\n deleteDepartmentUser(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillOperationResult>\n /** Compat: `requestJob` */\n requestCollection(input: RequestHomeTaxCashbillCollectionInput): Promise<Response.HomeTaxCashbillCollectionJob>\n /** Compat: `getJobState` */\n getCollectionJobState(input: HomeTaxCashbillJobInput): Promise<Response.HomeTaxCashbillCollectionJobState>\n /** Compat: `listActiveJob` */\n listActiveCollectionJobs(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillCollectionJobState[]>\n /** Compat: `search` */\n searchCashbills(input: SearchHomeTaxCashbillsInput): Promise<Response.HomeTaxCashbillSearchResult>\n /** Compat: `summary` */\n getCashbillSummary(input: HomeTaxCashbillFilterInput): Promise<Response.HomeTaxCashbillSummary>\n /** Compat: `getFlatRatePopUpURL` */\n getFlatRateRegistrationUrl(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillAccessUrl>\n /** Compat: `getFlatRateState` */\n getFlatRateState(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillFlatRateState>\n /** Compat: `getChargeInfo` */\n getChargeInfo(input: HomeTaxCashbillBusinessInput): Promise<Response.HomeTaxCashbillChargeInfo>\n}\n","import type { ClosedownBusinessStatusApiModel, ClosedownChargeInfoApiResponse } from '@connextable/popbill-spec'\nimport type { BusinessStatus, ClosedownChargeInfo } from '../types'\n\nexport function mapBusinessStatus(response: ClosedownBusinessStatusApiModel): BusinessStatus {\n return {\n businessNumber: response.corpNum,\n businessStateCode: response.state,\n taxTypeCode: response.taxType,\n businessStateChangedDate: response.stateDate,\n taxTypeChangedDate: response.typeDate,\n checkedDate: response.checkDate,\n }\n}\n\nexport function mapClosedownChargeInfo(response: ClosedownChargeInfoApiResponse): ClosedownChargeInfo {\n return { unitCost: response.unitCost, chargeMethod: response.chargeMethod, rateSystem: response.rateSystem }\n}\n","import type { ClosedownPromiseService } from '@connextable/popbill-compat/factory'\nimport type { PopbillApiError } from '@/errors'\nimport { invokeClosedownMethod } from './adapters/error'\nimport { mapBusinessStatus, mapClosedownChargeInfo } from './mappers/response'\nimport type { ClosedownService } from './types'\n\ninterface CreateClosedownServiceInput {\n compatClosedownService: ClosedownPromiseService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\nexport function createClosedownService(input: CreateClosedownServiceInput): ClosedownService {\n const compat = input.compatClosedownService\n const invoke = <T>(method: keyof ClosedownService, handler: () => Promise<T>) => invokeClosedownMethod(input, `closedown.${method}`, handler)\n return {\n checkBusinessStatus(request) {\n return invoke('checkBusinessStatus', async () =>\n mapBusinessStatus(await compat.checkCorpNum(request.businessNumber, request.targetBusinessNumber, input.defaultUserId))\n )\n },\n checkBusinessStatuses(request) {\n return invoke('checkBusinessStatuses', async () =>\n (await compat.checkCorpNums(request.businessNumber, request.targetBusinessNumbers, input.defaultUserId)).map(mapBusinessStatus)\n )\n },\n getChargeInfo(request) {\n return invoke('getChargeInfo', async () => mapClosedownChargeInfo(await compat.getChargeInfo(request.businessNumber, input.defaultUserId)))\n },\n getUnitCost(request) {\n return invoke('getUnitCost', async () => ({ unitCost: await compat.getUnitCost(request.businessNumber) }))\n },\n }\n}\n","import type { BizInfoCheckCompanyInfoApiModel, BizInfoCheckChargeInfoApiResponse } from '@connextable/popbill-spec'\nimport type { CompanyInfo, BizInfoCheckChargeInfo } from '../types'\n\nexport function mapCompanyInfo(response: BizInfoCheckCompanyInfoApiModel): CompanyInfo {\n return {\n businessNumber: response.corpNum,\n corporateRegistrationNumber: response.companyRegNum,\n companyName: response.corpName,\n chiefExecutiveOfficerName: response.ceoname,\n corporateTypeCode: response.corpCode,\n companyScaleCode: response.corpScaleCode,\n personOrCorporationCode: response.personCorpCode,\n headOfficeCode: response.headOfficeCode,\n establishmentTypeCode: response.establishCode,\n workplaceTypeCode: response.workPlaceCode,\n addressTypeCode: response.addrCode,\n industryCode: response.industryCode,\n postalCode: response.zipCode,\n address: response.addr,\n addressDetail: response.addrDetail,\n englishAddress: response.enAddr,\n businessType: response.bizType,\n businessClass: response.bizClass,\n resultCode: response.result,\n resultMessage: response.resultMessage,\n businessStateCode: response.closeDownState,\n taxTypeCode: response.closeDownTaxType,\n establishedDate: response.establishDate,\n businessStateChangedDate: response.closeDownStateDate,\n taxTypeChangedDate: response.closeDownTaxTypeDate,\n checkedAt: response.checkDT,\n }\n}\n\nexport function mapBizInfoCheckChargeInfo(response: BizInfoCheckChargeInfoApiResponse): BizInfoCheckChargeInfo {\n return { unitCost: response.unitCost, chargeMethod: response.chargeMethod, rateSystem: response.rateSystem }\n}\n","import type { BizInfoCheckPromiseService } from '@connextable/popbill-compat/factory'\nimport type { PopbillApiError } from '@/errors'\nimport { invokeBizInfoCheckMethod } from './adapters/error'\nimport { mapCompanyInfo, mapBizInfoCheckChargeInfo } from './mappers/response'\nimport type { BizInfoCheckService } from './types'\n\ninterface CreateBizInfoCheckServiceInput {\n compatBizInfoCheckService: BizInfoCheckPromiseService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\nexport function createBizInfoCheckService(input: CreateBizInfoCheckServiceInput): BizInfoCheckService {\n const compat = input.compatBizInfoCheckService\n const invoke = <T>(method: keyof BizInfoCheckService, handler: () => Promise<T>) =>\n invokeBizInfoCheckMethod(input, `bizInfoCheck.${method}`, handler)\n return {\n getCompanyInfo(request) {\n return invoke('getCompanyInfo', async () =>\n mapCompanyInfo(await compat.checkBizInfo(request.businessNumber, request.targetBusinessNumber, input.defaultUserId))\n )\n },\n getChargeInfo(request) {\n return invoke('getChargeInfo', async () => mapBizInfoCheckChargeInfo(await compat.getChargeInfo(request.businessNumber, input.defaultUserId)))\n },\n getUnitCost(request) {\n return invoke('getUnitCost', async () => ({ unitCost: await compat.getUnitCost(request.businessNumber) }))\n },\n }\n}\n","import type { EasyFinBankService } from './types'\n\nexport const EASY_FIN_BANK_METHODS = [\n // 계좌관리\n 'getBankAccountManagementURL',\n 'registerBankAccount',\n 'updateBankAccount',\n 'getBankAccount',\n 'listBankAccounts',\n 'requestBankAccountClosure',\n 'cancelBankAccountClosure',\n 'deleteBankAccount',\n // 수집 요청/상태\n 'requestCollection',\n 'getCollectionStatus',\n 'listCollectionStatuses',\n // 거래내역\n 'searchTransactions',\n 'summarizeTransactions',\n 'saveTransactionMemo',\n // 정액제/과금\n 'getSubscriptionRegistrationURL',\n 'getSubscriptionStatus',\n 'getChargeInfo',\n] as const satisfies readonly (keyof EasyFinBankService)[]\n","import type { EasyFinBankAccountFormApiModel, EasyFinBankUpdateAccountFormApiModel } from '@connextable/popbill-spec'\nimport type { EasyFinBankAccountChanges, EasyFinBankAccountRegistration } from '../types'\n\nexport function mapAccountChanges(account: EasyFinBankAccountChanges): EasyFinBankUpdateAccountFormApiModel {\n return {\n AccountPWD: account.accountPassword,\n AccountName: account.accountName,\n BankID: account.internetBankingId,\n FastID: account.inquiryId,\n FastPWD: account.inquiryPassword,\n Memo: account.memo,\n }\n}\n\nexport function mapAccountRegistration(account: EasyFinBankAccountRegistration): EasyFinBankAccountFormApiModel {\n return {\n BankCode: account.bankCode,\n AccountNumber: account.accountNumber,\n AccountType: account.accountType,\n IdentityNumber: account.identityNumber,\n ...mapAccountChanges(account),\n }\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport { parseSafeInteger, preserveNumericCode } from '@connextable/popbill-utils'\nimport type * as Types from '../types'\n\nexport function mapOperation(value: Spec.EasyFinBankApiResponseBase): Types.EasyFinBankOperationResult {\n return { code: value.code, message: value.message }\n}\nexport function mapChargeInfo(value: Spec.EasyFinBankChargeInfoApiModel): Types.EasyFinBankChargeInfo {\n return { unitCost: value.unitCost, chargeMethod: value.chargeMethod, rateSystem: value.rateSystem }\n}\n\nexport function mapBankAccount(value: Spec.EasyFinBankAccountApiModel): Types.EasyFinBankAccount {\n return {\n bankCode: value.bankCode,\n accountNumber: value.accountNumber,\n accountName: value.accountName,\n accountType: value.accountType,\n memo: value.memo,\n accountStateCode: value.state,\n subscriptionStateCode: value.contractState,\n isClosureRequested: value.closeRequestYN,\n isUseRestricted: value.useRestrictYN,\n closesOnExpiration: value.closeOnExpired,\n hasUnpaidBalance: value.unPaidYN,\n subscriptionRenewalDay: value.baseDate,\n registeredAt: value.regDT,\n subscriptionStartedAt: value.contractDT,\n subscriptionExpiresOn: value.useEndDate,\n }\n}\n\nexport function mapSubscription(value: Spec.EasyFinBankFlatRateApiModel): Types.EasyFinBankSubscription {\n return {\n accountReferenceId: value.referenceID,\n stateCode: value.state,\n isClosureRequested: value.closeRequestYN,\n isUseRestricted: value.useRestrictYN,\n closesOnExpiration: value.closeOnExpired,\n hasUnpaidBalance: value.unPaidYN,\n renewalDay: value.baseDate,\n startedAt: value.contractDT,\n expiresOn: value.useEndDate,\n }\n}\n\nexport function mapCollectionStatus(value: Spec.EasyFinBankJobStateApiModel): Types.EasyFinBankCollectionStatus {\n const stateCode = preserveNumericCode(value.jobState)\n return {\n collectionId: value.jobID,\n startDate: value.startDate,\n endDate: value.endDate,\n stateCode,\n resultCode: value.errorCode,\n resultMessage: value.errorReason,\n isSuccessful: stateCode === 3 && parseSafeInteger(value.errorCode) === 1,\n requestedAt: value.regDT,\n startedAt: value.jobStartDT,\n completedAt: value.jobEndDT,\n }\n}\n\nexport function mapTransaction(value: Spec.EasyFinBankTransactionApiModel): Types.EasyFinBankTransaction {\n return {\n transactionId: value.tid,\n transactionSequence: value.trserial,\n depositAmount: value.accIn,\n withdrawalAmount: value.accOut,\n balance: value.balance,\n remark1: value.remark1,\n remark2: value.remark2,\n remark3: value.remark3,\n remark4: value.remark4,\n memo: value.memo,\n transactionDate: value.trdate,\n transactedAt: value.trdt,\n registeredAt: value.regDT,\n }\n}\n\nexport function mapSearchResult(value: Spec.EasyFinBankSearchResultApiModel): Types.EasyFinBankTransactionSearchResult {\n return {\n ...mapOperation(value),\n balance: value.balance,\n pageNumber: value.pageNum,\n pageSize: value.perPage,\n pageCount: value.pageCount,\n totalCount: value.total,\n transactions: value.list.map(mapTransaction),\n lastCollectedAt: value.lastScrapDT,\n }\n}\n\nexport function mapSummary(value: Spec.EasyFinBankSummaryApiModel): Types.EasyFinBankTransactionSummary {\n return {\n transactionCount: value.count,\n depositCount: value.cntAccIn,\n withdrawalCount: value.cntAccOut,\n totalDepositAmount: value.totalAccIn,\n totalWithdrawalAmount: value.totalAccOut,\n }\n}\n","import type { EasyFinBankPromiseService } from '@connextable/popbill-compat/factory'\nimport type { PopbillApiError } from '@/errors'\nimport { invokeEasyFinBankMethod } from './adapters/error'\nimport { mapAccountChanges, mapAccountRegistration } from './mappers/document'\nimport * as mappers from './mappers/response'\nimport type { EasyFinBankService } from './types'\n\ninterface CreateEasyFinBankServiceInput {\n compatEasyFinBankService: EasyFinBankPromiseService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\nexport function createEasyFinBankService(input: CreateEasyFinBankServiceInput): EasyFinBankService {\n const compat = input.compatEasyFinBankService\n const userId = input.defaultUserId\n const invoke = <T>(method: keyof EasyFinBankService, handler: () => Promise<T>) => invokeEasyFinBankMethod(input, `easyFinBank.${method}`, handler)\n return {\n getBankAccountManagementURL(request) {\n return invoke('getBankAccountManagementURL', async () => ({ url: await compat.getBankAccountMgtURL(request.businessNumber, userId) }))\n },\n registerBankAccount(request) {\n return invoke('registerBankAccount', async () =>\n mappers.mapOperation(\n await compat.registBankAccount(\n request.businessNumber,\n { ...mapAccountRegistration(request.account), UsePeriod: request.subscriptionMonths },\n userId\n )\n )\n )\n },\n updateBankAccount(request) {\n return invoke('updateBankAccount', async () =>\n mappers.mapOperation(\n await compat.updateBankAccount(request.businessNumber, request.bankCode, request.accountNumber, mapAccountChanges(request.account), userId)\n )\n )\n },\n getBankAccount(request) {\n return invoke('getBankAccount', async () =>\n mappers.mapBankAccount(await compat.getBankAccountInfo(request.businessNumber, request.bankCode, request.accountNumber, userId))\n )\n },\n listBankAccounts(request) {\n return invoke('listBankAccounts', async () => (await compat.listBankAccount(request.businessNumber, userId)).map(mappers.mapBankAccount))\n },\n requestBankAccountClosure(request) {\n return invoke('requestBankAccountClosure', async () =>\n mappers.mapOperation(await compat.closeBankAccount(request.businessNumber, request.bankCode, request.accountNumber, '일반', userId))\n )\n },\n cancelBankAccountClosure(request) {\n return invoke('cancelBankAccountClosure', async () =>\n mappers.mapOperation(await compat.revokeCloseBankAccount(request.businessNumber, request.bankCode, request.accountNumber, userId))\n )\n },\n deleteBankAccount(request) {\n return invoke('deleteBankAccount', async () =>\n mappers.mapOperation(await compat.deleteBankAccount(request.businessNumber, request.bankCode, request.accountNumber, userId))\n )\n },\n requestCollection(request) {\n return invoke('requestCollection', async () => ({\n collectionId: await compat.requestJob(\n request.businessNumber,\n request.bankCode,\n request.accountNumber,\n request.startDate,\n request.endDate,\n userId\n ),\n }))\n },\n getCollectionStatus(request) {\n return invoke('getCollectionStatus', async () =>\n mappers.mapCollectionStatus(await compat.getJobState(request.businessNumber, request.collectionId, userId))\n )\n },\n listCollectionStatuses(request) {\n return invoke('listCollectionStatuses', async () =>\n (await compat.listActiveJob(request.businessNumber, userId)).map(mappers.mapCollectionStatus)\n )\n },\n searchTransactions(request) {\n return invoke('searchTransactions', async () =>\n mappers.mapSearchResult(\n await compat.search(\n request.businessNumber,\n request.collectionId,\n request.transactionTypes ? [...request.transactionTypes] : undefined,\n request.queryText,\n request.pageNumber,\n request.pageSize,\n request.sortOrder,\n userId\n )\n )\n )\n },\n summarizeTransactions(request) {\n return invoke('summarizeTransactions', async () =>\n mappers.mapSummary(\n await compat.summary(\n request.businessNumber,\n request.collectionId,\n request.transactionTypes ? [...request.transactionTypes] : undefined,\n request.queryText,\n userId\n )\n )\n )\n },\n saveTransactionMemo(request) {\n return invoke('saveTransactionMemo', async () =>\n mappers.mapOperation(await compat.saveMemo(request.businessNumber, request.transactionId, request.memo, userId))\n )\n },\n getSubscriptionRegistrationURL(request) {\n return invoke('getSubscriptionRegistrationURL', async () => ({ url: await compat.getFlatRatePopUpURL(request.businessNumber, userId) }))\n },\n getSubscriptionStatus(request) {\n return invoke('getSubscriptionStatus', async () =>\n mappers.mapSubscription(await compat.getFlatRateState(request.businessNumber, request.bankCode, request.accountNumber, userId))\n )\n },\n getChargeInfo(request) {\n return invoke('getChargeInfo', async () => mappers.mapChargeInfo(await compat.getChargeInfo(request.businessNumber, userId)))\n },\n }\n}\n","import type { AccountCheckAccountInfoApiModel, AccountCheckDepositorInfoApiModel, AccountCheckChargeInfoApiResponse } from '@connextable/popbill-spec'\nimport type { AccountHolderInfo, AccountHolderIdentityInfo, AccountCheckChargeInfo } from '../types'\n\nexport function mapAccountHolderInfo(response: AccountCheckAccountInfoApiModel): AccountHolderInfo {\n return {\n bankCode: response.bankCode,\n accountNumber: response.accountNumber,\n accountHolderName: response.accountName,\n resultCode: response.result,\n resultMessage: response.resultMessage,\n checkedAt: response.checkDT,\n }\n}\n\nexport function mapAccountHolderIdentityInfo(response: AccountCheckDepositorInfoApiModel): AccountHolderIdentityInfo {\n return {\n bankCode: response.bankCode,\n accountNumber: response.accountNumber,\n identityNumberType: response.identityNumType,\n identityNumber: response.identityNum,\n accountHolderName: response.accountName,\n resultCode: response.result,\n resultMessage: response.resultMessage,\n checkedAt: response.checkDT,\n }\n}\n\nexport function mapAccountCheckChargeInfo(response: AccountCheckChargeInfoApiResponse): AccountCheckChargeInfo {\n return { unitCost: response.unitCost, chargeMethod: response.chargeMethod, rateSystem: response.rateSystem }\n}\n","import type { AccountCheckPromiseService } from '@connextable/popbill-compat/factory'\nimport type { PopbillApiError } from '@/errors'\nimport { invokeAccountCheckMethod } from './adapters/error'\nimport { mapAccountHolderInfo, mapAccountHolderIdentityInfo, mapAccountCheckChargeInfo } from './mappers/response'\nimport type { AccountCheckService } from './types'\n\ninterface CreateAccountCheckServiceInput {\n compatAccountCheckService: AccountCheckPromiseService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\nexport function createAccountCheckService(input: CreateAccountCheckServiceInput): AccountCheckService {\n const compat = input.compatAccountCheckService\n const invoke = <T>(method: keyof AccountCheckService, handler: () => Promise<T>) =>\n invokeAccountCheckMethod(input, `accountCheck.${method}`, handler)\n return {\n checkAccountHolderName(request) {\n return invoke('checkAccountHolderName', async () =>\n mapAccountHolderInfo(await compat.checkAccountInfo(request.businessNumber, request.bankCode, request.accountNumber, input.defaultUserId))\n )\n },\n verifyAccountHolderIdentity(request) {\n return invoke('verifyAccountHolderIdentity', async () =>\n mapAccountHolderIdentityInfo(\n await compat.checkDepositorInfo(\n request.businessNumber,\n request.bankCode,\n request.accountNumber,\n request.identityNumberType,\n request.identityNumber,\n input.defaultUserId\n )\n )\n )\n },\n getChargeInfo(request) {\n return invoke('getChargeInfo', async () =>\n mapAccountCheckChargeInfo(await compat.getChargeInfo(request.businessNumber, request.serviceType, input.defaultUserId))\n )\n },\n getUnitCost(request) {\n return invoke('getUnitCost', async () => ({\n unitCost: await compat.getUnitCost(request.businessNumber, request.serviceType, input.defaultUserId),\n }))\n },\n }\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport type * as Types from '../types'\nexport function mapButton(value: Types.KakaoButton): Spec.KakaoButtonApiModel {\n return { n: value.label, t: value.typeCode, u1: value.firstLink, u2: value.secondLink, tg: value.browserTarget, telNum: value.phoneNumber }\n}\nexport function mapCoupon(value?: Types.KakaoCoupon): Spec.KakaoCouponApiModel | undefined {\n return (\n value && {\n title: value.title,\n description: value.description,\n linkMobile: value.mobileUrl,\n linkPc: value.desktopUrl,\n linkAndroid: value.androidUrl,\n linkIos: value.iosUrl,\n }\n )\n}\nexport function mapContent(value: Types.KakaoMessageContent) {\n return {\n header: value.heading,\n content: value.messageBody,\n imageUrl: value.imageUrl,\n imageLink: value.imageLink,\n item: value.listItems?.map((item) => ({\n title: item.title,\n imageUrl: item.imageUrl,\n linkMobile: item.mobileUrl,\n linkPc: item.desktopUrl,\n linkAndroid: item.androidUrl,\n linkIos: item.iosUrl,\n })),\n commerce: value.commerce,\n head: value.carouselHead && {\n header: value.carouselHead.heading,\n content: value.carouselHead.messageBody,\n imageUrl: value.carouselHead.imageUrl,\n linkMobile: value.carouselHead.mobileUrl,\n linkPc: value.carouselHead.desktopUrl,\n linkAndroid: value.carouselHead.androidUrl,\n linkIos: value.carouselHead.iosUrl,\n },\n carousel: value.carouselItems?.map((item) => ({\n header: item.heading,\n content: item.messageBody,\n imageUrl: item.imageUrl,\n imageLink: item.imageLink,\n btns: item.buttons?.map(mapButton),\n coupon: mapCoupon(item.coupon),\n commerce: item.commerce,\n addContent: item.additionalContent,\n })),\n tail: value.carouselTail && {\n linkMobile: value.carouselTail.mobileUrl,\n linkPc: value.carouselTail.desktopUrl,\n linkAndroid: value.carouselTail.androidUrl,\n linkIos: value.carouselTail.iosUrl,\n },\n btns: value.buttons?.map(mapButton),\n coupon: mapCoupon(value.coupon),\n addContent: value.additionalContent,\n contentVariable: value.templateVariables?.content,\n buttonVariable: value.templateVariables?.buttons,\n couponVariable: value.templateVariables?.coupon,\n commerceVariable: value.templateVariables?.commerce,\n carouselVariable: value.templateVariables?.carousel?.map((item) => ({\n contentVariable: item.content,\n buttonVariable: item.buttons,\n couponVariable: item.coupon,\n commerceVariable: item.commerce,\n })),\n adultYN: value.adultOnly,\n altSubject: value.fallbackSubject,\n altContent: value.fallbackBody,\n }\n}\nexport function mapFriendReceiver(value: Types.KakaoFriendRecipient): Spec.KakaoLegacyReceiverApiModel {\n return {\n rcv: value.receiverPhoneNumber,\n rcvnm: value.receiverName,\n interOPRefKey: value.referenceKey,\n msg: value.messageBody,\n btns: value.buttons?.map(mapButton),\n altsjt: value.fallbackSubject,\n altmsg: value.fallbackBody,\n }\n}\nexport function mapNotificationReceiver(value: Types.KakaoRecipient): Spec.KakaoLegacyReceiverApiModel {\n return { ...mapFriendReceiver(value), emphasizeTitle: value.emphasizedTitle }\n}\nexport function mapBrandMessage(value: Types.SendBrandMessageRequest): Spec.KakaoBrandMessageApiModel {\n return {\n plusFriendID: value.channelSearchId,\n templateCode: value.templateCode,\n targeting: value.target,\n sendNum: value.senderPhoneNumber,\n receivers: value.recipients.map((receiver) => ({\n ...mapContent(receiver),\n receiveNum: receiver.receiverPhoneNumber,\n receiveName: receiver.receiverName,\n interOPRefKey: receiver.referenceKey,\n })),\n ...mapContent(value),\n unsubscribeNo: value.unsubscribePhoneNumber,\n altYN: value.fallbackEnabled,\n altUnsubscribeNo: value.fallbackUnsubscribePhoneNumber,\n requestNum: value.requestNumber,\n reserveDT: value.reserveDateTime,\n }\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport type * as Types from '../types'\nexport function operation(value: Spec.KakaoOperationApiResponse): Types.KakaoOperationResult {\n return { resultCode: value.code, resultMessage: value.message }\n}\nexport function button(value: Spec.KakaoButtonApiModel): Types.KakaoButton {\n return { label: value.n, typeCode: value.t, firstLink: value.u1, secondLink: value.u2, browserTarget: value.tg, phoneNumber: value.telNum }\n}\nfunction coupon(value?: Spec.KakaoCouponApiModel): Types.KakaoCoupon | undefined {\n return (\n value && {\n title: value.title,\n description: value.description,\n mobileUrl: value.linkMobile,\n desktopUrl: value.linkPc,\n androidUrl: value.linkAndroid,\n iosUrl: value.linkIos,\n }\n )\n}\nexport function content(value: Partial<Spec.KakaoContentApiModel>): Types.KakaoContent {\n return {\n heading: value.header,\n messageBody: value.content,\n imageUrl: value.imageUrl,\n imageLink: value.imageLink,\n listItems: value.item?.map((item) => ({\n title: item.title,\n imageUrl: item.imageUrl,\n mobileUrl: item.linkMobile,\n desktopUrl: item.linkPc,\n androidUrl: item.linkAndroid,\n iosUrl: item.linkIos,\n })),\n commerce: value.commerce,\n carouselHead: value.head && {\n heading: value.head.header,\n messageBody: value.head.content,\n imageUrl: value.head.imageUrl,\n mobileUrl: value.head.linkMobile,\n desktopUrl: value.head.linkPc,\n androidUrl: value.head.linkAndroid,\n iosUrl: value.head.linkIos,\n },\n carouselItems: value.carousel?.map((item) => ({\n heading: item.header,\n messageBody: item.content,\n imageUrl: item.imageUrl,\n imageLink: item.imageLink,\n buttons: item.btns?.map(button),\n coupon: coupon(item.coupon),\n commerce: item.commerce,\n additionalContent: item.addContent,\n })),\n carouselTail: value.tail && {\n mobileUrl: value.tail.linkMobile,\n desktopUrl: value.tail.linkPc,\n androidUrl: value.tail.linkAndroid,\n iosUrl: value.tail.linkIos,\n },\n buttons: value.btns?.map(button),\n coupon: coupon(value.coupon),\n additionalContent: value.addContent,\n adultOnly: value.adultYN,\n }\n}\nexport function channel(value: Spec.KakaoBusinessChannelApiModel): Types.KakaoBusinessChannel {\n return {\n channelSearchId: value.plusFriendID,\n channelName: value.plusFriendName,\n stateCode: value.state,\n brandMessagingStateCode: value.bmsState,\n registeredAt: value.regDT,\n stateChangedAt: value.stateDT,\n brandMessagingStateChangedAt: value.bmsStateDT,\n }\n}\nexport function sender(value: Spec.KakaoSenderNumberApiModel): Types.KakaoSenderNumber {\n return { phoneNumber: value.number, representative: value.representYN, stateCode: value.state, memo: value.memo }\n}\nexport function notificationTemplate(value: Spec.KakaoNotificationTemplateApiModel): Types.KakaoNotificationTemplate {\n return {\n channelSearchId: value.plusFriendID,\n templateCode: value.templateCode,\n templateName: value.templateName,\n messageBody: value.template,\n advertisingText: value.ads,\n appendix: value.appendix,\n buttons: value.btns?.map(button),\n secure: value.secureYN,\n emphasisType: value.emphasizeType,\n emphasizedTitle: value.emphasizeTitle,\n emphasizedSubtitle: value.emphasizeSubtitle,\n stateCode: value.state,\n stateChangedAt: value.stateDT,\n }\n}\nexport function brandTemplate(value: Spec.KakaoBrandTemplateApiModel): Types.KakaoBrandTemplate {\n return {\n channelSearchId: value.plusFriendID,\n templateCode: value.templateCode,\n templateName: value.templateName,\n templateType: value.templateType,\n ...content(value),\n stateCode: value.state,\n stateChangedAt: value.stateDT,\n }\n}\nexport function message(value: Spec.KakaoMessageApiModel): Types.KakaoMessage {\n return {\n receiptNumber: value.receiptNum,\n requestNumber: value.requestNum,\n referenceKey: value.interOPRefKey,\n channelSearchId: value.plusFriendID,\n templateCode: value.templateCode,\n messageType: value.type,\n contentTypeCode: value.contentType,\n senderPhoneNumber: value.sendNum,\n receiverPhoneNumber: value.receiveNum,\n receiverName: value.receiveName,\n ...content(value),\n subject: value.subject,\n emphasizedTitle: value.emphasizeTitle,\n stateCode: value.state,\n resultCode: value.result,\n receivedAt: value.receiptDT,\n reserveDateTime: value.reserveDT,\n sentAt: value.sendDT,\n resultAt: value.resultDT,\n fallbackSubject: value.altSubject,\n fallbackBody: value.altContent,\n fallbackContentTypeCode: value.altContentType,\n fallbackResultCode: value.altResult,\n fallbackSentAt: value.altSendDT,\n fallbackResultAt: value.altResultDT,\n }\n}\nexport function messages(value: Spec.KakaoMessagesApiModel): Types.KakaoMessages {\n return {\n receiptNumber: value.receiptNum,\n requestNumber: value.requestNum,\n channelSearchId: value.plusFriendID,\n templateCode: value.templateCode,\n brandTemplateCode: value.bmsTemplateCode,\n contentTypeCode: value.contentType,\n target: value.targeting,\n senderPhoneNumber: value.sendNum,\n messageBody: value.content,\n buttons: value.btns?.map(button),\n messages: value.msgs.map(message),\n advertising: value.adsYN,\n unsubscribePhoneNumber: value.unsubscribeNo,\n sentCount: value.sendCnt,\n successCount: value.successCnt,\n failureCount: value.failCnt,\n canceledCount: value.cancelCnt,\n sendDateTime: value.sndDT,\n reserveDateTime: value.reserveDT,\n fallbackSubject: value.altSubject,\n fallbackBody: value.altContent,\n fallbackType: value.altSendType,\n fallbackUnsubscribePhoneNumber: value.altUnsubscribeNo,\n fallbackCount: value.altCnt,\n }\n}\nexport function search(value: Spec.KakaoSearchApiModel): Types.KakaoSearchResult {\n return {\n operationResult: operation(value),\n pageNumber: value.pageNum,\n pageSize: value.perPage,\n pageCount: value.pageCount,\n totalCount: value.total,\n messages: value.list.map(message),\n }\n}\nexport function image(value: Spec.KakaoImageApiModel): Types.KakaoImage {\n return { imageUrl: value.imageUrl, formField: value.formField }\n}\n","import type { KakaoPromiseService } from '@connextable/popbill-compat/factory'\nimport { createInputValidationError } from '@connextable/popbill-compat/errors'\nimport type { PopbillApiError } from '@/errors'\nimport type { KakaoFriendImage, KakaoRecipient, KakaoService, SendBrandMessageRequest } from './types'\nimport { invokeKakaoMethod } from './adapters/error'\nimport { mapBrandMessage, mapButton, mapFriendReceiver, mapNotificationReceiver } from './mappers/document'\nimport * as map from './mappers/response'\nexport interface CreateKakaoServiceInput {\n compatKakaoService: KakaoPromiseService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\nexport function createKakaoService(input: CreateKakaoServiceInput): KakaoService {\n const compat = input.compatKakaoService,\n userId = input.defaultUserId\n const invoke = <T>(operation: string, handler: () => Promise<T>): Promise<T> => invokeKakaoMethod(input, 'kakao.' + operation, handler)\n const sendBrand = (\n operation: keyof KakaoService,\n method:\n | 'sendBMSText'\n | 'sendBMSImage'\n | 'sendBMSWideImage'\n | 'sendBMSWideList'\n | 'sendBMSCarouselFeed'\n | 'sendBMSCommerce'\n | 'sendBMSCarouselCommerce'\n | 'sendBMSVariable',\n request: SendBrandMessageRequest\n ) =>\n invoke(operation, async () => {\n validateRecipients(request.recipients)\n if (typeof request.target !== 'string' || !request.target.trim())\n throw createInputValidationError('브랜드 메시지 전송대상이 입력되지 않았습니다.')\n return { receiptNumber: await compat[method](request.businessNumber, mapBrandMessage(request), userId) }\n })\n return {\n getBusinessChannelManagementURL(request) {\n return invoke('getBusinessChannelManagementURL', async () => {\n const value = await compat.getPlusFriendMgtURL(request.businessNumber, userId)\n return { accessUrl: value }\n })\n },\n listBusinessChannels(request) {\n return invoke('listBusinessChannels', async () => {\n const value = await compat.listPlusFriendID(request.businessNumber, userId)\n return value.map(map.channel)\n })\n },\n getSenderNumberManagementURL(request) {\n return invoke('getSenderNumberManagementURL', async () => {\n const value = await compat.getSenderNumberMgtURL(request.businessNumber, userId)\n return { accessUrl: value }\n })\n },\n listSenderNumbers(request) {\n return invoke('listSenderNumbers', async () => {\n const value = await compat.getSenderNumberList(request.businessNumber, userId)\n return value.map(map.sender)\n })\n },\n checkSenderNumberRegistration(request) {\n return invoke('checkSenderNumberRegistration', async () => {\n const value = await compat.checkSenderNumber(request.businessNumber, request.senderPhoneNumber, userId)\n return map.operation(value)\n })\n },\n getNotificationTemplateManagementURL(request) {\n return invoke('getNotificationTemplateManagementURL', async () => {\n const value = await compat.getATSTemplateMgtURL(request.businessNumber, userId)\n return { accessUrl: value }\n })\n },\n getNotificationTemplate(request) {\n return invoke('getNotificationTemplate', async () => {\n const value = await compat.getATSTemplate(request.businessNumber, request.templateCode, userId)\n return map.notificationTemplate(value)\n })\n },\n listNotificationTemplates(request) {\n return invoke('listNotificationTemplates', async () => {\n const value = await compat.listATSTemplate(request.businessNumber, userId)\n return value.map(map.notificationTemplate)\n })\n },\n getBrandTemplateManagementURL(request) {\n return invoke('getBrandTemplateManagementURL', async () => {\n const value = await compat.getBMSTemplateMgtURL(request.businessNumber, userId)\n return { accessUrl: value }\n })\n },\n getBrandTemplate(request) {\n return invoke('getBrandTemplate', async () => {\n const value = await compat.getBMSTemplate(request.businessNumber, request.templateCode, userId)\n return map.brandTemplate(value)\n })\n },\n listBrandTemplates(request) {\n return invoke('listBrandTemplates', async () => {\n const value = await compat.listBMSTemplate(request.businessNumber, userId)\n return value.map(map.brandTemplate)\n })\n },\n uploadBrandImageFromPath(request) {\n return invoke('uploadBrandImageFromPath', async () => {\n const value = await compat.uploadImage(request.businessNumber, request.filePath, userId)\n return map.image(value)\n })\n },\n uploadBrandImageFromBinary(request) {\n return invoke('uploadBrandImageFromBinary', async () => {\n const value = await compat.uploadImageBinary(request.businessNumber, { fileName: request.fileName, fileData: request.fileData }, userId)\n return map.image(value)\n })\n },\n uploadBrandWideImageFromPath(request) {\n return invoke('uploadBrandWideImageFromPath', async () => {\n const value = await compat.uploadWideImage(request.businessNumber, request.filePath, userId)\n return map.image(value)\n })\n },\n uploadBrandWideImageFromBinary(request) {\n return invoke('uploadBrandWideImageFromBinary', async () => {\n const value = await compat.uploadWideImageBinary(request.businessNumber, { fileName: request.fileName, fileData: request.fileData }, userId)\n return map.image(value)\n })\n },\n uploadBrandWideListMainImageFromPath(request) {\n return invoke('uploadBrandWideListMainImageFromPath', async () => {\n const value = await compat.uploadWideListMainImage(request.businessNumber, request.filePath, userId)\n return map.image(value)\n })\n },\n uploadBrandWideListMainImageFromBinary(request) {\n return invoke('uploadBrandWideListMainImageFromBinary', async () => {\n const value = await compat.uploadWideListMainImageBinary(\n request.businessNumber,\n { fileName: request.fileName, fileData: request.fileData },\n userId\n )\n return map.image(value)\n })\n },\n uploadBrandWideListImageFromPath(request) {\n return invoke('uploadBrandWideListImageFromPath', async () => {\n const value = await compat.uploadWideListImage(request.businessNumber, [...request.filePaths], userId)\n return value.result.map(map.image)\n })\n },\n uploadBrandWideListImageFromBinary(request) {\n return invoke('uploadBrandWideListImageFromBinary', async () => {\n const value = await compat.uploadWideListImageBinary(\n request.businessNumber,\n request.files.map((file) => ({ fileName: file.fileName, fileData: file.fileData })),\n userId\n )\n return value.result.map(map.image)\n })\n },\n uploadBrandCarouselFeedImageFromPath(request) {\n return invoke('uploadBrandCarouselFeedImageFromPath', async () => {\n const value = await compat.uploadCarouselFeedImage(request.businessNumber, [...request.filePaths], userId)\n return value.result.map(map.image)\n })\n },\n uploadBrandCarouselFeedImageFromBinary(request) {\n return invoke('uploadBrandCarouselFeedImageFromBinary', async () => {\n const value = await compat.uploadCarouselFeedImageBinary(\n request.businessNumber,\n request.files.map((file) => ({ fileName: file.fileName, fileData: file.fileData })),\n userId\n )\n return value.result.map(map.image)\n })\n },\n uploadBrandCommerceImageFromPath(request) {\n return invoke('uploadBrandCommerceImageFromPath', async () => {\n const value = await compat.uploadCommerceImage(request.businessNumber, request.filePath, userId)\n return map.image(value)\n })\n },\n uploadBrandCommerceImageFromBinary(request) {\n return invoke('uploadBrandCommerceImageFromBinary', async () => {\n const value = await compat.uploadCommerceImageBinary(\n request.businessNumber,\n { fileName: request.fileName, fileData: request.fileData },\n userId\n )\n return map.image(value)\n })\n },\n uploadBrandCarouselCommerceImageFromPath(request) {\n return invoke('uploadBrandCarouselCommerceImageFromPath', async () => {\n const value = await compat.uploadCarouselCommerceImage(request.businessNumber, [...request.filePaths], userId)\n return value.result.map(map.image)\n })\n },\n uploadBrandCarouselCommerceImageFromBinary(request) {\n return invoke('uploadBrandCarouselCommerceImageFromBinary', async () => {\n const value = await compat.uploadCarouselCommerceImageBinary(\n request.businessNumber,\n request.files.map((file) => ({ fileName: file.fileName, fileData: file.fileData })),\n userId\n )\n return value.result.map(map.image)\n })\n },\n sendNotificationMessage(request) {\n return invoke('sendNotificationMessage', async () => {\n const receiptNumber = await compat.sendATS_same(\n request.businessNumber,\n request.templateCode,\n request.senderPhoneNumber,\n request.messageBody,\n request.fallbackSubject,\n request.fallbackBody,\n request.fallbackType,\n request.reserveDateTime,\n [mapNotificationReceiver(request)],\n userId,\n request.requestNumber,\n request.buttons?.map(mapButton),\n request.emphasizedTitle\n )\n return { receiptNumber }\n })\n },\n sendNotificationMessages(request) {\n return invoke('sendNotificationMessages', async () => {\n validateRecipients(request.recipients)\n return {\n receiptNumber: await compat.sendATS_multi(\n request.businessNumber,\n request.templateCode,\n request.senderPhoneNumber,\n request.fallbackType,\n request.reserveDateTime,\n request.recipients.map(mapNotificationReceiver),\n userId,\n request.requestNumber,\n request.buttons?.map(mapButton)\n ),\n }\n })\n },\n sendIdenticalNotificationMessages(request) {\n return invoke('sendIdenticalNotificationMessages', async () => {\n validateRecipients(request.recipients)\n return {\n receiptNumber: await compat.sendATS_same(\n request.businessNumber,\n request.templateCode,\n request.senderPhoneNumber,\n request.messageBody,\n request.fallbackSubject,\n request.fallbackBody,\n request.fallbackType,\n request.reserveDateTime,\n request.recipients.map(mapNotificationReceiver),\n userId,\n request.requestNumber,\n request.buttons?.map(mapButton),\n request.emphasizedTitle\n ),\n }\n })\n },\n sendFriendTextMessage(request) {\n return invoke('sendFriendTextMessage', async () => {\n validateRecipients([request])\n return {\n receiptNumber: await compat.sendFTS_same(\n request.businessNumber,\n request.channelSearchId,\n request.senderPhoneNumber,\n request.messageBody,\n request.fallbackSubject,\n request.fallbackBody,\n request.fallbackType,\n request.reserveDateTime,\n request.advertising,\n [mapFriendReceiver(request)],\n request.buttons?.map(mapButton),\n userId,\n request.requestNumber\n ),\n }\n })\n },\n sendFriendTextMessages(request) {\n return invoke('sendFriendTextMessages', async () => {\n validateRecipients(request.recipients)\n return {\n receiptNumber: await compat.sendFTS_multi(\n request.businessNumber,\n request.channelSearchId,\n request.senderPhoneNumber,\n request.fallbackType,\n request.reserveDateTime,\n request.advertising,\n request.recipients.map(mapFriendReceiver),\n request.buttons?.map(mapButton),\n userId,\n request.requestNumber\n ),\n }\n })\n },\n sendIdenticalFriendTextMessages(request) {\n return invoke('sendIdenticalFriendTextMessages', async () => {\n validateRecipients(request.recipients)\n return {\n receiptNumber: await compat.sendFTS_same(\n request.businessNumber,\n request.channelSearchId,\n request.senderPhoneNumber,\n request.messageBody,\n request.fallbackSubject,\n request.fallbackBody,\n request.fallbackType,\n request.reserveDateTime,\n request.advertising,\n request.recipients.map(mapFriendReceiver),\n request.buttons?.map(mapButton),\n userId,\n request.requestNumber\n ),\n }\n })\n },\n sendFriendImageMessage(request) {\n return invoke('sendFriendImageMessage', async () => {\n validateRecipients([request])\n validateFriendImage(request)\n return {\n receiptNumber: await compat.sendFMS_same(\n request.businessNumber,\n request.channelSearchId,\n request.senderPhoneNumber,\n request.messageBody,\n request.fallbackSubject,\n request.fallbackBody,\n request.fallbackType,\n request.reserveDateTime,\n request.advertising,\n request.imageLink,\n request.filePath,\n [mapFriendReceiver(request)],\n request.buttons?.map(mapButton),\n userId,\n request.requestNumber\n ),\n }\n })\n },\n sendFriendImageMessages(request) {\n return invoke('sendFriendImageMessages', async () => {\n validateRecipients(request.recipients)\n validateFriendImage(request)\n return {\n receiptNumber: await compat.sendFMS_multi(\n request.businessNumber,\n request.channelSearchId,\n request.senderPhoneNumber,\n request.fallbackType,\n request.reserveDateTime,\n request.advertising,\n request.imageLink,\n request.filePath,\n request.recipients.map(mapFriendReceiver),\n request.buttons?.map(mapButton),\n userId,\n request.requestNumber\n ),\n }\n })\n },\n sendIdenticalFriendImageMessages(request) {\n return invoke('sendIdenticalFriendImageMessages', async () => {\n validateRecipients(request.recipients)\n validateFriendImage(request)\n return {\n receiptNumber: await compat.sendFMS_same(\n request.businessNumber,\n request.channelSearchId,\n request.senderPhoneNumber,\n request.messageBody,\n request.fallbackSubject,\n request.fallbackBody,\n request.fallbackType,\n request.reserveDateTime,\n request.advertising,\n request.imageLink,\n request.filePath,\n request.recipients.map(mapFriendReceiver),\n request.buttons?.map(mapButton),\n userId,\n request.requestNumber\n ),\n }\n })\n },\n sendBrandTextMessages: (request) => sendBrand('sendBrandTextMessages', 'sendBMSText', request),\n sendBrandImageMessages: (request) => sendBrand('sendBrandImageMessages', 'sendBMSImage', request),\n sendBrandWideImageMessages: (request) => sendBrand('sendBrandWideImageMessages', 'sendBMSWideImage', request),\n sendBrandWideListMessages: (request) => sendBrand('sendBrandWideListMessages', 'sendBMSWideList', request),\n sendBrandCarouselFeedMessages: (request) => sendBrand('sendBrandCarouselFeedMessages', 'sendBMSCarouselFeed', request),\n sendBrandCommerceMessages: (request) => sendBrand('sendBrandCommerceMessages', 'sendBMSCommerce', request),\n sendBrandCarouselCommerceMessages: (request) => sendBrand('sendBrandCarouselCommerceMessages', 'sendBMSCarouselCommerce', request),\n sendBrandTemplateMessages: (request) => sendBrand('sendBrandTemplateMessages', 'sendBMSVariable', request),\n cancelReservedMessagesByReceiptNumber(request) {\n return invoke('cancelReservedMessagesByReceiptNumber', async () => {\n const value = await compat.cancelReserve(request.businessNumber, request.receiptNumber, userId)\n return map.operation(value)\n })\n },\n cancelReservedMessagesByRequestNumber(request) {\n return invoke('cancelReservedMessagesByRequestNumber', async () => {\n const value = await compat.cancelReserveRN(request.businessNumber, request.requestNumber, userId)\n return map.operation(value)\n })\n },\n cancelReservedRecipientByReceiptNumber(request) {\n return invoke('cancelReservedRecipientByReceiptNumber', async () => {\n const value = await compat.cancelReservebyRCV(request.businessNumber, request.receiptNumber, request.receiverPhoneNumber, userId)\n return map.operation(value)\n })\n },\n cancelReservedRecipientByRequestNumber(request) {\n return invoke('cancelReservedRecipientByRequestNumber', async () => {\n const value = await compat.cancelReserveRNbyRCV(request.businessNumber, request.requestNumber, request.receiverPhoneNumber, userId)\n return map.operation(value)\n })\n },\n getMessagesByReceiptNumber(request) {\n return invoke('getMessagesByReceiptNumber', async () => {\n const value = await compat.getMessages(request.businessNumber, request.receiptNumber, userId)\n return map.messages(value)\n })\n },\n getMessagesByRequestNumber(request) {\n return invoke('getMessagesByRequestNumber', async () => {\n const value = await compat.getMessagesRN(request.businessNumber, request.requestNumber, userId)\n return map.messages(value)\n })\n },\n searchMessages(request) {\n return invoke('searchMessages', async () => {\n const page = request.pageNumber ?? 1,\n size = request.pageSize ?? 100\n if (!Number.isInteger(page) || page < 1 || !Number.isInteger(size) || size < 1)\n throw createInputValidationError('페이지 범위가 올바르지 않습니다.')\n const value = await compat.search(\n request.businessNumber,\n request.startDate,\n request.endDate,\n request.stateCodes?.length ? request.stateCodes : undefined,\n request.messageTypes,\n request.reservedOnly === undefined ? undefined : request.reservedOnly ? '1' : '0',\n request.senderOnly,\n page,\n size,\n request.sortOrder ?? 'D',\n request.queryText,\n userId,\n request.channelSearchId,\n request.contentTypeCodes\n )\n return map.search(value)\n })\n },\n getMessageHistoryURL(request) {\n return invoke('getMessageHistoryURL', async () => {\n const value = await compat.getSentListURL(request.businessNumber, userId)\n return { accessUrl: value }\n })\n },\n getMessageUnitCost(request) {\n return invoke('getMessageUnitCost', async () => {\n return { unitCostAmount: await compat.getUnitCost(request.businessNumber, request.messageType) }\n })\n },\n getMessageChargeInfo(request) {\n return invoke('getMessageChargeInfo', async () => {\n const value = await compat.getChargeInfo(request.businessNumber, request.messageType, userId)\n return { unitCostAmount: value.unitCost, chargeMethod: value.chargeMethod, rateSystem: value.rateSystem }\n })\n },\n }\n}\nfunction validateRecipients(recipients: KakaoRecipient[]): void {\n if (\n !Array.isArray(recipients) ||\n recipients.length < 1 ||\n recipients.some((receiver) => typeof receiver.receiverPhoneNumber !== 'string' || !receiver.receiverPhoneNumber.trim())\n )\n throw createInputValidationError('수신자는 1건 이상이며 수신번호가 필요합니다.')\n}\nfunction validateFriendImage(image: KakaoFriendImage): void {\n if (typeof image.filePath !== 'string' || !image.filePath.trim()) throw createInputValidationError('친구톡 이미지 파일 경로가 입력되지 않았습니다.')\n}\n","import type { KakaoService } from './types'\nexport const KAKAO_METHODS = [\n // 채널관리\n 'getBusinessChannelManagementURL',\n 'listBusinessChannels',\n // 발신번호\n 'getSenderNumberManagementURL',\n 'listSenderNumbers',\n 'checkSenderNumberRegistration',\n // 템플릿관리\n 'getNotificationTemplateManagementURL',\n 'getNotificationTemplate',\n 'listNotificationTemplates',\n 'getBrandTemplateManagementURL',\n 'getBrandTemplate',\n 'listBrandTemplates',\n // 이미지관리\n 'uploadBrandImageFromPath',\n 'uploadBrandImageFromBinary',\n 'uploadBrandWideImageFromPath',\n 'uploadBrandWideImageFromBinary',\n 'uploadBrandWideListMainImageFromPath',\n 'uploadBrandWideListMainImageFromBinary',\n 'uploadBrandWideListImageFromPath',\n 'uploadBrandWideListImageFromBinary',\n 'uploadBrandCarouselFeedImageFromPath',\n 'uploadBrandCarouselFeedImageFromBinary',\n 'uploadBrandCommerceImageFromPath',\n 'uploadBrandCommerceImageFromBinary',\n 'uploadBrandCarouselCommerceImageFromPath',\n 'uploadBrandCarouselCommerceImageFromBinary',\n // 메시지 전송\n 'sendNotificationMessage',\n 'sendNotificationMessages',\n 'sendIdenticalNotificationMessages',\n 'sendFriendTextMessage',\n 'sendFriendTextMessages',\n 'sendIdenticalFriendTextMessages',\n 'sendFriendImageMessage',\n 'sendFriendImageMessages',\n 'sendIdenticalFriendImageMessages',\n 'sendBrandTextMessages',\n 'sendBrandImageMessages',\n 'sendBrandWideImageMessages',\n 'sendBrandWideListMessages',\n 'sendBrandCarouselFeedMessages',\n 'sendBrandCommerceMessages',\n 'sendBrandCarouselCommerceMessages',\n 'sendBrandTemplateMessages',\n // 예약취소\n 'cancelReservedMessagesByReceiptNumber',\n 'cancelReservedMessagesByRequestNumber',\n 'cancelReservedRecipientByReceiptNumber',\n 'cancelReservedRecipientByRequestNumber',\n // 결과조회\n 'getMessagesByReceiptNumber',\n 'getMessagesByRequestNumber',\n 'searchMessages',\n 'getMessageHistoryURL',\n // 과금정보\n 'getMessageUnitCost',\n 'getMessageChargeInfo',\n] as const satisfies readonly (keyof KakaoService)[]\n","import type { MessageRecipient } from '@connextable/popbill-compat/factory'\nimport type { MessageRecipientInput } from '../types'\nexport function mapMessageRecipient(input: MessageRecipientInput): MessageRecipient {\n return {\n Receiver: input.receiverNumber,\n ReceiverName: input.receiverName,\n Sender: input.senderNumber,\n SenderName: input.senderName,\n Subject: input.subject,\n Contents: input.body,\n interOPRefKey: input.referenceKey,\n }\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport type * as Types from '../types'\nexport function mapSentMessage(raw: Spec.MessageSentApiModel): Types.SentMessage {\n return {\n receiptNumber: raw.receiptNum,\n requestNumber: raw.requestNum,\n referenceKey: raw.interOPRefKey,\n messageType: raw.type,\n senderNumber: raw.sendNum,\n senderName: raw.senderName,\n receiverNumber: raw.receiveNum,\n receiverName: raw.receiveName,\n subject: raw.subject,\n body: raw.content,\n carrierName: raw.tranNet,\n stateCode: raw.state === undefined || raw.state === null ? raw.state : String(raw.state),\n resultCode: raw.result === undefined || raw.result === null ? raw.result : String(raw.result),\n receivedAt: raw.receiptDT,\n reservedAt: raw.reserveDT,\n sentAt: raw.sendDT,\n resultReceivedAt: raw.resultDT,\n }\n}\nexport function mapMessageSearch(raw: Spec.MessageSearchApiResponse): Types.MessageSearchResult {\n return {\n code: raw.code,\n message: raw.message,\n pageNumber: raw.pageNum,\n pageSize: raw.perPage,\n pageCount: raw.pageCount,\n totalCount: raw.total,\n items: raw.list.map(mapSentMessage),\n }\n}\n","import type { MessagePromiseService } from '@connextable/popbill-compat/factory'\nimport type { PopbillApiError } from '@/errors'\nimport { mapMessageRecipient } from './mappers/document'\nimport { mapMessageSearch, mapSentMessage } from './mappers/response'\nimport { invokeMessageMethod } from './adapters/error'\nimport type * as Types from './types'\nexport interface CreateMessageServiceInput {\n compatMessageService: MessagePromiseService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\nexport function createMessageService(input: CreateMessageServiceInput): Types.MessageService {\n const compat = input.compatMessageService\n const userId = input.defaultUserId\n const invoke = <T>(method: keyof Types.MessageService, handler: () => Promise<T>) => invokeMessageMethod(input, 'message.' + method, handler)\n const sendText = (\n method: 'sendShortMessage' | 'sendLongMessage' | 'sendAutoLengthMessage',\n type: 'SMS' | 'LMS' | 'XMS',\n request: Types.SendMessageRequest\n ) =>\n invoke(method, async () => ({\n receiptNumber: await compat.sendMessage(\n type,\n request.businessNumber,\n request.senderNumber,\n request.senderName ?? '',\n request.subject ?? '',\n request.body,\n request.recipients.map(mapMessageRecipient),\n request.reservedAt,\n request.isAdvertisement,\n request.requestNumber,\n userId\n ),\n }))\n return {\n getSenderNumberRegistrationURL: (request) =>\n invoke('getSenderNumberRegistrationURL', async () => ({ url: await compat.getSenderNumberMgtURL(request.businessNumber, userId) })),\n getSenderNumbers: (request) =>\n invoke('getSenderNumbers', async () =>\n (await compat.getSenderNumberList(request.businessNumber, userId)).map((value) => ({\n number: value.number,\n isRepresentative: value.representYN,\n stateCode: value.state,\n memo: value.memo ?? undefined,\n }))\n ),\n checkSenderNumber: (request) => invoke('checkSenderNumber', () => compat.checkSenderNumber(request.businessNumber, request.senderNumber, userId)),\n getDenyNumberInfo: (request) =>\n invoke('getDenyNumberInfo', async () => {\n const value = await compat.checkAutoDenyNumber(request.businessNumber, userId)\n return { number: value.smsdenyNumber, registeredAt: value.regDT }\n }),\n getDeniedNumbers: (request) =>\n invoke('getDeniedNumbers', async () =>\n (await compat.getAutoDenyList(request.businessNumber, userId)).map((value) => ({ number: value.number, registeredAt: value.regDT }))\n ),\n sendShortMessage: (request) => sendText('sendShortMessage', 'SMS', request),\n sendLongMessage: (request) => sendText('sendLongMessage', 'LMS', request),\n sendAutoLengthMessage: (request) => sendText('sendAutoLengthMessage', 'XMS', request),\n sendImageMessage(request) {\n return invoke('sendImageMessage', async () => {\n const args = [\n request.businessNumber,\n request.senderNumber,\n request.subject ?? '',\n request.body,\n request.recipients.map(mapMessageRecipient),\n ] as const\n const options = [request.reservedAt, request.isAdvertisement, request.requestNumber, request.senderName, userId] as const\n const receiptNumber =\n request.image.filePath !== undefined\n ? await compat.sendMMS_multi(...args, request.image.filePath, ...options)\n : await compat.sendMMSBinary_multi(...args, { fileName: request.image.fileName, fileData: request.image.fileData }, ...options)\n return { receiptNumber }\n })\n },\n cancelScheduledMessagesByReceiptNumber: (request) =>\n invoke('cancelScheduledMessagesByReceiptNumber', () => compat.cancelReserve(request.businessNumber, request.receiptNumber, userId)),\n cancelScheduledMessagesByRequestNumber: (request) =>\n invoke('cancelScheduledMessagesByRequestNumber', () => compat.cancelReserveRN(request.businessNumber, request.requestNumber, userId)),\n cancelScheduledRecipientByReceiptNumber: (request) =>\n invoke('cancelScheduledRecipientByReceiptNumber', () =>\n compat.cancelReservebyRCV(request.businessNumber, request.receiptNumber, request.receiverNumber, userId)\n ),\n cancelScheduledRecipientByRequestNumber: (request) =>\n invoke('cancelScheduledRecipientByRequestNumber', () =>\n compat.cancelReserveRNbyRCV(request.businessNumber, request.requestNumber, request.receiverNumber, userId)\n ),\n getMessagesByReceiptNumber: (request) =>\n invoke('getMessagesByReceiptNumber', async () =>\n (await compat.getMessages(request.businessNumber, request.receiptNumber, userId)).map(mapSentMessage)\n ),\n getMessagesByRequestNumber: (request) =>\n invoke('getMessagesByRequestNumber', async () =>\n (await compat.getMessagesRN(request.businessNumber, request.requestNumber, userId)).map(mapSentMessage)\n ),\n getMessageStatesByReceiptNumbers: (request) =>\n invoke('getMessageStatesByReceiptNumbers', () => compat.getStates(request.businessNumber, [...request.receiptNumbers], userId)),\n searchMessages: (request) =>\n invoke('searchMessages', async () =>\n mapMessageSearch(\n await compat.search(\n request.businessNumber,\n request.startDate,\n request.endDate,\n [...request.stateCodes],\n request.messageTypes ? [...request.messageTypes] : undefined,\n request.isReserved,\n request.sentByCurrentUserOnly,\n request.sortOrder,\n request.pageNumber,\n request.pageSize,\n request.queryText,\n userId\n )\n )\n ),\n getSentMessageListURL: (request) =>\n invoke('getSentMessageListURL', async () => ({ url: await compat.getSentListURL(request.businessNumber, userId) })),\n getUnitCost: (request) =>\n invoke('getUnitCost', async () => ({ unitCost: await compat.getUnitCost(request.businessNumber, request.messageType) })),\n getChargeInfo: (request) => invoke('getChargeInfo', () => compat.getChargeInfo(request.businessNumber, request.messageType, userId)),\n }\n}\n","import type { MessageService } from './types'\nexport const MESSAGE_METHODS = [\n // 발신번호/수신거부\n 'getSenderNumberRegistrationURL',\n 'getSenderNumbers',\n 'checkSenderNumber',\n 'getDenyNumberInfo',\n 'getDeniedNumbers',\n // 메시지 전송\n 'sendShortMessage',\n 'sendLongMessage',\n 'sendAutoLengthMessage',\n 'sendImageMessage',\n // 예약취소\n 'cancelScheduledMessagesByReceiptNumber',\n 'cancelScheduledMessagesByRequestNumber',\n 'cancelScheduledRecipientByReceiptNumber',\n 'cancelScheduledRecipientByRequestNumber',\n // 결과조회\n 'getMessagesByReceiptNumber',\n 'getMessagesByRequestNumber',\n 'getMessageStatesByReceiptNumbers',\n 'searchMessages',\n 'getSentMessageListURL',\n // 과금정보\n 'getUnitCost',\n 'getChargeInfo',\n] as const satisfies readonly (keyof MessageService)[]\n","import type { FaxReceiver, FaxResendOptions, FaxSendOptions } from '@connextable/popbill-compat/factory'\nimport type { FaxRecipient, FaxResendOverrides, FaxSendInput } from '../types'\n\nexport function mapFaxRecipients(recipients: readonly FaxRecipient[]): FaxReceiver[] {\n return recipients.map((recipient) => ({\n receiveNum: recipient.phoneNumber,\n receiveName: recipient.name,\n interOPRefKey: recipient.partnerReferenceKey,\n }))\n}\nexport function mapFaxSendInput(input: FaxSendInput, userId: string): FaxSendOptions {\n return {\n RequestNum: input.requestNumber,\n SenderNum: input.senderPhoneNumber,\n SenderName: input.senderName,\n Receiver: mapFaxRecipients(input.recipients),\n Title: input.title,\n AdsYN: input.isAdvertisement,\n ReserveDT: input.scheduledAt,\n UserID: userId,\n }\n}\nexport function mapFaxResendInput(input: FaxResendOverrides, userId: string): FaxResendOptions {\n return {\n RequestNum: input.newRequestNumber,\n SenderNum: input.senderPhoneNumber,\n SenderName: input.senderName,\n Receiver: input.recipients === undefined ? undefined : mapFaxRecipients(input.recipients),\n Title: input.title,\n ReserveDT: input.scheduledAt,\n UserID: userId,\n }\n}\n","import type * as Spec from '@connextable/popbill-spec'\nimport type { FaxResult, FaxSearchResult, FaxSenderNumber } from '../types'\n\nexport function mapFaxResult(result: Spec.FaxResultApiModel): FaxResult {\n return {\n receiptNumber: result.receiptNum ?? undefined,\n requestNumber: result.requestNum ?? undefined,\n partnerReferenceKey: result.interOPRefKey ?? undefined,\n senderPhoneNumber: result.sendNum ?? undefined,\n senderName: result.senderName ?? undefined,\n recipientPhoneNumber: result.receiveNum ?? undefined,\n recipientName: result.receiveName ?? undefined,\n recipientNumberType: result.receiveNumType ?? undefined,\n title: result.title ?? undefined,\n fileNames: result.fileNames === undefined || result.fileNames === null ? undefined : [...result.fileNames],\n convertedFileSize: result.tiffFileSize ?? undefined,\n stateCode: result.state,\n resultCode: result.result ?? undefined,\n sentPageCount: result.sendPageCnt ?? undefined,\n successfulPageCount: result.successPageCnt ?? undefined,\n failedPageCount: result.failPageCnt ?? undefined,\n cancelledPageCount: result.cancelPageCnt ?? undefined,\n chargedPageCount: result.chargePageCnt ?? undefined,\n refundedPageCount: result.refundPageCnt ?? undefined,\n receivedAt: result.receiptDT ?? undefined,\n scheduledAt: result.reserveDT ?? undefined,\n sentAt: result.sendDT ?? undefined,\n resultReceivedAt: result.resultDT ?? undefined,\n }\n}\nexport function mapFaxSearchResult(result: Spec.FaxSearchResultApiModel): FaxSearchResult {\n return {\n code: result.code,\n message: result.message,\n pageNumber: result.pageNum,\n pageSize: result.perPage,\n pageCount: result.pageCount,\n totalCount: result.total,\n items: result.list.map(mapFaxResult),\n }\n}\nexport function mapFaxSenderNumber(result: Spec.FaxSenderNumberApiModel): FaxSenderNumber {\n return { phoneNumber: result.number, isRepresentative: result.representYN, stateCode: result.state, memo: result.memo ?? undefined }\n}\n","import type { FaxPromiseService } from '@connextable/popbill-compat/factory'\nimport { createInputValidationError } from '@connextable/popbill-compat/errors'\nimport { isValidCalendarDate8 } from '@connextable/popbill-utils'\nimport { PopbillErrorStage, type PopbillApiError } from '@/errors'\nimport { invokeFaxMethod } from './adapters/error'\nimport { mapFaxResendInput, mapFaxSendInput } from './mappers/document'\nimport { mapFaxResult, mapFaxSearchResult, mapFaxSenderNumber } from './mappers/response'\nimport type { FaxService, SearchFaxesInput } from './types'\n\ninterface CreateFaxServiceInput {\n compatFaxService: FaxPromiseService\n defaultUserId: string\n onError?: (error: PopbillApiError) => void\n}\n\n/** Converts explicit object inputs to the legacy wire adapter. */\nexport function createFaxService(input: CreateFaxServiceInput): FaxService {\n const compat = input.compatFaxService\n const userId = input.defaultUserId\n const invoke = <T>(method: keyof FaxService, handler: () => Promise<T>): Promise<T> => invokeFaxMethod(input, `fax.${method}`, handler)\n return {\n getFaxSenderRegistrationURL(request) {\n return invoke('getFaxSenderRegistrationURL', async () => ({ url: await compat.getSenderNumberMgtURL(request.businessNumber, userId) }))\n },\n getSenderNumbers(request) {\n return invoke('getSenderNumbers', async () => (await compat.getSenderNumberList(request.businessNumber, userId)).map(mapFaxSenderNumber))\n },\n checkSenderNumber(request) {\n return invoke('checkSenderNumber', () => compat.checkSenderNumber(request.businessNumber, request.senderPhoneNumber, userId))\n },\n sendFaxFromPaths(request) {\n return invoke('sendFaxFromPaths', async () => ({\n receiptNumber: await compat.sendFax(request.businessNumber, { ...mapFaxSendInput(request, userId), FilePaths: [...request.filePaths] }),\n }))\n },\n sendFaxFromBinary(request) {\n return invoke('sendFaxFromBinary', async () => ({\n receiptNumber: await compat.sendFaxBinary(request.businessNumber, {\n ...mapFaxSendInput(request, userId),\n BinaryFiles: request.files.map((file) => ({ fileName: file.fileName, fileData: file.fileData })),\n }),\n }))\n },\n resendFaxByReceipt(request) {\n return invoke('resendFaxByReceipt', async () => ({\n receiptNumber: await compat.resendFax(request.businessNumber, { ...mapFaxResendInput(request, userId), ReceiptNum: request.receiptNumber }),\n }))\n },\n resendFaxByRequest(request) {\n return invoke('resendFaxByRequest', async () => ({\n receiptNumber: await compat.resendFaxRN(request.businessNumber, {\n ...mapFaxResendInput(request, userId),\n OrgRequestNum: request.requestNumber,\n }),\n }))\n },\n cancelScheduledFaxByReceipt(request) {\n return invoke('cancelScheduledFaxByReceipt', () => compat.cancelReserve(request.businessNumber, request.receiptNumber, userId))\n },\n cancelScheduledFaxByRequest(request) {\n return invoke('cancelScheduledFaxByRequest', () => compat.cancelReserveRN(request.businessNumber, request.requestNumber, userId))\n },\n getFaxResultsByReceipt(request) {\n return invoke('getFaxResultsByReceipt', async () =>\n (await compat.getFaxResult(request.businessNumber, request.receiptNumber, userId)).map(mapFaxResult)\n )\n },\n getFaxResultsByRequest(request) {\n return invoke('getFaxResultsByRequest', async () =>\n (await compat.getFaxResultRN(request.businessNumber, request.requestNumber, userId)).map(mapFaxResult)\n )\n },\n searchFaxes(request) {\n return invoke('searchFaxes', async () => {\n const normalized = normalizeSearch(request)\n return mapFaxSearchResult(\n await compat.search(\n request.businessNumber,\n normalized.startDate,\n normalized.endDate,\n request.stateCodes === undefined ? undefined : [...request.stateCodes],\n request.scheduledOnly,\n request.currentUserOnly,\n normalized.sortOrder,\n normalized.pageNumber,\n normalized.pageSize,\n request.queryText,\n userId\n )\n )\n })\n },\n getSentFaxListURL(request) {\n return invoke('getSentFaxListURL', async () => ({ url: await compat.getSentListURL(request.businessNumber, userId) }))\n },\n getFaxPreviewURL(request) {\n return invoke('getFaxPreviewURL', async () => ({ url: await compat.getPreviewURL(request.businessNumber, request.receiptNumber, userId) }))\n },\n getUnitCost(request) {\n return invoke('getUnitCost', async () => ({ unitCost: await compat.getUnitCost(request.businessNumber, request.receiveNumberType, userId) }))\n },\n getChargeInfo(request) {\n return invoke('getChargeInfo', () => compat.getChargeInfo(request.businessNumber, request.receiveNumberType, userId))\n },\n }\n}\n\nfunction normalizeSearch(input: SearchFaxesInput) {\n const fail = (message: string): never => {\n throw createInputValidationError(message, { operation: 'fax.searchFaxes', stage: PopbillErrorStage.ValidateInput })\n }\n const date = (value: string, field: string): string => {\n if (typeof value !== 'string' || !/^\\d{8}$/.test(value.trim())) return fail(`${field}는 yyyyMMdd 형식이어야 합니다.`)\n const normalized = value.trim()\n if (!isValidCalendarDate8(normalized)) return fail(`${field}가 유효한 날짜가 아닙니다.`)\n return normalized\n }\n const startDate = date(input.startDate, 'startDate'),\n endDate = date(input.endDate, 'endDate')\n if (startDate > endDate) fail('startDate는 endDate 이후일 수 없습니다.')\n const sortOrder = input.sortOrder ?? 'D',\n pageNumber = input.pageNumber ?? 1,\n pageSize = input.pageSize ?? 500\n if (sortOrder !== 'A' && sortOrder !== 'D') fail('sortOrder가 올바르지 않습니다.')\n if (!Number.isInteger(pageNumber) || pageNumber < 1) fail('pageNumber는 1 이상의 정수여야 합니다.')\n if (!Number.isInteger(pageSize) || pageSize < 1) fail('pageSize는 1 이상의 정수여야 합니다.')\n if (input.stateCodes !== undefined && (!Array.isArray(input.stateCodes) || input.stateCodes.some((state) => typeof state !== 'string')))\n fail('stateCodes가 올바르지 않습니다.')\n return { startDate, endDate, sortOrder, pageNumber, pageSize }\n}\n","import type { CompatConfig } from '@connextable/popbill-compat/factory'\nimport { normalizeOptionalString } from '@connextable/popbill-utils'\n\nexport interface CreateCompatServiceInput {\n linkId: string\n secretKey: string\n isTest?: boolean\n useStaticIp?: boolean\n useGaIp?: boolean\n useLocalTime?: boolean\n ipRestrictOnOff?: boolean\n requestTimeoutMilliseconds?: number\n acceptLanguage?: string\n acceptEncoding?: string | null\n}\nconst configurations = new WeakMap<CreateCompatServiceInput, CompatConfig>()\n\n/** client 내부의 모든 서비스는 토큰 폐기 범위를 공유하고 다른 client와는 격리합니다. */\nexport function resolveCompatConfiguration(input: CreateCompatServiceInput): CompatConfig {\n const cached = configurations.get(input)\n if (cached) return cached\n const resolved: CompatConfig = {\n LinkID: input.linkId,\n SecretKey: input.secretKey,\n IsTest: input.isTest ?? false,\n UseStaticIP: input.useStaticIp ?? false,\n UseGAIP: input.useGaIp ?? false,\n UseLocalTimeYN: input.useLocalTime ?? true,\n IPRestrictOnOff: input.ipRestrictOnOff ?? true,\n requestTimeoutMs: input.requestTimeoutMilliseconds ?? 180_000,\n acceptLanguage: normalizeOptionalString(input.acceptLanguage),\n acceptEncoding: input.acceptEncoding === undefined ? 'gzip' : input.acceptEncoding,\n }\n configurations.set(input, resolved)\n return resolved\n}\n","import { createCommonPromiseService, type CommonPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatCommonServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatCommonService(input: CreateCompatCommonServiceInput): CommonPromiseService {\n return createCommonPromiseService(resolveCompatConfiguration(input))\n}\n","import { createTaxinvoicePromiseService, type TaxinvoicePromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration, type CreateCompatServiceInput } from './config'\n\nexport type CreateCompatTaxInvoiceServiceInput = CreateCompatServiceInput\n\nexport function createCompatTaxInvoiceService(input: CreateCompatTaxInvoiceServiceInput): TaxinvoicePromiseService {\n return createTaxinvoicePromiseService(resolveCompatConfiguration(input))\n}\n","import { createCashbillPromiseService, type CashbillPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatCashbillServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatCashbillService(input: CreateCompatCashbillServiceInput): CashbillPromiseService {\n return createCashbillPromiseService(resolveCompatConfiguration(input))\n}\n","import { createStatementPromiseService, type StatementPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatStatementServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatStatementService(input: CreateCompatStatementServiceInput): StatementPromiseService {\n return createStatementPromiseService(resolveCompatConfiguration(input))\n}\n","import { createHTTaxinvoicePromiseService, type HTTaxinvoicePromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatHomeTaxTaxInvoiceServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatHomeTaxTaxInvoiceService(input: CreateCompatHomeTaxTaxInvoiceServiceInput): HTTaxinvoicePromiseService {\n return createHTTaxinvoicePromiseService(resolveCompatConfiguration(input))\n}\n","import { createHTCashbillPromiseService, type HTCashbillPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatHomeTaxCashbillServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatHomeTaxCashbillService(input: CreateCompatHomeTaxCashbillServiceInput): HTCashbillPromiseService {\n return createHTCashbillPromiseService(resolveCompatConfiguration(input))\n}\n","import { createClosedownPromiseService, type ClosedownPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatClosedownServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatClosedownService(input: CreateCompatClosedownServiceInput): ClosedownPromiseService {\n return createClosedownPromiseService(resolveCompatConfiguration(input))\n}\n","import { createBizInfoCheckPromiseService, type BizInfoCheckPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatBizInfoCheckServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatBizInfoCheckService(input: CreateCompatBizInfoCheckServiceInput): BizInfoCheckPromiseService {\n return createBizInfoCheckPromiseService(resolveCompatConfiguration(input))\n}\n","import { createEasyFinBankPromiseService, type EasyFinBankPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatEasyFinBankServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatEasyFinBankService(input: CreateCompatEasyFinBankServiceInput): EasyFinBankPromiseService {\n return createEasyFinBankPromiseService(resolveCompatConfiguration(input))\n}\n","import { createAccountCheckPromiseService, type AccountCheckPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatAccountCheckServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatAccountCheckService(input: CreateCompatAccountCheckServiceInput): AccountCheckPromiseService {\n return createAccountCheckPromiseService(resolveCompatConfiguration(input))\n}\n","import { createKakaoPromiseService, type KakaoPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatKakaoServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatKakaoService(input: CreateCompatKakaoServiceInput): KakaoPromiseService {\n return createKakaoPromiseService(resolveCompatConfiguration(input))\n}\n","import { createMessagePromiseService, type MessagePromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatMessageServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatMessageService(input: CreateCompatMessageServiceInput): MessagePromiseService {\n return createMessagePromiseService(resolveCompatConfiguration(input))\n}\n","import { createFaxPromiseService, type FaxPromiseService } from '@connextable/popbill-compat/factory'\nimport { resolveCompatConfiguration } from './config'\nimport type { CreateCompatTaxInvoiceServiceInput } from './tax-invoice-service'\n\nexport type CreateCompatFaxServiceInput = CreateCompatTaxInvoiceServiceInput\n\nexport function createCompatFaxService(input: CreateCompatFaxServiceInput): FaxPromiseService {\n return createFaxPromiseService(resolveCompatConfiguration(input))\n}\n","import type { PopbillClient, PopbillClientConfig } from './types'\nexport type { PopbillClient, PopbillClientConfig } from './types'\nimport { createCommonService } from '@/services/common'\nimport { createTaxInvoiceService } from '@/services/tax-invoice'\nimport { createCashbillService } from '@/services/cashbill'\nimport { createStatementService } from '@/services/statement'\nimport { createHomeTaxTaxInvoiceService } from '@/services/home-tax-tax-invoice'\nimport { createHomeTaxCashbillService } from '@/services/home-tax-cashbill'\nimport { createClosedownService } from '@/services/closedown'\nimport { createBizInfoCheckService } from '@/services/biz-info-check'\nimport { createEasyFinBankService } from '@/services/easy-fin-bank'\nimport { createAccountCheckService } from '@/services/account-check'\nimport { createKakaoService } from '@/services/kakao'\nimport { createMessageService } from '@/services/message'\nimport { createFaxService } from '@/services/fax'\nimport * as bridges from '@/internal/compat'\nimport type { PopbillApiError } from '@/errors'\nimport { isValidTimeoutMilliseconds, MAX_TIMEOUT_MILLISECONDS, normalizeOptionalString, normalizeRequiredString } from '@connextable/popbill-utils'\n\nconst DEFAULT_REQUEST_TIMEOUT_MILLISECONDS = 180_000\nconst DEFAULT_ACCEPT_ENCODING = 'gzip'\n\ninterface ResolvedPopbillClientConfig {\n linkId: string\n secretKey: string\n userId: string\n isTest: boolean\n useStaticIp: boolean\n useGaIp: boolean\n useLocalTime: boolean\n ipRestrictOnOff: boolean\n acceptEncoding: string | null\n acceptLanguage?: string\n requestTimeoutMilliseconds: number\n onError?: (error: PopbillApiError) => void\n}\n\n/**\n * modern Popbill client를 생성합니다.\n */\nexport function createPopbillClient(config: PopbillClientConfig): PopbillClient {\n const normalizedConfig = normalizeClientConfiguration(config)\n const serviceInput = { defaultUserId: normalizedConfig.userId, onError: normalizedConfig.onError }\n\n return {\n services: {\n common: createCommonService({\n ...serviceInput,\n linkId: normalizedConfig.linkId,\n compatCommonService: bridges.createCompatCommonService(normalizedConfig),\n }),\n taxInvoice: createTaxInvoiceService({ ...serviceInput, compatTaxInvoiceService: bridges.createCompatTaxInvoiceService(normalizedConfig) }),\n cashbill: createCashbillService({ ...serviceInput, compatCashbillService: bridges.createCompatCashbillService(normalizedConfig) }),\n statement: createStatementService({ ...serviceInput, compatStatementService: bridges.createCompatStatementService(normalizedConfig) }),\n homeTaxTaxInvoice: createHomeTaxTaxInvoiceService({\n ...serviceInput,\n compatHTTaxinvoiceService: bridges.createCompatHomeTaxTaxInvoiceService(normalizedConfig),\n }),\n homeTaxCashbill: createHomeTaxCashbillService({\n ...serviceInput,\n compatHomeTaxCashbillService: bridges.createCompatHomeTaxCashbillService(normalizedConfig),\n }),\n closedown: createClosedownService({ ...serviceInput, compatClosedownService: bridges.createCompatClosedownService(normalizedConfig) }),\n bizInfoCheck: createBizInfoCheckService({\n ...serviceInput,\n compatBizInfoCheckService: bridges.createCompatBizInfoCheckService(normalizedConfig),\n }),\n easyFinBank: createEasyFinBankService({ ...serviceInput, compatEasyFinBankService: bridges.createCompatEasyFinBankService(normalizedConfig) }),\n accountCheck: createAccountCheckService({\n ...serviceInput,\n compatAccountCheckService: bridges.createCompatAccountCheckService(normalizedConfig),\n }),\n kakao: createKakaoService({ ...serviceInput, compatKakaoService: bridges.createCompatKakaoService(normalizedConfig) }),\n message: createMessageService({ ...serviceInput, compatMessageService: bridges.createCompatMessageService(normalizedConfig) }),\n fax: createFaxService({ ...serviceInput, compatFaxService: bridges.createCompatFaxService(normalizedConfig) }),\n },\n }\n}\n\n/**\n * 입력 설정을 런타임 안전성 기준으로 정규화합니다.\n */\nfunction normalizeClientConfiguration(config: PopbillClientConfig): ResolvedPopbillClientConfig {\n const linkId = normalizeRequiredString(config.linkId, 'linkId는 필수입니다.')\n const secretKey = normalizeRequiredString(config.secretKey, 'secretKey는 필수입니다.')\n const userId = normalizeRequiredString(config.userId, 'userId는 필수입니다.')\n\n return {\n linkId,\n secretKey,\n userId,\n isTest: config.isTest ?? false,\n useStaticIp: config.useStaticIp ?? false,\n useGaIp: config.useGaIp ?? false,\n useLocalTime: config.useLocalTime ?? true,\n ipRestrictOnOff: config.ipRestrictOnOff ?? true,\n acceptEncoding: config.acceptEncoding === undefined ? DEFAULT_ACCEPT_ENCODING : config.acceptEncoding,\n acceptLanguage: normalizeOptionalString(config.acceptLanguage),\n requestTimeoutMilliseconds: normalizeRequestTimeoutMilliseconds(config.requestTimeoutMs),\n onError: config.onError,\n }\n}\n\nfunction normalizeRequestTimeoutMilliseconds(requestTimeoutMs: number | undefined): number {\n if (requestTimeoutMs === undefined) {\n return DEFAULT_REQUEST_TIMEOUT_MILLISECONDS\n }\n\n if (!isValidTimeoutMilliseconds(requestTimeoutMs)) {\n throw new Error(`requestTimeoutMs는 1 이상 ${MAX_TIMEOUT_MILLISECONDS} 이하의 정수여야 합니다.`)\n }\n\n return requestTimeoutMs\n}\n","import type { TaxInvoiceService } from './types'\n\nexport const TAX_INVOICE_METHODS = [\n // 발행/전송\n 'issueInvoiceImmediately',\n 'submitBulkIssue',\n 'getBulkIssueSubmissionResult',\n 'registerInvoice',\n 'updateInvoice',\n 'issueInvoice',\n 'cancelIssuedInvoice',\n 'requestReverseIssueImmediately',\n 'requestReverseIssue',\n 'cancelReverseIssueRequest',\n 'refuseReverseIssueRequest',\n 'sendInvoice',\n 'cancelInvoiceSend',\n 'acceptInvoice',\n 'denyInvoice',\n 'deleteInvoice',\n 'sendInvoiceToNTS',\n // 정보확인\n 'getInvoiceInfo',\n 'getInvoicesInfo',\n 'getInvoiceDetailInfo',\n 'checkInvoiceManagementKeyInUse',\n 'getInvoiceXML',\n 'downloadInvoicePDF',\n 'searchInvoices',\n 'getInvoiceLogs',\n 'getTaxInvoiceBoxURL',\n // 보기/인쇄\n 'getInvoicePopupURL',\n 'getInvoiceViewURL',\n 'getSupplierInvoicePrintURL',\n 'getBuyerInvoicePrintURL',\n 'getLegacyInvoicePrintURL',\n 'getBulkInvoicePrintURL',\n 'getInvoiceMailURL',\n 'getInvoicePDFURL',\n // 부가기능\n 'getSealAndAttachmentRegistrationURL',\n 'attachFileFromPath',\n 'attachFileFromBinary',\n 'deleteAttachedFile',\n 'getAttachedFiles',\n 'resendInvoiceEmail',\n 'resendInvoiceSMS',\n 'resendInvoiceFAX',\n 'attachInvoiceStatement',\n 'detachInvoiceStatement',\n 'assignInvoiceManagementKey',\n 'getEmailSendSettings',\n 'updateEmailSendSettings',\n 'getSendToNTSSettings',\n 'getEmailPublicKeys',\n // 인증서 관리\n 'getTaxCertificateRegistrationURL',\n 'getTaxCertificateExpirationDate',\n 'checkTaxCertificateValidation',\n 'getTaxCertificateInfo',\n // 과금정보\n 'getChargeInfo',\n 'getUnitCost',\n] as const satisfies readonly (keyof TaxInvoiceService)[]\n","import type { StatementService } from './types'\n\nexport const STATEMENT_METHODS = [\n // 발행/취소\n 'issueStatementImmediately',\n 'registerStatement',\n 'updateStatement',\n 'issueStatement',\n 'cancelIssuedStatement',\n 'deleteStatement',\n // 정보확인\n 'getStatementInfo',\n 'getStatementsInfo',\n 'getStatementDetailInfo',\n 'checkStatementManagementKeyInUse',\n 'searchStatements',\n 'getStatementLogs',\n 'getStatementBoxURL',\n // 보기/인쇄\n 'getStatementPopupURL',\n 'getStatementViewURL',\n 'getSenderStatementPrintURL',\n 'getReceiverStatementPrintURL',\n 'getBulkStatementPrintURL',\n 'getStatementMailURL',\n // 부가기능\n 'getSealAndAttachmentRegistrationURL',\n 'attachFileFromPath',\n 'attachFileFromBinary',\n 'deleteAttachedFile',\n 'getAttachedFiles',\n 'resendStatementEmail',\n 'resendStatementSMS',\n 'resendStatementFAX',\n 'sendStatementFAX',\n 'attachStatement',\n 'detachStatement',\n 'getEmailSendSettings',\n 'updateEmailSendSettings',\n // 과금정보\n 'getChargeInfo',\n 'getUnitCost',\n] as const satisfies readonly (keyof StatementService)[]\n","import type { HomeTaxCashbillService } from './types'\n\nexport const HOME_TAX_CASHBILL_METHODS = [\n // 인증관리\n 'getAuthenticationRegistrationUrl',\n 'getCertificateExpiration',\n 'validateCertificate',\n 'registerDepartmentUser',\n 'checkDepartmentUserRegistration',\n 'validateDepartmentUser',\n 'deleteDepartmentUser',\n // 수집 요청/상태\n 'requestCollection',\n 'getCollectionJobState',\n 'listActiveCollectionJobs',\n // 정보확인\n 'searchCashbills',\n 'getCashbillSummary',\n // 정액제/과금\n 'getFlatRateRegistrationUrl',\n 'getFlatRateState',\n 'getChargeInfo',\n] as const satisfies readonly (keyof HomeTaxCashbillService)[]\n","export const CLOSEDOWN_METHODS = [\n // 정보조회\n 'checkBusinessStatus',\n 'checkBusinessStatuses',\n // 과금정보\n 'getChargeInfo',\n 'getUnitCost',\n] as const\n","export const BIZ_INFO_CHECK_METHODS = [\n // 정보조회\n 'getCompanyInfo',\n // 과금정보\n 'getChargeInfo',\n 'getUnitCost',\n] as const\n","export const ACCOUNT_CHECK_METHODS = [\n // 정보조회\n 'checkAccountHolderName',\n 'verifyAccountHolderIdentity',\n // 과금정보\n 'getChargeInfo',\n 'getUnitCost',\n] as const\n","import type { FaxService } from './types'\n\nexport const FAX_METHODS = [\n // 발신번호\n 'getFaxSenderRegistrationURL',\n 'getSenderNumbers',\n 'checkSenderNumber',\n // 팩스 전송\n 'sendFaxFromPaths',\n 'sendFaxFromBinary',\n 'resendFaxByReceipt',\n 'resendFaxByRequest',\n // 예약취소\n 'cancelScheduledFaxByReceipt',\n 'cancelScheduledFaxByRequest',\n // 결과조회\n 'getFaxResultsByReceipt',\n 'getFaxResultsByRequest',\n 'searchFaxes',\n 'getSentFaxListURL',\n 'getFaxPreviewURL',\n // 과금정보\n 'getUnitCost',\n 'getChargeInfo',\n] as const satisfies readonly (keyof FaxService)[]\n"],"mappings":"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"}