arcli 1.4.0 → 1.6.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 (115) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/README.md +3 -1
  3. package/dist/cli/commands/billing.command.options.js +6 -0
  4. package/dist/cli/commands/billing.command.options.js.map +1 -1
  5. package/dist/cli/commands/billing.command.output.d.ts +2 -0
  6. package/dist/cli/commands/billing.command.output.js +15 -1
  7. package/dist/cli/commands/billing.command.output.js.map +1 -1
  8. package/dist/cli/commands/billing.command.parser.js +14 -0
  9. package/dist/cli/commands/billing.command.parser.js.map +1 -1
  10. package/dist/cli/commands/billing.command.pdf.d.ts +24 -0
  11. package/dist/cli/commands/billing.command.pdf.js +130 -0
  12. package/dist/cli/commands/billing.command.pdf.js.map +1 -0
  13. package/dist/cli/commands/billing.command.shared.js +14 -1
  14. package/dist/cli/commands/billing.command.shared.js.map +1 -1
  15. package/dist/cli/commands/config.command.js +6 -6
  16. package/dist/cli/commands/config.command.js.map +1 -1
  17. package/dist/cli/commands/parameters.command.d.ts +2 -0
  18. package/dist/cli/commands/parameters.command.js +88 -0
  19. package/dist/cli/commands/parameters.command.js.map +1 -0
  20. package/dist/cli/commands/pdf.command.d.ts +2 -0
  21. package/dist/cli/commands/pdf.command.js +78 -0
  22. package/dist/cli/commands/pdf.command.js.map +1 -0
  23. package/dist/cli/help.js +3 -0
  24. package/dist/cli/help.js.map +1 -1
  25. package/dist/cli/interactive/advanced-options.d.ts +6 -3
  26. package/dist/cli/interactive/advanced-options.js +85 -45
  27. package/dist/cli/interactive/advanced-options.js.map +1 -1
  28. package/dist/cli/interactive/invoice.flow.d.ts +0 -2
  29. package/dist/cli/interactive/invoice.flow.js +5 -22
  30. package/dist/cli/interactive/invoice.flow.js.map +1 -1
  31. package/dist/cli/interactive/pdf.flow.d.ts +5 -0
  32. package/dist/cli/interactive/pdf.flow.js +89 -0
  33. package/dist/cli/interactive/pdf.flow.js.map +1 -0
  34. package/dist/cli/interactive/prompts.d.ts +5 -0
  35. package/dist/cli/interactive/prompts.js +14 -0
  36. package/dist/cli/interactive/prompts.js.map +1 -1
  37. package/dist/cli/interactive/session.js +2 -0
  38. package/dist/cli/interactive/session.js.map +1 -1
  39. package/dist/cli/program.js +4 -0
  40. package/dist/cli/program.js.map +1 -1
  41. package/dist/cli/version.d.ts +1 -1
  42. package/dist/cli/version.js +1 -1
  43. package/dist/modules/billing/billing.schemas.d.ts +4 -0
  44. package/dist/modules/billing/billing.schemas.js +6 -0
  45. package/dist/modules/billing/billing.schemas.js.map +1 -1
  46. package/dist/modules/billing/billing.serialize.js +13 -0
  47. package/dist/modules/billing/billing.serialize.js.map +1 -1
  48. package/dist/modules/billing/billing.types.internal.d.ts +3 -0
  49. package/dist/modules/config/config-doctor.js +13 -0
  50. package/dist/modules/config/config-doctor.js.map +1 -1
  51. package/dist/modules/config/config-value-parser.d.ts +1 -1
  52. package/dist/modules/config/config-value-parser.js +41 -1
  53. package/dist/modules/config/config-value-parser.js.map +1 -1
  54. package/dist/modules/config/config.presenter.d.ts +6 -2
  55. package/dist/modules/config/config.presenter.js +25 -6
  56. package/dist/modules/config/config.presenter.js.map +1 -1
  57. package/dist/modules/config/config.schemas.d.ts +42 -0
  58. package/dist/modules/config/config.schemas.js +29 -0
  59. package/dist/modules/config/config.schemas.js.map +1 -1
  60. package/dist/modules/config/config.service.d.ts +8 -0
  61. package/dist/modules/config/config.service.js +21 -0
  62. package/dist/modules/config/config.service.js.map +1 -1
  63. package/dist/modules/examples/examples.js +1 -0
  64. package/dist/modules/examples/examples.js.map +1 -1
  65. package/dist/modules/parameters/parameters.d.ts +50 -0
  66. package/dist/modules/parameters/parameters.js +34 -0
  67. package/dist/modules/parameters/parameters.js.map +1 -0
  68. package/dist/modules/parameters/parameters.presenter.d.ts +12 -0
  69. package/dist/modules/parameters/parameters.presenter.js +103 -0
  70. package/dist/modules/parameters/parameters.presenter.js.map +1 -0
  71. package/dist/modules/parameters/status.d.ts +31 -0
  72. package/dist/modules/parameters/status.js +35 -0
  73. package/dist/modules/parameters/status.js.map +1 -0
  74. package/dist/modules/pdf/pdf-data.mapper.d.ts +4 -0
  75. package/dist/modules/pdf/pdf-data.mapper.js +117 -0
  76. package/dist/modules/pdf/pdf-data.mapper.js.map +1 -0
  77. package/dist/modules/pdf/pdf-decision.d.ts +14 -0
  78. package/dist/modules/pdf/pdf-decision.js +19 -0
  79. package/dist/modules/pdf/pdf-decision.js.map +1 -0
  80. package/dist/modules/pdf/pdf-file-name.d.ts +3 -0
  81. package/dist/modules/pdf/pdf-file-name.js +7 -0
  82. package/dist/modules/pdf/pdf-file-name.js.map +1 -0
  83. package/dist/modules/pdf/pdf-issuer.d.ts +8 -0
  84. package/dist/modules/pdf/pdf-issuer.js +43 -0
  85. package/dist/modules/pdf/pdf-issuer.js.map +1 -0
  86. package/dist/modules/pdf/pdf.errors.d.ts +10 -0
  87. package/dist/modules/pdf/pdf.errors.js +11 -0
  88. package/dist/modules/pdf/pdf.errors.js.map +1 -0
  89. package/dist/modules/pdf/pdf.types.d.ts +91 -0
  90. package/dist/modules/pdf/pdf.types.js +2 -0
  91. package/dist/modules/pdf/pdf.types.js.map +1 -0
  92. package/dist/modules/storybook/showcase.js +6 -2
  93. package/dist/modules/storybook/showcase.js.map +1 -1
  94. package/dist/services/arca/arca-parameters.gateway.d.ts +10 -0
  95. package/dist/services/arca/arca-parameters.gateway.js +71 -0
  96. package/dist/services/arca/arca-parameters.gateway.js.map +1 -0
  97. package/dist/services/pdf/pdf-browser.d.ts +5 -0
  98. package/dist/services/pdf/pdf-browser.js +54 -0
  99. package/dist/services/pdf/pdf-browser.js.map +1 -0
  100. package/dist/services/pdf/pdf-exporter.d.ts +19 -0
  101. package/dist/services/pdf/pdf-exporter.js +47 -0
  102. package/dist/services/pdf/pdf-exporter.js.map +1 -0
  103. package/dist/services/pdf/pdf-plugin.d.ts +50 -0
  104. package/dist/services/pdf/pdf-plugin.js +143 -0
  105. package/dist/services/pdf/pdf-plugin.js.map +1 -0
  106. package/dist/ui/presenters/errors.presenter.js +11 -0
  107. package/dist/ui/presenters/errors.presenter.js.map +1 -1
  108. package/dist/ui/presenters/index.d.ts +1 -0
  109. package/dist/ui/presenters/index.js +1 -0
  110. package/dist/ui/presenters/index.js.map +1 -1
  111. package/dist/ui/presenters/pdf.presenter.d.ts +13 -0
  112. package/dist/ui/presenters/pdf.presenter.js +46 -0
  113. package/dist/ui/presenters/pdf.presenter.js.map +1 -0
  114. package/llms.txt +19 -2
  115. package/package.json +2 -1
