arcli 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/README.md +9 -3
  3. package/dist/cli/commands/billing.command.interactive-preview.d.ts +1 -0
  4. package/dist/cli/commands/billing.command.interactive-preview.js +5 -1
  5. package/dist/cli/commands/billing.command.interactive-preview.js.map +1 -1
  6. package/dist/cli/commands/billing.command.options.js +17 -1
  7. package/dist/cli/commands/billing.command.options.js.map +1 -1
  8. package/dist/cli/commands/billing.command.parser.d.ts +3 -0
  9. package/dist/cli/commands/billing.command.parser.js +36 -2
  10. package/dist/cli/commands/billing.command.parser.js.map +1 -1
  11. package/dist/cli/commands/billing.command.shared.js +26 -5
  12. package/dist/cli/commands/billing.command.shared.js.map +1 -1
  13. package/dist/cli/commands/config.command.d.ts +5 -0
  14. package/dist/cli/commands/config.command.js +3 -3
  15. package/dist/cli/commands/config.command.js.map +1 -1
  16. package/dist/cli/commands/fce-obligation.command.d.ts +2 -0
  17. package/dist/cli/commands/fce-obligation.command.js +51 -0
  18. package/dist/cli/commands/fce-obligation.command.js.map +1 -0
  19. package/dist/cli/commands/interactive.command.d.ts +3 -0
  20. package/dist/cli/commands/interactive.command.js +22 -0
  21. package/dist/cli/commands/interactive.command.js.map +1 -0
  22. package/dist/cli/commands/storybook.command.js +3 -2
  23. package/dist/cli/commands/storybook.command.js.map +1 -1
  24. package/dist/cli/help.d.ts +1 -0
  25. package/dist/cli/help.js +65 -3
  26. package/dist/cli/help.js.map +1 -1
  27. package/dist/cli/index.js +3 -1
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/cli/interactive/history.flow.d.ts +2 -0
  30. package/dist/cli/interactive/history.flow.js +31 -0
  31. package/dist/cli/interactive/history.flow.js.map +1 -0
  32. package/dist/cli/interactive/interactive-mode.d.ts +3 -0
  33. package/dist/cli/interactive/interactive-mode.js +92 -0
  34. package/dist/cli/interactive/interactive-mode.js.map +1 -0
  35. package/dist/cli/interactive/invoice.flow.d.ts +2 -0
  36. package/dist/cli/interactive/invoice.flow.js +54 -0
  37. package/dist/cli/interactive/invoice.flow.js.map +1 -0
  38. package/dist/cli/interactive/note.flow.d.ts +2 -0
  39. package/dist/cli/interactive/note.flow.js +99 -0
  40. package/dist/cli/interactive/note.flow.js.map +1 -0
  41. package/dist/cli/interactive/prompts.d.ts +13 -0
  42. package/dist/cli/interactive/prompts.js +24 -0
  43. package/dist/cli/interactive/prompts.js.map +1 -0
  44. package/dist/cli/interactive/session.d.ts +22 -0
  45. package/dist/cli/interactive/session.js +86 -0
  46. package/dist/cli/interactive/session.js.map +1 -0
  47. package/dist/cli/interactive/validators.d.ts +5 -0
  48. package/dist/cli/interactive/validators.js +17 -0
  49. package/dist/cli/interactive/validators.js.map +1 -0
  50. package/dist/cli/interactive/voucher-format.d.ts +4 -0
  51. package/dist/cli/interactive/voucher-format.js +28 -0
  52. package/dist/cli/interactive/voucher-format.js.map +1 -0
  53. package/dist/cli/program.js +4 -0
  54. package/dist/cli/program.js.map +1 -1
  55. package/dist/cli/spinner.d.ts +8 -0
  56. package/dist/cli/spinner.js +14 -0
  57. package/dist/cli/spinner.js.map +1 -0
  58. package/dist/cli/version.d.ts +1 -1
  59. package/dist/cli/version.js +1 -1
  60. package/dist/lib/dates/arca-date.d.ts +4 -0
  61. package/dist/lib/dates/arca-date.js +18 -1
  62. package/dist/lib/dates/arca-date.js.map +1 -1
  63. package/dist/modules/billing/billing.amounts.d.ts +12 -2
  64. package/dist/modules/billing/billing.amounts.js +52 -10
  65. package/dist/modules/billing/billing.amounts.js.map +1 -1
  66. package/dist/modules/billing/billing.associated-period.d.ts +8 -0
  67. package/dist/modules/billing/billing.associated-period.js +40 -0
  68. package/dist/modules/billing/billing.associated-period.js.map +1 -0
  69. package/dist/modules/billing/billing.associated-vouchers.d.ts +2 -0
  70. package/dist/modules/billing/billing.associated-vouchers.js +29 -7
  71. package/dist/modules/billing/billing.associated-vouchers.js.map +1 -1
  72. package/dist/modules/billing/billing.currency.d.ts +18 -0
  73. package/dist/modules/billing/billing.currency.js +53 -0
  74. package/dist/modules/billing/billing.currency.js.map +1 -0
  75. package/dist/modules/billing/billing.date-range.d.ts +5 -4
  76. package/dist/modules/billing/billing.date-range.js +34 -27
  77. package/dist/modules/billing/billing.date-range.js.map +1 -1
  78. package/dist/modules/billing/billing.display.js +30 -4
  79. package/dist/modules/billing/billing.display.js.map +1 -1
  80. package/dist/modules/billing/billing.fce.d.ts +21 -0
  81. package/dist/modules/billing/billing.fce.js +59 -0
  82. package/dist/modules/billing/billing.fce.js.map +1 -0
  83. package/dist/modules/billing/billing.iva-receptor.d.ts +8 -0
  84. package/dist/modules/billing/billing.iva-receptor.js +61 -0
  85. package/dist/modules/billing/billing.iva-receptor.js.map +1 -0
  86. package/dist/modules/billing/billing.labels.js +1 -1
  87. package/dist/modules/billing/billing.mappers.js +2 -1
  88. package/dist/modules/billing/billing.mappers.js.map +1 -1
  89. package/dist/modules/billing/billing.schemas.d.ts +40 -7
  90. package/dist/modules/billing/billing.schemas.js +38 -1
  91. package/dist/modules/billing/billing.schemas.js.map +1 -1
  92. package/dist/modules/billing/billing.serialize.js +2 -0
  93. package/dist/modules/billing/billing.serialize.js.map +1 -1
  94. package/dist/modules/billing/billing.service.d.ts +12 -0
  95. package/dist/modules/billing/billing.service.js +68 -10
  96. package/dist/modules/billing/billing.service.js.map +1 -1
  97. package/dist/modules/billing/billing.text.js +20 -8
  98. package/dist/modules/billing/billing.text.js.map +1 -1
  99. package/dist/modules/billing/billing.types.internal.d.ts +2 -0
  100. package/dist/modules/billing/billing.validation.d.ts +4 -2
  101. package/dist/modules/billing/billing.validation.js +36 -1
  102. package/dist/modules/billing/billing.validation.js.map +1 -1
  103. package/dist/modules/config/config-value-parser.d.ts +1 -1
  104. package/dist/modules/config/config-value-parser.js +29 -1
  105. package/dist/modules/config/config-value-parser.js.map +1 -1
  106. package/dist/modules/config/config.presenter.js +10 -2
  107. package/dist/modules/config/config.presenter.js.map +1 -1
  108. package/dist/modules/config/config.schemas.d.ts +26 -3
  109. package/dist/modules/config/config.schemas.js +19 -0
  110. package/dist/modules/config/config.schemas.js.map +1 -1
  111. package/dist/modules/config/config.service.js +4 -0
  112. package/dist/modules/config/config.service.js.map +1 -1
  113. package/dist/modules/examples/examples.d.ts +1 -1
  114. package/dist/modules/examples/examples.js +62 -38
  115. package/dist/modules/examples/examples.js.map +1 -1
  116. package/dist/modules/fce/fce-obligation.d.ts +20 -0
  117. package/dist/modules/fce/fce-obligation.js +33 -0
  118. package/dist/modules/fce/fce-obligation.js.map +1 -0
  119. package/dist/modules/fce/fce-obligation.presenter.d.ts +9 -0
  120. package/dist/modules/fce/fce-obligation.presenter.js +32 -0
  121. package/dist/modules/fce/fce-obligation.presenter.js.map +1 -0
  122. package/dist/modules/interactive/amount-input.d.ts +6 -0
  123. package/dist/modules/interactive/amount-input.js +29 -0
  124. package/dist/modules/interactive/amount-input.js.map +1 -0
  125. package/dist/modules/interactive/choices.d.ts +13 -0
  126. package/dist/modules/interactive/choices.js +56 -0
  127. package/dist/modules/interactive/choices.js.map +1 -0
  128. package/dist/modules/interactive/equivalent-command.d.ts +8 -0
  129. package/dist/modules/interactive/equivalent-command.js +85 -0
  130. package/dist/modules/interactive/equivalent-command.js.map +1 -0
  131. package/dist/modules/interactive/voucher-history.d.ts +25 -0
  132. package/dist/modules/interactive/voucher-history.js +42 -0
  133. package/dist/modules/interactive/voucher-history.js.map +1 -0
  134. package/dist/modules/storybook/showcase.d.ts +1 -1
  135. package/dist/modules/storybook/showcase.js +50 -6
  136. package/dist/modules/storybook/showcase.js.map +1 -1
  137. package/dist/modules/update-check/update-check.presenter.js +1 -1
  138. package/dist/modules/update-check/update-check.presenter.js.map +1 -1
  139. package/dist/services/arca/arca-billing.gateway.d.ts +1 -0
  140. package/dist/services/arca/arca-billing.gateway.js +12 -0
  141. package/dist/services/arca/arca-billing.gateway.js.map +1 -1
  142. package/dist/services/arca/arca-fce-obligation.gateway.d.ts +7 -0
  143. package/dist/services/arca/arca-fce-obligation.gateway.js +36 -0
  144. package/dist/services/arca/arca-fce-obligation.gateway.js.map +1 -0
  145. package/dist/services/arca/arca-voucher-history.gateway.d.ts +8 -0
  146. package/dist/services/arca/arca-voucher-history.gateway.js +28 -0
  147. package/dist/services/arca/arca-voucher-history.gateway.js.map +1 -0
  148. package/dist/ui/components/contentPanel.d.ts +2 -2
  149. package/dist/ui/components/contentPanel.js +2 -1
  150. package/dist/ui/components/contentPanel.js.map +1 -1
  151. package/dist/ui/components/errorPanel.js +3 -3
  152. package/dist/ui/components/errorPanel.js.map +1 -1
  153. package/dist/ui/components/index.d.ts +3 -0
  154. package/dist/ui/components/index.js +3 -0
  155. package/dist/ui/components/index.js.map +1 -1
  156. package/dist/ui/components/keyValuePanel.d.ts +2 -2
  157. package/dist/ui/components/keyValuePanel.js +2 -1
  158. package/dist/ui/components/keyValuePanel.js.map +1 -1
  159. package/dist/ui/components/rawPanel.js +1 -1
  160. package/dist/ui/components/rawPanel.js.map +1 -1
  161. package/dist/ui/components/sectionHeading.d.ts +3 -0
  162. package/dist/ui/components/sectionHeading.js +13 -0
  163. package/dist/ui/components/sectionHeading.js.map +1 -0
  164. package/dist/ui/components/statusBar.d.ts +6 -0
  165. package/dist/ui/components/statusBar.js +24 -0
  166. package/dist/ui/components/statusBar.js.map +1 -0
  167. package/dist/ui/components/statusPanel.d.ts +2 -2
  168. package/dist/ui/components/statusPanel.js +2 -1
  169. package/dist/ui/components/statusPanel.js.map +1 -1
  170. package/dist/ui/components/testingBanner.d.ts +2 -0
  171. package/dist/ui/components/testingBanner.js +6 -0
  172. package/dist/ui/components/testingBanner.js.map +1 -0
  173. package/dist/ui/presenters/errors.zod-presenter.js +22 -1
  174. package/dist/ui/presenters/errors.zod-presenter.js.map +1 -1
  175. package/dist/ui/primitives/renderLogo.js +5 -0
  176. package/dist/ui/primitives/renderLogo.js.map +1 -1
  177. package/dist/ui/primitives/renderPanel.d.ts +3 -1
  178. package/dist/ui/primitives/renderPanel.js +68 -21
  179. package/dist/ui/primitives/renderPanel.js.map +1 -1
  180. package/dist/ui/primitives/terminalWidth.d.ts +4 -0
  181. package/dist/ui/primitives/terminalWidth.js +11 -0
  182. package/dist/ui/primitives/terminalWidth.js.map +1 -0
  183. package/dist/ui/primitives/text.d.ts +5 -0
  184. package/dist/ui/primitives/text.js +91 -29
  185. package/dist/ui/primitives/text.js.map +1 -1
  186. package/dist/ui/theme/theme.d.ts +45 -4
  187. package/dist/ui/theme/theme.js +183 -5
  188. package/dist/ui/theme/theme.js.map +1 -1
  189. package/llms.txt +17 -5
  190. package/package.json +17 -14
