arcli 1.2.0 → 1.4.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 (161) hide show
  1. package/CHANGELOG.md +79 -1
  2. package/README.md +4 -3
  3. package/dist/cli/commands/billing.command.batch.d.ts +22 -0
  4. package/dist/cli/commands/billing.command.batch.js +51 -0
  5. package/dist/cli/commands/billing.command.batch.js.map +1 -0
  6. package/dist/cli/commands/billing.command.options.js +1 -1
  7. package/dist/cli/commands/billing.command.options.js.map +1 -1
  8. package/dist/cli/commands/billing.command.parser.d.ts +7 -0
  9. package/dist/cli/commands/billing.command.parser.js +82 -11
  10. package/dist/cli/commands/billing.command.parser.js.map +1 -1
  11. package/dist/cli/commands/billing.command.shared.js +16 -13
  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.js +2 -2
  17. package/dist/cli/commands/fce-obligation.command.js.map +1 -1
  18. package/dist/cli/commands/interactive.command.d.ts +3 -0
  19. package/dist/cli/commands/interactive.command.js +22 -0
  20. package/dist/cli/commands/interactive.command.js.map +1 -0
  21. package/dist/cli/commands/storybook.command.js +3 -2
  22. package/dist/cli/commands/storybook.command.js.map +1 -1
  23. package/dist/cli/commands/vouchers.command.d.ts +2 -0
  24. package/dist/cli/commands/vouchers.command.js +96 -0
  25. package/dist/cli/commands/vouchers.command.js.map +1 -0
  26. package/dist/cli/help.d.ts +1 -0
  27. package/dist/cli/help.js +23 -1
  28. package/dist/cli/help.js.map +1 -1
  29. package/dist/cli/index.js +3 -1
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/cli/interactive/advanced-options.d.ts +14 -0
  32. package/dist/cli/interactive/advanced-options.js +126 -0
  33. package/dist/cli/interactive/advanced-options.js.map +1 -0
  34. package/dist/cli/interactive/history.flow.d.ts +2 -0
  35. package/dist/cli/interactive/history.flow.js +22 -0
  36. package/dist/cli/interactive/history.flow.js.map +1 -0
  37. package/dist/cli/interactive/interactive-mode.d.ts +3 -0
  38. package/dist/cli/interactive/interactive-mode.js +93 -0
  39. package/dist/cli/interactive/interactive-mode.js.map +1 -0
  40. package/dist/cli/interactive/invoice.flow.d.ts +22 -0
  41. package/dist/cli/interactive/invoice.flow.js +132 -0
  42. package/dist/cli/interactive/invoice.flow.js.map +1 -0
  43. package/dist/cli/interactive/note.flow.d.ts +26 -0
  44. package/dist/cli/interactive/note.flow.js +236 -0
  45. package/dist/cli/interactive/note.flow.js.map +1 -0
  46. package/dist/cli/interactive/prompts.d.ts +21 -0
  47. package/dist/cli/interactive/prompts.js +46 -0
  48. package/dist/cli/interactive/prompts.js.map +1 -0
  49. package/dist/cli/interactive/session.d.ts +22 -0
  50. package/dist/cli/interactive/session.js +88 -0
  51. package/dist/cli/interactive/session.js.map +1 -0
  52. package/dist/cli/interactive/validators.d.ts +9 -0
  53. package/dist/cli/interactive/validators.js +35 -0
  54. package/dist/cli/interactive/validators.js.map +1 -0
  55. package/dist/cli/program.js +4 -0
  56. package/dist/cli/program.js.map +1 -1
  57. package/dist/cli/spinner.d.ts +8 -0
  58. package/dist/cli/spinner.js +14 -0
  59. package/dist/cli/spinner.js.map +1 -0
  60. package/dist/cli/version.d.ts +1 -1
  61. package/dist/cli/version.js +1 -1
  62. package/dist/modules/billing/billing.amounts.d.ts +1 -1
  63. package/dist/modules/billing/billing.amounts.js +34 -13
  64. package/dist/modules/billing/billing.amounts.js.map +1 -1
  65. package/dist/modules/billing/billing.batch.d.ts +23 -0
  66. package/dist/modules/billing/billing.batch.js +43 -0
  67. package/dist/modules/billing/billing.batch.js.map +1 -0
  68. package/dist/modules/billing/billing.display.js +16 -7
  69. package/dist/modules/billing/billing.display.js.map +1 -1
  70. package/dist/modules/billing/billing.iva-receptor.d.ts +1 -0
  71. package/dist/modules/billing/billing.iva-receptor.js +3 -0
  72. package/dist/modules/billing/billing.iva-receptor.js.map +1 -1
  73. package/dist/modules/billing/billing.schemas.d.ts +35 -4
  74. package/dist/modules/billing/billing.schemas.js +26 -6
  75. package/dist/modules/billing/billing.schemas.js.map +1 -1
  76. package/dist/modules/billing/billing.text.js +10 -6
  77. package/dist/modules/billing/billing.text.js.map +1 -1
  78. package/dist/modules/config/config-value-parser.js +2 -1
  79. package/dist/modules/config/config-value-parser.js.map +1 -1
  80. package/dist/modules/config/config.presenter.js +2 -2
  81. package/dist/modules/config/config.presenter.js.map +1 -1
  82. package/dist/modules/config/config.schemas.d.ts +2 -2
  83. package/dist/modules/examples/examples.js +2 -13
  84. package/dist/modules/examples/examples.js.map +1 -1
  85. package/dist/modules/fce/fce-obligation.presenter.js +1 -1
  86. package/dist/modules/fce/fce-obligation.presenter.js.map +1 -1
  87. package/dist/modules/interactive/amount-input.d.ts +6 -0
  88. package/dist/modules/interactive/amount-input.js +29 -0
  89. package/dist/modules/interactive/amount-input.js.map +1 -0
  90. package/dist/modules/interactive/choices.d.ts +13 -0
  91. package/dist/modules/interactive/choices.js +56 -0
  92. package/dist/modules/interactive/choices.js.map +1 -0
  93. package/dist/modules/interactive/equivalent-command.d.ts +8 -0
  94. package/dist/modules/interactive/equivalent-command.js +98 -0
  95. package/dist/modules/interactive/equivalent-command.js.map +1 -0
  96. package/dist/modules/interactive/wizard.d.ts +16 -0
  97. package/dist/modules/interactive/wizard.js +33 -0
  98. package/dist/modules/interactive/wizard.js.map +1 -0
  99. package/dist/modules/storybook/showcase.d.ts +1 -1
  100. package/dist/modules/storybook/showcase.js +50 -6
  101. package/dist/modules/storybook/showcase.js.map +1 -1
  102. package/dist/modules/update-check/update-check.presenter.js +1 -1
  103. package/dist/modules/update-check/update-check.presenter.js.map +1 -1
  104. package/dist/modules/vouchers/voucher-history.d.ts +34 -0
  105. package/dist/modules/vouchers/voucher-history.js +43 -0
  106. package/dist/modules/vouchers/voucher-history.js.map +1 -0
  107. package/dist/modules/vouchers/voucher-history.presenter.d.ts +22 -0
  108. package/dist/modules/vouchers/voucher-history.presenter.js +108 -0
  109. package/dist/modules/vouchers/voucher-history.presenter.js.map +1 -0
  110. package/dist/services/arca/arca-voucher-history.gateway.d.ts +8 -0
  111. package/dist/services/arca/arca-voucher-history.gateway.js +36 -0
  112. package/dist/services/arca/arca-voucher-history.gateway.js.map +1 -0
  113. package/dist/ui/components/contentPanel.d.ts +2 -2
  114. package/dist/ui/components/contentPanel.js +2 -1
  115. package/dist/ui/components/contentPanel.js.map +1 -1
  116. package/dist/ui/components/errorPanel.js +3 -3
  117. package/dist/ui/components/errorPanel.js.map +1 -1
  118. package/dist/ui/components/index.d.ts +3 -0
  119. package/dist/ui/components/index.js +3 -0
  120. package/dist/ui/components/index.js.map +1 -1
  121. package/dist/ui/components/keyValuePanel.d.ts +2 -2
  122. package/dist/ui/components/keyValuePanel.js +2 -1
  123. package/dist/ui/components/keyValuePanel.js.map +1 -1
  124. package/dist/ui/components/rawPanel.js +1 -1
  125. package/dist/ui/components/rawPanel.js.map +1 -1
  126. package/dist/ui/components/sectionHeading.d.ts +3 -0
  127. package/dist/ui/components/sectionHeading.js +13 -0
  128. package/dist/ui/components/sectionHeading.js.map +1 -0
  129. package/dist/ui/components/statusBar.d.ts +6 -0
  130. package/dist/ui/components/statusBar.js +24 -0
  131. package/dist/ui/components/statusBar.js.map +1 -0
  132. package/dist/ui/components/statusPanel.d.ts +2 -2
  133. package/dist/ui/components/statusPanel.js +2 -1
  134. package/dist/ui/components/statusPanel.js.map +1 -1
  135. package/dist/ui/components/testingBanner.d.ts +2 -0
  136. package/dist/ui/components/testingBanner.js +6 -0
  137. package/dist/ui/components/testingBanner.js.map +1 -0
  138. package/dist/ui/presenters/errors.presenter.js +11 -1
  139. package/dist/ui/presenters/errors.presenter.js.map +1 -1
  140. package/dist/ui/presenters/errors.zod-presenter.d.ts +2 -0
  141. package/dist/ui/presenters/errors.zod-presenter.js +4 -0
  142. package/dist/ui/presenters/errors.zod-presenter.js.map +1 -1
  143. package/dist/ui/presenters/index.d.ts +1 -0
  144. package/dist/ui/presenters/index.js +1 -0
  145. package/dist/ui/presenters/index.js.map +1 -1
  146. package/dist/ui/primitives/renderLogo.js +5 -0
  147. package/dist/ui/primitives/renderLogo.js.map +1 -1
  148. package/dist/ui/primitives/renderPanel.d.ts +3 -1
  149. package/dist/ui/primitives/renderPanel.js +68 -21
  150. package/dist/ui/primitives/renderPanel.js.map +1 -1
  151. package/dist/ui/primitives/terminalWidth.d.ts +4 -0
  152. package/dist/ui/primitives/terminalWidth.js +11 -0
  153. package/dist/ui/primitives/terminalWidth.js.map +1 -0
  154. package/dist/ui/primitives/text.d.ts +10 -0
  155. package/dist/ui/primitives/text.js +101 -30
  156. package/dist/ui/primitives/text.js.map +1 -1
  157. package/dist/ui/theme/theme.d.ts +45 -4
  158. package/dist/ui/theme/theme.js +183 -5
  159. package/dist/ui/theme/theme.js.map +1 -1
  160. package/llms.txt +15 -2
  161. package/package.json +15 -13
