@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,213 @@
|
|
|
1
|
+
// Public F29 task API the surfaces call (ADR-003). Declaración Mensual de IVA, read-only.
|
|
2
|
+
// FASE 1 (robusta, JSON SDI — sin GWT-RPC): three verbs over the two clean SDI-JSON facades
|
|
3
|
+
// (propuesta + estado). The exact PRESENTED form (the full balance incl. totals 538/89/91) lives
|
|
4
|
+
// behind a fragile 2-app GWT-RPC flow and is deferred to Fase 2 (its own PR + ADR). Here:
|
|
5
|
+
// - f29Formulario(periodo) — the IVA PROPUESTA's códigos, labeled (glosa) + grouped by the
|
|
6
|
+
// form's sections. `fuente: 'propuesta'` is explicit: it is SII's suggestion, not the filed
|
|
7
|
+
// form. (Fase 2 adds `fuente: 'presentada'`.)
|
|
8
|
+
// - f29Overview(desde, hasta) — per-month, from the presented-declaración ESTADO: estado, folio,
|
|
9
|
+
// fecha and the declared `total` ("lo que pagué por mes"), across a date range.
|
|
10
|
+
// - f29Status(periodo) — the raw estado of one month (the declaración records SII holds).
|
|
11
|
+
// F29 is SESSION-KEYED (ADR-005): reads ONLY the session principal and REJECTS a representing
|
|
12
|
+
// operate pointer UP FRONT (before any session), with an actionable "log in as the empresa"
|
|
13
|
+
// message. The período/range is validated locally BEFORE any session.
|
|
14
|
+
import { withSession } from '../auth/index.js';
|
|
15
|
+
import { recordAudit } from '../audit/index.js';
|
|
16
|
+
import { readOperateState } from '../identity/index.js';
|
|
17
|
+
import { Periodo } from '../periodo/index.js';
|
|
18
|
+
import { Rut } from '../rut/index.js';
|
|
19
|
+
import { F29Error, ValidationError } from '../errors/index.js';
|
|
20
|
+
import { DEFAULT_SETTINGS } from '../config/index.js';
|
|
21
|
+
import { fetchF29Estado, fetchF29Propuesta } from '../portal/f29.js';
|
|
22
|
+
import { F29_CODIGOS, glosaF29, grupoF29 } from '../portal/f29-codigos.js';
|
|
23
|
+
export { F29_GRUPO_LABELS } from '../portal/f29-codigos.js';
|
|
24
|
+
/** A range bound: a multi-month overview never fans out more than this many POSTs at SII. */
|
|
25
|
+
const MAX_OVERVIEW_MONTHS = 36;
|
|
26
|
+
/** Inter-request pace (ms) for the multi-month overview fan-out — never hammer SII (ADR-004). */
|
|
27
|
+
const pacingMs = () => Math.round(1000 / DEFAULT_SETTINGS.rateLimitRps);
|
|
28
|
+
function audit(runtime, action, result, extra) {
|
|
29
|
+
recordAudit(runtime, { action, result, ...extra });
|
|
30
|
+
}
|
|
31
|
+
/** Reject a representing operate pointer BEFORE opening a session (ADR-005, session-keyed). The
|
|
32
|
+
* empresa RUT is already user-visible (`operate --list`), so it is safe to echo; the razón social
|
|
33
|
+
* is PII and is NOT included. No operate state → defer to `withSession` (raises NotAuthenticated). */
|
|
34
|
+
async function assertSelfOperating(runtime) {
|
|
35
|
+
const op = await readOperateState(runtime.store);
|
|
36
|
+
if (op && op.operatingRut !== op.selfRut) {
|
|
37
|
+
throw new F29Error(`El F29 es session-keyed: el SII autoriza por el titular de la sesión, no por el RUT ` +
|
|
38
|
+
`operado (${Rut.parse(op.operatingRut).formatted}). Para la F29 de esa empresa, inicia ` +
|
|
39
|
+
'sesión como ella (`sii auth logout` y luego `sii auth login`).');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const EMPTY_GRUPOS = () => ({
|
|
43
|
+
debitos: [],
|
|
44
|
+
creditos: [],
|
|
45
|
+
retenciones: [],
|
|
46
|
+
otros: [],
|
|
47
|
+
totales: [],
|
|
48
|
+
});
|
|
49
|
+
/** Label + bucket the propuesta códigos by the form's sections. */
|
|
50
|
+
function agrupar(codigos) {
|
|
51
|
+
const grupos = EMPTY_GRUPOS();
|
|
52
|
+
for (const c of codigos) {
|
|
53
|
+
grupos[grupoF29(c.codigo)].push({
|
|
54
|
+
codigo: c.codigo,
|
|
55
|
+
glosa: glosaF29(c.codigo),
|
|
56
|
+
valor: c.valor,
|
|
57
|
+
signo: F29_CODIGOS[c.codigo]?.signo ?? '',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return grupos;
|
|
61
|
+
}
|
|
62
|
+
/** IVA propuesta of one período, labeled + grouped (the contador-readable breakdown).
|
|
63
|
+
* `fuente: 'propuesta'` — SII's suggestion, not the filed form (that is Fase 2). */
|
|
64
|
+
export async function f29Formulario(runtime, args) {
|
|
65
|
+
const periodo = Periodo.parse(args.periodo); // fail fast on a bad período — no session opened
|
|
66
|
+
await assertSelfOperating(runtime);
|
|
67
|
+
const start = runtime.clock.now().getTime();
|
|
68
|
+
try {
|
|
69
|
+
const prop = await withSession(runtime, async (session, ctx) => fetchF29Propuesta(session, { rut: Rut.parse(ctx.sessionRut), periodo }));
|
|
70
|
+
const res = {
|
|
71
|
+
rut: prop.rut,
|
|
72
|
+
periodo: prop.periodo,
|
|
73
|
+
fuente: 'propuesta',
|
|
74
|
+
tienePropuesta: prop.tienePropuesta,
|
|
75
|
+
// Group ONLY the proposed tax códigos (listCodPropuestos). The `listCodAdministrativos`
|
|
76
|
+
// (90xx/91xx) are SII-internal control códigos — not lines the contador reads and absent
|
|
77
|
+
// from the rendered form (so they have no observed glosa) — excluded from the formulario.
|
|
78
|
+
grupos: agrupar(prop.codigos),
|
|
79
|
+
};
|
|
80
|
+
audit(runtime, 'f29_formulario', 'ok', {
|
|
81
|
+
rut: res.rut,
|
|
82
|
+
period: periodo.canonical,
|
|
83
|
+
durationMs: runtime.clock.now().getTime() - start,
|
|
84
|
+
});
|
|
85
|
+
return res;
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
audit(runtime, 'f29_formulario', 'failed', { period: periodo.canonical });
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// --- f29 status (raw estado of one month) ----------------------------------------
|
|
93
|
+
/** The presented/saved F29 records of one período (estado, folio, fecha, total). Session
|
|
94
|
+
* principal (ADR-005). Empty is a clean "nada presentado", not an error. */
|
|
95
|
+
export async function f29Status(runtime, args) {
|
|
96
|
+
const periodo = Periodo.parse(args.periodo);
|
|
97
|
+
await assertSelfOperating(runtime);
|
|
98
|
+
const start = runtime.clock.now().getTime();
|
|
99
|
+
try {
|
|
100
|
+
const res = await withSession(runtime, async (session, ctx) => fetchF29Estado(session, { rut: Rut.parse(ctx.sessionRut), periodo }));
|
|
101
|
+
audit(runtime, 'f29_estado', 'ok', {
|
|
102
|
+
rut: res.rut,
|
|
103
|
+
period: periodo.canonical,
|
|
104
|
+
durationMs: runtime.clock.now().getTime() - start,
|
|
105
|
+
});
|
|
106
|
+
return res;
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
audit(runtime, 'f29_estado', 'failed', { period: periodo.canonical });
|
|
110
|
+
throw e;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Resolve the overview args into a concrete [desde, hasta] pair — fail fast on a
|
|
114
|
+
* malformed value (ValidationError, no session opened). */
|
|
115
|
+
function resolveOverviewRange(clock, args) {
|
|
116
|
+
if (args.anio !== undefined && args.desde !== undefined) {
|
|
117
|
+
throw new ValidationError('Indica el rango con `anio` O con `desde`/`hasta`, no ambos.');
|
|
118
|
+
}
|
|
119
|
+
if (args.anio !== undefined && !/^\d{4}$/.test(args.anio.trim())) {
|
|
120
|
+
throw new ValidationError(`Año inválido: "${args.anio}" (esperado YYYY).`);
|
|
121
|
+
}
|
|
122
|
+
// A bare-YYYY `desde` is the CLI's year shorthand — same meaning as `anio`.
|
|
123
|
+
const anio = args.anio?.trim() ??
|
|
124
|
+
(args.desde !== undefined && /^\d{4}$/.test(args.desde.trim()) ? args.desde.trim() : undefined);
|
|
125
|
+
if (anio !== undefined) {
|
|
126
|
+
const year = Number(anio);
|
|
127
|
+
return {
|
|
128
|
+
desde: Periodo.of(year, 1),
|
|
129
|
+
hasta: args.hasta !== undefined ? Periodo.parse(args.hasta) : Periodo.of(year, 12),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (args.desde !== undefined) {
|
|
133
|
+
const desde = Periodo.parse(args.desde);
|
|
134
|
+
return { desde, hasta: args.hasta !== undefined ? Periodo.parse(args.hasta) : desde };
|
|
135
|
+
}
|
|
136
|
+
// Nothing → current calendar year to date. The Clock seam keeps this testable
|
|
137
|
+
// and the core wall-clock-free (ADR-003).
|
|
138
|
+
const now = clock.now();
|
|
139
|
+
return {
|
|
140
|
+
desde: Periodo.of(now.getFullYear(), 1),
|
|
141
|
+
hasta: args.hasta !== undefined
|
|
142
|
+
? Periodo.parse(args.hasta)
|
|
143
|
+
: Periodo.of(now.getFullYear(), now.getMonth() + 1),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** Enumerate the months in [desde, hasta] inclusive (chronological). */
|
|
147
|
+
function periodosEnRango(desde, hasta) {
|
|
148
|
+
const out = [];
|
|
149
|
+
let y = desde.year;
|
|
150
|
+
let m = desde.month;
|
|
151
|
+
while (y < hasta.year || (y === hasta.year && m <= hasta.month)) {
|
|
152
|
+
out.push(Periodo.of(y, m));
|
|
153
|
+
m += 1;
|
|
154
|
+
if (m > 12) {
|
|
155
|
+
m = 1;
|
|
156
|
+
y += 1;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
/** Pick the declaración whose total is the month's headline: the vigente one (estadoId 1 /
|
|
162
|
+
* estado "Vigente"), else the first record. */
|
|
163
|
+
function declaracionVigente(decls) {
|
|
164
|
+
return (decls.find((d) => d.estadoId === 1 || (d.estado ?? '').toLowerCase().includes('vigente')) ??
|
|
165
|
+
decls[0] ??
|
|
166
|
+
null);
|
|
167
|
+
}
|
|
168
|
+
/** Per-month F29 position across a date range, from the presented-declaración estado: each month's
|
|
169
|
+
* vigente estado/folio/fecha + the declared `total`. Session principal (ADR-005), paced. */
|
|
170
|
+
export async function f29Overview(runtime, args = {}) {
|
|
171
|
+
const { desde, hasta } = resolveOverviewRange(runtime.clock, args); // fail fast — no session opened
|
|
172
|
+
if (desde.year > hasta.year || (desde.year === hasta.year && desde.month > hasta.month)) {
|
|
173
|
+
throw new ValidationError(`Rango inválido: "desde" (${desde.formatted}) es posterior a "hasta" (${hasta.formatted}).`);
|
|
174
|
+
}
|
|
175
|
+
const periodos = periodosEnRango(desde, hasta);
|
|
176
|
+
if (periodos.length > MAX_OVERVIEW_MONTHS) {
|
|
177
|
+
throw new ValidationError(`Rango demasiado amplio: ${periodos.length} meses (máximo ${MAX_OVERVIEW_MONTHS}). Acota el rango.`);
|
|
178
|
+
}
|
|
179
|
+
await assertSelfOperating(runtime);
|
|
180
|
+
const start = runtime.clock.now().getTime();
|
|
181
|
+
try {
|
|
182
|
+
const result = await withSession(runtime, async (session, ctx) => {
|
|
183
|
+
const rut = Rut.parse(ctx.sessionRut); // session-keyed: always the principal
|
|
184
|
+
const meses = [];
|
|
185
|
+
for (let i = 0; i < periodos.length; i++) {
|
|
186
|
+
if (i > 0)
|
|
187
|
+
await runtime.clock.sleep(pacingMs()); // pace each estado POST (ADR-004)
|
|
188
|
+
const est = await fetchF29Estado(session, { rut, periodo: periodos[i] });
|
|
189
|
+
const vig = declaracionVigente(est.declaraciones);
|
|
190
|
+
meses.push({
|
|
191
|
+
periodo: est.periodo,
|
|
192
|
+
tieneDeclaracion: est.tieneDeclaracion,
|
|
193
|
+
estado: vig?.estado ?? null,
|
|
194
|
+
folio: vig?.folio ?? null,
|
|
195
|
+
fecha: vig?.fecha ?? null,
|
|
196
|
+
total: vig?.total ?? null,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return { rut: rut.canonical, desde: desde.formatted, hasta: hasta.formatted, meses };
|
|
200
|
+
});
|
|
201
|
+
audit(runtime, 'f29_overview', 'ok', {
|
|
202
|
+
rut: result.rut,
|
|
203
|
+
period: `${desde.canonical}-${hasta.canonical}`,
|
|
204
|
+
durationMs: runtime.clock.now().getTime() - start,
|
|
205
|
+
});
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
audit(runtime, 'f29_overview', 'failed', { period: `${desde.canonical}-${hasta.canonical}` });
|
|
210
|
+
throw e;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=f29.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"f29.js","sourceRoot":"","sources":["../../src/tasks/f29.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { OperableEntry, OperatingContext } from '../identity/index.js';
|
|
2
|
+
import type { Runtime } from '../seams/index.js';
|
|
3
|
+
export interface OperateResult {
|
|
4
|
+
readonly context: OperatingContext;
|
|
5
|
+
readonly reason: 'switched' | 'self';
|
|
6
|
+
}
|
|
7
|
+
export interface OperableList {
|
|
8
|
+
/** The RUT currently operated AS (to flag the active row). */
|
|
9
|
+
readonly operatingRut: string;
|
|
10
|
+
/** Self + represented empresas (the valid `operate` / `--rut` targets). */
|
|
11
|
+
readonly operable: readonly OperableEntry[];
|
|
12
|
+
}
|
|
13
|
+
/** Operate AS a represented empresa (validated against the operable set). */
|
|
14
|
+
export declare function operate(runtime: Runtime, target: string): Promise<OperateResult>;
|
|
15
|
+
/** Clear the operating context back to self. */
|
|
16
|
+
export declare function operateSelf(runtime: Runtime): Promise<OperateResult>;
|
|
17
|
+
/** Current operating context (local read). Null when there is no session. */
|
|
18
|
+
export declare function operatingStatus(runtime: Runtime): Promise<OperatingContext | null>;
|
|
19
|
+
/** List the operable set — self + represented empresas (local read). Null when
|
|
20
|
+
* there is no session. The valid targets for `operate` / `--rut`. */
|
|
21
|
+
export declare function listOperable(runtime: Runtime): Promise<OperableList | null>;
|
|
22
|
+
//# sourceMappingURL=operate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operate.d.ts","sourceRoot":"","sources":["../../src/tasks/operate.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAED,6EAA6E;AAC7E,wBAAsB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAWtF;AAED,gDAAgD;AAChD,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAI1E;AAED,6EAA6E;AAC7E,wBAAsB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAGxF;AAED;sEACsE;AACtE,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAGjF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Public operate API. Sets/clears the persona's operating RUT (ADR-005).
|
|
2
|
+
import { recordAudit } from '../audit/index.js';
|
|
3
|
+
import { clearOperatingRut, operatingContext, readOperateState, setOperatingRut, } from '../identity/index.js';
|
|
4
|
+
/** Operate AS a represented empresa (validated against the operable set). */
|
|
5
|
+
export async function operate(runtime, target) {
|
|
6
|
+
const context = operatingContext(await setOperatingRut(runtime.store, target));
|
|
7
|
+
// rutAuth only when operating ≠ self (ADR-015 audit discipline). razón social is PII — never logged.
|
|
8
|
+
const base = {
|
|
9
|
+
action: 'operate',
|
|
10
|
+
result: 'ok',
|
|
11
|
+
rut: context.operatingRut,
|
|
12
|
+
reason: 'switched',
|
|
13
|
+
};
|
|
14
|
+
recordAudit(runtime, context.isSelf ? base : { ...base, rutAuth: context.selfRut });
|
|
15
|
+
return { context, reason: 'switched' };
|
|
16
|
+
}
|
|
17
|
+
/** Clear the operating context back to self. */
|
|
18
|
+
export async function operateSelf(runtime) {
|
|
19
|
+
const context = operatingContext(await clearOperatingRut(runtime.store));
|
|
20
|
+
recordAudit(runtime, { action: 'operate', result: 'ok', rut: context.selfRut, reason: 'self' });
|
|
21
|
+
return { context, reason: 'self' };
|
|
22
|
+
}
|
|
23
|
+
/** Current operating context (local read). Null when there is no session. */
|
|
24
|
+
export async function operatingStatus(runtime) {
|
|
25
|
+
const state = await readOperateState(runtime.store);
|
|
26
|
+
return state ? operatingContext(state) : null;
|
|
27
|
+
}
|
|
28
|
+
/** List the operable set — self + represented empresas (local read). Null when
|
|
29
|
+
* there is no session. The valid targets for `operate` / `--rut`. */
|
|
30
|
+
export async function listOperable(runtime) {
|
|
31
|
+
const state = await readOperateState(runtime.store);
|
|
32
|
+
return state ? { operatingRut: state.operatingRut, operable: state.operable } : null;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=operate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operate.js","sourceRoot":"","sources":["../../src/tasks/operate.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAgB9B,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAgB,EAAE,MAAc;IAC5D,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/E,qGAAqG;IACrG,MAAM,IAAI,GAAe;QACvB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,OAAO,CAAC,YAAY;QACzB,MAAM,EAAE,UAAU;KACnB,CAAC;IACF,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB;IAChD,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED;sEACsE;AACtE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB;IACjD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RcvDetalle, RcvResumen, RcvSide } from '../portal/rcv.js';
|
|
2
|
+
import type { Runtime } from '../seams/index.js';
|
|
3
|
+
export type { RcvDetalle, RcvDetalleDoc, RcvResumen, RcvResumenRow, RcvSide, } from '../portal/rcv.js';
|
|
4
|
+
interface RcvResumenArgs {
|
|
5
|
+
/** Tax period, `YYYYMM` / `YYYY-MM`. Validated locally before any session. */
|
|
6
|
+
readonly periodo: string;
|
|
7
|
+
readonly side: RcvSide;
|
|
8
|
+
/** Per-call operating RUT override (must be in the operable set); else the pointer. */
|
|
9
|
+
readonly rut?: string;
|
|
10
|
+
}
|
|
11
|
+
interface RcvDetalleArgs extends RcvResumenArgs {
|
|
12
|
+
/** SII DTE type code (from a prior `rcvSummary` for the same period). */
|
|
13
|
+
readonly codigoTipoDoc: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function rcvSummary(runtime: Runtime, args: RcvResumenArgs): Promise<RcvResumen>;
|
|
16
|
+
export declare function rcvList(runtime: Runtime, args: RcvDetalleArgs): Promise<RcvDetalle>;
|
|
17
|
+
//# sourceMappingURL=rcv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rcv.d.ts","sourceRoot":"","sources":["../../src/tasks/rcv.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAc,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE7D,YAAY,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,aAAa,EACb,OAAO,GACR,MAAM,kBAAkB,CAAC;AAE1B,UAAU,cAAc;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,uFAAuF;IACvF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,cAAe,SAAQ,cAAc;IAC7C,yEAAyE;IACzE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAYD,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CA4B5F;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAkCzF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Public RCV task API the surfaces call (ADR-003). Each wraps the portal facade in
|
|
2
|
+
// `withSession` — consume a live session, resolve the body RUT (override > pointer >
|
|
3
|
+
// self, ADR-005) — and writes ONE audit receipt. RCV is BODY-RUT: `--rut`/operate
|
|
4
|
+
// selects a represented empresa. The period is validated locally BEFORE any session.
|
|
5
|
+
import { withSession } from '../auth/index.js';
|
|
6
|
+
import { recordAudit } from '../audit/index.js';
|
|
7
|
+
import { Periodo } from '../periodo/index.js';
|
|
8
|
+
import { Rut } from '../rut/index.js';
|
|
9
|
+
import { fetchRcvDetalle, fetchRcvResumen } from '../portal/rcv.js';
|
|
10
|
+
// exactOptionalPropertyTypes: only set `rut` when actually overriding.
|
|
11
|
+
const sessionOpts = (rut) => (rut !== undefined ? { rut } : {});
|
|
12
|
+
// `extra` is `Partial<AuditEntry>` so the typed optional fields (durationMs, rutAuth)
|
|
13
|
+
// stay typed and arbitrary keys (periodo, side, …) ride the entry's index signature —
|
|
14
|
+
// no cast needed.
|
|
15
|
+
function audit(runtime, action, result, extra) {
|
|
16
|
+
recordAudit(runtime, { action, result, ...extra });
|
|
17
|
+
}
|
|
18
|
+
export async function rcvSummary(runtime, args) {
|
|
19
|
+
const periodo = Periodo.parse(args.periodo); // fail fast on a bad period — no session opened
|
|
20
|
+
const start = runtime.clock.now().getTime();
|
|
21
|
+
try {
|
|
22
|
+
const { res, sessionRut } = await withSession(runtime, async (session, ctx) => ({
|
|
23
|
+
res: await fetchRcvResumen(session, {
|
|
24
|
+
rut: Rut.parse(ctx.operatingRut),
|
|
25
|
+
periodo,
|
|
26
|
+
side: args.side,
|
|
27
|
+
}),
|
|
28
|
+
sessionRut: ctx.sessionRut,
|
|
29
|
+
}), sessionOpts(args.rut));
|
|
30
|
+
audit(runtime, 'rcv_resumen', 'ok', {
|
|
31
|
+
rut: res.rut,
|
|
32
|
+
periodo: periodo.canonical,
|
|
33
|
+
side: args.side,
|
|
34
|
+
durationMs: runtime.clock.now().getTime() - start,
|
|
35
|
+
...(res.rut !== sessionRut ? { rutAuth: sessionRut } : {}),
|
|
36
|
+
});
|
|
37
|
+
return res;
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
audit(runtime, 'rcv_resumen', 'failed', { periodo: periodo.canonical, side: args.side });
|
|
41
|
+
throw e;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function rcvList(runtime, args) {
|
|
45
|
+
const periodo = Periodo.parse(args.periodo);
|
|
46
|
+
const start = runtime.clock.now().getTime();
|
|
47
|
+
try {
|
|
48
|
+
const { res, sessionRut } = await withSession(runtime, async (session, ctx) => ({
|
|
49
|
+
res: await fetchRcvDetalle(session, {
|
|
50
|
+
rut: Rut.parse(ctx.operatingRut),
|
|
51
|
+
periodo,
|
|
52
|
+
side: args.side,
|
|
53
|
+
codigoTipoDoc: args.codigoTipoDoc,
|
|
54
|
+
}),
|
|
55
|
+
sessionRut: ctx.sessionRut,
|
|
56
|
+
}), sessionOpts(args.rut));
|
|
57
|
+
audit(runtime, 'rcv_detalle', 'ok', {
|
|
58
|
+
rut: res.rut,
|
|
59
|
+
periodo: periodo.canonical,
|
|
60
|
+
side: args.side,
|
|
61
|
+
codigoTipoDoc: args.codigoTipoDoc,
|
|
62
|
+
durationMs: runtime.clock.now().getTime() - start,
|
|
63
|
+
...(res.rut !== sessionRut ? { rutAuth: sessionRut } : {}),
|
|
64
|
+
});
|
|
65
|
+
return res;
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
audit(runtime, 'rcv_detalle', 'failed', {
|
|
69
|
+
periodo: periodo.canonical,
|
|
70
|
+
side: args.side,
|
|
71
|
+
codigoTipoDoc: args.codigoTipoDoc,
|
|
72
|
+
});
|
|
73
|
+
throw e;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=rcv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rcv.js","sourceRoot":"","sources":["../../src/tasks/rcv.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@albertomarturelo/sii-core",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Shared SII domain core: rut, config (prod hostnames), contracts, tasks, seams. A Node library; external side-effects (portal, secrets, audit, clock) are injected via seams (ADR-003).",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/albertomarturelo/sii.git",
|
|
10
|
+
"directory": "packages/core"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"registry": "https://registry.npmjs.org",
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"default": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./cli": {
|
|
24
|
+
"types": "./dist/cli.d.ts",
|
|
25
|
+
"default": "./dist/cli.js"
|
|
26
|
+
},
|
|
27
|
+
"./node": {
|
|
28
|
+
"types": "./dist/node.d.ts",
|
|
29
|
+
"default": "./dist/node.js"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"sideEffects": false,
|
|
33
|
+
"files": [
|
|
34
|
+
"dist",
|
|
35
|
+
"CHANGELOG.md"
|
|
36
|
+
],
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"zod": "^4.4.3"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"playwright": "^1.49.0"
|
|
42
|
+
},
|
|
43
|
+
"peerDependenciesMeta": {
|
|
44
|
+
"playwright": {
|
|
45
|
+
"optional": true
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"playwright": "^1.49.0"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "tsc -b"
|
|
53
|
+
}
|
|
54
|
+
}
|