@@ -0,0 +1,99 @@
1
+ import { formatArcaDateAsArgentineDate } from '../../lib/dates/arca-date.js';
2
+ import { formatMoneyLabel } from '../../modules/billing/billing.labels.js';
3
+ import { billingCommandSchema } from '../../modules/billing/billing.schemas.js';
4
+ import { parseAmountInput } from '../../modules/interactive/amount-input.js';
5
+ import { invoiceKindChoices, ivaConditionChoices, ivaRateChoices, noteKindChoices, } from '../../modules/interactive/choices.js';
6
+ import { inferIvaRate, listRecentVouchers, resolveDocumentType, } from '../../modules/interactive/voucher-history.js';
7
+ import { noticePanel, writeTerminalOutput } from '../../ui/index.js';
8
+ import { startSpinner } from '../spinner.js';
9
+ import { askText, chooseOne, confirm } from './prompts.js';
10
+ import { previewAndEmit, requirePointOfSale } from './session.js';
11
+ import { validateAmount } from './validators.js';
12
+ import { formatVoucherSummary } from './voucher-format.js';
13
+ const CONCEPTS_BY_CODE = {
14
+ 1: 'productos',
15
+ 2: 'servicios',
16
+ 3: 'productos-servicios',
17
+ };
18
+ async function askNoteAmount(kind, invoice) {
19
+ if (kind === 'debito') {
20
+ return parseAmountInput(await askText('Monto de la nota de debito:', { validate: validateAmount }));
21
+ }
22
+ const scope = await chooseOne('¿Total o parcial?', [
23
+ { name: `Anular el total (${formatMoneyLabel(invoice.total)})`, value: 'total' },
24
+ { name: 'Parcial (ingresar monto)', value: 'parcial' },
25
+ ]);
26
+ if (scope === 'total') {
27
+ return invoice.total;
28
+ }
29
+ const answer = await askText('Monto de la nota de credito:', {
30
+ validate: (value) => {
31
+ const valid = validateAmount(value);
32
+ if (valid !== true) {
33
+ return valid;
34
+ }
35
+ return (parseAmountInput(value) ?? 0) <= invoice.total
36
+ ? true
37
+ : `No puede superar el total de la factura (${formatMoneyLabel(invoice.total)}).`;
38
+ },
39
+ });
40
+ return parseAmountInput(answer);
41
+ }
42
+ export async function runNoteFlow(session) {
43
+ const pointOfSale = requirePointOfSale(session);
44
+ if (!pointOfSale) {
45
+ return;
46
+ }
47
+ const kind = await chooseOne('¿Que nota queres emitir?', [
48
+ { name: 'Nota de credito (descuento, devolucion o anulacion)', value: 'credito' },
49
+ { name: 'Nota de debito (cargo adicional)', value: 'debito' },
50
+ ]);
51
+ const invoiceKind = await chooseOne('¿Sobre que tipo de factura?', invoiceKindChoices());
52
+ const spinner = startSpinner('Buscando las ultimas facturas en ARCA...');
53
+ const invoices = await listRecentVouchers(session.historyGateway, pointOfSale, invoiceKind.arcaType).finally(() => spinner?.stop());
54
+ if (invoices.length === 0) {
55
+ writeTerminalOutput(noticePanel(`No hay ${invoiceKind.displayName} emitidas en el punto de venta ${pointOfSale}.`, 'warning'));
56
+ return;
57
+ }
58
+ const invoice = await chooseOne(`¿Sobre que ${invoiceKind.displayName}?`, invoices.map((item) => ({
59
+ description: item.cae ? `CAE ${item.cae}` : undefined,
60
+ name: formatVoucherSummary(pointOfSale, item),
61
+ value: item,
62
+ })));
63
+ const documentType = resolveDocumentType(invoice.documentTypeCode);
64
+ if (!documentType) {
65
+ writeTerminalOutput(noticePanel('La factura tiene un tipo de documento que el asistente no soporta. Usa los flags del CLI.', 'warning'));
66
+ return;
67
+ }
68
+ const noteKind = noteKindChoices(kind, invoiceKind);
69
+ const totalAmount = await askNoteAmount(kind, invoice);
70
+ const ivaCondition = documentType === 'consumidor-final'
71
+ ? 'consumidor-final'
72
+ : await chooseOne('Condicion frente al IVA del receptor:', ivaConditionChoices(invoiceKind.letter));
73
+ const inferredRate = invoiceKind.letter === 'c' ? undefined : inferIvaRate(invoice.netAmount, invoice.ivaAmount);
74
+ const ivaRate = invoiceKind.letter === 'c'
75
+ ? undefined
76
+ : (inferredRate ?? (await chooseOne('Alicuota de IVA de la factura:', ivaRateChoices())));
77
+ const cancellation = noteKind.isElectronicCredit
78
+ ? await confirm('¿El comprador rechazo la factura?', 'Si, es una nota de anulacion', 'No')
79
+ : false;
80
+ const input = billingCommandSchema.parse({
81
+ associatedVoucher: {
82
+ cuit: String(session.runtime.context.cuit),
83
+ fecha: formatArcaDateAsArgentineDate(invoice.date),
84
+ numero: invoice.number,
85
+ puntoVenta: pointOfSale,
86
+ shortcut: invoiceKind.shortcut,
87
+ },
88
+ cancellation,
89
+ concept: CONCEPTS_BY_CODE[invoice.concept ?? 2] ?? 'servicios',
90
+ documentNumber: documentType === 'consumidor-final' ? undefined : invoice.documentNumber,
91
+ documentType,
92
+ ivaCondition,
93
+ ivaRate: ivaRate === '21' && !session.runtime.config.alicuotaPorDefecto ? undefined : ivaRate,
94
+ shortcut: noteKind.shortcut,
95
+ totalAmount,
96
+ });
97
+ await previewAndEmit(session, input);
98
+ }
99
+ //# sourceMappingURL=note.flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note.flow.js","sourceRoot":"","sources":["../../../src/cli/interactive/note.flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface Choice<T> {
2
+ readonly description?: string;
3
+ readonly name: string;
4
+ readonly value: T;
5
+ }
6
+ export declare function chooseOne<T>(message: string, choices: ReadonlyArray<Choice<T>>, defaultValue?: T): Promise<T>;
7
+ export declare function askText(message: string, options?: {
8
+ readonly defaultValue?: string;
9
+ readonly validate?: (value: string) => string | true;
10
+ }): Promise<string>;
11
+ export declare function confirm(message: string, yesLabel: string, noLabel?: string): Promise<boolean>;
12
+ /** Ctrl+C dentro de un prompt de @inquirer. */
13
+ export declare function isPromptCancellation(error: unknown): boolean;
@@ -0,0 +1,24 @@
1
+ import input from '@inquirer/input';
2
+ import select from '@inquirer/select';
3
+ export async function chooseOne(message, choices, defaultValue) {
4
+ return select({ choices: [...choices], default: defaultValue, loop: false, message, pageSize: 12 });
5
+ }
6
+ export async function askText(message, options = {}) {
7
+ const answer = await input({
8
+ default: options.defaultValue,
9
+ message,
10
+ validate: options.validate,
11
+ });
12
+ return answer.trim();
13
+ }
14
+ export async function confirm(message, yesLabel, noLabel = 'Cancelar') {
15
+ return chooseOne(message, [
16
+ { name: yesLabel, value: true },
17
+ { name: noLabel, value: false },
18
+ ]);
19
+ }
20
+ /** Ctrl+C dentro de un prompt de @inquirer. */
21
+ export function isPromptCancellation(error) {
22
+ return error instanceof Error && error.name === 'ExitPromptError';
23
+ }
24
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/cli/interactive/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,MAAM,MAAM,kBAAkB,CAAC;AAQtC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,OAAe,EAAE,OAAiC,EAAE,YAAgB;IACrG,OAAO,MAAM,CAAI,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAe,EACf,UAAoG,EAAE;IAEtG,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;QACzB,OAAO,EAAE,OAAO,CAAC,YAAY;QAC7B,OAAO;QACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,QAAgB,EAAE,OAAO,GAAG,UAAU;IACnF,OAAO,SAAS,CAAC,OAAO,EAAE;QACxB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;QAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;KAChC,CAAC,CAAC;AACL,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC;AACpE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Arca } from '@arcasdk/core';
2
+ import type { BillingCommandInput } from '../../modules/billing/billing.schemas';
3
+ import { BillingService } from '../../modules/billing/billing.service';
4
+ import type { BillingGateway } from '../../modules/billing/billing.types.internal';
5
+ import type { VoucherHistoryGateway } from '../../modules/interactive/voucher-history';
6
+ import { type ResolvedArcaRuntime } from '../../services/arca/arca-context.resolver';
7
+ import type { GlobalCliOptions } from '../types';
8
+ export interface InteractiveSession {
9
+ readonly arca: Arca;
10
+ readonly billingGateway: BillingGateway;
11
+ readonly historyGateway: VoucherHistoryGateway;
12
+ readonly runtime: ResolvedArcaRuntime;
13
+ readonly service: BillingService;
14
+ }
15
+ /** Resuelve config y credenciales; si falta algo, el error explica que configurar. */
16
+ export declare function createInteractiveSession(options: GlobalCliOptions): InteractiveSession;
17
+ export declare function requirePointOfSale(session: InteractiveSession): number | undefined;
18
+ /**
19
+ * Paso final comun a todos los flujos: vista previa, comando equivalente, confirmacion y emision.
20
+ * Usa BillingService igual que los comandos con flags, asi que valida y emite exactamente lo mismo.
21
+ */
22
+ export declare function previewAndEmit(session: InteractiveSession, rawInput: BillingCommandInput): Promise<void>;
@@ -0,0 +1,86 @@
1
+ import { BillingService } from '../../modules/billing/billing.service.js';
2
+ import { buildEquivalentCommand } from '../../modules/interactive/equivalent-command.js';
3
+ import { ArcaBillingGateway } from '../../services/arca/arca-billing.gateway.js';
4
+ import { ArcaClientFactory } from '../../services/arca/arca-client.factory.js';
5
+ import { ArcaContextResolver } from '../../services/arca/arca-context.resolver.js';
6
+ import { ArcaFceObligationGateway } from '../../services/arca/arca-fce-obligation.gateway.js';
7
+ import { ArcaVoucherHistoryGateway } from '../../services/arca/arca-voucher-history.gateway.js';
8
+ import { colorize, noticePanel, renderPanel, writeTerminalOutput } from '../../ui/index.js';
9
+ import { formatBillingOutputs } from '../commands/billing.command.output.js';
10
+ import { startSpinner } from '../spinner.js';
11
+ import { confirm } from './prompts.js';
12
+ const PREVIEW_GATEWAY = {
13
+ createNextVoucher: async () => {
14
+ throw new Error('La vista previa no emite comprobantes.');
15
+ },
16
+ getQuotation: async () => {
17
+ throw new Error('La vista previa no consulta cotizaciones.');
18
+ },
19
+ };
20
+ /** Resuelve config y credenciales; si falta algo, el error explica que configurar. */
21
+ export function createInteractiveSession(options) {
22
+ const runtime = new ArcaContextResolver({ options }).resolve();
23
+ const arca = new ArcaClientFactory().create(runtime);
24
+ return {
25
+ arca,
26
+ billingGateway: new ArcaBillingGateway(arca),
27
+ historyGateway: new ArcaVoucherHistoryGateway(arca),
28
+ runtime,
29
+ service: new BillingService(),
30
+ };
31
+ }
32
+ export function requirePointOfSale(session) {
33
+ if (!session.runtime.pointOfSale) {
34
+ writeTerminalOutput(noticePanel('Falta el punto de venta. Configuralo con "arcli config establecer puntoVenta <numero>".', 'warning'));
35
+ }
36
+ return session.runtime.pointOfSale;
37
+ }
38
+ function formatEquivalentCommand(command) {
39
+ return renderPanel({
40
+ borderType: 'command',
41
+ content: [colorize('Esto equivale a:', 'muted'), '', colorize(command, 'info')],
42
+ contentAlign: 'left',
43
+ width: 'wide',
44
+ });
45
+ }
46
+ /**
47
+ * Paso final comun a todos los flujos: vista previa, comando equivalente, confirmacion y emision.
48
+ * Usa BillingService igual que los comandos con flags, asi que valida y emite exactamente lo mismo.
49
+ */
50
+ export async function previewAndEmit(session, rawInput) {
51
+ const { runtime, service } = session;
52
+ const input = { ...rawInput, dryRun: true, emit: false };
53
+ const warnings = runtime.config.verificarFce
54
+ ? await service.resolveFceWarnings(input, new ArcaFceObligationGateway(session.arca))
55
+ : [];
56
+ const preview = await service.execute({ gateway: PREVIEW_GATEWAY, input, runtime, warnings });
57
+ writeTerminalOutput(formatBillingOutputs([preview], { environment: runtime.environment, raw: false }));
58
+ writeTerminalOutput(formatEquivalentCommand(buildEquivalentCommand(input, { environment: runtime.environment })));
59
+ const label = preview.voucherKind.displayName;
60
+ const environmentLabel = runtime.environment === 'produccion' ? 'PRODUCCION' : 'testing';
61
+ if (!(await confirm(`¿Emitimos la ${label} en ${environmentLabel}?`, 'Emitir ahora'))) {
62
+ writeTerminalOutput(noticePanel('No se emitio nada.', 'muted'));
63
+ return;
64
+ }
65
+ if (runtime.environment === 'produccion' &&
66
+ !(await confirm('Vas a emitir un comprobante real en PRODUCCION. ¿Confirmas?', 'Si, emitir en produccion'))) {
67
+ writeTerminalOutput(noticePanel('No se emitio nada.', 'muted'));
68
+ return;
69
+ }
70
+ const spinner = startSpinner(`Emitiendo ${label} en ARCA...`);
71
+ try {
72
+ const result = await service.execute({
73
+ gateway: session.billingGateway,
74
+ input: { ...input, dryRun: false, emit: true },
75
+ runtime,
76
+ warnings,
77
+ });
78
+ spinner?.stop();
79
+ writeTerminalOutput(formatBillingOutputs([result], { environment: runtime.environment, previewShown: true, raw: false }));
80
+ }
81
+ catch (error) {
82
+ spinner?.stop();
83
+ throw error;
84
+ }
85
+ }
86
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/cli/interactive/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function validateAmount(value: string): string | true;
2
+ export declare function validateCuit(value: string): string | true;
3
+ export declare function validateDni(value: string): string | true;
4
+ export declare function validateCbu(value: string): string | true;
5
+ export declare function normalizeDocumentNumber(value: string): number;
@@ -0,0 +1,17 @@
1
+ import { parseAmountInput } from '../../modules/interactive/amount-input.js';
2
+ export function validateAmount(value) {
3
+ return parseAmountInput(value) ? true : 'Ingresa un monto mayor a 0, por ejemplo 150000 o 1500,50.';
4
+ }
5
+ export function validateCuit(value) {
6
+ return /^\d{11}$/.test(value.replace(/-/g, '')) ? true : 'El CUIT tiene 11 digitos.';
7
+ }
8
+ export function validateDni(value) {
9
+ return /^\d{7,8}$/.test(value.replace(/\./g, '')) ? true : 'El DNI tiene 7 u 8 digitos.';
10
+ }
11
+ export function validateCbu(value) {
12
+ return /^\d{22}$/.test(value) ? true : 'El CBU tiene 22 digitos.';
13
+ }
14
+ export function normalizeDocumentNumber(value) {
15
+ return Number(value.replace(/[-.]/g, ''));
16
+ }
17
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../src/cli/interactive/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAE1E,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,2DAA2D,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,2BAA2B,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { IssuedVoucher } from '../../modules/interactive/voucher-history';
2
+ export declare function formatVoucherNumber(pointOfSale: number, number: number): string;
3
+ export declare function formatReceiver(voucher: IssuedVoucher): string;
4
+ export declare function formatVoucherSummary(pointOfSale: number, voucher: IssuedVoucher): string;
@@ -0,0 +1,28 @@
1
+ import { formatArcaDateAsArgentineDate } from '../../lib/dates/arca-date.js';
2
+ import { formatMoneyLabel } from '../../modules/billing/billing.labels.js';
3
+ export function formatVoucherNumber(pointOfSale, number) {
4
+ return `${String(pointOfSale).padStart(5, '0')}-${String(number).padStart(8, '0')}`;
5
+ }
6
+ export function formatReceiver(voucher) {
7
+ switch (voucher.documentTypeCode) {
8
+ case 80:
9
+ return `CUIT ${voucher.documentNumber}`;
10
+ case 86:
11
+ return `CUIL ${voucher.documentNumber}`;
12
+ case 96:
13
+ return `DNI ${voucher.documentNumber}`;
14
+ case 99:
15
+ return 'Consumidor final';
16
+ default:
17
+ return `Doc ${voucher.documentTypeCode} ${voucher.documentNumber}`;
18
+ }
19
+ }
20
+ export function formatVoucherSummary(pointOfSale, voucher) {
21
+ return [
22
+ `N° ${formatVoucherNumber(pointOfSale, voucher.number)}`,
23
+ formatArcaDateAsArgentineDate(voucher.date),
24
+ formatReceiver(voucher).padEnd(20),
25
+ formatMoneyLabel(voucher.total),
26
+ ].join(' · ');
27
+ }
28
+ //# sourceMappingURL=voucher-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voucher-format.js","sourceRoot":"","sources":["../../../src/cli/interactive/voucher-format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAGxE,MAAM,UAAU,mBAAmB,CAAC,WAAmB,EAAE,MAAc;IACrE,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAsB;IACnD,QAAQ,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACjC,KAAK,EAAE;YACL,OAAO,QAAQ,OAAO,CAAC,cAAc,EAAE,CAAC;QAC1C,KAAK,EAAE;YACL,OAAO,QAAQ,OAAO,CAAC,cAAc,EAAE,CAAC;QAC1C,KAAK,EAAE;YACL,OAAO,OAAO,OAAO,CAAC,cAAc,EAAE,CAAC;QACzC,KAAK,EAAE;YACL,OAAO,kBAAkB,CAAC;QAC5B;YACE,OAAO,OAAO,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IACvE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,OAAsB;IAC9E,OAAO;QACL,MAAM,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;QACxD,6BAA6B,CAAC,OAAO,CAAC,IAAI,CAAC;QAC3C,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;KAChC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClB,CAAC"}
@@ -4,6 +4,8 @@ import { registerBillingFamilyCommands } from './commands/billing-family.command
4
4
  import { registerBillingShortcutCommands } from './commands/billing-shortcuts.command.js';