@@ -0,0 +1,143 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { createRequire } from 'node:module';
4
+ import { join } from 'node:path';
5
+ import { PDF_INSTALL_SUGGESTION, PdfError } from '../../modules/pdf/pdf.errors.js';
6
+ import { findDownloadedBrowser, findSystemBrowser } from './pdf-browser.js';
7
+ export const PDF_PLUGIN_PACKAGE = '@arcasdk/pdf';
8
+ /** Version probada con arcli. Se sube a mano despues de revisar los PDFs que genera. */
9
+ export const PDF_PLUGIN_VERSION = '0.2.1';
10
+ const runProcessWithSpawn = (command, args, options) => new Promise((resolve) => {
11
+ // En Windows npm es un .cmd y necesita shell.
12
+ const child = spawn(command, args, { cwd: options.cwd, env: options.env, shell: process.platform === 'win32' });
13
+ let output = '';
14
+ child.stdout.on('data', (chunk) => (output += chunk.toString()));
15
+ child.stderr.on('data', (chunk) => (output += chunk.toString()));
16
+ child.on('error', (error) => resolve({ code: 1, output: `${output}${error.message}` }));
17
+ child.on('close', (code) => resolve({ code, output }));
18
+ });
19
+ function lastLines(output, count = 5) {
20
+ return output.trim().split('\n').slice(-count).join('\n');
21
+ }
22
+ export class PdfPlugin {
23
+ options;
24
+ env;
25
+ findSystemBrowser;
26
+ runProcess;
27
+ constructor(options) {
28
+ this.options = options;
29
+ this.env = options.env ?? process.env;
30
+ this.findSystemBrowser = options.findSystemBrowser ?? (() => findSystemBrowser());
31
+ this.runProcess = options.runProcess ?? runProcessWithSpawn;
32
+ }
33
+ get browsersPath() {
34
+ return join(this.options.path, 'browsers');
35
+ }
36
+ readInstalledVersion() {
37
+ const manifest = join(this.options.path, 'node_modules', ...PDF_PLUGIN_PACKAGE.split('/'), 'package.json');
38
+ if (!existsSync(manifest)) {
39
+ return undefined;
40
+ }
41
+ return JSON.parse(readFileSync(manifest, 'utf8')).version;
42
+ }
43
+ /** Orden: config, variable de entorno de Puppeteer, navegador del sistema y, por ultimo, el descargado. */
44
+ resolveBrowser() {
45
+ if (this.options.configuredBrowser) {
46
+ return { path: this.options.configuredBrowser, source: 'config' };
47
+ }
48
+ if (this.env.PUPPETEER_EXECUTABLE_PATH) {
49
+ return { path: this.env.PUPPETEER_EXECUTABLE_PATH, source: 'entorno' };
50
+ }
51
+ const system = this.findSystemBrowser();
52
+ if (system) {
53
+ return { path: system, source: 'sistema' };
54
+ }
55
+ const downloaded = findDownloadedBrowser(this.browsersPath);
56
+ return downloaded ? { path: downloaded, source: 'descargado' } : undefined;
57
+ }
58
+ getStatus() {
59
+ const installedVersion = this.readInstalledVersion();
60
+ const browser = this.resolveBrowser();
61
+ return {
62
+ browser: browser?.path,
63
+ browserSource: browser?.source,
64
+ installed: installedVersion === PDF_PLUGIN_VERSION && Boolean(browser),
65
+ installedVersion,
66
+ path: this.options.path,
67
+ version: PDF_PLUGIN_VERSION,
68
+ };
69
+ }
70
+ /** Instala el paquete y, si no hay un navegador para usar, descarga chrome-headless-shell. */
71
+ async install(onStep = () => undefined) {
72
+ mkdirSync(this.options.path, { recursive: true });
73
+ const manifest = join(this.options.path, 'package.json');
74
+ if (!existsSync(manifest)) {
75
+ writeFileSync(manifest, `${JSON.stringify({ description: 'Plugin de PDF de arcli', private: true }, null, 2)}\n`);
76
+ }
77
+ if (this.readInstalledVersion() !== PDF_PLUGIN_VERSION) {
78
+ onStep(`Descargando ${PDF_PLUGIN_PACKAGE}@${PDF_PLUGIN_VERSION}...`);
79
+ // --ignore-scripts: npm 12 ya los bloquea; asi se comporta igual con cualquier version y el navegador lo
80
+ // resolvemos nosotros.
81
+ const result = await this.runProcess(process.platform === 'win32' ? 'npm.cmd' : 'npm', [
82
+ 'install',
83
+ `${PDF_PLUGIN_PACKAGE}@${PDF_PLUGIN_VERSION}`,
84
+ '--omit=dev',
85
+ '--ignore-scripts',
86
+ '--no-audit',
87
+ '--no-fund',
88
+ '--save-exact',
89
+ ], { cwd: this.options.path, env: this.env });
90
+ if (result.code !== 0) {
91
+ throw new PdfError('PDF_PLUGIN_INSTALL_ERROR', `npm no pudo instalar ${PDF_PLUGIN_PACKAGE}.`, {
92
+ details: { salida: lastLines(result.output) },
93
+ suggestion: 'Revise la conexion a internet o el proxy de npm y vuelva a correr `arcli pdf instalar`.',
94
+ });
95
+ }
96
+ }
97
+ if (!this.resolveBrowser()) {
98
+ onStep('Descargando el navegador para generar PDFs (unos 200 MB)...');
99
+ const require = createRequire(join(this.options.path, 'package.json'));
100
+ const puppeteerCli = join(require.resolve('puppeteer/package.json'), '..', 'lib', 'puppeteer', 'node', 'cli.js');
101
+ const result = await this.runProcess(process.execPath, [puppeteerCli, 'browsers', 'install', 'chrome-headless-shell'], { cwd: this.options.path, env: { ...this.env, PUPPETEER_CACHE_DIR: this.browsersPath } });
102
+ if (result.code !== 0 || !findDownloadedBrowser(this.browsersPath)) {
103
+ throw new PdfError('PDF_PLUGIN_INSTALL_ERROR', 'No se pudo descargar el navegador para generar PDFs.', {
104
+ details: { salida: lastLines(result.output) },
105
+ suggestion: 'Si ya tiene Chrome, Chromium o Edge, indique su ruta con `arcli config establecer pdfNavegador <ruta>`.',
106
+ });
107
+ }
108
+ }
109
+ return this.getStatus();
110
+ }
111
+ uninstall() {
112
+ rmSync(this.options.path, { force: true, recursive: true });
113
+ }
114
+ load() {
115
+ const installedVersion = this.readInstalledVersion();
116
+ if (installedVersion !== PDF_PLUGIN_VERSION) {
117
+ throw new PdfError('PDF_PLUGIN_MISSING', installedVersion
118
+ ? `El plugin de PDF esta en la version ${installedVersion} y arcli usa la ${PDF_PLUGIN_VERSION}.`
119
+ : 'Para generar PDFs falta instalar el plugin de PDF.', { suggestion: PDF_INSTALL_SUGGESTION });
120
+ }
121
+ const browser = this.resolveBrowser();
122
+ if (!browser) {
123
+ throw new PdfError('PDF_PLUGIN_MISSING', 'No se encontro un navegador para generar PDFs.', {
124
+ suggestion: `${PDF_INSTALL_SUGGESTION} Descarga uno, o indique Chrome con \`arcli config establecer pdfNavegador <ruta>\`.`,
125
+ });
126
+ }
127
+ // El SDK no deja elegir el ejecutable; Puppeteer lo toma de esta variable.
128
+ process.env.PUPPETEER_EXECUTABLE_PATH = browser.path;
129
+ const require = createRequire(join(this.options.path, 'package.json'));
130
+ const sdk = require(PDF_PLUGIN_PACKAGE);
131
+ return {
132
+ render: async (data, options) => {
133
+ try {
134
+ return await new sdk.InvoicePdfGenerator(options).generate(data);
135
+ }
136
+ catch (error) {
137
+ throw new PdfError('PDF_GENERATION_ERROR', `No se pudo generar el PDF: ${error instanceof Error ? error.message : String(error)}`, { suggestion: 'Si el navegador falla, pruebe con otro: `arcli config establecer pdfNavegador <ruta>`.' });
138
+ }
139
+ },
140
+ };
141
+ }
142
+ }
143
+ //# sourceMappingURL=pdf-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-plugin.js","sourceRoot":"","sources":["../../../src/services/pdf/pdf-plugin.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { ZodError } from 'zod';
2
2
  import { AppError } from '../../lib/errors/app-error.js';
