@albertomarturelo/sii-core 0.3.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/CHANGELOG.md +114 -0
- package/LICENSE +21 -0
- package/README.md +108 -0
- package/dist/adapters/fake/index.d.ts +98 -0
- package/dist/adapters/fake/index.d.ts.map +1 -0
- package/dist/adapters/fake/index.js +131 -0
- package/dist/adapters/fake/index.js.map +1 -0
- package/dist/adapters/node/index.d.ts +22 -0
- package/dist/adapters/node/index.d.ts.map +1 -0
- package/dist/adapters/node/index.js +65 -0
- package/dist/adapters/node/index.js.map +1 -0
- package/dist/adapters/node/portal.d.ts +8 -0
- package/dist/adapters/node/portal.d.ts.map +1 -0
- package/dist/adapters/node/portal.js +222 -0
- package/dist/adapters/node/portal.js.map +1 -0
- package/dist/adapters/node/response.d.ts +21 -0
- package/dist/adapters/node/response.d.ts.map +1 -0
- package/dist/adapters/node/response.js +48 -0
- package/dist/adapters/node/response.js.map +1 -0
- package/dist/audit/audit.d.ts +8 -0
- package/dist/audit/audit.d.ts.map +1 -0
- package/dist/audit/audit.js +15 -0
- package/dist/audit/audit.js.map +1 -0
- package/dist/audit/index.d.ts +2 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +2 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/auth/auth.d.ts +43 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +219 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/login-error.d.ts +8 -0
- package/dist/auth/login-error.d.ts.map +1 -0
- package/dist/auth/login-error.js +18 -0
- package/dist/auth/login-error.js.map +1 -0
- package/dist/auth/session.d.ts +31 -0
- package/dist/auth/session.d.ts.map +1 -0
- package/dist/auth/session.js +52 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/config.d.ts +38 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +40 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/errors/errors.d.ts +56 -0
- package/dist/errors/errors.d.ts.map +1 -0
- package/dist/errors/errors.js +62 -0
- package/dist/errors/errors.js.map +1 -0
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +2 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/format/format.d.ts +5 -0
- package/dist/format/format.d.ts.map +1 -0
- package/dist/format/format.js +14 -0
- package/dist/format/format.js.map +1 -0
- package/dist/format/index.d.ts +2 -0
- package/dist/format/index.d.ts.map +1 -0
- package/dist/format/index.js +2 -0
- package/dist/format/index.js.map +1 -0
- package/dist/identity/identity.d.ts +56 -0
- package/dist/identity/identity.d.ts.map +1 -0
- package/dist/identity/identity.js +93 -0
- package/dist/identity/identity.js.map +1 -0
- package/dist/identity/index.d.ts +2 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +2 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +9 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +22 -0
- package/dist/node.js.map +1 -0
- package/dist/periodo/anio.d.ts +15 -0
- package/dist/periodo/anio.d.ts.map +1 -0
- package/dist/periodo/anio.js +42 -0
- package/dist/periodo/anio.js.map +1 -0
- package/dist/periodo/index.d.ts +3 -0
- package/dist/periodo/index.d.ts.map +1 -0
- package/dist/periodo/index.js +3 -0
- package/dist/periodo/index.js.map +1 -0
- package/dist/periodo/periodo.d.ts +19 -0
- package/dist/periodo/periodo.d.ts.map +1 -0
- package/dist/periodo/periodo.js +55 -0
- package/dist/periodo/periodo.js.map +1 -0
- package/dist/portal/bte-comunas.d.ts +9 -0
- package/dist/portal/bte-comunas.d.ts.map +1 -0
- package/dist/portal/bte-comunas.js +400 -0
- package/dist/portal/bte-comunas.js.map +1 -0
- package/dist/portal/bte-emit.d.ts +70 -0
- package/dist/portal/bte-emit.d.ts.map +1 -0
- package/dist/portal/bte-emit.js +266 -0
- package/dist/portal/bte-emit.js.map +1 -0
- package/dist/portal/bte.d.ts +55 -0
- package/dist/portal/bte.d.ts.map +1 -0
- package/dist/portal/bte.js +215 -0
- package/dist/portal/bte.js.map +1 -0
- package/dist/portal/dte-public.d.ts +36 -0
- package/dist/portal/dte-public.d.ts.map +1 -0
- package/dist/portal/dte-public.js +192 -0
- package/dist/portal/dte-public.js.map +1 -0
- package/dist/portal/f22/declaraciones.d.ts +37 -0
- package/dist/portal/f22/declaraciones.d.ts.map +1 -0
- package/dist/portal/f22/declaraciones.js +86 -0
- package/dist/portal/f22/declaraciones.js.map +1 -0
- package/dist/portal/f22/grid.d.ts +14 -0
- package/dist/portal/f22/grid.d.ts.map +1 -0
- package/dist/portal/f22/grid.js +51 -0
- package/dist/portal/f22/grid.js.map +1 -0
- package/dist/portal/f22/historial.d.ts +34 -0
- package/dist/portal/f22/historial.d.ts.map +1 -0
- package/dist/portal/f22/historial.js +66 -0
- package/dist/portal/f22/historial.js.map +1 -0
- package/dist/portal/f22/index.d.ts +7 -0
- package/dist/portal/f22/index.d.ts.map +1 -0
- package/dist/portal/f22/index.js +11 -0
- package/dist/portal/f22/index.js.map +1 -0
- package/dist/portal/f22/observaciones.d.ts +20 -0
- package/dist/portal/f22/observaciones.d.ts.map +1 -0
- package/dist/portal/f22/observaciones.js +38 -0
- package/dist/portal/f22/observaciones.js.map +1 -0
- package/dist/portal/f22/shared.d.ts +32 -0
- package/dist/portal/f22/shared.d.ts.map +1 -0
- package/dist/portal/f22/shared.js +130 -0
- package/dist/portal/f22/shared.js.map +1 -0
- package/dist/portal/f22-codigos.d.ts +28 -0
- package/dist/portal/f22-codigos.d.ts.map +1 -0
- package/dist/portal/f22-codigos.js +141 -0
- package/dist/portal/f22-codigos.js.map +1 -0
- package/dist/portal/f29-codigos.d.ts +15 -0
- package/dist/portal/f29-codigos.d.ts.map +1 -0
- package/dist/portal/f29-codigos.js +552 -0
- package/dist/portal/f29-codigos.js.map +1 -0
- package/dist/portal/f29.d.ts +62 -0
- package/dist/portal/f29.d.ts.map +1 -0
- package/dist/portal/f29.js +244 -0
- package/dist/portal/f29.js.map +1 -0
- package/dist/portal/rcv.d.ts +62 -0
- package/dist/portal/rcv.d.ts.map +1 -0
- package/dist/portal/rcv.js +252 -0
- package/dist/portal/rcv.js.map +1 -0
- package/dist/portal/representacion.d.ts +24 -0
- package/dist/portal/representacion.d.ts.map +1 -0
- package/dist/portal/representacion.js +153 -0
- package/dist/portal/representacion.js.map +1 -0
- package/dist/rut/index.d.ts +2 -0
- package/dist/rut/index.d.ts.map +1 -0
- package/dist/rut/index.js +2 -0
- package/dist/rut/index.js.map +1 -0
- package/dist/rut/rut.d.ts +16 -0
- package/dist/rut/rut.d.ts.map +1 -0
- package/dist/rut/rut.js +70 -0
- package/dist/rut/rut.js.map +1 -0
- package/dist/seams/index.d.ts +126 -0
- package/dist/seams/index.d.ts.map +1 -0
- package/dist/seams/index.js +6 -0
- package/dist/seams/index.js.map +1 -0
- package/dist/tasks/auth.d.ts +16 -0
- package/dist/tasks/auth.d.ts.map +1 -0
- package/dist/tasks/auth.js +22 -0
- package/dist/tasks/auth.js.map +1 -0
- package/dist/tasks/bte.d.ts +52 -0
- package/dist/tasks/bte.d.ts.map +1 -0
- package/dist/tasks/bte.js +169 -0
- package/dist/tasks/bte.js.map +1 -0
- package/dist/tasks/dte.d.ts +9 -0
- package/dist/tasks/dte.d.ts.map +1 -0
- package/dist/tasks/dte.js +30 -0
- package/dist/tasks/dte.js.map +1 -0
- package/dist/tasks/f22.d.ts +69 -0
- package/dist/tasks/f22.d.ts.map +1 -0
- package/dist/tasks/f22.js +189 -0
- package/dist/tasks/f22.js.map +1 -0
- package/dist/tasks/f29.d.ts +67 -0
- package/dist/tasks/f29.d.ts.map +1 -0
- package/dist/tasks/f29.js +213 -0
- package/dist/tasks/f29.js.map +1 -0
- package/dist/tasks/operate.d.ts +22 -0
- package/dist/tasks/operate.d.ts.map +1 -0
- package/dist/tasks/operate.js +34 -0
- package/dist/tasks/operate.js.map +1 -0
- package/dist/tasks/rcv.d.ts +17 -0
- package/dist/tasks/rcv.d.ts.map +1 -0
- package/dist/tasks/rcv.js +76 -0
- package/dist/tasks/rcv.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// F29 — Declaración Mensual de IVA (read-only). Typed facade over `PortalSession.requestJson`.
|
|
2
|
+
// Ported from the proven Python sii-cli (portal/f29.py + docs/sii-contract/f29.md); the wire
|
|
3
|
+
// contract is first-hand-observed there (live capture 2026-06-12, prod), NOT a third-party
|
|
4
|
+
// library (ADR-004). Full contract: docs/sii-contract/f29.md.
|
|
5
|
+
//
|
|
6
|
+
// The F29 portal is the Angular SPA at `https://www4.sii.cl/propuestaf29ui/` — its own app
|
|
7
|
+
// (own Referer), same SDI envelope family as RCV/F22. Two read facades:
|
|
8
|
+
// 1. getDeclaracionConCondicionesYTipoPropuesta — SII's pre-filled F29 PROPUESTA (borrador)
|
|
9
|
+
// for a (RUT, período): data:{tipopropuesta, estado, listCodPropuestos[], listCodAdministrativos[], …}.
|
|
10
|
+
// 2. getDeclaracionConEstados — the PRESENTED F29 records: data:[{estadoDeclaracionId, estado,
|
|
11
|
+
// folio, declFechaCreacion, …}] (empty [] = nothing filed for the período).
|
|
12
|
+
//
|
|
13
|
+
// SESSION-KEYED (ADR-005): F29 authorizes by the session principal — confirmed live (Python,
|
|
14
|
+
// 2026-06-26) that setting the body RUT to a represented empresa returns
|
|
15
|
+
// `Consulta RUT[…] no esta autorizado`. The task therefore reads ONLY self and rejects a
|
|
16
|
+
// representing operate pointer up front (tasks/f29.ts); the empresa's F29 needs the empresa's
|
|
17
|
+
// own session (logout→login). The facade itself just posts the RUT it is handed.
|
|
18
|
+
//
|
|
19
|
+
// PII: the propuesta response carries identity PII in a SEPARATE array (`listCodBase`:
|
|
20
|
+
// nombre/RUT/dirección/comuna) and the PP29 calc `traza` EMBEDS the RUT — those are DROPPED
|
|
21
|
+
// (never read). F29 curates ONLY the tax códigos (listCodPropuestos + listCodAdministrativos)
|
|
22
|
+
// and the estado metadata, and exposes NO `raw` (like F22), so identity PII never reaches a
|
|
23
|
+
// surface/LLM. The tax códigos live in their own arrays, cleanly segregated from `listCodBase`,
|
|
24
|
+
// so (unlike F22) no per-código denylist is needed. The estado `monto` (the declaración's total
|
|
25
|
+
// a pagar) IS surfaced as `total` — it is the user's own monthly figure and the point of the
|
|
26
|
+
// overview; it never reaches the audit log (which records only action/result/period). Error
|
|
27
|
+
// channel is `metaData.errors` (a list of {id, descripcion}) — like F22, NOT RCV's `respEstado`.
|
|
28
|
+
import { z } from 'zod';
|
|
29
|
+
import { HOSTS } from '../config/index.js';
|
|
30
|
+
import { F29Error, NotAuthenticatedError } from '../errors/index.js';
|
|
31
|
+
const F29_BASE = `${HOSTS.portalApi}/propuestaf29ui/services/data/facadeAdapterService`;
|
|
32
|
+
const PROPUESTA_URL = `${F29_BASE}/getDeclaracionConCondicionesYTipoPropuesta`;
|
|
33
|
+
const ESTADO_URL = `${F29_BASE}/getDeclaracionConEstados`;
|
|
34
|
+
const PROPUESTA_NAMESPACE = 'cl.sii.sdi.lob.iva.propuestaf29.data.api.interfaces.FacadeAdapterService/getDeclaracionConCondicionesYTipoPropuesta';
|
|
35
|
+
const ESTADO_NAMESPACE = 'cl.sii.sdi.lob.iva.propuestaf29.data.api.interfaces.FacadeAdapterService/getDeclaracionConEstados';
|
|
36
|
+
// Internal F29 form id (the form número is 29; SII's internal id is "2"). The propuesta sends it
|
|
37
|
+
// as `formCodigo`, the estado as `formId` — SII's own naming inconsistency, observed (f29.md).
|
|
38
|
+
const FORM_CODIGO = '2';
|
|
39
|
+
const CONVERSATION_COOKIE = 'TOKEN';
|
|
40
|
+
// Per-surface headers — Referer is the F29 propuesta SPA root (differs from RCV/F22).
|
|
41
|
+
const HEADERS = {
|
|
42
|
+
'Content-Type': 'application/json',
|
|
43
|
+
Origin: HOSTS.portalApi,
|
|
44
|
+
Referer: `${HOSTS.portalApi}/propuestaf29ui/`,
|
|
45
|
+
Accept: 'application/json, text/plain, */*',
|
|
46
|
+
};
|
|
47
|
+
// --- Wire envelope (zod-at-the-boundary, ADR-011) --------------------------------
|
|
48
|
+
// F29's error channel is `metaData.errors` (like F22, NOT RCV's respEstado). Keep `errors` and
|
|
49
|
+
// `data` opaque (propuesta `data` is an object, estado `data` is an array) and extract below.
|
|
50
|
+
const Envelope = z
|
|
51
|
+
.object({
|
|
52
|
+
metaData: z.object({ errors: z.unknown().nullish() }).loose().nullish(),
|
|
53
|
+
data: z.unknown(),
|
|
54
|
+
})
|
|
55
|
+
.loose();
|
|
56
|
+
// Alias-tolerant lookups (observed name first; extend with a citation when SII serves a new key).
|
|
57
|
+
const CODIGO_ALIASES = {
|
|
58
|
+
codigo: ['codigo', 'cod'],
|
|
59
|
+
valor: ['valor', 'monto'],
|
|
60
|
+
};
|
|
61
|
+
const ESTADO_ALIASES = {
|
|
62
|
+
estadoId: ['estadoDeclaracionId', 'estadoId'],
|
|
63
|
+
estado: ['estado', 'glosaEstado', 'descripcionEstado'],
|
|
64
|
+
folio: ['folio', 'folioDeclaracion'],
|
|
65
|
+
fecha: ['declFechaCreacion', 'fechaCreacion', 'fecha'],
|
|
66
|
+
total: ['monto', 'total', 'montoTotal'],
|
|
67
|
+
enNegocio: ['enNegocio'],
|
|
68
|
+
codigo: ['codigo', 'cod'],
|
|
69
|
+
};
|
|
70
|
+
const aliasGet = (row, aliases) => {
|
|
71
|
+
for (const key of aliases) {
|
|
72
|
+
const v = row[key];
|
|
73
|
+
if (v !== undefined && v !== null)
|
|
74
|
+
return v;
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
};
|
|
78
|
+
const asStr = (v) => (v === null || v === undefined ? null : String(v));
|
|
79
|
+
const isObj = (v) => typeof v === 'object' && v !== null;
|
|
80
|
+
/** Parse an F29 `valor`. SII's propuesta serves numbers WITHOUT thousands separators and with a
|
|
81
|
+
* `.` decimal point (e.g. monto `"2709150"` → 2709150; PPM tasa código 115 `"0.125"` → 0.125),
|
|
82
|
+
* so a plain `Number()` is correct here — unlike F22, whose grid is es-CL-formatted. Floats are
|
|
83
|
+
* preserved (an int-only coercion would silently drop a rate like 0.125 to null). */
|
|
84
|
+
const asNumber = (v) => {
|
|
85
|
+
if (v === null || v === undefined || v === '')
|
|
86
|
+
return null;
|
|
87
|
+
if (typeof v === 'number')
|
|
88
|
+
return Number.isFinite(v) ? v : null;
|
|
89
|
+
const n = Number(String(v).trim());
|
|
90
|
+
return Number.isFinite(n) ? n : null;
|
|
91
|
+
};
|
|
92
|
+
/** `enNegocio` arrives as a bool or "S"/"N"/1/0 (exact form unconfirmed). Tolerant. */
|
|
93
|
+
function coerceBool(v) {
|
|
94
|
+
if (v === null || v === undefined)
|
|
95
|
+
return null;
|
|
96
|
+
if (typeof v === 'boolean')
|
|
97
|
+
return v;
|
|
98
|
+
const s = String(v).trim().toUpperCase();
|
|
99
|
+
if (['S', 'SI', 'TRUE', '1'].includes(s))
|
|
100
|
+
return true;
|
|
101
|
+
if (['N', 'NO', 'FALSE', '0'].includes(s))
|
|
102
|
+
return false;
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
/** `metaData.errors`: a list/dict of `{descripcion}`, or a string. Non-empty ⇒ SII signaled a
|
|
106
|
+
* business error → its `descripcion` verbatim (ADR-004), else null. (Mirrors F22's channel.) */
|
|
107
|
+
function f29Error(errors) {
|
|
108
|
+
if (errors === null || errors === undefined)
|
|
109
|
+
return null;
|
|
110
|
+
if (Array.isArray(errors)) {
|
|
111
|
+
const descs = errors
|
|
112
|
+
.map((e) => (isObj(e) ? asStr(e['descripcion']) : null))
|
|
113
|
+
.filter((d) => d !== null);
|
|
114
|
+
return descs.length ? descs.join('; ') : null;
|
|
115
|
+
}
|
|
116
|
+
if (isObj(errors))
|
|
117
|
+
return asStr(errors['descripcion']);
|
|
118
|
+
const s = asStr(errors);
|
|
119
|
+
return s && s !== '' ? s : null;
|
|
120
|
+
}
|
|
121
|
+
/** Split a `Periodo` into the `{mes, anno}` pair the F29 facades expect (both strings; `mes`
|
|
122
|
+
* zero-padded). The combined `YYYYMM` form is NOT used by these endpoints (observed). */
|
|
123
|
+
const mesAnno = (periodo) => ({
|
|
124
|
+
mes: String(periodo.month).padStart(2, '0'),
|
|
125
|
+
anno: String(periodo.year),
|
|
126
|
+
});
|
|
127
|
+
async function postSdi(session, url, namespace, data) {
|
|
128
|
+
const conversationId = (await session.cookie(`${HOSTS.portalApi}/`, CONVERSATION_COOKIE)) ?? '';
|
|
129
|
+
const request = {
|
|
130
|
+
method: 'POST',
|
|
131
|
+
headers: HEADERS,
|
|
132
|
+
body: {
|
|
133
|
+
metaData: { namespace, conversationId, transactionId: globalThis.crypto.randomUUID() },
|
|
134
|
+
data,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
let raw;
|
|
138
|
+
try {
|
|
139
|
+
raw = await session.requestJson(url, request);
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
// An expired/dead session (the seam raises it) is actionable — let it through so the user is
|
|
143
|
+
// told to re-login, not a misleading "no es JSON".
|
|
144
|
+
if (e instanceof NotAuthenticatedError)
|
|
145
|
+
throw e;
|
|
146
|
+
throw new F29Error('Respuesta inesperada de SII (no es JSON).');
|
|
147
|
+
}
|
|
148
|
+
const parsed = Envelope.safeParse(raw);
|
|
149
|
+
if (!parsed.success)
|
|
150
|
+
throw new F29Error('Respuesta inesperada de SII (no es un objeto JSON del F29).');
|
|
151
|
+
const err = f29Error(parsed.data.metaData?.errors);
|
|
152
|
+
if (err)
|
|
153
|
+
throw new F29Error(err);
|
|
154
|
+
return parsed.data;
|
|
155
|
+
}
|
|
156
|
+
/** Project a código array (`[{codigo, valor}]`) into curated rows, dropping entries without a
|
|
157
|
+
* código. Used for BOTH listCodPropuestos and listCodAdministrativos (same row shape). */
|
|
158
|
+
function parseCodigos(arr) {
|
|
159
|
+
if (!Array.isArray(arr))
|
|
160
|
+
return [];
|
|
161
|
+
const out = [];
|
|
162
|
+
for (const r of arr) {
|
|
163
|
+
if (!isObj(r))
|
|
164
|
+
continue;
|
|
165
|
+
const codigo = asStr(aliasGet(r, CODIGO_ALIASES.codigo));
|
|
166
|
+
if (codigo === null)
|
|
167
|
+
continue;
|
|
168
|
+
out.push({ codigo, valor: asNumber(aliasGet(r, CODIGO_ALIASES.valor)) });
|
|
169
|
+
}
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
172
|
+
/** getDeclaracionConCondicionesYTipoPropuesta — the IVA propuesta (pre-filled F29 draft). A
|
|
173
|
+
* `data:null` envelope (no errors) is a legitimate "sin propuesta", NOT an error. Curates the
|
|
174
|
+
* tax códigos only; identity PII (`listCodBase`) and the PP29 `traza` are never read. */
|
|
175
|
+
export async function fetchF29Propuesta(session, params) {
|
|
176
|
+
const { rut, periodo } = params;
|
|
177
|
+
const env = await postSdi(session, PROPUESTA_URL, PROPUESTA_NAMESPACE, {
|
|
178
|
+
rutContribuyente: String(rut.body),
|
|
179
|
+
dv: rut.dv,
|
|
180
|
+
formCodigo: FORM_CODIGO,
|
|
181
|
+
...mesAnno(periodo),
|
|
182
|
+
});
|
|
183
|
+
const base = {
|
|
184
|
+
rut: rut.canonical,
|
|
185
|
+
periodo: periodo.formatted,
|
|
186
|
+
};
|
|
187
|
+
const data = env.data;
|
|
188
|
+
if (!isObj(data)) {
|
|
189
|
+
// data:null ⇒ no propuesta for the período (clean negative).
|
|
190
|
+
return {
|
|
191
|
+
...base,
|
|
192
|
+
tienePropuesta: false,
|
|
193
|
+
tipoPropuesta: null,
|
|
194
|
+
estado: null,
|
|
195
|
+
descripcionEstado: null,
|
|
196
|
+
codigos: [],
|
|
197
|
+
codigosAdministrativos: [],
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const codigos = parseCodigos(data['listCodPropuestos']);
|
|
201
|
+
return {
|
|
202
|
+
...base,
|
|
203
|
+
// `data` can be a non-null object with NO meaningful proposal (empty list, or all-zero
|
|
204
|
+
// placeholder códigos) for a período SII has nothing for. Treat that as "sin propuesta"
|
|
205
|
+
// (observed: such months render empty groups) — `tienePropuesta` is true only when there is
|
|
206
|
+
// at least one proposed código with a non-zero value.
|
|
207
|
+
tienePropuesta: codigos.some((c) => c.valor !== null && c.valor !== 0),
|
|
208
|
+
tipoPropuesta: asNumber(data['tipopropuesta']),
|
|
209
|
+
estado: asNumber(data['estado']),
|
|
210
|
+
descripcionEstado: asStr(data['descripcionEstado']),
|
|
211
|
+
codigos,
|
|
212
|
+
codigosAdministrativos: parseCodigos(data['listCodAdministrativos']),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/** getDeclaracionConEstados — the presented/saved F29 records for the período. Empty `data:[]`
|
|
216
|
+
* is a legitimate "nada presentado", NOT an error. The estado uses `formId`/`rut` (vs the
|
|
217
|
+
* propuesta's `formCodigo`/`rutContribuyente`) — SII's own naming inconsistency (observed).
|
|
218
|
+
* `monto` is intentionally dropped (financial PII). */
|
|
219
|
+
export async function fetchF29Estado(session, params) {
|
|
220
|
+
const { rut, periodo } = params;
|
|
221
|
+
const env = await postSdi(session, ESTADO_URL, ESTADO_NAMESPACE, {
|
|
222
|
+
rut: String(rut.body),
|
|
223
|
+
dv: rut.dv,
|
|
224
|
+
formId: FORM_CODIGO,
|
|
225
|
+
...mesAnno(periodo),
|
|
226
|
+
});
|
|
227
|
+
const rows = Array.isArray(env.data) ? env.data : [];
|
|
228
|
+
const declaraciones = rows.filter(isObj).map((r) => ({
|
|
229
|
+
estadoId: asNumber(aliasGet(r, ESTADO_ALIASES.estadoId)),
|
|
230
|
+
estado: asStr(aliasGet(r, ESTADO_ALIASES.estado)),
|
|
231
|
+
folio: asNumber(aliasGet(r, ESTADO_ALIASES.folio)),
|
|
232
|
+
fecha: asStr(aliasGet(r, ESTADO_ALIASES.fecha)),
|
|
233
|
+
total: asNumber(aliasGet(r, ESTADO_ALIASES.total)),
|
|
234
|
+
enNegocio: coerceBool(aliasGet(r, ESTADO_ALIASES.enNegocio)),
|
|
235
|
+
codigo: asNumber(aliasGet(r, ESTADO_ALIASES.codigo)),
|
|
236
|
+
}));
|
|
237
|
+
return {
|
|
238
|
+
rut: rut.canonical,
|
|
239
|
+
periodo: periodo.formatted,
|
|
240
|
+
tieneDeclaracion: declaraciones.length > 0,
|
|
241
|
+
declaraciones,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=f29.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"f29.js","sourceRoot":"","sources":["../../src/portal/f29.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Rut } from '../rut/index.js';
|
|
2
|
+
import type { Periodo } from '../periodo/index.js';
|
|
3
|
+
import type { PortalSession } from '../seams/index.js';
|
|
4
|
+
export type RcvSide = 'COMPRA' | 'VENTA';
|
|
5
|
+
export interface RcvResumenRow {
|
|
6
|
+
/** SII DTE type code (e.g. "33" factura, "34" exenta, "39" boleta). */
|
|
7
|
+
readonly codigoTipoDoc: string | null;
|
|
8
|
+
readonly descripcion: string | null;
|
|
9
|
+
readonly totalDocumentos: number | null;
|
|
10
|
+
readonly montoExento: number | null;
|
|
11
|
+
readonly montoNeto: number | null;
|
|
12
|
+
readonly montoIva: number | null;
|
|
13
|
+
readonly montoTotal: number | null;
|
|
14
|
+
}
|
|
15
|
+
export interface RcvResumen {
|
|
16
|
+
/** Operating RUT these aggregates belong to (canonical). */
|
|
17
|
+
readonly rut: string;
|
|
18
|
+
readonly periodo: string;
|
|
19
|
+
readonly side: RcvSide;
|
|
20
|
+
readonly rows: readonly RcvResumenRow[];
|
|
21
|
+
/** Envelope-level `totDocRes` (total document count), or null. */
|
|
22
|
+
readonly totalDocumentos: number | null;
|
|
23
|
+
}
|
|
24
|
+
/** Curated subset of the ~50-field detalle row. Tax-special fields (activo fijo,
|
|
25
|
+
* IVA uso común, Ley 18211, etc.) live in `raw` (ADR-004 curated+raw). */
|
|
26
|
+
export interface RcvDetalleDoc {
|
|
27
|
+
readonly folio: number | null;
|
|
28
|
+
readonly rutEmisor: string | null;
|
|
29
|
+
readonly razonSocial: string | null;
|
|
30
|
+
readonly fechaEmision: string | null;
|
|
31
|
+
readonly fechaRecepcion: string | null;
|
|
32
|
+
readonly montoExento: number | null;
|
|
33
|
+
readonly montoNeto: number | null;
|
|
34
|
+
readonly montoIva: number | null;
|
|
35
|
+
readonly montoTotal: number | null;
|
|
36
|
+
readonly eventoReceptor: string | null;
|
|
37
|
+
readonly eventoReceptorLeyenda: string | null;
|
|
38
|
+
readonly raw: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
export interface RcvDetalle {
|
|
41
|
+
readonly rut: string;
|
|
42
|
+
readonly periodo: string;
|
|
43
|
+
readonly side: RcvSide;
|
|
44
|
+
readonly codigoTipoDoc: string;
|
|
45
|
+
readonly docs: readonly RcvDetalleDoc[];
|
|
46
|
+
}
|
|
47
|
+
/** getResumen: per-DTE-type aggregates for one (RUT, period, side). `session` must be
|
|
48
|
+
* an already-logged-in PortalSession (acquired via `withSession`). */
|
|
49
|
+
export declare function fetchRcvResumen(session: PortalSession, params: {
|
|
50
|
+
rut: Rut;
|
|
51
|
+
periodo: Periodo;
|
|
52
|
+
side: RcvSide;
|
|
53
|
+
}): Promise<RcvResumen>;
|
|
54
|
+
/** getDetalle{Compra,Venta}: individual DTE rows for one (RUT, period, side, DTE type).
|
|
55
|
+
* `codigoTipoDoc` comes from a prior `fetchRcvResumen` for the same period. */
|
|
56
|
+
export declare function fetchRcvDetalle(session: PortalSession, params: {
|
|
57
|
+
rut: Rut;
|
|
58
|
+
periodo: Periodo;
|
|
59
|
+
side: RcvSide;
|
|
60
|
+
codigoTipoDoc: string;
|
|
61
|
+
}): Promise<RcvDetalle>;
|
|
62
|
+
//# sourceMappingURL=rcv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rcv.d.ts","sourceRoot":"","sources":["../../src/portal/rcv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// RCV — Registro de Compras y Ventas. Typed facade over `PortalSession.requestJson`.
|
|
2
|
+
// Ported from the proven Python sii-cli (portal/rcv.py); the wire contract is
|
|
3
|
+
// first-hand-observed there, NOT a third-party library (ADR-004).
|
|
4
|
+
//
|
|
5
|
+
// The RCV portal is an Angular SPA at `https://www4.sii.cl/consdcvinternetui/`
|
|
6
|
+
// fronting a JSON-over-HTTP SDI API. Endpoints in play here:
|
|
7
|
+
// - getResumen — per-DTE-type aggregates (counts + montos). No captcha.
|
|
8
|
+
// - getDetalleCompra / getDetalleVenta — individual DTE rows.
|
|
9
|
+
// Endpoints/namespaces cited from cURL captured 2026-06-07 (issue #7 spike report)
|
|
10
|
+
// + Angular bundle inspection 2026-06-07 (`app.full.min.js?2026428195.js`).
|
|
11
|
+
//
|
|
12
|
+
// SESSION reaches any RUT the account legally represents via the body's
|
|
13
|
+
// `rutEmisor`/`dvEmisor` — RCV is BODY-RUT (ADR-005), so `operate`/`--rut` selects it.
|
|
14
|
+
//
|
|
15
|
+
// Wire parsing is zod-at-the-boundary (ADR-011) for the envelope (error detection +
|
|
16
|
+
// the `data[]` array), then ALIAS-TOLERANT per-row projection into a curated shape
|
|
17
|
+
// (observed name first; extend with a citation when a new alias appears) + `raw`
|
|
18
|
+
// carrying the full row for tax-special fields (ADR-004 curated+raw).
|
|
19
|
+
import { z } from 'zod';
|
|
20
|
+
import { HOSTS } from '../config/index.js';
|
|
21
|
+
import { NotAuthenticatedError, RcvError } from '../errors/index.js';
|
|
22
|
+
import { Rut } from '../rut/index.js';
|
|
23
|
+
const RESUMEN_URL = `${HOSTS.portalApi}/consdcvinternetui/services/data/facadeService/getResumen`;
|
|
24
|
+
const RESUMEN_NAMESPACE = 'cl.sii.sdi.lob.diii.consdcv.data.api.interfaces.FacadeService/getResumen';
|
|
25
|
+
const DETALLE_URL = {
|
|
26
|
+
COMPRA: `${HOSTS.portalApi}/consdcvinternetui/services/data/facadeService/getDetalleCompra`,
|
|
27
|
+
VENTA: `${HOSTS.portalApi}/consdcvinternetui/services/data/facadeService/getDetalleVenta`,
|
|
28
|
+
};
|
|
29
|
+
const DETALLE_NAMESPACE = {
|
|
30
|
+
COMPRA: 'cl.sii.sdi.lob.diii.consdcv.data.api.interfaces.FacadeService/getDetalleCompra',
|
|
31
|
+
VENTA: 'cl.sii.sdi.lob.diii.consdcv.data.api.interfaces.FacadeService/getDetalleVenta',
|
|
32
|
+
};
|
|
33
|
+
// The SPA's `recaptchaService.pedirToken` (bundle inspection 2026-06-07) is a no-op
|
|
34
|
+
// that returns this literal sentinel; the bundle never loads Google's reCAPTCHA SDK.
|
|
35
|
+
// Smoke-test before relying on it in case SII tightens the contract.
|
|
36
|
+
const RECAPTCHA_TOKEN = 't-o-k-e-n-web';
|
|
37
|
+
// Per-side action map (bundle `Constantes`: ACCION_DETALLE_CMPR/VTA).
|
|
38
|
+
const RECAPTCHA_ACTION = { COMPRA: 'RCV_DETC', VENTA: 'RCV_DETV' };
|
|
39
|
+
// The SPA conversation token; seeds metaData.conversationId (empty value accepted).
|
|
40
|
+
const CONVERSATION_COOKIE = 'TOKEN';
|
|
41
|
+
// Same headers as the sibling representación facade (observed): Origin = SPA host,
|
|
42
|
+
// Referer = SPA root.
|
|
43
|
+
const HEADERS = {
|
|
44
|
+
'Content-Type': 'application/json',
|
|
45
|
+
Origin: HOSTS.portalApi,
|
|
46
|
+
Referer: `${HOSTS.portalApi}/consdcvinternetui/`,
|
|
47
|
+
Accept: 'application/json, text/plain, */*',
|
|
48
|
+
};
|
|
49
|
+
// --- Wire envelope (zod-at-the-boundary, ADR-011) --------------------------------
|
|
50
|
+
// Validate the SDI envelope: the shared `respEstado` error block + the `data[]` rows.
|
|
51
|
+
// `.loose()` keeps unobserved fields so curated projection + `raw` see the full row.
|
|
52
|
+
const Row = z.record(z.string(), z.unknown());
|
|
53
|
+
const Envelope = z
|
|
54
|
+
.object({
|
|
55
|
+
respEstado: z
|
|
56
|
+
.object({
|
|
57
|
+
codRespuesta: z.union([z.number(), z.string()]).nullish(),
|
|
58
|
+
msgeRespuesta: z.string().nullish(),
|
|
59
|
+
codError: z.string().nullish(),
|
|
60
|
+
})
|
|
61
|
+
.loose()
|
|
62
|
+
.nullish(),
|
|
63
|
+
data: z.array(Row).nullish(),
|
|
64
|
+
datos: z.array(Row).nullish(),
|
|
65
|
+
totDocRes: z.union([z.number(), z.string()]).nullish(),
|
|
66
|
+
})
|
|
67
|
+
.loose();
|
|
68
|
+
// --- Alias-tolerant field lookup (observed name first; cite new aliases) ---------
|
|
69
|
+
// Resumen: SII uses `rsmn*` (resumen) + `dcv*` (type metadata) prefixes — observed
|
|
70
|
+
// issue #9 smoke 2026-06-07 (empresa VENTA 2026-05).
|
|
71
|
+
const RESUMEN_ALIASES = {
|
|
72
|
+
codigoTipoDoc: ['rsmnTipoDocInteger', 'codTipoDoc', 'codigoTipoDoc', 'tipoDoc'],
|
|
73
|
+
descripcion: ['dcvNombreTipoDoc', 'descTipoDoc', 'glosaTipoDoc', 'descripcion'],
|
|
74
|
+
totalDocumentos: ['rsmnTotDoc', 'totDoctos', 'totalDoctos', 'totalDocumentos'],
|
|
75
|
+
montoExento: ['rsmnMntExe', 'mntExento', 'montoExento'],
|
|
76
|
+
montoNeto: ['rsmnMntNeto', 'mntNeto', 'montoNeto'],
|
|
77
|
+
montoIva: ['rsmnMntIVA', 'mntIVA', 'montoIVA', 'mntIva'],
|
|
78
|
+
montoTotal: ['rsmnMntTotal', 'mntTotal', 'montoTotal'],
|
|
79
|
+
};
|
|
80
|
+
// Detalle: SII uses the `det*` prefix — observed issue #12 capture 2026-06-07
|
|
81
|
+
// (empresa COMPRA 2026-06 codTipoDoc 34).
|
|
82
|
+
const DETALLE_ALIASES = {
|
|
83
|
+
folio: ['detNroDoc', 'nroDoc', 'folio'],
|
|
84
|
+
rutDigits: ['detRutDoc', 'rutDoc', 'rutEmisor'],
|
|
85
|
+
dv: ['detDvDoc', 'dvDoc', 'dvEmisor'],
|
|
86
|
+
razonSocial: ['detRznSoc', 'rznSoc', 'razonSocial'],
|
|
87
|
+
fechaEmision: ['detFchDoc', 'fchDoc', 'fechaEmision'],
|
|
88
|
+
fechaRecepcion: ['detFecRecepcion', 'fecRecepcion', 'fechaRecepcion'],
|
|
89
|
+
montoExento: ['detMntExe', 'mntExe', 'montoExento'],
|
|
90
|
+
montoNeto: ['detMntNeto', 'mntNeto', 'montoNeto'],
|
|
91
|
+
montoIva: ['detMntIVA', 'mntIVA', 'montoIVA'],
|
|
92
|
+
montoTotal: ['detMntTotal', 'mntTotal', 'montoTotal'],
|
|
93
|
+
eventoReceptor: ['detEventoReceptor', 'eventoReceptor'],
|
|
94
|
+
eventoReceptorLeyenda: ['detEventoReceptorLeyenda', 'eventoReceptorLeyenda'],
|
|
95
|
+
};
|
|
96
|
+
const aliasGet = (row, aliases) => {
|
|
97
|
+
for (const key of aliases) {
|
|
98
|
+
const v = row[key];
|
|
99
|
+
if (v !== undefined && v !== null)
|
|
100
|
+
return v;
|
|
101
|
+
}
|
|
102
|
+
return undefined;
|
|
103
|
+
};
|
|
104
|
+
const asStr = (v) => (v === null || v === undefined ? null : String(v));
|
|
105
|
+
const asInt = (v) => {
|
|
106
|
+
if (v === null || v === undefined || v === '')
|
|
107
|
+
return null;
|
|
108
|
+
const n = Number(v);
|
|
109
|
+
return Number.isFinite(n) ? Math.trunc(n) : null;
|
|
110
|
+
};
|
|
111
|
+
// RCV `respEstado.codRespuesta` semantics, observed live 2026-06-28:
|
|
112
|
+
// 0 = OK; 3 = consulta VÁLIDA pero SIN MOVIMIENTOS for that (RUT, período, lado) —
|
|
113
|
+
// `data` comes empty, message comes null (NOT an error). Any OTHER non-zero code is
|
|
114
|
+
// a real rejection. (Confirmed: a persona's self VENTA and a represented empresa's
|
|
115
|
+
// COMPRA both returned code 3 with no rows, while the empresa's VENTA returned 0 + a
|
|
116
|
+
// row — so code 3 is "empty", not "denied", and `--rut` DOES reach the empresa.)
|
|
117
|
+
const RCV_OK = new Set([0, '0', 3, '3']);
|
|
118
|
+
/** SDI error envelope. Returns SII's message verbatim (ADR-004) for a real rejection,
|
|
119
|
+
* else null (OK or the "sin movimientos" code 3 → handled as an empty result). */
|
|
120
|
+
function siiRejected(resp) {
|
|
121
|
+
if (!resp)
|
|
122
|
+
return null;
|
|
123
|
+
const code = resp.codRespuesta;
|
|
124
|
+
if (code === undefined || code === null || RCV_OK.has(code))
|
|
125
|
+
return null;
|
|
126
|
+
return asStr(resp.msgeRespuesta ?? resp.codError) ?? 'SII rechazó la consulta del RCV.';
|
|
127
|
+
}
|
|
128
|
+
/** Normalise SII's `DD/MM/YYYY[ HH:MM:SS]` to ISO; unrecognised input is returned
|
|
129
|
+
* unchanged so the raw value still surfaces. */
|
|
130
|
+
function normalizeDmy(value) {
|
|
131
|
+
if (value === null || value === undefined)
|
|
132
|
+
return null;
|
|
133
|
+
const s = String(value).trim();
|
|
134
|
+
if (!s)
|
|
135
|
+
return null;
|
|
136
|
+
const [datePart, timePart] = s.split(' ', 2);
|
|
137
|
+
const parts = (datePart ?? '').split('/');
|
|
138
|
+
if (parts.length !== 3 || !parts.every((p) => /^\d+$/.test(p)))
|
|
139
|
+
return s;
|
|
140
|
+
const [dd, mm, yyyy] = parts;
|
|
141
|
+
const iso = `${yyyy.padStart(4, '0')}-${mm.padStart(2, '0')}-${dd.padStart(2, '0')}`;
|
|
142
|
+
return timePart ? `${iso} ${timePart.trim()}` : iso;
|
|
143
|
+
}
|
|
144
|
+
function canonicalRutFrom(digits, dv) {
|
|
145
|
+
if (digits === undefined || digits === null || dv === undefined || dv === null)
|
|
146
|
+
return null;
|
|
147
|
+
return Rut.tryParse(`${String(digits)}-${String(dv).trim()}`)?.canonical ?? null;
|
|
148
|
+
}
|
|
149
|
+
function metaData(namespace, conversationId) {
|
|
150
|
+
return {
|
|
151
|
+
namespace,
|
|
152
|
+
conversationId,
|
|
153
|
+
// Opaque per-request correlation id (Web Crypto global; no node: import).
|
|
154
|
+
transactionId: globalThis.crypto.randomUUID(),
|
|
155
|
+
page: null,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Parse the SDI envelope or throw `RcvError` (non-JSON / error envelope). Empty
|
|
159
|
+
* `data[]` is a legitimate "no documents" result, never an error. */
|
|
160
|
+
function parseEnvelope(raw) {
|
|
161
|
+
const parsed = Envelope.safeParse(raw);
|
|
162
|
+
if (!parsed.success) {
|
|
163
|
+
throw new RcvError('Respuesta inesperada de SII (no es un objeto JSON del RCV).');
|
|
164
|
+
}
|
|
165
|
+
const rejected = siiRejected(parsed.data.respEstado);
|
|
166
|
+
if (rejected)
|
|
167
|
+
throw new RcvError(rejected);
|
|
168
|
+
return parsed.data;
|
|
169
|
+
}
|
|
170
|
+
const rowsOf = (env) => env.data ?? env.datos ?? [];
|
|
171
|
+
async function postSdi(session, url, namespace, data) {
|
|
172
|
+
const conversationId = (await session.cookie(`${HOSTS.portalApi}/`, CONVERSATION_COOKIE)) ?? '';
|
|
173
|
+
const request = {
|
|
174
|
+
method: 'POST',
|
|
175
|
+
headers: HEADERS,
|
|
176
|
+
body: { metaData: metaData(namespace, conversationId), data },
|
|
177
|
+
};
|
|
178
|
+
try {
|
|
179
|
+
return await session.requestJson(url, request);
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
// An expired/dead session is an ACTIONABLE NotAuthenticated (the seam detects the
|
|
183
|
+
// login wall) — let it through verbatim so the user is told to re-login, not a
|
|
184
|
+
// misleading "no es JSON". Any other non-JSON / network failure becomes a typed
|
|
185
|
+
// RcvError (ADR-004), never a raw Playwright error.
|
|
186
|
+
if (e instanceof NotAuthenticatedError)
|
|
187
|
+
throw e;
|
|
188
|
+
throw new RcvError('Respuesta inesperada de SII (no es JSON).');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** getResumen: per-DTE-type aggregates for one (RUT, period, side). `session` must be
|
|
192
|
+
* an already-logged-in PortalSession (acquired via `withSession`). */
|
|
193
|
+
export async function fetchRcvResumen(session, params) {
|
|
194
|
+
const { rut, periodo, side } = params;
|
|
195
|
+
const raw = await postSdi(session, RESUMEN_URL, RESUMEN_NAMESPACE, {
|
|
196
|
+
rutEmisor: String(rut.body),
|
|
197
|
+
dvEmisor: rut.dv,
|
|
198
|
+
ptributario: periodo.canonical,
|
|
199
|
+
estadoContab: 'REGISTRO',
|
|
200
|
+
operacion: side,
|
|
201
|
+
busquedaInicial: true,
|
|
202
|
+
});
|
|
203
|
+
const env = parseEnvelope(raw);
|
|
204
|
+
const rows = rowsOf(env).map((r) => ({
|
|
205
|
+
codigoTipoDoc: asStr(aliasGet(r, RESUMEN_ALIASES.codigoTipoDoc)),
|
|
206
|
+
descripcion: asStr(aliasGet(r, RESUMEN_ALIASES.descripcion)),
|
|
207
|
+
totalDocumentos: asInt(aliasGet(r, RESUMEN_ALIASES.totalDocumentos)),
|
|
208
|
+
montoExento: asInt(aliasGet(r, RESUMEN_ALIASES.montoExento)),
|
|
209
|
+
montoNeto: asInt(aliasGet(r, RESUMEN_ALIASES.montoNeto)),
|
|
210
|
+
montoIva: asInt(aliasGet(r, RESUMEN_ALIASES.montoIva)),
|
|
211
|
+
montoTotal: asInt(aliasGet(r, RESUMEN_ALIASES.montoTotal)),
|
|
212
|
+
}));
|
|
213
|
+
return {
|
|
214
|
+
rut: rut.canonical,
|
|
215
|
+
periodo: periodo.formatted,
|
|
216
|
+
side,
|
|
217
|
+
rows,
|
|
218
|
+
totalDocumentos: asInt(env.totDocRes),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** getDetalle{Compra,Venta}: individual DTE rows for one (RUT, period, side, DTE type).
|
|
222
|
+
* `codigoTipoDoc` comes from a prior `fetchRcvResumen` for the same period. */
|
|
223
|
+
export async function fetchRcvDetalle(session, params) {
|
|
224
|
+
const { rut, periodo, side, codigoTipoDoc } = params;
|
|
225
|
+
const raw = await postSdi(session, DETALLE_URL[side], DETALLE_NAMESPACE[side], {
|
|
226
|
+
rutEmisor: String(rut.body),
|
|
227
|
+
dvEmisor: rut.dv,
|
|
228
|
+
ptributario: periodo.canonical,
|
|
229
|
+
estadoContab: 'REGISTRO',
|
|
230
|
+
operacion: side,
|
|
231
|
+
codTipoDoc: codigoTipoDoc,
|
|
232
|
+
accionRecaptcha: RECAPTCHA_ACTION[side],
|
|
233
|
+
tokenRecaptcha: RECAPTCHA_TOKEN,
|
|
234
|
+
});
|
|
235
|
+
const env = parseEnvelope(raw);
|
|
236
|
+
const docs = rowsOf(env).map((r) => ({
|
|
237
|
+
folio: asInt(aliasGet(r, DETALLE_ALIASES.folio)),
|
|
238
|
+
rutEmisor: canonicalRutFrom(aliasGet(r, DETALLE_ALIASES.rutDigits), aliasGet(r, DETALLE_ALIASES.dv)),
|
|
239
|
+
razonSocial: asStr(aliasGet(r, DETALLE_ALIASES.razonSocial)),
|
|
240
|
+
fechaEmision: normalizeDmy(aliasGet(r, DETALLE_ALIASES.fechaEmision)),
|
|
241
|
+
fechaRecepcion: normalizeDmy(aliasGet(r, DETALLE_ALIASES.fechaRecepcion)),
|
|
242
|
+
montoExento: asInt(aliasGet(r, DETALLE_ALIASES.montoExento)),
|
|
243
|
+
montoNeto: asInt(aliasGet(r, DETALLE_ALIASES.montoNeto)),
|
|
244
|
+
montoIva: asInt(aliasGet(r, DETALLE_ALIASES.montoIva)),
|
|
245
|
+
montoTotal: asInt(aliasGet(r, DETALLE_ALIASES.montoTotal)),
|
|
246
|
+
eventoReceptor: asStr(aliasGet(r, DETALLE_ALIASES.eventoReceptor)),
|
|
247
|
+
eventoReceptorLeyenda: asStr(aliasGet(r, DETALLE_ALIASES.eventoReceptorLeyenda)),
|
|
248
|
+
raw: r,
|
|
249
|
+
}));
|
|
250
|
+
return { rut: rut.canonical, periodo: periodo.formatted, side, codigoTipoDoc, docs };
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=rcv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rcv.js","sourceRoot":"","sources":["../../src/portal/rcv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PortalSession } from '../seams/index.js';
|
|
2
|
+
export interface EmpresaAutorizada {
|
|
3
|
+
/** Canonical RUT (`<digits>-<DV>`), or null when the row's RUT didn't parse. */
|
|
4
|
+
readonly rut: string | null;
|
|
5
|
+
/** Razón social / company name — may be null (came null in the observed call). PII. */
|
|
6
|
+
readonly razonSocial: string | null;
|
|
7
|
+
readonly privilegios: string | null;
|
|
8
|
+
/** True for the row that is the account's OWN RUT (the endpoint includes it). */
|
|
9
|
+
readonly isSelf: boolean;
|
|
10
|
+
/** Full SII row for fields not curated (privilege / deauth metadata). */
|
|
11
|
+
readonly raw: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface EmpresasAutorizadas {
|
|
14
|
+
/** The authenticated account whose authorizations these are (canonical / null). */
|
|
15
|
+
readonly rut: string | null;
|
|
16
|
+
/** Empty = the account operates only its own RUT. */
|
|
17
|
+
readonly empresas: readonly EmpresaAutorizada[];
|
|
18
|
+
}
|
|
19
|
+
/** Fetch the operable set for the live session (empresas the account can operate).
|
|
20
|
+
* SESSION-KEYED — no operating-RUT arg (ADR-005). `session` must be an
|
|
21
|
+
* already-logged-in PortalSession. Throws `RepresentacionError` on an SII error
|
|
22
|
+
* envelope / non-JSON response (message verbatim, ADR-004). */
|
|
23
|
+
export declare function fetchEmpresasAutorizadas(session: PortalSession, authRutCanonical: string | null): Promise<EmpresasAutorizadas>;
|
|
24
|
+
//# sourceMappingURL=representacion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"representacion.d.ts","sourceRoot":"","sources":["../../src/portal/representacion.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAgBpE,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,uFAAuF;IACvF,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAgGD;;;gEAGgE;AAChE,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,aAAa,EACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CA2B9B"}
|