@lapyme/arca 0.1.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.
- package/LICENSE +21 -0
- package/README.md +178 -0
- package/dist/errors.d.ts +43 -0
- package/dist/errors.js +53 -0
- package/dist/errors.js.map +1 -0
- package/dist/index-vWZOjFDO.d.ts +11 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.js +1387 -0
- package/dist/index.js.map +1 -0
- package/dist/padron.d.ts +31 -0
- package/dist/padron.js +118 -0
- package/dist/padron.js.map +1 -0
- package/dist/types-DWsYue4B.d.ts +53 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/wsfe.d.ts +124 -0
- package/dist/wsfe.js +340 -0
- package/dist/wsfe.js.map +1 -0
- package/dist/wsmtxca.d.ts +53 -0
- package/dist/wsmtxca.js +247 -0
- package/dist/wsmtxca.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/services/padron.ts","../src/services/wsfe.ts","../src/services/wsmtxca.ts","../src/internal/http.ts","../src/internal/xml.ts","../src/soap/index.ts","../src/wsaa/index.ts","../src/client.ts"],"sourcesContent":["/** Base error class for all ARCA-related errors. */\nexport class ArcaError extends Error {\n readonly code: string;\n override readonly name: string = \"ArcaError\";\n\n constructor(message: string, code = \"ARCA_ERROR\", options?: ErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** Thrown when the ARCA client configuration is missing or invalid. */\nexport class ArcaConfigurationError extends ArcaError {\n override readonly name: string = \"ArcaConfigurationError\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"ARCA_CONFIGURATION_ERROR\", options);\n }\n}\n\nclass ArcaNotImplementedError extends ArcaError {\n override readonly name: string = \"ArcaNotImplementedError\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"ARCA_NOT_IMPLEMENTED\", options);\n }\n}\n\n/** Thrown when an HTTP request to an ARCA endpoint fails at the transport level. */\nexport class ArcaTransportError extends ArcaError {\n override readonly name: string = \"ArcaTransportError\";\n readonly statusCode?: number;\n readonly responseBody?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n statusCode?: number;\n responseBody?: string;\n }\n ) {\n super(message, \"ARCA_TRANSPORT_ERROR\", options);\n this.statusCode = options?.statusCode;\n this.responseBody = options?.responseBody;\n }\n}\n\n/** Thrown when the SOAP response contains a Fault element. */\nexport class ArcaSoapFaultError extends ArcaError {\n override readonly name: string = \"ArcaSoapFaultError\";\n readonly faultCode?: string;\n readonly detail?: unknown;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n faultCode?: string;\n detail?: unknown;\n }\n ) {\n super(message, \"ARCA_SOAP_FAULT\", options);\n this.faultCode = options?.faultCode;\n this.detail = options?.detail;\n }\n}\n\n/** Thrown when an ARCA service (WSFE, WSMTXCA, Padron) returns a domain-level error. */\nexport class ArcaServiceError extends ArcaError {\n override readonly name: string = \"ArcaServiceError\";\n readonly serviceCode?: string | number;\n readonly detail?: unknown;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n serviceCode?: string | number;\n detail?: unknown;\n }\n ) {\n super(message, \"ARCA_SERVICE_ERROR\", options);\n this.serviceCode = options?.serviceCode;\n this.detail = options?.detail;\n }\n}\n","import { ArcaConfigurationError } from \"./errors\";\nimport type {\n ArcaClientConfig,\n ArcaEnvironment,\n ArcaServiceName,\n ArcaSoapVersion,\n ArcaWsaaCacheConfig,\n} from \"./internal/types\";\n\n/** Valid ARCA environment names. */\nexport const ARCA_ENVIRONMENTS = [\"production\", \"test\"] as const;\n\n/** Default environment variable names read by {@link createArcaClientConfigFromEnv}. */\nexport const ARCA_ENV_VARIABLES = {\n taxId: \"ARCA_TAX_ID\",\n certificatePem: \"ARCA_CERTIFICATE_PEM\",\n privateKeyPem: \"ARCA_PRIVATE_KEY_PEM\",\n environment: \"ARCA_ENVIRONMENT\",\n wsaaCacheMode: \"ARCA_WSAA_CACHE_MODE\",\n wsaaCacheDirectory: \"ARCA_WSAA_CACHE_DIRECTORY\",\n} as const;\n\ntype ArcaClientConfigEnvironment = Record<string, string | undefined>;\n/** Options for {@link createArcaClientConfigFromEnv}. */\nexport type CreateArcaClientConfigFromEnvOptions = {\n env?: ArcaClientConfigEnvironment;\n defaultEnvironment?: ArcaEnvironment;\n variableNames?: Partial<typeof ARCA_ENV_VARIABLES>;\n};\n\nconst PRIVATE_KEY_PEM_PREFIXES = [\n \"-----BEGIN PRIVATE KEY-----\",\n \"-----BEGIN RSA PRIVATE KEY-----\",\n \"-----BEGIN ENCRYPTED PRIVATE KEY-----\",\n] as const;\n\n/** Returns `\"production\"` or `\"test\"` based on the boolean flag. */\nexport function resolveArcaEnvironment(production: boolean): ArcaEnvironment {\n return production ? \"production\" : \"test\";\n}\n\n/**\n * Builds an {@link ArcaClientConfig} from environment variables.\n * Reads `process.env` by default; override with `options.env`.\n *\n * @throws {ArcaConfigurationError} When required variables are missing or invalid.\n */\nexport function createArcaClientConfigFromEnv(\n options: CreateArcaClientConfigFromEnvOptions = {}\n): ArcaClientConfig {\n const env = options.env ?? process.env;\n const variableNames = {\n ...ARCA_ENV_VARIABLES,\n ...options.variableNames,\n };\n const environmentInput = readEnv(env, variableNames.environment);\n const environmentValue = normalizeEnvironmentValue(environmentInput);\n const cacheModeInput = readEnv(env, variableNames.wsaaCacheMode);\n const cacheModeValue = normalizeCacheMode(cacheModeInput);\n\n const config: ArcaClientConfig = {\n taxId: readEnv(env, variableNames.taxId) ?? \"\",\n certificatePem: readEnv(env, variableNames.certificatePem) ?? \"\",\n privateKeyPem: readEnv(env, variableNames.privateKeyPem) ?? \"\",\n environment:\n environmentValue ??\n (environmentInput as ArcaEnvironment | undefined) ??\n options.defaultEnvironment ??\n \"test\",\n };\n\n if (cacheModeValue === \"disk\" || cacheModeInput === \"disk\") {\n config.wsaa = {\n cache: {\n mode: (cacheModeValue ?? cacheModeInput) as \"disk\",\n directory: readEnv(env, variableNames.wsaaCacheDirectory) ?? \"\",\n },\n };\n } else if (cacheModeValue === \"memory\" || cacheModeInput !== undefined) {\n config.wsaa = {\n cache: {\n mode: (cacheModeValue ?? cacheModeInput) as ArcaWsaaCacheConfig[\"mode\"],\n } as ArcaWsaaCacheConfig,\n };\n }\n\n assertArcaClientConfig(config);\n return normalizeArcaClientConfig(config);\n}\n\n/**\n * Validates an {@link ArcaClientConfig} and throws if any field is invalid.\n *\n * @throws {ArcaConfigurationError} With a list of invalid field names.\n */\nexport function assertArcaClientConfig(config: ArcaClientConfig): void {\n const invalidFields: string[] = [];\n const normalized = normalizeArcaClientConfig(config);\n\n if (!/^\\d{11}$/.test(normalized.taxId)) {\n invalidFields.push(\"taxId\");\n }\n\n if (!normalized.certificatePem.startsWith(\"-----BEGIN CERTIFICATE-----\")) {\n invalidFields.push(\"certificatePem\");\n }\n\n if (\n !PRIVATE_KEY_PEM_PREFIXES.some((prefix) =>\n normalized.privateKeyPem.startsWith(prefix)\n )\n ) {\n invalidFields.push(\"privateKeyPem\");\n }\n\n if (!ARCA_ENVIRONMENTS.includes(normalized.environment)) {\n invalidFields.push(\"environment\");\n }\n\n const cacheConfig = config.wsaa?.cache;\n if (cacheConfig) {\n const cacheMode = cacheConfig.mode?.trim().toLowerCase() ?? \"memory\";\n if (cacheMode !== \"memory\" && cacheMode !== \"disk\") {\n invalidFields.push(\"wsaa.cache.mode\");\n }\n\n if (\n cacheMode === \"disk\" &&\n (!(\"directory\" in cacheConfig) || cacheConfig.directory.trim().length < 1)\n ) {\n invalidFields.push(\"wsaa.cache.directory\");\n }\n }\n\n if (invalidFields.length > 0) {\n throw new ArcaConfigurationError(\n `Missing or invalid ARCA client config fields: ${invalidFields.join(\", \")}`\n );\n }\n}\n\nexport type ArcaServiceConfig = {\n namespace: string;\n endpoint: Record<ArcaEnvironment, string>;\n soapVersion: ArcaSoapVersion;\n soapActionBase: string;\n usesEmptySoapAction?: boolean;\n useLegacyTlsSecurityLevel0?: boolean;\n};\n\nexport const ARCA_WSAA_CONFIG: ArcaServiceConfig = {\n namespace: \"http://wsaa.view.sua.dvadac.desein.afip.gov\",\n endpoint: {\n production: \"https://wsaa.afip.gov.ar/ws/services/LoginCms\",\n test: \"https://wsaahomo.afip.gov.ar/ws/services/LoginCms\",\n },\n soapVersion: \"1.1\",\n soapActionBase: \"\",\n usesEmptySoapAction: true,\n};\n\nexport const ARCA_SERVICE_CONFIG: Record<ArcaServiceName, ArcaServiceConfig> = {\n wsaa: ARCA_WSAA_CONFIG,\n wsfe: {\n namespace: \"http://ar.gov.afip.dif.FEV1/\",\n endpoint: {\n production: \"https://servicios1.afip.gov.ar/wsfev1/service.asmx\",\n test: \"https://wswhomo.afip.gov.ar/wsfev1/service.asmx\",\n },\n soapVersion: \"1.2\",\n soapActionBase: \"http://ar.gov.afip.dif.FEV1/\",\n useLegacyTlsSecurityLevel0: true,\n },\n wsmtxca: {\n namespace: \"http://impl.service.wsmtxca.afip.gov.ar/service/\",\n endpoint: {\n production:\n \"https://serviciosjava.afip.gov.ar/wsmtxca/services/MTXCAService\",\n test: \"https://fwshomo.afip.gov.ar/wsmtxca/services/MTXCAService\",\n },\n soapVersion: \"1.1\",\n soapActionBase: \"http://impl.service.wsmtxca.afip.gov.ar/service/\",\n },\n \"padron-a5\": {\n namespace: \"http://a5.soap.ws.server.puc.sr/\",\n endpoint: {\n production:\n \"https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA5\",\n test: \"https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5\",\n },\n soapVersion: \"1.1\",\n soapActionBase: \"\",\n usesEmptySoapAction: true,\n },\n \"padron-a13\": {\n namespace: \"http://a13.soap.ws.server.puc.sr/\",\n endpoint: {\n production:\n \"https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA13\",\n test: \"https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA13\",\n },\n soapVersion: \"1.1\",\n soapActionBase: \"\",\n usesEmptySoapAction: true,\n },\n};\n\nexport function getArcaServiceConfig(\n service: ArcaServiceName\n): ArcaServiceConfig {\n const serviceConfig = ARCA_SERVICE_CONFIG[service];\n if (!serviceConfig) {\n throw new ArcaConfigurationError(\n `Unsupported ARCA service configuration: ${service}`\n );\n }\n return serviceConfig;\n}\n\nexport function normalizeArcaClientConfig(\n config: ArcaClientConfig\n): ArcaClientConfig {\n const normalizedEnvironment =\n normalizeEnvironmentValue(String(config.environment)) ?? config.environment;\n const normalizedCache = normalizeWsaaCacheConfig(config.wsaa?.cache);\n\n return {\n taxId: config.taxId.trim(),\n certificatePem: config.certificatePem.trim(),\n privateKeyPem: config.privateKeyPem.trim(),\n environment: normalizedEnvironment,\n ...(normalizedCache\n ? {\n wsaa: {\n cache: normalizedCache,\n },\n }\n : {}),\n };\n}\n\nfunction normalizeWsaaCacheConfig(\n cache: ArcaWsaaCacheConfig | undefined\n): ArcaWsaaCacheConfig | undefined {\n if (!cache) {\n return undefined;\n }\n\n const mode = normalizeCacheMode(cache.mode) ?? \"memory\";\n if (mode !== \"disk\") {\n return {\n mode: \"memory\",\n };\n }\n\n return {\n mode,\n directory: (\"directory\" in cache ? cache.directory : \"\").trim(),\n };\n}\n\nfunction normalizeEnvironmentValue(value: string | undefined) {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n if (ARCA_ENVIRONMENTS.includes(normalized as ArcaEnvironment)) {\n return normalized as ArcaEnvironment;\n }\n\n return undefined;\n}\n\nfunction normalizeCacheMode(value: string | undefined) {\n if (!value) {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n if (normalized === \"memory\" || normalized === \"disk\") {\n return normalized;\n }\n\n return undefined;\n}\n\nfunction readEnv(\n env: ArcaClientConfigEnvironment,\n variableName: string\n): string | undefined {\n return env[variableName]?.trim() || undefined;\n}\n","import { ArcaSoapFaultError } from \"../errors\";\nimport type { SoapTransport } from \"../soap\";\nimport type {\n ArcaClientConfig,\n ArcaPadronServiceName,\n} from \"../internal/types\";\nimport type { WsaaAuthModule } from \"../wsaa\";\n\n/** Result of a taxpayer lookup via Padron A5. */\nexport type PadronTaxpayerResult = {\n taxId: string;\n personType?: string;\n name?: string;\n raw: Record<string, unknown>;\n};\n\n/** Result of a tax ID lookup by document number via Padron A13. */\nexport type PadronTaxIdLookupResult = {\n taxIds: string[];\n raw: Record<string, unknown>;\n};\n\n/** Padron taxpayer registry service. */\nexport type PadronService = {\n /** Looks up taxpayer details by CUIT. Returns `null` if the taxpayer does not exist. */\n getTaxpayerDetails(\n taxId: number | string\n ): Promise<PadronTaxpayerResult | null>;\n /** Looks up CUITs associated with a document number. Returns `null` if not found. */\n getTaxIdByDocument(\n documentNumber: number | string\n ): Promise<PadronTaxIdLookupResult | null>;\n};\n\nexport type CreatePadronServiceOptions = {\n config: ArcaClientConfig;\n auth: WsaaAuthModule;\n soap: SoapTransport;\n};\n\n/** Creates a Padron service instance wired with authentication and SOAP transport. */\nexport function createPadronService(\n options: CreatePadronServiceOptions\n): PadronService {\n return {\n async getTaxpayerDetails(taxId) {\n const raw = await executePadronOperation(\n options,\n \"padron-a5\",\n \"getPersona_v2\",\n {\n idPersona: Number.parseInt(String(taxId), 10),\n }\n );\n if (!raw) {\n return null;\n }\n const record = raw as Record<string, unknown>;\n const datosGenerales = record.datosGenerales as\n | Record<string, unknown>\n | undefined;\n return {\n taxId: String(record.idPersona ?? \"\"),\n ...(record.tipoPersona !== undefined\n ? { personType: String(record.tipoPersona) }\n : {}),\n ...(datosGenerales\n ? { name: extractPadronName(datosGenerales) }\n : {}),\n raw: record,\n };\n },\n async getTaxIdByDocument(documentNumber) {\n const raw = await executePadronOperation(\n options,\n \"padron-a13\",\n \"getIdPersonaListByDocumento\",\n {\n documento: String(documentNumber),\n }\n );\n if (!raw) {\n return null;\n }\n const record = raw as Record<string, unknown>;\n const idPersona = record.idPersona;\n const taxIds = Array.isArray(idPersona)\n ? idPersona.map(String)\n : idPersona !== undefined\n ? [String(idPersona)]\n : [];\n return {\n taxIds,\n raw: record,\n };\n },\n };\n}\n\nfunction extractPadronName(\n datosGenerales: Record<string, unknown>\n): string | undefined {\n if (typeof datosGenerales.razonSocial === \"string\") {\n return datosGenerales.razonSocial;\n }\n const nombre = datosGenerales.nombre;\n const apellido = datosGenerales.apellido;\n if (typeof apellido === \"string\" && typeof nombre === \"string\") {\n return `${apellido} ${nombre}`.trim();\n }\n if (typeof apellido === \"string\") {\n return apellido;\n }\n if (typeof nombre === \"string\") {\n return nombre;\n }\n return undefined;\n}\n\nasync function executePadronOperation(\n options: CreatePadronServiceOptions,\n service: ArcaPadronServiceName,\n operation: string,\n body: Record<string, unknown>\n) {\n const auth = await options.auth.login(\n service === \"padron-a5\"\n ? \"ws_sr_constancia_inscripcion\"\n : \"ws_sr_padron_a13\"\n );\n\n try {\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service,\n operation,\n bodyElementNamespaceMode: \"prefix\",\n body: {\n token: auth.token,\n sign: auth.sign,\n cuitRepresentada: Number.parseInt(options.config.taxId, 10),\n ...body,\n },\n });\n\n const operationResponse = response.result as Record<string, unknown>;\n\n if (operation === \"getPersona_v2\") {\n return operationResponse.personaReturn ?? null;\n }\n\n if (operation === \"getIdPersonaListByDocumento\") {\n return operationResponse.idPersonaListReturn ?? null;\n }\n\n return operationResponse.return ?? null;\n } catch (error) {\n if (\n error instanceof ArcaSoapFaultError &&\n error.message.toLowerCase().includes(\"no existe\")\n ) {\n return null;\n }\n\n throw error;\n }\n}\n","import { ArcaServiceError } from \"../errors\";\nimport type { SoapTransport } from \"../soap\";\nimport type { ArcaClientConfig } from \"../internal/types\";\nimport type { WsaaAuthModule } from \"../wsaa\";\n\n/** An associated voucher referenced by a WSFE invoice request. */\nexport type WsfeAssociatedVoucher = {\n type: number;\n salesPoint: number;\n number: number;\n taxId?: string;\n voucherDate?: string;\n};\n\n/** A tax (tributo) item in a WSFE invoice request. */\nexport type WsfeTax = {\n id: number;\n description?: string;\n baseAmount: number;\n rate: number;\n amount: number;\n};\n\n/** A VAT rate (alícuota IVA) item in a WSFE invoice request. */\nexport type WsfeVatRate = {\n id: number;\n baseAmount: number;\n amount: number;\n};\n\n/** An optional field (campo opcional) in a WSFE invoice request. */\nexport type WsfeOptionalField = {\n id: string;\n value: string;\n};\n\n/** A buyer (comprador) in a WSFE invoice request. */\nexport type WsfeBuyer = {\n documentType: number;\n documentNumber: number;\n percentage: number;\n};\n\n/** Input data for creating a new WSFE voucher via {@link WsfeService.createNextVoucher}. */\nexport type WsfeVoucherInput = {\n salesPoint: number;\n voucherType: number;\n concept: number;\n documentType: number;\n documentNumber: number;\n receiverVatConditionId?: number;\n voucherDate: string;\n totalAmount: number;\n nonTaxableAmount: number;\n netAmount: number;\n exemptAmount: number;\n taxAmount: number;\n vatAmount: number;\n currencyId: string;\n exchangeRate: number;\n serviceStartDate?: string;\n serviceEndDate?: string;\n paymentDueDate?: string;\n associatedVouchers?: WsfeAssociatedVoucher[];\n taxes?: WsfeTax[];\n vatRates?: WsfeVatRate[];\n optionalFields?: WsfeOptionalField[];\n buyers?: WsfeBuyer[];\n};\n\n/** Result of a successful WSFE voucher authorization. */\nexport type WsfeAuthorizationResult = {\n cae: string;\n caeExpiry: string;\n voucherNumber: number;\n raw: Record<string, unknown>;\n};\n\n/** A point-of-sale entry returned by {@link WsfeService.getSalesPoints}. */\nexport type WsfeSalesPoint = {\n number: number;\n emissionType?: string;\n blocked?: string;\n deletedSince?: string;\n};\n\n/** Voucher details returned by {@link WsfeService.getVoucherInfo}. */\nexport type WsfeVoucherInfo = {\n voucherNumber: number;\n voucherDate?: string;\n salesPoint?: number;\n voucherType?: number;\n totalAmount?: number;\n result?: string;\n cae?: string;\n caeExpiry?: string;\n raw: Record<string, unknown>;\n};\n\n/** WSFE electronic invoicing service. */\nexport type WsfeService = {\n /** Authorizes a new voucher by fetching the next number and requesting a CAE. */\n createNextVoucher(input: {\n representedTaxId?: number | string;\n data: WsfeVoucherInput;\n }): Promise<WsfeAuthorizationResult>;\n /** Returns the next available voucher number for the given sales point and type. */\n getLastVoucher(input: {\n representedTaxId?: number | string;\n salesPoint: number;\n voucherType: number;\n forceAuthRefresh?: boolean;\n }): Promise<number>;\n /** Lists all configured points of sale for the taxpayer. */\n getSalesPoints(input: {\n representedTaxId?: number | string;\n forceAuthRefresh?: boolean;\n }): Promise<WsfeSalesPoint[]>;\n /** Retrieves details for a specific voucher. Returns `null` if not found. */\n getVoucherInfo(input: {\n representedTaxId?: number | string;\n number: number;\n salesPoint: number;\n voucherType: number;\n }): Promise<WsfeVoucherInfo | null>;\n};\n\nexport type CreateWsfeServiceOptions = {\n config: ArcaClientConfig;\n auth: WsaaAuthModule;\n soap: SoapTransport;\n};\n\n/** Creates a WSFE service instance wired with authentication and SOAP transport. */\nexport function createWsfeService(\n options: CreateWsfeServiceOptions\n): WsfeService {\n async function getLastVoucher({\n representedTaxId,\n salesPoint,\n voucherType,\n forceAuthRefresh,\n }: {\n representedTaxId?: number | string;\n salesPoint: number;\n voucherType: number;\n forceAuthRefresh?: boolean;\n }) {\n const auth = await options.auth.login(\"wsfe\", {\n representedTaxId,\n forceRefresh: forceAuthRefresh,\n });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsfe\",\n operation: \"FECompUltimoAutorizado\",\n body: {\n Auth: createWsfeAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n PtoVta: salesPoint,\n CbteTipo: voucherType,\n },\n });\n const result = unwrapWsfeOperationResult(\n \"FECompUltimoAutorizado\",\n response.result\n );\n return Number(result.CbteNro ?? 0) + 1;\n }\n\n return {\n async createNextVoucher({ representedTaxId, data }) {\n const voucherNumber = await getLastVoucher({\n representedTaxId,\n salesPoint: data.salesPoint,\n voucherType: data.voucherType,\n });\n\n const requestData = mapWsfeVoucherInput(data, voucherNumber);\n\n const auth = await options.auth.login(\"wsfe\", { representedTaxId });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsfe\",\n operation: \"FECAESolicitar\",\n body: {\n Auth: createWsfeAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n FeCAEReq: {\n FeCabReq: {\n CantReg: 1,\n PtoVta: data.salesPoint,\n CbteTipo: data.voucherType,\n },\n FeDetReq: {\n FECAEDetRequest: requestData,\n },\n },\n },\n });\n\n const result = unwrapWsfeOperationResult(\n \"FECAESolicitar\",\n response.result\n );\n const detailResponse = normalizeWsfeDetailResponse(result);\n const cae = detailResponse.CAE;\n const caeExpiry = detailResponse.CAEFchVto;\n\n if (typeof cae !== \"string\" || typeof caeExpiry !== \"string\") {\n throw new ArcaServiceError(\n \"WSFE did not return CAE authorization data\",\n { detail: result }\n );\n }\n\n return {\n cae,\n caeExpiry: String(caeExpiry),\n voucherNumber,\n raw: result,\n };\n },\n getLastVoucher,\n async getSalesPoints({ representedTaxId, forceAuthRefresh }) {\n const auth = await options.auth.login(\"wsfe\", {\n representedTaxId,\n forceRefresh: forceAuthRefresh,\n });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsfe\",\n operation: \"FEParamGetPtosVenta\",\n body: {\n Auth: createWsfeAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n },\n });\n const result = unwrapWsfeOperationResult(\n \"FEParamGetPtosVenta\",\n response.result\n );\n const resultGet = result.ResultGet as Record<string, unknown> | undefined;\n const rawPoints = resultGet?.PtoVenta;\n if (!rawPoints) {\n return [];\n }\n const entries = Array.isArray(rawPoints) ? rawPoints : [rawPoints];\n return entries.map(mapWsfeSalesPoint);\n },\n async getVoucherInfo({\n representedTaxId,\n number,\n salesPoint,\n voucherType,\n }) {\n const auth = await options.auth.login(\"wsfe\", { representedTaxId });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsfe\",\n operation: \"FECompConsultar\",\n body: {\n Auth: createWsfeAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n FeCompConsReq: {\n CbteNro: number,\n PtoVta: salesPoint,\n CbteTipo: voucherType,\n },\n },\n });\n const result = unwrapWsfeOperationResult(\n \"FECompConsultar\",\n response.result\n );\n const raw = (result.ResultGet as Record<string, unknown> | null) ?? null;\n if (!raw) {\n return null;\n }\n return mapWsfeVoucherInfo(raw);\n },\n };\n}\n\nfunction mapWsfeVoucherInput(\n input: WsfeVoucherInput,\n voucherNumber: number\n): Record<string, unknown> {\n const data: Record<string, unknown> = {\n Concepto: input.concept,\n DocTipo: input.documentType,\n DocNro: input.documentNumber,\n CbteDesde: voucherNumber,\n CbteHasta: voucherNumber,\n CbteFch: input.voucherDate,\n ImpTotal: input.totalAmount,\n ImpTotConc: input.nonTaxableAmount,\n ImpNeto: input.netAmount,\n ImpOpEx: input.exemptAmount,\n ImpTrib: input.taxAmount,\n ImpIVA: input.vatAmount,\n MonId: input.currencyId,\n MonCotiz: input.exchangeRate,\n PtoVta: input.salesPoint,\n CbteTipo: input.voucherType,\n };\n\n if (input.receiverVatConditionId !== undefined) {\n data.CondicionIVAReceptorId = input.receiverVatConditionId;\n }\n\n if (input.serviceStartDate !== undefined) {\n data.FchServDesde = input.serviceStartDate;\n }\n if (input.serviceEndDate !== undefined) {\n data.FchServHasta = input.serviceEndDate;\n }\n if (input.paymentDueDate !== undefined) {\n data.FchVtoPago = input.paymentDueDate;\n }\n\n if (input.associatedVouchers) {\n data.CbtesAsoc = {\n CbteAsoc: input.associatedVouchers.map((v) => ({\n Tipo: v.type,\n PtoVta: v.salesPoint,\n Nro: v.number,\n ...(v.taxId !== undefined ? { Cuit: v.taxId } : {}),\n ...(v.voucherDate !== undefined ? { CbteFch: v.voucherDate } : {}),\n })),\n };\n }\n\n if (input.taxes) {\n data.Tributos = {\n Tributo: input.taxes.map((t) => ({\n Id: t.id,\n ...(t.description !== undefined ? { Desc: t.description } : {}),\n BaseImp: t.baseAmount,\n Alic: t.rate,\n Importe: t.amount,\n })),\n };\n }\n\n if (input.vatRates) {\n data.Iva = {\n AlicIva: input.vatRates.map((v) => ({\n Id: v.id,\n BaseImp: v.baseAmount,\n Importe: v.amount,\n })),\n };\n }\n\n if (input.optionalFields) {\n data.Opcionales = {\n Opcional: input.optionalFields.map((o) => ({\n Id: o.id,\n Valor: o.value,\n })),\n };\n }\n\n if (input.buyers) {\n data.Compradores = {\n Comprador: input.buyers.map((b) => ({\n DocTipo: b.documentType,\n DocNro: b.documentNumber,\n Porcentaje: b.percentage,\n })),\n };\n }\n\n return data;\n}\n\nfunction mapWsfeSalesPoint(raw: unknown): WsfeSalesPoint {\n const record = raw as Record<string, unknown>;\n return {\n number: Number(record.Nro ?? 0),\n ...(record.EmisionTipo !== undefined\n ? { emissionType: String(record.EmisionTipo) }\n : {}),\n ...(record.Bloqueado !== undefined\n ? { blocked: String(record.Bloqueado) }\n : {}),\n ...(record.FchBaja !== undefined\n ? { deletedSince: String(record.FchBaja) }\n : {}),\n };\n}\n\nfunction mapWsfeVoucherInfo(raw: Record<string, unknown>): WsfeVoucherInfo {\n return {\n voucherNumber: Number(raw.CbteDesde ?? raw.CbteHasta ?? 0),\n ...(raw.CbteFch !== undefined ? { voucherDate: String(raw.CbteFch) } : {}),\n ...(raw.PtoVta !== undefined ? { salesPoint: Number(raw.PtoVta) } : {}),\n ...(raw.CbteTipo !== undefined\n ? { voucherType: Number(raw.CbteTipo) }\n : {}),\n ...(raw.ImpTotal !== undefined\n ? { totalAmount: Number(raw.ImpTotal) }\n : {}),\n ...(raw.Resultado !== undefined ? { result: String(raw.Resultado) } : {}),\n ...(raw.CAE !== undefined ? { cae: String(raw.CAE) } : {}),\n ...(raw.CAEFchVto !== undefined\n ? { caeExpiry: String(raw.CAEFchVto) }\n : {}),\n raw,\n };\n}\n\nfunction createWsfeAuth(\n representedTaxId: number | string,\n token: string,\n sign: string\n) {\n return {\n Token: token,\n Sign: sign,\n Cuit: Number.parseInt(String(representedTaxId), 10),\n };\n}\n\nfunction unwrapWsfeOperationResult(\n operation: string,\n response: Record<string, unknown>\n) {\n const operationResponse = response[`${operation}Response`] as\n | Record<string, unknown>\n | undefined;\n const result = (operationResponse?.[`${operation}Result`] ??\n response[`${operation}Result`] ??\n response) as Record<string, unknown>;\n\n if (operation === \"FECAESolicitar\") {\n const detailResponse = normalizeWsfeDetailResponse(result);\n const resultCode = detailResponse.Resultado;\n if (resultCode && resultCode !== \"A\") {\n const observationsContainer = detailResponse.Observaciones as\n | Record<string, unknown>\n | undefined;\n const observations = normalizeWsfeErrors(observationsContainer?.Obs);\n if (observations.length > 0) {\n const firstObservation = observations[0];\n if (!firstObservation) {\n throw new ArcaServiceError(\n \"WSFE returned an empty observation list\",\n {\n detail: result,\n }\n );\n }\n throw new ArcaServiceError(firstObservation.message, {\n serviceCode: firstObservation.code,\n detail: result,\n });\n }\n }\n }\n\n const errorsContainer = result.Errors as Record<string, unknown> | undefined;\n const errors = normalizeWsfeErrors(errorsContainer?.Err);\n if (errors.length > 0) {\n const firstError = errors[0];\n if (!firstError) {\n throw new ArcaServiceError(\"WSFE returned an empty error list\", {\n detail: result,\n });\n }\n throw new ArcaServiceError(firstError.message, {\n serviceCode: firstError.code,\n detail: result,\n });\n }\n\n return result;\n}\n\nfunction normalizeWsfeDetailResponse(result: Record<string, unknown>) {\n const detailResponse = result.FeDetResp as\n | Record<string, unknown>\n | undefined;\n const rawDetail = detailResponse?.FECAEDetResponse;\n\n if (Array.isArray(rawDetail)) {\n return (rawDetail[0] as Record<string, unknown>) ?? {};\n }\n\n return (rawDetail as Record<string, unknown> | undefined) ?? {};\n}\n\nfunction normalizeWsfeErrors(rawErrors: unknown) {\n const entries = Array.isArray(rawErrors)\n ? rawErrors\n : rawErrors\n ? [rawErrors]\n : [];\n\n return entries\n .map((entry) => entry as Record<string, unknown>)\n .map((entry) => {\n const code = entry.Code ?? entry.code ?? \"N/A\";\n const message = entry.Msg ?? entry.msg ?? \"Unknown WSFE error\";\n return {\n code: String(code),\n message: `(${String(code)}) ${String(message)}`,\n };\n });\n}\n","import { ArcaServiceError } from \"../errors\";\nimport type { SoapTransport } from \"../soap\";\nimport type {\n ArcaClientConfig,\n ArcaRepresentedTaxId,\n} from \"../internal/types\";\nimport type { WsaaAuthModule } from \"../wsaa\";\n\n/** Result of a successful WSMTXCA voucher authorization. */\nexport type WsmtxcaAuthorizationResult = {\n cae: string;\n caeExpiry?: string;\n voucherNumber: number;\n messages: string[];\n raw: Record<string, unknown>;\n};\n\n/** Result of querying the last authorized voucher number. */\nexport type WsmtxcaLastAuthorizedVoucherResult = {\n voucherNumber: number;\n raw: Record<string, unknown>;\n};\n\n/** Result of looking up a specific WSMTXCA voucher. */\nexport type WsmtxcaVoucherLookupResult = {\n invoiceDate: string;\n voucher: Record<string, unknown>;\n messages: string[];\n raw: Record<string, unknown>;\n};\n\n/** WSMTXCA electronic invoicing service (Factura de Crédito Electrónica). */\nexport type WsmtxcaService = {\n /** Authorizes a voucher and returns the CAE. */\n authorizeVoucher(input: {\n representedTaxId?: ArcaRepresentedTaxId;\n data: Record<string, unknown>;\n }): Promise<WsmtxcaAuthorizationResult>;\n /** Returns the last authorized voucher number for the given sales point and type. */\n getLastAuthorizedVoucher(input: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n }): Promise<WsmtxcaLastAuthorizedVoucherResult>;\n /** Retrieves details for a specific voucher. */\n getVoucher(input: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n voucherNumber: number;\n }): Promise<WsmtxcaVoucherLookupResult>;\n};\n\nexport type CreateWsmtxcaServiceOptions = {\n config: ArcaClientConfig;\n auth: WsaaAuthModule;\n soap: SoapTransport;\n};\n\n/** Creates a WSMTXCA service instance wired with authentication and SOAP transport. */\nexport function createWsmtxcaService(\n options: CreateWsmtxcaServiceOptions\n): WsmtxcaService {\n return {\n async authorizeVoucher({ representedTaxId, data }) {\n const auth = await options.auth.login(\"wsmtxca\", { representedTaxId });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsmtxca\",\n operation: \"autorizarComprobante\",\n bodyElementName: \"autorizarComprobanteRequest\",\n bodyElementNamespaceMode: \"prefix\",\n body: {\n authRequest: createWsmtxcaAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n ...(data as Record<string, unknown>),\n },\n });\n\n const raw = unwrapWsmtxcaOperationResponse(\n response.result,\n \"autorizarComprobante\"\n );\n const authorizationPayload = extractWsmtxcaAuthorizationPayload(raw);\n const messages = extractWsmtxcaMessages(raw);\n const resultado = raw.resultado ?? authorizationPayload.resultado;\n\n const caeValue =\n authorizationPayload.CAE ??\n authorizationPayload.codigoAutorizacion ??\n raw.codigoAutorizacion;\n\n if (resultado === \"R\" || caeValue == null) {\n throw new ArcaServiceError(\n messages.join(\" | \") ||\n \"WSMTXCA rejected the voucher authorization\",\n { detail: raw }\n );\n }\n\n return {\n cae: String(caeValue),\n caeExpiry: normalizeWsmtxcaResponseDate(\n authorizationPayload.fechaVencimientoCAE ??\n authorizationPayload.fechaVencimiento ??\n raw.fechaVencimiento\n ),\n voucherNumber: parseWsmtxcaVoucherNumber(\n authorizationPayload.numeroComprobante ?? raw.numeroComprobante,\n \"WSMTXCA did not return the authorized voucher number\",\n raw\n ),\n messages,\n raw,\n };\n },\n async getLastAuthorizedVoucher({\n representedTaxId,\n voucherType,\n salesPoint,\n }) {\n const auth = await options.auth.login(\"wsmtxca\", { representedTaxId });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsmtxca\",\n operation: \"consultarUltimoComprobanteAutorizado\",\n bodyElementName: \"consultarUltimoComprobanteAutorizadoRequest\",\n bodyElementNamespaceMode: \"prefix\",\n body: {\n authRequest: createWsmtxcaAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n consultaUltimoComprobanteAutorizadoRequest: {\n codigoTipoComprobante: voucherType,\n numeroPuntoVenta: salesPoint,\n },\n },\n });\n\n const raw = unwrapWsmtxcaOperationResponse(\n response.result,\n \"consultarUltimoComprobanteAutorizado\"\n );\n return {\n voucherNumber: parseWsmtxcaVoucherNumber(\n raw.numeroComprobante ?? raw.cbteNro ?? raw.nroComprobante,\n extractWsmtxcaMessages(raw).join(\" | \") ||\n \"WSMTXCA did not return the last authorized voucher number\",\n raw\n ),\n raw,\n };\n },\n async getVoucher({\n representedTaxId,\n voucherType,\n salesPoint,\n voucherNumber,\n }) {\n const auth = await options.auth.login(\"wsmtxca\", { representedTaxId });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsmtxca\",\n operation: \"consultarComprobante\",\n bodyElementName: \"consultarComprobanteRequest\",\n bodyElementNamespaceMode: \"prefix\",\n body: {\n authRequest: createWsmtxcaAuth(\n representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n consultaComprobanteRequest: {\n codigoTipoComprobante: voucherType,\n numeroPuntoVenta: salesPoint,\n numeroComprobante: voucherNumber,\n },\n },\n });\n\n const raw = unwrapWsmtxcaOperationResponse(\n response.result,\n \"consultarComprobante\"\n );\n const voucher = extractWsmtxcaVoucherPayload(raw);\n const messages = extractWsmtxcaMessages(raw);\n const invoiceDate = normalizeWsmtxcaResponseDate(\n voucher.fechaEmision ?? voucher.fecha ?? voucher.CbteFch\n );\n\n if (!invoiceDate) {\n throw new ArcaServiceError(\n messages[0] ??\n \"WSMTXCA did not return the voucher issue date\",\n { detail: raw }\n );\n }\n\n return {\n invoiceDate,\n voucher,\n messages,\n raw,\n };\n },\n };\n}\n\nfunction createWsmtxcaAuth(\n representedTaxId: number | string,\n token: string,\n sign: string\n) {\n return {\n token,\n sign,\n cuitRepresentada: Number.parseInt(String(representedTaxId), 10),\n };\n}\n\nfunction toRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction unwrapWsmtxcaOperationResponse(\n response: unknown,\n operation:\n | \"autorizarComprobante\"\n | \"consultarUltimoComprobanteAutorizado\"\n | \"consultarComprobante\"\n) {\n const responseRecord = toRecord(response) ?? {};\n\n if (operation === \"autorizarComprobante\") {\n return (\n toRecord(responseRecord.autorizarComprobanteResponse) ??\n toRecord(responseRecord.autorizarComprobanteResult) ??\n toRecord(responseRecord.comprobanteCAEResponse) ??\n toRecord(responseRecord.comprobanteCAEReponse) ??\n responseRecord\n );\n }\n\n if (operation === \"consultarComprobante\") {\n return (\n toRecord(responseRecord.consultarComprobanteResponse) ??\n toRecord(responseRecord.consultaComprobanteResponse) ??\n toRecord(responseRecord.consultarComprobanteResult) ??\n responseRecord\n );\n }\n\n return (\n toRecord(responseRecord.consultarUltimoComprobanteAutorizadoResponse) ??\n toRecord(responseRecord.consultaUltimoComprobanteAutorizadoResponse) ??\n toRecord(responseRecord.consultarUltimoComprobanteAutorizadoResult) ??\n responseRecord\n );\n}\n\nfunction extractWsmtxcaAuthorizationPayload(raw: Record<string, unknown>) {\n return (\n toRecord(raw.comprobanteResponse) ??\n toRecord(raw.comprobanteCAEResponse) ??\n toRecord(raw.comprobanteCAEReponse) ??\n raw\n );\n}\n\nfunction extractWsmtxcaVoucherPayload(raw: Record<string, unknown>) {\n return (\n toRecord(raw.comprobanteResponse) ??\n toRecord(raw.comprobante) ??\n toRecord(raw.cmp) ??\n raw\n );\n}\n\nfunction extractWsmtxcaMessages(raw: Record<string, unknown>): string[] {\n const rawErrors = raw.arrayErrores as\n | { codigoDescripcion?: unknown }\n | undefined;\n const rawObservations = raw.arrayObservaciones as\n | { codigoDescripcion?: unknown }\n | undefined;\n\n const toEntries = (\n value: unknown\n ): Array<{ codigo?: unknown; descripcion?: unknown }> => {\n if (!value) {\n return [];\n }\n if (Array.isArray(value)) {\n return value as Array<{ codigo?: unknown; descripcion?: unknown }>;\n }\n if (typeof value === \"object\") {\n return [value as { codigo?: unknown; descripcion?: unknown }];\n }\n return [];\n };\n\n const errors = toEntries(rawErrors?.codigoDescripcion).map((entry) => {\n const code = entry.codigo == null ? \"N/A\" : String(entry.codigo);\n const description =\n entry.descripcion == null\n ? \"Unknown WSMTXCA error\"\n : String(entry.descripcion);\n return `Error ${code}: ${description}`;\n });\n\n const observations = toEntries(rawObservations?.codigoDescripcion).map(\n (entry) => {\n const code = entry.codigo == null ? \"N/A\" : String(entry.codigo);\n const description =\n entry.descripcion == null ? \"\" : String(entry.descripcion);\n return `Obs ${code}: ${description}`.trim();\n }\n );\n\n return [...errors, ...observations];\n}\n\nfunction parseWsmtxcaVoucherNumber(\n value: unknown,\n message: string,\n detail: Record<string, unknown>\n) {\n const parsed = Number.parseInt(String(value ?? \"\"), 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new ArcaServiceError(message, { detail });\n }\n return parsed;\n}\n\nfunction normalizeWsmtxcaResponseDate(value: unknown): string | undefined {\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return formatCompactDateToIso(value);\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n\n if (/^\\d{8}$/.test(trimmed)) {\n return formatCompactDateToIso(Number.parseInt(trimmed, 10));\n }\n\n if (/^\\d{4}-\\d{2}-\\d{2}/.test(trimmed)) {\n return trimmed.slice(0, 10);\n }\n\n return undefined;\n}\n\nfunction formatCompactDateToIso(dateValue?: number | null): string | undefined {\n if (!dateValue) {\n return undefined;\n }\n\n const raw = String(dateValue);\n if (raw.length !== 8) {\n return undefined;\n }\n\n return `${raw.slice(0, 4)}-${raw.slice(4, 6)}-${raw.slice(6, 8)}`;\n}\n","import https from \"node:https\";\nimport { ArcaTransportError } from \"../errors\";\n\nconst defaultAgent = new https.Agent({\n keepAlive: true,\n});\n\nconst legacyTlsAgent = new https.Agent({\n keepAlive: true,\n ciphers: \"DEFAULT@SECLEVEL=0\",\n});\nconst REQUEST_TIMEOUT_MS = 30_000;\n\ntype PostXmlOptions = {\n url: string;\n body: string;\n contentType: string;\n soapAction?: string;\n useLegacyTlsSecurityLevel0?: boolean;\n};\n\nexport async function postXml({\n url,\n body,\n contentType,\n soapAction,\n useLegacyTlsSecurityLevel0 = false,\n}: PostXmlOptions): Promise<string> {\n const endpoint = new URL(url);\n const requestBody = Buffer.from(body, \"utf8\");\n\n return await new Promise((resolve, reject) => {\n let settled = false;\n const settleResolve = (responseBody: string) => {\n if (settled) {\n return;\n }\n settled = true;\n resolve(responseBody);\n };\n const settleReject = (error: ArcaTransportError) => {\n if (settled) {\n return;\n }\n settled = true;\n reject(error);\n };\n const request = https.request(\n {\n protocol: endpoint.protocol,\n hostname: endpoint.hostname,\n port: endpoint.port || undefined,\n path: `${endpoint.pathname}${endpoint.search}`,\n method: \"POST\",\n agent: useLegacyTlsSecurityLevel0 ? legacyTlsAgent : defaultAgent,\n headers: {\n Accept: \"text/xml, application/soap+xml\",\n \"Content-Length\": requestBody.byteLength,\n \"Content-Type\": contentType,\n ...(soapAction === undefined\n ? {}\n : { SOAPAction: `\"${soapAction}\"` }),\n },\n },\n (response) => {\n const chunks: Buffer[] = [];\n const getResponseBody = () => Buffer.concat(chunks).toString(\"utf8\");\n\n response.on(\"data\", (chunk: Buffer | string) => {\n chunks.push(\n typeof chunk === \"string\" ? Buffer.from(chunk, \"utf8\") : chunk\n );\n });\n\n response.on(\"error\", (error) => {\n settleReject(\n new ArcaTransportError(\n `ARCA HTTP response stream failed: ${error.message}`,\n {\n cause: error,\n statusCode: response.statusCode,\n responseBody: getResponseBody(),\n }\n )\n );\n });\n\n response.on(\"aborted\", () => {\n settleReject(\n new ArcaTransportError(\"ARCA HTTP response was aborted\", {\n statusCode: response.statusCode,\n responseBody: getResponseBody(),\n })\n );\n });\n\n response.on(\"end\", () => {\n const responseBody = getResponseBody();\n const statusCode = response.statusCode ?? 500;\n const responseContentType = Array.isArray(\n response.headers[\"content-type\"]\n )\n ? response.headers[\"content-type\"].join(\"; \")\n : response.headers[\"content-type\"];\n\n if (statusCode >= 200 && statusCode < 300) {\n settleResolve(responseBody);\n return;\n }\n\n // SOAP services commonly return structured fault payloads with HTTP\n // 500. Let higher layers parse those XML faults instead of forcing a\n // transport error here.\n if (isXmlLikeResponse(responseBody, responseContentType)) {\n settleResolve(responseBody);\n return;\n }\n\n settleReject(\n new ArcaTransportError(\n `ARCA HTTP request failed with status ${statusCode}`,\n {\n statusCode,\n responseBody,\n }\n )\n );\n });\n }\n );\n\n request.setTimeout(REQUEST_TIMEOUT_MS, () => {\n request.destroy(\n new Error(`ARCA HTTP request timed out after ${REQUEST_TIMEOUT_MS}ms`)\n );\n });\n\n request.on(\"error\", (error) => {\n settleReject(\n new ArcaTransportError(`ARCA HTTP request failed: ${error.message}`, {\n cause: error,\n })\n );\n });\n\n request.write(requestBody);\n request.end();\n });\n}\n\nfunction isXmlLikeResponse(body: string, contentType?: string): boolean {\n const normalizedContentType = contentType?.toLowerCase() ?? \"\";\n if (\n normalizedContentType.includes(\"xml\") ||\n normalizedContentType.includes(\"soap\")\n ) {\n return true;\n }\n\n return body.trimStart().startsWith(\"<\");\n}\n","import { XMLBuilder, XMLParser } from \"fast-xml-parser\";\nimport { ArcaSoapFaultError } from \"../errors\";\nimport type { ArcaSoapVersion } from \"../internal/types\";\n\nconst xmlBuilder = new XMLBuilder({\n attributeNamePrefix: \"@_\",\n format: false,\n ignoreAttributes: false,\n suppressBooleanAttributes: false,\n suppressEmptyNode: true,\n});\n\nconst xmlParser = new XMLParser({\n attributeNamePrefix: \"@_\",\n ignoreAttributes: false,\n parseAttributeValue: false,\n parseTagValue: false,\n removeNSPrefix: true,\n trimValues: true,\n});\n\nexport function buildSoapEnvelope(\n soapVersion: ArcaSoapVersion,\n operation: string,\n namespace: string,\n body: Record<string, unknown>,\n options?: {\n namespaceMode?: \"default\" | \"prefix\";\n }\n): string {\n const prefix = soapVersion === \"1.2\" ? \"soap12\" : \"soap\";\n const envelopeNamespace =\n soapVersion === \"1.2\"\n ? \"http://www.w3.org/2003/05/soap-envelope\"\n : \"http://schemas.xmlsoap.org/soap/envelope/\";\n const namespaceMode = options?.namespaceMode ?? \"default\";\n const operationElementName =\n namespaceMode === \"prefix\" ? `tns:${operation}` : operation;\n const operationNamespaceAttributes =\n namespaceMode === \"prefix\"\n ? { \"@_xmlns:tns\": namespace }\n : { \"@_xmlns\": namespace };\n\n const payload = {\n [`${prefix}:Envelope`]: {\n \"@_xmlns:xsi\": \"http://www.w3.org/2001/XMLSchema-instance\",\n \"@_xmlns:xsd\": \"http://www.w3.org/2001/XMLSchema\",\n [`@_xmlns:${prefix}`]: envelopeNamespace,\n [`${prefix}:Body`]: {\n [operationElementName]: {\n ...operationNamespaceAttributes,\n ...pruneUndefinedDeep(body),\n },\n },\n },\n };\n\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?>${xmlBuilder.build(payload)}`;\n}\n\nexport function parseSoapBody(xml: string): Record<string, unknown> {\n const parsed = xmlParser.parse(xml) as Record<string, unknown>;\n const envelope = parsed.Envelope as Record<string, unknown> | undefined;\n const body = envelope?.Body as Record<string, unknown> | undefined;\n\n if (!body) {\n throw new ArcaSoapFaultError(\"Invalid SOAP response: missing body\", {\n detail: parsed,\n });\n }\n\n const fault = body.Fault as Record<string, unknown> | undefined;\n if (fault) {\n throw createSoapFaultError(fault);\n }\n\n return body;\n}\n\nexport function getSingleBodyEntry<T = unknown>(\n body: Record<string, unknown>\n): [string, T] {\n const entries = Object.entries(body).filter(([key]) => key !== \"@_xmlns\");\n if (entries.length !== 1) {\n throw new ArcaSoapFaultError(\n `Invalid SOAP response: expected a single body entry, got ${entries.length}`,\n {\n detail: body,\n }\n );\n }\n\n return entries[0] as [string, T];\n}\n\nexport function parseXmlDocument<T = unknown>(xml: string): T {\n return xmlParser.parse(xml) as T;\n}\n\nexport function pruneUndefinedDeep<T>(value: T): T {\n if (Array.isArray(value)) {\n return value\n .map((item) => pruneUndefinedDeep(item))\n .filter((item) => item !== undefined) as T;\n }\n\n if (value && typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, nestedValue]) => nestedValue !== undefined)\n .map(([key, nestedValue]) => [key, pruneUndefinedDeep(nestedValue)]);\n return Object.fromEntries(entries) as T;\n }\n\n return value;\n}\n\nfunction createSoapFaultError(\n fault: Record<string, unknown>\n): ArcaSoapFaultError {\n const faultCode =\n typeof fault.faultcode === \"string\"\n ? fault.faultcode\n : getNestedString(fault, [\"Code\", \"Value\"]);\n const message =\n typeof fault.faultstring === \"string\"\n ? fault.faultstring\n : (getNestedString(fault, [\"Reason\", \"Text\"]) ??\n \"ARCA SOAP fault response\");\n\n return new ArcaSoapFaultError(message, {\n faultCode: faultCode ?? undefined,\n detail: fault,\n });\n}\n\nfunction getNestedString(\n value: Record<string, unknown>,\n path: string[]\n): string | null {\n let current: unknown = value;\n for (const key of path) {\n if (!current || typeof current !== \"object\") {\n return null;\n }\n current = (current as Record<string, unknown>)[key];\n }\n return typeof current === \"string\" ? current : null;\n}\n","import { getArcaServiceConfig } from \"../config\";\nimport { postXml } from \"../internal/http\";\nimport {\n buildSoapEnvelope,\n getSingleBodyEntry,\n parseSoapBody,\n} from \"../internal/xml\";\nimport type {\n ArcaClientConfig,\n ArcaSoapExecutionOptions,\n ArcaSoapResponse,\n} from \"../internal/types\";\n\nexport type SoapTransport = {\n execute<TBody, TResult>(\n request: ArcaSoapExecutionOptions<TBody>\n ): Promise<ArcaSoapResponse<TResult>>;\n};\n\nexport type CreateSoapTransportOptions = {\n config: ArcaClientConfig;\n fetchImplementation?: typeof fetch;\n};\n\nexport function createSoapTransport(\n options: CreateSoapTransportOptions\n): SoapTransport {\n return {\n async execute<TBody, TResult>(request: ArcaSoapExecutionOptions<TBody>) {\n const serviceConfig = getArcaServiceConfig(request.service);\n const soapActionOperation = request.operation;\n const bodyElementName = request.bodyElementName ?? request.operation;\n const soapAction = serviceConfig.usesEmptySoapAction\n ? \"\"\n : `${serviceConfig.soapActionBase}${soapActionOperation}`;\n const contentType =\n serviceConfig.soapVersion === \"1.2\"\n ? `application/soap+xml; charset=utf-8; action=\"${soapAction}\"`\n : 'text/xml; charset=\"utf-8\"';\n const xml = buildSoapEnvelope(\n serviceConfig.soapVersion,\n bodyElementName,\n serviceConfig.namespace,\n request.body as Record<string, unknown>,\n {\n namespaceMode: request.bodyElementNamespaceMode,\n }\n );\n const responseXml = await postXml({\n url: serviceConfig.endpoint[options.config.environment],\n body: xml,\n contentType,\n soapAction:\n serviceConfig.soapVersion === \"1.1\" ? soapAction : undefined,\n useLegacyTlsSecurityLevel0:\n options.config.environment === \"production\" &&\n serviceConfig.useLegacyTlsSecurityLevel0 === true,\n });\n\n const soapBody = parseSoapBody(responseXml);\n const [, result] = getSingleBodyEntry<Record<string, unknown>>(soapBody);\n\n return {\n service: request.service,\n operation: request.operation,\n raw: responseXml,\n result: result as TResult,\n };\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport forge from \"node-forge\";\nimport { ARCA_WSAA_CONFIG } from \"../config\";\nimport { ArcaSoapFaultError, ArcaTransportError } from \"../errors\";\nimport { postXml } from \"../internal/http\";\nimport {\n buildSoapEnvelope,\n getSingleBodyEntry,\n parseSoapBody,\n parseXmlDocument,\n} from \"../internal/xml\";\nimport type {\n ArcaAuthCredentials,\n ArcaAuthOptions,\n ArcaClientConfig,\n ArcaWsaaCacheConfig,\n ArcaWsaaServiceId,\n} from \"../internal/types\";\n\nexport type WsaaAuthModule = {\n login(\n service: ArcaWsaaServiceId,\n options?: ArcaAuthOptions\n ): Promise<ArcaAuthCredentials>;\n};\n\nexport type CreateWsaaAuthModuleOptions = {\n config: ArcaClientConfig;\n};\n\ntype ForgeSignerOptions = Parameters<\n forge.pkcs7.PkcsSignedData[\"addSigner\"]\n>[0];\ntype ForgeAuthenticatedAttribute = NonNullable<\n ForgeSignerOptions[\"authenticatedAttributes\"]\n>[number];\ntype WsaaAuthenticatedAttribute = Omit<ForgeAuthenticatedAttribute, \"value\"> & {\n value?: string | Date;\n};\n\nexport function createWsaaAuthModule(\n options: CreateWsaaAuthModuleOptions\n): WsaaAuthModule {\n const cache = new Map<string, ArcaAuthCredentials>();\n const inFlight = new Map<string, Promise<ArcaAuthCredentials>>();\n const persistedCache = createPersistedCredentialStore(options.config.wsaa?.cache);\n\n return {\n async login(service, authOptions = {}) {\n const cacheKey = buildWsaaCacheKey(options.config, service);\n const running = inFlight.get(cacheKey);\n if (running) {\n return running;\n }\n\n const loginPromise = (async () => {\n if (!authOptions.forceRefresh) {\n const cached = await getCachedCredentials(\n cache,\n cacheKey,\n persistedCache\n );\n if (cached) {\n return cached;\n }\n }\n\n const credentials = await requestCredentials(options.config, service);\n cache.set(cacheKey, credentials);\n await persistedCache.write(cacheKey, credentials);\n return credentials;\n })();\n\n inFlight.set(cacheKey, loginPromise);\n\n try {\n return await loginPromise;\n } catch (error) {\n if (\n !authOptions.forceRefresh &&\n error instanceof ArcaSoapFaultError &&\n error.faultCode === \"ns1:coe.alreadyAuthenticated\"\n ) {\n const cached = await getCachedCredentials(\n cache,\n cacheKey,\n persistedCache\n );\n if (cached) {\n return cached;\n }\n }\n\n throw error;\n } finally {\n inFlight.delete(cacheKey);\n }\n },\n };\n}\n\nasync function requestCredentials(\n config: ArcaClientConfig,\n service: ArcaWsaaServiceId\n): Promise<ArcaAuthCredentials> {\n const loginTicketRequestXml = buildLoginTicketRequest(service);\n const signedCms = signLoginTicketRequest(loginTicketRequestXml, {\n certificatePem: config.certificatePem,\n privateKeyPem: config.privateKeyPem,\n });\n\n const requestXml = buildSoapEnvelope(\n ARCA_WSAA_CONFIG.soapVersion,\n \"loginCms\",\n ARCA_WSAA_CONFIG.namespace,\n { in0: signedCms }\n );\n\n const responseXml = await postXml({\n url: ARCA_WSAA_CONFIG.endpoint[config.environment],\n body: requestXml,\n contentType: 'text/xml; charset=\"utf-8\"',\n soapAction: ARCA_WSAA_CONFIG.soapActionBase,\n });\n\n const soapBody = parseSoapBody(responseXml);\n const [, response] = getSingleBodyEntry<Record<string, unknown>>(soapBody);\n const loginCmsReturn = response.loginCmsReturn;\n\n if (typeof loginCmsReturn !== \"string\" || loginCmsReturn.trim().length < 1) {\n throw new ArcaTransportError(\n \"WSAA response did not include loginCmsReturn XML\"\n );\n }\n\n return parseLoginTicketResponse(loginCmsReturn);\n}\n\nfunction buildWsaaCacheKey(\n config: ArcaClientConfig,\n service: ArcaWsaaServiceId\n): string {\n return [config.environment, service, getCertificateFingerprint(config)].join(\n \":\"\n );\n}\n\nfunction getCertificateFingerprint(config: ArcaClientConfig): string {\n return createHash(\"sha256\").update(config.certificatePem).digest(\"hex\");\n}\n\nfunction isCredentialValid(credentials: ArcaAuthCredentials): boolean {\n return new Date(credentials.expiresAt).getTime() - Date.now() > 60_000;\n}\n\nasync function getCachedCredentials(\n cache: Map<string, ArcaAuthCredentials>,\n cacheKey: string,\n persistedCache: PersistedCredentialStore\n): Promise<ArcaAuthCredentials | null> {\n const localCached = cache.get(cacheKey);\n if (localCached && isCredentialValid(localCached)) {\n return localCached;\n }\n\n const persisted = await persistedCache.read(cacheKey);\n if (persisted) {\n cache.set(cacheKey, persisted);\n return persisted;\n }\n\n return null;\n}\n\ntype PersistedCredentialStore = {\n read(cacheKey: string): Promise<ArcaAuthCredentials | null>;\n write(cacheKey: string, credentials: ArcaAuthCredentials): Promise<void>;\n};\n\nfunction createPersistedCredentialStore(\n cacheConfig: ArcaWsaaCacheConfig | undefined\n): PersistedCredentialStore {\n if (!cacheConfig || cacheConfig.mode !== \"disk\") {\n return {\n async read() {\n return null;\n },\n async write() {},\n };\n }\n\n const cacheDir = path.resolve(cacheConfig.directory);\n\n return {\n async read(cacheKey) {\n try {\n const serialized = await readFile(\n getSharedCacheFilePath(cacheDir, cacheKey),\n \"utf8\"\n );\n const parsed = JSON.parse(serialized) as Partial<ArcaAuthCredentials>;\n\n if (\n typeof parsed.token !== \"string\" ||\n typeof parsed.sign !== \"string\" ||\n typeof parsed.expiresAt !== \"string\"\n ) {\n return null;\n }\n\n const credentials = {\n token: parsed.token,\n sign: parsed.sign,\n expiresAt: parsed.expiresAt,\n } satisfies ArcaAuthCredentials;\n\n return isCredentialValid(credentials) ? credentials : null;\n } catch {\n return null;\n }\n },\n async write(cacheKey, credentials) {\n await mkdir(cacheDir, { recursive: true });\n await writeFile(\n getSharedCacheFilePath(cacheDir, cacheKey),\n JSON.stringify(credentials),\n \"utf8\"\n );\n },\n };\n}\n\nfunction getSharedCacheFilePath(cacheDir: string, cacheKey: string): string {\n const fileName = `${createHash(\"sha256\").update(cacheKey).digest(\"hex\")}.json`;\n return path.join(cacheDir, fileName);\n}\n\nfunction buildLoginTicketRequest(service: ArcaWsaaServiceId): string {\n const uniqueId = Math.floor(Date.now() / 1000);\n const generationTime = new Date(Date.now() - 5 * 60_000)\n .toISOString()\n .replace(\".000Z\", \"Z\");\n const expirationTime = new Date(Date.now() + 5 * 60_000)\n .toISOString()\n .replace(\".000Z\", \"Z\");\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<loginTicketRequest version=\"1.0\">\n <header>\n <uniqueId>${uniqueId}</uniqueId>\n <generationTime>${generationTime}</generationTime>\n <expirationTime>${expirationTime}</expirationTime>\n </header>\n <service>${service}</service>\n</loginTicketRequest>`;\n}\n\nfunction signLoginTicketRequest(\n loginTicketRequestXml: string,\n options: Pick<ArcaClientConfig, \"certificatePem\" | \"privateKeyPem\">\n): string {\n const certificate = forge.pki.certificateFromPem(options.certificatePem);\n const privateKey = forge.pki.privateKeyFromPem(options.privateKeyPem);\n const signedData = forge.pkcs7.createSignedData();\n\n signedData.content = forge.util.createBuffer(loginTicketRequestXml, \"utf8\");\n signedData.addCertificate(certificate);\n const authenticatedAttributes: WsaaAuthenticatedAttribute[] = [\n {\n type: String(forge.pki.oids.contentType),\n value: String(forge.pki.oids.data),\n },\n {\n type: String(forge.pki.oids.messageDigest),\n },\n {\n type: String(forge.pki.oids.signingTime),\n value: new Date(),\n },\n ];\n\n const signerOptions: ForgeSignerOptions = {\n key: privateKey,\n certificate,\n digestAlgorithm: String(forge.pki.oids.sha1),\n authenticatedAttributes:\n authenticatedAttributes as unknown as ForgeSignerOptions[\"authenticatedAttributes\"],\n };\n\n signedData.addSigner(signerOptions);\n signedData.sign();\n\n const der = forge.asn1.toDer(signedData.toAsn1()).getBytes();\n return Buffer.from(der, \"binary\").toString(\"base64\");\n}\n\nfunction parseLoginTicketResponse(xml: string): ArcaAuthCredentials {\n const parsed = parseXmlDocument<Record<string, unknown>>(xml);\n const response =\n (parsed.loginTicketResponse as Record<string, unknown> | undefined) ??\n parsed;\n const header = response.header as Record<string, unknown> | undefined;\n const credentials = response.credentials as\n | Record<string, unknown>\n | undefined;\n const token = credentials?.token;\n const sign = credentials?.sign;\n const expiresAt = header?.expirationTime;\n\n if (\n typeof token !== \"string\" ||\n typeof sign !== \"string\" ||\n typeof expiresAt !== \"string\"\n ) {\n throw new ArcaTransportError(\n \"Invalid WSAA login ticket response structure\"\n );\n }\n\n return {\n token,\n sign,\n expiresAt,\n };\n}\n","import { assertArcaClientConfig, normalizeArcaClientConfig } from \"./config\";\nimport type { ArcaClientConfig } from \"./internal/types\";\nimport { createPadronService, type PadronService } from \"./services/padron\";\nimport { createWsfeService, type WsfeService } from \"./services/wsfe\";\nimport { createWsmtxcaService, type WsmtxcaService } from \"./services/wsmtxca\";\nimport { createSoapTransport } from \"./soap\";\nimport { createWsaaAuthModule } from \"./wsaa\";\n\n/** Fully wired ARCA client with access to all service modules. */\nexport type ArcaClient = {\n config: ArcaClientConfig;\n wsfe: WsfeService;\n wsmtxca: WsmtxcaService;\n padron: PadronService;\n};\n\n/**\n * Creates an ARCA client from the given configuration.\n * Validates the config, wires WSAA authentication and SOAP transport,\n * and returns an object with `.wsfe`, `.wsmtxca`, and `.padron` service modules.\n *\n * @throws {ArcaConfigurationError} When the config is missing or invalid.\n */\nexport function createArcaClient(config: ArcaClientConfig): ArcaClient {\n assertArcaClientConfig(config);\n const normalizedConfig = normalizeArcaClientConfig(config);\n\n const auth = createWsaaAuthModule({ config: normalizedConfig });\n const soap = createSoapTransport({ config: normalizedConfig });\n\n return {\n config: normalizedConfig,\n wsfe: createWsfeService({ config: normalizedConfig, auth, soap }),\n wsmtxca: createWsmtxcaService({ config: normalizedConfig, auth, soap }),\n padron: createPadronService({ config: normalizedConfig, auth, soap }),\n };\n}\n"],"mappings":"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","names":["path"]}
|
package/dist/padron.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { W as WsaaAuthModule, S as SoapTransport } from './index-vWZOjFDO.js';
|
|
2
|
+
import { A as ArcaClientConfig } from './types-DWsYue4B.js';
|
|
3
|
+
|
|
4
|
+
/** Result of a taxpayer lookup via Padron A5. */
|
|
5
|
+
type PadronTaxpayerResult = {
|
|
6
|
+
taxId: string;
|
|
7
|
+
personType?: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
raw: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
/** Result of a tax ID lookup by document number via Padron A13. */
|
|
12
|
+
type PadronTaxIdLookupResult = {
|
|
13
|
+
taxIds: string[];
|
|
14
|
+
raw: Record<string, unknown>;
|
|
15
|
+
};
|
|
16
|
+
/** Padron taxpayer registry service. */
|
|
17
|
+
type PadronService = {
|
|
18
|
+
/** Looks up taxpayer details by CUIT. Returns `null` if the taxpayer does not exist. */
|
|
19
|
+
getTaxpayerDetails(taxId: number | string): Promise<PadronTaxpayerResult | null>;
|
|
20
|
+
/** Looks up CUITs associated with a document number. Returns `null` if not found. */
|
|
21
|
+
getTaxIdByDocument(documentNumber: number | string): Promise<PadronTaxIdLookupResult | null>;
|
|
22
|
+
};
|
|
23
|
+
type CreatePadronServiceOptions = {
|
|
24
|
+
config: ArcaClientConfig;
|
|
25
|
+
auth: WsaaAuthModule;
|
|
26
|
+
soap: SoapTransport;
|
|
27
|
+
};
|
|
28
|
+
/** Creates a Padron service instance wired with authentication and SOAP transport. */
|
|
29
|
+
declare function createPadronService(options: CreatePadronServiceOptions): PadronService;
|
|
30
|
+
|
|
31
|
+
export { type CreatePadronServiceOptions, type PadronService, type PadronTaxIdLookupResult, type PadronTaxpayerResult, createPadronService };
|
package/dist/padron.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
var ArcaError = class extends Error {
|
|
3
|
+
code;
|
|
4
|
+
name = "ArcaError";
|
|
5
|
+
constructor(message, code = "ARCA_ERROR", options) {
|
|
6
|
+
super(message, options);
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var ArcaSoapFaultError = class extends ArcaError {
|
|
11
|
+
name = "ArcaSoapFaultError";
|
|
12
|
+
faultCode;
|
|
13
|
+
detail;
|
|
14
|
+
constructor(message, options) {
|
|
15
|
+
super(message, "ARCA_SOAP_FAULT", options);
|
|
16
|
+
this.faultCode = options?.faultCode;
|
|
17
|
+
this.detail = options?.detail;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// src/services/padron.ts
|
|
22
|
+
function createPadronService(options) {
|
|
23
|
+
return {
|
|
24
|
+
async getTaxpayerDetails(taxId) {
|
|
25
|
+
const raw = await executePadronOperation(
|
|
26
|
+
options,
|
|
27
|
+
"padron-a5",
|
|
28
|
+
"getPersona_v2",
|
|
29
|
+
{
|
|
30
|
+
idPersona: Number.parseInt(String(taxId), 10)
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
if (!raw) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const record = raw;
|
|
37
|
+
const datosGenerales = record.datosGenerales;
|
|
38
|
+
return {
|
|
39
|
+
taxId: String(record.idPersona ?? ""),
|
|
40
|
+
...record.tipoPersona !== void 0 ? { personType: String(record.tipoPersona) } : {},
|
|
41
|
+
...datosGenerales ? { name: extractPadronName(datosGenerales) } : {},
|
|
42
|
+
raw: record
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
async getTaxIdByDocument(documentNumber) {
|
|
46
|
+
const raw = await executePadronOperation(
|
|
47
|
+
options,
|
|
48
|
+
"padron-a13",
|
|
49
|
+
"getIdPersonaListByDocumento",
|
|
50
|
+
{
|
|
51
|
+
documento: String(documentNumber)
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
if (!raw) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const record = raw;
|
|
58
|
+
const idPersona = record.idPersona;
|
|
59
|
+
const taxIds = Array.isArray(idPersona) ? idPersona.map(String) : idPersona !== void 0 ? [String(idPersona)] : [];
|
|
60
|
+
return {
|
|
61
|
+
taxIds,
|
|
62
|
+
raw: record
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function extractPadronName(datosGenerales) {
|
|
68
|
+
if (typeof datosGenerales.razonSocial === "string") {
|
|
69
|
+
return datosGenerales.razonSocial;
|
|
70
|
+
}
|
|
71
|
+
const nombre = datosGenerales.nombre;
|
|
72
|
+
const apellido = datosGenerales.apellido;
|
|
73
|
+
if (typeof apellido === "string" && typeof nombre === "string") {
|
|
74
|
+
return `${apellido} ${nombre}`.trim();
|
|
75
|
+
}
|
|
76
|
+
if (typeof apellido === "string") {
|
|
77
|
+
return apellido;
|
|
78
|
+
}
|
|
79
|
+
if (typeof nombre === "string") {
|
|
80
|
+
return nombre;
|
|
81
|
+
}
|
|
82
|
+
return void 0;
|
|
83
|
+
}
|
|
84
|
+
async function executePadronOperation(options, service, operation, body) {
|
|
85
|
+
const auth = await options.auth.login(
|
|
86
|
+
service === "padron-a5" ? "ws_sr_constancia_inscripcion" : "ws_sr_padron_a13"
|
|
87
|
+
);
|
|
88
|
+
try {
|
|
89
|
+
const response = await options.soap.execute({
|
|
90
|
+
service,
|
|
91
|
+
operation,
|
|
92
|
+
bodyElementNamespaceMode: "prefix",
|
|
93
|
+
body: {
|
|
94
|
+
token: auth.token,
|
|
95
|
+
sign: auth.sign,
|
|
96
|
+
cuitRepresentada: Number.parseInt(options.config.taxId, 10),
|
|
97
|
+
...body
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
const operationResponse = response.result;
|
|
101
|
+
if (operation === "getPersona_v2") {
|
|
102
|
+
return operationResponse.personaReturn ?? null;
|
|
103
|
+
}
|
|
104
|
+
if (operation === "getIdPersonaListByDocumento") {
|
|
105
|
+
return operationResponse.idPersonaListReturn ?? null;
|
|
106
|
+
}
|
|
107
|
+
return operationResponse.return ?? null;
|
|
108
|
+
} catch (error) {
|
|
109
|
+
if (error instanceof ArcaSoapFaultError && error.message.toLowerCase().includes("no existe")) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export {
|
|
116
|
+
createPadronService
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=padron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/services/padron.ts"],"sourcesContent":["/** Base error class for all ARCA-related errors. */\nexport class ArcaError extends Error {\n readonly code: string;\n override readonly name: string = \"ArcaError\";\n\n constructor(message: string, code = \"ARCA_ERROR\", options?: ErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** Thrown when the ARCA client configuration is missing or invalid. */\nexport class ArcaConfigurationError extends ArcaError {\n override readonly name: string = \"ArcaConfigurationError\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"ARCA_CONFIGURATION_ERROR\", options);\n }\n}\n\nclass ArcaNotImplementedError extends ArcaError {\n override readonly name: string = \"ArcaNotImplementedError\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"ARCA_NOT_IMPLEMENTED\", options);\n }\n}\n\n/** Thrown when an HTTP request to an ARCA endpoint fails at the transport level. */\nexport class ArcaTransportError extends ArcaError {\n override readonly name: string = \"ArcaTransportError\";\n readonly statusCode?: number;\n readonly responseBody?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n statusCode?: number;\n responseBody?: string;\n }\n ) {\n super(message, \"ARCA_TRANSPORT_ERROR\", options);\n this.statusCode = options?.statusCode;\n this.responseBody = options?.responseBody;\n }\n}\n\n/** Thrown when the SOAP response contains a Fault element. */\nexport class ArcaSoapFaultError extends ArcaError {\n override readonly name: string = \"ArcaSoapFaultError\";\n readonly faultCode?: string;\n readonly detail?: unknown;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n faultCode?: string;\n detail?: unknown;\n }\n ) {\n super(message, \"ARCA_SOAP_FAULT\", options);\n this.faultCode = options?.faultCode;\n this.detail = options?.detail;\n }\n}\n\n/** Thrown when an ARCA service (WSFE, WSMTXCA, Padron) returns a domain-level error. */\nexport class ArcaServiceError extends ArcaError {\n override readonly name: string = \"ArcaServiceError\";\n readonly serviceCode?: string | number;\n readonly detail?: unknown;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n serviceCode?: string | number;\n detail?: unknown;\n }\n ) {\n super(message, \"ARCA_SERVICE_ERROR\", options);\n this.serviceCode = options?.serviceCode;\n this.detail = options?.detail;\n }\n}\n","import { ArcaSoapFaultError } from \"../errors\";\nimport type { SoapTransport } from \"../soap\";\nimport type {\n ArcaClientConfig,\n ArcaPadronServiceName,\n} from \"../internal/types\";\nimport type { WsaaAuthModule } from \"../wsaa\";\n\n/** Result of a taxpayer lookup via Padron A5. */\nexport type PadronTaxpayerResult = {\n taxId: string;\n personType?: string;\n name?: string;\n raw: Record<string, unknown>;\n};\n\n/** Result of a tax ID lookup by document number via Padron A13. */\nexport type PadronTaxIdLookupResult = {\n taxIds: string[];\n raw: Record<string, unknown>;\n};\n\n/** Padron taxpayer registry service. */\nexport type PadronService = {\n /** Looks up taxpayer details by CUIT. Returns `null` if the taxpayer does not exist. */\n getTaxpayerDetails(\n taxId: number | string\n ): Promise<PadronTaxpayerResult | null>;\n /** Looks up CUITs associated with a document number. Returns `null` if not found. */\n getTaxIdByDocument(\n documentNumber: number | string\n ): Promise<PadronTaxIdLookupResult | null>;\n};\n\nexport type CreatePadronServiceOptions = {\n config: ArcaClientConfig;\n auth: WsaaAuthModule;\n soap: SoapTransport;\n};\n\n/** Creates a Padron service instance wired with authentication and SOAP transport. */\nexport function createPadronService(\n options: CreatePadronServiceOptions\n): PadronService {\n return {\n async getTaxpayerDetails(taxId) {\n const raw = await executePadronOperation(\n options,\n \"padron-a5\",\n \"getPersona_v2\",\n {\n idPersona: Number.parseInt(String(taxId), 10),\n }\n );\n if (!raw) {\n return null;\n }\n const record = raw as Record<string, unknown>;\n const datosGenerales = record.datosGenerales as\n | Record<string, unknown>\n | undefined;\n return {\n taxId: String(record.idPersona ?? \"\"),\n ...(record.tipoPersona !== undefined\n ? { personType: String(record.tipoPersona) }\n : {}),\n ...(datosGenerales\n ? { name: extractPadronName(datosGenerales) }\n : {}),\n raw: record,\n };\n },\n async getTaxIdByDocument(documentNumber) {\n const raw = await executePadronOperation(\n options,\n \"padron-a13\",\n \"getIdPersonaListByDocumento\",\n {\n documento: String(documentNumber),\n }\n );\n if (!raw) {\n return null;\n }\n const record = raw as Record<string, unknown>;\n const idPersona = record.idPersona;\n const taxIds = Array.isArray(idPersona)\n ? idPersona.map(String)\n : idPersona !== undefined\n ? [String(idPersona)]\n : [];\n return {\n taxIds,\n raw: record,\n };\n },\n };\n}\n\nfunction extractPadronName(\n datosGenerales: Record<string, unknown>\n): string | undefined {\n if (typeof datosGenerales.razonSocial === \"string\") {\n return datosGenerales.razonSocial;\n }\n const nombre = datosGenerales.nombre;\n const apellido = datosGenerales.apellido;\n if (typeof apellido === \"string\" && typeof nombre === \"string\") {\n return `${apellido} ${nombre}`.trim();\n }\n if (typeof apellido === \"string\") {\n return apellido;\n }\n if (typeof nombre === \"string\") {\n return nombre;\n }\n return undefined;\n}\n\nasync function executePadronOperation(\n options: CreatePadronServiceOptions,\n service: ArcaPadronServiceName,\n operation: string,\n body: Record<string, unknown>\n) {\n const auth = await options.auth.login(\n service === \"padron-a5\"\n ? \"ws_sr_constancia_inscripcion\"\n : \"ws_sr_padron_a13\"\n );\n\n try {\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service,\n operation,\n bodyElementNamespaceMode: \"prefix\",\n body: {\n token: auth.token,\n sign: auth.sign,\n cuitRepresentada: Number.parseInt(options.config.taxId, 10),\n ...body,\n },\n });\n\n const operationResponse = response.result as Record<string, unknown>;\n\n if (operation === \"getPersona_v2\") {\n return operationResponse.personaReturn ?? null;\n }\n\n if (operation === \"getIdPersonaListByDocumento\") {\n return operationResponse.idPersonaListReturn ?? null;\n }\n\n return operationResponse.return ?? null;\n } catch (error) {\n if (\n error instanceof ArcaSoapFaultError &&\n error.message.toLowerCase().includes(\"no existe\")\n ) {\n return null;\n }\n\n throw error;\n }\n}\n"],"mappings":";AACO,IAAM,YAAN,cAAwB,MAAM;AAAA,EAC1B;AAAA,EACS,OAAe;AAAA,EAEjC,YAAY,SAAiB,OAAO,cAAc,SAAwB;AACxE,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAuCO,IAAM,qBAAN,cAAiC,UAAU;AAAA,EAC9B,OAAe;AAAA,EACxB;AAAA,EACA;AAAA,EAET,YACE,SACA,SAIA;AACA,UAAM,SAAS,mBAAmB,OAAO;AACzC,SAAK,YAAY,SAAS;AAC1B,SAAK,SAAS,SAAS;AAAA,EACzB;AACF;;;ACvBO,SAAS,oBACd,SACe;AACf,SAAO;AAAA,IACL,MAAM,mBAAmB,OAAO;AAC9B,YAAM,MAAM,MAAM;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,WAAW,OAAO,SAAS,OAAO,KAAK,GAAG,EAAE;AAAA,QAC9C;AAAA,MACF;AACA,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,MACT;AACA,YAAM,SAAS;AACf,YAAM,iBAAiB,OAAO;AAG9B,aAAO;AAAA,QACL,OAAO,OAAO,OAAO,aAAa,EAAE;AAAA,QACpC,GAAI,OAAO,gBAAgB,SACvB,EAAE,YAAY,OAAO,OAAO,WAAW,EAAE,IACzC,CAAC;AAAA,QACL,GAAI,iBACA,EAAE,MAAM,kBAAkB,cAAc,EAAE,IAC1C,CAAC;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA,MAAM,mBAAmB,gBAAgB;AACvC,YAAM,MAAM,MAAM;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,WAAW,OAAO,cAAc;AAAA,QAClC;AAAA,MACF;AACA,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,MACT;AACA,YAAM,SAAS;AACf,YAAM,YAAY,OAAO;AACzB,YAAM,SAAS,MAAM,QAAQ,SAAS,IAClC,UAAU,IAAI,MAAM,IACpB,cAAc,SACZ,CAAC,OAAO,SAAS,CAAC,IAClB,CAAC;AACP,aAAO;AAAA,QACL;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBACP,gBACoB;AACpB,MAAI,OAAO,eAAe,gBAAgB,UAAU;AAClD,WAAO,eAAe;AAAA,EACxB;AACA,QAAM,SAAS,eAAe;AAC9B,QAAM,WAAW,eAAe;AAChC,MAAI,OAAO,aAAa,YAAY,OAAO,WAAW,UAAU;AAC9D,WAAO,GAAG,QAAQ,IAAI,MAAM,GAAG,KAAK;AAAA,EACtC;AACA,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,uBACb,SACA,SACA,WACA,MACA;AACA,QAAM,OAAO,MAAM,QAAQ,KAAK;AAAA,IAC9B,YAAY,cACR,iCACA;AAAA,EACN;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,KAAK,QAGlC;AAAA,MACA;AAAA,MACA;AAAA,MACA,0BAA0B;AAAA,MAC1B,MAAM;AAAA,QACJ,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,QACX,kBAAkB,OAAO,SAAS,QAAQ,OAAO,OAAO,EAAE;AAAA,QAC1D,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAED,UAAM,oBAAoB,SAAS;AAEnC,QAAI,cAAc,iBAAiB;AACjC,aAAO,kBAAkB,iBAAiB;AAAA,IAC5C;AAEA,QAAI,cAAc,+BAA+B;AAC/C,aAAO,kBAAkB,uBAAuB;AAAA,IAClD;AAEA,WAAO,kBAAkB,UAAU;AAAA,EACrC,SAAS,OAAO;AACd,QACE,iBAAiB,sBACjB,MAAM,QAAQ,YAAY,EAAE,SAAS,WAAW,GAChD;AACA,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;","names":[]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Target environment for ARCA services. */
|
|
2
|
+
type ArcaEnvironment = "production" | "test";
|
|
3
|
+
/** All ARCA service identifiers, including WSAA. */
|
|
4
|
+
type ArcaServiceName = "wsaa" | "wsfe" | "wsmtxca" | "padron-a5" | "padron-a13";
|
|
5
|
+
/** ARCA service identifiers excluding the WSAA authentication service. */
|
|
6
|
+
type ArcaServiceTarget = Exclude<ArcaServiceName, "wsaa">;
|
|
7
|
+
/** Padron-specific service identifiers. */
|
|
8
|
+
type ArcaPadronServiceName = Extract<ArcaServiceTarget, "padron-a5" | "padron-a13">;
|
|
9
|
+
/** WSAA service identifiers used for authentication scoping. */
|
|
10
|
+
type ArcaWsaaServiceId = "wsfe" | "wsmtxca" | "ws_sr_constancia_inscripcion" | "ws_sr_padron_a13";
|
|
11
|
+
/** WSAA credential cache strategy. Disk mode requires a `directory`. */
|
|
12
|
+
type ArcaWsaaCacheConfig = {
|
|
13
|
+
mode?: "memory";
|
|
14
|
+
} | {
|
|
15
|
+
mode: "disk";
|
|
16
|
+
directory: string;
|
|
17
|
+
};
|
|
18
|
+
/** Configuration required to create an ARCA client. */
|
|
19
|
+
type ArcaClientConfig = {
|
|
20
|
+
taxId: string;
|
|
21
|
+
certificatePem: string;
|
|
22
|
+
privateKeyPem: string;
|
|
23
|
+
environment: ArcaEnvironment;
|
|
24
|
+
wsaa?: {
|
|
25
|
+
cache?: ArcaWsaaCacheConfig;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/** Credentials returned by a WSAA login. */
|
|
29
|
+
type ArcaAuthCredentials = {
|
|
30
|
+
token: string;
|
|
31
|
+
sign: string;
|
|
32
|
+
expiresAt: string;
|
|
33
|
+
};
|
|
34
|
+
type ArcaRepresentedTaxId = number | string | undefined;
|
|
35
|
+
type ArcaSoapResponse<TResult> = {
|
|
36
|
+
service: ArcaServiceName;
|
|
37
|
+
operation: string;
|
|
38
|
+
raw: string;
|
|
39
|
+
result: TResult;
|
|
40
|
+
};
|
|
41
|
+
type ArcaAuthOptions = {
|
|
42
|
+
forceRefresh?: boolean;
|
|
43
|
+
representedTaxId?: ArcaRepresentedTaxId;
|
|
44
|
+
};
|
|
45
|
+
type ArcaSoapExecutionOptions<TBody> = {
|
|
46
|
+
service: ArcaServiceName;
|
|
47
|
+
operation: string;
|
|
48
|
+
bodyElementName?: string;
|
|
49
|
+
bodyElementNamespaceMode?: "default" | "prefix";
|
|
50
|
+
body: TBody;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export type { ArcaClientConfig as A, ArcaEnvironment as a, ArcaAuthCredentials as b, ArcaAuthOptions as c, ArcaPadronServiceName as d, ArcaRepresentedTaxId as e, ArcaServiceName as f, ArcaServiceTarget as g, ArcaWsaaCacheConfig as h, ArcaWsaaServiceId as i, ArcaSoapExecutionOptions as j, ArcaSoapResponse as k };
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { b as ArcaAuthCredentials, c as ArcaAuthOptions, A as ArcaClientConfig, a as ArcaEnvironment, d as ArcaPadronServiceName, e as ArcaRepresentedTaxId, f as ArcaServiceName, g as ArcaServiceTarget, h as ArcaWsaaCacheConfig, i as ArcaWsaaServiceId } from './types-DWsYue4B.js';
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/wsfe.d.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { W as WsaaAuthModule, S as SoapTransport } from './index-vWZOjFDO.js';
|
|
2
|
+
import { A as ArcaClientConfig } from './types-DWsYue4B.js';
|
|
3
|
+
|
|
4
|
+
/** An associated voucher referenced by a WSFE invoice request. */
|
|
5
|
+
type WsfeAssociatedVoucher = {
|
|
6
|
+
type: number;
|
|
7
|
+
salesPoint: number;
|
|
8
|
+
number: number;
|
|
9
|
+
taxId?: string;
|
|
10
|
+
voucherDate?: string;
|
|
11
|
+
};
|
|
12
|
+
/** A tax (tributo) item in a WSFE invoice request. */
|
|
13
|
+
type WsfeTax = {
|
|
14
|
+
id: number;
|
|
15
|
+
description?: string;
|
|
16
|
+
baseAmount: number;
|
|
17
|
+
rate: number;
|
|
18
|
+
amount: number;
|
|
19
|
+
};
|
|
20
|
+
/** A VAT rate (alícuota IVA) item in a WSFE invoice request. */
|
|
21
|
+
type WsfeVatRate = {
|
|
22
|
+
id: number;
|
|
23
|
+
baseAmount: number;
|
|
24
|
+
amount: number;
|
|
25
|
+
};
|
|
26
|
+
/** An optional field (campo opcional) in a WSFE invoice request. */
|
|
27
|
+
type WsfeOptionalField = {
|
|
28
|
+
id: string;
|
|
29
|
+
value: string;
|
|
30
|
+
};
|
|
31
|
+
/** A buyer (comprador) in a WSFE invoice request. */
|
|
32
|
+
type WsfeBuyer = {
|
|
33
|
+
documentType: number;
|
|
34
|
+
documentNumber: number;
|
|
35
|
+
percentage: number;
|
|
36
|
+
};
|
|
37
|
+
/** Input data for creating a new WSFE voucher via {@link WsfeService.createNextVoucher}. */
|
|
38
|
+
type WsfeVoucherInput = {
|
|
39
|
+
salesPoint: number;
|
|
40
|
+
voucherType: number;
|
|
41
|
+
concept: number;
|
|
42
|
+
documentType: number;
|
|
43
|
+
documentNumber: number;
|
|
44
|
+
receiverVatConditionId?: number;
|
|
45
|
+
voucherDate: string;
|
|
46
|
+
totalAmount: number;
|
|
47
|
+
nonTaxableAmount: number;
|
|
48
|
+
netAmount: number;
|
|
49
|
+
exemptAmount: number;
|
|
50
|
+
taxAmount: number;
|
|
51
|
+
vatAmount: number;
|
|
52
|
+
currencyId: string;
|
|
53
|
+
exchangeRate: number;
|
|
54
|
+
serviceStartDate?: string;
|
|
55
|
+
serviceEndDate?: string;
|
|
56
|
+
paymentDueDate?: string;
|
|
57
|
+
associatedVouchers?: WsfeAssociatedVoucher[];
|
|
58
|
+
taxes?: WsfeTax[];
|
|
59
|
+
vatRates?: WsfeVatRate[];
|
|
60
|
+
optionalFields?: WsfeOptionalField[];
|
|
61
|
+
buyers?: WsfeBuyer[];
|
|
62
|
+
};
|
|
63
|
+
/** Result of a successful WSFE voucher authorization. */
|
|
64
|
+
type WsfeAuthorizationResult = {
|
|
65
|
+
cae: string;
|
|
66
|
+
caeExpiry: string;
|
|
67
|
+
voucherNumber: number;
|
|
68
|
+
raw: Record<string, unknown>;
|
|
69
|
+
};
|
|
70
|
+
/** A point-of-sale entry returned by {@link WsfeService.getSalesPoints}. */
|
|
71
|
+
type WsfeSalesPoint = {
|
|
72
|
+
number: number;
|
|
73
|
+
emissionType?: string;
|
|
74
|
+
blocked?: string;
|
|
75
|
+
deletedSince?: string;
|
|
76
|
+
};
|
|
77
|
+
/** Voucher details returned by {@link WsfeService.getVoucherInfo}. */
|
|
78
|
+
type WsfeVoucherInfo = {
|
|
79
|
+
voucherNumber: number;
|
|
80
|
+
voucherDate?: string;
|
|
81
|
+
salesPoint?: number;
|
|
82
|
+
voucherType?: number;
|
|
83
|
+
totalAmount?: number;
|
|
84
|
+
result?: string;
|
|
85
|
+
cae?: string;
|
|
86
|
+
caeExpiry?: string;
|
|
87
|
+
raw: Record<string, unknown>;
|
|
88
|
+
};
|
|
89
|
+
/** WSFE electronic invoicing service. */
|
|
90
|
+
type WsfeService = {
|
|
91
|
+
/** Authorizes a new voucher by fetching the next number and requesting a CAE. */
|
|
92
|
+
createNextVoucher(input: {
|
|
93
|
+
representedTaxId?: number | string;
|
|
94
|
+
data: WsfeVoucherInput;
|
|
95
|
+
}): Promise<WsfeAuthorizationResult>;
|
|
96
|
+
/** Returns the next available voucher number for the given sales point and type. */
|
|
97
|
+
getLastVoucher(input: {
|
|
98
|
+
representedTaxId?: number | string;
|
|
99
|
+
salesPoint: number;
|
|
100
|
+
voucherType: number;
|
|
101
|
+
forceAuthRefresh?: boolean;
|
|
102
|
+
}): Promise<number>;
|
|
103
|
+
/** Lists all configured points of sale for the taxpayer. */
|
|
104
|
+
getSalesPoints(input: {
|
|
105
|
+
representedTaxId?: number | string;
|
|
106
|
+
forceAuthRefresh?: boolean;
|
|
107
|
+
}): Promise<WsfeSalesPoint[]>;
|
|
108
|
+
/** Retrieves details for a specific voucher. Returns `null` if not found. */
|
|
109
|
+
getVoucherInfo(input: {
|
|
110
|
+
representedTaxId?: number | string;
|
|
111
|
+
number: number;
|
|
112
|
+
salesPoint: number;
|
|
113
|
+
voucherType: number;
|
|
114
|
+
}): Promise<WsfeVoucherInfo | null>;
|
|
115
|
+
};
|
|
116
|
+
type CreateWsfeServiceOptions = {
|
|
117
|
+
config: ArcaClientConfig;
|
|
118
|
+
auth: WsaaAuthModule;
|
|
119
|
+
soap: SoapTransport;
|
|
120
|
+
};
|
|
121
|
+
/** Creates a WSFE service instance wired with authentication and SOAP transport. */
|
|
122
|
+
declare function createWsfeService(options: CreateWsfeServiceOptions): WsfeService;
|
|
123
|
+
|
|
124
|
+
export { type CreateWsfeServiceOptions, type WsfeAssociatedVoucher, type WsfeAuthorizationResult, type WsfeBuyer, type WsfeOptionalField, type WsfeSalesPoint, type WsfeService, type WsfeTax, type WsfeVatRate, type WsfeVoucherInfo, type WsfeVoucherInput, createWsfeService };
|