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
@@ -0,0 +1,104 @@
1
+ import { AppError } from '../../lib/errors/app-error.js';
2
+ import { deriveIvaCondition, } from '../../modules/padron/padron.js';
3
+ const NOT_AUTHORIZED_MESSAGE = 'El certificado no esta autorizado para el servicio ws_sr_constancia_inscripcion (padron). Autoricelo igual que wsfe: en testing desde WSASS ("Crear autorizacion a servicio") y en produccion desde el Administrador de Relaciones.';
4
+ function asRecord(value) {
5
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
6
+ }
7
+ function asArray(value) {
8
+ if (Array.isArray(value))
9
+ return value;
10
+ return value === undefined || value === null ? [] : [value];
11
+ }
12
+ function asText(value) {
13
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
14
+ }
15
+ function readName(general) {
16
+ const businessName = asText(general?.razonSocial);
17
+ if (businessName)
18
+ return businessName;
19
+ const fullName = [asText(general?.apellido), asText(general?.nombre)].filter(Boolean).join(' ');
20
+ return fullName || null;
21
+ }
22
+ function readAddress(general) {
23
+ const address = asRecord(general?.domicilioFiscal);
24
+ const parts = [
25
+ asText(address?.direccion),
26
+ asText(address?.localidad),
27
+ asText(address?.codPostal) ? `CP ${asText(address?.codPostal)}` : null,
28
+ asText(address?.descripcionProvincia),
29
+ ].filter(Boolean);
30
+ return parts.length > 0 ? parts.join(', ') : null;
31
+ }
32
+ function readTaxes(...sources) {
33
+ return sources.flatMap((source) => asArray(source?.impuesto).flatMap((item) => {
34
+ const tax = asRecord(item);
35
+ const id = Number(tax?.idImpuesto);
36
+ return Number.isInteger(id)
37
+ ? [
38
+ {
39
+ active: (asText(tax?.estadoImpuesto) ?? 'AC') === 'AC',
40
+ description: asText(tax?.descripcionImpuesto) ?? '',
41
+ id,
42
+ },
43
+ ]
44
+ : [];
45
+ }));
46
+ }
47
+ function readActivities(...sources) {
48
+ return sources.flatMap((source) => asArray(source?.actividad ?? source?.actividadMonotributista).flatMap((item) => {
49
+ const activity = asRecord(item);
50
+ const id = Number(activity?.idActividad);
51
+ return Number.isInteger(id) ? [{ description: asText(activity?.descripcionActividad) ?? '', id }] : [];
52
+ }));
53
+ }
54
+ function readMonotributoCategory(monotributo) {
55
+ const category = monotributo?.categoriaMonotributo;
56
+ return asText(category) ?? asText(asRecord(category)?.descripcionCategoria);
57
+ }
58
+ function readNotices(details) {
59
+ return asArray(asRecord(details.errorConstancia)?.error).flatMap((item) => asText(item) ?? []);
60
+ }
61
+ function readPersonType(value) {
62
+ const type = asText(value)?.toUpperCase();
63
+ return type === 'FISICA' ? 'fisica' : type === 'JURIDICA' ? 'juridica' : null;
64
+ }
65
+ /** Arma un `Taxpayer` con la respuesta de `getTaxpayerDetails`. */
66
+ export function mapTaxpayerDetails(cuit, raw) {
67
+ const details = asRecord(raw) ?? {};
68
+ const general = asRecord(details.datosGenerales);
69
+ const monotributo = asRecord(details.datosMonotributo);
70
+ const generalRegime = asRecord(details.datosRegimenGeneral);
71
+ const taxes = readTaxes(generalRegime, monotributo);
72
+ return {
73
+ activities: readActivities(generalRegime, monotributo),
74
+ address: readAddress(general),
75
+ cuit,
76
+ ivaCondition: deriveIvaCondition({ monotributo: Boolean(monotributo), taxes }),
77
+ keyStatus: asText(details.estadoClave) ?? asText(general?.estadoClave),
78
+ monotributoCategory: readMonotributoCategory(monotributo),
79
+ name: readName(general),
80
+ notices: readNotices(details),
81
+ personType: readPersonType(details.tipoPersona ?? general?.tipoPersona),
82
+ taxes,
83
+ };
84
+ }
85
+ export class ArcaPadronGateway {
86
+ arca;
87
+ constructor(arca) {
88
+ this.arca = arca;
89
+ }
90
+ async getTaxpayer(cuit) {
91
+ let details;
92
+ try {
93
+ details = await this.arca.registerInscriptionProofService.getTaxpayerDetails(cuit);
94
+ }
95
+ catch (error) {
96
+ if (error instanceof Error && error.message.includes('notAuthorized')) {
97
+ throw new AppError(NOT_AUTHORIZED_MESSAGE, { code: 'PADRON_SERVICE_NOT_AUTHORIZED' });
98
+ }
99
+ throw error;
100
+ }
101
+ return details ? mapTaxpayerDetails(cuit, details) : null;
102
+ }
103
+ }
104
+ //# sourceMappingURL=arca-padron.gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arca-padron.gateway.js","sourceRoot":"","sources":["../../../src/services/arca/arca-padron.gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Copia el texto al portapapeles. Devuelve `false` si ninguna herramienta funciono. */
2
+ export declare function copyToClipboard(text: string, platform?: NodeJS.Platform): boolean;
@@ -0,0 +1,17 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ /** Herramientas del sistema para copiar, en orden de preferencia. En Linux depende de lo que este instalado. */
3
+ function clipboardCommands(platform) {
4
+ if (platform === 'darwin')
5
+ return [['pbcopy']];
6
+ if (platform === 'win32')
7
+ return [['clip']];
8
+ return [['wl-copy'], ['xclip', '-selection', 'clipboard'], ['xsel', '--clipboard', '--input']];
9
+ }
10
+ /** Copia el texto al portapapeles. Devuelve `false` si ninguna herramienta funciono. */
11
+ export function copyToClipboard(text, platform = process.platform) {
12
+ return clipboardCommands(platform).some(([command, ...args]) => {
13
+ const result = spawnSync(command, args, { input: text, stdio: ['pipe', 'ignore', 'ignore'], timeout: 2000 });
14
+ return !result.error && result.status === 0;
15
+ });
16
+ }
17
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../../src/services/clipboard/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,gHAAgH;AAChH,SAAS,iBAAiB,CAAC,QAAyB;IAClD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5C,OAAO,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,WAA4B,OAAO,CAAC,QAAQ;IACxF,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;QAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7G,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * La plantilla de `@arcasdk/pdf` compila con `noEscape: true` y Chromium la renderiza con JS: una razon social
3
+ * con `<script>` se ejecutaria. Se escapan todos los textos antes de pasarlos; codigos, fechas y numeros no
4
+ * tienen esos caracteres, asi que no cambian.
5
+ */
6
+ export declare function escapeHtmlStrings<T>(value: T): T;
@@ -0,0 +1,25 @@
1
+ const HTML_ENTITIES = {
2
+ '"': '&quot;',
3
+ '&': '&amp;',
4
+ "'": '&#39;',
5
+ '<': '&lt;',
6
+ '>': '&gt;',
7
+ };
8
+ /**
9
+ * La plantilla de `@arcasdk/pdf` compila con `noEscape: true` y Chromium la renderiza con JS: una razon social
10
+ * con `<script>` se ejecutaria. Se escapan todos los textos antes de pasarlos; codigos, fechas y numeros no
11
+ * tienen esos caracteres, asi que no cambian.
12
+ */
13
+ export function escapeHtmlStrings(value) {
14
+ if (typeof value === 'string') {
15
+ return value.replace(/[&<>"']/g, (char) => HTML_ENTITIES[char] ?? char);
16
+ }
17
+ if (Array.isArray(value)) {
18
+ return value.map((item) => escapeHtmlStrings(item));
19
+ }
20
+ if (value && typeof value === 'object') {
21
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, escapeHtmlStrings(item)]));
22
+ }
23
+ return value;
24
+ }
25
+ //# sourceMappingURL=escape-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape-html.js","sourceRoot":"","sources":["../../../src/services/pdf/escape-html.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAqC;IACtD,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;CACZ,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAI,KAAQ;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAM,CAAC;IAC/E,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAM,CAAC;IAC3D,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAM,CAAC;IAC7G,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -6,8 +6,11 @@ export declare const TESTING_FOOTER = "COMPROBANTE DE PRUEBA - SIN VALIDEZ FISCA
6
6
  export declare function toPdfFailure(error: unknown): Extract<PdfOutcome, {
7
7
  error: unknown;
8
8
  }>;
