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.
- package/README.md +2 -2
- package/dist/{chunk-MS4SSSYU.mjs → chunk-4RD5VQWC.mjs} +4 -28
- package/dist/chunk-4RD5VQWC.mjs.map +1 -0
- package/dist/{chunk-BYEP3ABS.mjs → chunk-EZ4HA3LC.mjs} +45 -5
- package/dist/{chunk-BYEP3ABS.mjs.map → chunk-EZ4HA3LC.mjs.map} +1 -1
- package/dist/{chunk-BNZECHTS.mjs → chunk-JP5IBMVI.mjs} +58 -21
- package/dist/chunk-JP5IBMVI.mjs.map +1 -0
- package/dist/{chunk-EXECWJEC.mjs → chunk-MRBFLBWX.mjs} +66 -6
- package/dist/chunk-MRBFLBWX.mjs.map +1 -0
- package/dist/{chunk-KD2WT535.mjs → chunk-OORNZFI5.mjs} +22 -9
- package/dist/chunk-OORNZFI5.mjs.map +1 -0
- package/dist/{chunk-PHXH34L6.mjs → chunk-WPHD2GQJ.mjs} +2 -2
- package/dist/cli.d.ts +2 -2
- package/dist/cli.mjs +7 -7
- package/dist/cli.mjs.map +1 -1
- package/dist/{client-DFRttmTZ.d.ts → client-COK5u3oz.d.ts} +14 -4
- package/dist/errors.d.ts +1 -1
- package/dist/errors.mjs +1 -1
- package/dist/{fiscal-evidence-Cecw1s05.d.ts → fiscal-evidence-B6UTFGmY.d.ts} +18 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.mjs +6 -6
- package/dist/padron.d.ts +28 -1
- package/dist/padron.mjs +2 -2
- package/dist/wsfe.d.ts +9 -13
- package/dist/wsfe.mjs +3 -3
- package/dist/wsmtxca.d.ts +2 -17
- package/dist/wsmtxca.mjs +3 -3
- package/package.json +2 -2
- package/dist/chunk-BNZECHTS.mjs.map +0 -1
- package/dist/chunk-EXECWJEC.mjs.map +0 -1
- package/dist/chunk-KD2WT535.mjs.map +0 -1
- package/dist/chunk-MS4SSSYU.mjs.map +0 -1
- /package/dist/{chunk-PHXH34L6.mjs.map → chunk-WPHD2GQJ.mjs.map} +0 -0
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
</div>
|
|
10
10
|
|
|
11
|
-
SDK de
|
|
11
|
+
SDK de TypeScript para facturación electrónica con ARCA / AFIP. Emití facturas,
|
|
12
12
|
notas de crédito y notas de débito, y consultá el Padrón con una sola API.
|
|
13
13
|
|
|
14
14
|
- **Solo ESM**, Node.js **>= 22**
|
|
@@ -72,7 +72,7 @@ El detalle está en [Facturas](https://facturas-sdk.dev/guides/invoices).
|
|
|
72
72
|
|
|
73
73
|
## Reintentos seguros
|
|
74
74
|
|
|
75
|
-
ARCA no recibe una clave de idempotencia
|
|
75
|
+
ARCA no recibe una clave de idempotencia. Si una respuesta se
|
|
76
76
|
pierde, no puede distinguir un reintento de una emisión nueva. `facturas` te
|
|
77
77
|
permite guardar cada intento en un `store` con el ID estable de tu venta. Al
|
|
78
78
|
repetir esa clave, consulta el número reservado en vez de empezar otra emisión.
|
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
classifyArcaAuthenticationIssues,
|
|
4
4
|
createArcaAuthenticationEvidence,
|
|
5
5
|
executeWithAuthenticationRecovery
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-WPHD2GQJ.mjs";
|
|
7
7
|
import {
|
|
8
8
|
ArcaInputError,
|
|
9
9
|
ArcaInvalidSoapResponseError,
|
|
10
10
|
ArcaServiceError,
|
|
11
11
|
ArcaSoapFaultError,
|
|
12
12
|
ArcaTransportError
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-EZ4HA3LC.mjs";
|
|
14
14
|
|
|
15
15
|
// src/services/wsmtxca.ts
|
|
16
16
|
function createWsmtxcaService(options) {
|
|
@@ -247,35 +247,11 @@ function createWsmtxcaService(options) {
|
|
|
247
247
|
raw
|
|
248
248
|
};
|
|
249
249
|
}
|
|
250
|
-
async function getVoucher(input) {
|
|
251
|
-
const lookup = await lookupVoucher(input);
|
|
252
|
-
if (lookup.kind === "not_found") {
|
|
253
|
-
throw createWsmtxcaServiceError(lookup.operation, lookup.errors);
|
|
254
|
-
}
|
|
255
|
-
const invoiceDate = lookup.voucher.invoiceDate;
|
|
256
|
-
if (!invoiceDate) {
|
|
257
|
-
throw new ArcaServiceError(
|
|
258
|
-
formatWsmtxcaIssues(lookup.observations)[0] ?? "WSMTXCA did not return the voucher issue date",
|
|
259
|
-
{
|
|
260
|
-
service: "wsmtxca",
|
|
261
|
-
operation: lookup.operation,
|
|
262
|
-
issues: lookup.observations
|
|
263
|
-
}
|
|
264
|
-
);
|
|
265
|
-
}
|
|
266
|
-
return {
|
|
267
|
-
invoiceDate,
|
|
268
|
-
voucher: lookup.voucher.raw,
|
|
269
|
-
messages: formatWsmtxcaIssues(lookup.observations),
|
|
270
|
-
raw: lookup.raw
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
250
|
return {
|
|
274
251
|
issue,
|
|
275
252
|
getLastAuthorizedVoucher,
|
|
276
253
|
getSalesPoints,
|
|
277
|
-
lookupVoucher
|
|
278
|
-
getVoucher
|
|
254
|
+
lookupVoucher
|
|
279
255
|
};
|
|
280
256
|
}
|
|
281
257
|
function createWsmtxcaAuth(representedTaxId, token, sign) {
|
|
@@ -655,4 +631,4 @@ function formatCompactDateToIso(dateValue) {
|
|
|
655
631
|
export {
|
|
656
632
|
createWsmtxcaService
|
|
657
633
|
};
|
|
658
|
-
//# sourceMappingURL=chunk-
|
|
634
|
+
//# sourceMappingURL=chunk-4RD5VQWC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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/** 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};\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 return {\n issue,\n getLastAuthorizedVoucher,\n getSalesPoints,\n lookupVoucher,\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"]}
|
|
@@ -202,12 +202,52 @@ function toArcaSafeErrorMetadata(error) {
|
|
|
202
202
|
if (!(error instanceof Error)) {
|
|
203
203
|
return { name: "UnknownError", message: String(error) };
|
|
204
204
|
}
|
|
205
|
-
|
|
205
|
+
const metadata = {
|
|
206
206
|
name: error.name,
|
|
207
|
-
message: error.message
|
|
208
|
-
...error instanceof ArcaError ? { code: error.code } : {},
|
|
209
|
-
...error instanceof ArcaTransportError && error.statusCode !== void 0 ? { statusCode: error.statusCode } : {}
|
|
207
|
+
message: error.message
|
|
210
208
|
};
|
|
209
|
+
if (!(error instanceof ArcaError)) {
|
|
210
|
+
return metadata;
|
|
211
|
+
}
|
|
212
|
+
const fields = { code: error.code };
|
|
213
|
+
if (error instanceof ArcaInputError) {
|
|
214
|
+
Object.assign(fields, { field: error.field, expected: error.expected });
|
|
215
|
+
} else if (error instanceof ArcaAuthenticationError) {
|
|
216
|
+
Object.assign(fields, {
|
|
217
|
+
service: error.service,
|
|
218
|
+
operation: error.operation,
|
|
219
|
+
reason: error.reason,
|
|
220
|
+
providerCode: error.providerCode
|
|
221
|
+
});
|
|
222
|
+
} else if (error instanceof ArcaTransportError) {
|
|
223
|
+
Object.assign(fields, {
|
|
224
|
+
statusCode: error.statusCode,
|
|
225
|
+
contentType: error.contentType
|
|
226
|
+
});
|
|
227
|
+
} else if (error instanceof ArcaSoapFaultError) {
|
|
228
|
+
Object.assign(fields, { faultCode: error.faultCode });
|
|
229
|
+
} else if (error instanceof ArcaInvalidSoapResponseError) {
|
|
230
|
+
Object.assign(fields, {
|
|
231
|
+
service: error.service,
|
|
232
|
+
operation: error.operation,
|
|
233
|
+
statusCode: error.statusCode,
|
|
234
|
+
contentType: error.contentType
|
|
235
|
+
});
|
|
236
|
+
} else if (error instanceof ArcaServiceError) {
|
|
237
|
+
Object.assign(fields, {
|
|
238
|
+
service: error.service,
|
|
239
|
+
operation: error.operation,
|
|
240
|
+
serviceCode: error.serviceCode === void 0 ? void 0 : String(error.serviceCode),
|
|
241
|
+
result: error.result,
|
|
242
|
+
resultLevel: error.resultLevel
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
246
|
+
if (value !== void 0) {
|
|
247
|
+
metadata[key] = value;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return metadata;
|
|
211
251
|
}
|
|
212
252
|
|
|
213
253
|
export {
|
|
@@ -224,4 +264,4 @@ export {
|
|
|
224
264
|
ArcaServiceError,
|
|
225
265
|
toArcaSafeErrorMetadata
|
|
226
266
|
};
|
|
227
|
-
//# sourceMappingURL=chunk-
|
|
267
|
+
//# sourceMappingURL=chunk-EZ4HA3LC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal/redaction.ts","../src/errors.ts"],"sourcesContent":["export const MAX_DIAGNOSTIC_PREVIEW_LENGTH = 4096;\n\nconst MAX_DIAGNOSTIC_SCALAR_LENGTH = 512;\nconst SENSITIVE_XML_ELEMENT_NAME = \"((?:[A-Za-z_][\\\\w.-]*:)?(?:Token|Sign))\";\nconst PAIRED_SENSITIVE_XML_ELEMENT = new RegExp(\n `<${SENSITIVE_XML_ELEMENT_NAME}\\\\b[^>]*>[\\\\s\\\\S]*?<\\\\/\\\\1\\\\s*>`,\n \"gi\"\n);\nconst SELF_CLOSING_SENSITIVE_XML_ELEMENT = new RegExp(\n `<${SENSITIVE_XML_ELEMENT_NAME}\\\\b[^>]*\\\\/\\\\s*>`,\n \"gi\"\n);\nconst UNTERMINATED_SENSITIVE_XML_ELEMENT = new RegExp(\n `<${SENSITIVE_XML_ELEMENT_NAME}\\\\b[^>]*>[^<]*`,\n \"gi\"\n);\n\nexport type ResponseBodyDiagnostic = {\n responseBodyLength: number;\n responseBodyPreview: string;\n};\n\nexport type SafeErrorDiagnostic = {\n errorName?: string;\n errorCode?: string;\n statusCode?: number;\n contentType?: string;\n responseBodyLength?: number;\n responseBodyPreview?: string;\n faultCode?: string;\n};\n\n/** Redacts credential-bearing XML elements and applies the global preview bound. */\nexport function redactDiagnosticPreview(\n value: string,\n requestedMaxLength = MAX_DIAGNOSTIC_PREVIEW_LENGTH\n): string {\n const maxLength = normalizePreviewLength(requestedMaxLength);\n\n return value\n .replace(\n PAIRED_SENSITIVE_XML_ELEMENT,\n (_match, tagName: string) => `<${tagName}>[REDACTED]</${tagName}>`\n )\n .replace(\n SELF_CLOSING_SENSITIVE_XML_ELEMENT,\n (_match, tagName: string) => `<${tagName}>[REDACTED]</${tagName}>`\n )\n .replace(\n UNTERMINATED_SENSITIVE_XML_ELEMENT,\n (_match, tagName: string) => `<${tagName}>[REDACTED]`\n )\n .slice(0, maxLength);\n}\n\n/** Produces the only response-body shape allowed in errors and logs. */\nexport function createResponseBodyDiagnostic(\n responseBody: string,\n requestedMaxLength = MAX_DIAGNOSTIC_PREVIEW_LENGTH\n): ResponseBodyDiagnostic {\n return {\n responseBodyLength: responseBody.length,\n responseBodyPreview: redactDiagnosticPreview(\n responseBody,\n requestedMaxLength\n ),\n };\n}\n\n/** Extracts a scalar allowlist from an error without exposing the error or cause. */\nexport function createSafeErrorDiagnostic(error: unknown): SafeErrorDiagnostic {\n if (!(error && typeof error === \"object\")) {\n return {};\n }\n\n const candidate = error as Record<string, unknown>;\n const diagnostic: SafeErrorDiagnostic = {};\n\n assignSafeString(diagnostic, \"errorName\", candidate.name);\n assignSafeString(diagnostic, \"errorCode\", candidate.code);\n assignSafeNumber(diagnostic, \"statusCode\", candidate.statusCode);\n assignSafeString(diagnostic, \"contentType\", candidate.contentType);\n assignSafeNumber(\n diagnostic,\n \"responseBodyLength\",\n candidate.responseBodyLength\n );\n if (typeof candidate.responseBodyPreview === \"string\") {\n diagnostic.responseBodyPreview = redactDiagnosticPreview(\n candidate.responseBodyPreview\n );\n }\n assignSafeString(diagnostic, \"faultCode\", candidate.faultCode);\n\n return diagnostic;\n}\n\nfunction normalizePreviewLength(requestedMaxLength: number): number {\n if (!Number.isFinite(requestedMaxLength)) {\n return MAX_DIAGNOSTIC_PREVIEW_LENGTH;\n }\n\n return Math.max(\n 0,\n Math.min(Math.trunc(requestedMaxLength), MAX_DIAGNOSTIC_PREVIEW_LENGTH)\n );\n}\n\nfunction assignSafeString<\n TKey extends \"errorName\" | \"errorCode\" | \"contentType\" | \"faultCode\",\n>(target: SafeErrorDiagnostic, key: TKey, value: unknown): void {\n if (typeof value === \"string\") {\n target[key] = redactDiagnosticPreview(value, MAX_DIAGNOSTIC_SCALAR_LENGTH);\n }\n}\n\nfunction assignSafeNumber<TKey extends \"statusCode\" | \"responseBodyLength\">(\n target: SafeErrorDiagnostic,\n key: TKey,\n value: unknown\n): void {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n target[key] = value;\n }\n}\n","import { redactDiagnosticPreview } from \"./internal/redaction\";\nimport type { ArcaServiceName } from \"./internal/types\";\nimport type {\n ArcaFiscalIssue,\n ArcaFiscalResultLevel,\n ArcaFiscalResults,\n} from \"./services/fiscal-evidence\";\n\n/** Base error class for all ARCA-related errors. */\nexport class ArcaError extends Error {\n readonly code: string;\n override readonly name: string = \"ArcaError\";\n\n constructor(message: string, code = \"ARCA_ERROR\", options?: ErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** Thrown when the ARCA client configuration is missing or invalid. */\nexport class ArcaConfigurationError extends ArcaError {\n override readonly name: string = \"ArcaConfigurationError\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"ARCA_CONFIGURATION_ERROR\", options);\n }\n}\n\n/** Stable routing codes for caller-provided input failures. */\nexport type ArcaInputErrorCode =\n | \"ARCA_INPUT_IDEMPOTENCY_MISMATCH\"\n | \"ARCA_INPUT_RESERVATION_NOT_FOUND\"\n | \"ARCA_INPUT_INVALID_DATE\"\n | \"ARCA_INPUT_INVALID_AMOUNT\"\n | \"ARCA_INPUT_AMOUNT_PRECISION\"\n | \"ARCA_INPUT_AMOUNT_MISMATCH\"\n | \"ARCA_INPUT_INVALID_EXCHANGE_RATE\"\n | \"ARCA_INPUT_INVALID_VALUE\"\n | \"ARCA_INPUT_MISSING_FIELD\"\n | \"ARCA_INPUT_RESERVED_FIELD\";\n\nexport type ArcaInputErrorOptions = ErrorOptions & {\n code: ArcaInputErrorCode;\n field?: string;\n expected?: string;\n};\n\n/** Thrown when caller-provided input data is missing or invalid. */\nexport class ArcaInputError extends ArcaError {\n declare readonly code: ArcaInputErrorCode;\n override readonly name: string = \"ArcaInputError\";\n readonly field?: string;\n readonly expected?: string;\n\n constructor(message: string, options: ArcaInputErrorOptions) {\n super(message, options.code, options);\n this.field = options.field;\n this.expected = options.expected;\n }\n}\n\n/** Stable reasons exposed for explicit ARCA authentication rejections. */\nexport type ArcaAuthenticationReason =\n | \"invalid_token\"\n | \"unauthorized_computer\"\n | \"missing_relationship\"\n | \"authentication_rejected\";\n\nexport type ArcaAuthenticationErrorOptions = ErrorOptions & {\n reason: ArcaAuthenticationReason;\n service: ArcaServiceName;\n operation: string;\n providerCode?: string | number;\n};\n\n/** Thrown when ARCA explicitly rejects credentials before an operation runs. */\nexport class ArcaAuthenticationError extends ArcaError {\n declare readonly code: \"ARCA_AUTHENTICATION_ERROR\";\n override readonly name: string = \"ArcaAuthenticationError\";\n readonly reason: ArcaAuthenticationReason;\n readonly service: ArcaServiceName;\n readonly operation: string;\n readonly providerCode?: string | number;\n\n constructor(message: string, options: ArcaAuthenticationErrorOptions) {\n super(\n redactDiagnosticPreview(message),\n \"ARCA_AUTHENTICATION_ERROR\",\n options\n );\n this.reason = options.reason;\n this.service = options.service;\n this.operation = options.operation;\n this.providerCode = normalizeProviderCode(options.providerCode);\n }\n}\n\n/** Narrows unknown failures to the explicit authentication error contract. */\nexport function isArcaAuthenticationError(\n error: unknown\n): error is ArcaAuthenticationError {\n return error instanceof ArcaAuthenticationError;\n}\n\n/** Thrown when an HTTP request to an ARCA endpoint fails at the transport level. */\nexport class ArcaTransportError extends ArcaError {\n override readonly name: string = \"ArcaTransportError\";\n readonly statusCode?: number;\n readonly contentType?: string;\n readonly responseBodyLength?: number;\n readonly responseBodyPreview?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n statusCode?: number;\n contentType?: string;\n responseBodyLength?: number;\n responseBodyPreview?: string;\n }\n ) {\n super(message, \"ARCA_TRANSPORT_ERROR\", options);\n this.statusCode = options?.statusCode;\n this.contentType = options?.contentType;\n this.responseBodyLength = options?.responseBodyLength;\n this.responseBodyPreview =\n options?.responseBodyPreview === undefined\n ? undefined\n : redactDiagnosticPreview(options.responseBodyPreview);\n }\n}\n\n/** Thrown when the SOAP response contains a Fault element. */\nexport class ArcaSoapFaultError extends ArcaError {\n override readonly name: string = \"ArcaSoapFaultError\";\n readonly faultCode?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n faultCode?: string;\n }\n ) {\n super(redactDiagnosticPreview(message), \"ARCA_SOAP_FAULT\", options);\n this.faultCode =\n options?.faultCode === undefined\n ? undefined\n : redactDiagnosticPreview(options.faultCode);\n }\n}\n\n/** Thrown when a response cannot be parsed as a valid SOAP envelope. */\nexport class ArcaInvalidSoapResponseError extends ArcaError {\n override readonly name: string = \"ArcaInvalidSoapResponseError\";\n readonly service?: ArcaServiceName;\n readonly operation?: string;\n readonly endpointUrl?: string;\n readonly statusCode?: number;\n readonly contentType?: string;\n readonly responseBodyLength?: number;\n readonly responseBodyPreview?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n service?: ArcaServiceName;\n operation?: string;\n endpointUrl?: string;\n statusCode?: number;\n contentType?: string;\n responseBodyLength?: number;\n responseBodyPreview?: string;\n }\n ) {\n super(message, \"ARCA_INVALID_SOAP_RESPONSE\", options);\n this.service = options?.service;\n this.operation = options?.operation;\n this.endpointUrl = options?.endpointUrl;\n this.statusCode = options?.statusCode;\n this.contentType = options?.contentType;\n this.responseBodyLength = options?.responseBodyLength;\n this.responseBodyPreview =\n options?.responseBodyPreview === undefined\n ? undefined\n : redactDiagnosticPreview(options.responseBodyPreview);\n }\n}\n\n/** Thrown when an ARCA service (WSFE, WSMTXCA, Padron) returns a domain-level error. */\nexport class ArcaServiceError extends ArcaError {\n override readonly name: string = \"ArcaServiceError\";\n readonly serviceCode?: string | number;\n readonly service?: ArcaServiceName;\n readonly operation?: string;\n readonly result?: string;\n readonly resultLevel?: ArcaFiscalResultLevel;\n readonly results?: ArcaFiscalResults;\n readonly cae?: string;\n readonly issues?: readonly ArcaFiscalIssue[];\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n serviceCode?: string | number;\n service?: ArcaServiceName;\n operation?: string;\n result?: string;\n resultLevel?: ArcaFiscalResultLevel;\n results?: ArcaFiscalResults;\n cae?: string;\n issues?: readonly ArcaFiscalIssue[];\n }\n ) {\n super(message, \"ARCA_SERVICE_ERROR\", options);\n this.serviceCode = options?.serviceCode;\n this.service = options?.service;\n this.operation = options?.operation;\n this.result = options?.result;\n this.resultLevel = options?.resultLevel;\n this.results = options?.results;\n this.cae = options?.cae;\n this.issues = options?.issues;\n }\n}\n\nfunction normalizeProviderCode(\n providerCode: string | number | undefined\n): string | number | undefined {\n if (typeof providerCode === \"number\") {\n return Number.isFinite(providerCode) ? providerCode : undefined;\n }\n if (typeof providerCode === \"string\") {\n return redactDiagnosticPreview(providerCode, 512);\n }\n return undefined;\n}\n\n/** Narrow error evidence: never includes a cause, raw response or stack. */\nexport type ArcaSafeErrorMetadata = {\n name: string;\n message: string;\n code?: string;\n statusCode?: number;\n};\n\nexport function toArcaSafeErrorMetadata(error: unknown): ArcaSafeErrorMetadata {\n if (!(error instanceof Error)) {\n return { name: \"UnknownError\", message: String(error) };\n }\n return {\n name: error.name,\n message: error.message,\n ...(error instanceof ArcaError ? { code: error.code } : {}),\n ...(error instanceof ArcaTransportError && error.statusCode !== undefined\n ? { statusCode: error.statusCode }\n : {}),\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/redaction.ts","../src/errors.ts"],"sourcesContent":["export const MAX_DIAGNOSTIC_PREVIEW_LENGTH = 4096;\n\nconst MAX_DIAGNOSTIC_SCALAR_LENGTH = 512;\nconst SENSITIVE_XML_ELEMENT_NAME = \"((?:[A-Za-z_][\\\\w.-]*:)?(?:Token|Sign))\";\nconst PAIRED_SENSITIVE_XML_ELEMENT = new RegExp(\n `<${SENSITIVE_XML_ELEMENT_NAME}\\\\b[^>]*>[\\\\s\\\\S]*?<\\\\/\\\\1\\\\s*>`,\n \"gi\"\n);\nconst SELF_CLOSING_SENSITIVE_XML_ELEMENT = new RegExp(\n `<${SENSITIVE_XML_ELEMENT_NAME}\\\\b[^>]*\\\\/\\\\s*>`,\n \"gi\"\n);\nconst UNTERMINATED_SENSITIVE_XML_ELEMENT = new RegExp(\n `<${SENSITIVE_XML_ELEMENT_NAME}\\\\b[^>]*>[^<]*`,\n \"gi\"\n);\n\nexport type ResponseBodyDiagnostic = {\n responseBodyLength: number;\n responseBodyPreview: string;\n};\n\nexport type SafeErrorDiagnostic = {\n errorName?: string;\n errorCode?: string;\n statusCode?: number;\n contentType?: string;\n responseBodyLength?: number;\n responseBodyPreview?: string;\n faultCode?: string;\n};\n\n/** Redacts credential-bearing XML elements and applies the global preview bound. */\nexport function redactDiagnosticPreview(\n value: string,\n requestedMaxLength = MAX_DIAGNOSTIC_PREVIEW_LENGTH\n): string {\n const maxLength = normalizePreviewLength(requestedMaxLength);\n\n return value\n .replace(\n PAIRED_SENSITIVE_XML_ELEMENT,\n (_match, tagName: string) => `<${tagName}>[REDACTED]</${tagName}>`\n )\n .replace(\n SELF_CLOSING_SENSITIVE_XML_ELEMENT,\n (_match, tagName: string) => `<${tagName}>[REDACTED]</${tagName}>`\n )\n .replace(\n UNTERMINATED_SENSITIVE_XML_ELEMENT,\n (_match, tagName: string) => `<${tagName}>[REDACTED]`\n )\n .slice(0, maxLength);\n}\n\n/** Produces the only response-body shape allowed in errors and logs. */\nexport function createResponseBodyDiagnostic(\n responseBody: string,\n requestedMaxLength = MAX_DIAGNOSTIC_PREVIEW_LENGTH\n): ResponseBodyDiagnostic {\n return {\n responseBodyLength: responseBody.length,\n responseBodyPreview: redactDiagnosticPreview(\n responseBody,\n requestedMaxLength\n ),\n };\n}\n\n/** Extracts a scalar allowlist from an error without exposing the error or cause. */\nexport function createSafeErrorDiagnostic(error: unknown): SafeErrorDiagnostic {\n if (!(error && typeof error === \"object\")) {\n return {};\n }\n\n const candidate = error as Record<string, unknown>;\n const diagnostic: SafeErrorDiagnostic = {};\n\n assignSafeString(diagnostic, \"errorName\", candidate.name);\n assignSafeString(diagnostic, \"errorCode\", candidate.code);\n assignSafeNumber(diagnostic, \"statusCode\", candidate.statusCode);\n assignSafeString(diagnostic, \"contentType\", candidate.contentType);\n assignSafeNumber(\n diagnostic,\n \"responseBodyLength\",\n candidate.responseBodyLength\n );\n if (typeof candidate.responseBodyPreview === \"string\") {\n diagnostic.responseBodyPreview = redactDiagnosticPreview(\n candidate.responseBodyPreview\n );\n }\n assignSafeString(diagnostic, \"faultCode\", candidate.faultCode);\n\n return diagnostic;\n}\n\nfunction normalizePreviewLength(requestedMaxLength: number): number {\n if (!Number.isFinite(requestedMaxLength)) {\n return MAX_DIAGNOSTIC_PREVIEW_LENGTH;\n }\n\n return Math.max(\n 0,\n Math.min(Math.trunc(requestedMaxLength), MAX_DIAGNOSTIC_PREVIEW_LENGTH)\n );\n}\n\nfunction assignSafeString<\n TKey extends \"errorName\" | \"errorCode\" | \"contentType\" | \"faultCode\",\n>(target: SafeErrorDiagnostic, key: TKey, value: unknown): void {\n if (typeof value === \"string\") {\n target[key] = redactDiagnosticPreview(value, MAX_DIAGNOSTIC_SCALAR_LENGTH);\n }\n}\n\nfunction assignSafeNumber<TKey extends \"statusCode\" | \"responseBodyLength\">(\n target: SafeErrorDiagnostic,\n key: TKey,\n value: unknown\n): void {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n target[key] = value;\n }\n}\n","import { redactDiagnosticPreview } from \"./internal/redaction\";\nimport type { ArcaServiceName } from \"./internal/types\";\nimport type {\n ArcaFiscalIssue,\n ArcaFiscalResultLevel,\n ArcaFiscalResults,\n} from \"./services/fiscal-evidence\";\n\n/** Base error class for all ARCA-related errors. */\nexport class ArcaError extends Error {\n readonly code: string;\n override readonly name: string = \"ArcaError\";\n\n constructor(message: string, code = \"ARCA_ERROR\", options?: ErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** Thrown when the ARCA client configuration is missing or invalid. */\nexport class ArcaConfigurationError extends ArcaError {\n override readonly name: string = \"ArcaConfigurationError\";\n\n constructor(message: string, options?: ErrorOptions) {\n super(message, \"ARCA_CONFIGURATION_ERROR\", options);\n }\n}\n\n/** Stable routing codes for caller-provided input failures. */\nexport type ArcaInputErrorCode =\n | \"ARCA_INPUT_IDEMPOTENCY_MISMATCH\"\n | \"ARCA_INPUT_RESERVATION_NOT_FOUND\"\n | \"ARCA_INPUT_INVALID_DATE\"\n | \"ARCA_INPUT_INVALID_AMOUNT\"\n | \"ARCA_INPUT_AMOUNT_PRECISION\"\n | \"ARCA_INPUT_AMOUNT_MISMATCH\"\n | \"ARCA_INPUT_INVALID_EXCHANGE_RATE\"\n | \"ARCA_INPUT_INVALID_VALUE\"\n | \"ARCA_INPUT_MISSING_FIELD\"\n | \"ARCA_INPUT_RESERVED_FIELD\";\n\nexport type ArcaInputErrorOptions = ErrorOptions & {\n code: ArcaInputErrorCode;\n field?: string;\n expected?: string;\n};\n\n/** Thrown when caller-provided input data is missing or invalid. */\nexport class ArcaInputError extends ArcaError {\n declare readonly code: ArcaInputErrorCode;\n override readonly name: string = \"ArcaInputError\";\n readonly field?: string;\n readonly expected?: string;\n\n constructor(message: string, options: ArcaInputErrorOptions) {\n super(message, options.code, options);\n this.field = options.field;\n this.expected = options.expected;\n }\n}\n\n/** Stable reasons exposed for explicit ARCA authentication rejections. */\nexport type ArcaAuthenticationReason =\n | \"invalid_token\"\n | \"unauthorized_computer\"\n | \"missing_relationship\"\n | \"authentication_rejected\";\n\nexport type ArcaAuthenticationErrorOptions = ErrorOptions & {\n reason: ArcaAuthenticationReason;\n service: ArcaServiceName;\n operation: string;\n providerCode?: string | number;\n};\n\n/** Thrown when ARCA explicitly rejects credentials before an operation runs. */\nexport class ArcaAuthenticationError extends ArcaError {\n declare readonly code: \"ARCA_AUTHENTICATION_ERROR\";\n override readonly name: string = \"ArcaAuthenticationError\";\n readonly reason: ArcaAuthenticationReason;\n readonly service: ArcaServiceName;\n readonly operation: string;\n readonly providerCode?: string | number;\n\n constructor(message: string, options: ArcaAuthenticationErrorOptions) {\n super(\n redactDiagnosticPreview(message),\n \"ARCA_AUTHENTICATION_ERROR\",\n options\n );\n this.reason = options.reason;\n this.service = options.service;\n this.operation = options.operation;\n this.providerCode = normalizeProviderCode(options.providerCode);\n }\n}\n\n/** Narrows unknown failures to the explicit authentication error contract. */\nexport function isArcaAuthenticationError(\n error: unknown\n): error is ArcaAuthenticationError {\n return error instanceof ArcaAuthenticationError;\n}\n\n/** Thrown when an HTTP request to an ARCA endpoint fails at the transport level. */\nexport class ArcaTransportError extends ArcaError {\n override readonly name: string = \"ArcaTransportError\";\n readonly statusCode?: number;\n readonly contentType?: string;\n readonly responseBodyLength?: number;\n readonly responseBodyPreview?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n statusCode?: number;\n contentType?: string;\n responseBodyLength?: number;\n responseBodyPreview?: string;\n }\n ) {\n super(message, \"ARCA_TRANSPORT_ERROR\", options);\n this.statusCode = options?.statusCode;\n this.contentType = options?.contentType;\n this.responseBodyLength = options?.responseBodyLength;\n this.responseBodyPreview =\n options?.responseBodyPreview === undefined\n ? undefined\n : redactDiagnosticPreview(options.responseBodyPreview);\n }\n}\n\n/** Thrown when the SOAP response contains a Fault element. */\nexport class ArcaSoapFaultError extends ArcaError {\n override readonly name: string = \"ArcaSoapFaultError\";\n readonly faultCode?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n faultCode?: string;\n }\n ) {\n super(redactDiagnosticPreview(message), \"ARCA_SOAP_FAULT\", options);\n this.faultCode =\n options?.faultCode === undefined\n ? undefined\n : redactDiagnosticPreview(options.faultCode);\n }\n}\n\n/** Thrown when a response cannot be parsed as a valid SOAP envelope. */\nexport class ArcaInvalidSoapResponseError extends ArcaError {\n override readonly name: string = \"ArcaInvalidSoapResponseError\";\n readonly service?: ArcaServiceName;\n readonly operation?: string;\n readonly endpointUrl?: string;\n readonly statusCode?: number;\n readonly contentType?: string;\n readonly responseBodyLength?: number;\n readonly responseBodyPreview?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n service?: ArcaServiceName;\n operation?: string;\n endpointUrl?: string;\n statusCode?: number;\n contentType?: string;\n responseBodyLength?: number;\n responseBodyPreview?: string;\n }\n ) {\n super(message, \"ARCA_INVALID_SOAP_RESPONSE\", options);\n this.service = options?.service;\n this.operation = options?.operation;\n this.endpointUrl = options?.endpointUrl;\n this.statusCode = options?.statusCode;\n this.contentType = options?.contentType;\n this.responseBodyLength = options?.responseBodyLength;\n this.responseBodyPreview =\n options?.responseBodyPreview === undefined\n ? undefined\n : redactDiagnosticPreview(options.responseBodyPreview);\n }\n}\n\n/** Thrown when an ARCA service (WSFE, WSMTXCA, Padron) returns a domain-level error. */\nexport class ArcaServiceError extends ArcaError {\n override readonly name: string = \"ArcaServiceError\";\n readonly serviceCode?: string | number;\n readonly service?: ArcaServiceName;\n readonly operation?: string;\n readonly result?: string;\n readonly resultLevel?: ArcaFiscalResultLevel;\n readonly results?: ArcaFiscalResults;\n readonly cae?: string;\n readonly issues?: readonly ArcaFiscalIssue[];\n\n constructor(\n message: string,\n options?: ErrorOptions & {\n serviceCode?: string | number;\n service?: ArcaServiceName;\n operation?: string;\n result?: string;\n resultLevel?: ArcaFiscalResultLevel;\n results?: ArcaFiscalResults;\n cae?: string;\n issues?: readonly ArcaFiscalIssue[];\n }\n ) {\n super(message, \"ARCA_SERVICE_ERROR\", options);\n this.serviceCode = options?.serviceCode;\n this.service = options?.service;\n this.operation = options?.operation;\n this.result = options?.result;\n this.resultLevel = options?.resultLevel;\n this.results = options?.results;\n this.cae = options?.cae;\n this.issues = options?.issues;\n }\n}\n\nfunction normalizeProviderCode(\n providerCode: string | number | undefined\n): string | number | undefined {\n if (typeof providerCode === \"number\") {\n return Number.isFinite(providerCode) ? providerCode : undefined;\n }\n if (typeof providerCode === \"string\") {\n return redactDiagnosticPreview(providerCode, 512);\n }\n return undefined;\n}\n\n/**\n * Narrow error evidence, safe to log or store: the typed fields the error\n * classes declare, never a cause, stack, raw response, response body preview,\n * endpoint URL, fiscal issues or CAE.\n */\nexport type ArcaSafeErrorMetadata = {\n name: string;\n message: string;\n code?: string;\n statusCode?: number;\n contentType?: string;\n service?: ArcaServiceName;\n operation?: string;\n /** ArcaAuthenticationError's stable reason. */\n reason?: ArcaAuthenticationReason;\n providerCode?: string | number;\n faultCode?: string;\n field?: string;\n expected?: string;\n /** ArcaServiceError's provider code, always as a string. */\n serviceCode?: string;\n result?: string;\n resultLevel?: ArcaFiscalResultLevel;\n};\n\nexport function toArcaSafeErrorMetadata(error: unknown): ArcaSafeErrorMetadata {\n if (!(error instanceof Error)) {\n return { name: \"UnknownError\", message: String(error) };\n }\n const metadata: ArcaSafeErrorMetadata = {\n name: error.name,\n message: error.message,\n };\n if (!(error instanceof ArcaError)) {\n return metadata;\n }\n const fields: Partial<ArcaSafeErrorMetadata> = { code: error.code };\n if (error instanceof ArcaInputError) {\n Object.assign(fields, { field: error.field, expected: error.expected });\n } else if (error instanceof ArcaAuthenticationError) {\n Object.assign(fields, {\n service: error.service,\n operation: error.operation,\n reason: error.reason,\n providerCode: error.providerCode,\n });\n } else if (error instanceof ArcaTransportError) {\n Object.assign(fields, {\n statusCode: error.statusCode,\n contentType: error.contentType,\n });\n } else if (error instanceof ArcaSoapFaultError) {\n Object.assign(fields, { faultCode: error.faultCode });\n } else if (error instanceof ArcaInvalidSoapResponseError) {\n Object.assign(fields, {\n service: error.service,\n operation: error.operation,\n statusCode: error.statusCode,\n contentType: error.contentType,\n });\n } else if (error instanceof ArcaServiceError) {\n Object.assign(fields, {\n service: error.service,\n operation: error.operation,\n serviceCode:\n error.serviceCode === undefined ? undefined : String(error.serviceCode),\n result: error.result,\n resultLevel: error.resultLevel,\n });\n }\n for (const [key, value] of Object.entries(fields)) {\n if (value !== undefined) {\n (metadata as Record<string, unknown>)[key] = value;\n }\n }\n return metadata;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-DHN6OQJP.mjs";
|
|
11
11
|
import {
|
|
12
12
|
createPadronService
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-MRBFLBWX.mjs";
|
|
14
14
|
import {
|
|
15
15
|
arcaMinorUnitsToNumber,
|
|
16
16
|
assertArcaMinorUnits,
|
|
@@ -20,11 +20,12 @@ import {
|
|
|
20
20
|
normalizeWsfeDateInput,
|
|
21
21
|
normalizeWsfeVoucherInput,
|
|
22
22
|
roundHalfEvenRatio,
|
|
23
|
-
serializeArcaExchangeRate
|
|
24
|
-
|
|
23
|
+
serializeArcaExchangeRate,
|
|
24
|
+
toIsoDate
|
|
25
|
+
} from "./chunk-OORNZFI5.mjs";
|
|
25
26
|
import {
|
|
26
27
|
createWsmtxcaService
|
|
27
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-4RD5VQWC.mjs";
|
|
28
29
|
import {
|
|
29
30
|
ArcaConfigurationError,
|
|
30
31
|
ArcaError,
|
|
@@ -36,7 +37,7 @@ import {
|
|
|
36
37
|
createResponseBodyDiagnostic,
|
|
37
38
|
createSafeErrorDiagnostic,
|
|
38
39
|
toArcaSafeErrorMetadata
|
|
39
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-EZ4HA3LC.mjs";
|
|
40
41
|
|
|
41
42
|
// src/config.ts
|
|
42
43
|
var ARCA_ENVIRONMENTS = ["production", "test"];
|
|
@@ -271,21 +272,6 @@ function invalidCredentialFields(normalized) {
|
|
|
271
272
|
return invalidFields;
|
|
272
273
|
}
|
|
273
274
|
|
|
274
|
-
// src/internal/dates.ts
|
|
275
|
-
function toIsoDate(value) {
|
|
276
|
-
if (typeof value !== "string" && typeof value !== "number") {
|
|
277
|
-
return void 0;
|
|
278
|
-
}
|
|
279
|
-
const text = String(value).trim();
|
|
280
|
-
if (/^\d{4}-\d{2}-\d{2}$/.test(text)) {
|
|
281
|
-
return text;
|
|
282
|
-
}
|
|
283
|
-
if (/^\d{8}$/.test(text)) {
|
|
284
|
-
return `${text.slice(0, 4)}-${text.slice(4, 6)}-${text.slice(6, 8)}`;
|
|
285
|
-
}
|
|
286
|
-
return void 0;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
275
|
// src/services/qr.ts
|
|
290
276
|
var ARCA_QR_URL = "https://www.arca.gob.ar/fe/qr/";
|
|
291
277
|
function arcaQrUrl(input) {
|
|
@@ -3549,6 +3535,7 @@ function createVouchersService(wsfe, context, wsmtxca) {
|
|
|
3549
3535
|
return createWsmtxcaIssuanceService(wsmtxca);
|
|
3550
3536
|
};
|
|
3551
3537
|
return {
|
|
3538
|
+
lookup: async (voucher, options) => lookupVoucher(select(options), voucher, options ?? {}),
|
|
3552
3539
|
recover: async (key, options) => recoverOperation(
|
|
3553
3540
|
select,
|
|
3554
3541
|
key,
|
|
@@ -3658,6 +3645,7 @@ function toPreview(prepared, options) {
|
|
|
3658
3645
|
return {
|
|
3659
3646
|
voucherClass,
|
|
3660
3647
|
voucherType: data.voucherType,
|
|
3648
|
+
date: toIsoDate(data.voucherDate) ?? data.voucherDate,
|
|
3661
3649
|
header: fiscalHeader(data),
|
|
3662
3650
|
amounts,
|
|
3663
3651
|
request: options.service === "wsmtxca" ? wsmtxcaRequest(data) : data,
|
|
@@ -4484,6 +4472,54 @@ function validateFceAssociations(note, targets, service) {
|
|
|
4484
4472
|
);
|
|
4485
4473
|
}
|
|
4486
4474
|
}
|
|
4475
|
+
var LOOKUP_BOUNDS = [
|
|
4476
|
+
["salesPoint", 99999],
|
|
4477
|
+
["voucherType", 999],
|
|
4478
|
+
["number", 99999999]
|
|
4479
|
+
];
|
|
4480
|
+
async function lookupVoucher(wsfe, voucher, inputOptions) {
|
|
4481
|
+
const options = cloneOptions(inputOptions);
|
|
4482
|
+
assertIssueKeys(
|
|
4483
|
+
options,
|
|
4484
|
+
["representedTaxId", "service", "forceRefresh", "abortSignal"],
|
|
4485
|
+
"options",
|
|
4486
|
+
"lookup()"
|
|
4487
|
+
);
|
|
4488
|
+
assertIssueObject(voucher, "voucher");
|
|
4489
|
+
assertIssueKeys(
|
|
4490
|
+
voucher,
|
|
4491
|
+
["salesPoint", "voucherType", "number"],
|
|
4492
|
+
"voucher",
|
|
4493
|
+
"lookup()"
|
|
4494
|
+
);
|
|
4495
|
+
for (const [field, max] of LOOKUP_BOUNDS) {
|
|
4496
|
+
const value = voucher[field];
|
|
4497
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > max) {
|
|
4498
|
+
throw new ArcaInputError(
|
|
4499
|
+
`lookup() requires voucher.${field} to be an integer from 1 through ${max}.`,
|
|
4500
|
+
{ code: "ARCA_INPUT_INVALID_VALUE", field: `voucher.${field}` }
|
|
4501
|
+
);
|
|
4502
|
+
}
|
|
4503
|
+
}
|
|
4504
|
+
const found = await wsfe.lookupVoucher({
|
|
4505
|
+
representedTaxId: options.representedTaxId,
|
|
4506
|
+
forceRefresh: options.forceRefresh,
|
|
4507
|
+
...options.abortSignal === void 0 ? {} : { abortSignal: options.abortSignal },
|
|
4508
|
+
salesPoint: voucher.salesPoint,
|
|
4509
|
+
voucherType: voucher.voucherType,
|
|
4510
|
+
number: voucher.number
|
|
4511
|
+
});
|
|
4512
|
+
if (found.kind === "not_found") {
|
|
4513
|
+
return null;
|
|
4514
|
+
}
|
|
4515
|
+
if (found.voucher.salesPoint !== voucher.salesPoint || found.voucher.voucherType !== voucher.voucherType || found.voucher.voucherNumber !== voucher.number) {
|
|
4516
|
+
throw new ArcaServiceError(
|
|
4517
|
+
"ARCA returned a voucher with other coordinates than the one requested",
|
|
4518
|
+
{ service: found.service, operation: found.operation }
|
|
4519
|
+
);
|
|
4520
|
+
}
|
|
4521
|
+
return toVoucherSummary(found.voucher);
|
|
4522
|
+
}
|
|
4487
4523
|
async function lookupOriginal(wsfe, target, options) {
|
|
4488
4524
|
const original = await wsfe.lookupVoucher({
|
|
4489
4525
|
representedTaxId: options.representedTaxId,
|
|
@@ -5040,6 +5076,7 @@ function createArcaClient(config = {}) {
|
|
|
5040
5076
|
issueDebitNote: vouchers.issueDebitNote,
|
|
5041
5077
|
previewCreditNote: vouchers.previewCreditNote,
|
|
5042
5078
|
previewDebitNote: vouchers.previewDebitNote,
|
|
5079
|
+
lookup: vouchers.lookup,
|
|
5043
5080
|
wsfe,
|
|
5044
5081
|
wsmtxca,
|
|
5045
5082
|
padron: createPadronService({ config: normalizedConfig, auth, soap })
|
|
@@ -5329,4 +5366,4 @@ export {
|
|
|
5329
5366
|
withLease,
|
|
5330
5367
|
createFileStore
|
|
5331
5368
|
};
|
|
5332
|
-
//# sourceMappingURL=chunk-
|
|
5369
|
+
//# sourceMappingURL=chunk-JP5IBMVI.mjs.map
|