arcli 1.7.0 → 1.8.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 +37 -1
- package/README.md +55 -156
- package/dist/cli/commands/vouchers.command.js +4 -3
- package/dist/cli/commands/vouchers.command.js.map +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/interactive/config.flow.d.ts +1 -1
- package/dist/cli/interactive/config.flow.js +53 -18
- package/dist/cli/interactive/config.flow.js.map +1 -1
- package/dist/cli/interactive/history.flow.d.ts +4 -0
- package/dist/cli/interactive/history.flow.js +22 -8
- package/dist/cli/interactive/history.flow.js.map +1 -1
- package/dist/cli/interactive/interactive-mode.js +24 -10
- package/dist/cli/interactive/interactive-mode.js.map +1 -1
- package/dist/cli/interactive/invoice-picker.d.ts +25 -0
- package/dist/cli/interactive/invoice-picker.js +152 -0
- package/dist/cli/interactive/invoice-picker.js.map +1 -0
- package/dist/cli/interactive/note.flow.d.ts +6 -2
- package/dist/cli/interactive/note.flow.js +19 -30
- package/dist/cli/interactive/note.flow.js.map +1 -1
- package/dist/cli/interactive/prompts.d.ts +34 -5
- package/dist/cli/interactive/prompts.js +181 -19
- package/dist/cli/interactive/prompts.js.map +1 -1
- package/dist/cli/interactive/repeat.flow.js +5 -11
- package/dist/cli/interactive/repeat.flow.js.map +1 -1
- package/dist/cli/interactive/status.flow.d.ts +3 -0
- package/dist/cli/interactive/status.flow.js +29 -0
- package/dist/cli/interactive/status.flow.js.map +1 -0
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/modules/config/config-value-parser.d.ts +1 -1
- package/dist/modules/config/config-value-parser.js +10 -0
- package/dist/modules/config/config-value-parser.js.map +1 -1
- package/dist/modules/config/config.presenter.d.ts +4 -0
- package/dist/modules/config/config.presenter.js +57 -37
- package/dist/modules/config/config.presenter.js.map +1 -1
- package/dist/modules/config/config.schemas.d.ts +2 -0
- package/dist/modules/config/config.schemas.js +4 -0
- package/dist/modules/config/config.schemas.js.map +1 -1
- package/dist/modules/config/config.sections.d.ts +14 -0
- package/dist/modules/config/config.sections.js +61 -0
- package/dist/modules/config/config.sections.js.map +1 -0
- package/dist/modules/config/config.service.js +1 -0
- package/dist/modules/config/config.service.js.map +1 -1
- package/dist/modules/interactive/config-fields.d.ts +1 -3
- package/dist/modules/interactive/config-fields.js +36 -42
- package/dist/modules/interactive/config-fields.js.map +1 -1
- package/dist/modules/vouchers/voucher-history.d.ts +9 -4
- package/dist/modules/vouchers/voucher-history.js +8 -3
- package/dist/modules/vouchers/voucher-history.js.map +1 -1
- package/dist/modules/vouchers/voucher-history.presenter.d.ts +9 -2
- package/dist/modules/vouchers/voucher-history.presenter.js +32 -14
- package/dist/modules/vouchers/voucher-history.presenter.js.map +1 -1
- package/dist/ui/components/statusBar.d.ts +2 -0
- package/dist/ui/components/statusBar.js +5 -1
- package/dist/ui/components/statusBar.js.map +1 -1
- package/llms.txt +3 -3
- package/package.json +1 -1
- package/dist/cli/interactive/lookup.flow.d.ts +0 -5
- package/dist/cli/interactive/lookup.flow.js +0 -72
- package/dist/cli/interactive/lookup.flow.js.map +0 -1
|
@@ -6,9 +6,13 @@ import { UI_THEME } from '../theme/theme.js';
|
|
|
6
6
|
* Barra de una linea con el contexto de la sesion, como la barra de estado de un editor:
|
|
7
7
|
* `━━ TITULO ━━━━━━━━━━━━ estado ━━`. No es una caja: no compite con los paneles de contenido.
|
|
8
8
|
*/
|
|
9
|
+
/** Ancho de la barra de estado: el preset `wide`, o menos si la terminal es mas angosta. */
|
|
10
|
+
export function statusBarWidth() {
|
|
11
|
+
return fitToTerminal(UI_THEME.widths.wide.min);
|
|
12
|
+
}
|
|
9
13
|
export function statusBar(title, status, statusColor = 'info') {
|
|
10
14
|
const fill = usesAsciiBorders() ? '=' : '━';
|
|
11
|
-
const width =
|
|
15
|
+
const width = statusBarWidth();
|
|
12
16
|
const left = ` ${bold(title.toUpperCase())} `;
|
|
13
17
|
const right = ` ${colorize(status, statusColor)} `;
|
|
14
18
|
const used = 2 + stripAnsi(left).length + stripAnsi(right).length + 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statusBar.js","sourceRoot":"","sources":["../../../src/ui/components/statusBar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAoB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAc,EAAE,cAA2B,MAAM;IACxF,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"statusBar.js","sourceRoot":"","sources":["../../../src/ui/components/statusBar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAoB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;;GAGG;AACH,4FAA4F;AAC5F,MAAM,UAAU,cAAc;IAC5B,OAAO,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAc,EAAE,cAA2B,MAAM;IACxF,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;IAEzC,OAAO;QACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACjC,IAAI;QACJ,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QACtC,KAAK;QACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;KAClC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC"}
|
package/llms.txt
CHANGED
|
@@ -94,7 +94,6 @@ agentes, CI), nunca pregunta** — se comporta como si fuera dry-run salvo que s
|
|
|
94
94
|
"dia": 10,
|
|
95
95
|
"emitir": false,
|
|
96
96
|
"previsualizar": true,
|
|
97
|
-
"confirmarProduccion": false,
|
|
98
97
|
"comprobanteAsociado": { "atajo": "fc", "cuit": "20123456789", "numero": 10, "puntoVenta": 3 },
|
|
99
98
|
"pdf": true,
|
|
100
99
|
"descripcion": "Servicios de marzo",
|
|
@@ -158,7 +157,7 @@ arcli config establecer <clave> <valor>
|
|
|
158
157
|
arcli config eliminar <clave>
|
|
159
158
|
```
|
|
160
159
|
|
|
161
|
-
Claves válidas: `cuit`, `cbu`, `aliasCbu` (solo facturas FCE), `verificarFce`, `alicuota`, `puntoVenta`, `concepto`, `ivaReceptor`, `moneda`, `cotizacion`,
|
|
160
|
+
Claves válidas: `cuit`, `cbu`, `aliasCbu` (solo facturas FCE), `verificarFce`, `alicuota`, `puntoVenta`, `comprobantesPorLista` (1 a 50, por defecto 15), `concepto`, `ivaReceptor`, `moneda`, `cotizacion`,
|
|
162
161
|
`entorno` (`testing`/`produccion`), `emitir`, `json`, `bruto` (booleanos: `true/false`,
|
|
163
162
|
`si/no`, `1/0`), `cert.testing`, `cert.produccion`, `key.testing`, `key.produccion`
|
|
164
163
|
(rutas a archivos PEM, se validan al guardar), `ticketPath` (carpeta donde se cachea el
|
|
@@ -171,7 +170,7 @@ testing van a `testing/`), `pdfNavegador` (ruta a Chrome/Chromium/Edge), `emisor
|
|
|
171
170
|
|
|
172
171
|
## Otros comandos
|
|
173
172
|
|
|
174
|
-
- `arcli ultimos <tipo> [--cantidad N] [--pv N] [--json]`: últimos comprobantes emitidos (de 1 a 50
|
|
173
|
+
- `arcli ultimos <tipo> [--cantidad N] [--pv N] [--json]`: últimos comprobantes emitidos (de 1 a 50; por defecto `config.comprobantesPorLista` o 15), del más nuevo al más viejo. `tipo` es el atajo (`fb`, `nca`…).
|
|
175
174
|
- `arcli consultar <tipo> <numero> [--pv N] [--json]`: detalle de un comprobante emitido (CAE, vencimiento, importes, receptor). Si no existe, el error es `VOUCHER_NOT_FOUND`. Sirve para verificar después de emitir.
|
|
176
175
|
- `arcli pdf [estado|instalar|desinstalar] [--json]`: plugin que genera los PDFs. `arcli pdf instalar` lo descarga sin preguntar (sirve en scripts).
|
|
177
176
|
- `arcli estado [--json]`: si ARCA responde (servidores app/db/auth, latencia) y si el punto de venta configurado está habilitado. `listo: true` = se puede emitir. En testing ARCA no informa puntos de venta (`puntoVenta.estado: "sin-datos"`).
|
|
@@ -188,4 +187,5 @@ testing van a `testing/`), `pdfNavegador` (ruta a Chrome/Chromium/Edge), `emisor
|
|
|
188
187
|
- `docs/validation-rules.md` y `docs/input-output.md`: reglas de validación y formatos de entrada/salida.
|
|
189
188
|
- `docs/troubleshooting.md`: errores comunes de ARCA y como resolverlos.
|
|
190
189
|
- `docs/pdf.md`: PDF de comprobantes, plugin, carpeta y nombre del archivo.
|
|
190
|
+
- `docs/modo-interactivo.md`: asistente interactivo (un agente no debe usarlo).
|
|
191
191
|
- `AGENTS.md`: para agentes que van a modificar el código de este repo (no para usar el CLI).
|
package/package.json
CHANGED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { type InteractiveSession } from './session';
|
|
2
|
-
/** Consultar un comprobante por numero, de cualquier tipo. Propone el ultimo emitido. */
|
|
3
|
-
export declare function runLookupFlow(session: InteractiveSession): Promise<void>;
|
|
4
|
-
/** Estado de los servidores de ARCA, del punto de venta y la cotizacion oficial del dolar. */
|
|
5
|
-
export declare function runStatusFlow(session: InteractiveSession): Promise<void>;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { VOUCHER_KIND_MAP, VOUCHER_SHORTCUTS } from '../../modules/billing/voucher-kind-map.js';
|
|
2
|
-
import { BACK } from '../../modules/interactive/wizard.js';
|
|
3
|
-
import { formatQuotationAsText, formatStatusAsText } from '../../modules/parameters/parameters.presenter.js';
|
|
4
|
-
import { buildStatusReport } from '../../modules/parameters/status.js';
|
|
5
|
-
import { formatVoucherDetailAsText, formatVoucherNumber } from '../../modules/vouchers/voucher-history.presenter.js';
|
|
6
|
-
import { ArcaParametersGateway } from '../../services/arca/arca-parameters.gateway.js';
|
|
7
|
-
import { noticePanel, writeTerminalOutput } from '../../ui/index.js';
|
|
8
|
-
import { startSpinner } from '../spinner.js';
|
|
9
|
-
import { askTextStep, chooseStep } from './prompts.js';
|
|
10
|
-
import { requirePointOfSale } from './session.js';
|
|
11
|
-
async function withSpinner(text, run) {
|
|
12
|
-
const spinner = startSpinner(text);
|
|
13
|
-
try {
|
|
14
|
-
return await run();
|
|
15
|
-
}
|
|
16
|
-
finally {
|
|
17
|
-
spinner?.stop();
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
/** Consultar un comprobante por numero, de cualquier tipo. Propone el ultimo emitido. */
|
|
21
|
-
export async function runLookupFlow(session) {
|
|
22
|
-
const pointOfSale = requirePointOfSale(session);
|
|
23
|
-
if (!pointOfSale) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
const voucherKind = await chooseStep('¿Que tipo de comprobante?', VOUCHER_SHORTCUTS.map((shortcut) => ({
|
|
27
|
-
name: `${VOUCHER_KIND_MAP[shortcut].displayName} (${shortcut})`,
|
|
28
|
-
value: VOUCHER_KIND_MAP[shortcut],
|
|
29
|
-
})));
|
|
30
|
-
if (voucherKind === BACK) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const lastNumber = await withSpinner('Consultando ARCA...', () => session.historyGateway.getLastNumber(pointOfSale, voucherKind.arcaType));
|
|
34
|
-
if (lastNumber === 0) {
|
|
35
|
-
writeTerminalOutput(noticePanel(`No hay ${voucherKind.displayName} emitidas en el punto de venta ${pointOfSale}.`, 'muted'));
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
const answer = await askTextStep(`Numero (el ultimo es ${lastNumber}):`, {
|
|
39
|
-
defaultValue: String(lastNumber),
|
|
40
|
-
validate: (value) => {
|
|
41
|
-
const number = Number(value.trim());
|
|
42
|
-
return Number.isInteger(number) && number > 0 && number <= lastNumber
|
|
43
|
-
? true
|
|
44
|
-
: `Ingrese un numero entre 1 y ${lastNumber}.`;
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
if (answer === BACK) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const number = Number(answer.trim());
|
|
51
|
-
const voucher = await withSpinner('Consultando ARCA...', () => session.historyGateway.getVoucher(number, pointOfSale, voucherKind.arcaType));
|
|
52
|
-
if (!voucher) {
|
|
53
|
-
writeTerminalOutput(noticePanel(`No existe la ${voucherKind.displayName} N° ${formatVoucherNumber(pointOfSale, number)}.`, 'warning'));
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
writeTerminalOutput(formatVoucherDetailAsText({ environment: session.runtime.environment, pointOfSale, voucher, voucherKind }));
|
|
57
|
-
}
|
|
58
|
-
/** Estado de los servidores de ARCA, del punto de venta y la cotizacion oficial del dolar. */
|
|
59
|
-
export async function runStatusFlow(session) {
|
|
60
|
-
const gateway = new ArcaParametersGateway(session.arca);
|
|
61
|
-
const { environment, pointOfSale } = session.runtime;
|
|
62
|
-
const [report, quotation] = await withSpinner('Consultando ARCA...', () => Promise.all([
|
|
63
|
-
buildStatusReport({ environment, gateway, pointOfSale }),
|
|
64
|
-
// La cotizacion es un extra: si falla, el estado se muestra igual.
|
|
65
|
-
gateway.getQuotation('USD').catch(() => undefined),
|
|
66
|
-
]));
|
|
67
|
-
writeTerminalOutput(formatStatusAsText(report));
|
|
68
|
-
if (quotation) {
|
|
69
|
-
writeTerminalOutput(formatQuotationAsText(quotation, environment));
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=lookup.flow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lookup.flow.js","sourceRoot":"","sources":["../../../src/cli/interactive/lookup.flow.ts"],"names":[],"mappings":"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"}
|