facturas 0.17.0 → 0.18.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 +0,0 @@
1
- {"version":3,"sources":["../src/services/padron.ts"],"sourcesContent":["import type { ReceiverCondition } from \"../constants\";\nimport { ArcaSoapFaultError } from \"../errors\";\nimport type {\n ArcaClientConfig,\n ArcaPadronServiceName,\n} from \"../internal/types\";\nimport type { SoapTransport } from \"../soap\";\nimport type { WsaaAuthModule } from \"../wsaa\";\n\n/** One tax registration reported by the constancia de inscripción. */\nexport type PadronTax = {\n id: number;\n description?: string;\n /** ARCA's state code; `AC` is active. Absent when ARCA omits it. */\n state?: string;\n regime: \"general\" | \"monotributo\";\n};\n\n/** Result of a taxpayer lookup via Padron A5. */\nexport type PadronTaxpayerResult = {\n taxId: string;\n personType?: string;\n name?: string;\n /**\n * The receiver condition to invoice this taxpayer under, derived from its\n * active IVA registrations: 30 is responsable inscripto, 20 monotributo, 32\n * exento and 34 no alcanzado. A taxpayer with none of them is a consumidor\n * final. Absent when the registrations contradict each other or when the\n * constancia reports an error, because then they may be missing.\n */\n condition?: ReceiverCondition;\n taxes: PadronTax[];\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 if (isPadronNotFound(record)) {\n return null;\n }\n const datosGenerales = record.datosGenerales as\n | Record<string, unknown>\n | undefined;\n const idPersona = record.idPersona ?? datosGenerales?.idPersona;\n const tipoPersona = record.tipoPersona ?? datosGenerales?.tipoPersona;\n const taxes = extractPadronTaxes(record);\n // A constancia with an unresolved error may be missing registrations, so\n // their absence proves nothing about the receiver's condition.\n const condition = hasConstanciaError(record)\n ? undefined\n : deriveReceiverCondition(taxes);\n return {\n taxId: String(idPersona ?? taxId),\n ...(tipoPersona === undefined\n ? {}\n : { personType: String(tipoPersona) }),\n ...(datosGenerales ? { name: extractPadronName(datosGenerales) } : {}),\n ...(condition === undefined ? {} : { condition }),\n taxes,\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 ? []\n : [String(idPersona)];\n return {\n taxIds,\n raw: record,\n };\n },\n };\n}\n\nconst IVA_TAX_CONDITIONS: Readonly<Record<number, ReceiverCondition>> = {\n 20: \"monotributo\",\n 30: \"responsable_inscripto\",\n 32: \"exento\",\n 34: \"no_alcanzado\",\n};\n\n// The constancia answers a missing CUIT inside errorConstancia, not as a fault.\nconst NOT_FOUND_PHRASES = [\n \"la clave solicitada no existe\",\n \"no existe persona con ese id\",\n \"no existe persona con esa clave\",\n \"persona no encontrada\",\n \"no se encontro informacion para la clave\",\n];\n\nfunction constanciaErrors(record: Record<string, unknown>): string[] {\n const errorConstancia = record.errorConstancia as\n | { error?: unknown }\n | undefined;\n const errors = errorConstancia?.error;\n return (Array.isArray(errors) ? errors : [errors]).filter(\n (message): message is string =>\n typeof message === \"string\" && message.trim() !== \"\"\n );\n}\n\nfunction hasConstanciaError(record: Record<string, unknown>): boolean {\n return constanciaErrors(record).length > 0;\n}\n\nfunction isPadronNotFound(record: Record<string, unknown>): boolean {\n return constanciaErrors(record).some((message) =>\n NOT_FOUND_PHRASES.some((phrase) => plainText(message).includes(phrase))\n );\n}\n\nfunction plainText(value: string): string {\n return value\n .normalize(\"NFD\")\n .replace(/\\p{Diacritic}/gu, \"\")\n .toLowerCase();\n}\n\nfunction extractPadronTaxes(record: Record<string, unknown>): PadronTax[] {\n const taxes: PadronTax[] = [];\n for (const [regime, field] of [\n [\"general\", \"datosRegimenGeneral\"],\n [\"monotributo\", \"datosMonotributo\"],\n ] as const) {\n const bucket = record[field] as { impuesto?: unknown } | undefined;\n const rows = bucket?.impuesto;\n for (const row of Array.isArray(rows) ? rows : rows ? [rows] : []) {\n const tax = row as Record<string, unknown>;\n const id = Number(tax.idImpuesto);\n if (!Number.isSafeInteger(id)) {\n continue;\n }\n taxes.push({\n id,\n ...(typeof tax.descripcionImpuesto === \"string\"\n ? { description: tax.descripcionImpuesto }\n : {}),\n ...(typeof tax.estadoImpuesto === \"string\"\n ? { state: tax.estadoImpuesto.trim().toUpperCase() }\n : {}),\n regime,\n });\n }\n }\n return taxes;\n}\n\n/** One active IVA registration decides; none is a consumidor final; two is nobody's call. */\nfunction deriveReceiverCondition(\n taxes: readonly PadronTax[]\n): ReceiverCondition | undefined {\n const conditions = new Set<ReceiverCondition>();\n for (const tax of taxes) {\n const condition = IVA_TAX_CONDITIONS[tax.id];\n if (condition && (tax.state === undefined || tax.state === \"AC\")) {\n conditions.add(condition);\n }\n }\n if (conditions.size === 0) {\n return \"consumidor_final\";\n }\n return conditions.size === 1 ? [...conditions][0] : undefined;\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 // Public Padron A5/A13 WSDLs expose only a generic validation fault, so\n // there is no documented not-found-specific fault code to match here.\n // Keep the current message fallback, but treat it as fragile.\n error.message.toLowerCase().includes(\"no existe\")\n ) {\n return null;\n }\n\n throw error;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/internal/decimal.ts","../src/services/wsfe.ts"],"sourcesContent":["import { ArcaInputError } from \"../errors\";\n\nconst AMOUNT_SCALE = 100;\nconst EXCHANGE_RATE_SCALE = 1_000_000;\nconst EXCHANGE_RATE_SCALE_BIGINT = 1_000_000n;\nconst PERCENTAGE_SCALE = 100;\n\n// WSFE documents amount fields as 13 integer digits plus 2 decimals.\nconst MAX_ARCA_AMOUNT_MINOR_UNITS = 999_999_999_999_999n;\n// MonCotiz is documented as 4 integer digits plus 6 decimals.\nconst MAX_ARCA_EXCHANGE_RATE_SCALED = 9_999_999_999n;\n// Tributo.Alic is documented as 3 integer digits plus 2 decimals.\nconst MAX_ARCA_PERCENTAGE_HUNDREDTHS = 99_999n;\n\nexport const SUPPORTED_VAT_RATES = [0, 2.5, 5, 10.5, 21, 27] as const;\nexport type SupportedVatRate = (typeof SUPPORTED_VAT_RATES)[number];\n\nconst VAT_RATE_BASIS_POINTS: Record<SupportedVatRate, bigint> = {\n 0: 0n,\n 2.5: 250n,\n 5: 500n,\n 10.5: 1050n,\n 21: 2100n,\n 27: 2700n,\n};\n\nexport function normalizeArcaAmountToMinorUnits(\n value: number,\n field: string\n): bigint {\n return normalizeScaledNumber({\n value,\n field,\n scale: AMOUNT_SCALE,\n maximum: MAX_ARCA_AMOUNT_MINOR_UNITS,\n expected: \"a finite non-negative amount with at most 2 decimal places\",\n });\n}\n\nexport function serializeArcaAmount(value: number, field: string): string {\n return formatScaledInteger(normalizeArcaAmountToMinorUnits(value, field), 2);\n}\n\nexport function serializeArcaMinorUnits(value: number, field: string): string {\n return formatScaledInteger(assertArcaMinorUnits(value, field), 2);\n}\n\nexport function serializeArcaPercentage(value: number, field: string): string {\n const scaled = normalizeScaledNumber({\n value,\n field,\n scale: PERCENTAGE_SCALE,\n maximum: MAX_ARCA_PERCENTAGE_HUNDREDTHS,\n expected: \"a finite non-negative percentage with at most 2 decimal places\",\n });\n return formatScaledInteger(scaled, 2);\n}\n\nexport function serializeArcaExchangeRate(\n value: number | string,\n field: string\n): string {\n const scaled =\n typeof value === \"number\"\n ? normalizeExchangeRateNumber(value, field)\n : normalizeExchangeRateString(value, field);\n\n if (scaled <= 0n || scaled > MAX_ARCA_EXCHANGE_RATE_SCALED) {\n throwInvalidExchangeRate(field);\n }\n\n return formatScaledInteger(scaled, 6, true);\n}\n\nexport function assertArcaMinorUnits(value: number, field: string): bigint {\n if (!(Number.isSafeInteger(value) && value >= 0)) {\n throw new ArcaInputError(\n `${field} must be a non-negative safe integer in currency minor units.`,\n {\n code: \"ARCA_INPUT_INVALID_AMOUNT\",\n field,\n expected: \"a non-negative safe integer in currency minor units\",\n }\n );\n }\n\n const minorUnits = BigInt(value);\n if (minorUnits > MAX_ARCA_AMOUNT_MINOR_UNITS) {\n throw new ArcaInputError(`${field} exceeds the WSFE amount limit.`, {\n code: \"ARCA_INPUT_INVALID_AMOUNT\",\n field,\n expected: \"at most 13 integer digits and 2 decimal places\",\n });\n }\n\n return minorUnits;\n}\n\nexport function arcaMinorUnitsToNumber(\n minorUnits: bigint,\n field: string\n): number {\n if (minorUnits < 0n || minorUnits > MAX_ARCA_AMOUNT_MINOR_UNITS) {\n throw new ArcaInputError(`${field} exceeds the WSFE amount limit.`, {\n code: \"ARCA_INPUT_INVALID_AMOUNT\",\n field,\n expected: \"at most 13 integer digits and 2 decimal places\",\n });\n }\n\n return Number(formatScaledInteger(minorUnits, 2));\n}\n\nexport function calculateVatMinorUnits(\n taxableMinorUnits: bigint,\n vatRate: SupportedVatRate,\n field: string\n): bigint {\n const basisPoints = VAT_RATE_BASIS_POINTS[vatRate];\n if (basisPoints === undefined) {\n throw new ArcaInputError(`${field} is not a supported VAT rate.`, {\n code: \"ARCA_INPUT_INVALID_VALUE\",\n field,\n expected: \"one of 0, 2.5, 5, 10.5, 21, or 27\",\n });\n }\n\n return roundHalfEvenRatio(taxableMinorUnits * basisPoints, 10_000n);\n}\n\n/**\n * Divides two non-negative integers and rounds the quotient to the nearest\n * integer, breaking exact ties toward the even neighbour.\n *\n * This is the rounding criterion the WSFE developer manual documents for the\n * service (\"Round Half Even\", section on validation tolerances), so VAT\n * derived here matches what ARCA computes for the same base and rate.\n */\nexport function roundHalfEvenRatio(\n numerator: bigint,\n denominator: bigint\n): bigint {\n if (numerator < 0n || denominator <= 0n) {\n throw new RangeError(\n \"roundHalfEvenRatio requires a non-negative numerator and a positive denominator.\"\n );\n }\n\n const quotient = numerator / denominator;\n const doubledRemainder = (numerator % denominator) * 2n;\n if (doubledRemainder > denominator) {\n return quotient + 1n;\n }\n if (doubledRemainder < denominator) {\n return quotient;\n }\n return quotient % 2n === 0n ? quotient : quotient + 1n;\n}\n\nexport function isWithinArcaTolerance(\n actualMinorUnits: bigint,\n expectedMinorUnits: bigint,\n absoluteCentAllowance = 1\n): boolean {\n const difference = absoluteBigInt(actualMinorUnits - expectedMinorUnits);\n if (difference <= BigInt(Math.max(1, absoluteCentAllowance))) {\n return true;\n }\n\n const comparisonBase = absoluteBigInt(expectedMinorUnits);\n return comparisonBase > 0n && difference * 10_000n <= comparisonBase;\n}\n\nfunction normalizeScaledNumber({\n value,\n field,\n scale,\n maximum,\n expected,\n}: {\n value: number;\n field: string;\n scale: number;\n maximum: bigint;\n expected: string;\n}): bigint {\n if (!(Number.isFinite(value) && value >= 0)) {\n throw new ArcaInputError(`${field} must be ${expected}.`, {\n code: \"ARCA_INPUT_INVALID_AMOUNT\",\n field,\n expected,\n });\n }\n\n const scaled = value * scale;\n const nearestInteger = Math.round(scaled);\n const representationTolerance = Math.max(\n 1e-9,\n Math.abs(scaled) * Number.EPSILON * 4\n );\n\n if (Math.abs(scaled - nearestInteger) > representationTolerance) {\n throw new ArcaInputError(\n `${field} has more precision than its ARCA field allows.`,\n {\n code: \"ARCA_INPUT_AMOUNT_PRECISION\",\n field,\n expected,\n }\n );\n }\n\n if (!Number.isSafeInteger(nearestInteger)) {\n throw new ArcaInputError(`${field} exceeds the safely supported range.`, {\n code: \"ARCA_INPUT_INVALID_AMOUNT\",\n field,\n expected,\n });\n }\n\n const normalized = BigInt(nearestInteger);\n if (normalized > maximum) {\n throw new ArcaInputError(`${field} exceeds the ARCA field limit.`, {\n code: \"ARCA_INPUT_INVALID_AMOUNT\",\n field,\n expected,\n });\n }\n\n return normalized;\n}\n\nfunction normalizeExchangeRateNumber(value: number, field: string): bigint {\n if (!(Number.isFinite(value) && value > 0)) {\n throwInvalidExchangeRate(field);\n }\n\n const scaled = value * EXCHANGE_RATE_SCALE;\n const nearestInteger = Math.round(scaled);\n const representationTolerance = Math.max(\n 1e-9,\n Math.abs(scaled) * Number.EPSILON * 4\n );\n\n if (\n Math.abs(scaled - nearestInteger) > representationTolerance ||\n !Number.isSafeInteger(nearestInteger)\n ) {\n throwInvalidExchangeRate(field);\n }\n\n return BigInt(nearestInteger);\n}\n\nfunction normalizeExchangeRateString(value: string, field: string): bigint {\n const match = value.match(/^(0|[1-9]\\d{0,3})(?:\\.(\\d{1,6}))?$/);\n if (!match) {\n throwInvalidExchangeRate(field);\n }\n\n const [, integerPart, fractionPart = \"\"] = match;\n return (\n BigInt(integerPart) * EXCHANGE_RATE_SCALE_BIGINT +\n BigInt(fractionPart.padEnd(6, \"0\"))\n );\n}\n\nfunction throwInvalidExchangeRate(field: string): never {\n throw new ArcaInputError(\n `${field} must be a positive decimal with at most 4 integer and 6 fractional digits.`,\n {\n code: \"ARCA_INPUT_INVALID_EXCHANGE_RATE\",\n field,\n expected:\n \"a positive decimal with up to 4 integer and 6 fractional digits\",\n }\n );\n}\n\nfunction formatScaledInteger(\n value: bigint,\n fractionDigits: number,\n trimTrailingZeros = false\n): string {\n const scale = 10n ** BigInt(fractionDigits);\n const integerPart = value / scale;\n const fractionPart = (value % scale).toString().padStart(fractionDigits, \"0\");\n\n if (trimTrailingZeros) {\n const trimmedFraction = fractionPart.replace(/0+$/, \"\");\n return trimmedFraction.length === 0\n ? integerPart.toString()\n : `${integerPart}.${trimmedFraction}`;\n }\n\n return `${integerPart}.${fractionPart}`;\n}\n\nfunction absoluteBigInt(value: bigint): bigint {\n return value < 0n ? -value : value;\n}\n","import {\n ArcaInputError,\n ArcaInvalidSoapResponseError,\n ArcaServiceError,\n ArcaSoapFaultError,\n ArcaTransportError,\n} from \"../errors\";\nimport {\n classifyArcaAuthenticationError,\n classifyArcaAuthenticationIssues,\n createArcaAuthenticationEvidence,\n executeWithAuthenticationRecovery,\n} from \"../internal/authentication\";\nimport {\n isWithinArcaTolerance,\n normalizeArcaAmountToMinorUnits,\n serializeArcaAmount,\n serializeArcaExchangeRate,\n serializeArcaPercentage,\n} from \"../internal/decimal\";\nimport type { ArcaClientConfig, ArcaRepresentedTaxId } from \"../internal/types\";\nimport type { SoapTransport } from \"../soap\";\nimport type { WsaaAuthModule } from \"../wsaa\";\nimport type {\n ArcaAuthorizationIndeterminateReason,\n ArcaAuthorizationOutcome,\n ArcaFiscalIssue,\n ArcaFiscalResultLevel,\n ArcaVoucherLookupResult,\n} from \"./fiscal-evidence\";\n\n/** Accepted public date inputs for WSFE request fields. */\nexport type WsfeDateInput =\n | `${number}${number}${number}${number}-${number}${number}-${number}${number}`\n | `${number}${number}${number}${number}${number}${number}${number}${number}`;\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?: WsfeDateInput;\n};\n\n/** An associated period used by WSFE credit/debit notes without associated vouchers. */\nexport type WsfeAssociatedPeriod = {\n startDate: WsfeDateInput;\n endDate: WsfeDateInput;\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/** An activity associated with a WSFE invoice request. */\nexport type WsfeActivity = {\n id: number;\n};\n\n/** Input data for authorizing a WSFE voucher. */\nexport type WsfeVoucherInput = {\n salesPoint: number;\n voucherType: number;\n concept: number;\n documentType: number;\n documentNumber: number;\n receiverVatConditionId: number;\n voucherDate: WsfeDateInput;\n totalAmount: number;\n nonTaxableAmount: number;\n netAmount: number;\n exemptAmount: number;\n taxAmount: number;\n vatAmount: number;\n currencyId: string;\n exchangeRate?: number | string;\n sameCurrencyForeignCancellation?: \"S\" | \"N\";\n serviceStartDate?: WsfeDateInput;\n serviceEndDate?: WsfeDateInput;\n paymentDueDate?: WsfeDateInput;\n associatedVouchers?: WsfeAssociatedVoucher[];\n associatedPeriod?: WsfeAssociatedPeriod;\n taxes?: WsfeTax[];\n vatRates?: WsfeVatRate[];\n optionalFields?: WsfeOptionalField[];\n buyers?: WsfeBuyer[];\n activities?: WsfeActivity[];\n};\n\n/** Input for {@link WsfeService.issue}: one voucher with an explicit number. */\nexport type WsfeIssueInput = {\n representedTaxId?: number | string;\n data: WsfeVoucherInput;\n voucherNumber: number;\n forceRefresh?: boolean;\n /** Aborts login, submission and consultation with the caller's deadline. */\n abortSignal?: AbortSignal;\n};\n\n/** Structured evidence from one exact WSFE authorization attempt. */\nexport type WsfeAuthorizationOutcome = ArcaAuthorizationOutcome<\"wsfe\">;\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 concept?: number;\n documentType?: number;\n documentNumber?: string;\n receiverVatConditionId?: number;\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 result?: string;\n cae?: string;\n caeExpiry?: string;\n vatRates?: WsfeVatRate[];\n serviceStartDate?: string;\n serviceEndDate?: string;\n paymentDueDate?: string;\n taxes?: WsfeTax[];\n associatedVouchers?: WsfeAssociatedVoucher[];\n associatedPeriod?: WsfeAssociatedPeriod;\n optionalFields?: WsfeOptionalField[];\n buyers?: WsfeBuyer[];\n activities?: WsfeActivity[];\n sameCurrencyForeignCancellation?: \"S\" | \"N\";\n raw: Record<string, unknown>;\n};\n\n/** Typed exact-voucher consultation result for WSFE. */\nexport type WsfeVoucherLookupResult = ArcaVoucherLookupResult<\n WsfeVoucherInfo,\n \"wsfe\"\n>;\n\nexport type WsfeCatalogEntry = {\n id: number;\n description: string;\n};\n\nexport type WsfeActivityType = WsfeCatalogEntry & {\n order: number;\n};\n\nexport type WsfeReceiverVatCondition = WsfeCatalogEntry & {\n voucherClass: string;\n};\n\nexport type WsfeCurrencyType = {\n id: string;\n description: string;\n validFrom: string;\n validTo: string;\n};\n\nexport type WsfeServerStatus = {\n appServer: string;\n dbServer: string;\n authServer: string;\n};\n\nexport type WsfeQuotation = {\n currencyId: string;\n rate: number;\n date: string;\n};\n\n/** WSFE electronic invoicing service. */\nexport type WsfeService = {\n /**\n * Issues one exact voucher: a single FECAESolicitar for the caller-owned\n * `voucherNumber`, without transport retries, returning structured evidence\n * (`authorized`, `rejected` or `indeterminate`) instead of throwing.\n */\n issue(input: WsfeIssueInput): Promise<WsfeAuthorizationOutcome>;\n /** Returns the next available voucher number for the given sales point and type. */\n getNextVoucherNumber(input: {\n representedTaxId?: number | string;\n salesPoint: number;\n voucherType: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<number>;\n /** Lists all configured points of sale for the taxpayer. */\n getSalesPoints(input?: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeSalesPoint[]>;\n /** Lists voucher types accepted by WSFE. */\n getVoucherTypes(input?: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists document types accepted by WSFE. */\n getDocumentTypes(input?: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists concept types accepted by WSFE. */\n getConceptTypes(input?: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists live ARCA currency identifiers such as PES and DOL, not ISO codes. */\n getCurrencyTypes(input?: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCurrencyType[]>;\n /** Lists VAT rates accepted by WSFE. */\n getVatRates(input?: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists tax types accepted by WSFE. */\n getTaxTypes(input?: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists optional field types accepted by WSFE. */\n getOptionalTypes(input?: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeCatalogEntry[]>;\n /** Lists activities enabled for the taxpayer. */\n getActivities(input?: {\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeActivityType[]>;\n /** Lists receiver VAT condition values accepted by WSFE. */\n getReceiverVatConditions(input?: {\n representedTaxId?: number | string;\n voucherClass?: string;\n forceRefresh?: boolean;\n }): Promise<WsfeReceiverVatCondition[]>;\n /** Reports WSFE backend status without requiring taxpayer authorization. */\n getServerStatus(): Promise<WsfeServerStatus>;\n /** Returns the exchange rate for a given currency. */\n getQuotation(input: {\n currencyId: string;\n representedTaxId?: number | string;\n forceRefresh?: boolean;\n }): Promise<WsfeQuotation>;\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 forceRefresh?: boolean;\n }): Promise<WsfeVoucherInfo | null>;\n /** Consults one exact voucher and normalizes WSFE error 602 to `not_found`. */\n lookupVoucher(input: {\n representedTaxId?: number | string;\n number: number;\n salesPoint: number;\n voucherType: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<WsfeVoucherLookupResult>;\n};\n\nexport type CreateWsfeServiceOptions = {\n config: ArcaClientConfig;\n auth: WsaaAuthModule;\n soap: SoapTransport;\n};\n\ntype NormalizedWsfeAssociatedVoucher = Omit<\n WsfeAssociatedVoucher,\n \"voucherDate\"\n> & {\n voucherDate?: string;\n};\n\ntype NormalizedWsfeAssociatedPeriod = {\n startDate: string;\n endDate: string;\n};\n\ntype NormalizedWsfeTax = Omit<WsfeTax, \"baseAmount\" | \"rate\" | \"amount\"> & {\n baseAmount: string;\n rate: string;\n amount: string;\n};\n\ntype NormalizedWsfeVatRate = Omit<WsfeVatRate, \"baseAmount\" | \"amount\"> & {\n baseAmount: string;\n amount: string;\n};\n\ntype NormalizedWsfeVoucherInput = Omit<\n WsfeVoucherInput,\n | \"voucherDate\"\n | \"serviceStartDate\"\n | \"serviceEndDate\"\n | \"paymentDueDate\"\n | \"associatedVouchers\"\n | \"associatedPeriod\"\n | \"totalAmount\"\n | \"nonTaxableAmount\"\n | \"netAmount\"\n | \"exemptAmount\"\n | \"taxAmount\"\n | \"vatAmount\"\n | \"exchangeRate\"\n | \"taxes\"\n | \"vatRates\"\n> & {\n voucherDate: string;\n totalAmount: string;\n nonTaxableAmount: string;\n netAmount: string;\n exemptAmount: string;\n taxAmount: string;\n vatAmount: string;\n exchangeRate?: string;\n serviceStartDate?: string;\n serviceEndDate?: string;\n paymentDueDate?: string;\n associatedVouchers?: NormalizedWsfeAssociatedVoucher[];\n associatedPeriod?: NormalizedWsfeAssociatedPeriod;\n taxes?: NormalizedWsfeTax[];\n vatRates?: NormalizedWsfeVatRate[];\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 executeWsfeAuthenticatedRawOperation(\n operation: string,\n input: {\n representedTaxId?: ArcaRepresentedTaxId;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n },\n body: Record<string, unknown> = {},\n retries?: number\n ) {\n const auth = await options.auth.login(\"wsfe\", {\n representedTaxId: input.representedTaxId,\n forceRefresh: input.forceRefresh,\n abortSignal: input.abortSignal,\n });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsfe\",\n operation,\n ...(retries === undefined ? {} : { retries }),\n signal: input.abortSignal,\n body: {\n Auth: createWsfeAuth(\n input.representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n ...body,\n },\n });\n\n return unwrapWsfeOperationEnvelope(operation, response.result);\n }\n\n function executeWsfeAuthenticatedOperation(\n operation: string,\n input: {\n representedTaxId?: ArcaRepresentedTaxId;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n },\n body: Record<string, unknown> = {}\n ) {\n return executeWithAuthenticationRecovery({\n service: \"wsfe\",\n operation,\n forceRefresh: input.forceRefresh,\n async execute(forceRefresh) {\n const result = await executeWsfeAuthenticatedRawOperation(\n operation,\n {\n representedTaxId: input.representedTaxId,\n forceRefresh,\n abortSignal: input.abortSignal,\n },\n body\n );\n throwForWsfeOperationErrors(operation, result);\n return result;\n },\n });\n }\n\n async function executeWsfeOperation(\n operation: string,\n body: Record<string, unknown> = {}\n ) {\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsfe\",\n operation,\n body,\n });\n\n const result = unwrapWsfeOperationEnvelope(operation, response.result);\n throwForWsfeOperationErrors(operation, result);\n return result;\n }\n\n async function getNextVoucherNumber({\n representedTaxId,\n salesPoint,\n voucherType,\n forceRefresh,\n abortSignal,\n }: {\n representedTaxId?: number | string;\n salesPoint: number;\n voucherType: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FECompUltimoAutorizado\",\n {\n representedTaxId,\n forceRefresh,\n abortSignal,\n },\n {\n PtoVta: salesPoint,\n CbteTipo: voucherType,\n }\n );\n return Number(result.CbteNro ?? 0) + 1;\n }\n\n async function getWsfeCatalog(\n operation: string,\n resultKey: string,\n input: {\n representedTaxId?: ArcaRepresentedTaxId;\n forceRefresh?: boolean;\n }\n ): Promise<WsfeCatalogEntry[]> {\n const result = await executeWsfeAuthenticatedOperation(operation, {\n representedTaxId: input.representedTaxId,\n forceRefresh: input.forceRefresh,\n });\n return getWsfeResultEntries(result, resultKey).map(mapWsfeCatalogEntry);\n }\n\n function issue({\n representedTaxId,\n data,\n voucherNumber,\n forceRefresh,\n abortSignal,\n }: WsfeIssueInput): Promise<WsfeAuthorizationOutcome> {\n const normalizedInput = normalizeWsfeVoucherInput(data);\n return executeWsfeAuthorization({\n representedTaxId,\n data: normalizedInput,\n voucherNumber,\n forceRefresh,\n abortSignal,\n }).then(({ outcome }) => outcome);\n }\n\n async function executeWsfeAuthorization({\n representedTaxId,\n data: normalizedInput,\n voucherNumber,\n forceRefresh,\n abortSignal,\n }: {\n representedTaxId?: number | string;\n data: NormalizedWsfeVoucherInput;\n voucherNumber: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<{\n outcome: WsfeAuthorizationOutcome;\n error?: unknown;\n }> {\n const requestData = mapWsfeVoucherInput(normalizedInput, voucherNumber);\n\n try {\n const result = await executeWsfeAuthenticatedRawOperation(\n \"FECAESolicitar\",\n { representedTaxId, forceRefresh, abortSignal },\n {\n FeCAEReq: {\n FeCabReq: {\n CantReg: 1,\n PtoVta: normalizedInput.salesPoint,\n CbteTipo: normalizedInput.voucherType,\n },\n FeDetReq: {\n FECAEDetRequest: requestData,\n },\n },\n },\n 0\n );\n\n return {\n outcome: classifyWsfeAuthorization(result, voucherNumber),\n };\n } catch (error) {\n return {\n outcome: createWsfeIndeterminateOutcome(error),\n error,\n };\n }\n }\n\n function lookupVoucher({\n representedTaxId,\n number,\n salesPoint,\n voucherType,\n forceRefresh,\n abortSignal,\n }: {\n representedTaxId?: number | string;\n number: number;\n salesPoint: number;\n voucherType: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<WsfeVoucherLookupResult> {\n return executeWithAuthenticationRecovery({\n service: \"wsfe\",\n operation: \"FECompConsultar\",\n forceRefresh,\n execute: (attemptForceRefresh) =>\n lookupVoucherOnce({\n representedTaxId,\n number,\n salesPoint,\n voucherType,\n forceRefresh: attemptForceRefresh,\n abortSignal,\n }),\n });\n }\n\n async function lookupVoucherOnce({\n representedTaxId,\n number,\n salesPoint,\n voucherType,\n forceRefresh,\n abortSignal,\n }: {\n representedTaxId?: number | string;\n number: number;\n salesPoint: number;\n voucherType: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<WsfeVoucherLookupResult> {\n const operation = \"FECompConsultar\";\n const result = await executeWsfeAuthenticatedRawOperation(\n operation,\n { representedTaxId, forceRefresh, abortSignal },\n {\n FeCompConsReq: {\n CbteNro: number,\n PtoVta: salesPoint,\n CbteTipo: voucherType,\n },\n }\n );\n const errors = extractWsfeGlobalIssues(result, operation);\n\n if (errors.length > 0 && errors.every((issue) => issue.code === \"602\")) {\n return {\n kind: \"not_found\",\n service: \"wsfe\",\n operation,\n errors,\n observations: [],\n raw: result,\n };\n }\n\n if (errors.length > 0) {\n throw createWsfeServiceError(operation, errors);\n }\n\n const raw = toWsfeRecord(result.ResultGet);\n if (!raw) {\n throw new ArcaServiceError(\"WSFE did not return the consulted voucher\", {\n service: \"wsfe\",\n operation,\n });\n }\n\n return {\n kind: \"found\",\n service: \"wsfe\",\n operation,\n voucher: mapWsfeVoucherInfo(raw),\n observations: [],\n raw: result,\n };\n }\n\n return {\n issue,\n getNextVoucherNumber,\n async getSalesPoints({ representedTaxId, forceRefresh } = {}) {\n const operation = \"FEParamGetPtosVenta\";\n const result = await executeWithAuthenticationRecovery({\n service: \"wsfe\",\n operation,\n forceRefresh,\n async execute(attemptForceRefresh) {\n const raw = await executeWsfeAuthenticatedRawOperation(\n operation,\n { representedTaxId, forceRefresh: attemptForceRefresh },\n {}\n );\n // A taxpayer with no sales point for web services gets WSFE error\n // 602 (Sin Resultados) instead of an empty list. That is an answer,\n // not a failure, so it becomes the empty list it means.\n const errors = extractWsfeGlobalIssues(raw, operation);\n if (\n errors.length > 0 &&\n errors.every((issue) => issue.code === \"602\")\n ) {\n return {};\n }\n throwForWsfeOperationErrors(operation, raw);\n return raw;\n },\n });\n const rawPoints = (\n result.ResultGet as Record<string, unknown> | undefined\n )?.PtoVenta;\n if (!rawPoints) {\n return [];\n }\n const entries = Array.isArray(rawPoints) ? rawPoints : [rawPoints];\n return entries.map(mapWsfeSalesPoint);\n },\n getVoucherTypes(input = {}) {\n return getWsfeCatalog(\"FEParamGetTiposCbte\", \"CbteTipo\", input);\n },\n getDocumentTypes(input = {}) {\n return getWsfeCatalog(\"FEParamGetTiposDoc\", \"DocTipo\", input);\n },\n getConceptTypes(input = {}) {\n return getWsfeCatalog(\"FEParamGetTiposConcepto\", \"ConceptoTipo\", input);\n },\n async getCurrencyTypes({ representedTaxId, forceRefresh } = {}) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FEParamGetTiposMonedas\",\n {\n representedTaxId,\n forceRefresh,\n }\n );\n return getWsfeResultEntries(result, \"Moneda\").map(mapWsfeCurrencyType);\n },\n getVatRates(input = {}) {\n return getWsfeCatalog(\"FEParamGetTiposIva\", \"IvaTipo\", input);\n },\n getTaxTypes(input = {}) {\n return getWsfeCatalog(\"FEParamGetTiposTributos\", \"TributoTipo\", input);\n },\n getOptionalTypes(input = {}) {\n return getWsfeCatalog(\"FEParamGetTiposOpcional\", \"OpcionalTipo\", input);\n },\n async getActivities({ representedTaxId, forceRefresh } = {}) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FEParamGetActividades\",\n {\n representedTaxId,\n forceRefresh,\n }\n );\n return getWsfeResultEntries(result, \"ActividadesTipo\").map(\n mapWsfeActivityType\n );\n },\n async getReceiverVatConditions({\n representedTaxId,\n voucherClass,\n forceRefresh,\n } = {}) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FEParamGetCondicionIvaReceptor\",\n {\n representedTaxId,\n forceRefresh,\n },\n {\n ...(voucherClass === undefined ? {} : { ClaseCmp: voucherClass }),\n }\n );\n return getWsfeResultEntries(result, \"CondicionIvaReceptor\").map(\n mapWsfeReceiverVatCondition\n );\n },\n async getServerStatus() {\n const result = await executeWsfeOperation(\"FEDummy\");\n return mapWsfeServerStatus(result);\n },\n async getQuotation({ currencyId, representedTaxId, forceRefresh }) {\n const result = await executeWsfeAuthenticatedOperation(\n \"FEParamGetCotizacion\",\n {\n representedTaxId,\n forceRefresh,\n },\n {\n MonId: currencyId,\n }\n );\n const raw =\n (result.ResultGet as Record<string, unknown> | undefined) ?? {};\n return mapWsfeQuotation(raw);\n },\n async getVoucherInfo(input) {\n const lookup = await lookupVoucher(input);\n return lookup.kind === \"found\" ? lookup.voucher : null;\n },\n lookupVoucher,\n };\n}\n\nfunction mapWsfeVoucherInput(\n input: NormalizedWsfeVoucherInput,\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 CondicionIVAReceptorId: input.receiverVatConditionId,\n PtoVta: input.salesPoint,\n CbteTipo: input.voucherType,\n };\n\n if (input.exchangeRate !== undefined) {\n data.MonCotiz = input.exchangeRate;\n }\n\n if (\n input.currencyId !== \"PES\" &&\n input.sameCurrencyForeignCancellation !== undefined\n ) {\n data.CanMisMonExt = input.sameCurrencyForeignCancellation;\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.associatedPeriod) {\n data.PeriodoAsoc = {\n FchDesde: input.associatedPeriod.startDate,\n FchHasta: input.associatedPeriod.endDate,\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 if (input.activities) {\n data.Actividades = {\n Actividad: input.activities.map((a) => ({\n Id: a.id,\n })),\n };\n }\n\n return data;\n}\n\nexport function normalizeWsfeVoucherInput(\n input: WsfeVoucherInput\n): NormalizedWsfeVoucherInput {\n if (input.receiverVatConditionId === undefined) {\n throw new ArcaInputError(\"receiverVatConditionId is required.\", {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"receiverVatConditionId\",\n expected: \"a receiver VAT condition accepted for the voucher class\",\n });\n }\n\n const {\n voucherDate,\n exchangeRate,\n serviceStartDate,\n serviceEndDate,\n paymentDueDate,\n associatedVouchers,\n associatedPeriod,\n taxes,\n vatRates,\n ...rest\n } = input;\n const normalizedExchangeRate = normalizeWsfeExchangeRate(input, exchangeRate);\n const normalizedAmounts = normalizeAndValidateWsfeAmounts(input);\n\n return {\n ...rest,\n ...normalizedAmounts,\n voucherDate: normalizeWsfeDateInput(voucherDate, \"voucherDate\"),\n ...(normalizedExchangeRate === undefined\n ? {}\n : { exchangeRate: normalizedExchangeRate }),\n ...(serviceStartDate === undefined\n ? {}\n : {\n serviceStartDate: normalizeWsfeDateInput(\n serviceStartDate,\n \"serviceStartDate\"\n ),\n }),\n ...(serviceEndDate === undefined\n ? {}\n : {\n serviceEndDate: normalizeWsfeDateInput(\n serviceEndDate,\n \"serviceEndDate\"\n ),\n }),\n ...(paymentDueDate === undefined\n ? {}\n : {\n paymentDueDate: normalizeWsfeDateInput(\n paymentDueDate,\n \"paymentDueDate\"\n ),\n }),\n ...(associatedVouchers === undefined\n ? {}\n : {\n associatedVouchers: associatedVouchers.map((voucher, index) => {\n const { voucherDate: associatedVoucherDate, ...associatedRest } =\n voucher;\n\n return {\n ...associatedRest,\n ...(associatedVoucherDate === undefined\n ? {}\n : {\n voucherDate: normalizeWsfeDateInput(\n associatedVoucherDate,\n `associatedVouchers[${index}].voucherDate`\n ),\n }),\n };\n }),\n }),\n ...(associatedPeriod === undefined\n ? {}\n : {\n associatedPeriod: {\n startDate: normalizeWsfeDateInput(\n associatedPeriod.startDate,\n \"associatedPeriod.startDate\"\n ),\n endDate: normalizeWsfeDateInput(\n associatedPeriod.endDate,\n \"associatedPeriod.endDate\"\n ),\n },\n }),\n ...(taxes === undefined\n ? {}\n : {\n taxes: taxes.map((tax, index) => ({\n ...tax,\n baseAmount: serializeArcaAmount(\n tax.baseAmount,\n `taxes[${index}].baseAmount`\n ),\n rate: serializeArcaPercentage(tax.rate, `taxes[${index}].rate`),\n amount: serializeArcaAmount(tax.amount, `taxes[${index}].amount`),\n })),\n }),\n ...(vatRates === undefined\n ? {}\n : {\n vatRates: vatRates.map((vatRate, index) => ({\n ...vatRate,\n baseAmount: serializeArcaAmount(\n vatRate.baseAmount,\n `vatRates[${index}].baseAmount`\n ),\n amount: serializeArcaAmount(\n vatRate.amount,\n `vatRates[${index}].amount`\n ),\n })),\n }),\n };\n}\n\nfunction normalizeAndValidateWsfeAmounts(\n input: WsfeVoucherInput\n): Pick<\n NormalizedWsfeVoucherInput,\n | \"totalAmount\"\n | \"nonTaxableAmount\"\n | \"netAmount\"\n | \"exemptAmount\"\n | \"taxAmount\"\n | \"vatAmount\"\n> {\n const totalAmount = normalizeArcaAmountToMinorUnits(\n input.totalAmount,\n \"totalAmount\"\n );\n const nonTaxableAmount = normalizeArcaAmountToMinorUnits(\n input.nonTaxableAmount,\n \"nonTaxableAmount\"\n );\n const netAmount = normalizeArcaAmountToMinorUnits(\n input.netAmount,\n \"netAmount\"\n );\n const exemptAmount = normalizeArcaAmountToMinorUnits(\n input.exemptAmount,\n \"exemptAmount\"\n );\n const taxAmount = normalizeArcaAmountToMinorUnits(\n input.taxAmount,\n \"taxAmount\"\n );\n const vatAmount = normalizeArcaAmountToMinorUnits(\n input.vatAmount,\n \"vatAmount\"\n );\n\n const decomposedTotal =\n nonTaxableAmount + netAmount + exemptAmount + taxAmount + vatAmount;\n assertWsfeAmountMatch(\n totalAmount,\n decomposedTotal,\n \"totalAmount\",\n \"the sum of nonTaxableAmount, netAmount, exemptAmount, taxAmount, and vatAmount\"\n );\n\n const vatRates = input.vatRates ?? [];\n if (vatAmount > 0n && vatRates.length === 0) {\n throw new ArcaInputError(\n \"vatRates is required when vatAmount is greater than zero.\",\n {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"vatRates\",\n expected: \"VAT detail whose amounts reconcile with vatAmount\",\n }\n );\n }\n\n if (vatRates.length > 0) {\n const normalizedVatRates = vatRates.map((vatRate, index) => ({\n baseAmount: normalizeArcaAmountToMinorUnits(\n vatRate.baseAmount,\n `vatRates[${index}].baseAmount`\n ),\n amount: normalizeArcaAmountToMinorUnits(\n vatRate.amount,\n `vatRates[${index}].amount`\n ),\n }));\n const vatRateAmountSum = normalizedVatRates.reduce(\n (sum, vatRate) => sum + vatRate.amount,\n 0n\n );\n const vatRateBaseSum = normalizedVatRates.reduce(\n (sum, vatRate) => sum + vatRate.baseAmount,\n 0n\n );\n\n assertWsfeAmountMatch(\n vatAmount,\n vatRateAmountSum,\n \"vatAmount\",\n \"the sum of vatRates[].amount\",\n vatRates.length\n );\n if (requiresWsfeVatBaseReconciliation(input.voucherType)) {\n assertWsfeAmountMatch(\n netAmount,\n vatRateBaseSum,\n \"netAmount\",\n \"the sum of vatRates[].baseAmount\",\n vatRates.length\n );\n }\n }\n\n const taxes = input.taxes ?? [];\n if (taxAmount > 0n && taxes.length === 0) {\n throw new ArcaInputError(\n \"taxes is required when taxAmount is greater than zero.\",\n {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"taxes\",\n expected: \"tax detail whose amounts reconcile with taxAmount\",\n }\n );\n }\n\n if (taxes.length > 0) {\n const taxAmountSum = taxes.reduce((sum, tax, index) => {\n normalizeArcaAmountToMinorUnits(\n tax.baseAmount,\n `taxes[${index}].baseAmount`\n );\n serializeArcaPercentage(tax.rate, `taxes[${index}].rate`);\n return (\n sum +\n normalizeArcaAmountToMinorUnits(tax.amount, `taxes[${index}].amount`)\n );\n }, 0n);\n\n assertWsfeAmountMatch(\n taxAmount,\n taxAmountSum,\n \"taxAmount\",\n \"the sum of taxes[].amount\",\n taxes.length\n );\n }\n\n return {\n totalAmount: serializeArcaAmount(input.totalAmount, \"totalAmount\"),\n nonTaxableAmount: serializeArcaAmount(\n input.nonTaxableAmount,\n \"nonTaxableAmount\"\n ),\n netAmount: serializeArcaAmount(input.netAmount, \"netAmount\"),\n exemptAmount: serializeArcaAmount(input.exemptAmount, \"exemptAmount\"),\n taxAmount: serializeArcaAmount(input.taxAmount, \"taxAmount\"),\n vatAmount: serializeArcaAmount(input.vatAmount, \"vatAmount\"),\n };\n}\n\nfunction requiresWsfeVatBaseReconciliation(voucherType: number): boolean {\n // WSFE validation 10061 exempts debit/credit notes, class C vouchers,\n // and class A vouchers with the retention legend. The manual enumerates the\n // ordinary and M types only; the FCE (MiPyME) family mirrors them one to one,\n // so its notes and its class C invoice are exempt on the same grounds.\n return ![\n 2, 3, 7, 8, 11, 12, 13, 15, 52, 53, 202, 203, 207, 208, 211, 212, 213,\n ].includes(voucherType);\n}\n\nfunction assertWsfeAmountMatch(\n actual: bigint,\n expectedAmount: bigint,\n field: string,\n expectedDescription: string,\n absoluteCentAllowance = 1\n) {\n if (!isWithinArcaTolerance(actual, expectedAmount, absoluteCentAllowance)) {\n throw new ArcaInputError(\n `${field} does not reconcile within ARCA's documented tolerance.`,\n {\n code: \"ARCA_INPUT_AMOUNT_MISMATCH\",\n field,\n expected: `within ARCA tolerance of ${expectedDescription}`,\n }\n );\n }\n}\n\nfunction normalizeWsfeExchangeRate(\n input: Pick<\n WsfeVoucherInput,\n \"currencyId\" | \"sameCurrencyForeignCancellation\"\n >,\n exchangeRate: number | string | undefined\n): string | undefined {\n if (input.currencyId === \"PES\") {\n if (\n exchangeRate !== undefined &&\n serializeArcaExchangeRate(exchangeRate, \"exchangeRate\") !== \"1\"\n ) {\n throw new ArcaInputError(\n \"exchangeRate must be 1 when currencyId is PES.\",\n {\n code: \"ARCA_INPUT_INVALID_EXCHANGE_RATE\",\n field: \"exchangeRate\",\n expected: \"1 when currencyId is PES\",\n }\n );\n }\n return \"1\";\n }\n\n if (exchangeRate === undefined) {\n if (input.sameCurrencyForeignCancellation === \"S\") {\n return undefined;\n }\n throw new ArcaInputError(\n \"exchangeRate is required unless sameCurrencyForeignCancellation is S for a foreign-currency voucher.\",\n {\n code: \"ARCA_INPUT_MISSING_FIELD\",\n field: \"exchangeRate\",\n expected:\n \"a positive exchange rate unless sameCurrencyForeignCancellation is S\",\n }\n );\n }\n\n return serializeArcaExchangeRate(exchangeRate, \"exchangeRate\");\n}\n\nexport function normalizeWsfeDateInput(\n value: WsfeDateInput,\n fieldName: string\n): string {\n if (typeof value !== \"string\") {\n throw new ArcaInputError(\n `Invalid WSFE ${fieldName}: expected a YYYY-MM-DD or YYYYMMDD string`,\n {\n code: \"ARCA_INPUT_INVALID_DATE\",\n field: fieldName,\n expected: \"a YYYY-MM-DD or YYYYMMDD calendar date string\",\n }\n );\n }\n\n const normalizedValue = value.trim();\n const afipMatch = normalizedValue.match(/^(\\d{4})(\\d{2})(\\d{2})$/);\n if (afipMatch) {\n const [, year, month, day] = afipMatch;\n assertValidCalendarDate(year, month, day, fieldName);\n return normalizedValue;\n }\n\n const isoMatch = normalizedValue.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (isoMatch) {\n const [, year, month, day] = isoMatch;\n assertValidCalendarDate(year, month, day, fieldName);\n return `${year}${month}${day}`;\n }\n\n throw new ArcaInputError(\n `Invalid WSFE ${fieldName}: expected a YYYY-MM-DD or YYYYMMDD string`,\n {\n code: \"ARCA_INPUT_INVALID_DATE\",\n field: fieldName,\n expected: \"a YYYY-MM-DD or YYYYMMDD calendar date string\",\n }\n );\n}\n\nfunction assertValidCalendarDate(\n yearInput: string,\n monthInput: string,\n dayInput: string,\n fieldName: string\n) {\n const year = Number(yearInput);\n const month = Number(monthInput);\n const day = Number(dayInput);\n const candidate = new Date(Date.UTC(year, month - 1, day));\n\n if (\n candidate.getUTCFullYear() !== year ||\n candidate.getUTCMonth() !== month - 1 ||\n candidate.getUTCDate() !== day\n ) {\n throw new ArcaInputError(\n `Invalid WSFE ${fieldName}: received a non-existent calendar date`,\n {\n code: \"ARCA_INPUT_INVALID_DATE\",\n field: fieldName,\n expected: \"an existing calendar date\",\n }\n );\n }\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 ? {}\n : { emissionType: String(record.EmisionTipo) }),\n ...(record.Bloqueado === undefined\n ? {}\n : { blocked: String(record.Bloqueado) }),\n ...(record.FchBaja === undefined\n ? {}\n : { deletedSince: String(record.FchBaja) }),\n };\n}\n\nfunction mapWsfeCatalogEntry(raw: unknown): WsfeCatalogEntry {\n const record = raw as Record<string, unknown>;\n return {\n id: Number(record.Id ?? 0),\n description: String(record.Desc ?? \"\"),\n };\n}\n\nfunction mapWsfeActivityType(raw: unknown): WsfeActivityType {\n const record = raw as Record<string, unknown>;\n return {\n id: Number(record.Id ?? 0),\n description: String(record.Desc ?? \"\"),\n order: Number(record.Orden ?? 0),\n };\n}\n\nfunction mapWsfeReceiverVatCondition(raw: unknown): WsfeReceiverVatCondition {\n const record = raw as Record<string, unknown>;\n return {\n id: Number(record.Id ?? 0),\n description: String(record.Desc ?? \"\"),\n voucherClass: String(record.Cmp_Clase ?? \"\"),\n };\n}\n\nfunction mapWsfeCurrencyType(raw: unknown): WsfeCurrencyType {\n const record = raw as Record<string, unknown>;\n return {\n id: String(record.Id ?? \"\"),\n description: String(record.Desc ?? \"\"),\n validFrom: String(record.FchDesde ?? \"\"),\n validTo: String(record.FchHasta ?? \"\"),\n };\n}\n\nfunction mapWsfeServerStatus(raw: Record<string, unknown>): WsfeServerStatus {\n return {\n appServer: String(raw.AppServer ?? \"\"),\n dbServer: String(raw.DbServer ?? \"\"),\n authServer: String(raw.AuthServer ?? \"\"),\n };\n}\n\nfunction mapWsfeQuotation(raw: Record<string, unknown>): WsfeQuotation {\n return {\n currencyId: String(raw.MonId ?? \"\"),\n rate: Number(raw.MonCotiz ?? 0),\n date: String(raw.FchCotiz ?? \"\"),\n };\n}\n\nfunction mapWsfeVoucherInfo(raw: Record<string, unknown>): WsfeVoucherInfo {\n const voucher: WsfeVoucherInfo = {\n voucherNumber: Number(raw.CbteDesde ?? raw.CbteHasta ?? 0),\n raw,\n };\n\n assignWsfeValue(voucher, \"voucherDate\", normalizeWsfeString(raw.CbteFch));\n assignWsfeValue(voucher, \"salesPoint\", normalizeWsfeNumber(raw.PtoVta));\n assignWsfeValue(voucher, \"voucherType\", normalizeWsfeNumber(raw.CbteTipo));\n assignWsfeValue(voucher, \"concept\", normalizeWsfeNumber(raw.Concepto));\n assignWsfeValue(voucher, \"documentType\", normalizeWsfeNumber(raw.DocTipo));\n assignWsfeValue(voucher, \"documentNumber\", normalizeWsfeString(raw.DocNro));\n assignWsfeValue(\n voucher,\n \"receiverVatConditionId\",\n normalizeWsfeNumber(raw.CondicionIVAReceptorId)\n );\n assignWsfeValue(voucher, \"totalAmount\", normalizeWsfeNumber(raw.ImpTotal));\n assignWsfeValue(\n voucher,\n \"nonTaxableAmount\",\n normalizeWsfeNumber(raw.ImpTotConc)\n );\n assignWsfeValue(voucher, \"netAmount\", normalizeWsfeNumber(raw.ImpNeto));\n assignWsfeValue(voucher, \"exemptAmount\", normalizeWsfeNumber(raw.ImpOpEx));\n assignWsfeValue(voucher, \"taxAmount\", normalizeWsfeNumber(raw.ImpTrib));\n assignWsfeValue(voucher, \"vatAmount\", normalizeWsfeNumber(raw.ImpIVA));\n assignWsfeValue(voucher, \"currencyId\", normalizeWsfeString(raw.MonId));\n assignWsfeValue(voucher, \"exchangeRate\", normalizeWsfeNumber(raw.MonCotiz));\n assignWsfeValue(voucher, \"result\", normalizeWsfeString(raw.Resultado));\n assignWsfeValue(\n voucher,\n \"cae\",\n normalizeWsfeString(raw.CodAutorizacion ?? raw.CAE)\n );\n assignWsfeValue(\n voucher,\n \"caeExpiry\",\n normalizeWsfeString(raw.FchVto ?? raw.CAEFchVto)\n );\n\n assignWsfeValue(\n voucher,\n \"serviceStartDate\",\n normalizeWsfeString(raw.FchServDesde)\n );\n assignWsfeValue(\n voucher,\n \"serviceEndDate\",\n normalizeWsfeString(raw.FchServHasta)\n );\n assignWsfeValue(\n voucher,\n \"paymentDueDate\",\n normalizeWsfeString(raw.FchVtoPago)\n );\n assignWsfeValue(\n voucher,\n \"vatRates\",\n mapWsfeLookupDetails(raw.Iva, \"AlicIva\", mapWsfeLookupVat)\n );\n assignWsfeValue(\n voucher,\n \"taxes\",\n mapWsfeLookupDetails(raw.Tributos, \"Tributo\", mapWsfeLookupTax)\n );\n\n assignWsfeValue(\n voucher,\n \"associatedVouchers\",\n mapWsfeLookupDetails(raw.CbtesAsoc, \"CbteAsoc\", (item) => {\n const type = normalizeWsfeNumber(item.Tipo);\n const salesPoint = normalizeWsfeNumber(item.PtoVta);\n const number = normalizeWsfeNumber(item.Nro);\n if (\n type === undefined ||\n salesPoint === undefined ||\n number === undefined\n ) {\n return undefined;\n }\n return {\n type,\n salesPoint,\n number,\n ...(normalizeWsfeString(item.Cuit)\n ? { taxId: normalizeWsfeString(item.Cuit) }\n : {}),\n ...(normalizeWsfeString(item.CbteFch)\n ? { voucherDate: normalizeWsfeString(item.CbteFch) as WsfeDateInput }\n : {}),\n };\n })\n );\n const period = toWsfeRecord(raw.PeriodoAsoc);\n if (period?.FchDesde && period.FchHasta) {\n voucher.associatedPeriod = {\n startDate: String(period.FchDesde) as WsfeDateInput,\n endDate: String(period.FchHasta) as WsfeDateInput,\n };\n }\n if (raw.CanMisMonExt === \"S\" || raw.CanMisMonExt === \"N\") {\n voucher.sameCurrencyForeignCancellation = raw.CanMisMonExt;\n }\n voucher.optionalFields = mapWsfeLookupDetails(\n raw.Opcionales,\n \"Opcional\",\n (item) =>\n item.Id === undefined || item.Valor === undefined\n ? undefined\n : { id: String(item.Id), value: String(item.Valor) }\n );\n voucher.buyers = mapWsfeLookupDetails(\n raw.Compradores,\n \"Comprador\",\n (item) => {\n const documentType = normalizeWsfeNumber(item.DocTipo),\n documentNumber = normalizeWsfeNumber(item.DocNro),\n percentage = normalizeWsfeNumber(item.Porcentaje);\n return documentType === undefined ||\n documentNumber === undefined ||\n percentage === undefined\n ? undefined\n : { documentType, documentNumber, percentage };\n }\n );\n voucher.activities = mapWsfeLookupDetails(\n raw.Actividades,\n \"Actividad\",\n (item) => {\n const id = normalizeWsfeNumber(item.Id);\n return id === undefined ? undefined : { id };\n }\n );\n return voucher;\n}\n\n// A missing or malformed detail stays absent; never fabricate zero-valued identity evidence.\nfunction mapWsfeLookupDetails<T>(\n container: unknown,\n key: string,\n map: (row: Record<string, unknown>) => T | undefined\n): T[] | undefined {\n const record = toWsfeRecord(container);\n if (!record || record[key] === undefined) {\n return undefined;\n }\n const rows = Array.isArray(record[key]) ? record[key] : [record[key]];\n const result: T[] = [];\n for (const value of rows) {\n const row = toWsfeRecord(value);\n const mapped = row ? map(row) : undefined;\n if (mapped === undefined) {\n return undefined;\n }\n result.push(mapped);\n }\n return result;\n}\n\nfunction mapWsfeLookupVat(\n row: Record<string, unknown>\n): WsfeVatRate | undefined {\n const id = normalizeWsfeNumber(row.Id);\n const baseAmount = normalizeWsfeNumber(row.BaseImp);\n const amount = normalizeWsfeNumber(row.Importe);\n if (id === undefined || baseAmount === undefined || amount === undefined) {\n return undefined;\n }\n return { id, baseAmount, amount };\n}\n\nfunction mapWsfeLookupTax(row: Record<string, unknown>): WsfeTax | undefined {\n const vat = mapWsfeLookupVat(row);\n const rate = normalizeWsfeNumber(row.Alic);\n if (!vat || rate === undefined) {\n return undefined;\n }\n const description = normalizeWsfeString(row.Desc);\n return {\n ...vat,\n rate,\n ...(description === undefined ? {} : { description }),\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 unwrapWsfeOperationEnvelope(\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 return result;\n}\n\nfunction throwForWsfeOperationErrors(\n operation: string,\n result: Record<string, unknown>\n) {\n const errors = extractWsfeGlobalIssues(result, operation);\n if (errors.length > 0) {\n throw createWsfeServiceError(operation, errors);\n }\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 classifyWsfeAuthorization(\n result: Record<string, unknown>,\n voucherNumber: number\n): WsfeAuthorizationOutcome {\n const operation = \"FECAESolicitar\";\n const header = toWsfeRecord(result.FeCabResp) ?? {};\n const detail = normalizeWsfeDetailResponse(result);\n const headerResult = normalizeWsfeResult(header.Resultado);\n const detailResult = normalizeWsfeResult(detail.Resultado);\n const resultCode = detailResult ?? headerResult;\n const resultLevel = getWsfeResultLevel(headerResult, detailResult);\n const cae = normalizeWsfeString(detail.CAE);\n const caeExpiry = normalizeWsfeString(detail.CAEFchVto);\n const errors = extractWsfeGlobalIssues(result, operation, \"header\");\n const observations = extractWsfeObservations(\n detail,\n detailResult === \"R\" ? \"business\" : \"observation\"\n );\n const hasInfrastructureError = errors.some(\n (issue) => issue.category === \"infrastructure\"\n );\n const base = {\n service: \"wsfe\" as const,\n operation,\n results: createWsfeResults(headerResult, detailResult),\n errors,\n observations,\n raw: result,\n };\n const context: WsfeAuthorizationContext = {\n base,\n headerResult,\n detailResult,\n resultCode,\n resultLevel,\n cae,\n caeExpiry,\n };\n\n if (hasContradictoryWsfeResults(context)) {\n return createWsfeStructuredIndeterminate(context, \"contradictory_response\");\n }\n\n const authenticationError = classifyArcaAuthenticationIssues(errors, {\n service: \"wsfe\",\n operation,\n });\n if (\n authenticationError &&\n detailResult === undefined &&\n headerResult !== \"A\" &&\n headerResult !== \"O\" &&\n !cae\n ) {\n return {\n ...createWsfeStructuredIndeterminate(context, \"authentication_rejected\"),\n authentication: createArcaAuthenticationEvidence(authenticationError),\n };\n }\n\n if (hasInfrastructureError) {\n return createWsfeStructuredIndeterminate(context, \"incomplete_response\");\n }\n\n if (isAuthorizedWsfeContext(context)) {\n return {\n ...base,\n kind: \"authorized\",\n result: \"A\",\n resultLevel: \"detail\",\n cae: context.cae,\n caeExpiry: context.caeExpiry,\n voucherNumber,\n };\n }\n\n if (isRejectedWsfeDetailContext(context)) {\n return {\n ...base,\n kind: \"rejected\",\n result: \"R\",\n resultLevel: \"detail\",\n };\n }\n\n if (isRejectedWsfeHeaderContext(context)) {\n return {\n ...base,\n kind: \"rejected\",\n result: \"R\",\n resultLevel: \"header\",\n };\n }\n\n return createWsfeStructuredIndeterminate(\n context,\n hasWsfeCaeContradiction(context)\n ? \"contradictory_response\"\n : \"incomplete_response\"\n );\n}\n\ntype WsfeAuthorizationContext = {\n base: {\n service: \"wsfe\";\n operation: string;\n results: { header?: string; detail?: string };\n errors: ArcaFiscalIssue[];\n observations: ArcaFiscalIssue[];\n raw: Record<string, unknown>;\n };\n headerResult?: string;\n detailResult?: string;\n resultCode?: string;\n resultLevel?: ArcaFiscalResultLevel;\n cae?: string;\n caeExpiry?: string;\n};\n\nfunction getWsfeResultLevel(\n headerResult?: string,\n detailResult?: string\n): ArcaFiscalResultLevel | undefined {\n if (detailResult) {\n return \"detail\";\n }\n return headerResult ? \"header\" : undefined;\n}\n\nfunction hasContradictoryWsfeResults(context: WsfeAuthorizationContext) {\n return Boolean(\n context.headerResult &&\n context.detailResult &&\n context.headerResult !== context.detailResult\n );\n}\n\nfunction isAuthorizedWsfeContext(\n context: WsfeAuthorizationContext\n): context is WsfeAuthorizationContext & { cae: string; caeExpiry: string } {\n return Boolean(\n context.detailResult === \"A\" &&\n context.headerResult !== \"R\" &&\n context.base.errors.length === 0 &&\n context.cae &&\n context.caeExpiry\n );\n}\n\nfunction isRejectedWsfeDetailContext(context: WsfeAuthorizationContext) {\n return (\n context.detailResult === \"R\" && context.headerResult !== \"A\" && !context.cae\n );\n}\n\nfunction isRejectedWsfeHeaderContext(context: WsfeAuthorizationContext) {\n return (\n context.headerResult === \"R\" &&\n context.detailResult === undefined &&\n !context.cae &&\n context.base.errors.length > 0 &&\n context.base.errors.every((issue) => issue.category === \"business\")\n );\n}\n\nfunction hasWsfeCaeContradiction(context: WsfeAuthorizationContext) {\n return (\n (context.resultCode === \"A\" || context.resultCode === \"R\") &&\n Boolean(context.cae)\n );\n}\n\nfunction createWsfeStructuredIndeterminate(\n context: WsfeAuthorizationContext,\n reason: ArcaAuthorizationIndeterminateReason\n): Extract<WsfeAuthorizationOutcome, { kind: \"indeterminate\" }> {\n const outcome: Extract<WsfeAuthorizationOutcome, { kind: \"indeterminate\" }> =\n {\n ...context.base,\n kind: \"indeterminate\",\n reason,\n };\n assignWsfeValue(outcome, \"result\", context.resultCode);\n assignWsfeValue(outcome, \"resultLevel\", context.resultLevel);\n assignWsfeValue(outcome, \"cae\", context.cae);\n assignWsfeValue(outcome, \"caeExpiry\", context.caeExpiry);\n return outcome;\n}\n\nfunction createWsfeResults(headerResult?: string, detailResult?: string) {\n const results: { header?: string; detail?: string } = {};\n assignWsfeValue(results, \"header\", headerResult);\n assignWsfeValue(results, \"detail\", detailResult);\n return results;\n}\n\nfunction createWsfeIndeterminateOutcome(\n error: unknown\n): WsfeAuthorizationOutcome {\n const authenticationError = classifyArcaAuthenticationError(error, {\n service: \"wsfe\",\n operation: \"FECAESolicitar\",\n });\n return {\n kind: \"indeterminate\",\n service: \"wsfe\",\n operation: \"FECAESolicitar\",\n results: {},\n reason: authenticationError\n ? \"authentication_rejected\"\n : getArcaIndeterminateReason(error),\n ...(authenticationError\n ? {\n authentication: createArcaAuthenticationEvidence(authenticationError),\n }\n : {}),\n errors: [],\n observations: [],\n };\n}\n\nfunction getArcaIndeterminateReason(\n error: unknown\n): ArcaAuthorizationIndeterminateReason {\n if (error instanceof ArcaTransportError) {\n return \"transport_error\";\n }\n if (error instanceof ArcaSoapFaultError) {\n return \"soap_fault\";\n }\n if (error instanceof ArcaInvalidSoapResponseError) {\n return \"invalid_response\";\n }\n return \"unexpected_error\";\n}\n\nfunction createWsfeServiceError(operation: string, issues: ArcaFiscalIssue[]) {\n const authenticationError = classifyArcaAuthenticationIssues(issues, {\n service: \"wsfe\",\n operation,\n });\n if (authenticationError) {\n return authenticationError;\n }\n\n const firstIssue = issues[0];\n return new ArcaServiceError(\n firstIssue ? formatWsfeIssue(firstIssue) : \"WSFE returned a service error\",\n {\n service: \"wsfe\",\n operation,\n ...(firstIssue?.code === undefined\n ? {}\n : { serviceCode: firstIssue.code }),\n issues,\n }\n );\n}\n\nfunction extractWsfeGlobalIssues(\n result: Record<string, unknown>,\n operation: string,\n resultLevel?: ArcaFiscalResultLevel\n): ArcaFiscalIssue[] {\n const errorsContainer = toWsfeRecord(result.Errors);\n return normalizeWsfeIssueEntries(errorsContainer?.Err).map((entry) => ({\n service: \"wsfe\",\n operation,\n source: \"error\",\n category:\n operation === \"FECAESolicitar\" &&\n WSFE_AUTHORIZATION_INFRASTRUCTURE_CODES.has(entry.code ?? \"\")\n ? \"infrastructure\"\n : operation === \"FECAESolicitar\"\n ? \"business\"\n : \"unknown\",\n ...(entry.code === undefined ? {} : { code: entry.code }),\n message: entry.message,\n ...(resultLevel === undefined ? {} : { resultLevel }),\n }));\n}\n\nfunction extractWsfeObservations(\n detail: Record<string, unknown>,\n category: ArcaFiscalIssue[\"category\"]\n): ArcaFiscalIssue[] {\n const observationsContainer = toWsfeRecord(detail.Observaciones);\n return normalizeWsfeIssueEntries(observationsContainer?.Obs).map((entry) => ({\n service: \"wsfe\",\n operation: \"FECAESolicitar\",\n source: \"observation\",\n category,\n ...(entry.code === undefined ? {} : { code: entry.code }),\n message: entry.message,\n resultLevel: \"detail\",\n }));\n}\n\nfunction normalizeWsfeIssueEntries(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 const message = entry.Msg ?? entry.msg ?? \"Unknown WSFE error\";\n return {\n ...(code === undefined ? {} : { code: String(code) }),\n message: String(message),\n };\n });\n}\n\nfunction formatWsfeIssue(issue: ArcaFiscalIssue) {\n return issue.code ? `(${issue.code}) ${issue.message}` : issue.message;\n}\n\nfunction normalizeWsfeResult(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const normalized = value.trim().toUpperCase();\n return normalized || undefined;\n}\n\nfunction normalizeWsfeString(value: unknown): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n const normalized = String(value).trim();\n return normalized || undefined;\n}\n\nfunction normalizeWsfeNumber(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const normalized = Number(value);\n return Number.isFinite(normalized) ? normalized : undefined;\n}\n\nfunction assignWsfeValue<TTarget, TKey extends keyof TTarget>(\n target: TTarget,\n key: TKey,\n value: TTarget[TKey] | undefined\n) {\n if (value !== undefined) {\n target[key] = value;\n }\n}\n\nfunction toWsfeRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nconst WSFE_AUTHORIZATION_INFRASTRUCTURE_CODES = new Set([\n \"500\",\n \"501\",\n \"502\",\n \"600\",\n \"601\",\n]);\n\nfunction getWsfeResultEntries(\n result: Record<string, unknown>,\n key: string\n): Record<string, unknown>[] {\n const rawEntries = (\n result.ResultGet as Record<string, unknown> | undefined\n )?.[key];\n if (!rawEntries) {\n return [];\n }\n\n return (Array.isArray(rawEntries) ? rawEntries : [rawEntries]).map(\n (entry) => entry as Record<string, unknown>\n );\n}\n"],"mappings":"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","names":["issue"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/services/wsmtxca.ts"],"sourcesContent":["import {\n ArcaInputError,\n ArcaInvalidSoapResponseError,\n ArcaServiceError,\n ArcaSoapFaultError,\n ArcaTransportError,\n} from \"../errors\";\nimport {\n classifyArcaAuthenticationError,\n classifyArcaAuthenticationIssues,\n createArcaAuthenticationEvidence,\n executeWithAuthenticationRecovery,\n} from \"../internal/authentication\";\nimport type { ArcaClientConfig, ArcaRepresentedTaxId } from \"../internal/types\";\nimport type { SoapTransport } from \"../soap\";\nimport type { WsaaAuthModule } from \"../wsaa\";\nimport type {\n ArcaAuthorizationIndeterminateReason,\n ArcaAuthorizationOutcome,\n ArcaFiscalIssue,\n ArcaVoucherLookupResult,\n} from \"./fiscal-evidence\";\n\n/** Input for {@link WsmtxcaService.issue}: one WSMTXCA voucher request. */\nexport type WsmtxcaIssueInput = {\n representedTaxId?: ArcaRepresentedTaxId;\n data: Record<string, unknown>;\n forceRefresh?: boolean;\n /** Aborts login, submission and consultation with the caller's deadline. */\n abortSignal?: AbortSignal;\n};\n\n/** Structured evidence from one exact WSMTXCA authorization attempt. */\nexport type WsmtxcaAuthorizationOutcome = ArcaAuthorizationOutcome<\"wsmtxca\">;\n\n/** Result of querying the last authorized voucher number. */\nexport type WsmtxcaLastAuthorizedVoucherResult = {\n voucherNumber: number;\n raw: Record<string, unknown>;\n};\n\n/** A point of sale enabled for WSMTXCA. */\nexport type WsmtxcaSalesPoint = {\n number: number;\n blocked: boolean;\n deletedAt?: string;\n};\n\n/** Result of querying WSMTXCA points of sale. */\nexport type WsmtxcaSalesPointsResult = {\n salesPoints: WsmtxcaSalesPoint[];\n raw: Record<string, unknown>;\n};\n\n/** Typed provider fields used to match one exact WSMTXCA voucher. */\nexport type WsmtxcaVoucherInfo = {\n voucherNumber?: number;\n invoiceDate?: string;\n salesPoint?: number;\n voucherType?: number;\n concept?: number;\n documentType?: number;\n documentNumber?: string;\n receiverVatConditionId?: number;\n totalAmount?: number;\n subtotalAmount?: number;\n taxableAmount?: number;\n nonTaxableAmount?: number;\n exemptAmount?: number;\n taxAmount?: number;\n vatAmount?: number;\n currencyId?: string;\n exchangeRate?: number;\n cae?: string;\n caeExpiry?: string;\n raw: Record<string, unknown>;\n};\n\n/** Typed exact-voucher consultation result for WSMTXCA. */\nexport type WsmtxcaVoucherLookupOutcome = ArcaVoucherLookupResult<\n WsmtxcaVoucherInfo,\n \"wsmtxca\"\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 /**\n * Issues one exact voucher: a single autorizarComprobante without transport\n * retries, returning structured evidence instead of throwing.\n */\n issue(input: WsmtxcaIssueInput): Promise<WsmtxcaAuthorizationOutcome>;\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 forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<WsmtxcaLastAuthorizedVoucherResult>;\n /** Returns the points of sale enabled for WSMTXCA. */\n getSalesPoints(input?: {\n representedTaxId?: ArcaRepresentedTaxId;\n forceRefresh?: boolean;\n }): Promise<WsmtxcaSalesPointsResult>;\n /** Consults one exact voucher and normalizes WSMTXCA error 1503 to `not_found`. */\n lookupVoucher(input: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n voucherNumber: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<WsmtxcaVoucherLookupOutcome>;\n /** Retrieves details for a specific voucher. */\n getVoucher(input: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n voucherNumber: number;\n forceRefresh?: boolean;\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 async function executeWsmtxcaAuthenticatedOperation(\n operation: WsmtxcaOperation,\n input: {\n representedTaxId?: ArcaRepresentedTaxId;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n },\n body: Record<string, unknown> = {},\n retries?: number\n ) {\n const auth = await options.auth.login(\"wsmtxca\", {\n representedTaxId: input.representedTaxId,\n forceRefresh: input.forceRefresh,\n abortSignal: input.abortSignal,\n });\n const response = await options.soap.execute<\n Record<string, unknown>,\n Record<string, unknown>\n >({\n service: \"wsmtxca\",\n operation,\n ...(retries === undefined ? {} : { retries }),\n signal: input.abortSignal,\n bodyElementName: `${operation}Request`,\n bodyElementNamespaceMode: \"prefix\",\n body: {\n // WSMTXCA request types use an XML sequence with authentication first.\n authRequest: createWsmtxcaAuth(\n input.representedTaxId ?? options.config.taxId,\n auth.token,\n auth.sign\n ),\n ...body,\n },\n });\n\n return unwrapWsmtxcaOperationResponse(response.result, operation);\n }\n\n async function executeWsmtxcaAuthorization({\n representedTaxId,\n data,\n forceRefresh,\n abortSignal,\n }: WsmtxcaIssueInput): Promise<{\n outcome: WsmtxcaAuthorizationOutcome;\n error?: unknown;\n }> {\n if (Object.hasOwn(data, \"authRequest\")) {\n throw new ArcaInputError(\n 'WSMTXCA authorization data cannot include the reserved top-level field \"authRequest\".',\n {\n code: \"ARCA_INPUT_RESERVED_FIELD\",\n field: \"data.authRequest\",\n expected: \"omitted because facturas manages authentication fields\",\n }\n );\n }\n\n try {\n const raw = await executeWsmtxcaAuthenticatedOperation(\n \"autorizarComprobante\",\n { representedTaxId, forceRefresh, abortSignal },\n data,\n 0\n );\n return { outcome: classifyWsmtxcaAuthorization(raw) };\n } catch (error) {\n return {\n outcome: createWsmtxcaIndeterminateOutcome(error),\n error,\n };\n }\n }\n\n async function issue(\n input: WsmtxcaIssueInput\n ): Promise<WsmtxcaAuthorizationOutcome> {\n return (await executeWsmtxcaAuthorization(input)).outcome;\n }\n\n function getLastAuthorizedVoucher({\n representedTaxId,\n voucherType,\n salesPoint,\n forceRefresh,\n abortSignal,\n }: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<WsmtxcaLastAuthorizedVoucherResult> {\n return executeWithAuthenticationRecovery({\n service: \"wsmtxca\",\n operation: \"consultarUltimoComprobanteAutorizado\",\n forceRefresh,\n execute: (attemptForceRefresh) =>\n getLastAuthorizedVoucherOnce({\n representedTaxId,\n voucherType,\n salesPoint,\n forceRefresh: attemptForceRefresh,\n abortSignal,\n }),\n });\n }\n\n async function getLastAuthorizedVoucherOnce({\n representedTaxId,\n voucherType,\n salesPoint,\n forceRefresh,\n abortSignal,\n }: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<WsmtxcaLastAuthorizedVoucherResult> {\n const operation = \"consultarUltimoComprobanteAutorizado\";\n const raw = await executeWsmtxcaAuthenticatedOperation(\n operation,\n { representedTaxId, forceRefresh, abortSignal },\n {\n consultaUltimoComprobanteAutorizadoRequest: {\n codigoTipoComprobante: voucherType,\n numeroPuntoVenta: salesPoint,\n },\n }\n );\n const errors = extractWsmtxcaIssues(raw, operation, \"error\");\n\n if (errors.length > 0 && errors.every((issue) => issue.code === \"1502\")) {\n return { voucherNumber: 0, raw };\n }\n if (errors.length > 0) {\n throw createWsmtxcaServiceError(operation, errors);\n }\n\n return {\n voucherNumber: parseWsmtxcaVoucherNumber(\n raw.numeroComprobante ?? raw.cbteNro ?? raw.nroComprobante,\n \"WSMTXCA did not return the last authorized voucher number\",\n true\n ),\n raw,\n };\n }\n\n function getSalesPoints({\n representedTaxId,\n forceRefresh,\n }: {\n representedTaxId?: ArcaRepresentedTaxId;\n forceRefresh?: boolean;\n } = {}): Promise<WsmtxcaSalesPointsResult> {\n return executeWithAuthenticationRecovery({\n service: \"wsmtxca\",\n operation: \"consultarPuntosVenta\",\n forceRefresh,\n execute: (attemptForceRefresh) =>\n getSalesPointsOnce({\n representedTaxId,\n forceRefresh: attemptForceRefresh,\n }),\n });\n }\n\n async function getSalesPointsOnce({\n representedTaxId,\n forceRefresh,\n }: {\n representedTaxId?: ArcaRepresentedTaxId;\n forceRefresh?: boolean;\n }): Promise<WsmtxcaSalesPointsResult> {\n const operation = \"consultarPuntosVenta\";\n const raw = await executeWsmtxcaAuthenticatedOperation(operation, {\n representedTaxId,\n forceRefresh,\n });\n throwForWsmtxcaOperationErrors(operation, raw);\n const rawSalesPoints = toRecord(raw.arrayPuntosVenta)?.puntoVenta;\n const entries = Array.isArray(rawSalesPoints)\n ? rawSalesPoints\n : rawSalesPoints\n ? [rawSalesPoints]\n : [];\n const salesPoints = entries.flatMap((entry) => {\n const record = toRecord(entry);\n const number = parseOptionalPositiveInteger(record?.numeroPuntoVenta);\n if (number === undefined) {\n return [];\n }\n const deletedAt = normalizeWsmtxcaResponseDate(record?.fechaBaja);\n return [\n {\n number,\n blocked: String(record?.bloqueado ?? \"N\").toUpperCase() === \"S\",\n ...(deletedAt === undefined ? {} : { deletedAt }),\n },\n ];\n });\n\n return { salesPoints, raw };\n }\n\n function lookupVoucher({\n representedTaxId,\n voucherType,\n salesPoint,\n voucherNumber,\n forceRefresh,\n abortSignal,\n }: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n voucherNumber: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<WsmtxcaVoucherLookupOutcome> {\n return executeWithAuthenticationRecovery({\n service: \"wsmtxca\",\n operation: \"consultarComprobante\",\n forceRefresh,\n execute: (attemptForceRefresh) =>\n lookupVoucherOnce({\n representedTaxId,\n voucherType,\n salesPoint,\n voucherNumber,\n forceRefresh: attemptForceRefresh,\n abortSignal,\n }),\n });\n }\n\n async function lookupVoucherOnce({\n representedTaxId,\n voucherType,\n salesPoint,\n voucherNumber,\n forceRefresh,\n abortSignal,\n }: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n voucherNumber: number;\n forceRefresh?: boolean;\n abortSignal?: AbortSignal;\n }): Promise<WsmtxcaVoucherLookupOutcome> {\n const operation = \"consultarComprobante\";\n const raw = await executeWsmtxcaAuthenticatedOperation(\n operation,\n { representedTaxId, forceRefresh, abortSignal },\n {\n consultaComprobanteRequest: {\n codigoTipoComprobante: voucherType,\n numeroPuntoVenta: salesPoint,\n numeroComprobante: voucherNumber,\n },\n }\n );\n const errors = extractWsmtxcaIssues(raw, operation, \"error\");\n const observations = extractWsmtxcaIssues(raw, operation, \"observation\");\n\n if (errors.length > 0 && errors.every((issue) => issue.code === \"1503\")) {\n return {\n kind: \"not_found\",\n service: \"wsmtxca\",\n operation,\n errors,\n observations,\n raw,\n };\n }\n if (errors.length > 0) {\n throw createWsmtxcaServiceError(operation, errors);\n }\n\n const voucher = extractWsmtxcaVoucherPayload(raw);\n if (voucher === raw && !toRecord(raw.comprobante)) {\n throw new ArcaServiceError(\n \"WSMTXCA did not return the voucher issue date\",\n {\n service: \"wsmtxca\",\n operation,\n issues: observations,\n }\n );\n }\n\n return {\n kind: \"found\",\n service: \"wsmtxca\",\n operation,\n voucher: mapWsmtxcaVoucherInfo(voucher),\n observations,\n raw,\n };\n }\n\n async function getVoucher(input: {\n representedTaxId?: ArcaRepresentedTaxId;\n voucherType: number;\n salesPoint: number;\n voucherNumber: number;\n forceRefresh?: boolean;\n }): Promise<WsmtxcaVoucherLookupResult> {\n const lookup = await lookupVoucher(input);\n if (lookup.kind === \"not_found\") {\n throw createWsmtxcaServiceError(lookup.operation, lookup.errors);\n }\n\n const invoiceDate = lookup.voucher.invoiceDate;\n if (!invoiceDate) {\n throw new ArcaServiceError(\n formatWsmtxcaIssues(lookup.observations)[0] ??\n \"WSMTXCA did not return the voucher issue date\",\n {\n service: \"wsmtxca\",\n operation: lookup.operation,\n issues: lookup.observations,\n }\n );\n }\n\n return {\n invoiceDate,\n voucher: lookup.voucher.raw,\n messages: formatWsmtxcaIssues(lookup.observations),\n raw: lookup.raw,\n };\n }\n\n return {\n issue,\n getLastAuthorizedVoucher,\n getSalesPoints,\n lookupVoucher,\n getVoucher,\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\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\ntype WsmtxcaOperation =\n | \"autorizarComprobante\"\n | \"consultarUltimoComprobanteAutorizado\"\n | \"consultarPuntosVenta\"\n | \"consultarComprobante\";\n\nfunction unwrapWsmtxcaOperationResponse(\n response: unknown,\n operation: WsmtxcaOperation\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 if (operation === \"consultarPuntosVenta\") {\n return (\n toRecord(responseRecord.consultarPuntosVentaResponse) ??\n toRecord(responseRecord.consultarPuntosVentaResult) ??\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 classifyWsmtxcaAuthorization(\n raw: Record<string, unknown>\n): WsmtxcaAuthorizationOutcome {\n const operation = \"autorizarComprobante\";\n const payload = extractWsmtxcaAuthorizationPayload(raw);\n const result = normalizeWsmtxcaResult(raw.resultado ?? payload.resultado);\n const cae = normalizeWsmtxcaString(\n payload.CAE ?? payload.codigoAutorizacion ?? raw.codigoAutorizacion\n );\n const caeExpiry = normalizeWsmtxcaResponseDate(\n payload.fechaVencimientoCAE ??\n payload.fechaVencimiento ??\n raw.fechaVencimiento\n );\n const voucherNumber = parseOptionalPositiveInteger(\n payload.numeroComprobante ?? raw.numeroComprobante\n );\n const errors = extractWsmtxcaIssues(raw, operation, \"error\");\n const observations = extractWsmtxcaIssues(raw, operation, \"observation\");\n const base = {\n service: \"wsmtxca\" as const,\n operation,\n results: createWsmtxcaResults(result),\n errors,\n observations,\n raw,\n };\n\n const authenticationOutcome = createWsmtxcaAuthenticationOutcome({\n base,\n result,\n cae,\n voucherNumber,\n });\n if (authenticationOutcome) {\n return authenticationOutcome;\n }\n\n if (\n (result === \"A\" || result === \"O\") &&\n cae &&\n voucherNumber !== undefined &&\n errors.length === 0\n ) {\n return {\n ...base,\n kind: \"authorized\",\n result,\n resultLevel: \"operation\",\n cae,\n ...(caeExpiry === undefined ? {} : { caeExpiry }),\n voucherNumber,\n };\n }\n\n if (result === \"R\" && !cae && errors.length > 0) {\n return {\n ...base,\n kind: \"rejected\",\n result: \"R\",\n resultLevel: \"operation\",\n };\n }\n\n const outcome: WsmtxcaAuthorizationOutcome = {\n ...base,\n kind: \"indeterminate\",\n reason:\n (result === \"R\" && Boolean(cae)) ||\n ((result === \"A\" || result === \"O\") && Boolean(errors.length))\n ? \"contradictory_response\"\n : \"incomplete_response\",\n ...(result === undefined ? {} : { result }),\n ...(result === undefined ? {} : { resultLevel: \"operation\" }),\n };\n assignWsmtxcaValue(outcome, \"cae\", cae);\n assignWsmtxcaValue(outcome, \"caeExpiry\", caeExpiry);\n assignWsmtxcaValue(outcome, \"voucherNumber\", voucherNumber);\n return outcome;\n}\n\nfunction createWsmtxcaAuthenticationOutcome({\n base,\n result,\n cae,\n voucherNumber,\n}: {\n base: {\n service: \"wsmtxca\";\n operation: string;\n results: ReturnType<typeof createWsmtxcaResults>;\n errors: ArcaFiscalIssue[];\n observations: ArcaFiscalIssue[];\n raw: Record<string, unknown>;\n };\n result?: string;\n cae?: string;\n voucherNumber?: number;\n}): WsmtxcaAuthorizationOutcome | undefined {\n const authenticationError = classifyArcaAuthenticationIssues(base.errors, {\n service: base.service,\n operation: base.operation,\n });\n if (\n !authenticationError ||\n result === \"A\" ||\n result === \"O\" ||\n cae ||\n voucherNumber !== undefined\n ) {\n return undefined;\n }\n\n return {\n ...base,\n kind: \"indeterminate\",\n reason: \"authentication_rejected\",\n authentication: createArcaAuthenticationEvidence(authenticationError),\n ...(result === undefined ? {} : { result }),\n ...(result === undefined ? {} : { resultLevel: \"operation\" }),\n };\n}\n\nfunction createWsmtxcaIndeterminateOutcome(\n error: unknown\n): WsmtxcaAuthorizationOutcome {\n const authenticationError = classifyArcaAuthenticationError(error, {\n service: \"wsmtxca\",\n operation: \"autorizarComprobante\",\n });\n return {\n kind: \"indeterminate\",\n service: \"wsmtxca\",\n operation: \"autorizarComprobante\",\n results: {},\n reason: authenticationError\n ? \"authentication_rejected\"\n : getWsmtxcaIndeterminateReason(error),\n ...(authenticationError\n ? {\n authentication: createArcaAuthenticationEvidence(authenticationError),\n }\n : {}),\n errors: [],\n observations: [],\n };\n}\n\nfunction getWsmtxcaIndeterminateReason(\n error: unknown\n): ArcaAuthorizationIndeterminateReason {\n if (error instanceof ArcaTransportError) {\n return \"transport_error\";\n }\n if (error instanceof ArcaSoapFaultError) {\n return \"soap_fault\";\n }\n if (error instanceof ArcaInvalidSoapResponseError) {\n return \"invalid_response\";\n }\n return \"unexpected_error\";\n}\n\nfunction createWsmtxcaResults(operationResult?: string) {\n const results: { operation?: string } = {};\n assignWsmtxcaValue(results, \"operation\", operationResult);\n return results;\n}\n\nfunction createWsmtxcaServiceError(\n operation: string,\n issues: ArcaFiscalIssue[]\n) {\n const authenticationError = classifyArcaAuthenticationIssues(issues, {\n service: \"wsmtxca\",\n operation,\n });\n if (authenticationError) {\n return authenticationError;\n }\n\n const firstIssue = issues[0];\n return new ArcaServiceError(\n formatWsmtxcaIssues(issues).join(\" | \") ||\n \"WSMTXCA returned a service error\",\n {\n service: \"wsmtxca\",\n operation,\n ...(firstIssue?.code === undefined\n ? {}\n : { serviceCode: firstIssue.code }),\n issues,\n }\n );\n}\n\nfunction throwForWsmtxcaOperationErrors(\n operation: string,\n raw: Record<string, unknown>\n): void {\n const errors = extractWsmtxcaIssues(raw, operation, \"error\");\n if (errors.length > 0) {\n throw createWsmtxcaServiceError(operation, errors);\n }\n}\n\nfunction extractWsmtxcaIssues(\n raw: Record<string, unknown>,\n operation: string,\n source: \"error\" | \"observation\"\n): ArcaFiscalIssue[] {\n const container = toRecord(\n source === \"error\" ? raw.arrayErrores : raw.arrayObservaciones\n );\n return normalizeWsmtxcaIssueEntries(container?.codigoDescripcion).map(\n (entry) => ({\n service: \"wsmtxca\",\n operation,\n source,\n category:\n source === \"observation\"\n ? \"observation\"\n : operation === \"autorizarComprobante\"\n ? \"business\"\n : \"unknown\",\n ...(entry.code === undefined ? {} : { code: entry.code }),\n message: entry.message,\n ...(operation === \"autorizarComprobante\"\n ? { resultLevel: \"operation\" as const }\n : {}),\n })\n );\n}\n\nfunction normalizeWsmtxcaIssueEntries(value: unknown) {\n const entries = Array.isArray(value) ? value : value ? [value] : [];\n return entries.map((entry) => {\n const record = toRecord(entry) ?? {};\n const code = record.codigo;\n const description = record.descripcion;\n return {\n ...(code === undefined || code === null ? {} : { code: String(code) }),\n message:\n description === undefined || description === null\n ? \"Unknown WSMTXCA issue\"\n : String(description),\n };\n });\n}\n\nfunction formatWsmtxcaIssues(issues: ArcaFiscalIssue[]): string[] {\n return issues.map((issue) => {\n const prefix = issue.source === \"error\" ? \"Error\" : \"Obs\";\n return `${prefix}${issue.code ? ` ${issue.code}` : \"\"}: ${issue.message}`;\n });\n}\n\nfunction mapWsmtxcaVoucherInfo(\n raw: Record<string, unknown>\n): WsmtxcaVoucherInfo {\n const voucher: WsmtxcaVoucherInfo = { raw };\n const invoiceDate = normalizeWsmtxcaResponseDate(\n raw.fechaEmision ?? raw.fecha ?? raw.CbteFch\n );\n const cae = normalizeWsmtxcaString(raw.codigoAutorizacion ?? raw.CAE);\n const caeExpiry = normalizeWsmtxcaResponseDate(\n raw.fechaVencimiento ?? raw.fechaVencimientoCAE\n );\n const vatAmount = sumWsmtxcaVatAmounts(raw.arraySubtotalesIVA);\n\n assignWsmtxcaValue(\n voucher,\n \"voucherNumber\",\n parseOptionalPositiveInteger(raw.numeroComprobante)\n );\n assignWsmtxcaValue(voucher, \"invoiceDate\", invoiceDate);\n assignWsmtxcaValue(\n voucher,\n \"salesPoint\",\n parseOptionalPositiveInteger(raw.numeroPuntoVenta)\n );\n assignWsmtxcaValue(\n voucher,\n \"voucherType\",\n parseOptionalPositiveInteger(raw.codigoTipoComprobante)\n );\n assignWsmtxcaValue(\n voucher,\n \"concept\",\n parseOptionalNumber(raw.codigoConcepto)\n );\n assignWsmtxcaValue(\n voucher,\n \"documentType\",\n parseOptionalNumber(raw.codigoTipoDocumento)\n );\n assignWsmtxcaValue(\n voucher,\n \"documentNumber\",\n normalizeWsmtxcaString(raw.numeroDocumento)\n );\n assignWsmtxcaValue(\n voucher,\n \"receiverVatConditionId\",\n parseOptionalNumber(raw.condicionIVAReceptor)\n );\n assignWsmtxcaValue(\n voucher,\n \"totalAmount\",\n parseOptionalNumber(raw.importeTotal)\n );\n assignWsmtxcaValue(\n voucher,\n \"subtotalAmount\",\n parseOptionalNumber(raw.importeSubtotal)\n );\n assignWsmtxcaValue(\n voucher,\n \"taxableAmount\",\n parseOptionalNumber(raw.importeGravado)\n );\n assignWsmtxcaValue(\n voucher,\n \"nonTaxableAmount\",\n parseOptionalNumber(raw.importeNoGravado)\n );\n assignWsmtxcaValue(\n voucher,\n \"exemptAmount\",\n parseOptionalNumber(raw.importeExento)\n );\n // A voucher issued without tributes carries neither the amount nor the\n // detail, and its tribute amount is zero.\n assignWsmtxcaValue(\n voucher,\n \"taxAmount\",\n parseOptionalNumber(raw.importeOtrosTributos) ??\n (raw.arrayOtrosTributos === undefined ? 0 : undefined)\n );\n assignWsmtxcaValue(voucher, \"vatAmount\", vatAmount);\n assignWsmtxcaValue(\n voucher,\n \"currencyId\",\n normalizeWsmtxcaString(raw.codigoMoneda)\n );\n assignWsmtxcaValue(\n voucher,\n \"exchangeRate\",\n parseOptionalNumber(raw.cotizacionMoneda)\n );\n assignWsmtxcaValue(voucher, \"cae\", cae);\n assignWsmtxcaValue(voucher, \"caeExpiry\", caeExpiry);\n\n return voucher;\n}\n\nfunction sumWsmtxcaVatAmounts(value: unknown): number | undefined {\n const subtotals = toRecord(value)?.subtotalIVA;\n const entries = Array.isArray(subtotals)\n ? subtotals\n : subtotals\n ? [subtotals]\n : [];\n const amounts = entries\n .map((entry) => parseOptionalNumber(toRecord(entry)?.importe))\n .filter((amount): amount is number => amount !== undefined);\n return amounts.length > 0\n ? amounts.reduce((total, amount) => total + amount, 0)\n : undefined;\n}\n\nfunction parseWsmtxcaVoucherNumber(\n value: unknown,\n message: string,\n allowZero = false\n) {\n const parsed = Number.parseInt(String(value ?? \"\"), 10);\n if (!Number.isFinite(parsed) || (allowZero ? parsed < 0 : parsed <= 0)) {\n throw new ArcaServiceError(message, {\n service: \"wsmtxca\",\n });\n }\n return parsed;\n}\n\nfunction parseOptionalPositiveInteger(value: unknown): number | undefined {\n const parsed = Number.parseInt(String(value ?? \"\"), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction parseOptionalNumber(value: unknown): number | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction normalizeWsmtxcaResult(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const normalized = value.trim().toUpperCase();\n return normalized || undefined;\n}\n\nfunction normalizeWsmtxcaString(value: unknown): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n const normalized = String(value).trim();\n return normalized || undefined;\n}\n\nfunction assignWsmtxcaValue<TTarget, TKey extends keyof TTarget>(\n target: TTarget,\n key: TKey,\n value: TTarget[TKey] | undefined\n) {\n if (value !== undefined) {\n target[key] = value;\n }\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"],"mappings":"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","names":["issue"]}