5
5
  import { registerConfigCommand } from './commands/config.command.js';
6
6
  import { registerExamplesCommand } from './commands/examples.command.js';
7
+ import { registerFceObligationCommand } from './commands/fce-obligation.command.js';
8
+ import { registerInteractiveCommand } from './commands/interactive.command.js';
7
9
  import { registerStorybookCommand } from './commands/storybook.command.js';
8
10
  import { configureSpanishHelp, createProgramHeader, createProgramHelp } from './help.js';
9
11
  import { CLI_VERSION } from './version.js';
@@ -20,6 +22,8 @@ export function createProgram() {
20
22
  registerBillingFamilyCommands(program);
21
23
  registerConfigCommand(program);
22
24
  registerExamplesCommand(program);
25
+ registerFceObligationCommand(program);
26
+ registerInteractiveCommand(program);
23
27
  registerStorybookCommand(program);
24
28
  program.addHelpText('beforeAll', ({ command }) => (command === program ? createProgramHeader() : ''));
25
29
  program.addHelpText('afterAll', ({ command }) => (command === program ? createProgramHelp() : ''));
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CACV,6HAA6H,CAC9H;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,kBAAkB,CAAC,4CAA4C,CAAC,CAAC;IAEpE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,+BAA+B,CAAC,OAAO,CAAC,CAAC;IACzC,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAElC,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtG,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnG,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CACV,6HAA6H,CAC9H;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,kBAAkB,CAAC,4CAA4C,CAAC,CAAC;IAEpE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,+BAA+B,CAAC,OAAO,CAAC,CAAC;IACzC,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACtC,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACpC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAElC,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtG,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnG,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type Ora } from 'ora';
2
+ /**
3
+ * Spinner compartido por los comandos y el modo interactivo.
4
+ * - `discardStdin: false`: por defecto ora toma stdin para descartar teclas y choca con los prompts de @inquirer.
5
+ * - Sin ancho de terminal conocido no se muestra: con 0 columnas ora calcula infinitas lineas para borrar,
6
+ * escribe sin parar y bloquea el event loop.
7
+ */
8
+ export declare function startSpinner(text: string): Ora | null;
@@ -0,0 +1,14 @@
1
+ import ora from 'ora';
2
+ /**
3
+ * Spinner compartido por los comandos y el modo interactivo.
4
+ * - `discardStdin: false`: por defecto ora toma stdin para descartar teclas y choca con los prompts de @inquirer.
5
+ * - Sin ancho de terminal conocido no se muestra: con 0 columnas ora calcula infinitas lineas para borrar,
6
+ * escribe sin parar y bloquea el event loop.
7
+ */
8
+ export function startSpinner(text) {
9
+ if (!process.stdout.isTTY || !process.stdout.columns) {
10
+ return null;
11
+ }
12
+ return ora({ discardStdin: false, text }).start();
13
+ }
14
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/cli/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,GAAiB,MAAM,KAAK,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;AACpD,CAAC"}
@@ -1 +1 @@
1
- export declare const CLI_VERSION = "1.1.0";
1
+ export declare const CLI_VERSION = "1.3.0";
@@ -1,2 +1,2 @@
1
- export const CLI_VERSION = '1.1.0';
1
+ export const CLI_VERSION = '1.3.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -1,2 +1,6 @@
1
1
  export declare function formatDateAsArcaDate(value: Date): string;