@@ -0,0 +1,22 @@
1
+ import { type BillingCommandInput } from '../../modules/billing/billing.schemas';
2
+ import type { VoucherKindDefinition } from '../../modules/billing/billing.types';
3
+ import { type WizardStep } from '../../modules/interactive/wizard';
4
+ import { type AdvancedOptions } from './advanced-options';
5
+ import { type InteractiveSession } from './session';
6
+ export interface InvoiceState {
7
+ readonly advanced: AdvancedOptions;
8
+ readonly cbu?: string;
9
+ readonly concept?: BillingCommandInput['concept'];
10
+ readonly documentNumber?: number;
11
+ readonly documentType?: BillingCommandInput['documentType'];
12
+ readonly ivaCondition?: BillingCommandInput['ivaCondition'];
13
+ readonly ivaRate?: BillingCommandInput['ivaRate'];
14
+ readonly totalAmount?: number;
15
+ readonly transferMode?: BillingCommandInput['transferMode'];
16
+ readonly voucherKind?: VoucherKindDefinition;
17
+ }
18
+ /** Pasos del flujo de factura; cada uno se puede deshacer con "Volver". */
19
+ export declare function invoiceSteps(session: InteractiveSession): Array<WizardStep<InvoiceState>>;
20
+ /** Arma la entrada del CLI con lo que respondio el usuario. */
21
+ export declare function buildInvoiceInput(state: InvoiceState, session: InteractiveSession): BillingCommandInput;
22
+ export declare function runInvoiceFlow(session: InteractiveSession): Promise<void>;
@@ -0,0 +1,132 @@
1
+ import { billingCommandSchema } from '../../modules/billing/billing.schemas.js';
2
+ import { parseAmountInput } from '../../modules/interactive/amount-input.js';
3
+ import { conceptChoices, invoiceKindChoices, ivaConditionChoices, ivaRateChoices, receiverChoices, } from '../../modules/interactive/choices.js';
4
+ import { BACK, runWizard } from '../../modules/interactive/wizard.js';
5
+ import { askAdvancedOptions } from './advanced-options.js';
6
+ import { askTextStep, chooseStep } from './prompts.js';
7
+ import { previewAndEmit } from './session.js';
8
+ import { normalizeDocumentNumber, validateAmount, validateCbu, validateCuit, validateDni } from './validators.js';
9
+ const isFceInvoice = (state) => state.voucherKind?.family === 'factura-credito-electronica';
10
+ /** Pasos del flujo de factura; cada uno se puede deshacer con "Volver". */
11
+ export function invoiceSteps(session) {
12
+ const { config } = session.runtime;
13
+ return [
14
+ {
15
+ name: 'comprobante',
16
+ run: async () => {
17
+ const voucherKind = await chooseStep('¿Que comprobante queres emitir?', invoiceKindChoices());
18
+ return voucherKind === BACK ? BACK : { voucherKind };
19
+ },
20
+ },
21
+ {
22
+ name: 'receptor',
23
+ run: async (state) => {
24
+ const documentType = await chooseStep('¿A quien le facturas?', receiverChoices(state.voucherKind?.letter ?? 'c'));
25
+ return documentType === BACK
26
+ ? BACK
27
+ : {
28
+ documentNumber: undefined,
29
+ documentType,
30
+ ivaCondition: documentType === 'consumidor-final' ? 'consumidor-final' : undefined,
31
+ };
32
+ },
33
+ },
34
+ {
35
+ name: 'documento',
36
+ run: async (state) => {
37
+ const isCuit = state.documentType === 'cuit';
38
+ const answer = await askTextStep(isCuit ? 'CUIT del receptor:' : 'DNI del receptor:', {
39
+ validate: isCuit ? validateCuit : validateDni,
40
+ });
41
+ return answer === BACK ? BACK : { documentNumber: normalizeDocumentNumber(answer) };
42
+ },
43
+ skip: (state) => state.documentType === 'consumidor-final',
44
+ },
45
+ {
46
+ name: 'iva-receptor',
47
+ run: async (state) => {
48
+ const ivaCondition = await chooseStep('Condicion frente al IVA del receptor:', ivaConditionChoices(state.voucherKind?.letter ?? 'c'), config.ivaReceptorPorDefecto);
49
+ return ivaCondition === BACK ? BACK : { ivaCondition };
50
+ },
51
+ skip: (state) => state.documentType === 'consumidor-final',
52
+ },
53
+ {
54
+ name: 'concepto',
55
+ run: async () => {
56
+ const concept = await chooseStep('¿Que estas facturando?', conceptChoices(), config.conceptoPorDefecto);
57
+ return concept === BACK ? BACK : { concept };
58
+ },
59
+ },
60
+ {
61
+ name: 'monto',
62
+ run: async () => {
63
+ const answer = await askTextStep('Monto total:', { validate: validateAmount });
64
+ return answer === BACK ? BACK : { totalAmount: parseAmountInput(answer) };
65
+ },
66
+ },
67
+ {
68
+ name: 'alicuota',
69
+ run: async () => {
70
+ const ivaRate = await chooseStep('Alicuota de IVA:', ivaRateChoices(), config.alicuotaPorDefecto ?? '21');
71
+ return ivaRate === BACK ? BACK : { ivaRate };
72
+ },
73
+ skip: (state) => state.voucherKind?.letter === 'c',
74
+ },
75
+ {
76
+ name: 'cbu',
77
+ run: async () => {
78
+ const cbu = await askTextStep('CBU del emisor (22 digitos):', { validate: validateCbu });
79
+ return cbu === BACK ? BACK : { cbu };
80
+ },
81
+ skip: (state) => !isFceInvoice(state) || Boolean(config.cbu),
82
+ },
83
+ {
84
+ name: 'transferencia',
85
+ run: async () => {
86
+ const transferMode = await chooseStep('Modalidad de transferencia:', [
87
+ { description: 'La opcion habitual', name: 'Sistema de circulacion abierta (SCA)', value: 'sca' },
88
+ { name: 'Agente de deposito colectivo (ADC)', value: 'adc' },
89
+ ]);
90
+ return transferMode === BACK ? BACK : { transferMode };
91
+ },
92
+ skip: (state) => !isFceInvoice(state),
93
+ },
94
+ {
95
+ name: 'avanzadas',
96
+ run: async (state) => {
97
+ const advanced = await askAdvancedOptions(state.advanced, {
98
+ concept: state.concept ?? 'servicios',
99
+ voucherKind: state.voucherKind,
100
+ });
101
+ return advanced === BACK ? BACK : { advanced };
102
+ },
103
+ },
104
+ ];
105
+ }
106
+ /** Arma la entrada del CLI con lo que respondio el usuario. */
107
+ export function buildInvoiceInput(state, session) {
108
+ const { config } = session.runtime;
109
+ const voucherKind = state.voucherKind;
110
+ return billingCommandSchema.parse({
111
+ ...state.advanced,
112
+ cbu: isFceInvoice(state) ? (state.cbu ?? config.cbu) : undefined,
113
+ concept: state.concept,
114
+ documentNumber: state.documentNumber,
115
+ documentType: state.documentType,
116
+ ivaCondition: state.ivaCondition,
117
+ // 21% sin alicuota configurada es el default del CLI. Si hay config, se deja explicito para que el
118
+ // comando equivalente no tome la de la config.
119
+ ivaRate: state.ivaRate === '21' && !config.alicuotaPorDefecto ? undefined : state.ivaRate,
120
+ shortcut: voucherKind.shortcut,
121
+ totalAmount: state.totalAmount,
122
+ transferMode: isFceInvoice(state) ? state.transferMode : undefined,
123
+ });
124
+ }
125
+ export async function runInvoiceFlow(session) {
126
+ const state = await runWizard(invoiceSteps(session), { advanced: { currencyCode: 'ARS', sameCurrency: false } });
127
+ if (!state) {
128
+ return;
129
+ }
130
+ await previewAndEmit(session, buildInvoiceInput(state, session));
131
+ }
132
+ //# sourceMappingURL=invoice.flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice.flow.js","sourceRoot":"","sources":["../../../src/cli/interactive/invoice.flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type BillingCommandInput, type BillingConcept } from '../../modules/billing/billing.schemas';
2
+ import type { VoucherKindDefinition } from '../../modules/billing/billing.types';
3
+ import { type WizardStep } from '../../modules/interactive/wizard';
4
+ import { type IssuedVoucher } from '../../modules/vouchers/voucher-history';
5
+ import { type InteractiveSession } from './session';
6
+ export interface NoteState {
7
+ readonly cancellation?: boolean;
8
+ readonly concept?: BillingConcept;
9
+ readonly documentNumber?: number;
10
+ readonly documentType?: BillingCommandInput['documentType'];
11
+ readonly invoice?: IssuedVoucher;
12
+ readonly invoiceKind?: VoucherKindDefinition;
13
+ readonly ivaCondition?: BillingCommandInput['ivaCondition'];
14
+ readonly ivaRate?: BillingCommandInput['ivaRate'];
15
+ readonly kind?: 'credito' | 'debito';
16
+ readonly periodFrom?: string;
17
+ readonly periodTo?: string;
18
+ /** Sobre una factura de la lista o sobre un periodo (solo notas comunes). */
19
+ readonly target?: 'factura' | 'periodo';
20
+ readonly totalAmount?: number;
21
+ }
22
+ /** Pasos del flujo de notas; cada uno se puede deshacer con "Volver". */
23
+ export declare function noteSteps(session: InteractiveSession, pointOfSale: number): Array<WizardStep<NoteState>>;
24
+ /** Arma la entrada del CLI con lo que respondio el usuario. */
25
+ export declare function buildNoteInput(state: NoteState, session: InteractiveSession, pointOfSale: number): BillingCommandInput;
26
+ export declare function runNoteFlow(session: InteractiveSession): Promise<void>;
@@ -0,0 +1,236 @@
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 { conceptChoices, invoiceKindChoices, ivaConditionChoices, ivaRateChoices, noteKindChoices, receiverChoices, } from '../../modules/interactive/choices.js';
6
+ import { BACK, runWizard } from '../../modules/interactive/wizard.js';
7
+ import { inferIvaRate, listRecentVouchers, resolveDocumentType, } from '../../modules/vouchers/voucher-history.js';
8
+ import { formatVoucherSummary } from '../../modules/vouchers/voucher-history.presenter.js';
9
+ import { noticePanel, writeTerminalOutput } from '../../ui/index.js';
10
+ import { startSpinner } from '../spinner.js';
11
+ import { askTextStep, chooseStep } from './prompts.js';
12
+ import { previewAndEmit, requirePointOfSale } from './session.js';
13
+ import { normalizeDocumentNumber, validateAmount, validateCuit, validateDate, validateDni } from './validators.js';
14
+ const CONCEPTS_BY_CODE = {
15
+ 1: 'productos',
16
+ 2: 'servicios',
17
+ 3: 'productos-servicios',
18
+ };
19
+ const isPeriod = (state) => state.target === 'periodo';
20
+ async function askNoteAmount(state) {
21
+ const invoice = state.invoice;
22
+ const label = state.kind === 'debito' ? 'Monto de la nota de debito:' : 'Monto de la nota de credito:';
23
+ if (state.kind === 'credito' && invoice) {
24
+ const scope = await chooseStep('¿Total o parcial?', [
25
+ { name: `Anular el total (${formatMoneyLabel(invoice.total)})`, value: 'total' },
26
+ { name: 'Parcial (ingresar monto)', value: 'parcial' },
27
+ ]);
28
+ if (scope === BACK || scope === 'total') {
29
+ return scope === BACK ? BACK : invoice.total;
30
+ }
31
+ }
32
+ const answer = await askTextStep(label, {
33
+ validate: (value) => {
34
+ const valid = validateAmount(value);
35
+ if (valid !== true || state.kind !== 'credito' || !invoice) {
36
+ return valid;
37
+ }
38
+ return (parseAmountInput(value) ?? 0) <= invoice.total
39
+ ? true
40
+ : `No puede superar el total de la factura (${formatMoneyLabel(invoice.total)}).`;
41
+ },
42
+ });
43
+ return answer === BACK ? BACK : parseAmountInput(answer);
44
+ }
45
+ /** Pasos del flujo de notas; cada uno se puede deshacer con "Volver". */
46
+ export function noteSteps(session, pointOfSale) {
47
+ return [
48
+ {
49
+ name: 'nota',
50
+ run: async () => {
51
+ const kind = await chooseStep('¿Que nota queres emitir?', [
52
+ { name: 'Nota de credito (descuento, devolucion o anulacion)', value: 'credito' },
53
+ { name: 'Nota de debito (cargo adicional)', value: 'debito' },
54
+ ]);
55
+ return kind === BACK ? BACK : { kind };
56
+ },
57
+ },
58
+ {
59
+ name: 'tipo-factura',
60
+ run: async () => {
61
+ const invoiceKind = await chooseStep('¿Sobre que tipo de factura?', invoiceKindChoices());
62
+ return invoiceKind === BACK ? BACK : { invoiceKind, target: 'factura' };
63
+ },
64
+ },
65
+ {
66
+ name: 'asociacion',
67
+ run: async () => {
68
+ const target = await chooseStep('¿A que la asociamos?', [
69
+ { description: 'Elegis una de las ultimas emitidas', name: 'A una factura', value: 'factura' },
70
+ {
71
+ description: 'Por ejemplo, un descuento sobre todo el mes',
72
+ name: 'A un periodo',
73
+ value: 'periodo',
74
+ },
75
+ ]);
76
+ return target === BACK ? BACK : { target };
77
+ },
78
+ // ARCA no acepta periodo asociado en notas FCE (10196).
79
+ skip: (state) => Boolean(state.invoiceKind?.isElectronicCredit),
80
+ },
81
+ {
82
+ name: 'factura',
83
+ run: async (state) => {
84
+ const invoiceKind = state.invoiceKind;
85
+ const spinner = startSpinner('Buscando las ultimas facturas en ARCA...');
86
+ const invoices = await listRecentVouchers(session.historyGateway, pointOfSale, invoiceKind.arcaType).finally(() => spinner?.stop());
87
+ if (invoices.length === 0) {
88
+ writeTerminalOutput(noticePanel(`No hay ${invoiceKind.displayName} emitidas en el punto de venta ${pointOfSale}.`, 'warning'));
89
+ return BACK;
90
+ }
91
+ const invoice = await chooseStep(`¿Sobre que ${invoiceKind.displayName}?`, invoices.map((item) => ({
92
+ description: item.cae ? `CAE ${item.cae}` : undefined,
93
+ name: formatVoucherSummary(pointOfSale, item),
94
+ value: item,
95
+ })));
96
+ if (invoice === BACK) {
97
+ return BACK;
98
+ }
99
+ const documentType = resolveDocumentType(invoice.documentTypeCode);
100
+ if (!documentType) {
101
+ writeTerminalOutput(noticePanel('La factura tiene un tipo de documento que el asistente no soporta. Usa los flags del CLI.', 'warning'));
102
+ return BACK;
103
+ }
104
+ // La nota hereda de la factura el receptor, el concepto y la alicuota (si se puede deducir).
105
+ return {
106
+ concept: CONCEPTS_BY_CODE[invoice.concept ?? 2] ?? 'servicios',
107
+ documentNumber: documentType === 'consumidor-final' ? undefined : invoice.documentNumber,
108
+ documentType,
109
+ invoice,
110
+ ivaCondition: documentType === 'consumidor-final' ? 'consumidor-final' : undefined,
111
+ ivaRate: invoiceKind.letter === 'c' ? undefined : inferIvaRate(invoice.netAmount, invoice.ivaAmount),
112
+ };
113
+ },
114
+ skip: isPeriod,
115
+ },
116
+ {
117
+ name: 'periodo',
118
+ run: async () => {
119
+ const periodFrom = await askTextStep('Periodo desde:', { validate: validateDate });
120
+ if (periodFrom === BACK) {
121
+ return BACK;
122
+ }
123
+ const periodTo = await askTextStep('Periodo hasta:', { validate: validateDate });
124
+ return periodTo === BACK ? BACK : { invoice: undefined, periodFrom, periodTo };
125
+ },
126
+ skip: (state) => !isPeriod(state),
127
+ },
128
+ {
129
+ name: 'receptor',
130
+ run: async (state) => {
131
+ const documentType = await chooseStep('¿A quien va la nota?', receiverChoices(state.invoiceKind?.letter ?? 'c'));
132
+ return documentType === BACK
133
+ ? BACK
134
+ : {
135
+ documentNumber: undefined,
136
+ documentType,
137
+ ivaCondition: documentType === 'consumidor-final' ? 'consumidor-final' : undefined,
138
+ };
139
+ },
140
+ skip: (state) => !isPeriod(state),
141
+ },
142
+ {
143
+ name: 'documento',
144
+ run: async (state) => {
145
+ const isCuit = state.documentType === 'cuit';
146
+ const answer = await askTextStep(isCuit ? 'CUIT del receptor:' : 'DNI del receptor:', {
147
+ validate: isCuit ? validateCuit : validateDni,
148
+ });
149
+ return answer === BACK ? BACK : { documentNumber: normalizeDocumentNumber(answer) };
150
+ },
151
+ skip: (state) => !isPeriod(state) || state.documentType === 'consumidor-final',
152
+ },
153
+ {
154
+ name: 'concepto',
155
+ run: async () => {
156
+ const concept = await chooseStep('¿Que concepto ajusta la nota?', conceptChoices());
157
+ return concept === BACK ? BACK : { concept };
158
+ },
159
+ skip: (state) => !isPeriod(state),
160
+ },
161
+ {
162
+ name: 'monto',
163
+ run: async (state) => {
164
+ const totalAmount = await askNoteAmount(state);
165
+ return totalAmount === BACK ? BACK : { totalAmount };
166
+ },
167
+ },
168
+ {
169
+ name: 'iva-receptor',
170
+ run: async (state) => {
171
+ // ARCA no devuelve la condicion IVA de la factura, asi que se pregunta, filtrada por la letra.
172
+ const ivaCondition = await chooseStep('Condicion frente al IVA del receptor:', ivaConditionChoices(state.invoiceKind?.letter ?? 'c'));
173
+ return ivaCondition === BACK ? BACK : { ivaCondition };
174
+ },
175
+ skip: (state) => state.documentType === 'consumidor-final',
176
+ },
177
+ {
178
+ name: 'alicuota',
179
+ run: async (state) => {
180
+ const ivaRate = await chooseStep(isPeriod(state) ? 'Alicuota de IVA:' : 'Alicuota de IVA de la factura:', ivaRateChoices());
181
+ return ivaRate === BACK ? BACK : { ivaRate };
182
+ },
183
+ // En la C no hay IVA; si la factura deja deducir la alicuota, no se pregunta.
184
+ skip: (state) => state.invoiceKind?.letter === 'c' || (!isPeriod(state) && Boolean(state.ivaRate)),
185
+ },
186
+ {
187
+ name: 'anulacion',
188
+ run: async () => {
189
+ const cancellation = await chooseStep('¿El comprador rechazo la factura?', [
190
+ { name: 'Si, es una nota de anulacion', value: true },
191
+ { name: 'No', value: false },
192
+ ]);
193
+ return cancellation === BACK ? BACK : { cancellation };
194
+ },
195
+ skip: (state) => !state.invoiceKind?.isElectronicCredit,
196
+ },
197
+ ];
198
+ }
199
+ /** Arma la entrada del CLI con lo que respondio el usuario. */
200
+ export function buildNoteInput(state, session, pointOfSale) {
201
+ const invoiceKind = state.invoiceKind;
202
+ const noteKind = noteKindChoices(state.kind ?? 'credito', invoiceKind);
203
+ const invoice = state.invoice;
204
+ return billingCommandSchema.parse({
205
+ associatedPeriod: isPeriod(state) ? { desde: state.periodFrom, hasta: state.periodTo } : undefined,
206
+ associatedVoucher: !isPeriod(state) && invoice
207
+ ? {
208
+ cuit: String(session.runtime.context.cuit),
209
+ fecha: formatArcaDateAsArgentineDate(invoice.date),
210
+ numero: invoice.number,
211
+ puntoVenta: pointOfSale,
212
+ shortcut: invoiceKind.shortcut,
213
+ }
214
+ : undefined,
215
+ cancellation: state.cancellation ?? false,
216
+ concept: state.concept,
217
+ documentNumber: state.documentType === 'consumidor-final' ? undefined : state.documentNumber,
218
+ documentType: state.documentType,
219
+ ivaCondition: state.ivaCondition,
220
+ ivaRate: state.ivaRate === '21' && !session.runtime.config.alicuotaPorDefecto ? undefined : state.ivaRate,
221
+ shortcut: noteKind.shortcut,
222
+ totalAmount: state.totalAmount,
223
+ });
224
+ }
225
+ export async function runNoteFlow(session) {
226
+ const pointOfSale = requirePointOfSale(session);
227
+ if (!pointOfSale) {
228
+ return;
229
+ }
230
+ const state = await runWizard(noteSteps(session, pointOfSale), {});
231
+ if (!state) {
232
+ return;
233
+ }
234
+ await previewAndEmit(session, buildNoteInput(state, session, pointOfSale));
235
+ }
236
+ //# 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,21 @@
1
+ import { type Back } from '../../modules/interactive/wizard';
2
+ export interface Choice<T> {
3
+ readonly description?: string;
4
+ readonly name: string;
5
+ readonly value: T;
6
+ }
7
+ export declare function chooseOne<T>(message: string, choices: ReadonlyArray<Choice<T>>, defaultValue?: T): Promise<T>;
8
+ export declare function askText(message: string, options?: {
9
+ readonly defaultValue?: string;
10
+ readonly validate?: (value: string) => string | true;
11
+ }): Promise<string>;
12
+ export declare function confirm(message: string, yesLabel: string, noLabel?: string): Promise<boolean>;
13
+ /** Ctrl+C dentro de un prompt de @inquirer. */
14
+ export declare function isPromptCancellation(error: unknown): boolean;
15
+ /** Como chooseOne, con una opcion "← Volver" al final para el motor de pasos. */
16
+ export declare function chooseStep<T>(message: string, choices: ReadonlyArray<Choice<T>>, defaultValue?: T): Promise<Back | T>;
17
+ /** Como askText, pero escribir "<" vuelve al paso anterior. */
18
+ export declare function askTextStep(message: string, options?: {
19
+ readonly defaultValue?: string;
20
+ readonly validate?: (value: string) => string | true;
21
+ }): Promise<Back | string>;
@@ -0,0 +1,46 @@
1
+ import input from '@inquirer/input';
2
+ import select from '@inquirer/select';
3
+ import { BACK } from '../../modules/interactive/wizard.js';
4
+ import { colorize } from '../../ui/index.js';
5
+ export async function chooseOne(message, choices, defaultValue) {
6
+ return select({ choices: [...choices], default: defaultValue, loop: false, message, pageSize: 12 });
7
+ }
8
+ export async function askText(message, options = {}) {
9
+ const answer = await input({
10
+ default: options.defaultValue,
11
+ message,
12
+ validate: options.validate,
13
+ });
14
+ return answer.trim();
15
+ }
16
+ export async function confirm(message, yesLabel, noLabel = 'Cancelar') {
17
+ return chooseOne(message, [
18
+ { name: yesLabel, value: true },
19
+ { name: noLabel, value: false },
20
+ ]);
21
+ }
22
+ /** Ctrl+C dentro de un prompt de @inquirer. */
23
+ export function isPromptCancellation(error) {
24
+ return error instanceof Error && error.name === 'ExitPromptError';
25
+ }
26
+ const BACK_CHOICE = { name: '← Volver', value: BACK };
27
+ const BACK_TEXT = '<';
28
+ /** Como chooseOne, con una opcion "← Volver" al final para el motor de pasos. */
29
+ export async function chooseStep(message, choices, defaultValue) {
30
+ return select({
31
+ choices: [...choices, BACK_CHOICE],
32
+ default: defaultValue,
33
+ loop: false,
34
+ message,
35
+ pageSize: 12,
36
+ });
37
+ }
38
+ /** Como askText, pero escribir "<" vuelve al paso anterior. */
39
+ export async function askTextStep(message, options = {}) {
40
+ const answer = await askText(`${message} ${colorize('(< para volver)', 'muted')}`, {
41
+ defaultValue: options.defaultValue,
42
+ validate: (value) => (value.trim() === BACK_TEXT ? true : (options.validate?.(value) ?? true)),
43
+ });
44
+ return answer === BACK_TEXT ? BACK : answer;
45
+ }
46
+ //# 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;AAEtC,OAAO,EAAE,IAAI,EAAa,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAQpC,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;AAED,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAW,CAAC;AAC/D,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,OAAiC,EACjC,YAAgB;IAEhB,OAAO,MAAM,CAAW;QACtB,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,WAAW,CAAC;QAClC,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,KAAK;QACX,OAAO;QACP,QAAQ,EAAE,EAAE;KACb,CAAC,CAAC;AACL,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe,EACf,UAAoG,EAAE;IAEtG,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,OAAO,IAAI,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,EAAE;QACjF,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;KAC/F,CAAC,CAAC;IAEH,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAC9C,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/vouchers/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,88 @@
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
+ // Con "me pagan en dolares" la cotizacion es la oficial de ARCA: se consulta antes de la vista previa.
53
+ const resolved = await service.resolveExchangeRate(rawInput, session.billingGateway);
54
+ const input = { ...resolved, dryRun: true, emit: false };
55
+ const warnings = runtime.config.verificarFce
56
+ ? await service.resolveFceWarnings(input, new ArcaFceObligationGateway(session.arca))
57
+ : [];
58
+ const preview = await service.execute({ gateway: PREVIEW_GATEWAY, input, runtime, warnings });
59
+ writeTerminalOutput(formatBillingOutputs([preview], { environment: runtime.environment, raw: false }));
60
+ writeTerminalOutput(formatEquivalentCommand(buildEquivalentCommand(input, { environment: runtime.environment })));
61
+ const label = preview.voucherKind.displayName;
62
+ const environmentLabel = runtime.environment === 'produccion' ? 'PRODUCCION' : 'testing';
63
+ if (!(await confirm(`¿Emitimos la ${label} en ${environmentLabel}?`, 'Emitir ahora'))) {
64
+ writeTerminalOutput(noticePanel('No se emitio nada.', 'muted'));
65
+ return;
66
+ }
67
+ if (runtime.environment === 'produccion' &&
68
+ !(await confirm('Vas a emitir un comprobante real en PRODUCCION. ¿Confirmas?', 'Si, emitir en produccion'))) {
69
+ writeTerminalOutput(noticePanel('No se emitio nada.', 'muted'));
70
+ return;
71
+ }
72
+ const spinner = startSpinner(`Emitiendo ${label} en ARCA...`);
73
+ try {
74
+ const result = await service.execute({
75
+ gateway: session.billingGateway,
76
+ input: { ...input, dryRun: false, emit: true },
77
+ runtime,
78
+ warnings,
79
+ });
80
+ spinner?.stop();
81
+ writeTerminalOutput(formatBillingOutputs([result], { environment: runtime.environment, previewShown: true, raw: false }));
82
+ }
83
+ catch (error) {
84
+ spinner?.stop();
85
+ throw error;
86
+ }
87
+ }
88
+ //# 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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"}