3
+ import { PdfError } from '../../modules/pdf/pdf.errors.js';
3
4
  import { errorPanel } from '../components/errorPanel.js';
4
5
  import { renderJson } from '../primitives/renderJson.js';
5
6
  import { bold } from '../primitives/text.js';
@@ -14,11 +15,20 @@ function formatErrorTitle(code) {
14
15
  return 'Lote invalido';
15
16
  case 'BATCH_EMISSION_ERROR':
16
17
  return 'Lote interrumpido';
18
+ case 'PDF_GENERATION_ERROR':
19
+ case 'PDF_ISSUER_INCOMPLETE':
20
+ case 'PDF_PLUGIN_MISSING':
21
+ return 'PDF no generado';
22
+ case 'PDF_PLUGIN_INSTALL_ERROR':
23
+ return 'Plugin de PDF no instalado';
17
24
  default:
18
25
  return 'Error';
19
26
  }
20
27
  }
21
28
  function formatErrorHint(error) {
29
+ if (error instanceof PdfError && error.suggestion) {
30
+ return error.suggestion;
31
+ }
22
32
  switch (error.code) {
23
33
  case 'CONFIGURATION_ERROR':
24
34
  return 'Revise la configuracion con `arcli config` o corra `arcli config revisar`.';
@@ -78,6 +88,7 @@ export function formatCliError(error, useJson) {
78
88
  codigo: error.code,
79
89
  detalles: formatErrorDetailsAsJson(error.details),
80
90
  error: error.message,
91
+ ...(error instanceof PdfError && error.suggestion ? { sugerencia: error.suggestion } : {}),
81
92
  });
82
93
  }