2
+ /** Dias entre dos fechas ARCA (yyyymmdd): positivo si `to` es posterior a `from`. */
3
+ export declare function diffArcaDatesInDays(from: string, to: string): number;
4
+ export declare function maxArcaDate(...values: string[]): string;
5
+ export declare function formatArcaDateAsArgentineDate(value: string): string;
2
6
  export declare function parseArgentineDateInputAsArcaDate(value: string, referenceDate?: Date): string;
@@ -1,7 +1,24 @@
1
1
  import { InputValidationError } from '../errors/app-error.js';
2
2
  const ARGENTINE_DATE_FORMAT_HINT = 'Use D, DD, D-MM, D/MM, D-MM-YY, D/MM/YY, D-MM-YYYY o D/MM/YYYY.';
3
+ // Usa la fecha local: con toISOString, despues de las 21 hs en Argentina la fecha saltaba al dia siguiente.
3
4
  export function formatDateAsArcaDate(value) {
4
- return value.toISOString().slice(0, 10).replaceAll('-', '');
5
+ const year = String(value.getFullYear());
6
+ const month = String(value.getMonth() + 1).padStart(2, '0');
7
+ const day = String(value.getDate()).padStart(2, '0');
8
+ return `${year}${month}${day}`;
9
+ }
10
+ function arcaDateToUtcTime(value) {
11
+ return Date.UTC(Number(value.slice(0, 4)), Number(value.slice(4, 6)) - 1, Number(value.slice(6, 8)));
12
+ }
13
+ /** Dias entre dos fechas ARCA (yyyymmdd): positivo si `to` es posterior a `from`. */
14
+ export function diffArcaDatesInDays(from, to) {
15
+ return Math.round((arcaDateToUtcTime(to) - arcaDateToUtcTime(from)) / 86_400_000);
16
+ }
17
+ export function maxArcaDate(...values) {
18
+ return values.reduce((latest, value) => (value > latest ? value : latest));
19
+ }
20
+ export function formatArcaDateAsArgentineDate(value) {
21
+ return `${value.slice(6, 8)}/${value.slice(4, 6)}/${value.slice(0, 4)}`;
5
22
  }