9
- /** Los de testing van a una subcarpeta y con un pie que avisa que no valen, para no mezclarlos con los reales. */
10
- export declare function resolvePdfTargetFolder(folder: string, environment: BillingExecutionResult['environment']): string;
9
+ /**
10
+ * Una subcarpeta por CUIT emisor, para que dos emisores con el mismo punto de venta y numero no se pisen. Los de
11
+ * testing van ademas a `testing/` y con un pie que avisa que no valen, para no mezclarlos con los reales.
12
+ */
13
+ export declare function resolvePdfTargetFolder(folder: string, environment: BillingExecutionResult['environment'], cuit: string): string;
11
14
  export interface ExportPdfInput {
12
15
  readonly config: Pick<ArcliConfig, 'cuit' | 'emisor'>;
13
16
  readonly extras?: PdfVoucherExtras;
@@ -15,5 +18,5 @@ export interface ExportPdfInput {
15
18
  readonly renderer: PdfRenderer;
16
19
  readonly result: BillingExecutionResult;
17
20
  }
18
- /** Genera y guarda el PDF de un comprobante emitido. Devuelve la ruta del archivo. */
21
+ /** Genera y guarda el PDF de un comprobante emitido, sin pisar uno existente. Devuelve la ruta del archivo. */
19
22
  export declare function exportBillingPdf(input: ExportPdfInput): Promise<string>;
@@ -1,10 +1,12 @@
1
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
1
+ import { mkdirSync, readFileSync } from 'node:fs';
2
2
  import { extname, join } from 'node:path';
3
3
  import { AppError } from '../../lib/errors/app-error.js';
4
+ import { writeNewFile } from '../../lib/files/write-new-file.js';
4
5
  import { PdfError } from '../../modules/pdf/pdf.errors.js';
5
6
  import { mapBillingResultToPdfData } from '../../modules/pdf/pdf-data.mapper.js';
6
7
  import { buildPdfFileName } from '../../modules/pdf/pdf-file-name.js';
7
8
  import { resolvePdfIssuer } from '../../modules/pdf/pdf-issuer.js';
9
+ import { escapeHtmlStrings } from './escape-html.js';
8
10
  export const TESTING_FOOTER = 'COMPROBANTE DE PRUEBA - SIN VALIDEZ FISCAL';
9
11
  export function toPdfFailure(error) {
10
12
  if (error instanceof PdfError) {
@@ -24,11 +26,14 @@ function readLogoAsDataUrl(path) {
24
26
  const mime = extname(path).toLowerCase() === '.png' ? 'image/png' : 'image/jpeg';
25
27
  return `data:${mime};base64,${readFileSync(path).toString('base64')}`;
26
28
  }
27
- /** Los de testing van a una subcarpeta y con un pie que avisa que no valen, para no mezclarlos con los reales. */
28
- export function resolvePdfTargetFolder(folder, environment) {
29
- return environment === 'testing' ? join(folder, 'testing') : folder;
29
+ /**
30
+ * Una subcarpeta por CUIT emisor, para que dos emisores con el mismo punto de venta y numero no se pisen. Los de
31
+ * testing van ademas a `testing/` y con un pie que avisa que no valen, para no mezclarlos con los reales.
32
+ */
33
+ export function resolvePdfTargetFolder(folder, environment, cuit) {
34
+ return environment === 'testing' ? join(folder, 'testing', cuit) : join(folder, cuit);
30
35
  }
31
- /** Genera y guarda el PDF de un comprobante emitido. Devuelve la ruta del archivo. */
36
+ /** Genera y guarda el PDF de un comprobante emitido, sin pisar uno existente. Devuelve la ruta del archivo. */
32
37
  export async function exportBillingPdf(input) {
33
38
  const { result } = input;
34
39
  const issuer = resolvePdfIssuer(input.config, result.voucherKind.letter);
@@ -37,11 +42,9 @@ export async function exportBillingPdf(input) {
37
42
  footerText: result.environment === 'testing' ? TESTING_FOOTER : undefined,
38
43
  logo: readLogoAsDataUrl(input.config.emisor.logo),
39
44
  };
40
- const bytes = await input.renderer.render(data, options);
41
- const folder = resolvePdfTargetFolder(input.folder, result.environment);
42
- const path = join(folder, buildPdfFileName(result.voucherKind, data.puntoVenta, data.cbteDesde));
45
+ const bytes = await input.renderer.render(escapeHtmlStrings(data), options);
46
+ const folder = resolvePdfTargetFolder(input.folder, result.environment, issuer.cuit);
43
47
  mkdirSync(folder, { recursive: true });
44
- writeFileSync(path, bytes);
45
- return path;
48
+ return writeNewFile(join(folder, buildPdfFileName(result.voucherKind, data.puntoVenta, data.cbteDesde)), bytes);
46
49
  }
47
50
  //# sourceMappingURL=pdf-exporter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-exporter.js","sourceRoot":"","sources":["../../../src/services/pdf/pdf-exporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pdf-exporter.js","sourceRoot":"","sources":["../../../src/services/pdf/pdf-exporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface CertificateBannerProps {
2
+ readonly expired: boolean;
3
+ readonly guideUrl: string;
4
+ /** Que pasa con el certificado, sin el link: "El certificado de produccion vence el 20/11/2026 (en 10 días)." */
5
+ readonly summary: string;
6
+ }
7
+ /**
8
+ * Aviso del certificado por vencer (amarillo) o vencido (rojo), con el link en su propia linea para que no se
9
+ * corte. Unico lugar que lo arma: lo usan los comandos, el modo interactivo y el storybook.
10
+ */
11
+ export declare function certificateBanner({ expired, guideUrl, summary }: CertificateBannerProps): string;
@@ -0,0 +1,9 @@
1
+ import { noticePanel } from './noticePanel.js';
2
+ /**
3
+ * Aviso del certificado por vencer (amarillo) o vencido (rojo), con el link en su propia linea para que no se
4
+ * corte. Unico lugar que lo arma: lo usan los comandos, el modo interactivo y el storybook.
5
+ */
6
+ export function certificateBanner({ expired, guideUrl, summary }) {
7
+ return noticePanel(`${summary}\nRenovalo: ${guideUrl}`, expired ? 'danger' : 'warning', 'warning');
8
+ }
9
+ //# sourceMappingURL=certificateBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certificateBanner.js","sourceRoot":"","sources":["../../../src/ui/components/certificateBanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAS5C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAA0B;IACtF,OAAO,WAAW,CAAC,GAAG,OAAO,eAAe,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACrG,CAAC"}
@@ -1,3 +1,4 @@
1
+ export * from './certificateBanner';
1
2
  export * from './contentPanel';
2
3
  export * from './errorPanel';
3
4
  export * from './keyValuePanel';
@@ -1,3 +1,4 @@
1
+ export * from './certificateBanner.js';
1
2
  export * from './contentPanel.js';
2
3
  export * from './errorPanel.js';
3
4
  export * from './keyValuePanel.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
@@ -1,8 +1,19 @@
1
1
  import { type UiTextColor } from '../primitives/text';
2
+ /** Ancho de la barra de estado: el preset `wide`, o menos si la terminal es mas angosta. */
3
+ export declare function statusBarWidth(): number;
4
+ /** Un dato de la barra. */
5
+ export interface StatusBarSegment {
6
+ readonly color?: UiTextColor;
7
+ readonly text: string;
8
+ }
9
+ /** Como se separan los datos de un lado: con ` · ` o con un tramo de la misma linea de la barra (` ━ `). */
10
+ export type StatusBarSeparator = 'dot' | 'rule';
11
+ export interface StatusBarOptions {
12
+ readonly leftSeparator?: StatusBarSeparator;
13
+ readonly rightSeparator?: StatusBarSeparator;
14
+ }
2
15
  /**
3
16
  * Barra de una linea con el contexto de la sesion, como la barra de estado de un editor:
4
- * `━━ TITULO ━━━━━━━━━━━━ estado ━━`. No es una caja: no compite con los paneles de contenido.
17
+ * `━━ izquierda · ... ━━━━━━━━━━━━ derecha ━ ... ━━`. No es una caja: no compite con los paneles de contenido.
5
18
  */
6
- /** Ancho de la barra de estado: el preset `wide`, o menos si la terminal es mas angosta. */
7
- export declare function statusBarWidth(): number;
8
- export declare function statusBar(title: string, status: string, statusColor?: UiTextColor): string;
19
+ export declare function statusBar(left: readonly StatusBarSegment[], right?: readonly StatusBarSegment[], options?: StatusBarOptions): string;
@@ -1,27 +1,32 @@
1
1
  import { usesAsciiBorders } from '../primitives/renderPanel.js';
2
2
  import { fitToTerminal } from '../primitives/terminalWidth.js';
3
- import { bold, colorize, stripAnsi } from '../primitives/text.js';
3
+ import { colorize, stripAnsi } from '../primitives/text.js';
4
4
  import { UI_THEME } from '../theme/theme.js';
5
- /**
6
- * Barra de una linea con el contexto de la sesion, como la barra de estado de un editor:
7
- * `━━ TITULO ━━━━━━━━━━━━ estado ━━`. No es una caja: no compite con los paneles de contenido.
8
- */
9
5
  /** Ancho de la barra de estado: el preset `wide`, o menos si la terminal es mas angosta. */
10
6
  export function statusBarWidth() {
11
7
  return fitToTerminal(UI_THEME.widths.wide.min);
12
8
  }
13
- export function statusBar(title, status, statusColor = 'info') {
9
+ function renderSegments(segments, separator, fill) {
10
+ return segments
11
+ .map(({ color, text }) => (color ? colorize(text, color) : text))
12
+ .join(colorize(` ${separator === 'rule' ? fill : '·'} `, 'muted'));
13
+ }
14
+ /**
15
+ * Barra de una linea con el contexto de la sesion, como la barra de estado de un editor:
16
+ * `━━ izquierda · ... ━━━━━━━━━━━━ derecha ━ ... ━━`. No es una caja: no compite con los paneles de contenido.
17
+ */
18
+ export function statusBar(left, right = [], options = {}) {
14
19
  const fill = usesAsciiBorders() ? '=' : '━';
15
20
  const width = statusBarWidth();
16
- const left = ` ${bold(title.toUpperCase())} `;
17
- const right = ` ${colorize(status, statusColor)} `;
18
- const used = 2 + stripAnsi(left).length + stripAnsi(right).length + 2;
21
+ const leftText = ` ${renderSegments(left, options.leftSeparator ?? 'dot', fill)} `;
22
+ const rightText = right.length > 0 ? ` ${renderSegments(right, options.rightSeparator ?? 'dot', fill)} ` : '';
23
+ const used = 2 + stripAnsi(leftText).length + stripAnsi(rightText).length + 2;
19
24
  const middle = Math.max(2, width - used);
20
25
  return [
21
26
  colorize(fill.repeat(2), 'muted'),
22
- left,
27
+ leftText,
23
28
  colorize(fill.repeat(middle), 'muted'),
24
- right,
29
+ rightText,
25
30
  colorize(fill.repeat(2), 'muted'),
26
31
  ].join('');
27
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"statusBar.js","sourceRoot":"","sources":["../../../src/ui/components/statusBar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAoB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;;GAGG;AACH,4FAA4F;AAC5F,MAAM,UAAU,cAAc;IAC5B,OAAO,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,MAAc,EAAE,cAA2B,MAAM;IACxF,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;IAEzC,OAAO;QACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACjC,IAAI;QACJ,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QACtC,KAAK;QACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;KAClC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"statusBar.js","sourceRoot":"","sources":["../../../src/ui/components/statusBar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAoB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,4FAA4F;AAC5F,MAAM,UAAU,cAAc;IAC5B,OAAO,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAgBD,SAAS,cAAc,CAAC,QAAqC,EAAE,SAA6B,EAAE,IAAY;IACxG,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAChE,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,IAAiC,EACjC,QAAqC,EAAE,EACvC,UAA4B,EAAE;IAE9B,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,IAAI,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC;IACnF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,IAAI,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9G,MAAM,IAAI,GAAG,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;IAEzC,OAAO;QACL,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACjC,QAAQ;QACR,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QACtC,SAAS;QACT,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;KAClC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- export { formatConfig, formatConfigAsText, formatConfigDoctor, formatConfigDoctorAsText, formatConfigPath, } from '../../modules/config/config.presenter';
1
+ export { formatConfig, formatConfigAsText, formatConfigDoctor, formatConfigDoctorAsText, formatConfigPath, formatConfigPathAsJson, } from '../../modules/config/config.presenter';
@@ -1,2 +1,2 @@
1
- export { formatConfig, formatConfigAsText, formatConfigDoctor, formatConfigDoctorAsText, formatConfigPath, } from '../../modules/config/config.presenter.js';
1
+ export { formatConfig, formatConfigAsText, formatConfigDoctor, formatConfigDoctorAsText, formatConfigPath, formatConfigPathAsJson, } from '../../modules/config/config.presenter.js';
2
2
  //# sourceMappingURL=config.presenter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.presenter.js","sourceRoot":"","sources":["../../../src/ui/presenters/config.presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC"}
1
+ {"version":3,"file":"config.presenter.js","sourceRoot":"","sources":["../../../src/ui/presenters/config.presenter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,uCAAuC,CAAC"}
@@ -1,6 +1,5 @@
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';
4
3
  import { errorPanel } from '../components/errorPanel.js';
5
4
  import { renderJson } from '../primitives/renderJson.js';
6
5
  import { bold } from '../primitives/text.js';
@@ -9,12 +8,16 @@ function formatErrorTitle(code) {
9
8
  switch (code) {
10
9
  case 'CONFIGURATION_ERROR':
11
10
  return 'Error de configuracion';
11
+ case 'CERTIFICATE_EXPIRED':
12
+ return 'Certificado vencido';
12
13
  case 'INPUT_VALIDATION_ERROR':
13
14
  return 'Error de entrada';
14
15
  case 'BATCH_VALIDATION_ERROR':
15
16
  return 'Lote invalido';
16
17
  case 'BATCH_EMISSION_ERROR':
17
18
  return 'Lote interrumpido';
19
+ case 'EMISSION_UNCERTAIN':
20
+ return 'Emision sin confirmar';
18
21
  case 'PDF_GENERATION_ERROR':
19
22
  case 'PDF_ISSUER_INCOMPLETE':
20
23
  case 'PDF_PLUGIN_MISSING':
@@ -26,7 +29,7 @@ function formatErrorTitle(code) {
26
29
  }
27
30
  }
28
31
  function formatErrorHint(error) {
29
- if (error instanceof PdfError && error.suggestion) {
32
+ if (error.suggestion) {
30
33
  return error.suggestion;
31
34
  }
32
35
  switch (error.code) {
@@ -37,7 +40,7 @@ function formatErrorHint(error) {
37
40
  case 'BATCH_VALIDATION_ERROR':
38
41
  return 'Corrija esos comprobantes en el archivo y vuelva a correr el lote completo.';
39
42
  case 'BATCH_EMISSION_ERROR':
40
- return 'Los comprobantes de arriba ya se emitieron: no los vuelva a cargar. Reintente solo los que quedaron sin procesar.';
43
+ return 'Los comprobantes de arriba ya se emitieron: no los vuelva a cargar. Antes de reintentar el que fallo, verifique con `arcli ultimos` si se emitio; despues reintente los que quedaron sin procesar.';
41
44
  default:
42
45
  return null;
43
46
  }
@@ -88,7 +91,8 @@ export function formatCliError(error, useJson) {
88
91
  codigo: error.code,
89
92
  detalles: formatErrorDetailsAsJson(error.details),
90
93
  error: error.message,
91
- ...(error instanceof PdfError && error.suggestion ? { sugerencia: error.suggestion } : {}),
94
+ // Siempre presente: `null` cuando no hay que sugerir, igual que en los errores inesperados.
95
+ sugerencia: error.suggestion ?? null,
92
96
  });
93
97
  }
94
98
  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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"}
@@ -1,3 +1,4 @@
1
+ import { BILLING_JSON_KEY_BY_INTERNAL_KEY } from '../../modules/billing/billing.json-input.js';
1
2
  import { errorPanel } from '../components/errorPanel.js';
2
3
  import { renderJson } from '../primitives/renderJson.js';
3
4
  import { bold } from '../primitives/text.js';
@@ -26,31 +27,6 @@ const ZOD_PATH_LABELS = {
26
27
  transferMode: 'modalidad de transferencia',
27
28
  untaxedAmount: 'importe no gravado',
28
29
  };
29
- const ZOD_PUBLIC_PATHS = {
30
- associatedPeriod: ['periodoAsociado'],
31
- associatedVoucher: ['comprobanteAsociado'],
32
- billingDate: ['fechaComprobante'],
33
- cancellation: ['anulacion'],
34
- cbu: ['cbu'],
35
- cbuAlias: ['aliasCbu'],
36
- concept: ['concepto'],
37
- currencyCode: ['codigoMoneda'],
38
- documentNumber: ['numeroDocumento'],
39
- documentType: ['tipoDocumento'],
40
- dueDay: ['dia'],
41
- exchangeRate: ['cotizacionMoneda'],
42
- exemptAmount: ['importeExento'],
43
- ivaRate: ['alicuotaIva'],
44
- ivaCondition: ['ivaReceptor'],
45
- paymentDueDate: ['vencimientoPago'],
46
- pointOfSale: ['puntoVenta'],
47
- sameCurrency: ['mismaMoneda'],
48
- serviceEndDate: ['servicioHasta'],
49
- serviceStartDate: ['servicioDesde'],
50
- totalAmount: ['montoTotal'],
51
- transferMode: ['transferencia'],
52
- untaxedAmount: ['importeNoGravado'],
53
- };
54
30
  function formatZodIssuePath(path) {
55
31
  if (path.length === 0) {
56
32
  return 'Entrada';
@@ -80,7 +56,9 @@ function humanizeZodIssue(issue) {
80
56
  }
81
57
  function formatPublicIssuePath(path) {
82
58
  const pathKey = formatZodIssuePath(path);
83
- return ZOD_PUBLIC_PATHS[pathKey] ?? path.map((segment) => String(segment));
59
+ // La clave del JSON sale del esquema de `--cargar`, la misma que se documenta.
60
+ const publicKey = BILLING_JSON_KEY_BY_INTERNAL_KEY[pathKey];
61
+ return publicKey ? [publicKey] : path.map((segment) => String(segment));
84
62
  }
85
63
  /** Resumen de una linea, para listar errores por item (por ejemplo, en un lote). */
86
64
  export function summarizeZodError(error) {
@@ -95,6 +73,7 @@ export function formatZodError(error, useJson) {
95
73
  ruta: formatPublicIssuePath(issue.path),
96
74
  })),
97
75
  error: 'Hay parametros invalidos o incompletos en la entrada.',
76
+ sugerencia: null,
98
77
  });
99
78
  }
100
79
  const detailLines = error.issues.map((issue) => {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.zod-presenter.js","sourceRoot":"","sources":["../../../src/ui/presenters/errors.zod-presenter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.zod-presenter.js","sourceRoot":"","sources":["../../../src/ui/presenters/errors.zod-presenter.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  export declare const ARCLI_ASCII_BANNER: string;
2
- export declare function renderLogo(): string;
2
+ /** El logo de ARCLI, centrado; con `version`, la muestra debajo, junto a la firma. */
3
+ export declare function renderLogo(version?: string): string;
@@ -1,3 +1,5 @@
1
+ import { UI_THEME } from '../theme/theme.js';
2
+ import { fitToTerminal } from './terminalWidth.js';
1
3
  import { colorize } from './text.js';
2
4
  export const ARCLI_ASCII_BANNER = [
3
5
  ' d8888 8888888b. .d8888b. 888 8888888 ',
@@ -13,21 +15,36 @@ export const ARCLI_ASCII_BANNER = [
13
15
  // segun las columnas en blanco de ARCLI_ASCII_BANNER (letras separadas por
14
16
  // una columna vacia en las 8 filas: 12, 23, 34, 43).
15
17
  const ARCLI_BANNER_AR_CLI_SPLIT_COLUMN = 23;
18
+ // Ultima columna con trazo de ARCLI_ASCII_BANNER (el final de la "I"): la firma termina justo debajo.
19
+ const BANNER_LAST_COLUMN = 50;
20
+ const CREDIT = 'LcsGrz';
21
+ /** Debajo del logo, en gris y alineado al final de la "I": `v1.8.0 | LcsGrz`, o solo la firma sin version. */
22
+ function renderLogoFooter(version) {
23
+ const footer = version ? `v${version} | ${CREDIT}` : CREDIT;
24
+ return colorize(footer.padStart(BANNER_LAST_COLUMN + 1), 'muted');
25
+ }
16
26
  function renderLogoWidth() {
17
27
  return ARCLI_ASCII_BANNER.split('\n')[0]?.length ?? 0;
18
28
  }
19
- export function renderLogo() {
29
+ /** Sangria para centrar el logo en el ancho de las cajas y de la barra de estado. */
30
+ function logoIndent() {
31
+ const visibleWidth = BANNER_LAST_COLUMN + 1;
32
+ return ' '.repeat(Math.max(0, Math.floor((fitToTerminal(UI_THEME.widths.wide.min) - visibleWidth) / 2)));
33
+ }
34
+ /** El logo de ARCLI, centrado; con `version`, la muestra debajo, junto a la firma. */
35
+ export function renderLogo(version) {
20
36
  const columns = process.stdout.columns;
21
37
  // En una terminal mas angosta que el dibujo, cada linea se partiria: se muestra solo el nombre.
22
38
  if (columns && columns < renderLogoWidth()) {
23
- return `\n${colorize('AR', 'info')}${colorize('CLI', 'neutral')}\n`;
39
+ const suffix = version ? ` ${colorize(`v${version}`, 'muted')}` : '';
40
+ return `\n${colorize('AR', 'info')}${colorize('CLI', 'neutral')}${suffix}\n`;
24
41
  }
25
42
  const logo = ARCLI_ASCII_BANNER.split('\n').map((line) => {
26
43
  const ar = line.slice(0, ARCLI_BANNER_AR_CLI_SPLIT_COLUMN);
27
44
  const cli = line.slice(ARCLI_BANNER_AR_CLI_SPLIT_COLUMN);
28
45
  return `${colorize(ar, 'info')}${colorize(cli, 'neutral')}`;
29
46
  });
30
- const credit = '-LcsGrz'.padStart(renderLogoWidth() - 1);
31
- return `\n\n${[...logo, credit].join('\n')}\n\n`;
47
+ const indent = logoIndent();
48
+ return `\n\n${[...logo, renderLogoFooter(version)].map((line) => `${indent}${line}`).join('\n')}\n\n`;
32
49
  }
33
50
  //# sourceMappingURL=renderLogo.js.map