@rvboris/sberparse 1.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.
Files changed (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/balance-checker.d.ts +17 -0
  4. package/dist/balance-checker.d.ts.map +1 -0
  5. package/dist/balance-checker.js +34 -0
  6. package/dist/balance-checker.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +31 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/index.d.ts +17 -0
  12. package/dist/commands/index.d.ts.map +1 -0
  13. package/dist/commands/index.js +70 -0
  14. package/dist/commands/index.js.map +1 -0
  15. package/dist/converter.d.ts +9 -0
  16. package/dist/converter.d.ts.map +1 -0
  17. package/dist/converter.js +101 -0
  18. package/dist/converter.js.map +1 -0
  19. package/dist/csv-writer.d.ts +10 -0
  20. package/dist/csv-writer.d.ts.map +1 -0
  21. package/dist/csv-writer.js +71 -0
  22. package/dist/csv-writer.js.map +1 -0
  23. package/dist/exceptions.d.ts +31 -0
  24. package/dist/exceptions.d.ts.map +1 -0
  25. package/dist/exceptions.js +46 -0
  26. package/dist/exceptions.js.map +1 -0
  27. package/dist/extractor-selector.d.ts +16 -0
  28. package/dist/extractor-selector.d.ts.map +1 -0
  29. package/dist/extractor-selector.js +48 -0
  30. package/dist/extractor-selector.js.map +1 -0
  31. package/dist/extractor.d.ts +58 -0
  32. package/dist/extractor.d.ts.map +1 -0
  33. package/dist/extractor.js +65 -0
  34. package/dist/extractor.js.map +1 -0
  35. package/dist/extractors/index.d.ts +10 -0
  36. package/dist/extractors/index.d.ts.map +1 -0
  37. package/dist/extractors/index.js +14 -0
  38. package/dist/extractors/index.js.map +1 -0
  39. package/dist/extractors/sber-debit-2510.d.ts +15 -0
  40. package/dist/extractors/sber-debit-2510.d.ts.map +1 -0
  41. package/dist/extractors/sber-debit-2510.js +157 -0
  42. package/dist/extractors/sber-debit-2510.js.map +1 -0
  43. package/dist/extractors/sber-debit-2603.d.ts +16 -0
  44. package/dist/extractors/sber-debit-2603.d.ts.map +1 -0
  45. package/dist/extractors/sber-debit-2603.js +161 -0
  46. package/dist/extractors/sber-debit-2603.js.map +1 -0
  47. package/dist/index.d.ts +5 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +4 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/json-writer.d.ts +11 -0
  52. package/dist/json-writer.d.ts.map +1 -0
  53. package/dist/json-writer.js +38 -0
  54. package/dist/json-writer.js.map +1 -0
  55. package/dist/logger.d.ts +2 -0
  56. package/dist/logger.d.ts.map +1 -0
  57. package/dist/logger.js +21 -0
  58. package/dist/logger.js.map +1 -0
  59. package/dist/pdf-parser.d.ts +14 -0
  60. package/dist/pdf-parser.d.ts.map +1 -0
  61. package/dist/pdf-parser.js +31 -0
  62. package/dist/pdf-parser.js.map +1 -0
  63. package/dist/types.d.ts +58 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +2 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/unidecode.d.ts +6 -0
  68. package/dist/unidecode.d.ts.map +1 -0
  69. package/dist/unidecode.js +92 -0
  70. package/dist/unidecode.js.map +1 -0
  71. package/dist/utils.d.ts +27 -0
  72. package/dist/utils.d.ts.map +1 -0
  73. package/dist/utils.js +65 -0
  74. package/dist/utils.js.map +1 -0
  75. package/package.json +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-writer.js","sourceRoot":"","sources":["../src/json-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAgBlC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,YAA2B,EAC3B,QAAgB,EAChB,aAAqB,EACrB,MAAc;IAEd,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,OAAO,CAAC;IAElF,iDAAiD;IACjD,MAAM,wBAAwB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;QAChE,MAAM,MAAM,GAAuD,EAAE,CAAC;QACtE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACvD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;gBAC1B,gCAAgC;gBAChC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAe;QACzB,QAAQ,EAAE;YACR,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,aAAa;YACxB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,MAAM,EAAE,MAAM;SACf;QACD,YAAY,EAAE,wBAAwB;KACvC,CAAC;IAEF,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAE7E,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const logger: import("@logtape/logtape").Logger;
2
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,MAAM,mCAAyB,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,21 @@
1
+ import { configure, getConsoleSink, getLogger } from "@logtape/logtape";
2
+ import { prettyFormatter } from "@logtape/pretty";
3
+ await configure({
4
+ sinks: {
5
+ console: getConsoleSink({ formatter: prettyFormatter }),
6
+ },
7
+ loggers: [
8
+ {
9
+ category: ["logtape", "meta"],
10
+ sinks: ["console"],
11
+ lowestLevel: "warning",
12
+ },
13
+ {
14
+ category: "sberparse",
15
+ sinks: ["console"],
16
+ lowestLevel: "info",
17
+ },
18
+ ],
19
+ });
20
+ export const logger = getLogger("sberparse");
21
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,SAAS,CAAC;IACd,KAAK,EAAE;QACL,OAAO,EAAE,cAAc,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;KACxD;IACD,OAAO,EAAE;QACP;YACE,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;YAC7B,KAAK,EAAE,CAAC,SAAS,CAAC;YAClB,WAAW,EAAE,SAAS;SACvB;QACD;YACE,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,CAAC,SAAS,CAAC;YAClB,WAAW,EAAE,MAAM;SACpB;KACF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Конвертирует PDF файл в текст
3
+ * @param pdf_file_name Путь к PDF файлу
4
+ * @returns Текстовое содержимое
5
+ */
6
+ export declare function pdfToText(pdf_file_name: string): Promise<string>;
7
+ /**
8
+ * Конвертирует PDF файл в текстовый файл
9
+ * @param pdf_file_name Путь к PDF файлу
10
+ * @param txt_output_file_name Путь к выходному текстовому файлу (опционально)
11
+ * @returns Путь к созданному текстовому файлу
12
+ */
13
+ export declare function pdfToTxtFile(pdf_file_name: string, txt_output_file_name?: string): Promise<string>;
14
+ //# sourceMappingURL=pdf-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-parser.d.ts","sourceRoot":"","sources":["../src/pdf-parser.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAStE;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,MAAM,CAAC,CAQjB"}
@@ -0,0 +1,31 @@
1
+ import fs from "node:fs/promises";
2
+ import { PDFParse } from "pdf-parse";
3
+ /**
4
+ * Конвертирует PDF файл в текст
5
+ * @param pdf_file_name Путь к PDF файлу
6
+ * @returns Текстовое содержимое
7
+ */
8
+ export async function pdfToText(pdf_file_name) {
9
+ const dataBuffer = await fs.readFile(pdf_file_name);
10
+ const parser = new PDFParse({ data: dataBuffer });
11
+ try {
12
+ const data = await parser.getText();
13
+ return data.text;
14
+ }
15
+ finally {
16
+ await parser.destroy();
17
+ }
18
+ }
19
+ /**
20
+ * Конвертирует PDF файл в текстовый файл
21
+ * @param pdf_file_name Путь к PDF файлу
22
+ * @param txt_output_file_name Путь к выходному текстовому файлу (опционально)
23
+ * @returns Путь к созданному текстовому файлу
24
+ */
25
+ export async function pdfToTxtFile(pdf_file_name, txt_output_file_name) {
26
+ const text = await pdfToText(pdf_file_name);
27
+ const outputFileName = txt_output_file_name || pdf_file_name.replace(/\.pdf$/i, ".txt");
28
+ await fs.writeFile(outputFileName, text, "utf-8");
29
+ return outputFileName;
30
+ }
31
+ //# sourceMappingURL=pdf-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-parser.js","sourceRoot":"","sources":["../src/pdf-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,aAAqB;IACnD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,aAAqB,EACrB,oBAA6B;IAE7B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;IAE5C,MAAM,cAAc,GAAG,oBAAoB,IAAI,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAExF,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAElD,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Transaction - представление одной транзакции из выписки
3
+ */
4
+ export interface Transaction {
5
+ /** Дата и время операции */
6
+ operation_date: Date;
7
+ /** Дата обработки */
8
+ processing_date: Date;
9
+ /** Код авторизации */
10
+ authorisation_code: string;
11
+ /** Описание операции */
12
+ description: string;
13
+ /** Категория */
14
+ category: string;
15
+ /** Сумма в валюте счёта */
16
+ value_account_currency: number;
17
+ /** Остаток по счёту в валюте счёта */
18
+ remainder_account_currency: number;
19
+ /** Сумма в валюте операции (опционально) */
20
+ value_operational_currency?: number;
21
+ /** Валюта операции (опционально) */
22
+ operational_currency?: string;
23
+ }
24
+ /**
25
+ * Результат работы экстрактора
26
+ */
27
+ export interface ExtractorResult {
28
+ /** Название использованного экстрактора */
29
+ extractor_name: string;
30
+ /** Список транзакций */
31
+ transactions: Transaction[];
32
+ /** Баланс периода из шапки выписки */
33
+ period_balance: number;
34
+ /** Название колонки для расчёта баланса */
35
+ balance_column: string;
36
+ /** Информация о колонках */
37
+ columns_info: Record<string, string>;
38
+ /** Ошибки при конвертации */
39
+ errors: string;
40
+ }
41
+ /**
42
+ * Опции CLI
43
+ */
44
+ export interface CLIOptions {
45
+ /** Выходной файл (без расширения) */
46
+ output?: string;
47
+ /** Тип выходного файла */
48
+ type: "json" | "csv";
49
+ /** Принудительный формат */
50
+ format?: string;
51
+ /** Обратный порядок транзакций */
52
+ reverse: boolean;
53
+ /** Проверять баланс */
54
+ balance_check: boolean;
55
+ /** Сохранять промежуточный текстовый файл */
56
+ interm: boolean;
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,cAAc,EAAE,IAAI,CAAC;IACrB,qBAAqB;IACrB,eAAe,EAAE,IAAI,CAAC;IACtB,sBAAsB;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sCAAsC;IACtC,0BAA0B,EAAE,MAAM,CAAC;IACnC,4CAA4C;IAC5C,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,oCAAoC;IACpC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,uBAAuB;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,6CAA6C;IAC7C,MAAM,EAAE,OAAO,CAAC;CACjB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Простая реализация unidecode для русских символов и распространённых символов валют
3
+ * В реальном проекте можно использовать пакет unidecode
4
+ */
5
+ export declare function unidecode(str: string): string;
6
+ //# sourceMappingURL=unidecode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unidecode.d.ts","sourceRoot":"","sources":["../src/unidecode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAuF7C"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Простая реализация unidecode для русских символов и распространённых символов валют
3
+ * В реальном проекте можно использовать пакет unidecode
4
+ */
5
+ export function unidecode(str) {
6
+ const map = {
7
+ // Русские буквы
8
+ а: "a",
9
+ б: "b",
10
+ в: "v",
11
+ г: "g",
12
+ д: "d",
13
+ е: "e",
14
+ ё: "e",
15
+ ж: "zh",
16
+ з: "z",
17
+ и: "i",
18
+ й: "y",
19
+ к: "k",
20
+ л: "l",
21
+ м: "m",
22
+ н: "n",
23
+ о: "o",
24
+ п: "p",
25
+ р: "r",
26
+ с: "s",
27
+ т: "t",
28
+ у: "u",
29
+ ф: "f",
30
+ х: "kh",
31
+ ц: "ts",
32
+ ч: "ch",
33
+ ш: "sh",
34
+ щ: "shch",
35
+ ъ: "",
36
+ ы: "y",
37
+ ь: "",
38
+ э: "e",
39
+ ю: "yu",
40
+ я: "ya",
41
+ А: "A",
42
+ Б: "B",
43
+ В: "V",
44
+ Г: "G",
45
+ Д: "D",
46
+ Е: "E",
47
+ Ё: "E",
48
+ Ж: "Zh",
49
+ З: "Z",
50
+ И: "I",
51
+ Й: "Y",
52
+ К: "K",
53
+ Л: "L",
54
+ М: "M",
55
+ Н: "N",
56
+ О: "O",
57
+ П: "P",
58
+ Р: "R",
59
+ С: "S",
60
+ Т: "T",
61
+ У: "U",
62
+ Ф: "F",
63
+ Х: "Kh",
64
+ Ц: "Ts",
65
+ Ч: "Ch",
66
+ Ш: "Sh",
67
+ Щ: "Shch",
68
+ Ъ: "",
69
+ Ы: "Y",
70
+ Ь: "",
71
+ Э: "E",
72
+ Ю: "Yu",
73
+ Я: "Ya",
74
+ // Символы валют
75
+ "€": "EUR",
76
+ $: "USD",
77
+ "₽": "RUB",
78
+ "£": "GBP",
79
+ "¥": "JPY",
80
+ "₴": "UAH",
81
+ // Специальные символы
82
+ "№": "No",
83
+ "©": "(c)",
84
+ "®": "(R)",
85
+ "™": "(TM)",
86
+ };
87
+ return str
88
+ .split("")
89
+ .map((char) => map[char] || char)
90
+ .join("");
91
+ }
92
+ //# sourceMappingURL=unidecode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unidecode.js","sourceRoot":"","sources":["../src/unidecode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,GAAG,GAA2B;QAClC,gBAAgB;QAChB,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,IAAI;QACP,CAAC,EAAE,IAAI;QACP,gBAAgB;QAChB,GAAG,EAAE,KAAK;QACV,CAAC,EAAE,KAAK;QACR,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,sBAAsB;QACtB,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,MAAM;KACZ,CAAC;IAEF,OAAO,GAAG;SACP,KAAK,CAAC,EAAE,CAAC;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;SAChC,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { Decimal } from "decimal.js";
2
+ /**
3
+ * Конвертирует строку с деньгами в Decimal
4
+ * @param money_str Строка с суммой (например, "1 189,40")
5
+ * @param process_no_sign_as_negative Если true, число без знака считается отрицательным
6
+ * @returns Decimal значение
7
+ */
8
+ export declare function getDecimalFromMoney(money_str: string, process_no_sign_as_negative?: boolean): Decimal;
9
+ /**
10
+ * Разделяет строку Сбербанка на части по табуляции
11
+ * @param line Строка с табуляциями
12
+ * @returns Массив частей без пустых элементов
13
+ */
14
+ export declare function splitSberbankLine(line: string): string[];
15
+ /**
16
+ * Преобразует Decimal в number для JSON/CSV
17
+ * @param value Значение
18
+ * @returns number или исходное значение
19
+ */
20
+ export declare function decimalToNumber(value: unknown): number | unknown;
21
+ /**
22
+ * Конвертирует все Decimal в объекте транзакции в number
23
+ * @param transaction Транзакция
24
+ * @returns Транзакция с number вместо Decimal
25
+ */
26
+ export declare function convertDecimalsInTransaction(transaction: Record<string, unknown>): Record<string, unknown>;
27
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,2BAA2B,UAAQ,GAClC,OAAO,CAmBT;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAKhE;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB"}
package/dist/utils.js ADDED
@@ -0,0 +1,65 @@
1
+ import { Decimal } from "decimal.js";
2
+ import { unidecode } from "./unidecode.js";
3
+ /**
4
+ * Конвертирует строку с деньгами в Decimal
5
+ * @param money_str Строка с суммой (например, "1 189,40")
6
+ * @param process_no_sign_as_negative Если true, число без знака считается отрицательным
7
+ * @returns Decimal значение
8
+ */
9
+ export function getDecimalFromMoney(money_str, process_no_sign_as_negative = false) {
10
+ // Транслитерация
11
+ let cleaned = unidecode(money_str);
12
+ // Удаляем пробелы
13
+ cleaned = cleaned.replace(/\s/g, "");
14
+ // Заменяем запятую на точку
15
+ cleaned = cleaned.replace(",", ".");
16
+ const has_plus = cleaned.startsWith("+");
17
+ const decimal = new Decimal(cleaned);
18
+ if (process_no_sign_as_negative && !has_plus) {
19
+ return decimal.negated();
20
+ }
21
+ return decimal;
22
+ }
23
+ /**
24
+ * Разделяет строку Сбербанка на части по табуляции
25
+ * @param line Строка с табуляциями
26
+ * @returns Массив частей без пустых элементов
27
+ */
28
+ export function splitSberbankLine(line) {
29
+ return line
30
+ .split("\t")
31
+ .map((part) => part.trim())
32
+ .filter((part) => part.length > 0);
33
+ }
34
+ /**
35
+ * Преобразует Decimal в number для JSON/CSV
36
+ * @param value Значение
37
+ * @returns number или исходное значение
38
+ */
39
+ export function decimalToNumber(value) {
40
+ if (value instanceof Decimal) {
41
+ return value.toNumber();
42
+ }
43
+ return value;
44
+ }
45
+ /**
46
+ * Конвертирует все Decimal в объекте транзакции в number
47
+ * @param transaction Транзакция
48
+ * @returns Транзакция с number вместо Decimal
49
+ */
50
+ export function convertDecimalsInTransaction(transaction) {
51
+ const result = {};
52
+ for (const [key, value] of Object.entries(transaction)) {
53
+ if (value instanceof Date) {
54
+ result[key] = value;
55
+ }
56
+ else if (value instanceof Decimal) {
57
+ result[key] = value.toNumber();
58
+ }
59
+ else {
60
+ result[key] = value;
61
+ }
62
+ }
63
+ return result;
64
+ }
65
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,2BAA2B,GAAG,KAAK;IAEnC,iBAAiB;IACjB,IAAI,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEnC,kBAAkB;IAClB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAErC,4BAA4B;IAC5B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC,IAAI,2BAA2B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,WAAoC;IAEpC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@rvboris/sberparse",
3
+ "version": "1.0.0",
4
+ "description": "Конвертация выписок Сбербанка из PDF в JSON/CSV",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./cli": "./dist/cli.js"
11
+ },
12
+ "bin": {
13
+ "sberparse": "./dist/cli.js"
14
+ },
15
+ "scripts": {
16
+ "dev": "tsx src/cli.ts",
17
+ "build": "pnpm run test:run && pnpm run lint && pnpm run typecheck && tsc",
18
+ "typecheck": "tsc --noEmit",
19
+ "test": "vitest",
20
+ "test:run": "vitest run",
21
+ "test:coverage": "vitest run --coverage",
22
+ "lint": "biome check .",
23
+ "lint:fix": "biome check . --write",
24
+ "lint:ci": "biome check .",
25
+ "prepublishOnly": "pnpm run build"
26
+ },
27
+ "keywords": [
28
+ "sberbank",
29
+ "pdf",
30
+ "parser",
31
+ "csv",
32
+ "json",
33
+ "cli"
34
+ ],
35
+ "author": "rvboris",
36
+ "license": "MIT",
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "README.md",
43
+ "LICENSE"
44
+ ],
45
+ "dependencies": {
46
+ "@logtape/logtape": "^2.0.5",
47
+ "@logtape/pretty": "^2.0.5",
48
+ "@oclif/core": "^4.10.5",
49
+ "decimal.js": "^10.6.0",
50
+ "fast-csv": "^5.0.5",
51
+ "pdf-parse": "^2.4.5"
52
+ },
53
+ "devDependencies": {
54
+ "@biomejs/biome": "^2.4.10",
55
+ "@types/node": "^25.5.2",
56
+ "@vitest/coverage-v8": "^4.1.2",
57
+ "tsx": "^4.21.0",
58
+ "typescript": "^6.0.2",
59
+ "vitest": "^4.1.2"
60
+ },
61
+ "engines": {
62
+ "node": ">=24.0.0"
63
+ },
64
+ "oclif": {
65
+ "bin": "sberparse",
66
+ "commands": {
67
+ "strategy": "single",
68
+ "target": "./dist/commands/index.js"
69
+ }
70
+ },
71
+ "packageManager": "pnpm@10.30.2"
72
+ }