83
94
  const details = formatErrorDetails(error.details);
@@ -1 +1 @@
1
- {"version":3,"file":"errors.presenter.js","sourceRoot":"","sources":["../../../src/ui/presenters/errors.presenter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.presenter.js","sourceRoot":"","sources":["../../../src/ui/presenters/errors.presenter.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,5 @@ export * from './billing.presenter';
2
2
  export * from './config.presenter';
3
3
  export * from './errors.presenter';
4
4
  export { summarizeZodError } from './errors.zod-presenter';
5
+ export * from './pdf.presenter';
5
6
  export * from './showcase.presenter';
@@ -2,5 +2,6 @@ export * from './billing.presenter.js';
2
2
  export * from './config.presenter.js';
3
3
  export * from './errors.presenter.js';
4
4
  export { summarizeZodError } from './errors.zod-presenter.js';
5
+ export * from './pdf.presenter.js';
5
6
  export * from './showcase.presenter.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/presenters/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/presenters/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { PdfOutcome } from '../../modules/pdf/pdf.types';
2
+ /** Texto que sigue al comprobante emitido: la ruta del PDF o por que no se genero. */
3
+ export declare function formatPdfOutcomeAsText(outcome: PdfOutcome, label?: string): string;
4
+ export interface PdfPluginStatusView {
5
+ readonly browser?: string;
6
+ readonly browserSource?: 'config' | 'descargado' | 'entorno' | 'sistema';
7
+ readonly installed: boolean;
8
+ readonly installedVersion?: string;
9
+ readonly path: string;
10
+ readonly version: string;
11
+ }
12
+ export declare function formatPdfPluginStatusAsJson(status: PdfPluginStatusView): string;
13
+ export declare function formatPdfPluginStatusAsText(status: PdfPluginStatusView, title?: string): string;
@@ -0,0 +1,46 @@
1
+ import { maskPath } from '../../lib/paths/mask-path.js';
2
+ import { errorPanel } from '../components/errorPanel.js';
3
+ import { keyValuePanel } from '../components/keyValuePanel.js';
4
+ import { noticePanel } from '../components/noticePanel.js';
5
+ import { renderKeyValueRows, resolveKeyValueLabelWidth } from '../primitives/renderKeyValue.js';
6
+ /** Texto que sigue al comprobante emitido: la ruta del PDF o por que no se genero. */
7
+ export function formatPdfOutcomeAsText(outcome, label) {
8
+ const prefix = label ? `${label}: ` : '';
9
+ if ('path' in outcome) {
10
+ return noticePanel(`${prefix}PDF guardado en ${outcome.path}`, 'success');
11
+ }
12
+ const hint = ['El comprobante ya esta emitido: solo falto el PDF.', outcome.error.suggestion]
13
+ .filter(Boolean)
14
+ .join('\n');
15
+ return errorPanel(`${prefix}PDF no generado`, outcome.error.message, [], hint);
16
+ }
17
+ const BROWSER_SOURCE_LABELS = {
18
+ config: 'pdfNavegador (config)',
19
+ descargado: 'descargado por arcli',
20
+ entorno: 'PUPPETEER_EXECUTABLE_PATH',
21
+ sistema: 'instalado en el sistema',
22
+ };
23
+ export function formatPdfPluginStatusAsJson(status) {
24
+ return JSON.stringify({
25
+ instalado: status.installed,
26
+ navegador: status.browser ?? null,
27
+ origenNavegador: status.browserSource ?? null,
28
+ ruta: status.path,
29
+ version: status.version,
30
+ versionInstalada: status.installedVersion ?? null,
31
+ }, null, 2);
32
+ }
33
+ export function formatPdfPluginStatusAsText(status, title = 'Plugin de PDF') {
34
+ const rows = [
35
+ ['Estado', status.installed ? 'instalado' : 'no instalado'],
36
+ ['Version', status.installedVersion ?? `no instalada (arcli usa la ${status.version})`],
37
+ [
38
+ 'Navegador',
39
+ status.browser ? `${status.browser} (${BROWSER_SOURCE_LABELS[status.browserSource ?? 'sistema']})` : 'ninguno',
40
+ ],
41
+ ['Carpeta', maskPath(status.path)],
42
+ ];
43
+ const footer = status.installed ? 'Listo para generar PDFs' : 'Instalelo con `arcli pdf instalar`';
44
+ return keyValuePanel(title, renderKeyValueRows(rows, { labelWidth: resolveKeyValueLabelWidth('standard', rows, [25, 75]) }), footer, 'standard', status.installed ? 'success' : 'warning', 'sheet');
45
+ }
46
+ //# sourceMappingURL=pdf.presenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.presenter.js","sourceRoot":"","sources":["../../../src/ui/presenters/pdf.presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE7F,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,OAAmB,EAAE,KAAc;IACxE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzC,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,GAAG,MAAM,mBAAmB,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,oDAAoD,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;SAC1F,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,UAAU,CAAC,GAAG,MAAM,iBAAiB,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;AACjF,CAAC;AAWD,MAAM,qBAAqB,GAAsE;IAC/F,MAAM,EAAE,uBAAuB;IAC/B,UAAU,EAAE,sBAAsB;IAClC,OAAO,EAAE,2BAA2B;IACpC,OAAO,EAAE,yBAAyB;CACnC,CAAC;AAEF,MAAM,UAAU,2BAA2B,CAAC,MAA2B;IACrE,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;QACjC,eAAe,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;QAC7C,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI;KAClD,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAA2B,EAAE,KAAK,GAAG,eAAe;IAC9F,MAAM,IAAI,GAAqC;QAC7C,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;QAC3D,CAAC,SAAS,EAAE,MAAM,CAAC,gBAAgB,IAAI,8BAA8B,MAAM,CAAC,OAAO,GAAG,CAAC;QACvF;YACE,WAAW;YACX,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,KAAK,qBAAqB,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;SAC/G;QACD,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KACnC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,oCAAoC,CAAC;IAEnG,OAAO,aAAa,CAClB,KAAK,EACL,kBAAkB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,yBAAyB,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAC/F,MAAM,EACN,UAAU,EACV,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACxC,OAAO,CACR,CAAC;AACJ,CAAC"}
package/llms.txt CHANGED
@@ -66,6 +66,7 @@ Shortcuts (`family` = comando alternativo `arcli <family> <letra>`, ej. `arcli f
66
66
  - Ejecución: `--previsualizar` (default si no se especifica nada) vs `--emitir` (real contra ARCA) — son mutuamente excluyentes. En producción hace falta `--produccion --emitir` juntos — no hay un flag de confirmación adicional, así que esa combinación emite de verdad.
67
67
  - Salida: `--json` (estructurada, para scripts/agentes — desactiva el aviso de nueva versión), `--bruto` (incluye la respuesta cruda de ARCA).
68
68
  - `--cargar <path.json>`: carga uno o un array de comprobantes desde un JSON en vez de flags (ver forma abajo). Los flags pisan lo que venga del archivo.
69
+ - PDF: `--exportar-pdf` (alias `--pdf`) genera el PDF con QR después de emitir; `--sin-pdf` no lo genera; sin flag decide `config pdf` (`preguntar` por defecto, que sin TTY o con `--json` no genera). Datos que solo van en el PDF (ARCA no los recibe): `--descripcion <texto>`, `--receptor-nombre <texto>`, `--receptor-domicilio <texto>`. Requiere el plugin (`arcli pdf instalar`, ~160 MB; desde un agente instalarlo antes, porque sin TTY nunca se descarga solo) y `emisor.razonSocial`, `emisor.domicilio`, `emisor.inicioActividades` en la config. Detalle: `docs/pdf.md`.
69
70
 
70
71
  ## Modo no interactivo
71
72
 
@@ -94,7 +95,11 @@ agentes, CI), nunca pregunta** — se comporta como si fuera dry-run salvo que s
94
95
  "emitir": false,
95
96
  "previsualizar": true,
96
97
  "confirmarProduccion": false,
97
- "comprobanteAsociado": { "atajo": "fc", "cuit": "20123456789", "numero": 10, "puntoVenta": 3 }
98
+ "comprobanteAsociado": { "atajo": "fc", "cuit": "20123456789", "numero": 10, "puntoVenta": 3 },
99
+ "pdf": true,
100
+ "descripcion": "Servicios de marzo",
101
+ "receptorNombre": "Cliente SA",
102
+ "receptorDomicilio": "Calle 1"
98
103
  }
99
104
  ```
100
105
 
@@ -115,10 +120,15 @@ agentes, CI), nunca pregunta** — se comporta como si fuera dry-run salvo que s
115
120
  "observacion": "string | null",
116
121
  "solicitud": { "...": "payload enviado a ARCA" },
117
122
  "previsualizacion": true,
118
- "sugerencias": ["texto en español sugiriendo como resolver errores comunes de ARCA"]
123
+ "sugerencias": ["texto en español sugiriendo como resolver errores comunes de ARCA"],
124
+ "pdf": { "ruta": "/ruta/al/archivo.pdf" }
119
125
  }
120
126
  ```
121
127
 
128
+ `pdf` aparece solo si se intentó generar el PDF. Si falló es `{ "error": { "codigo", "mensaje", "sugerencia" } }`
129
+ (`PDF_PLUGIN_MISSING`, `PDF_PLUGIN_INSTALL_ERROR`, `PDF_ISSUER_INCOMPLETE`, `PDF_GENERATION_ERROR`) y el exit code
130
+ sigue siendo `0`: el comprobante ya está emitido, **no reemitir para obtener el PDF**.
131
+
122
132
  Con múltiples comprobantes (batch o `--cargar` con array) la salida es un array de estos
123
133
  objetos. Con `--bruto` se agrega `respuesta` con la respuesta cruda del SDK.
124
134
 
@@ -153,6 +163,9 @@ Claves válidas: `cuit`, `cbu`, `aliasCbu` (solo facturas FCE), `verificarFce`,
153
163
  `si/no`, `1/0`), `cert.testing`, `cert.produccion`, `key.testing`, `key.produccion`
154
164
  (rutas a archivos PEM, se validan al guardar), `ticketPath` (carpeta donde se cachea el
155
165
  ticket WSAA; por defecto una carpeta junto al archivo de config).
166
+ Para el PDF: `pdf` (`siempre`/`preguntar`/`nunca`), `pdfCarpeta` (por defecto `~/arcli/comprobantes`; los de
167
+ testing van a `testing/`), `pdfNavegador` (ruta a Chrome/Chromium/Edge), `emisor.razonSocial`, `emisor.domicilio`,
168
+ `emisor.inicioActividades` (fecha con año), `emisor.iibb`, `emisor.condicionIva`, `emisor.logo` (PNG o JPG).
156
169
 
157
170
  `config revisar` también avisa si un certificado ya venció o vence en menos de 30 días.
158
171
 
@@ -160,6 +173,9 @@ ticket WSAA; por defecto una carpeta junto al archivo de config).
160
173
 
161
174
  - `arcli ultimos <tipo> [--cantidad N] [--pv N] [--json]`: últimos comprobantes emitidos (de 1 a 50, por defecto 10), del más nuevo al más viejo. `tipo` es el atajo (`fb`, `nca`…).
162
175
  - `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
+ - `arcli pdf [estado|instalar|desinstalar] [--json]`: plugin que genera los PDFs. `arcli pdf instalar` lo descarga sin preguntar (sirve en scripts).
177
+ - `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"`).
178
+ - `arcli parametros [tabla] [--json]`: tablas de ARCA vigentes: `puntos-venta`, `comprobantes`, `documentos`, `alicuotas`, `iva-receptor`, `monedas`, `conceptos`, `opcionales`, `tributos`. `arcli parametros cotizacion USD` da la cotización oficial (`{moneda, cotizacion, fecha}`).
163
179
  - `arcli ejemplos`: comandos listos para copiar por cada tipo de comprobante.
164
180
  - `arcli storybook [escena]`: demos visuales de la UI (sin llamar a ARCA).
165
181
  - `arcli <cualquier comando> ayuda` o `--ayuda`: ayuda contextual con ejemplos (nota: el flag
@@ -171,4 +187,5 @@ ticket WSAA; por defecto una carpeta junto al archivo de config).
171
187
  - `docs/configuration.md`: config persistente, claves soportadas, ticketPath.
172
188
  - `docs/validation-rules.md` y `docs/input-output.md`: reglas de validación y formatos de entrada/salida.
173
189
  - `docs/troubleshooting.md`: errores comunes de ARCA y como resolverlos.
190
+ - `docs/pdf.md`: PDF de comprobantes, plugin, carpeta y nombre del archivo.
174
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,6 +1,6 @@
1
1
  {
2
2
  "name": "arcli",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "CLI para previsualizar y emitir comprobantes ARCA desde terminal, con validaciones claras y salida lista para automatizar",
5
5
  "keywords": [
6
6
  "arca",
@@ -72,6 +72,7 @@
72
72
  },
73
73
  "dependencies": {
74
74
  "@arcasdk/core": "2.0.2",
75
+ "@inquirer/checkbox": "5.2.6",
75
76
  "@inquirer/input": "5.1.6",
76
77
  "@inquirer/select": "5.2.5",
77
78
  "big.js": "7.0.1",