@albertomarturelo/sii-core 0.14.0 → 0.16.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/adapters/node/http.d.ts.map +1 -1
  3. package/dist/adapters/node/http.js +8 -6
  4. package/dist/adapters/node/http.js.map +1 -1
  5. package/dist/adapters/node/network.d.ts +9 -0
  6. package/dist/adapters/node/network.d.ts.map +1 -0
  7. package/dist/adapters/node/network.js +60 -0
  8. package/dist/adapters/node/network.js.map +1 -0
  9. package/dist/adapters/node/portal.d.ts.map +1 -1
  10. package/dist/adapters/node/portal.js +5 -4
  11. package/dist/adapters/node/portal.js.map +1 -1
  12. package/dist/auth/auth.d.ts.map +1 -1
  13. package/dist/auth/auth.js +13 -1
  14. package/dist/auth/auth.js.map +1 -1
  15. package/dist/auth/datos-cntr.d.ts +9 -0
  16. package/dist/auth/datos-cntr.d.ts.map +1 -1
  17. package/dist/auth/datos-cntr.js +22 -0
  18. package/dist/auth/datos-cntr.js.map +1 -1
  19. package/dist/errors/errors.d.ts +21 -0
  20. package/dist/errors/errors.d.ts.map +1 -1
  21. package/dist/errors/errors.js +23 -0
  22. package/dist/errors/errors.js.map +1 -1
  23. package/dist/errors/kind.d.ts +1 -1
  24. package/dist/errors/kind.d.ts.map +1 -1
  25. package/dist/errors/kind.js +3 -1
  26. package/dist/errors/kind.js.map +1 -1
  27. package/dist/index.d.ts +4 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/portal/carpeta-tributaria-regular.d.ts.map +1 -1
  32. package/dist/portal/carpeta-tributaria-regular.js +4 -1
  33. package/dist/portal/carpeta-tributaria-regular.js.map +1 -1
  34. package/dist/portal/dte-public.d.ts +1 -1
  35. package/dist/portal/dte-public.d.ts.map +1 -1
  36. package/dist/portal/dte-public.js +4 -2
  37. package/dist/portal/dte-public.js.map +1 -1
  38. package/dist/portal/f22/shared.d.ts.map +1 -1
  39. package/dist/portal/f22/shared.js +4 -1
  40. package/dist/portal/f22/shared.js.map +1 -1
  41. package/dist/portal/f29-rfi-form.d.ts +10 -0
  42. package/dist/portal/f29-rfi-form.d.ts.map +1 -1
  43. package/dist/portal/f29-rfi-form.js +10 -0
  44. package/dist/portal/f29-rfi-form.js.map +1 -1
  45. package/dist/portal/f29-rfi.d.ts +54 -1
  46. package/dist/portal/f29-rfi.d.ts.map +1 -1
  47. package/dist/portal/f29-rfi.js +224 -3
  48. package/dist/portal/f29-rfi.js.map +1 -1
  49. package/dist/portal/f29.d.ts +9 -0
  50. package/dist/portal/f29.d.ts.map +1 -1
  51. package/dist/portal/f29.js +59 -2
  52. package/dist/portal/f29.js.map +1 -1
  53. package/dist/portal/gwt.d.ts.map +1 -1
  54. package/dist/portal/gwt.js +30 -1
  55. package/dist/portal/gwt.js.map +1 -1
  56. package/dist/portal/rcv.d.ts.map +1 -1
  57. package/dist/portal/rcv.js +5 -2
  58. package/dist/portal/rcv.js.map +1 -1
  59. package/dist/portal/representacion.d.ts.map +1 -1
  60. package/dist/portal/representacion.js +5 -2
  61. package/dist/portal/representacion.js.map +1 -1
  62. package/dist/tasks/alertas.d.ts +65 -0
  63. package/dist/tasks/alertas.d.ts.map +1 -0
  64. package/dist/tasks/alertas.js +339 -0
  65. package/dist/tasks/alertas.js.map +1 -0
  66. package/dist/tasks/f29-submit.d.ts +83 -0
  67. package/dist/tasks/f29-submit.d.ts.map +1 -0
  68. package/dist/tasks/f29-submit.js +215 -0
  69. package/dist/tasks/f29-submit.js.map +1 -0
  70. package/dist/tasks/f29.d.ts +7 -1
  71. package/dist/tasks/f29.d.ts.map +1 -1
  72. package/dist/tasks/f29.js +9 -13
  73. package/dist/tasks/f29.js.map +1 -1
  74. package/package.json +1 -1
