@monesto/cli 0.0.1 → 0.0.2

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/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  CLI для расчёта чистого месячного дохода, аванса и зарплаты по рабочим дням (с учётом производственного календаря РФ) и распределения по активам: золото, USD, рубли.
4
4
 
5
+ **npm:** https://www.npmjs.com/package/@monesto/cli
6
+
5
7
  ## Установка
6
8
 
7
9
  ```bash
@@ -28,14 +30,14 @@ npx @monesto/cli calculate [опции]
28
30
 
29
31
  ### Опции
30
32
 
31
- | Опция | Описание |
32
- |-------|----------|
33
- | `--money <number>` | Месячный доход до налога (RUB). |
34
- | `--tax <значение>` | Налог: процент от гросса (`13%`) или фиксированная сумма (`31200`). |
35
- | `--currency <code>` | Базовая валюта дохода (по умолчанию `rub`). |
36
- | `--gold <значение>` | Доля в золото: процент (`10%`) или сумма в RUB (`50000`). |
37
- | `--usd <значение>` | Доля в USD: процент (`10%`) или сумма в USD (`250`). |
38
- | `--rub <значение>` | Доля в рублях: процент (`10%`) или сумма в RUB (`50000`). |
33
+ | Опция | Описание |
34
+ | ------------------- | ------------------------------------------------------------------- |
35
+ | `--money <number>` | Месячный доход до налога (RUB). |
36
+ | `--tax <значение>` | Налог: процент от гросса (`13%`) или фиксированная сумма (`31200`). |
37
+ | `--currency <code>` | Базовая валюта дохода (по умолчанию `rub`). |
38
+ | `--gold <значение>` | Доля в золото: процент (`10%`) или сумма в RUB (`50000`). |
39
+ | `--usd <значение>` | Доля в USD: процент (`10%`) или сумма в USD (`250`). |
40
+ | `--rub <значение>` | Доля в рублях: процент (`10%`) или сумма в RUB (`50000`). |
39
41
 
40
42
  Если опции не указаны, недостающие параметры можно ввести интерактивно.
41
43
 
@@ -46,15 +48,6 @@ npx @monesto/cli calculate [опции]
46
48
 
47
49
  Расчёт использует производственный календарь (выходные и нерабочие праздничные дни РФ).
48
50
 
49
- ### Конфигурация (monesto.json)
50
-
51
- При первом запуске можно ввести доход, налог и распределение по активам. Эти значения сохраняются в `monesto.json` в каталоге конфигурации:
52
-
53
- - **macOS / Linux:** `~/.config/monesto/monesto.json` (или `$XDG_CONFIG_HOME/monesto/monesto.json`)
54
- - **Windows:** `%APPDATA%\monesto\monesto.json`
55
-
56
- При следующих запусках сохранённые значения подставляются автоматически; флаги в командной строке имеют приоритет над конфигом.
57
-
58
51
  ### Примеры
59
52
 
60
53
  Оклад 240 000 ₽, налог 13%, аванс и зарплата за март 2026:
package/dist/cli.js CHANGED
@@ -3,52 +3,34 @@ import { allocateAssets } from './domain/allocation.js';
3
3
  import { splitNetIncomeByWorkdays } from './domain/salarySplit.js';
4
4
  import { calculateNetIncome } from './domain/tax.js';
5
5
  import { getGoldPricePerGramRub, getUsdToRubRate } from './services/rates.js';
6
- import { loadConfig, saveConfig } from './services/config.js';
7
6
  import { askMissingParameters } from './ui/prompts.js';
8
7
  import { renderAllocationTable, renderSummary } from './ui/table.js';
9
- function mergeConfig(saved, args) {
10
- const config = {
11
- money: saved.money,
12
- tax: saved.tax,
13
- currency: saved.currency ?? 'rub',
14
- imprestDate: saved.imprestDate,
15
- gold: saved.gold,
16
- usd: saved.usd,
17
- rub: saved.rub
18
- };
19
- if (args.money != null) {
20
- const value = Number(args.money);
21
- if (Number.isFinite(value)) {
22
- config.money = value;
23
- }
24
- }
25
- if (args.tax != null) {
26
- config.tax = args.tax;
27
- }
28
- if (args.currency != null) {
29
- config.currency = args.currency;
30
- }
31
- if (args.imprestDate != null) {
32
- const value = Number(args.imprestDate);
33
- if (Number.isFinite(value)) {
34
- config.imprestDate = value;
35
- }
36
- }
37
- if (args.gold != null) {
38
- config.gold = args.gold;
8
+ function optionsToParams(options) {
9
+ const params = {};
10
+ if (options.money != null) {
11
+ const n = Number(options.money);
12
+ if (Number.isFinite(n))
13
+ params.money = n;
39
14
  }
40
- if (args.usd != null) {
41
- config.usd = args.usd;
15
+ if (options.tax != null)
16
+ params.tax = options.tax;
17
+ if (options.currency != null)
18
+ params.currency = options.currency;
19
+ if (options.imprestDate != null) {
20
+ const n = Number(options.imprestDate);
21
+ if (Number.isFinite(n))
22
+ params.imprestDate = n;
42
23
  }
43
- if (args.rub != null) {
44
- config.rub = args.rub;
45
- }
46
- return config;
24
+ if (options.gold != null)
25
+ params.gold = options.gold;
26
+ if (options.usd != null)
27
+ params.usd = options.usd;
28
+ if (options.rub != null)
29
+ params.rub = options.rub;
30
+ return params;
47
31
  }
48
32
  async function handleCalculate(options) {
49
- const saved = await loadConfig();
50
- const merged = mergeConfig(saved, options);
51
- const completed = await askMissingParameters(merged);
33
+ const completed = await askMissingParameters(optionsToParams(options));
52
34
  if (completed.money == null) {
53
35
  console.error('Не указан месячный доход (--money).');
54
36
  process.exit(1);
@@ -86,15 +68,6 @@ async function handleCalculate(options) {
86
68
  }
87
69
  renderSummary(gross, taxResult, split);
88
70
  renderAllocationTable(allocation, taxResult.netIncome);
89
- await saveConfig({
90
- money: gross,
91
- tax: taxInput,
92
- currency: completed.currency ?? 'rub',
93
- imprestDate: completed.imprestDate ?? 25,
94
- gold: completed.gold,
95
- usd: completed.usd,
96
- rub: completed.rub
97
- });
98
71
  }
99
72
  export async function main(argv) {
100
73
  const program = new Command();
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -38,7 +38,8 @@ function computeFromInput(label, netIncomeRub, rawInput, rates) {
38
38
  }
39
39
  return {
40
40
  asset: 'usd',
41
- amountRub,
41
+ // Если сумма в долларах меньше 50 000, то добавляем 200 рублей комиссии
42
+ amountRub: amountRub < 50000 ? amountRub + 200 : amountRub,
42
43
  details: {
43
44
  usdAmount,
44
45
  percentOfNet
@@ -1 +1 @@
1
- {"version":3,"file":"allocation.js","sourceRoot":"","sources":["../../src/domain/allocation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"allocation.js","sourceRoot":"","sources":["../../src/domain/allocation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { parse, HTMLElement } from 'node-html-parser';
2
+ const URL_OFFICES_CURRENCY = 'https://www.bystrobank.ru/sitecurrency/web/currency_converter.php';
3
+ /** Куки для выбора города (Саратов) при запросе курсов. */
4
+ const CURRENCY_COOKIES = 'city=saratov;';
5
+ /** Индекс колонки USD в таблице #officesCurrency (0 — Офис, 1 — USD, 2 — EUR, …). */
6
+ const USD_COLUMN_INDEX = 1;
7
+ /** В ячейке USD два span.money: первый — покупка, второй — продажа. */
8
+ const BUY_SPAN_INDEX = 0;
9
+ const SELL_SPAN_INDEX = 1;
10
+ function parseMoneySpan(td) {
11
+ const spans = td.querySelectorAll('span.money');
12
+ return spans.map((span) => parseFloat(span.textContent?.trim().replace(',', '.') ?? '0'));
13
+ }
14
+ /**
15
+ * Парсинг таблицы #officesCurrency: первая строка tbody, колонка USD,
16
+ * два span.money — покупка и продажа.
17
+ */
18
+ export function parseUsdColumnFromTable(html) {
19
+ const document = parse(html);
20
+ const table = document.querySelector('table#officesCurrency');
21
+ if (!table)
22
+ return null;
23
+ const firstRow = table.querySelector('tbody tr');
24
+ if (!firstRow)
25
+ return null;
26
+ const cells = firstRow.querySelectorAll('td');
27
+ const usdCell = cells[USD_COLUMN_INDEX];
28
+ if (!usdCell)
29
+ return null;
30
+ const values = parseMoneySpan(usdCell);
31
+ if (values.length < 2)
32
+ return null;
33
+ const buy = values[BUY_SPAN_INDEX];
34
+ const sell = values[SELL_SPAN_INDEX];
35
+ if (!Number.isFinite(buy) || !Number.isFinite(sell))
36
+ return null;
37
+ return { buy, sell };
38
+ }
39
+ export class Parser {
40
+ /**
41
+ * Курс USD: возвращает курс покупки (первый span.money в колонке USD).
42
+ */
43
+ static async getUsdCourse() {
44
+ const response = await fetch('https://www.bystrobank.ru/sitecurrency/web/currency_converter.php', {
45
+ headers: {
46
+ accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
47
+ 'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
48
+ 'cache-control': 'max-age=0',
49
+ 'if-none-match': 'XML_Output_abbhgQoPEBQAAF0scegAAAB8',
50
+ 'sec-ch-ua': '"Chromium";v="145", "Not:A-Brand";v="99"',
51
+ 'sec-ch-ua-mobile': '?0',
52
+ 'sec-ch-ua-platform': '"macOS"',
53
+ 'sec-fetch-dest': 'document',
54
+ 'sec-fetch-mode': 'navigate',
55
+ 'sec-fetch-site': 'same-origin',
56
+ 'sec-fetch-user': '?1',
57
+ 'upgrade-insecure-requests': '1',
58
+ cookie: 'guest=aa_L5woPEBQAAP-9gJ8AAACg; _ym_uid=1773128680443116950; _ym_d=1773128680; l=Izhevsk; o=%D0%98%D0%B6%D0%B5%D0%B2%D1%81%D0%BA%3B(3412)%2090-80-90%3B%C2%AB%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9%20%D0%BE%D1%84%D0%B8%D1%81%20(%D0%98%D0%B6%D0%B5%D0%B2%D1%81%D0%BA)%C2%BB%3Bizh; _ym_isad=1; city=saratov; cityName=%D0%A1%D0%B0%D1%80%D0%B0%D1%82%D0%BE%D0%B2',
59
+ Referer: 'https://www.bystrobank.ru/geoeditor/web/citySelection.php'
60
+ },
61
+ body: null,
62
+ method: 'GET'
63
+ });
64
+ const html = await response.text();
65
+ const rates = parseUsdColumnFromTable(html);
66
+ if (!rates)
67
+ throw new Error('Не удалось распарсить курс USD из таблицы #officesCurrency');
68
+ return rates.buy + rates.buy * 0.035; // 3.5% комиссия банка
69
+ }
70
+ /** Покупка и продажа USD из первой строки таблицы. */
71
+ static async getUsdBuyAndSell() {
72
+ const response = await fetch(URL_OFFICES_CURRENCY, {
73
+ headers: { Cookie: CURRENCY_COOKIES }
74
+ });
75
+ const html = await response.text();
76
+ const rates = parseUsdColumnFromTable(html);
77
+ if (!rates)
78
+ throw new Error('Не удалось распарсить курс USD из таблицы #officesCurrency');
79
+ return rates;
80
+ }
81
+ }
82
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/services/parser.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,22 @@
1
+ import { Parser } from './parser.js';
2
+ const FALLBACK_USD_RUB = 95;
3
+ const FALLBACK_GOLD_PER_GRAM_RUB = 13232.09;
1
4
  export async function getUsdToRubRate() {
2
- // Mock implementation with a small artificial delay
3
- await new Promise((resolve) => setTimeout(resolve, 50));
4
- return 95;
5
+ try {
6
+ const usd = await Parser.getUsdCourse();
7
+ return usd;
8
+ }
9
+ catch {
10
+ return FALLBACK_USD_RUB;
11
+ }
5
12
  }
6
13
  export async function getGoldPricePerGramRub() {
7
- // Mock implementation with a small artificial delay
8
- await new Promise((resolve) => setTimeout(resolve, 50));
9
- return 7000;
14
+ try {
15
+ // TODO: подключить парсер золота по аналогии с USD, когда будет URL/разметка
16
+ return FALLBACK_GOLD_PER_GRAM_RUB;
17
+ }
18
+ catch {
19
+ return FALLBACK_GOLD_PER_GRAM_RUB;
20
+ }
10
21
  }
11
22
  //# sourceMappingURL=rates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rates.js","sourceRoot":"","sources":["../../src/services/rates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,oDAAoD;IACpD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,oDAAoD;IACpD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"rates.js","sourceRoot":"","sources":["../../src/services/rates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,0BAA0B,GAAG,QAAQ,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,IAAI,CAAC;QACH,6EAA6E;QAC7E,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,0BAA0B,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -36,7 +36,7 @@ export async function askMissingParameters(existing) {
36
36
  });
37
37
  }
38
38
  if (questions.length === 0) {
39
- return existing;
39
+ return { ...existing, currency: existing.currency ?? 'rub', imprestDate: existing.imprestDate ?? 25 };
40
40
  }
41
41
  const answers = await prompts(questions);
42
42
  const merged = {
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monesto/cli",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "CLI для расчёта чистого дохода, аванса и зарплаты по рабочим дням и распределения по активам (золото, USD, рубли)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -37,6 +37,7 @@
37
37
  "dependencies": {
38
38
  "cli-table3": "^0.6.5",
39
39
  "commander": "^12.1.0",
40
+ "node-html-parser": "^7.1.0",
40
41
  "prompts": "^2.4.2"
41
42
  },
42
43
  "devDependencies": {
@@ -48,4 +49,3 @@
48
49
  "vitest": "^3.2.0"
49
50
  }
50
51
  }
51
-