arcli 1.7.1 → 2.0.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.
- package/CHANGELOG.md +78 -1
- package/README.md +11 -18
- package/dist/cli/commands/billing.command.options.js +17 -15
- package/dist/cli/commands/billing.command.options.js.map +1 -1
- package/dist/cli/commands/billing.command.parser.js +57 -28
- package/dist/cli/commands/billing.command.parser.js.map +1 -1
- package/dist/cli/commands/billing.command.pdf.d.ts +1 -1
- package/dist/cli/commands/billing.command.pdf.js +17 -2
- package/dist/cli/commands/billing.command.pdf.js.map +1 -1
- package/dist/cli/commands/config.command.js +4 -2
- package/dist/cli/commands/config.command.js.map +1 -1
- package/dist/cli/commands/vouchers.command.js +7 -6
- package/dist/cli/commands/vouchers.command.js.map +1 -1
- package/dist/cli/error-output.d.ts +7 -0
- package/dist/cli/error-output.js +26 -0
- package/dist/cli/error-output.js.map +1 -0
- package/dist/cli/help-argv.d.ts +5 -0
- package/dist/cli/help-argv.js +21 -0
- package/dist/cli/help-argv.js.map +1 -0
- package/dist/cli/help.js +4 -3
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.js +14 -20
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/interactive/advanced-options.js +2 -2
- package/dist/cli/interactive/advanced-options.js.map +1 -1
- package/dist/cli/interactive/config.flow.d.ts +1 -1
- package/dist/cli/interactive/config.flow.js +53 -18
- package/dist/cli/interactive/config.flow.js.map +1 -1
- package/dist/cli/interactive/history.flow.d.ts +4 -0
- package/dist/cli/interactive/history.flow.js +22 -8
- package/dist/cli/interactive/history.flow.js.map +1 -1
- package/dist/cli/interactive/interactive-mode.js +99 -17
- package/dist/cli/interactive/interactive-mode.js.map +1 -1
- package/dist/cli/interactive/invoice-picker.d.ts +25 -0
- package/dist/cli/interactive/invoice-picker.js +153 -0
- package/dist/cli/interactive/invoice-picker.js.map +1 -0
- package/dist/cli/interactive/note.flow.d.ts +8 -2
- package/dist/cli/interactive/note.flow.js +39 -37
- package/dist/cli/interactive/note.flow.js.map +1 -1
- package/dist/cli/interactive/pdf.flow.js +33 -22
- package/dist/cli/interactive/pdf.flow.js.map +1 -1
- package/dist/cli/interactive/prompts.d.ts +36 -5
- package/dist/cli/interactive/prompts.js +185 -19
- package/dist/cli/interactive/prompts.js.map +1 -1
- package/dist/cli/interactive/repeat.flow.js +26 -17
- package/dist/cli/interactive/repeat.flow.js.map +1 -1
- package/dist/cli/interactive/status.flow.d.ts +3 -0
- package/dist/cli/interactive/status.flow.js +29 -0
- package/dist/cli/interactive/status.flow.js.map +1 -0
- package/dist/cli/interactive/update.flow.d.ts +6 -0
- package/dist/cli/interactive/update.flow.js +26 -0
- package/dist/cli/interactive/update.flow.js.map +1 -0
- package/dist/cli/interactive/validators.js +8 -4
- package/dist/cli/interactive/validators.js.map +1 -1
- package/dist/cli/option-parsers.d.ts +6 -0
- package/dist/cli/option-parsers.js +34 -0
- package/dist/cli/option-parsers.js.map +1 -0
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/lib/dates/arca-date.d.ts +13 -0
- package/dist/lib/dates/arca-date.js +28 -11
- package/dist/lib/dates/arca-date.js.map +1 -1
- package/dist/lib/errors/app-error.d.ts +3 -0
- package/dist/lib/errors/app-error.js +3 -0
- package/dist/lib/errors/app-error.js.map +1 -1
- package/dist/lib/files/restrict-to-owner.d.ts +7 -0
- package/dist/lib/files/restrict-to-owner.js +19 -0
- package/dist/lib/files/restrict-to-owner.js.map +1 -0
- package/dist/lib/identity/format-cuit.d.ts +2 -0
- package/dist/lib/identity/format-cuit.js +6 -0
- package/dist/lib/identity/format-cuit.js.map +1 -0
- package/dist/lib/numbers/argentine-amount.d.ts +23 -0
- package/dist/lib/numbers/argentine-amount.js +37 -0
- package/dist/lib/numbers/argentine-amount.js.map +1 -0
- package/dist/lib/numbers/strict-integer.d.ts +4 -0
- package/dist/lib/numbers/strict-integer.js +10 -0
- package/dist/lib/numbers/strict-integer.js.map +1 -0
- package/dist/lib/security/pem.js +5 -1
- package/dist/lib/security/pem.js.map +1 -1
- package/dist/modules/billing/billing-response.js +3 -2
- package/dist/modules/billing/billing-response.js.map +1 -1
- package/dist/modules/billing/billing.amounts.d.ts +2 -0
- package/dist/modules/billing/billing.amounts.js +6 -3
- package/dist/modules/billing/billing.amounts.js.map +1 -1
- package/dist/modules/billing/billing.associated-vouchers.js +14 -3
- package/dist/modules/billing/billing.associated-vouchers.js.map +1 -1
- package/dist/modules/billing/billing.batch.js +6 -0
- package/dist/modules/billing/billing.batch.js.map +1 -1
- package/dist/modules/billing/billing.date-range.js +14 -9
- package/dist/modules/billing/billing.date-range.js.map +1 -1
- package/dist/modules/billing/billing.display.js +4 -4
- package/dist/modules/billing/billing.display.js.map +1 -1
- package/dist/modules/billing/billing.errors.d.ts +12 -0
- package/dist/modules/billing/billing.errors.js +18 -0
- package/dist/modules/billing/billing.errors.js.map +1 -0
- package/dist/modules/billing/billing.schemas.js +13 -5
- package/dist/modules/billing/billing.schemas.js.map +1 -1
- package/dist/modules/billing/billing.service.js +10 -3
- package/dist/modules/billing/billing.service.js.map +1 -1
- package/dist/modules/billing/billing.validation.js +4 -0
- package/dist/modules/billing/billing.validation.js.map +1 -1
- package/dist/modules/config/config-value-parser.d.ts +1 -1
- package/dist/modules/config/config-value-parser.js +21 -9
- package/dist/modules/config/config-value-parser.js.map +1 -1
- package/dist/modules/config/config.presenter.d.ts +4 -0
- package/dist/modules/config/config.presenter.js +57 -37
- package/dist/modules/config/config.presenter.js.map +1 -1
- package/dist/modules/config/config.schemas.d.ts +4 -2
- package/dist/modules/config/config.schemas.js +4 -0
- package/dist/modules/config/config.schemas.js.map +1 -1
- package/dist/modules/config/config.sections.d.ts +14 -0
- package/dist/modules/config/config.sections.js +61 -0
- package/dist/modules/config/config.sections.js.map +1 -0
- package/dist/modules/config/config.service.d.ts +5 -0
- package/dist/modules/config/config.service.js +30 -6
- package/dist/modules/config/config.service.js.map +1 -1
- package/dist/modules/examples/examples.js +5 -1
- package/dist/modules/examples/examples.js.map +1 -1
- package/dist/modules/interactive/amount-input.d.ts +3 -5
- package/dist/modules/interactive/amount-input.js +9 -26
- package/dist/modules/interactive/amount-input.js.map +1 -1
- package/dist/modules/interactive/config-fields.d.ts +1 -3
- package/dist/modules/interactive/config-fields.js +37 -42
- package/dist/modules/interactive/config-fields.js.map +1 -1
- package/dist/modules/interactive/equivalent-command.js +6 -8
- package/dist/modules/interactive/equivalent-command.js.map +1 -1
- package/dist/modules/interactive/invoice-copy.d.ts +19 -0
- package/dist/modules/interactive/invoice-copy.js +26 -0
- package/dist/modules/interactive/invoice-copy.js.map +1 -0
- package/dist/modules/interactive/periods.d.ts +2 -2
- package/dist/modules/interactive/periods.js +8 -4
- package/dist/modules/interactive/periods.js.map +1 -1
- package/dist/modules/parameters/health.d.ts +17 -0
- package/dist/modules/parameters/health.js +29 -0
- package/dist/modules/parameters/health.js.map +1 -0
- package/dist/modules/pdf/pdf.errors.d.ts +0 -1
- package/dist/modules/pdf/pdf.errors.js +1 -3
- package/dist/modules/pdf/pdf.errors.js.map +1 -1
- package/dist/modules/storybook/showcase.js +4 -1
- package/dist/modules/storybook/showcase.js.map +1 -1
- package/dist/modules/update-check/changelog.d.ts +23 -0
- package/dist/modules/update-check/changelog.js +99 -0
- package/dist/modules/update-check/changelog.js.map +1 -0
- package/dist/modules/update-check/update-check.presenter.d.ts +4 -0
- package/dist/modules/update-check/update-check.presenter.js +80 -2
- package/dist/modules/update-check/update-check.presenter.js.map +1 -1
- package/dist/modules/update-check/update-check.service.d.ts +3 -0
- package/dist/modules/update-check/update-check.service.js +2 -2
- package/dist/modules/update-check/update-check.service.js.map +1 -1
- package/dist/modules/vouchers/voucher-history.d.ts +9 -4
- package/dist/modules/vouchers/voucher-history.js +8 -3
- package/dist/modules/vouchers/voucher-history.js.map +1 -1
- package/dist/modules/vouchers/voucher-history.presenter.d.ts +9 -2
- package/dist/modules/vouchers/voucher-history.presenter.js +53 -15
- package/dist/modules/vouchers/voucher-history.presenter.js.map +1 -1
- package/dist/services/arca/arca-context.resolver.js +5 -0
- package/dist/services/arca/arca-context.resolver.js.map +1 -1
- package/dist/services/clipboard/clipboard.d.ts +2 -0
- package/dist/services/clipboard/clipboard.js +17 -0
- package/dist/services/clipboard/clipboard.js.map +1 -0
- package/dist/services/pdf/escape-html.d.ts +6 -0
- package/dist/services/pdf/escape-html.js +25 -0
- package/dist/services/pdf/escape-html.js.map +1 -0
- package/dist/services/pdf/pdf-exporter.js +2 -1
- package/dist/services/pdf/pdf-exporter.js.map +1 -1
- package/dist/ui/components/statusBar.d.ts +15 -2
- package/dist/ui/components/statusBar.js +18 -9
- package/dist/ui/components/statusBar.js.map +1 -1
- package/dist/ui/presenters/errors.presenter.js +5 -4
- package/dist/ui/presenters/errors.presenter.js.map +1 -1
- package/dist/ui/primitives/renderLogo.d.ts +2 -1
- package/dist/ui/primitives/renderLogo.js +21 -4
- package/dist/ui/primitives/renderLogo.js.map +1 -1
- package/dist/ui/primitives/renderPanel.d.ts +2 -0
- package/dist/ui/primitives/renderPanel.js +15 -5
- package/dist/ui/primitives/renderPanel.js.map +1 -1
- package/dist/ui/stream/terminal-stream.d.ts +6 -0
- package/dist/ui/stream/terminal-stream.js +15 -1
- package/dist/ui/stream/terminal-stream.js.map +1 -1
- package/dist/ui/theme/theme.d.ts +3 -3
- package/dist/ui/theme/theme.js +14 -3
- package/dist/ui/theme/theme.js.map +1 -1
- package/llms.txt +12 -10
- package/package.json +1 -1
- package/dist/cli/interactive/lookup.flow.d.ts +0 -5
- package/dist/cli/interactive/lookup.flow.js +0 -72
- package/dist/cli/interactive/lookup.flow.js.map +0 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { formatQuotationAsText, formatStatusAsText } from '../../modules/parameters/parameters.presenter.js';
|
|
2
|
+
import { buildStatusReport } from '../../modules/parameters/status.js';
|
|
3
|
+
import { ArcaParametersGateway } from '../../services/arca/arca-parameters.gateway.js';
|
|
4
|
+
import { writeTerminalOutput } from '../../ui/index.js';
|
|
5
|
+
import { startSpinner } from '../spinner.js';
|
|
6
|
+
async function withSpinner(text, run) {
|
|
7
|
+
const spinner = startSpinner(text);
|
|
8
|
+
try {
|
|
9
|
+
return await run();
|
|
10
|
+
}
|
|
11
|
+
finally {
|
|
12
|
+
spinner?.stop();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Estado de los servidores de ARCA, del punto de venta y la cotizacion oficial del dolar. */
|
|
16
|
+
export async function runStatusFlow(session) {
|
|
17
|
+
const gateway = new ArcaParametersGateway(session.arca);
|
|
18
|
+
const { environment, pointOfSale } = session.runtime;
|
|
19
|
+
const [report, quotation] = await withSpinner('Consultando ARCA...', () => Promise.all([
|
|
20
|
+
buildStatusReport({ environment, gateway, pointOfSale }),
|
|
21
|
+
// La cotizacion es un extra: si falla, el estado se muestra igual.
|
|
22
|
+
gateway.getQuotation('USD').catch(() => undefined),
|
|
23
|
+
]));
|
|
24
|
+
writeTerminalOutput(formatStatusAsText(report));
|
|
25
|
+
if (quotation) {
|
|
26
|
+
writeTerminalOutput(formatQuotationAsText(quotation, environment));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=status.flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.flow.js","sourceRoot":"","sources":["../../../src/cli/interactive/status.flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI1C,KAAK,UAAU,WAAW,CAAI,IAAY,EAAE,GAAqB;IAC/D,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA2B;IAC7D,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IACrD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,WAAW,CAAC,qBAAqB,EAAE,GAAG,EAAE,CACxE,OAAO,CAAC,GAAG,CAAC;QACV,iBAAiB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACxD,mEAAmE;QACnE,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;KACnD,CAAC,CACH,CAAC;IAEF,mBAAmB,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhD,IAAI,SAAS,EAAE,CAAC;QACd,mBAAmB,CAAC,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { UpdateCheckResult } from '../../modules/update-check/update-check.service';
|
|
2
|
+
/**
|
|
3
|
+
* Muestra la version nueva y sus novedades. Con "Cerrar para actualizar" copia el comando al portapapeles y
|
|
4
|
+
* devuelve `true` para que el modo interactivo termine: arcli no se puede reemplazar a si mismo mientras corre.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runUpdateFlow(update: UpdateCheckResult): Promise<boolean>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BACK } from '../../modules/interactive/wizard.js';
|
|
2
|
+
import { extractChangelog, fetchChangelog } from '../../modules/update-check/changelog.js';
|
|
3
|
+
import { renderUpdateDetails, UPDATE_COMMAND } from '../../modules/update-check/update-check.presenter.js';
|
|
4
|
+
import { copyToClipboard } from '../../services/clipboard/clipboard.js';
|
|
5
|
+
import { noticePanel, writeTerminalOutput } from '../../ui/index.js';
|
|
6
|
+
import { startSpinner } from '../spinner.js';
|
|
7
|
+
import { chooseStep } from './prompts.js';
|
|
8
|
+
/**
|
|
9
|
+
* Muestra la version nueva y sus novedades. Con "Cerrar para actualizar" copia el comando al portapapeles y
|
|
10
|
+
* devuelve `true` para que el modo interactivo termine: arcli no se puede reemplazar a si mismo mientras corre.
|
|
11
|
+
*/
|
|
12
|
+
export async function runUpdateFlow(update) {
|
|
13
|
+
const spinner = startSpinner('Buscando las novedades...');
|
|
14
|
+
const markdown = await fetchChangelog(update.latestVersion);
|
|
15
|
+
spinner?.stop();
|
|
16
|
+
writeTerminalOutput(renderUpdateDetails(update, markdown === undefined ? undefined : extractChangelog(markdown, update.currentVersion, update.latestVersion)));
|
|
17
|
+
// "← Volver" (o Esc) lo agrega chooseStep, igual que en el resto de los menus.
|
|
18
|
+
if ((await chooseStep('¿Actualizamos?', [{ name: 'Cerrar para actualizar', value: 'cerrar' }])) === BACK) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
writeTerminalOutput(copyToClipboard(UPDATE_COMMAND)
|
|
22
|
+
? noticePanel(`Comando copiado. Pegalo en la terminal y apreta Enter:\n${UPDATE_COMMAND}`, 'success')
|
|
23
|
+
: noticePanel(`No se pudo copiar el comando. Ejecutalo en la terminal:\n${UPDATE_COMMAND}`, 'warning'));
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=update.flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.flow.js","sourceRoot":"","sources":["../../../src/cli/interactive/update.flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kCAAkC,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AAExG,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAyB;IAC3D,MAAM,OAAO,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAE5D,OAAO,EAAE,IAAI,EAAE,CAAC;IAChB,mBAAmB,CACjB,mBAAmB,CACjB,MAAM,EACN,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,CAC7G,CACF,CAAC;IAEF,+EAA+E;IAC/E,IAAI,CAAC,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzG,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mBAAmB,CACjB,eAAe,CAAC,cAAc,CAAC;QAC7B,CAAC,CAAC,WAAW,CAAC,2DAA2D,cAAc,EAAE,EAAE,SAAS,CAAC;QACrG,CAAC,CAAC,WAAW,CAAC,4DAA4D,cAAc,EAAE,EAAE,SAAS,CAAC,CACzG,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { parseArgentineDateInputAsArcaDate } from '../../lib/dates/arca-date.js';
|
|
2
|
-
import {
|
|
2
|
+
import { EXCHANGE_RATE_DECIMALS, parseArgentineAmount } from '../../lib/numbers/argentine-amount.js';
|
|
3
3
|
export function validateAmount(value) {
|
|
4
|
-
|
|
4
|
+
const result = parseArgentineAmount(value);
|
|
5
|
+
return result.ok ? true : `Monto invalido: ${result.reason}. Por ejemplo 150000, 150.000 o 1.500,50.`;
|
|
5
6
|
}
|
|
6
7
|
export function validateCuit(value) {
|
|
7
8
|
return /^\d{11}$/.test(value.replace(/-/g, '')) ? true : 'El CUIT tiene 11 digitos.';
|
|
@@ -29,7 +30,10 @@ export function validateOptionalAmount(value) {
|
|
|
29
30
|
return value.trim() === '' ? true : validateAmount(value);
|
|
30
31
|
}
|
|
31
32
|
export function validateExchangeRate(value) {
|
|
32
|
-
const
|
|
33
|
-
|
|
33
|
+
const result = parseArgentineAmount(value, { maxDecimals: EXCHANGE_RATE_DECIMALS });
|
|
34
|
+
if (!result.ok) {
|
|
35
|
+
return `Cotizacion invalida: ${result.reason}. Por ejemplo 1200 o 1.185,50.`;
|
|
36
|
+
}
|
|
37
|
+
return result.value !== 1 ? true : 'Ingresa la cotizacion acordada, por ejemplo 1200 o 1.185,50.';
|
|
34
38
|
}
|
|
35
39
|
//# sourceMappingURL=validators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../src/cli/interactive/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../src/cli/interactive/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAElG,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAE3C,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,MAAM,CAAC,MAAM,2CAA2C,CAAC;AACxG,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;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC;QACH,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAEzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,sEAAsE,CAAC;IAChF,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAEpF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,wBAAwB,MAAM,CAAC,MAAM,gCAAgC,CAAC;IAC/E,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,8DAA8D,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Montos como en Argentina: punto para miles y coma para decimales. */
|
|
2
|
+
export declare function amountOption(flag: string, maxDecimals?: number): (value: string) => number;
|
|
3
|
+
/** Entero solo con digitos: `--pv 3a` es un error, no un 3. */
|
|
4
|
+
export declare function integerOption(flag: string): (value: string) => number;
|
|
5
|
+
/** CUIT, CUIL o DNI: acepta guiones y puntos (`20-11111111-2`). */
|
|
6
|
+
export declare function documentNumberOption(flag: string): (value: string) => number;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { InputValidationError } from '../lib/errors/app-error.js';
|
|
2
|
+
import { parseArgentineAmount } from '../lib/numbers/argentine-amount.js';
|
|
3
|
+
import { parseDocumentNumber, parseStrictInteger } from '../lib/numbers/strict-integer.js';
|
|
4
|
+
/** Montos como en Argentina: punto para miles y coma para decimales. */
|
|
5
|
+
export function amountOption(flag, maxDecimals) {
|
|
6
|
+
return (value) => {
|
|
7
|
+
const result = parseArgentineAmount(value, { maxDecimals });
|
|
8
|
+
if (!result.ok) {
|
|
9
|
+
throw new InputValidationError(`${flag} "${value}" no es valido: ${result.reason}.`);
|
|
10
|
+
}
|
|
11
|
+
return result.value;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** Entero solo con digitos: `--pv 3a` es un error, no un 3. */
|
|
15
|
+
export function integerOption(flag) {
|
|
16
|
+
return (value) => {
|
|
17
|
+
const parsed = parseStrictInteger(value);
|
|
18
|
+
if (parsed === undefined) {
|
|
19
|
+
throw new InputValidationError(`${flag} "${value}" no es valido: tiene que ser un numero entero.`);
|
|
20
|
+
}
|
|
21
|
+
return parsed;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** CUIT, CUIL o DNI: acepta guiones y puntos (`20-11111111-2`). */
|
|
25
|
+
export function documentNumberOption(flag) {
|
|
26
|
+
return (value) => {
|
|
27
|
+
const parsed = parseDocumentNumber(value);
|
|
28
|
+
if (parsed === undefined) {
|
|
29
|
+
throw new InputValidationError(`${flag} "${value}" no es valido: use solo numeros, con o sin guiones.`);
|
|
30
|
+
}
|
|
31
|
+
return parsed;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=option-parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option-parsers.js","sourceRoot":"","sources":["../../src/cli/option-parsers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAExF,wEAAwE;AACxE,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,WAAoB;IAC7D,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,oBAAoB,CAAC,GAAG,IAAI,KAAK,KAAK,mBAAmB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvF,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,oBAAoB,CAAC,GAAG,IAAI,KAAK,KAAK,iDAAiD,CAAC,CAAC;QACrG,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,oBAAoB,CAAC,GAAG,IAAI,KAAK,KAAK,sDAAsD,CAAC,CAAC;QAC1G,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/cli/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "
|
|
1
|
+
export declare const CLI_VERSION = "2.0.0";
|
package/dist/cli/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const CLI_VERSION = '
|
|
1
|
+
export const CLI_VERSION = '2.0.0';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
export interface CalendarDate {
|
|
2
|
+
readonly day: number;
|
|
3
|
+
/** 1 a 12. */
|
|
4
|
+
readonly month: number;
|
|
5
|
+
readonly year: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Dia calendario en Argentina de un instante. ARCA trabaja con la fecha argentina: en un servidor con TZ=UTC,
|
|
9
|
+
* despues de las 21 hs la fecha local ya es la del dia siguiente.
|
|
10
|
+
*/
|
|
11
|
+
export declare function toArgentineCalendarDate(value: Date): CalendarDate;
|
|
12
|
+
export declare function calendarDateToArcaDate(value: CalendarDate): string;
|
|
13
|
+
/** Fecha ARCA (yyyymmdd) del dia en Argentina en ese instante. */
|
|
1
14
|
export declare function formatDateAsArcaDate(value: Date): string;
|
|
2
15
|
/** Dias entre dos fechas ARCA (yyyymmdd): positivo si `to` es posterior a `from`. */
|
|
3
16
|
export declare function diffArcaDatesInDays(from: string, to: string): number;
|
|
@@ -1,11 +1,25 @@
|
|
|
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
|
-
|
|
3
|
+
const ARGENTINE_DATE_PARTS = new Intl.DateTimeFormat('en-CA', {
|
|
4
|
+
day: '2-digit',
|
|
5
|
+
month: '2-digit',
|
|
6
|
+
timeZone: 'America/Argentina/Buenos_Aires',
|
|
7
|
+
year: 'numeric',
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* Dia calendario en Argentina de un instante. ARCA trabaja con la fecha argentina: en un servidor con TZ=UTC,
|
|
11
|
+
* despues de las 21 hs la fecha local ya es la del dia siguiente.
|
|
12
|
+
*/
|
|
13
|
+
export function toArgentineCalendarDate(value) {
|
|
14
|
+
const parts = Object.fromEntries(ARGENTINE_DATE_PARTS.formatToParts(value).map((part) => [part.type, part.value]));
|
|
15
|
+
return { day: Number(parts.day), month: Number(parts.month), year: Number(parts.year) };
|
|
16
|
+
}
|
|
17
|
+
export function calendarDateToArcaDate(value) {
|
|
18
|
+
return `${value.year}${String(value.month).padStart(2, '0')}${String(value.day).padStart(2, '0')}`;
|
|
19
|
+
}
|
|
20
|
+
/** Fecha ARCA (yyyymmdd) del dia en Argentina en ese instante. */
|
|
4
21
|
export function formatDateAsArcaDate(value) {
|
|
5
|
-
|
|
6
|
-
const month = String(value.getMonth() + 1).padStart(2, '0');
|
|
7
|
-
const day = String(value.getDate()).padStart(2, '0');
|
|
8
|
-
return `${year}${month}${day}`;
|
|
22
|
+
return calendarDateToArcaDate(toArgentineCalendarDate(value));
|
|
9
23
|
}
|
|
10
24
|
function arcaDateToUtcTime(value) {
|
|
11
25
|
return Date.UTC(Number(value.slice(0, 4)), Number(value.slice(4, 6)) - 1, Number(value.slice(6, 8)));
|
|
@@ -27,18 +41,21 @@ export function parseArgentineDateInputAsArcaDate(value, referenceDate = new Dat
|
|
|
27
41
|
throw new InputValidationError(`La fecha "${value}" no es valida. ${ARGENTINE_DATE_FORMAT_HINT}`);
|
|
28
42
|
}
|
|
29
43
|
const [, rawDay, , rawMonth, explicitYear] = dateMatch;
|
|
44
|
+
const today = toArgentineCalendarDate(referenceDate);
|
|
30
45
|
const day = rawDay.padStart(2, '0');
|
|
31
|
-
const month = (rawMonth ?? String(
|
|
32
|
-
const year = resolveYear(explicitYear,
|
|
33
|
-
const date = new Date(Number(year), Number(month) - 1, Number(day));
|
|
34
|
-
if (date.
|
|
46
|
+
const month = (rawMonth ?? String(today.month)).padStart(2, '0');
|
|
47
|
+
const year = resolveYear(explicitYear, today);
|
|
48
|
+
const date = new Date(Date.UTC(Number(year), Number(month) - 1, Number(day)));
|
|
49
|
+
if (date.getUTCFullYear() !== Number(year) ||
|
|
50
|
+
date.getUTCMonth() !== Number(month) - 1 ||
|
|
51
|
+
date.getUTCDate() !== Number(day)) {
|
|
35
52
|
throw new InputValidationError(`La fecha "${value}" no es valida.`);
|
|
36
53
|
}
|
|
37
54
|
return `${year}${month}${day}`;
|
|
38
55
|
}
|
|
39
|
-
function resolveYear(explicitYear,
|
|
56
|
+
function resolveYear(explicitYear, today) {
|
|
40
57
|
if (!explicitYear) {
|
|
41
|
-
return String(
|
|
58
|
+
return String(today.year);
|
|
42
59
|
}
|
|
43
60
|
return explicitYear.length === 2 ? `20${explicitYear}` : explicitYear;
|
|
44
61
|
}
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"arca-date.js","sourceRoot":"","sources":["../../../src/lib/dates/arca-date.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
export declare class AppError extends Error {
|
|
2
2
|
readonly code: string;
|
|
3
3
|
readonly details?: Record<string, unknown>;
|
|
4
|
+
/** Que hacer ahora; sale como "Sugerencia" en texto y `sugerencia` en JSON. */
|
|
5
|
+
readonly suggestion?: string;
|
|
4
6
|
constructor(message: string, options: {
|
|
5
7
|
code: string;
|
|
6
8
|
details?: Record<string, unknown>;
|
|
9
|
+
suggestion?: string;
|
|
7
10
|
});
|
|
8
11
|
}
|
|
9
12
|
export declare class ConfigurationError extends AppError {
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
export class AppError extends Error {
|
|
2
2
|
code;
|
|
3
3
|
details;
|
|
4
|
+
/** Que hacer ahora; sale como "Sugerencia" en texto y `sugerencia` en JSON. */
|
|
5
|
+
suggestion;
|
|
4
6
|
constructor(message, options) {
|
|
5
7
|
super(message);
|
|
6
8
|
this.name = 'AppError';
|
|
7
9
|
this.code = options.code;
|
|
8
10
|
this.details = options.details;
|
|
11
|
+
this.suggestion = options.suggestion;
|
|
9
12
|
}
|
|
10
13
|
}
|
|
11
14
|
export class ConfigurationError extends AppError {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../../src/lib/errors/app-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,IAAI,CAAS;IACb,OAAO,CAA2B;
|
|
1
|
+
{"version":3,"file":"app-error.js","sourceRoot":"","sources":["../../../src/lib/errors/app-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,IAAI,CAAS;IACb,OAAO,CAA2B;IAClD,+EAA+E;IAC/D,UAAU,CAAU;IAEpC,YACE,OAAe,EACf,OAAiF;QAEjF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,QAAQ;IAC9C,YAAmB,OAAe,EAAE,OAAiC;QACnE,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,qBAAqB;YAC3B,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,QAAQ;IAChD,YAAmB,OAAe,EAAE,OAAiC;QACnE,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,wBAAwB;YAC9B,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Permisos solo para el dueno en archivos y carpetas nuevos: tickets de ARCA, config y PDFs. */
|
|
2
|
+
export declare const OWNER_ONLY_UMASK = 63;
|
|
3
|
+
/**
|
|
4
|
+
* Deja una carpeta existente en 0700. Alcanza para proteger lo de adentro (por ejemplo tickets viejos en 0644):
|
|
5
|
+
* sin permiso de la carpeta, nadie mas llega a los archivos. Si no es nuestra o el sistema no lo soporta, sigue.
|
|
6
|
+
*/
|
|
7
|
+
export declare function restrictFolderToOwner(path: string): void;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { chmodSync, existsSync } from 'node:fs';
|
|
2
|
+
/** Permisos solo para el dueno en archivos y carpetas nuevos: tickets de ARCA, config y PDFs. */
|
|
3
|
+
export const OWNER_ONLY_UMASK = 0o077;
|
|
4
|
+
/**
|
|
5
|
+
* Deja una carpeta existente en 0700. Alcanza para proteger lo de adentro (por ejemplo tickets viejos en 0644):
|
|
6
|
+
* sin permiso de la carpeta, nadie mas llega a los archivos. Si no es nuestra o el sistema no lo soporta, sigue.
|
|
7
|
+
*/
|
|
8
|
+
export function restrictFolderToOwner(path) {
|
|
9
|
+
if (process.platform === 'win32' || !existsSync(path)) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
chmodSync(path, 0o700);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Carpeta de otro usuario o sistema de archivos sin permisos POSIX: no es motivo para frenar el comando.
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=restrict-to-owner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restrict-to-owner.js","sourceRoot":"","sources":["../../../src/lib/files/restrict-to-owner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEhD,iGAAiG;AACjG,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAEtC;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,yGAAyG;IAC3G,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** CUIT o CUIL con guiones, como lo muestra ARCA: `20409509763` → `20-40950976-3`. Si no tiene 11 digitos, sin cambios. */
|
|
2
|
+
export function formatCuit(value) {
|
|
3
|
+
const digits = String(value);
|
|
4
|
+
return /^\d{11}$/.test(digits) ? `${digits.slice(0, 2)}-${digits.slice(2, 10)}-${digits.slice(10)}` : digits;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=format-cuit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-cuit.js","sourceRoot":"","sources":["../../../src/lib/identity/format-cuit.ts"],"names":[],"mappings":"AAAA,2HAA2H;AAC3H,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/G,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Decimales de un importe en ARCA. */
|
|
2
|
+
export declare const AMOUNT_DECIMALS = 2;
|
|
3
|
+
/** Decimales de una cotizacion en ARCA (MonCotiz). */
|
|
4
|
+
export declare const EXCHANGE_RATE_DECIMALS = 6;
|
|
5
|
+
export type ArgentineAmountResult = {
|
|
6
|
+
readonly ok: true;
|
|
7
|
+
readonly value: number;
|
|
8
|
+
} | {
|
|
9
|
+
readonly ok: false;
|
|
10
|
+
readonly reason: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Interpreta un monto escrito como en Argentina: el punto separa miles y la coma separa decimales.
|
|
14
|
+
* `15000`, `15.000`, `1500,50` y `1.500,50` son validos; `1500.50` no, porque un grupo de miles
|
|
15
|
+
* siempre tiene 3 digitos. Acepta un `$` adelante y espacios.
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseArgentineAmount(raw: string, options?: {
|
|
18
|
+
readonly maxDecimals?: number;
|
|
19
|
+
}): ArgentineAmountResult;
|
|
20
|
+
/** Escribe un numero como lo lee `parseArgentineAmount`: `1234.5` pasa a `1234,5`. */
|
|
21
|
+
export declare function formatArgentineAmountInput(value: number): string;
|
|
22
|
+
/** `true` si el numero no tiene mas de `decimals` decimales: 100.55 si, 100.555 no. */
|
|
23
|
+
export declare function hasAtMostDecimals(value: number, decimals: number): boolean;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import Big from 'big.js';
|
|
2
|
+
/** Decimales de un importe en ARCA. */
|
|
3
|
+
export const AMOUNT_DECIMALS = 2;
|
|
4
|
+
/** Decimales de una cotizacion en ARCA (MonCotiz). */
|
|
5
|
+
export const EXCHANGE_RATE_DECIMALS = 6;
|
|
6
|
+
const FORMAT_HINT = 'use punto para miles y coma para decimales, por ejemplo 15000, 15.000 o 1.500,50';
|
|
7
|
+
/**
|
|
8
|
+
* Interpreta un monto escrito como en Argentina: el punto separa miles y la coma separa decimales.
|
|
9
|
+
* `15000`, `15.000`, `1500,50` y `1.500,50` son validos; `1500.50` no, porque un grupo de miles
|
|
10
|
+
* siempre tiene 3 digitos. Acepta un `$` adelante y espacios.
|
|
11
|
+
*/
|
|
12
|
+
export function parseArgentineAmount(raw, options = {}) {
|
|
13
|
+
const maxDecimals = options.maxDecimals ?? AMOUNT_DECIMALS;
|
|
14
|
+
const value = raw.trim().replace(/^\$/, '').replace(/\s/g, '');
|
|
15
|
+
const match = /^(\d{1,3}(?:\.\d{3})+|\d+)(?:,(\d+))?$/.exec(value);
|
|
16
|
+
if (!match) {
|
|
17
|
+
return { ok: false, reason: /^\d+\.\d{1,2}$/.test(value) ? 'use coma para los decimales' : FORMAT_HINT };
|
|
18
|
+
}
|
|
19
|
+
const [, integerPart = '', decimalPart = ''] = match;
|
|
20
|
+
if (decimalPart.length > maxDecimals) {
|
|
21
|
+
return { ok: false, reason: `use hasta ${maxDecimals} decimales` };
|
|
22
|
+
}
|
|
23
|
+
const amount = Number(`${integerPart.replace(/\./g, '')}.${decimalPart || '0'}`);
|
|
24
|
+
if (!Number.isFinite(amount) || amount <= 0) {
|
|
25
|
+
return { ok: false, reason: 'tiene que ser mayor a 0' };
|
|
26
|
+
}
|
|
27
|
+
return { ok: true, value: amount };
|
|
28
|
+
}
|
|
29
|
+
/** Escribe un numero como lo lee `parseArgentineAmount`: `1234.5` pasa a `1234,5`. */
|
|
30
|
+
export function formatArgentineAmountInput(value) {
|
|
31
|
+
return String(value).replace('.', ',');
|
|
32
|
+
}
|
|
33
|
+
/** `true` si el numero no tiene mas de `decimals` decimales: 100.55 si, 100.555 no. */
|
|
34
|
+
export function hasAtMostDecimals(value, decimals) {
|
|
35
|
+
return Number.isFinite(value) && new Big(value).round(decimals, Big.roundDown).eq(value);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=argentine-amount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argentine-amount.js","sourceRoot":"","sources":["../../../src/lib/numbers/argentine-amount.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,QAAQ,CAAC;AAEzB,uCAAuC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,sDAAsD;AACtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAKxC,MAAM,WAAW,GAAG,kFAAkF,CAAC;AAEvG;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,UAA6C,EAAE;IAE/C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,eAAe,CAAC;IAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,wCAAwC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3G,CAAC;IAED,MAAM,CAAC,EAAE,WAAW,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC;IAErD,IAAI,WAAW,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,WAAW,YAAY,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC,CAAC;IAEjF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACtD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,QAAgB;IAC/D,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Entero positivo escrito solo con digitos: `3` si, `3a`, `3.5` o `-3` no. */
|
|
2
|
+
export declare function parseStrictInteger(raw: string): number | undefined;
|
|
3
|
+
/** Numero de documento (CUIT, CUIL o DNI): acepta guiones, puntos y espacios, como `20-11111111-2` o `30.111.222`. */
|
|
4
|
+
export declare function parseDocumentNumber(raw: string): number | undefined;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Entero positivo escrito solo con digitos: `3` si, `3a`, `3.5` o `-3` no. */
|
|
2
|
+
export function parseStrictInteger(raw) {
|
|
3
|
+
const value = raw.trim();
|
|
4
|
+
return /^\d+$/.test(value) ? Number(value) : undefined;
|
|
5
|
+
}
|
|
6
|
+
/** Numero de documento (CUIT, CUIL o DNI): acepta guiones, puntos y espacios, como `20-11111111-2` o `30.111.222`. */
|
|
7
|
+
export function parseDocumentNumber(raw) {
|
|
8
|
+
return parseStrictInteger(raw.replace(/[-.\s]/g, ''));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=strict-integer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strict-integer.js","sourceRoot":"","sources":["../../../src/lib/numbers/strict-integer.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAEzB,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
package/dist/lib/security/pem.js
CHANGED
|
@@ -8,7 +8,7 @@ function acceptedPemHeaders(kind) {
|
|
|
8
8
|
if (kind === 'certificado') {
|
|
9
9
|
return ['BEGIN CERTIFICATE'];
|
|
10
10
|
}
|
|
11
|
-
return ['BEGIN PRIVATE KEY', 'BEGIN RSA PRIVATE KEY', 'BEGIN EC PRIVATE KEY'
|
|
11
|
+
return ['BEGIN PRIVATE KEY', 'BEGIN RSA PRIVATE KEY', 'BEGIN EC PRIVATE KEY'];
|
|
12
12
|
}
|
|
13
13
|
export function ensurePathExists(filePath, label) {
|
|
14
14
|
if (!existsSync(filePath)) {
|
|
@@ -19,6 +19,10 @@ export function ensurePathExists(filePath, label) {
|
|
|
19
19
|
}
|
|
20
20
|
export function ensurePemFormat(content, filePath, label) {
|
|
21
21
|
const normalizedContent = content.trim();
|
|
22
|
+
// El SDK no recibe passphrase: con una clave cifrada fallaria recien al hablar con ARCA, con un error confuso.
|
|
23
|
+
if (label === 'clave privada' && normalizedContent.includes('-----BEGIN ENCRYPTED PRIVATE KEY-----')) {
|
|
24
|
+
throw new ConfigurationError(`La clave privada esta cifrada con contrasena y ARCLI no puede usarla: ${maskPath(filePath)}. Generala sin contrasena o descifrala con "openssl pkey -in clave.key -out clave-sin-pass.key".`, { path: maskPath(filePath) });
|
|
25
|
+
}
|
|
22
26
|
const hasAcceptedHeader = acceptedPemHeaders(label).some((header) => normalizedContent.includes(`-----${header}-----`));
|
|
23
27
|
const hasAcceptedFooter = normalizedContent.includes('-----END');
|
|
24
28
|
if (!hasAcceptedHeader || !hasAcceptedFooter) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pem.js","sourceRoot":"","sources":["../../../src/lib/security/pem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI9C,SAAS,iBAAiB,CAAC,IAAa;IACtC,OAAO,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,6BAA6B,CAAC;AAChG,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAa;IACvC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"pem.js","sourceRoot":"","sources":["../../../src/lib/security/pem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAI9C,SAAS,iBAAiB,CAAC,IAAa;IACtC,OAAO,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,6BAA6B,CAAC;AAChG,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAa;IACvC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,sBAAsB,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,KAAc;IAC/D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,kBAAkB,CAAC,eAAe,KAAK,eAAe,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE;YACpF,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,QAAgB,EAAE,KAAc;IAC/E,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAEzC,+GAA+G;IAC/G,IAAI,KAAK,KAAK,eAAe,IAAI,iBAAiB,CAAC,QAAQ,CAAC,uCAAuC,CAAC,EAAE,CAAC;QACrG,MAAM,IAAI,kBAAkB,CAC1B,yEAAyE,QAAQ,CAAC,QAAQ,CAAC,kGAAkG,EAC7L,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAC7B,CAAC;IACJ,CAAC;IACD,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAClE,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,MAAM,OAAO,CAAC,CAClD,CAAC;IACF,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEjE,IAAI,CAAC,iBAAiB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7C,MAAM,IAAI,kBAAkB,CAC1B,MAAM,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,0BAA0B,kDAAkD,QAAQ,CAAC,QAAQ,CAAC,kCAAkC,iBAAiB,CAAC,KAAK,CAAC,GAAG,EACpN;YACE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC;SACzB,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,KAAc;IAC1D,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE/C,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -24,8 +24,9 @@ export function mapBillingResponse(response) {
|
|
|
24
24
|
resultado,
|
|
25
25
|
});
|
|
26
26
|
return {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
// El SDK devuelve "" en un rechazo; el JSON publico promete null.
|
|
28
|
+
cae: response.cae || null,
|
|
29
|
+
caeVencimiento: response.caeFchVto || null,
|
|
29
30
|
errors,
|
|
30
31
|
events,
|
|
31
32
|
observaciones,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing-response.js","sourceRoot":"","sources":["../../../src/modules/billing/billing-response.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"billing-response.js","sourceRoot":"","sources":["../../../src/modules/billing/billing-response.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,GAAG,EAAE,IAAI;QACT,cAAc,EAAE,IAAI;QACpB,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;QACV,aAAa,EAAE,EAAE;QACjB,WAAW,EAAE,IAAI;QACjB,GAAG,EAAE,IAAI;QACT,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,WAAW;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgC;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IACpD,MAAM,aAAa,GACjB,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzG,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC;IAC5C,MAAM,WAAW,GAAG,wBAAwB,CAAC;QAC3C,MAAM;QACN,aAAa;QACb,SAAS;KACV,CAAC,CAAC;IAEH,OAAO;QACL,kEAAkE;QAClE,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,IAAI;QACzB,cAAc,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;QAC1C,MAAM;QACN,MAAM;QACN,aAAa;QACb,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI;QAC9C,GAAG,EAAE,QAAQ;QACb,SAAS;QACT,WAAW;QACX,MAAM,EAAE,oBAAoB,CAAC;YAC3B,MAAM;YACN,aAAa;YACb,SAAS;SACV,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,OAIjC;IACC,MAAM,QAAQ,GAAG;QACf,GAAG,OAAO,CAAC,aAAa;QACxB,GAAG,OAAO,CAAC,MAAM;aACd,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAE,KAA0B,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAC1G;aACA,MAAM,CAAC,OAAO,CAAC;KACnB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,IAAI,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,iCAAiC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChG,WAAW,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAC;IAC9G,CAAC;IAED,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,WAAW,CAAC,GAAG,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,WAAW,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxD,WAAW,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,oBAAoB,CAAC,OAI7B;IACC,IAAI,OAAO,CAAC,SAAS,KAAK,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,KAAK,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -16,4 +16,6 @@ export declare function resolveIvaRateLabel(aliquotId: number): string | undefin
|
|
|
16
16
|
* ImpTotal = ImpTotConc + ImpOpEx + ImpNeto + ImpIVA (10048); la C no informa IVA (10071).
|
|
17
17
|
*/
|
|
18
18
|
export declare function resolveTaxAmounts(input: TaxAmountsInput, voucherKind: VoucherKindDefinition): TaxAmounts;
|
|
19
|
+
/** ImpTotal: la suma exacta de sus partes (10048), sin errores de coma flotante. */
|
|
20
|
+
export declare function sumTaxAmounts(amounts: TaxAmounts): number;
|
|
19
21
|
export {};
|
|
@@ -11,8 +11,6 @@ const IVA_RATE_DEFINITIONS = {
|
|
|
11
11
|
'27': { id: 6, rate: '0.27' },
|
|
12
12
|
};
|
|
13
13
|
export const DEFAULT_IVA_RATE = '21';
|
|
14
|
-
// Margen de ARCA para comparar importes (10048): un centavo.
|
|
15
|
-
const AMOUNT_TOLERANCE = 0.01;
|
|
16
14
|
export function resolveIvaRateLabel(aliquotId) {
|
|
17
15
|
const entry = Object.entries(IVA_RATE_DEFINITIONS).find(([, definition]) => definition.id === aliquotId);
|
|
18
16
|
return entry ? `${entry[0].replace('.', ',')}%` : undefined;
|
|
@@ -79,7 +77,8 @@ function resolveTaxedParts(input, taxedTotal) {
|
|
|
79
77
|
byRate.set(rate, (byRate.get(rate) ?? new Big(0)).plus(amount));
|
|
80
78
|
}
|
|
81
79
|
const sum = [...byRate.values()].reduce((total, amount) => total.plus(amount), new Big(0));
|
|
82
|
-
|
|
80
|
+
// Los importes tienen 2 decimales como maximo, asi que la suma tiene que dar exacta.
|
|
81
|
+
if (!sum.eq(taxedTotal)) {
|
|
83
82
|
throw new InputValidationError(`La suma de las alicuotas (${formatPlain(sum)}) no coincide con lo gravado del monto total (${formatPlain(taxedTotal)}). Revise --monto, --alicuota, --exento y --nogravado.`);
|
|
84
83
|
}
|
|
85
84
|
return [...byRate.entries()].map(([rate, amount]) => ({ amount, rate }));
|
|
@@ -90,4 +89,8 @@ function formatPlain(value) {
|
|
|
90
89
|
function roundAmount(value) {
|
|
91
90
|
return value.round(2, Big.roundHalfUp).toNumber();
|
|
92
91
|
}
|
|
92
|
+
/** ImpTotal: la suma exacta de sus partes (10048), sin errores de coma flotante. */
|
|
93
|
+
export function sumTaxAmounts(amounts) {
|
|
94
|
+
return roundAmount(new Big(amounts.untaxedAmount).plus(amounts.exemptAmount).plus(amounts.netAmount).plus(amounts.ivaAmount));
|
|
95
|
+
}
|
|
93
96
|
//# sourceMappingURL=billing.amounts.js.map
|
|
@@ -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;AAEzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAIvD,6CAA6C;AAC7C,MAAM,oBAAoB,GAA2E;IACnG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE;IACzB,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;IAC/B,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;IAC5B,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;IAChC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7B,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAmB,IAAI,CAAC;AAerD,
|
|
1
|
+
{"version":3,"file":"billing.amounts.js","sourceRoot":"","sources":["../../../src/modules/billing/billing.amounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { formatArcaDateAsArgentineDate, parseArgentineDateInputAsArcaDate } from '../../lib/dates/arca-date.js';
|
|
2
2
|
import { InputValidationError } from '../../lib/errors/app-error.js';
|
|
3
3
|
import { formatVoucherLabel } from './billing.mappers.js';
|
|
4
|
+
import { getVoucherKindByArcaType } from './voucher-kind-map.js';
|
|
4
5
|
export function resolveAssociatedVouchers(options) {
|
|
5
6
|
const { billingDate, emitterCuit, input, requireVoucherKind, voucherKind } = options;
|
|
6
7
|
if (!voucherKind.requiresAssociatedVoucher) {
|
|
@@ -17,9 +18,7 @@ export function resolveAssociatedVouchers(options) {
|
|
|
17
18
|
// En NC/ND FCE el asociado siempre es del propio emisor (10155), asi que el CUIT puede omitirse.
|
|
18
19
|
const associatedCuit = associatedVoucher?.cuit ?? (voucherKind.isElectronicCredit ? String(emitterCuit) : undefined);
|
|
19
20
|
const associatedVoucherType = associatedVoucher?.tipo ?? resolveAssociatedVoucherType(associatedVoucher?.shortcut, requireVoucherKind);
|
|
20
|
-
const associatedVoucherKind = associatedVoucher
|
|
21
|
-
? requireVoucherKind(associatedVoucher.shortcut)
|
|
22
|
-
: undefined;
|
|
21
|
+
const associatedVoucherKind = resolveAssociatedVoucherKind(associatedVoucher, requireVoucherKind);
|
|
23
22
|
if (!associatedVoucher?.numero || !associatedVoucher.puntoVenta || !associatedVoucherType || !associatedCuit) {
|
|
24
23
|
throw new InputValidationError(`El comprobante ${formatVoucherLabel(voucherKind)} requiere comprobante asociado. Use --ac o --at, junto con --apv o --asociado-punto-venta, --ar y --acuit${voucherKind.isElectronicCredit ? '' : ', o un periodo con --periodo-desde y --periodo-hasta'}.`);
|
|
25
24
|
}
|
|
@@ -40,6 +39,18 @@ export function resolveAssociatedVouchers(options) {
|
|
|
40
39
|
},
|
|
41
40
|
];
|
|
42
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* El tipo del asociado, por atajo (--ac) o por codigo ARCA (--at), para validar letra y familia igual en los dos
|
|
44
|
+
* casos. Un codigo fuera del alcance de ARCLI no se valida aca: lo resuelve ARCA.
|
|
45
|
+
*/
|
|
46
|
+
function resolveAssociatedVoucherKind(associatedVoucher, requireVoucherKind) {
|
|
47
|
+
const byShortcut = associatedVoucher?.shortcut ? requireVoucherKind(associatedVoucher.shortcut) : undefined;
|
|
48
|
+
const byType = associatedVoucher?.tipo ? (getVoucherKindByArcaType(associatedVoucher.tipo) ?? undefined) : undefined;
|
|
49
|
+
if (byShortcut && associatedVoucher?.tipo && byShortcut.arcaType !== associatedVoucher.tipo) {
|
|
50
|
+
throw new InputValidationError(`El atajo "${associatedVoucher.shortcut}" es el tipo ${byShortcut.arcaType}, no el ${associatedVoucher.tipo}. Use uno solo para el comprobante asociado.`);
|
|
51
|
+
}
|
|
52
|
+
return byShortcut ?? byType;
|
|
53
|
+
}
|
|
43
54
|
function resolveAssociatedVoucherDate(rawDate, billingDate, voucherKind) {
|
|
44
55
|
if (!rawDate) {
|
|
45
56
|
if (voucherKind.isElectronicCredit) {
|