@@ -0,0 +1,339 @@
1
+ // `alertas` — one read of what SII holds against the taxpayer but does not push (ADR-030).
2
+ // A composite: ONE `withSession` over the existing portal facades (never the other tasks, which
3
+ // would each open a session), every call paced, one audit receipt. SESSION-KEYED (ADR-005): it
4
+ // reads the session principal, takes no `--rut`, and refuses a representing pointer up front.
5
+ // Stateless: each alerta has an id built from what it is, so a caller diffs runs by id.
6
+ import { assertOperatingSelf, withSession } from '../auth/index.js';
7
+ import { recordAudit } from '../audit/index.js';
8
+ import { Anio, Periodo } from '../periodo/index.js';
9
+ import { Rut } from '../rut/index.js';
10
+ import { NotAuthenticatedError, RateLimitError, SiiError, ValidationError, classifyError, } from '../errors/index.js';
11
+ import { DEFAULT_SETTINGS, HOSTS } from '../config/index.js';
12
+ import { parseDatosCntrNow } from '../auth/datos-cntr.js';
13
+ import { fetchF22Declaraciones, fetchF22Observaciones, pickVigenteFolio, } from '../portal/f22/index.js';
14
+ import { fetchF29Estado } from '../portal/f29.js';
15
+ import { fetchPeticiones } from '../portal/peticiones.js';
16
+ export const FUENTES_ALERTAS = ['f22', 'f29', 'peticiones'];
17
+ /** F22: años tributarios read, the current one first (3 ⇒ the prescription window). */
18
+ const F22_ANIOS = 3;
19
+ /** F29: períodos read, ending at the previous month (the current one is not due yet). */
20
+ const F29_PERIODOS = 12;
21
+ const pacingMs = () => Math.round(1000 / DEFAULT_SETTINGS.rateLimitRps);
22
+ const pad = (n) => String(n).padStart(2, '0');
23
+ const isoDate = (d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
24
+ function parseFuentes(input) {
25
+ if (input === undefined)
26
+ return [...FUENTES_ALERTAS];
27
+ const raw = typeof input === 'string' ? input.split(',') : [...input];
28
+ const names = raw.map((s) => s.trim().toLowerCase()).filter((s) => s !== '');
29
+ if (names.length === 0) {
30
+ throw new ValidationError(`Indica al menos una fuente: ${FUENTES_ALERTAS.join(', ')}.`);
31
+ }
32
+ for (const n of names) {
33
+ if (!FUENTES_ALERTAS.includes(n)) {
34
+ throw new ValidationError(`Fuente desconocida: "${n}". Las fuentes son ${FUENTES_ALERTAS.join(', ')}.`);
35
+ }
36
+ }
37
+ // Keep the canonical order, so the result does not depend on how the caller listed them.
38
+ return FUENTES_ALERTAS.filter((f) => names.includes(f));
39
+ }
40
+ function parseDesde(input) {
41
+ if (input === undefined)
42
+ return null;
43
+ const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(input.trim());
44
+ const d = m ? new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])) : null;
45
+ if (!m || !d || d.getMonth() !== Number(m[2]) - 1 || d.getDate() !== Number(m[3])) {
46
+ throw new ValidationError(`Fecha inválida en --desde: "${input}" (formato AAAA-MM-DD).`);
47
+ }
48
+ return `${m[1]}-${m[2]}-${m[3]}`;
49
+ }
50
+ /** SII's `DD/MM/YYYY` (F29 `declFechaCreacion`, observed) as YYYY-MM-DD; anything else ⇒ null. */
51
+ function fechaSii(s) {
52
+ const m = s ? /^(\d{2})\/(\d{2})\/(\d{4})/.exec(s) : null;
53
+ return m ? `${m[3]}-${m[2]}-${m[1]}` : null;
54
+ }
55
+ /** The F29 due dates of `periodo`, from SII's own FAQ (www.sii.cl/preguntas_frecuentes/
56
+ * impuestos_mensuales/001_130_1060.htm, updated 17/06/2025, read 2026-10-23): the 12th of the
57
+ * next month in general; the 20th for an Internet declaration WITH payment by an eligible
58
+ * taxpayer; the 28th for one "sin pago" or sin movimiento. A due date with payment on a
59
+ * Saturday or holiday moves to the next business day: we move it off a weekend, holidays are not
60
+ * known (hence `estimado`). `dia` is the taxpayer's regime (`autorizadoDeclararDia20`). */
61
+ export function vencimientoF29(periodo, dia = 20) {
62
+ const year = periodo.month === 12 ? periodo.year + 1 : periodo.year;
63
+ const month = periodo.month === 12 ? 0 : periodo.month; // JS month index of the NEXT month
64
+ const conPago = new Date(year, month, dia);
65
+ const dow = conPago.getDay();
66
+ if (dow === 6)
67
+ conPago.setDate(dia + 2);
68
+ if (dow === 0)
69
+ conPago.setDate(dia + 1);
70
+ return { conPago, sinPago: new Date(year, month, 28) };
71
+ }
72
+ // SII's FAQ: F29 is mandatory every month, sin movimiento included, for "todos aquellos
73
+ // contribuyentes afectos a la Ley de Impuestos a las Ventas y Servicios" from the « Inicio de
74
+ // Actividades en la primera categoría » (preguntas_frecuentes/impuestos_mensuales/
75
+ // 001_130_1051.htm and 001_130_1053.htm, updated 05/06/2025, read 2026-10-23), until the término
76
+ // de giro (001_130_2312.htm). The `atributos` codes of a primera-categoría regime, as observed:
77
+ // only exact codes, a new one joins with its citation. A persona with only honorarios has an
78
+ // inicio de actividades too but none of these (observed 2026-10-23: `NOTI`, `SGPE`).
79
+ const REGIMEN_PRIMERA_CATEGORIA = new Set([
80
+ '14D1', // « REGIMEN PRO PYME GENERAL (14D) », observed 2026-10-23 on an empresa
81
+ ]);
82
+ /** `"2026-03-26 00:00:00.0"` (observed) ⇒ that month; anything else ⇒ null (no bound). */
83
+ function mesDe(s) {
84
+ const m = s ? /^(\d{4})-(\d{2})-\d{2}/.exec(s) : null;
85
+ return m ? Periodo.of(Number(m[1]), Number(m[2])) : null;
86
+ }
87
+ /** An atributo's `fechaInicio`, `"26-03-2026"` (observed) ⇒ that month; anything else ⇒ null. */
88
+ function mesDeAtributo(s) {
89
+ const m = s ? /^\d{2}-(\d{2})-(\d{4})$/.exec(s.trim()) : null;
90
+ return m ? Periodo.of(Number(m[2]), Number(m[1])) : null;
91
+ }
92
+ const antes = (a, b) => a.year < b.year || (a.year === b.year && a.month < b.month);
93
+ /** The month the account entered an observed primera-categoría regime, and the inicio de
94
+ * actividades, whichever is later: an account that moved from honorarios into the regime owed
95
+ * nothing before it (#209 review). Either one unknown ⇒ null. */
96
+ function obligadoDesde(inicio, atributos) {
97
+ if (!inicio)
98
+ return null; // no lower bound: "due every month" would reach before the account
99
+ const desde = atributos
100
+ .filter((a) => REGIMEN_PRIMERA_CATEGORIA.has(a.atrCodigo?.trim() ?? '') &&
101
+ a.fechaTermino == null &&
102
+ a.eliminado == null)
103
+ .map((a) => mesDeAtributo(a.fechaInicio));
104
+ const meses = desde.filter((p) => p !== null);
105
+ // An active regime whose start does not parse is not proof of when the obligation began.
106
+ if (meses.length === 0 || meses.length < desde.length)
107
+ return null;
108
+ const regimen = meses.reduce((a, b) => (antes(a, b) ? a : b));
109
+ return antes(regimen, inicio) ? inicio : regimen;
110
+ }
111
+ async function leerRegimen(session) {
112
+ // A dead jar bounces here and the seam raises SessionExpiredError (aborts the read). A live
113
+ // page without the object only loses the bounds: no window, and the later day-20 deadline.
114
+ const { body } = await session.requestText(HOSTS.miSii, { method: 'GET' });
115
+ const datos = parseDatosCntrNow(body);
116
+ const c = datos?.contribuyente;
117
+ const inicio = mesDe(c?.fechaInicioActividades);
118
+ return {
119
+ inicio,
120
+ obligadoDesde: obligadoDesde(inicio, datos?.atributos ?? []),
121
+ termino: mesDe(c?.fechaTerminoGiro),
122
+ // `"S"` observed. A day-12 taxpayer says "N"; an unknown value keeps the 20th, the later of
123
+ // the two, so the alerta is never early.
124
+ dia: c?.autorizadoDeclararDia20?.trim().toUpperCase() === 'N' ? 12 : 20,
125
+ };
126
+ }
127
+ const base = (origen) => ({
128
+ origen,
129
+ periodo: null,
130
+ anio: null,
131
+ folio: null,
132
+ peticion: null,
133
+ codigo: null,
134
+ estado: null,
135
+ mensaje: null,
136
+ url: null,
137
+ fecha: null,
138
+ });
139
+ async function leerF22(runtime, session, rut, push) {
140
+ const current = runtime.clock.now().getFullYear();
141
+ for (let i = 0; i < F22_ANIOS; i++) {
142
+ const anio = Anio.of(current - i);
143
+ if (i > 0)
144
+ await runtime.clock.sleep(pacingMs());
145
+ const decls = await fetchF22Declaraciones(session, { rut, anio });
146
+ const folio = pickVigenteFolio(decls.declaraciones);
147
+ if (folio === null)
148
+ continue; // no declaración that año: nothing to observe
149
+ await runtime.clock.sleep(pacingMs());
150
+ for (const o of await fetchF22Observaciones(session, { rut, anio, folio })) {
151
+ push({
152
+ ...base('f22'),
153
+ id: `f22:${anio.canonical}:${folio}:${o.codigo}`,
154
+ tipo: 'f22_observacion',
155
+ anio: anio.canonical,
156
+ folio,
157
+ codigo: o.codigo,
158
+ mensaje: o.descripcion,
159
+ url: o.url,
160
+ });
161
+ }
162
+ }
163
+ return 'ok';
164
+ }
165
+ const ESTADO_VIGENTE = 1;
166
+ const ESTADO_GUARDADA = 10; // observed (sii-contract/f29.md)
167
+ const ESTADO_RECHAZADA = 70; // "Rechazada por pago inconcluso", observed
168
+ const isVigente = (d) => d.estadoId === ESTADO_VIGENTE || (d.estado ?? '').toLowerCase().includes('vigente');
169
+ async function leerF29(runtime, session, rut, push) {
170
+ const now = runtime.clock.now();
171
+ const today = isoDate(now);
172
+ const periodos = Array.from({ length: F29_PERIODOS }, (_, i) => {
173
+ const d = new Date(now.getFullYear(), now.getMonth() - F29_PERIODOS + i, 1);
174
+ return Periodo.of(d.getFullYear(), d.getMonth() + 1);
175
+ });
176
+ const regimen = await leerRegimen(session);
177
+ const sinDeclarar = [];
178
+ let declarante = false;
179
+ for (let i = 0; i < periodos.length; i++) {
180
+ const periodo = periodos[i];
181
+ await runtime.clock.sleep(pacingMs()); // after the Mi SII read too (ADR-004)
182
+ const { declaraciones } = await fetchF29Estado(session, { rut, periodo });
183
+ if (declaraciones.some(isVigente)) {
184
+ declarante = true;
185
+ continue;
186
+ }
187
+ const rec = declaraciones.find((d) => d.estadoId === ESTADO_RECHAZADA) ??
188
+ declaraciones.find((d) => d.estadoId === ESTADO_GUARDADA) ??
189
+ declaraciones[0];
190
+ if (rec) {
191
+ const tipo = rec.estadoId === ESTADO_RECHAZADA
192
+ ? 'f29_rechazada'
193
+ : rec.estadoId === ESTADO_GUARDADA
194
+ ? 'f29_guardada'
195
+ : 'f29_otro_estado';
196
+ // A Guardada borrador carries folio 0 (observed): not a folio of anything.
197
+ const folio = rec.folio ? String(rec.folio) : null;
198
+ const suffix = tipo === 'f29_otro_estado' ? `otro_estado:${rec.estadoId ?? 'null'}` : tipo.slice(4);
199
+ push({
200
+ ...base('f29'),
201
+ id: `f29:${periodo.formatted}:${suffix}${folio ? `:${folio}` : ''}`,
202
+ tipo,
203
+ periodo: periodo.formatted,
204
+ folio,
205
+ estado: rec.estado,
206
+ fecha: fechaSii(rec.fecha),
207
+ });
208
+ continue;
209
+ }
210
+ // Outside the account's own obligation window nothing was due: a month before the empresa
211
+ // existed is not a missing F29 (observed live: five false alertas before ADR-030's fix).
212
+ if (regimen.inicio && antes(periodo, regimen.inicio))
213
+ continue;
214
+ if (regimen.termino && antes(regimen.termino, periodo))
215
+ continue;
216
+ const venc = vencimientoF29(periodo, regimen.dia);
217
+ if (today <= isoDate(venc.conPago))
218
+ continue; // due date not passed: still on time
219
+ sinDeclarar.push({
220
+ periodo,
221
+ alerta: {
222
+ ...base('f29'),
223
+ id: `f29:${periodo.formatted}:sin_declarar`,
224
+ tipo: 'f29_sin_declarar',
225
+ periodo: periodo.formatted,
226
+ fecha: isoDate(venc.conPago),
227
+ vencimiento: {
228
+ conPago: isoDate(venc.conPago),
229
+ sinPago: isoDate(venc.sinPago),
230
+ estimado: true,
231
+ },
232
+ },
233
+ });
234
+ }
235
+ // An account with no Vigente F29 in the window does not file F29 (a persona without giro):
236
+ // twelve "sin declarar" would be noise, not alertas (ADR-030). Unless SII holds it in a
237
+ // primera-categoría regime: then a new business that never filed is exactly the case (#208),
238
+ // from the month its obligation began.
239
+ const desde = declarante ? null : regimen.obligadoDesde;
240
+ if (!declarante && !desde)
241
+ return 'no_declarante';
242
+ for (const { periodo, alerta } of sinDeclarar) {
243
+ if (desde && antes(periodo, desde))
244
+ continue;
245
+ push(alerta);
246
+ }
247
+ return 'ok';
248
+ }
249
+ async function leerPeticiones(session, rut, push) {
250
+ const { peticiones } = await fetchPeticiones(session, { rut });
251
+ for (const p of peticiones) {
252
+ const ultimo = p.timeline[0] ?? null; // most-recent-first (portal/peticiones.ts)
253
+ push({
254
+ ...base('peticiones'),
255
+ // The latest transition is in the id, so a petición resurfaces only when it moves.
256
+ id: `peticion:${p.numero}:${ultimo?.fecha ?? p.estadoActual}`,
257
+ tipo: 'peticion_estado',
258
+ peticion: p.numero,
259
+ estado: p.estadoActual,
260
+ mensaje: ultimo?.mensaje ?? null,
261
+ fecha: ultimo?.fecha ? ultimo.fecha.slice(0, 10) : null,
262
+ });
263
+ }
264
+ return 'ok';
265
+ }
266
+ /** Read the alertas of the session principal from the requested sources (ADR-030). */
267
+ export async function alertas(runtime, args = {}) {
268
+ const fuentes = parseFuentes(args.fuentes); // fail fast — no session opened
269
+ const desde = parseDesde(args.desde);
270
+ await assertOperatingSelf(runtime, (empresa) => new ValidationError(`alertas es session-keyed: lee las alertas del titular de la sesión, no del RUT operado ` +
271
+ `(${empresa}). Para las de esa empresa, inicia sesión como ella ` +
272
+ '(`sii auth logout` y luego `sii auth login`).'));
273
+ const start = runtime.clock.now().getTime();
274
+ try {
275
+ const result = await withSession(runtime, async (session, ctx) => {
276
+ const rut = Rut.parse(ctx.sessionRut); // session-keyed: ALWAYS the principal
277
+ const found = [];
278
+ const push = (a) => {
279
+ found.push(a);
280
+ };
281
+ const estados = [];
282
+ for (let i = 0; i < FUENTES_ALERTAS.length; i++) {
283
+ const origen = FUENTES_ALERTAS[i];
284
+ if (!fuentes.includes(origen)) {
285
+ estados.push({ origen, estado: 'omitida' });
286
+ continue;
287
+ }
288
+ if (estados.some((e) => e.estado !== 'omitida'))
289
+ await runtime.clock.sleep(pacingMs());
290
+ try {
291
+ const estado = origen === 'f22'
292
+ ? await leerF22(runtime, session, rut, push)
293
+ : origen === 'f29'
294
+ ? await leerF29(runtime, session, rut, push)
295
+ : await leerPeticiones(session, rut, push);
296
+ estados.push({ origen, estado });
297
+ }
298
+ catch (e) {
299
+ // A dead session or SII's rate limit ends the whole read: going on would mean asking
300
+ // again against a block (ADR-004). A bug or a network failure (not a SiiError) must not
301
+ // hide as a source error either. Any other SII failure stops that source only; what it read stays.
302
+ if (e instanceof NotAuthenticatedError || e instanceof RateLimitError)
303
+ throw e;
304
+ if (!(e instanceof SiiError))
305
+ throw e;
306
+ estados.push({
307
+ origen,
308
+ estado: 'error',
309
+ error: { type: classifyError(e).type, error: e.message },
310
+ });
311
+ }
312
+ }
313
+ const alertasFiltradas = desde
314
+ ? found.filter((a) => a.fecha === null || a.fecha >= desde)
315
+ : found;
316
+ return {
317
+ rut: rut.canonical,
318
+ alertas: alertasFiltradas,
319
+ fuentes: estados,
320
+ incompleto: estados.some((e) => e.estado === 'error'),
321
+ };
322
+ });
323
+ // Counts only: the alertas carry SII's free text about the taxpayer (ADR-006).
324
+ recordAudit(runtime, {
325
+ action: 'alertas',
326
+ result: result.incompleto ? 'partial' : 'ok',
327
+ rut: result.rut,
328
+ count: result.alertas.length,
329
+ fuentes: Object.fromEntries(result.fuentes.map((f) => [f.origen, f.estado])),
330
+ durationMs: runtime.clock.now().getTime() - start,
331
+ });
332
+ return result;
333
+ }
334
+ catch (e) {
335
+ recordAudit(runtime, { action: 'alertas', result: 'failed' });
336
+ throw e;
337
+ }
338
+ }
339
+ //# sourceMappingURL=alertas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alertas.js","sourceRoot":"","sources":["../../src/tasks/alertas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { Periodo } from '../periodo/index.js';
2
+ import { Rut } from '../rut/index.js';
3
+ import { type F29Estado, type F29Propuesta } from '../portal/f29.js';
4
+ import { type F29BorradorValidado, type F29Desacuerdo } from '../portal/f29-rfi.js';
5
+ import type { Gwt7Node } from '../portal/gwt.js';
6
+ import { type F29Grupo } from '../portal/f29-codigos.js';
7
+ import type { PortalSession, Runtime } from '../seams/index.js';
8
+ import { type LineaF29 } from './f29.js';
9
+ export type { F29Desacuerdo, F29MotivoDesacuerdo } from '../portal/f29-rfi.js';
10
+ /** What `f29 submit` would file, as SII validated it. */
11
+ export interface F29SubmitPreview {
12
+ readonly rut: string;
13
+ readonly periodo: string;
14
+ /** SII's propuesta, labeled and grouped like `f29 formulario`. */
15
+ readonly propuesta: Record<F29Grupo, readonly LineaF29[]>;
16
+ /** The códigos SII's own formulas compute on the filled form (e.g. 77, 537), non-zero. */
17
+ readonly calculados: readonly LineaF29[];
18
+ /** TOTAL A PAGAR (código 91) as SII validated it: the value `--confirm` must repeat. */
19
+ readonly total: number;
20
+ /** Where SII's validated borrador and the propuesta disagree. Any entry blocks the submit. */
21
+ readonly desacuerdos: readonly F29Desacuerdo[];
22
+ /** True when nothing blocks the submit. */
23
+ readonly listoParaPresentar: boolean;
24
+ /** Always true: the preview leaves a borrador "Guardada" at SII (non-filing). */
25
+ readonly borradorGuardado: true;
26
+ }
27
+ /** A filed declaración. `pagoUrl` stays null until SII's payment link is observed (ADR-029
28
+ * amendment); when `total` > 0 the user pays at SII themselves. */
29
+ export interface F29SubmitResult {
30
+ readonly rut: string;
31
+ readonly periodo: string;
32
+ readonly folio: number | null;
33
+ readonly total: number;
34
+ readonly estado: string | null;
35
+ readonly pagoUrl: string | null;
36
+ }
37
+ /** The SII steps the submit runs. Production uses `SII_F29_SUBMIT`; tests build the tasks over a
38
+ * fake one with `f29SubmitTasks`. */
39
+ export interface F29SubmitChain {
40
+ estado(session: PortalSession, p: {
41
+ rut: Rut;
42
+ periodo: Periodo;
43
+ }): Promise<F29Estado>;
44
+ propuesta(session: PortalSession, p: {
45
+ rut: Rut;
46
+ periodo: Periodo;
47
+ }): Promise<F29Propuesta>;
48
+ /** The propuesta handoff, the form app and SII's validation. Writes a borrador "Guardada". */
49
+ validar(session: PortalSession, p: {
50
+ rut: Rut;
51
+ periodo: Periodo;
52
+ hoy: Date;
53
+ }): Promise<F29BorradorValidado>;
54
+ /** Saves the validated borrador; does not file. */
55
+ guardar(session: PortalSession, borrador: Gwt7Node): Promise<Gwt7Node>;
56
+ /** FILES the declaración. */
57
+ inyectar(session: PortalSession, guardado: Gwt7Node): Promise<void>;
58
+ }
59
+ export declare const SII_F29_SUBMIT: F29SubmitChain;
60
+ /** The two tasks over a given chain. Tests pass a fake one; the barrel exports only the pair
61
+ * bound to SII below, so no surface reaches the chain (ADR-003). */
62
+ export declare function f29SubmitTasks(chain: F29SubmitChain): {
63
+ f29SubmitPreview: (runtime: Runtime, args: {
64
+ periodo: string;
65
+ }) => Promise<F29SubmitPreview>;
66
+ f29Submit: (runtime: Runtime, args: {
67
+ periodo: string;
68
+ total: number | string;
69
+ }) => Promise<F29SubmitResult>;
70
+ };
71
+ /** The preview: SII's propuesta, what SII's formulas compute, SII's validated total and every
72
+ * disagreement. Files nothing; leaves a borrador "Guardada" at SII. */
73
+ export declare function f29SubmitPreview(runtime: Runtime, args: {
74
+ periodo: string;
75
+ }): Promise<F29SubmitPreview>;
76
+ /** FILE the declaración. Refuses, without saving or filing, when SII's total today is not
77
+ * `total`, or when the borrador SII validated disagrees with the propuesta. Then saves and
78
+ * files once. If the filing call fails, SII's state decides what happened; it is never resent. */
79
+ export declare function f29Submit(runtime: Runtime, args: {
80
+ periodo: string;
81
+ total: number | string;
82
+ }): Promise<F29SubmitResult>;
83
+ //# sourceMappingURL=f29-submit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"f29-submit.d.ts","sourceRoot":"","sources":["../../src/tasks/f29-submit.ts"],"names":[],"mappings":"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"}