arcli 1.8.0 → 2.1.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 (280) hide show
  1. package/CHANGELOG.md +110 -1
  2. package/README.md +17 -16
  3. package/dist/cli/arca-runtime.d.ts +20 -0
  4. package/dist/cli/arca-runtime.js +42 -0
  5. package/dist/cli/arca-runtime.js.map +1 -0
  6. package/dist/cli/commands/billing.command.batch.d.ts +15 -5
  7. package/dist/cli/commands/billing.command.batch.js +28 -11
  8. package/dist/cli/commands/billing.command.batch.js.map +1 -1
  9. package/dist/cli/commands/billing.command.interactive-preview.js +4 -1
  10. package/dist/cli/commands/billing.command.interactive-preview.js.map +1 -1
  11. package/dist/cli/commands/billing.command.options.js +18 -16
  12. package/dist/cli/commands/billing.command.options.js.map +1 -1
  13. package/dist/cli/commands/billing.command.output.d.ts +4 -0
  14. package/dist/cli/commands/billing.command.output.js +3 -2
  15. package/dist/cli/commands/billing.command.output.js.map +1 -1
  16. package/dist/cli/commands/billing.command.parser.d.ts +7 -0
  17. package/dist/cli/commands/billing.command.parser.js +85 -43
  18. package/dist/cli/commands/billing.command.parser.js.map +1 -1
  19. package/dist/cli/commands/billing.command.pdf.d.ts +1 -1
  20. package/dist/cli/commands/billing.command.pdf.js +17 -2
  21. package/dist/cli/commands/billing.command.pdf.js.map +1 -1
  22. package/dist/cli/commands/billing.command.shared.d.ts +22 -3
  23. package/dist/cli/commands/billing.command.shared.js +84 -47
  24. package/dist/cli/commands/billing.command.shared.js.map +1 -1
  25. package/dist/cli/commands/config.command.d.ts +3 -4
  26. package/dist/cli/commands/config.command.js +43 -41
  27. package/dist/cli/commands/config.command.js.map +1 -1
  28. package/dist/cli/commands/cuit-argument.d.ts +2 -0
  29. package/dist/cli/commands/cuit-argument.js +10 -0
  30. package/dist/cli/commands/cuit-argument.js.map +1 -0
  31. package/dist/cli/commands/fce-obligation.command.js +6 -13
  32. package/dist/cli/commands/fce-obligation.command.js.map +1 -1
  33. package/dist/cli/commands/interactive.command.js +8 -6
  34. package/dist/cli/commands/interactive.command.js.map +1 -1
  35. package/dist/cli/commands/padron.command.d.ts +2 -0
  36. package/dist/cli/commands/padron.command.js +47 -0
  37. package/dist/cli/commands/padron.command.js.map +1 -0
  38. package/dist/cli/commands/parameters.command.js +8 -7
  39. package/dist/cli/commands/parameters.command.js.map +1 -1
  40. package/dist/cli/commands/pdf.command.js +17 -30
  41. package/dist/cli/commands/pdf.command.js.map +1 -1
  42. package/dist/cli/commands/vouchers.command.js +9 -9
  43. package/dist/cli/commands/vouchers.command.js.map +1 -1
  44. package/dist/cli/error-output.d.ts +25 -0
  45. package/dist/cli/error-output.js +86 -0
  46. package/dist/cli/error-output.js.map +1 -0
  47. package/dist/cli/global-options.d.ts +26 -0
  48. package/dist/cli/global-options.js +56 -0
  49. package/dist/cli/global-options.js.map +1 -0
  50. package/dist/cli/help-argv.d.ts +5 -0
  51. package/dist/cli/help-argv.js +21 -0
  52. package/dist/cli/help-argv.js.map +1 -0
  53. package/dist/cli/help.d.ts +2 -0
  54. package/dist/cli/help.js +78 -31
  55. package/dist/cli/help.js.map +1 -1
  56. package/dist/cli/ignored-global-options.d.ts +6 -0
  57. package/dist/cli/ignored-global-options.js +33 -0
  58. package/dist/cli/ignored-global-options.js.map +1 -0
  59. package/dist/cli/index.js +16 -26
  60. package/dist/cli/index.js.map +1 -1
  61. package/dist/cli/interactive/advanced-options.js +2 -2
  62. package/dist/cli/interactive/advanced-options.js.map +1 -1
  63. package/dist/cli/interactive/config.flow.d.ts +1 -2
  64. package/dist/cli/interactive/config.flow.js +4 -3
  65. package/dist/cli/interactive/config.flow.js.map +1 -1
  66. package/dist/cli/interactive/interactive-mode.js +108 -9
  67. package/dist/cli/interactive/interactive-mode.js.map +1 -1
  68. package/dist/cli/interactive/invoice-picker.js +3 -2
  69. package/dist/cli/interactive/invoice-picker.js.map +1 -1
  70. package/dist/cli/interactive/invoice.flow.d.ts +2 -0
  71. package/dist/cli/interactive/invoice.flow.js +4 -3
  72. package/dist/cli/interactive/invoice.flow.js.map +1 -1
  73. package/dist/cli/interactive/note.flow.d.ts +4 -0
  74. package/dist/cli/interactive/note.flow.js +25 -11
  75. package/dist/cli/interactive/note.flow.js.map +1 -1
  76. package/dist/cli/interactive/pdf.flow.js +33 -22
  77. package/dist/cli/interactive/pdf.flow.js.map +1 -1
  78. package/dist/cli/interactive/prompts.d.ts +3 -1
  79. package/dist/cli/interactive/prompts.js +8 -4
  80. package/dist/cli/interactive/prompts.js.map +1 -1
  81. package/dist/cli/interactive/receiver-padron.d.ts +29 -0
  82. package/dist/cli/interactive/receiver-padron.js +53 -0
  83. package/dist/cli/interactive/receiver-padron.js.map +1 -0
  84. package/dist/cli/interactive/repeat.flow.js +25 -10
  85. package/dist/cli/interactive/repeat.flow.js.map +1 -1
  86. package/dist/cli/interactive/session.js +4 -1
  87. package/dist/cli/interactive/session.js.map +1 -1
  88. package/dist/cli/interactive/update.flow.d.ts +6 -0
  89. package/dist/cli/interactive/update.flow.js +26 -0
  90. package/dist/cli/interactive/update.flow.js.map +1 -0
  91. package/dist/cli/interactive/validators.js +8 -4
  92. package/dist/cli/interactive/validators.js.map +1 -1
  93. package/dist/cli/option-parsers.d.ts +6 -0
  94. package/dist/cli/option-parsers.js +34 -0
  95. package/dist/cli/option-parsers.js.map +1 -0
  96. package/dist/cli/program.d.ts +5 -1
  97. package/dist/cli/program.js +8 -2
  98. package/dist/cli/program.js.map +1 -1
  99. package/dist/cli/version.d.ts +1 -1
  100. package/dist/cli/version.js +1 -1
  101. package/dist/lib/dates/arca-date.d.ts +13 -0
  102. package/dist/lib/dates/arca-date.js +28 -11
  103. package/dist/lib/dates/arca-date.js.map +1 -1
  104. package/dist/lib/errors/app-error.d.ts +4 -1
  105. package/dist/lib/errors/app-error.js +5 -1
  106. package/dist/lib/errors/app-error.js.map +1 -1
  107. package/dist/lib/files/restrict-to-owner.d.ts +7 -0
  108. package/dist/lib/files/restrict-to-owner.js +19 -0
  109. package/dist/lib/files/restrict-to-owner.js.map +1 -0
  110. package/dist/lib/files/write-new-file.d.ts +5 -0
  111. package/dist/lib/files/write-new-file.js +30 -0
  112. package/dist/lib/files/write-new-file.js.map +1 -0
  113. package/dist/lib/identity/format-cuit.d.ts +2 -0
  114. package/dist/lib/identity/format-cuit.js +6 -0
  115. package/dist/lib/identity/format-cuit.js.map +1 -0
  116. package/dist/lib/links.d.ts +2 -0
  117. package/dist/lib/links.js +2 -0
  118. package/dist/lib/links.js.map +1 -1
  119. package/dist/lib/numbers/argentine-amount.d.ts +23 -0
  120. package/dist/lib/numbers/argentine-amount.js +37 -0
  121. package/dist/lib/numbers/argentine-amount.js.map +1 -0
  122. package/dist/lib/numbers/strict-integer.d.ts +4 -0
  123. package/dist/lib/numbers/strict-integer.js +10 -0
  124. package/dist/lib/numbers/strict-integer.js.map +1 -0
  125. package/dist/lib/security/certificate.d.ts +5 -1
  126. package/dist/lib/security/certificate.js +10 -7
  127. package/dist/lib/security/certificate.js.map +1 -1
  128. package/dist/lib/security/pem.js +5 -1
  129. package/dist/lib/security/pem.js.map +1 -1
  130. package/dist/modules/billing/billing-response.js +15 -2
  131. package/dist/modules/billing/billing-response.js.map +1 -1
  132. package/dist/modules/billing/billing.amounts.d.ts +2 -0
  133. package/dist/modules/billing/billing.amounts.js +6 -3
  134. package/dist/modules/billing/billing.amounts.js.map +1 -1
  135. package/dist/modules/billing/billing.associated-vouchers.js +14 -3
  136. package/dist/modules/billing/billing.associated-vouchers.js.map +1 -1
  137. package/dist/modules/billing/billing.batch.js +13 -1
  138. package/dist/modules/billing/billing.batch.js.map +1 -1
  139. package/dist/modules/billing/billing.date-range.js +31 -9
  140. package/dist/modules/billing/billing.date-range.js.map +1 -1
  141. package/dist/modules/billing/billing.display.js +9 -5
  142. package/dist/modules/billing/billing.display.js.map +1 -1
  143. package/dist/modules/billing/billing.errors.d.ts +12 -0
  144. package/dist/modules/billing/billing.errors.js +18 -0
  145. package/dist/modules/billing/billing.errors.js.map +1 -0
  146. package/dist/modules/billing/billing.json-input.d.ts +58 -0
  147. package/dist/modules/billing/billing.json-input.js +279 -0
  148. package/dist/modules/billing/billing.json-input.js.map +1 -0
  149. package/dist/modules/billing/billing.padron.d.ts +14 -0
  150. package/dist/modules/billing/billing.padron.js +55 -0
  151. package/dist/modules/billing/billing.padron.js.map +1 -0
  152. package/dist/modules/billing/billing.schemas.d.ts +5 -0
  153. package/dist/modules/billing/billing.schemas.js +19 -5
  154. package/dist/modules/billing/billing.schemas.js.map +1 -1
  155. package/dist/modules/billing/billing.serialize.d.ts +1 -0
  156. package/dist/modules/billing/billing.serialize.js +5 -12
  157. package/dist/modules/billing/billing.serialize.js.map +1 -1
  158. package/dist/modules/billing/billing.service.d.ts +3 -0
  159. package/dist/modules/billing/billing.service.js +31 -3
  160. package/dist/modules/billing/billing.service.js.map +1 -1
  161. package/dist/modules/billing/billing.text.js +4 -12
  162. package/dist/modules/billing/billing.text.js.map +1 -1
  163. package/dist/modules/billing/billing.types.internal.d.ts +10 -2
  164. package/dist/modules/billing/billing.validation.js +4 -0
  165. package/dist/modules/billing/billing.validation.js.map +1 -1
  166. package/dist/modules/config/certificate-expiry.d.ts +42 -0
  167. package/dist/modules/config/certificate-expiry.js +91 -0
  168. package/dist/modules/config/certificate-expiry.js.map +1 -0
  169. package/dist/modules/config/config-doctor.d.ts +5 -4
  170. package/dist/modules/config/config-doctor.js +8 -16
  171. package/dist/modules/config/config-doctor.js.map +1 -1
  172. package/dist/modules/config/config-value-parser.d.ts +1 -1
  173. package/dist/modules/config/config-value-parser.js +24 -20
  174. package/dist/modules/config/config-value-parser.js.map +1 -1
  175. package/dist/modules/config/config.presenter.d.ts +2 -0
  176. package/dist/modules/config/config.presenter.js +6 -0
  177. package/dist/modules/config/config.presenter.js.map +1 -1
  178. package/dist/modules/config/config.schemas.d.ts +4 -2
  179. package/dist/modules/config/config.schemas.js +3 -0
  180. package/dist/modules/config/config.schemas.js.map +1 -1
  181. package/dist/modules/config/config.sections.js +6 -1
  182. package/dist/modules/config/config.sections.js.map +1 -1
  183. package/dist/modules/config/config.service.d.ts +5 -0
  184. package/dist/modules/config/config.service.js +62 -14
  185. package/dist/modules/config/config.service.js.map +1 -1
  186. package/dist/modules/examples/examples.d.ts +5 -0
  187. package/dist/modules/examples/examples.js +34 -29
  188. package/dist/modules/examples/examples.js.map +1 -1
  189. package/dist/modules/interactive/amount-input.d.ts +3 -5
  190. package/dist/modules/interactive/amount-input.js +9 -26
  191. package/dist/modules/interactive/amount-input.js.map +1 -1
  192. package/dist/modules/interactive/config-fields.js +8 -1
  193. package/dist/modules/interactive/config-fields.js.map +1 -1
  194. package/dist/modules/interactive/equivalent-command.js +8 -10
  195. package/dist/modules/interactive/equivalent-command.js.map +1 -1
  196. package/dist/modules/interactive/invoice-copy.d.ts +19 -0
  197. package/dist/modules/interactive/invoice-copy.js +26 -0
  198. package/dist/modules/interactive/invoice-copy.js.map +1 -0
  199. package/dist/modules/interactive/periods.d.ts +2 -2
  200. package/dist/modules/interactive/periods.js +8 -4
  201. package/dist/modules/interactive/periods.js.map +1 -1
  202. package/dist/modules/padron/padron.d.ts +46 -0
  203. package/dist/modules/padron/padron.js +24 -0
  204. package/dist/modules/padron/padron.js.map +1 -0
  205. package/dist/modules/padron/padron.presenter.d.ts +7 -0
  206. package/dist/modules/padron/padron.presenter.js +49 -0
  207. package/dist/modules/padron/padron.presenter.js.map +1 -0
  208. package/dist/modules/parameters/health.d.ts +17 -0
  209. package/dist/modules/parameters/health.js +29 -0
  210. package/dist/modules/parameters/health.js.map +1 -0
  211. package/dist/modules/parameters/parameters.presenter.js +5 -2
  212. package/dist/modules/parameters/parameters.presenter.js.map +1 -1
  213. package/dist/modules/pdf/pdf.errors.d.ts +0 -1
  214. package/dist/modules/pdf/pdf.errors.js +1 -3
  215. package/dist/modules/pdf/pdf.errors.js.map +1 -1
  216. package/dist/modules/storybook/showcase.js +21 -5
  217. package/dist/modules/storybook/showcase.js.map +1 -1
  218. package/dist/modules/update-check/changelog.d.ts +23 -0
  219. package/dist/modules/update-check/changelog.js +99 -0
  220. package/dist/modules/update-check/changelog.js.map +1 -0
  221. package/dist/modules/update-check/update-check.presenter.d.ts +4 -0
  222. package/dist/modules/update-check/update-check.presenter.js +80 -2
  223. package/dist/modules/update-check/update-check.presenter.js.map +1 -1
  224. package/dist/modules/update-check/update-check.service.d.ts +3 -0
  225. package/dist/modules/update-check/update-check.service.js +2 -2
  226. package/dist/modules/update-check/update-check.service.js.map +1 -1
  227. package/dist/modules/vouchers/voucher-history.presenter.d.ts +3 -3
  228. package/dist/modules/vouchers/voucher-history.presenter.js +27 -7
  229. package/dist/modules/vouchers/voucher-history.presenter.js.map +1 -1
  230. package/dist/services/arca/arca-billing.gateway.d.ts +8 -2
  231. package/dist/services/arca/arca-billing.gateway.js +17 -2
  232. package/dist/services/arca/arca-billing.gateway.js.map +1 -1
  233. package/dist/services/arca/arca-client.factory.d.ts +2 -1
  234. package/dist/services/arca/arca-client.factory.js +5 -0
  235. package/dist/services/arca/arca-client.factory.js.map +1 -1
  236. package/dist/services/arca/arca-context.resolver.d.ts +11 -0
  237. package/dist/services/arca/arca-context.resolver.js +17 -1
  238. package/dist/services/arca/arca-context.resolver.js.map +1 -1
  239. package/dist/services/arca/arca-padron.gateway.d.ts +9 -0
  240. package/dist/services/arca/arca-padron.gateway.js +104 -0
  241. package/dist/services/arca/arca-padron.gateway.js.map +1 -0
  242. package/dist/services/clipboard/clipboard.d.ts +2 -0
  243. package/dist/services/clipboard/clipboard.js +17 -0
  244. package/dist/services/clipboard/clipboard.js.map +1 -0
  245. package/dist/services/pdf/escape-html.d.ts +6 -0
  246. package/dist/services/pdf/escape-html.js +25 -0
  247. package/dist/services/pdf/escape-html.js.map +1 -0
  248. package/dist/services/pdf/pdf-exporter.d.ts +6 -3
  249. package/dist/services/pdf/pdf-exporter.js +13 -10
  250. package/dist/services/pdf/pdf-exporter.js.map +1 -1
  251. package/dist/ui/components/certificateBanner.d.ts +11 -0
  252. package/dist/ui/components/certificateBanner.js +9 -0
  253. package/dist/ui/components/certificateBanner.js.map +1 -0
  254. package/dist/ui/components/index.d.ts +1 -0
  255. package/dist/ui/components/index.js +1 -0
  256. package/dist/ui/components/index.js.map +1 -1
  257. package/dist/ui/components/statusBar.d.ts +15 -4
  258. package/dist/ui/components/statusBar.js +16 -11
  259. package/dist/ui/components/statusBar.js.map +1 -1
  260. package/dist/ui/presenters/config.presenter.d.ts +1 -1
  261. package/dist/ui/presenters/config.presenter.js +1 -1
  262. package/dist/ui/presenters/config.presenter.js.map +1 -1
  263. package/dist/ui/presenters/errors.presenter.js +8 -4
  264. package/dist/ui/presenters/errors.presenter.js.map +1 -1
  265. package/dist/ui/presenters/errors.zod-presenter.js +5 -26
  266. package/dist/ui/presenters/errors.zod-presenter.js.map +1 -1
  267. package/dist/ui/primitives/renderLogo.d.ts +2 -1
  268. package/dist/ui/primitives/renderLogo.js +21 -4
  269. package/dist/ui/primitives/renderLogo.js.map +1 -1
  270. package/dist/ui/primitives/renderPanel.d.ts +2 -0
  271. package/dist/ui/primitives/renderPanel.js +15 -5
  272. package/dist/ui/primitives/renderPanel.js.map +1 -1
  273. package/dist/ui/stream/terminal-stream.d.ts +11 -0
  274. package/dist/ui/stream/terminal-stream.js +27 -1
  275. package/dist/ui/stream/terminal-stream.js.map +1 -1
  276. package/dist/ui/theme/theme.d.ts +3 -3
  277. package/dist/ui/theme/theme.js +14 -3
  278. package/dist/ui/theme/theme.js.map +1 -1
  279. package/llms.txt +65 -45
  280. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -8,6 +8,113 @@ El formato sigue [Keep a Changelog](https://keepachangelog.com/es-ES/1.1.0/) y e
8
8
 
9
9
  ## [Sin publicar]
10
10
 
11
+ ## [2.1.0] - 2026-10-23
12
+
13
+ Trae `arcli padron` y el IVA receptor desde el padrón al facturar con `--cuit`, el aviso de vencimiento del certificado y una guía para el punto de venta de web service. Además corrige un montón de cosas que salen de una revisión del repo: el JSON de `--cargar` se valida clave por clave, los errores con `--json` tienen siempre la misma forma, y los ejemplos de la ayuda y de los docs se pueden copiar y andan.
14
+
15
+ Algunos cambios rompen scripts que dependían del comportamiento anterior. Revisá la sección "Cambiado":
16
+
17
+ - **Exit code `2`** cuando ARCA rechaza un comprobante (antes, `0`).
18
+ - **Validación estricta del JSON de `--cargar`:** una clave desconocida o con otro tipo ahora es error.
19
+ - **Un array de un elemento en `--cargar`** sale como array.
20
+ - **`--bruto`** agrega `respuesta` en lugar de reemplazar el resumen.
21
+ - **`config revisar`** ya no recibe `--testing` ni `--produccion`.
22
+ - **Los PDFs** se guardan en una subcarpeta por CUIT.
23
+
24
+ Los comandos, los flags de facturación y las claves de config siguen siendo los mismos.
25
+
26
+ ### Agregado
27
+
28
+ - **`arcli padron <cuit>`:** nombre o razón social, domicilio fiscal, condición IVA, impuestos, categoría de monotributo y actividad de un CUIT, desde el padrón de ARCA (`ws_sr_constancia_inscripcion`). Con `--json` para scripts.
29
+ - **IVA receptor desde el padrón:** al facturar con `--cuit` y sin `--ir`, ARCLI usa la condición IVA del padrón, antes que el `ivaReceptor` de la config. También completa el nombre y el domicilio del receptor para el PDF. Si el padrón no responde o no la informa, sigue con la config y avisa. El modo interactivo propone la misma condición al cargar un CUIT. Se desactiva con `arcli config establecer consultarPadron false`.
30
+ - **Aviso de vencimiento del certificado:** a menos de 30 días de vencer cualquiera de los certificados configurados (testing o producción, sin importar con cuál estés trabajando), los comandos que van a ARCA (facturación, `ultimos`, `consultar`, `padron`, `fce-obligado`, `parametros`, `estado`) avisan al principio, en stderr: `El certificado de produccion vence el 20/11/2026 (en 10 días)`, con el link a la [guía para renovarlo](docs/obtencion-certificados.md). Con `--json`, stdout queda solo con el JSON y en facturación el aviso va también en `avisos`. En el modo interactivo es un recuadro debajo de la barra de estado. Si vencen los dos, van en el mismo recuadro. Si ya venció el del entorno que se usa, cortan antes de autenticar en ARCA con el error `CERTIFICATE_EXPIRED` (antes fallaba el login en WSAA con un error inesperado).
31
+ - **Punto de venta para web service:** si ARCA rechaza el comprobante porque el punto de venta no es de web service (error `10005`), la `sugerencia` lo dice y apunta a la [guía para crear uno](docs/obtencion-certificados.md#punto-de-venta-para-web-service). `arcli estado` avisa lo mismo cuando el punto de venta configurado no está entre los habilitados. Desde el 1/11/2026 ARCA da de alta de oficio puntos de venta "Factura en línea" a monotributistas (RG 5893/2026), y esos no sirven para arcli.
32
+
33
+ ### Cambiado
34
+
35
+ - **`--bruto` agrega la respuesta cruda sin quitar el resumen:** con `--json --bruto` ahora salen `cae`, `caeVencimiento`, `estado`, `resultado`, `errores`, `observaciones` y el resto del JSON de siempre, más `respuesta` con la respuesta cruda de ARCA. Antes `--bruto` reemplazaba el resumen y esos campos desaparecían, aunque la documentación decía que agregaba. En texto pasa lo mismo: el resultado se muestra como siempre y el panel `Respuesta bruta` va al final. Vale igual para `bruto=true` en la config.
36
+ - **Un array de un elemento en `--cargar` es un lote:** si el JSON es un array sale un array (con `indice`) y los errores son `BATCH_VALIDATION_ERROR` / `BATCH_EMISSION_ERROR`, tenga uno o muchos elementos. Antes un array de un elemento salía como objeto y con los errores de un comprobante suelto. Un objeto sigue devolviendo un objeto. Si un script leía `[0]` solo cuando había más de uno, ya puede leer siempre el array.
37
+ - **El JSON de `--cargar` se valida clave por clave:** una clave desconocida (`"montototal"`, `"vencimiento"`, `"moneda"`) o un valor con otro tipo (`"puntoVenta": "3"`, `"emitir": "true"`, `null`) ahora es error de entrada (`INPUT_VALIDATION_ERROR`, o `BATCH_VALIDATION_ERROR` con el índice en un lote) que nombra la clave y sugiere la correcta. Antes se ignoraban sin aviso: con `"puntoVenta": "3"` se emitía en el punto de venta de la config. Si un archivo que te funcionaba ahora falla, corregí la clave o sacale las comillas al número; las claves documentadas siguen igual. Un lote vacío (`[]`) también es error: antes se ignoraba el archivo y se usaban solo los flags. La tabla de claves y su flag equivalente está en [entrada y salida](docs/input-output.md#flags-y-claves-del-json).
38
+ - **`config revisar` revisa los dos entornos:** valida el entorno por defecto y cualquier otro que tenga `cert` o `key` configurados, cada uno en su línea (`Validacion testing`, `Validacion produccion`). La línea `Revision activa` del JSON ya no existe. Ya no recibe `--testing` ni `--produccion`: antes los aceptaba pero los ignoraba y revisaba siempre testing.
39
+ - **Exit code `2` cuando ARCA rechaza un comprobante:** antes salía con `0` y había que leer `estado` para enterarse. En un lote, `2` si ARCA rechazó al menos uno. `observado` sigue saliendo con `0`. Si un script trataba cualquier exit distinto de `0` como error de ARCLI, ahora también corta en un rechazo.
40
+ - **PDFs en una subcarpeta por CUIT emisor:** `~/arcli/comprobantes/20123456789/factura-c_0003-00000125.pdf` (en testing, `testing/20123456789/`). Si el archivo ya existe no se pisa: se guarda con `-2`, `-3` y así.
41
+ - **`sugerencia` siempre en el JSON de error:** todos los errores con `--json` traen las mismas cuatro claves (`codigo`, `detalles`, `error`, `sugerencia`), con `sugerencia: null` cuando no hay nada que sugerir. Antes faltaba en los errores sin sugerencia (`CONFIGURATION_ERROR`, `INPUT_VALIDATION_ERROR`…) y era `null` solo en los inesperados. Si un script chequeaba si la clave existe, ahora tiene que chequear si es `null`.
42
+ - **`--bruto` solo en los comandos de facturación:** `padron`, `fce-obligado`, `ultimos`, `consultar`, `parametros`, `estado` e `interactivo` ya no lo declaran (no lo usaban): pasado ahí, el comando corre igual y avisa en stderr que se ignora. Ya no aparece en su ayuda.
43
+ - **`arcli interactivo --json` ya no falla:** el asistente acepta solo `--testing` y `--produccion`; `--json` y `--bruto` se ignoran con un aviso. Sin terminal interactiva sigue fallando, con o sin `--json`.
44
+ - **Comando equivalente del modo interactivo:** siempre lleva `--testing` o `--produccion`. Antes, en testing no llevaba nada, y si la config pasaba a producción el comando pegado emitía ahí.
45
+
46
+ ### Corregido
47
+
48
+ - **Ejemplos de la ayuda y de los docs que fallaban:** los ejemplos de `--ayuda` de las notas B y C, las B, las FCE y las familias, las NC/ND FCE de `arcli ejemplos` y varios de los docs (`pdf.md`, `usage-patterns.md`, `cli-reference.md`, el JSON de `llms.txt` y de `input-output.md`) daban error al copiarlos: asociado de otra letra, IVA receptor que la letra no admite, FCE sin `--cbu` o con `--acuit` ajeno, fechas fijas viejas o sin IVA receptor. Ahora cada nota asocia una factura de su letra y categoría, y un test pasa todos los ejemplos por el parser y arma la solicitud a ARCA.
49
+ - **"Puede haberse emitido" cuando seguro no se emitió:** un certificado vencido, un fallo de login en WSAA o un error al pedir el último número salían como `EMISSION_UNCERTAIN`, con la sugerencia de verificar con `arcli ultimos` antes de reintentar. En esos casos no llegó nada a ARCA: ahora salen con su error (`UNEXPECTED_ERROR` o `TRANSIENT_ERROR` en el JSON) y se puede reintentar directo. `EMISSION_UNCERTAIN` queda solo para un fallo en la llamada que emite (red, timeout, transacción activa). En un lote, ese caso ya no suma `detalles.sinConfirmar`.
50
+ - **Lote interrumpido, PDFs de los ya emitidos:** si un lote se cortaba a mitad, los comprobantes que ya tenían CAE quedaban sin PDF. Ahora se generan antes de mostrar el error, según `pdf` o `--exportar-pdf` como en un lote completo, y en `--json` cada uno lleva su campo `pdf`. Si falla el PDF, el error que se muestra sigue siendo el de la emisión.
51
+ - **Lote, fallos del padrón o de la cotización con su índice:** si la consulta al padrón (IVA receptor desde `--cuit`) o a la cotización oficial fallaba para un ítem, el lote cortaba con un error que no decía cuál era. Ahora sale en `BATCH_VALIDATION_ERROR`, junto con los demás ítems con problemas y su `#n`, antes de emitir ninguno.
52
+ - **`config.json` con JSON inválido** salía como "Error inesperado", sin decir qué archivo ni qué hacer. Ahora es un error de configuración (`CONFIGURATION_ERROR`) con la ruta del archivo y la sugerencia de corregirlo a mano o renombrarlo y volver a configurar. ARCLI no lo borra ni lo pisa.
53
+ - **`json=true` de la config en todos los comandos:** `pdf` (y sus subcomandos) y `parametros` sin tabla solo salían en JSON con `--json`. Ahora todos los comandos resuelven la salida igual: `--json` o, si no está, la clave `json` de la config. `config ruta` acepta `--json` y devuelve `{"ruta": "..."}`.
54
+ - **Errores de uso en JSON:** una opción desconocida (`arcli fc --montoo 1 --json`), un valor faltante o un comando que no existe salían en texto aunque se pidiera JSON. Ahora, con `--json` o `json=true`, salen como `INPUT_VALIDATION_ERROR` en el mismo formato que el resto de los errores, con exit code `1`. Sin JSON se ven igual que antes.
55
+ - **Opciones globales que no aplican:** `--testing`, `--produccion`, `--json` o `--bruto` en un comando que no las usa (`arcli config ruta --produccion`) se aceptaban sin decir nada. Ahora el comando corre igual y avisa en stderr que la opción se ignora.
56
+ - **`json=true` en `config`:** `config`, `config revisar`, `config establecer` y `config eliminar` respetan `json=true` de la config, como el resto de los comandos.
57
+ - **`--dia` corría un mes de más** a fin de mes: `--dia 15` el 31/03 daba el 15/05 en vez del 15/04, y ARCA lo aceptaba con las fechas de servicio y vencimiento equivocadas. Si el día no existe en ese mes (`--dia 31` con abril), ahora da error.
58
+ - **`--json` con `FORCE_COLOR`:** con `FORCE_COLOR=1` en el entorno, el JSON redirigido a un archivo o a otro programa salía con colores y no se podía parsear. Ahora solo se colorea en una terminal.
59
+ - **`--json` en `config`:** `config`, `config revisar`, `config establecer` y `config eliminar` ignoraban `--json` y salían en texto.
60
+ - **`config --ayuda` listaba la mitad de las claves:** mostraba 15 de 30. Ahora `config --ayuda` y `config establecer --ayuda` listan todas, por sección, con sus valores posibles.
61
+ - **Links de `llms.txt` y del README en el paquete de npm:** apuntaban a `docs/`, que no se publica en npm. Ahora son links a GitHub.
62
+ - **`config establecer` con un valor inválido** (`puntoVenta abc`, `comprobantesPorLista 99`) sale como error de entrada (`INPUT_VALIDATION_ERROR`) y no como error inesperado.
63
+
64
+ ## [2.0.0] - 2026-10-12
65
+
66
+ Versión mayor: sale de una auditoría del proyecto. Lo que rompe es cómo se escriben algunos valores en los flags:
67
+
68
+ - **Montos en formato argentino:** punto para miles y coma para decimales (`15.000`, `1.500,50`). `-m 1500.50` ahora da error; escribí `1500,50`.
69
+ - **Enteros solo con dígitos:** `--pv 3a` da error en vez de leerse como 3.
70
+ - **`--dia` no se combina con `--fecha` ni `--servicio-hasta`.**
71
+ - **Varias alícuotas:** la suma tiene que coincidir exacta con `--monto`.
72
+ - **Un error de red al emitir** sale como `EMISSION_UNCERTAIN`, no como `TRANSIENT_ERROR`/`UNEXPECTED_ERROR`.
73
+
74
+ El resto son correcciones: evitar comprobantes duplicados, fecha argentina en cualquier zona horaria, `ImpTotal` exacto, PDF escapado, archivos privados y validaciones más estrictas.
75
+
76
+ ### Agregado
77
+
78
+ - **Modo interactivo, estado de ARCA en la barra:** la barra de arriba del menú ya no dice "Modo interactivo": muestra **ARCA funcionando**, **con demoras** (más de 3 segundos), **con problemas** (algún servidor no responde OK) o **sin respuesta**, en color, seguido del entorno (`TESTING` en naranja, `PRODUCCION` en celeste). A la izquierda, la razón social del emisor (o el CUIT, si no está configurada) y el punto de venta.
79
+ - **Versión debajo del logo** (`v1.8.0 | LcsGrz`), en el modo interactivo y en la ayuda.
80
+ - **Mismo ancho para todo:** las cajas de la salida en texto, la barra de estado y el logo (ahora centrado) ocupan 92 columnas, o menos si la terminal es más angosta. Antes cada caja medía distinto según su contenido. Los comprobantes (vista previa, resultado de la emisión y `consultar`) mantienen su ancho de ticket, de 68 a 80 columnas, y van centrados. El JSON no cambia.
81
+ - **Modo interactivo, listas de comprobantes:** las filas ocupan todo el ancho de la línea punteada que las enmarca.
82
+ - **Modo interactivo, actualizar:** si hay una versión nueva, la primera opción del menú es **Actualizar a la versión X.Y.Z**. Muestra tu versión, la nueva y sus novedades, y con **Cerrar para actualizar** copia `npm install -g arcli@latest` al portapapeles y cierra el asistente para que lo ejecutes. En el modo interactivo el aviso de nueva versión ya no aparece al salir.
83
+
84
+ ### Cambiado
85
+
86
+ - **Enteros estrictos, y es un cambio que rompe:** `--pv`, `--punto-venta`, `--ar`, `--apv`, `--at`, `--dia` y `--cantidad` aceptan solo dígitos; antes `--pv 3a` se leía como 3. `--cuit`, `--cuil` y `--dni` aceptan además guiones y puntos (`20-11111111-2`), como el modo interactivo; antes `--cuit 20111111112xyz` pasaba.
87
+ - **`--dia` con `--fecha` o `--servicio-hasta` da error:** antes `--dia` se ignoraba sin aviso.
88
+ - **Montos del JSON con 2 decimales como máximo** (la cotización, 6), igual que los flags.
89
+ - **Varias alícuotas: la suma tiene que coincidir exacta** con `--monto`; antes se aceptaba un centavo de diferencia, y el `ImpTotal` enviado podía no coincidir con la suma de sus partes.
90
+ - **Montos en formato argentino, y es un cambio que rompe:** `--monto`, `--exento`, `--nogravado`, `--cotizacion-moneda`/`--cm`, el monto de `--alicuota TASA:MONTO` y `config establecer cotizacion` usan punto para miles y coma para decimales. `15.000` es quince mil y `1.500,50` es mil quinientos con cincuenta. Antes `-m 15.000` se leía como 15 y `-m 1500,50` como 1500, sin aviso. Ahora `1500.50` da error ("use coma para los decimales"), igual que el texto sobrante (`12abc`) y más de 2 decimales (la cotización acepta hasta 6). El JSON de `--cargar` no cambia: ahí los montos son números.
91
+ - **Modo interactivo:** los montos siguen la misma regla. `1500.50` ya no se acepta y más de 2 decimales da error en lugar de redondearse en silencio. El comando equivalente que muestra al final escribe los montos con coma.
92
+
93
+ ### Corregido
94
+
95
+ - **Modo interactivo, notas y repetir factura copian más de la original:**
96
+ - Una NC o ND sobre una factura en dólares va en dólares, con la cotización de la factura; antes salía en pesos.
97
+ - "Anular el total" copia también exento y no gravado.
98
+ - "Repetir factura" copia exento y no gravado.
99
+ - Si la factura tiene varias alícuotas o tributos, ARCA no devuelve el detalle para reproducirla. En ese caso se avisa, no se ofrece "anular el total" ni "mismo monto", y se pide elegir la alícuota.
100
+ - **Salida de terminal sin secuencias de control:** observaciones de ARCA, datos del JSON o errores de npm ya no pueden mover el cursor, borrar la pantalla, pisar una línea ni meter hipervínculos. Solo pasan colores, saltos de línea y tabs. `--json` no cambia.
101
+ - **Rutas absolutas en la config:** `cert.*`, `key.*` y `ticketPath` se guardan resueltas, como `pdfCarpeta`. Antes una ruta relativa dependía de la carpeta desde donde se corría ARCLI.
102
+ - **Clave privada cifrada:** `config establecer key.*` la rechaza con un mensaje claro y cómo descifrarla. Antes se aceptaba y fallaba recién al hablar con ARCA.
103
+ - **PDF: textos escapados.** La plantilla de `@arcasdk/pdf` no escapa HTML y Chromium la renderiza con JavaScript: una razón social o descripción con `<script>` (por ejemplo, de un JSON de terceros) se ejecutaba, y un `&` legítimo se veía mal. Ahora todos los textos se escapan antes de generar el PDF.
104
+ - **Tickets de ARCA y config solo para tu usuario:** ARCLI crea sus archivos con permisos `0600`/`0700` (umask `077`), incluidos los tickets que escribe el SDK, y deja en `0700` la carpeta de config y la de tickets que ya existían. Antes quedaban `0644`/`0755`, y en Linux otro usuario del equipo podía leer un ticket y usarlo para emitir durante su validez. Los PDFs nuevos también quedan solo para tu usuario.
105
+ - **`config establecer` ya no guarda valores inválidos:** antes `config establecer cuit abc` lo guardaba igual y dejaba el CLI inutilizable, incluso `config eliminar`. Ahora se valida antes de guardar, y una config que ya estaba rota se arregla con `config establecer` o `config eliminar` de la clave que falla.
106
+ - **Fecha argentina siempre:** en un equipo con otra zona horaria (por ejemplo un servidor en UTC), entre las 21 y las 24 h la fecha del comprobante salía con el día siguiente. Ahora "hoy" es siempre el día en Argentina.
107
+ - **`ImpTotal` exacto:** se calcula como la suma de no gravado, exento, neto e IVA con aritmética decimal. Con varias alícuotas, el total ya no sale como `300.29999999999995`.
108
+ - **`--at` se valida como `--ac`:** una NC A ya no puede asociar una factura B por código; si `tipo` y `atajo` vienen juntos tienen que coincidir.
109
+ - **`ayuda` como valor de un flag** (`--descripcion ayuda`) ya no abre la ayuda.
110
+ - **Emisión sin confirmar:** si falla la llamada que emite en ARCA (red, timeout, transacción activa), el error ahora es `EMISSION_UNCERTAIN` y avisa que el comprobante puede haberse emitido igual, con el `arcli ultimos <tipo> --pv <n>` para verificarlo antes de reintentar. Antes salía como `TRANSIENT_ERROR` o `UNEXPECTED_ERROR` y sugería reintentar, lo que podía duplicarlo. En un lote, `BATCH_EMISSION_ERROR` suma `detalles.sinConfirmar`.
111
+ - **Ctrl+C en las preguntas del PDF**, que llegan después de emitir: el modo interactivo decía "Cancelado. No se emitio nada." aunque el comprobante ya estaba emitido, y el comando terminaba en "Error inesperado" con exit 1. Ahora se toma como "no generar el PDF" y se avisa que el comprobante quedó emitido.
112
+ - **Un flag escrito siempre gana:** `--previsualizar` ya no choca con `emitir=true` en la config o `"emitir": true` en el JSON, y `--emitir` gana a `"previsualizar": true`. Lo mismo con `--alicuota TASA` sobre las `alicuotas` del JSON, `--cm` sobre `"mismaMoneda"` y `--misma-moneda` sobre `"cotizacionMoneda"`. El error de "ambos a la vez" queda solo si los dos vienen del mismo lugar.
113
+ - **Errores en JSON con `json=true` en la config:** antes solo salían en JSON con el flag `--json`.
114
+ - **`cae` y `caeVencimiento` son `null` en un comprobante rechazado**, como dice la documentación; antes venían como `""`.
115
+ - Los errores con sugerencia la incluyen en `sugerencia` también en JSON (antes solo los del PDF).
116
+ - **Documentación de la emisión en producción:** decía que emitir en producción exige `--produccion --emitir`. En realidad el entorno sale de `config.entorno` y la emisión de `config.emitir` cuando no pasás flags: con `entorno produccion` y `emitir true` se emite en producción sin flags. El comportamiento no cambió; se corrigieron SECURITY.md, README, `llms.txt`, la ayuda y los docs.
117
+
11
118
  ## [1.8.0] - 2026-10-09
12
119
 
13
120
  Suma la clave `comprobantesPorLista` y sube a 15 el default de `arcli ultimos`; el resto son cambios del modo interactivo. Ningún flag ni formato JSON cambia.
@@ -231,7 +338,9 @@ Primera versión publicada en npm.
231
338
  - `llms.txt`: referencia condensada para que un agente de IA con acceso a terminal ejecute el CLI.
232
339
  - Publicación con npm Trusted Publishers (OIDC).
233
340
 
234
- [Sin publicar]: https://github.com/LcsGrz/arcli/compare/v1.8.0...HEAD
341
+ [Sin publicar]: https://github.com/LcsGrz/arcli/compare/v2.1.0...HEAD
342
+ [2.1.0]: https://github.com/LcsGrz/arcli/compare/v2.0.0...v2.1.0
343
+ [2.0.0]: https://github.com/LcsGrz/arcli/compare/v1.8.0...v2.0.0
235
344
  [1.8.0]: https://github.com/LcsGrz/arcli/compare/v1.7.1...v1.8.0
236
345
  [1.7.1]: https://github.com/LcsGrz/arcli/compare/v1.7.0...v1.7.1
237
346
  [1.7.0]: https://github.com/LcsGrz/arcli/compare/v1.6.0...v1.7.0
package/README.md CHANGED
@@ -15,11 +15,12 @@ CLI para previsualizar y emitir comprobantes electrónicos de ARCA (ex AFIP) des
15
15
  ## Características
16
16
 
17
17
  - **Modo interactivo:** `arcli` sin argumentos abre un asistente que guía la emisión, repite facturas anteriores, arma notas de crédito y débito, consulta comprobantes y configura el CLI. Cada paso muestra el comando equivalente.
18
- - **Vista previa por defecto:** nada se emite sin `--emitir`.
18
+ - **Vista previa por defecto:** sin `--emitir`, muestra la solicitud y, en una terminal, pregunta antes de emitir.
19
19
  - **Comprobantes:** Factura, Nota de Crédito y Nota de Débito A, B y C, y sus versiones de Factura de Crédito Electrónica (FCE), con CBU, transferencia, anulación y consulta del régimen del receptor.
20
20
  - **Entrada y salida flexibles:** flags o JSON (incluso lotes); salida legible, `--json` o respuesta bruta de ARCA.
21
21
  - **Validaciones locales** basadas en el manual de ARCA, para detectar errores antes de llamar al servicio.
22
- - **Consultas sin emitir:** últimos comprobantes, detalle de uno, estado de los servidores, tablas de parámetros y cotización oficial.
22
+ - **Consultas sin emitir:** últimos comprobantes, detalle de uno, estado de los servidores, tablas de parámetros, cotización oficial y padrón de un CUIT.
23
+ - **IVA receptor automático:** con `--cuit` y sin `--ir`, toma la condición IVA del padrón de ARCA.
23
24
  - **PDF con el QR de ARCA** mediante un plugin que se descarga solo si lo usás.
24
25
 
25
26
  ## Instalación
@@ -32,7 +33,7 @@ npm install -g arcli
32
33
 
33
34
  ## Configuración
34
35
 
35
- Necesitás tu CUIT, un punto de venta y un certificado con su clave privada de ARCA. Si todavía no los tenés, seguí [Cómo obtener los certificados](docs/obtencion-certificados.md).
36
+ Necesitás tu CUIT, un punto de venta y un certificado con su clave privada de ARCA. Si todavía no los tenés, seguí [Cómo obtener los certificados](https://github.com/LcsGrz/arcli/blob/main/docs/obtencion-certificados.md).
36
37
 
37
38
  Lo más simple es correr `arcli` y seguir la configuración guiada. Para hacerlo por comandos (por ejemplo, en un servidor):
38
39
 
@@ -44,7 +45,7 @@ arcli config establecer key.testing /ruta/a/la/clave.key
44
45
  arcli config revisar
45
46
  ```
46
47
 
47
- `arcli config revisar` verifica que el entorno activo esté listo para emitir. Todas las claves disponibles están en [Configuración](docs/configuration.md).
48
+ `arcli config revisar` verifica que el entorno activo esté listo para emitir. Todas las claves disponibles están en [Configuración](https://github.com/LcsGrz/arcli/blob/main/docs/configuration.md).
48
49
 
49
50
  ## Uso
50
51
 
@@ -55,26 +56,26 @@ arcli fc --cargar ./facturas.json --emitir --json # lote desde JSON,
55
56
  arcli fc -m 15000 --cs --consumidor-final --ir-cf --emitir --exportar-pdf
56
57
  ```
57
58
 
58
- Otras consultas: `arcli ultimos`, `arcli consultar`, `arcli estado`, `arcli parametros`, `arcli fce-obligado`. Para ver todos los comprobantes y ejemplos: `arcli --ayuda` y `arcli ejemplos`.
59
+ Otras consultas: `arcli ultimos`, `arcli consultar`, `arcli estado`, `arcli parametros`, `arcli fce-obligado`, `arcli padron`. Para ver todos los comprobantes y ejemplos: `arcli --ayuda` y `arcli ejemplos`.
59
60
 
60
61
  <p align="center"><img src="https://raw.githubusercontent.com/LcsGrz/arcli/main/docs/assets/demo/comandos.gif" alt="Vista previa de una Factura C y emisión con salida JSON filtrada con jq" width="760"></p>
61
62
 
62
- La prioridad de los valores es `flags > JSON > config > defaults`. Ver el [modelo mental](docs/mental-model.md) y la [referencia del CLI](docs/cli-reference.md).
63
+ La prioridad de los valores es `flags > JSON > config > defaults`. Ver el [modelo mental](https://github.com/LcsGrz/arcli/blob/main/docs/mental-model.md) y la [referencia del CLI](https://github.com/LcsGrz/arcli/blob/main/docs/cli-reference.md).
63
64
 
64
65
  ### Testing y producción
65
66
 
66
- Por defecto se usa el entorno `testing`, con `cert.testing` y `key.testing`. Para emitir en producción hay que configurar `cert.produccion` y `key.produccion` y pasar `--produccion --emitir`.
67
+ Por defecto se usa el entorno `testing`, con `cert.testing` y `key.testing`. Para emitir en producción hay que configurar `cert.produccion` y `key.produccion` y pasar `--produccion` (o guardar `entorno produccion`). Con la config por defecto, además hace falta `--emitir` o confirmar la pregunta.
67
68
 
68
69
  ## Documentación
69
70
 
70
- El índice completo está en [docs/](docs/README.md). Lo principal:
71
+ El índice completo está en [docs/](https://github.com/LcsGrz/arcli/blob/main/docs/README.md). Lo principal:
71
72
 
72
- - [Modo interactivo](docs/modo-interactivo.md) y [Patrones de uso](docs/usage-patterns.md)
73
- - [Referencia del CLI](docs/cli-reference.md) y [Configuración](docs/configuration.md)
74
- - [Entrada y salida](docs/input-output.md): formato del JSON
75
- - [PDF de comprobantes](docs/pdf.md)
76
- - [Cómo obtener los certificados](docs/obtencion-certificados.md)
77
- - [Troubleshooting](docs/troubleshooting.md), [Reglas de validación](docs/validation-rules.md) y [Limitaciones](docs/limitations.md)
73
+ - [Modo interactivo](https://github.com/LcsGrz/arcli/blob/main/docs/modo-interactivo.md) y [Patrones de uso](https://github.com/LcsGrz/arcli/blob/main/docs/usage-patterns.md)
74
+ - [Referencia del CLI](https://github.com/LcsGrz/arcli/blob/main/docs/cli-reference.md) y [Configuración](https://github.com/LcsGrz/arcli/blob/main/docs/configuration.md)
75
+ - [Entrada y salida](https://github.com/LcsGrz/arcli/blob/main/docs/input-output.md): formato del JSON
76
+ - [PDF de comprobantes](https://github.com/LcsGrz/arcli/blob/main/docs/pdf.md)
77
+ - [Cómo obtener los certificados](https://github.com/LcsGrz/arcli/blob/main/docs/obtencion-certificados.md)
78
+ - [Troubleshooting](https://github.com/LcsGrz/arcli/blob/main/docs/troubleshooting.md), [Reglas de validación](https://github.com/LcsGrz/arcli/blob/main/docs/validation-rules.md) y [Limitaciones](https://github.com/LcsGrz/arcli/blob/main/docs/limitations.md)
78
79
  - [llms.txt](llms.txt): referencia condensada para agentes de IA con acceso a terminal
79
80
  - [Changelog](CHANGELOG.md)
80
81
 
@@ -87,11 +88,11 @@ yarn install
87
88
  yarn dev --ayuda
88
89
  ```
89
90
 
90
- Antes de abrir un PR: `yarn typecheck`, `yarn lint` y `yarn test`. Más en la [guía de desarrollo](docs/development.md) y la [arquitectura](docs/architecture.md).
91
+ Antes de abrir un PR: `yarn typecheck`, `yarn lint` y `yarn test`. Más en la [guía de desarrollo](https://github.com/LcsGrz/arcli/blob/main/docs/development.md) y la [arquitectura](https://github.com/LcsGrz/arcli/blob/main/docs/architecture.md).
91
92
 
92
93
  ## Contribuir
93
94
 
94
- Leé [CONTRIBUTING.md](CONTRIBUTING.md). Para vulnerabilidades, ver [SECURITY.md](SECURITY.md); no subas certificados, claves ni tokens reales a issues ni PRs.
95
+ Leé [CONTRIBUTING.md](https://github.com/LcsGrz/arcli/blob/main/CONTRIBUTING.md). Para vulnerabilidades, ver [SECURITY.md](https://github.com/LcsGrz/arcli/blob/main/SECURITY.md); no subas certificados, claves ni tokens reales a issues ni PRs.
95
96
 
96
97
  ## Agradecimientos
97
98
 
@@ -0,0 +1,20 @@
1
+ import type { CertificateExpiryNotice } from '../modules/config/certificate-expiry';
2
+ import { type ResolvedArcaRuntime } from '../services/arca/arca-context.resolver';
3
+ import type { GlobalCliOptions } from './types';
4
+ type CertificateRuntime = Pick<ResolvedArcaRuntime, 'certificateExpiry' | 'certificateNotices' | 'outputJson'>;
5
+ /**
6
+ * Un solo recuadro con todos los certificados por vencer o vencidos, una linea por entorno y el link una vez. En
7
+ * rojo si alguno vencio. Lo usan los comandos y el modo interactivo.
8
+ */
9
+ export declare function renderCertificateNotices(notices: readonly CertificateExpiryNotice[]): string | undefined;
10
+ /**
11
+ * Aviso de los certificados por vencer o vencidos, de cualquier entorno, al principio del comando. Va a stderr:
12
+ * con `--json` stdout queda solo para el JSON. Si vencio el del entorno activo y hay `--json`, no se escribe: el
13
+ * error JSON de `CERTIFICATE_EXPIRED` (tambien en stderr) ya lo dice, y un texto antes lo romperia.
14
+ */
15
+ export declare function writeCertificateNotice(runtime: CertificateRuntime): void;
16
+ /** Lo que se suma a `avisos` en el JSON de facturacion. En texto el aviso ya salio arriba: no se repite. */
17
+ export declare function certificateWarnings(runtime: CertificateRuntime): string[];
18
+ /** Config, credenciales y aviso del certificado: el paso comun de los comandos que van a ARCA. */
19
+ export declare function resolveArcaRuntime(options: GlobalCliOptions): ResolvedArcaRuntime;
20
+ export {};
@@ -0,0 +1,42 @@
1
+ import { CERTIFICATE_GUIDE_URL } from '../lib/links.js';
2
+ import { ArcaContextResolver } from '../services/arca/arca-context.resolver.js';
3
+ import { certificateBanner, writeTerminalNotice } from '../ui/index.js';
4
+ /**
5
+ * Un solo recuadro con todos los certificados por vencer o vencidos, una linea por entorno y el link una vez. En
6
+ * rojo si alguno vencio. Lo usan los comandos y el modo interactivo.
7
+ */
8
+ export function renderCertificateNotices(notices) {
9
+ if (notices.length === 0) {
10
+ return undefined;
11
+ }
12
+ return certificateBanner({
13
+ expired: notices.some((notice) => notice.expired),
14
+ guideUrl: CERTIFICATE_GUIDE_URL,
15
+ summary: notices.map((notice) => notice.summary).join('\n'),
16
+ });
17
+ }
18
+ /**
19
+ * Aviso de los certificados por vencer o vencidos, de cualquier entorno, al principio del comando. Va a stderr:
20
+ * con `--json` stdout queda solo para el JSON. Si vencio el del entorno activo y hay `--json`, no se escribe: el
21
+ * error JSON de `CERTIFICATE_EXPIRED` (tambien en stderr) ya lo dice, y un texto antes lo romperia.
22
+ */
23
+ export function writeCertificateNotice(runtime) {
24
+ if (runtime.certificateExpiry?.expired && runtime.outputJson) {
25
+ return;
26
+ }
27
+ const banner = renderCertificateNotices(runtime.certificateNotices);
28
+ if (banner) {
29
+ writeTerminalNotice(banner);
30
+ }
31
+ }
32
+ /** Lo que se suma a `avisos` en el JSON de facturacion. En texto el aviso ya salio arriba: no se repite. */
33
+ export function certificateWarnings(runtime) {
34
+ return runtime.outputJson ? runtime.certificateNotices.map((notice) => notice.message) : [];
35
+ }
36
+ /** Config, credenciales y aviso del certificado: el paso comun de los comandos que van a ARCA. */
37
+ export function resolveArcaRuntime(options) {
38
+ const runtime = new ArcaContextResolver({ options }).resolve();
39
+ writeCertificateNotice(runtime);
40
+ return runtime;
41
+ }
42
+ //# sourceMappingURL=arca-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arca-runtime.js","sourceRoot":"","sources":["../../src/cli/arca-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAA4B,MAAM,wCAAwC,CAAC;AACvG,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAM/D;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAA2C;IAClF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,iBAAiB,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;QACjD,QAAQ,EAAE,qBAAqB;QAC/B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KAC5D,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAA2B;IAChE,IAAI,OAAO,CAAC,iBAAiB,EAAE,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEpE,IAAI,MAAM,EAAE,CAAC;QACX,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,mBAAmB,CAAC,OAA2B;IAC7D,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9F,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,kBAAkB,CAAC,OAAyB;IAC1D,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAE/D,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEhC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -2,21 +2,31 @@ import { type BatchItemError } from '../../modules/billing/billing.batch';
2
2
  interface BatchPlan {
3
3
  readonly inputIndexes: readonly number[];
4
4
  readonly invalidItems: readonly BatchItemError[];
5
+ /** Entro un array: se trata como lote aunque tenga un solo item. */
6
+ readonly isBatch: boolean;
5
7
  readonly total: number;
6
8
  }
7
9
  /**
8
- * En un lote, valida todos los comprobantes antes de emitir el primero. `validate` tira si el item es
9
- * invalido (lectura del JSON o reglas de negocio). Si alguno falla, no se emite ninguno y se informan todos.
10
+ * Prepara un lote antes de emitir: `resolve` completa cada item con lo que hay que consultar en ARCA (IVA
11
+ * receptor del padron, cotizacion) y `validate` aplica las reglas de negocio sobre lo resuelto. En un lote
12
+ * no corta en el primer fallo: junta todos, con su indice, en un solo `BatchValidationError`, y no se emite
13
+ * ninguno. Con un comprobante suelto (no un array) el error sale tal cual, como siempre.
10
14
  */
11
- export declare function validateBatchBeforeEmitting<T>(plan: BatchPlan, inputs: readonly T[], validate: (input: T) => void): void;
15
+ export declare function prepareBatch<T, R>(options: {
16
+ readonly inputs: readonly T[];
17
+ readonly plan: BatchPlan;
18
+ readonly resolve: (input: T, position: number) => Promise<R>;
19
+ readonly validate: (resolved: R) => void;
20
+ }): Promise<R[]>;
12
21
  /**
13
22
  * Emite los items en orden. Si uno falla a mitad del lote, entrega lo ya procesado a `onPartialResults`
14
- * antes de cortar: si no se mostrara, alguien volveria a correr el lote y duplicaria comprobantes.
23
+ * antes de cortar: si no se mostrara, alguien volveria a correr el lote y duplicaria comprobantes. Se
24
+ * espera a que termine (puede generar los PDFs de los ya emitidos), y si falla no tapa el error de emision.
15
25
  */
16
26
  export declare function emitBatch<T, R>(options: {
17
27
  readonly emit: (input: T, position: number) => Promise<R>;
18
28
  readonly inputs: readonly T[];
19
- readonly onPartialResults: (results: R[]) => void;
29
+ readonly onPartialResults: (results: R[]) => Promise<void> | void;
20
30
  readonly plan: BatchPlan;
21
31
  }): Promise<R[]>;
22
32
  export {};
@@ -1,28 +1,40 @@
1
1
  import { BatchEmissionError, BatchValidationError, describeBatchItemError, } from '../../modules/billing/billing.batch.js';
2
2
  /**
3
- * En un lote, valida todos los comprobantes antes de emitir el primero. `validate` tira si el item es
4
- * invalido (lectura del JSON o reglas de negocio). Si alguno falla, no se emite ninguno y se informan todos.
3
+ * Prepara un lote antes de emitir: `resolve` completa cada item con lo que hay que consultar en ARCA (IVA
4
+ * receptor del padron, cotizacion) y `validate` aplica las reglas de negocio sobre lo resuelto. En un lote
5
+ * no corta en el primer fallo: junta todos, con su indice, en un solo `BatchValidationError`, y no se emite
6
+ * ninguno. Con un comprobante suelto (no un array) el error sale tal cual, como siempre.
5
7
  */
6
- export function validateBatchBeforeEmitting(plan, inputs, validate) {
7
- if (plan.total === 1) {
8
- return;
8
+ export async function prepareBatch(options) {
9
+ const { inputs, plan, resolve, validate } = options;
10
+ const resolved = [];
11
+ if (!plan.isBatch) {
12
+ // Secuencial a proposito: cada servicio de ARCA reutiliza su ticket WSAA.
13
+ for (const [position, input] of inputs.entries()) {
14
+ resolved.push(await resolve(input, position));
15
+ }
16
+ return resolved;
9
17
  }
10
18
  const errors = [...plan.invalidItems];
11
- inputs.forEach((input, position) => {
19
+ for (const [position, input] of inputs.entries()) {
12
20
  try {
13
- validate(input);
21
+ const item = await resolve(input, position);
22
+ validate(item);
23
+ resolved.push(item);
14
24
  }
15
25
  catch (error) {
16
26
  errors.push({ index: plan.inputIndexes[position] ?? position + 1, message: describeBatchItemError(error) });
17
27
  }
18
- });
28
+ }
19
29
  if (errors.length > 0) {
20
30
  throw new BatchValidationError([...errors].sort((left, right) => left.index - right.index), plan.total);
21
31
  }
32
+ return resolved;
22
33
  }
23
34
  /**
24
35
  * Emite los items en orden. Si uno falla a mitad del lote, entrega lo ya procesado a `onPartialResults`
25
- * antes de cortar: si no se mostrara, alguien volveria a correr el lote y duplicaria comprobantes.
36
+ * antes de cortar: si no se mostrara, alguien volveria a correr el lote y duplicaria comprobantes. Se
37
+ * espera a que termine (puede generar los PDFs de los ya emitidos), y si falla no tapa el error de emision.
26
38
  */
27
39
  export async function emitBatch(options) {
28
40
  const { emit, inputs, onPartialResults, plan } = options;
@@ -32,11 +44,16 @@ export async function emitBatch(options) {
32
44
  results.push(await emit(input, position));
33
45
  }
34
46
  catch (error) {
35
- if (plan.total === 1) {
47
+ if (!plan.isBatch) {
36
48
  throw error;
37
49
  }
38
50
  if (results.length > 0) {
39
- onPartialResults(results);
51
+ try {
52
+ await onPartialResults(results);
53
+ }
54
+ catch {
55
+ // Lo importante es el error de emision: los ya emitidos se pueden ver con "arcli ultimos".
56
+ }
40
57
  }
41
58
  throw new BatchEmissionError({
42
59
  cause: error,
@@ -1 +1 @@
1
- {"version":3,"file":"billing.command.batch.js","sourceRoot":"","sources":["../../../src/cli/commands/billing.command.batch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,qCAAqC,CAAC;AAQ7C;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAe,EACf,MAAoB,EACpB,QAA4B;IAE5B,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAqB,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAExD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,OAAO,EAAE,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,oBAAoB,CAC5B,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,EAC3D,IAAI,CAAC,KAAK,CACX,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAO,OAKrC;IACC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzD,MAAM,OAAO,GAAQ,EAAE,CAAC;IAExB,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,CAAC;YACd,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YAED,MAAM,IAAI,kBAAkB,CAAC;gBAC3B,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,OAAO,CAAC,MAAM;gBACvB,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;gBACxD,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"billing.command.batch.js","sourceRoot":"","sources":["../../../src/cli/commands/billing.command.batch.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,10 @@ export async function runInteractiveBillingPreview(options) {
33
33
  };
34
34
  }
35
35
  const previewGateway = {
36
- createNextVoucher: async () => {
36
+ createVoucher: async () => {
37
+ throw new Error('No deberia ejecutarse la emision real durante la vista previa.');
38
+ },
39
+ getNextVoucherNumber: async () => {
37
40
  throw new Error('No deberia ejecutarse la emision real durante la vista previa.');
38
41
  },
39
42
  getQuotation: async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"billing.command.interactive-preview.js","sourceRoot":"","sources":["../../../src/cli/commands/billing.command.interactive-preview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"billing.command.interactive-preview.js","sourceRoot":"","sources":["../../../src/cli/commands/billing.command.interactive-preview.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,16 @@
1
1
  import { Option } from 'commander';
2
+ import { EXCHANGE_RATE_DECIMALS } from '../../lib/numbers/argentine-amount.js';
3
+ import { amountOption, documentNumberOption, integerOption } from '../option-parsers.js';
2
4
  export function registerBillingOptions(command) {
3
5
  command
4
- .option('-m, --monto <number>', 'importe total del comprobante', parseFloat)
6
+ .option('-m, --monto <number>', 'importe total del comprobante, por ejemplo 15000 o 1.500,50', amountOption('--monto'))
5
7
  .option('--alicuota <tasa>', 'alicuota de IVA para A y B: general (21), reducida (10.5), incrementada (27), cero (0), 5 o 2.5. Repetible como TASA:MONTO para varias alicuotas', (value, previous) => [...(previous ?? []), value])
6
- .option('--exento <number>', 'parte exenta del monto total (A y B)', parseFloat)
8
+ .option('--exento <number>', 'parte exenta del monto total (A y B)', amountOption('--exento'))
7
9
  // No puede llamarse --no-gravado: commander interpreta --no-* como negacion de un flag booleano.
8
- .option('--nogravado <number>', 'parte no gravada del monto total (A y B)', parseFloat)
9
- .option('-d, --dia <number>', 'dia de vencimiento o referencia del servicio', (value) => Number.parseInt(value, 10))
10
- .option('--punto-venta <number>', 'punto de venta', (value) => Number.parseInt(value, 10))
11
- .option('--pv <number>', 'alias de punto de venta', (value) => Number.parseInt(value, 10))
10
+ .option('--nogravado <number>', 'parte no gravada del monto total (A y B)', amountOption('--nogravado'))
11
+ .option('-d, --dia <number>', 'dia de vencimiento o referencia del servicio', integerOption('--dia'))
12
+ .option('--punto-venta <number>', 'punto de venta', integerOption('--punto-venta'))
13
+ .option('--pv <number>', 'alias de punto de venta', integerOption('--pv'))
12
14
  .option('--cargar <path>', 'cargar datos base desde un archivo JSON')
13
15
  .option('-f, --fecha <fecha>', 'fecha del comprobante; acepta D, D/M, D/M/YY o D/M/YYYY con - o /')
14
16
  .option('-c, --concepto <tipo>', 'productos, servicios o productos y servicios (alias: cs, cp, csp)')
@@ -17,15 +19,15 @@ export function registerBillingOptions(command) {
17
19
  .option('--csp', 'usar concepto productos y servicios')
18
20
  .option('--moneda <codigo>', 'codigo de moneda, por ejemplo ARS o USD')
19
21
  .option('--mda <codigo>', 'alias de moneda, por ejemplo ARS o USD')
20
- .option('--cm <number>', 'alias de cotizacion de la moneda', parseFloat)
21
- .option('--cotizacion-moneda <number>', 'cotizacion de la moneda', parseFloat)
22
+ .option('--cm <number>', 'alias de cotizacion de la moneda', amountOption('--cm', EXCHANGE_RATE_DECIMALS))
23
+ .option('--cotizacion-moneda <number>', 'cotizacion de la moneda, por ejemplo 1.452,50', amountOption('--cotizacion-moneda', EXCHANGE_RATE_DECIMALS))
22
24
  .option('--misma-moneda', 'el pago se cancela en la misma moneda extranjera; usa la cotizacion oficial de ARCA')
23
- .option('--cuit <number>', 'usar CUIT del receptor', (value) => Number.parseInt(value, 10))
24
- .option('--cuil <number>', 'usar CUIL del receptor', (value) => Number.parseInt(value, 10))
25
- .option('--dni <number>', 'usar DNI del receptor', (value) => Number.parseInt(value, 10))
25
+ .option('--cuit <number>', 'usar CUIT del receptor', documentNumberOption('--cuit'))
26
+ .option('--cuil <number>', 'usar CUIL del receptor', documentNumberOption('--cuil'))
27
+ .option('--dni <number>', 'usar DNI del receptor', documentNumberOption('--dni'))
26
28
  .option('--consumidor-final', 'usar consumidor final con documento 0')
27
29
  .option('--cfinal', 'alias de consumidor final con documento 0')
28
- .option('--iva-receptor <tipo>', 'condicion IVA del receptor')
30
+ .option('--iva-receptor <tipo>', 'condicion IVA del receptor; con --cuit, sin este flag, se toma del padron')
29
31
  .option('--ir <tipo>', 'alias rapido de condicion IVA del receptor')
30
32
  .option('--ir-ce', 'IVA receptor: cliente del exterior')
31
33
  .option('--ir-cf', 'IVA receptor: consumidor final')
@@ -44,10 +46,10 @@ export function registerBillingOptions(command) {
44
46
  .option('--servicio-hasta <fecha>', 'fecha de fin de servicio')
45
47
  .option('--vencimiento <fecha>', 'fecha de vencimiento del pago; por defecto el fin del servicio')
46
48
  .option('--vto <fecha>', 'alias de fecha de vencimiento del pago')
47
- .option('--at <number>', 'tipo ARCA del comprobante asociado', (value) => Number.parseInt(value, 10))
48
- .option('--apv <number>', 'punto de venta del comprobante asociado', (value) => Number.parseInt(value, 10))
49
- .option('--asociado-punto-venta <number>', 'punto de venta del comprobante asociado', (value) => Number.parseInt(value, 10))
50
- .option('--ar <number>', 'numero del comprobante asociado', (value) => Number.parseInt(value, 10))
49
+ .option('--at <number>', 'tipo ARCA del comprobante asociado', integerOption('--at'))
50
+ .option('--apv <number>', 'punto de venta del comprobante asociado', integerOption('--apv'))
51
+ .option('--asociado-punto-venta <number>', 'punto de venta del comprobante asociado', integerOption('--asociado-punto-venta'))
52
+ .option('--ar <number>', 'numero del comprobante asociado', integerOption('--ar'))
51
53
  .option('--ac <shortcut>', 'atajo del comprobante asociado, por ejemplo fc o fa')
52
54
  .option('--acuit <number>', 'CUIT del comprobante asociado; en NC/ND FCE por defecto el CUIT emisor')
53
55
  .option('--periodo-desde <fecha>', 'inicio del periodo asociado; alternativa a --ac en notas comunes')
@@ -1 +1 @@
1
- {"version":3,"file":"billing.command.options.js","sourceRoot":"","sources":["../../../src/cli/commands/billing.command.options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"billing.command.options.js","sourceRoot":"","sources":["../../../src/cli/commands/billing.command.options.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,14 @@
1
1
  import type { BillingExecutionResult } from '../../modules/billing/billing.types.internal';
2
2
  export declare function formatBillingOutputs(results: BillingExecutionResult[], options: {
3
+ /** Entro un array en `--cargar`: se rotula como lote aunque tenga un solo resultado. */
4
+ readonly batch?: boolean;
3
5
  readonly environment: 'produccion' | 'testing';
4
6
  readonly previewShown?: boolean;
5
7
  readonly raw: boolean;
6
8
  }): string;
7
9
  export declare function writeBillingCommandResults(results: BillingExecutionResult[], options: {
10
+ /** Entro un array en `--cargar`: el JSON sale como array aunque tenga un solo resultado. */
11
+ readonly batch?: boolean;
8
12
  readonly environment: 'produccion' | 'testing';
9
13
  readonly outputJson: boolean;
10
14
  readonly previewShown?: boolean;
@@ -8,7 +8,7 @@ export function formatBillingOutputs(results, options) {
8
8
  previewShown: options.previewShown,
9
9
  raw: options.raw,
10
10
  });
11
- if (results.length === 1) {
11
+ if (results.length === 1 && !options.batch) {
12
12
  return output;
13
13
  }
14
14
  return [`Lote ${index + 1}/${results.length}`, output].join('\n');
@@ -17,7 +17,7 @@ export function formatBillingOutputs(results, options) {
17
17
  }
18
18
  export function writeBillingCommandResults(results, options) {
19
19
  if (options.outputJson) {
20
- if (results.length === 1) {
20
+ if (results.length === 1 && !options.batch) {
21
21
  writeTerminalJson(formatBillingResultAsJson(results[0], { raw: options.raw }));
22
22
  return;
23
23
  }
@@ -25,6 +25,7 @@ export function writeBillingCommandResults(results, options) {
25
25
  return;
26
26
  }
27
27
  writeTerminalOutput(formatBillingOutputs(results, {
28
+ batch: options.batch,
28
29
  environment: options.environment,
29
30
  previewShown: options.previewShown,
30
31
  raw: options.raw,
@@ -1 +1 @@
1
- {"version":3,"file":"billing.command.output.js","sourceRoot":"","sources":["../../../src/cli/commands/billing.command.output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"billing.command.output.js","sourceRoot":"","sources":["../../../src/cli/commands/billing.command.output.ts"],"names":[],"mappings":"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"}