6
23
  export function parseArgentineDateInputAsArcaDate(value, referenceDate = new Date()) {
7
24
  const normalizedValue = value.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"arca-date.js","sourceRoot":"","sources":["../../../src/lib/dates/arca-date.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,0BAA0B,GAAG,iEAAiE,CAAC;AAErG,MAAM,UAAU,oBAAoB,CAAC,KAAW;IAC9C,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,KAAa,EAAE,aAAa,GAAG,IAAI,IAAI,EAAE;IACzF,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,qDAAqD,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE9F,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,oBAAoB,CAAC,aAAa,KAAK,mBAAmB,0BAA0B,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,CAAC,EAAE,MAAM,EAAE,AAAD,EAAG,QAAQ,EAAE,YAAY,CAAC,GAAG,SAAS,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAEpE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACnH,MAAM,IAAI,oBAAoB,CAAC,aAAa,KAAK,iBAAiB,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,YAAgC,EAAE,aAAmB;IACxE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"arca-date.js","sourceRoot":"","sources":["../../../src/lib/dates/arca-date.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,19 @@
1
1
  import type { IIva } from '@arcasdk/core/lib/domain/types/voucher.types';
2
- import type { BillingIvaCondition } from './billing.schemas';
2
+ import type { BillingCommandInput, BillingIvaRate } from './billing.schemas';
3
3
  import type { VoucherKindDefinition } from './billing.types';
4
+ export declare const DEFAULT_IVA_RATE: BillingIvaRate;
4
5
  export interface TaxAmounts {
6
+ readonly exemptAmount: number;
5
7
  readonly iva?: IIva[];
6
8
  readonly ivaAmount: number;
7
9
  readonly netAmount: number;
10
+ readonly untaxedAmount: number;
8
11
  }
9
- export declare function resolveTaxAmounts(totalAmount: number, ivaCondition: BillingIvaCondition, voucherKind: VoucherKindDefinition): TaxAmounts;
12
+ type TaxAmountsInput = Pick<BillingCommandInput, 'exemptAmount' | 'ivaRate' | 'totalAmount' | 'untaxedAmount'>;
13
+ export declare function resolveIvaRateLabel(aliquotId: number): string | undefined;
14
+ /**
15
+ * Reparte el total entre no gravado, exento, neto gravado e IVA.
16
+ * ImpTotal = ImpTotConc + ImpOpEx + ImpNeto + ImpIVA (10048); la C no informa IVA (10071).
17
+ */
18
+ export declare function resolveTaxAmounts(input: TaxAmountsInput, voucherKind: VoucherKindDefinition): TaxAmounts;
19
+ export {};
@@ -1,27 +1,69 @@
1
1
  import Big from 'big.js';
2
- const DEFAULT_IVA_ALIQUOT_ID = 5;
3
- const DEFAULT_IVA_RATE = 0.21;
4
- const IVA_TOTAL_MULTIPLIER = new Big(1).plus(DEFAULT_IVA_RATE);
5
- export function resolveTaxAmounts(totalAmount, ivaCondition, voucherKind) {
6
- const shouldApplyIva = voucherKind.letter === 'b' || (voucherKind.letter === 'a' && ivaCondition === 'responsable-inscripto');
7
- if (!shouldApplyIva) {
2
+ import { InputValidationError } from '../../lib/errors/app-error.js';
3
+ import { formatVoucherLabel } from './billing.mappers.js';
4
+ /** Ids de alicuota de FEParamGetTiposIva. */
5
+ const IVA_RATE_DEFINITIONS = {
6
+ '0': { id: 3, rate: '0' },
7
+ '2.5': { id: 9, rate: '0.025' },
8
+ '5': { id: 8, rate: '0.05' },
9
+ '10.5': { id: 4, rate: '0.105' },
10
+ '21': { id: 5, rate: '0.21' },
11
+ '27': { id: 6, rate: '0.27' },
12
+ };
13
+ export const DEFAULT_IVA_RATE = '21';
14
+ export function resolveIvaRateLabel(aliquotId) {
15
+ const entry = Object.entries(IVA_RATE_DEFINITIONS).find(([, definition]) => definition.id === aliquotId);
16
+ return entry ? `${entry[0].replace('.', ',')}%` : undefined;
17
+ }
18
+ function validateLetterCAmounts(input, voucherKind) {
19
+ const flags = [
20
+ input.ivaRate ? '--alicuota' : undefined,
21
+ input.exemptAmount ? '--exento' : undefined,
22
+ input.untaxedAmount ? '--nogravado' : undefined,
23
+ ].filter((flag) => Boolean(flag));
24
+ if (flags.length > 0) {
25
+ throw new InputValidationError(`La ${formatVoucherLabel(voucherKind)} no discrimina IVA ni importes exentos o no gravados. Quite ${flags.join(', ')}.`);
26
+ }
27
+ }
28
+ /**
29
+ * Reparte el total entre no gravado, exento, neto gravado e IVA.
30
+ * ImpTotal = ImpTotConc + ImpOpEx + ImpNeto + ImpIVA (10048); la C no informa IVA (10071).
31
+ */
32
+ export function resolveTaxAmounts(input, voucherKind) {
33
+ if (voucherKind.letter === 'c') {
34
+ validateLetterCAmounts(input, voucherKind);
8
35
  return {
36
+ exemptAmount: 0,
9
37
  ivaAmount: 0,
10
- netAmount: totalAmount,
38
+ netAmount: input.totalAmount,
39
+ untaxedAmount: 0,
11
40
  };
12
41
  }
13
- const netAmount = roundAmount(new Big(totalAmount).div(IVA_TOTAL_MULTIPLIER));
14
- const ivaAmount = roundAmount(new Big(totalAmount).minus(netAmount));
42
+ const exemptAmount = input.exemptAmount ?? 0;
43
+ const untaxedAmount = input.untaxedAmount ?? 0;
44
+ const taxedTotal = new Big(input.totalAmount).minus(exemptAmount).minus(untaxedAmount);
45
+ if (taxedTotal.lt(0)) {
46
+ throw new InputValidationError('El importe exento mas el no gravado no puede superar el monto total.');
47
+ }
48
+ if (taxedTotal.eq(0)) {
49
+ return { exemptAmount, ivaAmount: 0, netAmount: 0, untaxedAmount };
50
+ }
51
+ const definition = IVA_RATE_DEFINITIONS[input.ivaRate ?? DEFAULT_IVA_RATE];
52
+ const netAmount = roundAmount(taxedTotal.div(new Big(1).plus(definition.rate)));
53
+ const ivaAmount = roundAmount(taxedTotal.minus(netAmount));
54
+ // Con neto mayor a cero el array de IVA es obligatorio, incluso al 0% (10070).
15
55
  return {
56
+ exemptAmount,
16
57
  iva: [
17
58
  {
18
59
  BaseImp: netAmount,
19
- Id: DEFAULT_IVA_ALIQUOT_ID,
60
+ Id: definition.id,
20
61
  Importe: ivaAmount,
21
62
  },
22
63
  ],
23
64
  ivaAmount,
24
65
  netAmount,
66
+ untaxedAmount,
25
67
  };
26
68
  }
27
69
  function roundAmount(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"billing.amounts.js","sourceRoot":"","sources":["../../../src/modules/billing/billing.amounts.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,QAAQ,CAAC;AAKzB,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAQ/D,MAAM,UAAU,iBAAiB,CAC/B,WAAmB,EACnB,YAAiC,EACjC,WAAkC;IAElC,MAAM,cAAc,GAClB,WAAW,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,GAAG,IAAI,YAAY,KAAK,uBAAuB,CAAC,CAAC;IAEzG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO;YACL,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,WAAW;SACvB,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAErE,OAAO;QACL,GAAG,EAAE;YACH;gBACE,OAAO,EAAE,SAAS;gBAClB,EAAE,EAAE,sBAAsB;gBAC1B,OAAO,EAAE,SAAS;aACnB;SACF;QACD,SAAS;QACT,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAU;IAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"billing.amounts.js","sourceRoot":"","sources":["../../../src/modules/billing/billing.amounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { IPeriodoAsoc } from '@arcasdk/core/lib/domain/types/voucher.types';
2
+ import type { BillingCommandInput } from './billing.schemas';
3
+ import type { VoucherKindDefinition } from './billing.types';
4
+ /**
5
+ * PeriodoAsoc es la alternativa a CbtesAsoc para NC/ND que ajustan un periodo y no una factura puntual (10197).
6
+ * No aplica a facturas (10198) ni a comprobantes FCE (10196).
7
+ */
8
+ export declare function resolveAssociatedPeriod(input: Pick<BillingCommandInput, 'associatedPeriod' | 'associatedVoucher'>, voucherKind: VoucherKindDefinition, billingDate: string): IPeriodoAsoc | undefined;