@rvboris/sberparse 1.0.0 → 1.1.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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 sbertoactual contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 sbertoactual contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
5
  ## Установка
6
6
 
7
+ > Package note: requires Node.js 24+.
8
+
7
9
  ```bash
8
10
  pnpm add -g @rvboris/sberparse
9
11
  ```
@@ -26,13 +28,59 @@ pnpm add -g @rvboris/sberparse
26
28
  # Обратный порядок транзакций
27
29
  sberparse ./vypiska.pdf -r
28
30
 
29
- # Без проверки баланса
30
- sberparse ./vypiska.pdf -b
31
+ # Игнорировать результаты сверки баланса
32
+ sberparse ./vypiska.pdf --no-balance-check
31
33
 
32
34
  # Сохранить промежуточный текстовый файл
33
35
  sberparse ./vypiska.pdf --interm
34
36
  ```
35
37
 
38
+ ### CLI entrypoints
39
+
40
+ - dev/source run: `src/cli.ts`
41
+ - oclif command: `src/commands/index.ts`
42
+ - production bin: `dist/cli.js`
43
+
44
+ ## Использование в коде
45
+
46
+ Main named exports:
47
+ - `parsePdf`
48
+ - `convertPdf`
49
+ - `transactionsToCsv`
50
+ - `transactionsToJson`
51
+ - `Extractor`
52
+ - `BalanceVerificationError`
53
+ - `InputFileStructureError`
54
+ - `SberParseError`
55
+ - `UserInputError`
56
+ - types: `CLIOptions`, `ParseOptions`, `ExtractorResult`, `Transaction`
57
+
58
+ ```ts
59
+ import { parsePdf, transactionsToCsv, transactionsToJson } from "@rvboris/sberparse";
60
+
61
+ const result = await parsePdf("./vypiska.pdf", {
62
+ reverse: false,
63
+ balance_check: true,
64
+ });
65
+
66
+ const jsonText = transactionsToJson(
67
+ result.transactions,
68
+ result.extractor_name,
69
+ result.errors,
70
+ );
71
+
72
+ const csvText = transactionsToCsv(result.transactions, result.columns_info);
73
+ ```
74
+
75
+ ### CLI flags
76
+
77
+ - `-o, --output` — output file name without extension
78
+ - `-f, --format` — force extractor selection
79
+ - `-t, --type` — `json` or `csv`
80
+ - `-r, --reverse` — reverse transactions order
81
+ - `--balance-check` / `--no-balance-check` — enable/disable strict balance verification
82
+ - `--interm` — save intermediate text output
83
+
36
84
  ## Поддерживаемые форматы
37
85
 
38
86
  - SBER_DEBIT_2603 - Дебетовая карта образца марта 2026
package/dist/cli.js CHANGED
File without changes
@@ -1,4 +1,11 @@
1
- import type { CLIOptions, ExtractorResult } from "./types.js";
1
+ import type { CLIOptions, ExtractorResult, ParseOptions } from "./types.js";
2
+ /**
3
+ * Парсит PDF файл и возвращает данные без записи в файл
4
+ * @param inputFileName Путь к входному PDF файлу
5
+ * @param options Опции парсинга
6
+ * @returns Информация о результате
7
+ */
8
+ export declare function parsePdf(inputFileName: string, options?: ParseOptions): Promise<ExtractorResult>;
2
9
  /**
3
10
  * Конвертирует PDF файл в JSON/CSV
4
11
  * @param inputFileName Путь к входному PDF файлу
@@ -1 +1 @@
1
- {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,eAAe,CAAC,CAoG1B"}
1
+ {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA2F5E;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC5B,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,eAAe,CAAC,CAiD1B"}
package/dist/converter.js CHANGED
@@ -7,28 +7,14 @@ import { determineExtractorAuto, determineExtractorByName } from "./extractor-se
7
7
  import { writeTransactionsToJson } from "./json-writer.js";
8
8
  import { logger } from "./logger.js";
9
9
  import { pdfToText } from "./pdf-parser.js";
10
- /**
11
- * Конвертирует PDF файл в JSON/CSV
12
- * @param inputFileName Путь к входному PDF файлу
13
- * @param options Опции CLI
14
- * @returns Информация о результате
15
- */
16
- export async function convertPdf(inputFileName, options) {
17
- logger.info `${"*".repeat(30)}`;
18
- logger.info `Конвертируем файл ${inputFileName}`;
19
- // Проверяем расширение
20
- const ext = path.extname(inputFileName).toLowerCase();
21
- if (ext !== ".pdf") {
22
- throw new UserInputError(`Неподдерживаемое расширение файла: ${ext}`);
23
- }
24
- // Конвертируем PDF в текст
25
- const bankText = await pdfToText(inputFileName);
26
- // Сохраняем промежуточный файл, если запрошено
27
- if (options.interm) {
28
- const txtFileName = inputFileName.replace(/\.pdf$/i, ".txt");
29
- await fs.writeFile(txtFileName, bankText, "utf-8");
30
- logger.info `Сохранён промежуточный файл: ${txtFileName}`;
31
- }
10
+ function resolveParseOptions(options = {}) {
11
+ return {
12
+ format: options.format,
13
+ reverse: options.reverse ?? false,
14
+ balance_check: options.balance_check ?? false,
15
+ };
16
+ }
17
+ function parseBankText(bankText, options) {
32
18
  // Определяем экстрактор
33
19
  let extractorClass;
34
20
  if (options.format) {
@@ -72,6 +58,59 @@ export async function convertPdf(inputFileName, options) {
72
58
  if (options.reverse) {
73
59
  finalTransactions = reverseTransactions(transactions);
74
60
  }
61
+ return {
62
+ extractorClass,
63
+ extractor,
64
+ periodBalance,
65
+ columnsInfo,
66
+ error,
67
+ finalTransactions,
68
+ };
69
+ }
70
+ async function parsePdfText(inputFileName, options) {
71
+ logger.info `${"*".repeat(30)}`;
72
+ logger.info `Конвертируем файл ${inputFileName}`;
73
+ // Проверяем расширение
74
+ const ext = path.extname(inputFileName).toLowerCase();
75
+ if (ext !== ".pdf") {
76
+ throw new UserInputError(`Неподдерживаемое расширение файла: ${ext}`);
77
+ }
78
+ const bankText = await pdfToText(inputFileName);
79
+ return { bankText, ...parseBankText(bankText, options) };
80
+ }
81
+ /**
82
+ * Парсит PDF файл и возвращает данные без записи в файл
83
+ * @param inputFileName Путь к входному PDF файлу
84
+ * @param options Опции парсинга
85
+ * @returns Информация о результате
86
+ */
87
+ export async function parsePdf(inputFileName, options = {}) {
88
+ const resolvedOptions = resolveParseOptions(options);
89
+ const { extractorClass, extractor, periodBalance, columnsInfo, error, finalTransactions } = await parsePdfText(inputFileName, resolvedOptions);
90
+ return {
91
+ extractor_name: extractorClass.name,
92
+ transactions: finalTransactions,
93
+ period_balance: periodBalance.toNumber(),
94
+ balance_column: extractor.getColumnNameForBalanceCalculation(),
95
+ columns_info: columnsInfo,
96
+ errors: error,
97
+ };
98
+ }
99
+ /**
100
+ * Конвертирует PDF файл в JSON/CSV
101
+ * @param inputFileName Путь к входному PDF файлу
102
+ * @param options Опции CLI
103
+ * @returns Информация о результате
104
+ */
105
+ export async function convertPdf(inputFileName, options) {
106
+ const resolvedOptions = resolveParseOptions(options);
107
+ const { bankText, extractorClass, extractor, periodBalance, columnsInfo, error, finalTransactions, } = await parsePdfText(inputFileName, resolvedOptions);
108
+ // Сохраняем промежуточный файл, если запрошено
109
+ if (options.interm) {
110
+ const txtFileName = inputFileName.replace(/\.pdf$/i, ".txt");
111
+ await fs.writeFile(txtFileName, bankText, "utf-8");
112
+ logger.info `Сохранён промежуточный файл: ${txtFileName}`;
113
+ }
75
114
  // Определяем выходной файл
76
115
  let outputFileName;
77
116
  if (options.output) {
@@ -1 +1 @@
1
- {"version":3,"file":"converter.js","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"converter.js","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,16 @@
1
1
  import type { Transaction } from "./types.js";
2
+ interface CsvRenderOptions {
3
+ include_bom?: boolean;
4
+ trailing_newline?: boolean;
5
+ }
6
+ /**
7
+ * Конвертирует транзакции в CSV строку
8
+ * @param transactions Список транзакций
9
+ * @param columnsInfo Информация о колонках
10
+ * @param options Параметры вывода
11
+ * @returns CSV строка
12
+ */
13
+ export declare function transactionsToCsv(transactions: Transaction[], columnsInfo: Record<string, string>, options?: CsvRenderOptions): string;
2
14
  /**
3
15
  * Записывает транзакции в CSV файл
4
16
  * @param transactions Список транзакций
@@ -7,4 +19,5 @@ import type { Transaction } from "./types.js";
7
19
  * @returns Имя созданного файла
8
20
  */
9
21
  export declare function writeTransactionsToCsv(transactions: Transaction[], filename: string, columnsInfo: Record<string, string>): Promise<string>;
22
+ export {};
10
23
  //# sourceMappingURL=csv-writer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"csv-writer.d.ts","sourceRoot":"","sources":["../src/csv-writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2B9C;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,WAAW,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,MAAM,CAAC,CA4CjB"}
1
+ {"version":3,"file":"csv-writer.d.ts","sourceRoot":"","sources":["../src/csv-writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2B9C,UAAU,gBAAgB;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,WAAW,EAAE,EAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAyCR;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,WAAW,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,MAAM,CAAC,CAMjB"}
@@ -22,14 +22,14 @@ function escapeCsvValue(value) {
22
22
  return strValue;
23
23
  }
24
24
  /**
25
- * Записывает транзакции в CSV файл
25
+ * Конвертирует транзакции в CSV строку
26
26
  * @param transactions Список транзакций
27
- * @param filename Имя файла (без расширения)
28
27
  * @param columnsInfo Информация о колонках
29
- * @returns Имя созданного файла
28
+ * @param options Параметры вывода
29
+ * @returns CSV строка
30
30
  */
31
- export async function writeTransactionsToCsv(transactions, filename, columnsInfo) {
32
- const outputFilename = filename.endsWith(".csv") ? filename : `${filename}.csv`;
31
+ export function transactionsToCsv(transactions, columnsInfo, options = {}) {
32
+ const { include_bom = true, trailing_newline = true } = options;
33
33
  // Заголовки
34
34
  const headers = Object.keys(columnsInfo);
35
35
  const headerRow = headers.map((key) => columnsInfo[key]).join(";");
@@ -61,11 +61,22 @@ export async function writeTransactionsToCsv(transactions, filename, columnsInfo
61
61
  });
62
62
  dataRows.push(rowValues.join(";"));
63
63
  }
64
- // Собираем CSV
65
64
  const csvContent = [headerRow, ...dataRows].join("\n");
66
- // Добавляем BOM для Excel
67
- const bom = "\uFEFF";
68
- await fs.writeFile(outputFilename, `${bom + csvContent}\n`, "utf-8");
65
+ const bom = include_bom ? "\uFEFF" : "";
66
+ const suffix = trailing_newline ? "\n" : "";
67
+ return `${bom + csvContent}${suffix}`;
68
+ }
69
+ /**
70
+ * Записывает транзакции в CSV файл
71
+ * @param transactions Список транзакций
72
+ * @param filename Имя файла (без расширения)
73
+ * @param columnsInfo Информация о колонках
74
+ * @returns Имя созданного файла
75
+ */
76
+ export async function writeTransactionsToCsv(transactions, filename, columnsInfo) {
77
+ const outputFilename = filename.endsWith(".csv") ? filename : `${filename}.csv`;
78
+ const csvContent = transactionsToCsv(transactions, columnsInfo);
79
+ await fs.writeFile(outputFilename, csvContent, "utf-8");
69
80
  return outputFilename;
70
81
  }
71
82
  //# sourceMappingURL=csv-writer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"csv-writer.js","sourceRoot":"","sources":["../src/csv-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlC;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAAyC;IAC/D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,QAAgB,CAAC;IACrB,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,wDAAwD;IACxD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChF,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IAC7C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,YAA2B,EAC3B,QAAgB,EAChB,WAAmC;IAEnC,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,CAAC;IAEhF,YAAY;IACZ,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEnE,SAAS;IACT,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACpC,MAAM,KAAK,GAAI,WAAkD,CAAC,GAAG,CAAC,CAAC;YACvE,IAAI,cAAkD,CAAC;YAEvD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;gBAC1B,mBAAmB;gBACnB,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;oBAC7B,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE;wBAC7C,GAAG,EAAE,SAAS;wBACd,KAAK,EAAE,SAAS;wBAChB,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,SAAS;qBAClB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,cAAc,GAAG,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,KAAoC,CAAC;YACxD,CAAC;YAED,OAAO,cAAc,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,eAAe;IACf,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvD,0BAA0B;IAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC;IACrB,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,GAAG,GAAG,GAAG,UAAU,IAAI,EAAE,OAAO,CAAC,CAAC;IAErE,OAAO,cAAc,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"csv-writer.js","sourceRoot":"","sources":["../src/csv-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlC;;;;GAIG;AACH,SAAS,cAAc,CAAC,KAAyC;IAC/D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,QAAgB,CAAC;IACrB,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,wDAAwD;IACxD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChF,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IAC7C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAA2B,EAC3B,WAAmC,EACnC,UAA4B,EAAE;IAE9B,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,gBAAgB,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAEhE,YAAY;IACZ,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEnE,SAAS;IACT,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACpC,MAAM,KAAK,GAAI,WAAkD,CAAC,GAAG,CAAC,CAAC;YACvE,IAAI,cAAkD,CAAC;YAEvD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;gBAC1B,mBAAmB;gBACnB,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;oBAC7B,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE;wBAC7C,GAAG,EAAE,SAAS;wBACd,KAAK,EAAE,SAAS;wBAChB,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,SAAS;qBAClB,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,cAAc,GAAG,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,cAAc,GAAG,KAAoC,CAAC;YACxD,CAAC;YAED,OAAO,cAAc,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5C,OAAO,GAAG,GAAG,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,YAA2B,EAC3B,QAAgB,EAChB,WAAmC;IAEnC,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,CAAC;IAChF,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAExD,OAAO,cAAc,CAAC;AACxB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- export { convertPdf } from "./converter.js";
1
+ export { convertPdf, parsePdf } from "./converter.js";
2
+ export { transactionsToCsv } from "./csv-writer.js";
2
3
  export { BalanceVerificationError, InputFileStructureError, SberParseError, UserInputError, } from "./exceptions.js";
3
4
  export { Extractor } from "./extractor.js";
4
- export type { CLIOptions, ExtractorResult, Transaction } from "./types.js";
5
+ export { transactionsToJson } from "./json-writer.js";
6
+ export type { CLIOptions, ExtractorResult, ParseOptions, Transaction } from "./types.js";
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
- export { convertPdf } from "./converter.js";
1
+ export { convertPdf, parsePdf } from "./converter.js";
2
+ export { transactionsToCsv } from "./csv-writer.js";
2
3
  export { BalanceVerificationError, InputFileStructureError, SberParseError, UserInputError, } from "./exceptions.js";
3
4
  export { Extractor } from "./extractor.js";
5
+ export { transactionsToJson } from "./json-writer.js";
4
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,4 +1,18 @@
1
1
  import type { Transaction } from "./types.js";
2
+ interface JsonRenderOptions {
3
+ version?: string;
4
+ generated_at?: string;
5
+ pretty?: boolean;
6
+ }
7
+ /**
8
+ * Конвертирует транзакции в JSON строку
9
+ * @param transactions Список транзакций
10
+ * @param extractorName Имя экстрактора
11
+ * @param errors Ошибки при конвертации
12
+ * @param options Параметры вывода
13
+ * @returns JSON строка
14
+ */
15
+ export declare function transactionsToJson(transactions: Transaction[], extractorName: string, errors: string, options?: JsonRenderOptions): string;
2
16
  /**
3
17
  * Записывает транзакции в JSON файл
4
18
  * @param transactions Список транзакций
@@ -8,4 +22,5 @@ import type { Transaction } from "./types.js";
8
22
  * @returns Имя созданного файла
9
23
  */
10
24
  export declare function writeTransactionsToJson(transactions: Transaction[], filename: string, extractorName: string, errors: string): Promise<string>;
25
+ export {};
11
26
  //# sourceMappingURL=json-writer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-writer.d.ts","sourceRoot":"","sources":["../src/json-writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe9C;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,WAAW,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
1
+ {"version":3,"file":"json-writer.d.ts","sourceRoot":"","sources":["../src/json-writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe9C,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,WAAW,EAAE,EAC3B,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,iBAAsB,GAC9B,MAAM,CA4BR;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,WAAW,EAAE,EAC3B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAMjB"}
@@ -1,14 +1,14 @@
1
1
  import fs from "node:fs/promises";
2
2
  /**
3
- * Записывает транзакции в JSON файл
3
+ * Конвертирует транзакции в JSON строку
4
4
  * @param transactions Список транзакций
5
- * @param filename Имя файла (без расширения)
6
5
  * @param extractorName Имя экстрактора
7
6
  * @param errors Ошибки при конвертации
8
- * @returns Имя созданного файла
7
+ * @param options Параметры вывода
8
+ * @returns JSON строка
9
9
  */
10
- export async function writeTransactionsToJson(transactions, filename, extractorName, errors) {
11
- const outputFilename = filename.endsWith(".json") ? filename : `${filename}.json`;
10
+ export function transactionsToJson(transactions, extractorName, errors, options = {}) {
11
+ const { version = "1.0.0", generated_at = new Date().toISOString(), pretty = true } = options;
12
12
  // Конвертируем транзакции в сериализуемый формат
13
13
  const serializableTransactions = transactions.map((transaction) => {
14
14
  const result = {};
@@ -25,14 +25,27 @@ export async function writeTransactionsToJson(transactions, filename, extractorN
25
25
  });
26
26
  const output = {
27
27
  metadata: {
28
- version: "1.0.0",
28
+ version,
29
29
  extractor: extractorName,
30
- generated_at: new Date().toISOString(),
30
+ generated_at,
31
31
  errors: errors,
32
32
  },
33
33
  transactions: serializableTransactions,
34
34
  };
35
- await fs.writeFile(outputFilename, JSON.stringify(output, null, 2), "utf-8");
35
+ return JSON.stringify(output, null, pretty ? 2 : 0);
36
+ }
37
+ /**
38
+ * Записывает транзакции в JSON файл
39
+ * @param transactions Список транзакций
40
+ * @param filename Имя файла (без расширения)
41
+ * @param extractorName Имя экстрактора
42
+ * @param errors Ошибки при конвертации
43
+ * @returns Имя созданного файла
44
+ */
45
+ export async function writeTransactionsToJson(transactions, filename, extractorName, errors) {
46
+ const outputFilename = filename.endsWith(".json") ? filename : `${filename}.json`;
47
+ const jsonContent = transactionsToJson(transactions, extractorName, errors);
48
+ await fs.writeFile(outputFilename, jsonContent, "utf-8");
36
49
  return outputFilename;
37
50
  }
38
51
  //# sourceMappingURL=json-writer.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"json-writer.js","sourceRoot":"","sources":["../src/json-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAsBlC;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAA2B,EAC3B,aAAqB,EACrB,MAAc,EACd,UAA6B,EAAE;IAE/B,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE9F,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;YACP,SAAS,EAAE,aAAa;YACxB,YAAY;YACZ,MAAM,EAAE,MAAM;SACf;QACD,YAAY,EAAE,wBAAwB;KACvC,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;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;IAClF,MAAM,WAAW,GAAG,kBAAkB,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAC5E,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAEzD,OAAO,cAAc,CAAC;AACxB,CAAC"}
package/dist/types.d.ts CHANGED
@@ -55,4 +55,15 @@ export interface CLIOptions {
55
55
  /** Сохранять промежуточный текстовый файл */
56
56
  interm: boolean;
57
57
  }
58
+ /**
59
+ * Опции парсинга для использования в коде
60
+ */
61
+ export interface ParseOptions {
62
+ /** Принудительный формат */
63
+ format?: string;
64
+ /** Обратный порядок транзакций */
65
+ reverse?: boolean;
66
+ /** Проверять баланс */
67
+ balance_check?: boolean;
68
+ }
58
69
  //# sourceMappingURL=types.d.ts.map
@@ -1 +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"}
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;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uBAAuB;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB"}
package/package.json CHANGED
@@ -1,29 +1,23 @@
1
1
  {
2
2
  "name": "@rvboris/sberparse",
3
- "version": "1.0.0",
3
+ "version": "1.1.2",
4
4
  "description": "Конвертация выписок Сбербанка из PDF в JSON/CSV",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
8
  "exports": {
9
- ".": "./dist/index.js",
10
- "./cli": "./dist/cli.js"
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./cli": {
14
+ "types": "./dist/cli.d.ts",
15
+ "default": "./dist/cli.js"
16
+ }
11
17
  },
12
18
  "bin": {
13
19
  "sberparse": "./dist/cli.js"
14
20
  },
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
21
  "keywords": [
28
22
  "sberbank",
29
23
  "pdf",
@@ -32,6 +26,14 @@
32
26
  "json",
33
27
  "cli"
34
28
  ],
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/rvboris/sberparse"
32
+ },
33
+ "bugs": {
34
+ "url": "https://github.com/rvboris/sberparse/issues"
35
+ },
36
+ "homepage": "https://github.com/rvboris/sberparse#readme",
35
37
  "author": "rvboris",
36
38
  "license": "MIT",
37
39
  "publishConfig": {
@@ -68,5 +70,15 @@
68
70
  "target": "./dist/commands/index.js"
69
71
  }
70
72
  },
71
- "packageManager": "pnpm@10.30.2"
72
- }
73
+ "scripts": {
74
+ "dev": "tsx src/cli.ts",
75
+ "build": "tsc",
76
+ "typecheck": "tsc --noEmit",
77
+ "test": "vitest",
78
+ "test:run": "vitest run",
79
+ "test:coverage": "vitest run --coverage",
80
+ "lint": "biome check .",
81
+ "lint:fix": "biome check . --write",
82
+ "lint:ci": "biome check ."
83
+ }
84
+ }
@@ -1,15 +0,0 @@
1
- import { Decimal } from "decimal.js";
2
- import { Extractor } from "../extractor.js";
3
- import { Transaction } from "../types.js";
4
- /**
5
- * Экстрактор для дебетовой карты Сбербанка образца октября 2025 (SBER_DEBIT_2510)
6
- */
7
- export declare class SBER_DEBIT_2510 extends Extractor {
8
- checkSpecificSignatures(): void;
9
- getPeriodBalance(): Decimal;
10
- splitTextOnEntries(): string[];
11
- decomposeEntryToDict(entry: string): Transaction;
12
- getColumnNameForBalanceCalculation(): string;
13
- getColumnsInfo(): Record<string, string>;
14
- }
15
- //# sourceMappingURL=sber-debit-2510.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sber-debit-2510.d.ts","sourceRoot":"","sources":["../../src/extractors/sber-debit-2510.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,uBAAuB,IAAI,IAAI;IAsB/B,gBAAgB,IAAI,OAAO;IAgB3B,kBAAkB,IAAI,MAAM,EAAE;IA+B9B,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAuFhD,kCAAkC,IAAI,MAAM;IAI5C,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAazC"}
@@ -1,157 +0,0 @@
1
- import { InputFileStructureError, SberParseError } from "../exceptions.js";
2
- import { Extractor } from "../extractor.js";
3
- import { getDecimalFromMoney, splitSberbankLine } from "../utils.js";
4
- /**
5
- * Экстрактор для дебетовой карты Сбербанка образца октября 2025 (SBER_DEBIT_2510)
6
- */
7
- export class SBER_DEBIT_2510 extends Extractor {
8
- checkSpecificSignatures() {
9
- const testSberbank = /сбербанк/i.test(this.bank_text);
10
- const testVipiska = /Выписка по счёту дебетовой карты/i.test(this.bank_text);
11
- const testDataForm = /Дата формирования/i.test(this.bank_text);
12
- const testDergunova = /Дергунова К\. А\./i.test(this.bank_text);
13
- const testPodlinnost = /Для проверки подлинности документа/i.test(this.bank_text);
14
- const testOstatok = /ОСТАТОК ПО СЧЁТУ/i.test(this.bank_text);
15
- if (
16
- !(testSberbank && testVipiska && testPodlinnost && testDataForm) ||
17
- testOstatok ||
18
- testDergunova
19
- ) {
20
- throw new InputFileStructureError("Не найдены паттерны, соответствующие выписке");
21
- }
22
- }
23
- getPeriodBalance() {
24
- const pattern = /ОСТАТОК НА.*?ВСЕГО ПОПОЛНЕНИЙ.*?ВСЕГО СПИСАНИЙ.*?ОСТАТОК НА.*?\n(.*?)\n/;
25
- const match = this.bank_text.match(pattern);
26
- if (!match) {
27
- throw new InputFileStructureError("Не найдена структура с остатками и пополнениями");
28
- }
29
- const lineParts = match[1].split("\t");
30
- const summaPopolneniy = getDecimalFromMoney(lineParts[1]);
31
- const summaSpisaniy = getDecimalFromMoney(lineParts[2]);
32
- return summaPopolneniy.minus(summaSpisaniy);
33
- }
34
- splitTextOnEntries() {
35
- // Удаляем разделы между страницами
36
- const cleanedText = this.bank_text.replace(
37
- /Продолжение на следующей странице[\s\S]*?операции²\n/g,
38
- "",
39
- );
40
- // Ищем записи транзакций
41
- const pattern = new RegExp(
42
- String.raw`\d{2}\.\d{2}\.\d{4}\s\d{2}:\d{2}\s` + // Дата и время
43
- String.raw`(?=\d{3,8}|-|0)` + // Код авторизации
44
- String.raw`.*?\n` + // Всё до конца строки
45
- String.raw`\d{2}\.\d{2}\.\d{4}\s` + // Дата обработки
46
- String.raw`[\s\S]*?` + // Всё включая новые строки (non-greedy)
47
- String.raw`(?=\d{2}\.\d{2}\.\d{4}\s\d{2}:\d{2}|Дата\sформирования)`, // До следующей транзакции или конца
48
- "g",
49
- );
50
- const entries = [];
51
- let match;
52
- while ((match = pattern.exec(cleanedText)) !== null) {
53
- entries.push(match[0]);
54
- }
55
- if (entries.length === 0) {
56
- throw new InputFileStructureError(
57
- "Не обнаружена ожидаемая структура данных: не найдено ни одной транзакции",
58
- );
59
- }
60
- return entries;
61
- }
62
- decomposeEntryToDict(entry) {
63
- const lines = entry.split("\n").filter((line) => line.trim().length > 0);
64
- if (lines.length < 2 || lines.length > 4) {
65
- throw new InputFileStructureError(`entry is expected to have from 2 to 4 lines\n${entry}`);
66
- }
67
- // Первая строка
68
- const firstLineParts = splitSberbankLine(lines[0]);
69
- const operationDate = new Date(
70
- parseInt(firstLineParts[0].split(".")[2], 10),
71
- parseInt(firstLineParts[0].split(".")[1], 10) - 1,
72
- parseInt(firstLineParts[0].split(".")[0], 10),
73
- parseInt(firstLineParts[1].split(":")[0], 10),
74
- parseInt(firstLineParts[1].split(":")[1], 10),
75
- );
76
- const valueAccountCurrency = getDecimalFromMoney(firstLineParts[4], true);
77
- const result = {
78
- operation_date: operationDate,
79
- processing_date: new Date(), // Временное значение
80
- authorisation_code: firstLineParts[2],
81
- description: "",
82
- category: firstLineParts[3],
83
- value_account_currency: valueAccountCurrency.toNumber(),
84
- remainder_account_currency: 0,
85
- };
86
- // Остаток, если есть
87
- if (firstLineParts.length > 5) {
88
- result.remainder_account_currency = getDecimalFromMoney(firstLineParts[5], false).toNumber();
89
- }
90
- // Вторая строка
91
- const secondLineParts = splitSberbankLine(lines[1]);
92
- if (secondLineParts.length < 2 || secondLineParts.length > 4) {
93
- throw new SberParseError(`Line is expected to have 2 or 4 parts: ${lines[1]}`);
94
- }
95
- result.processing_date = new Date(
96
- parseInt(secondLineParts[0].split(".")[2], 10),
97
- parseInt(secondLineParts[0].split(".")[1], 10) - 1,
98
- parseInt(secondLineParts[0].split(".")[0], 10),
99
- );
100
- // Проверяем последнюю часть на деньги или валюту
101
- const lastPartAsMoney = secondLineParts[secondLineParts.length - 1].match(
102
- /(\d[\d\s]*?,\d{2})\s(\S*)$/,
103
- );
104
- const lastPartAsCurrency = secondLineParts[secondLineParts.length - 1].match(/(\S)$/);
105
- if (secondLineParts.length === 2) {
106
- if (lastPartAsMoney) {
107
- result.value_operational_currency = getDecimalFromMoney(
108
- lastPartAsMoney[1],
109
- true,
110
- ).toNumber();
111
- result.operational_currency = lastPartAsMoney[2];
112
- } else {
113
- result.description = secondLineParts[1];
114
- }
115
- } else if (secondLineParts.length === 3) {
116
- result.description = secondLineParts[1];
117
- if (lastPartAsMoney) {
118
- result.value_operational_currency = getDecimalFromMoney(
119
- lastPartAsMoney[1],
120
- true,
121
- ).toNumber();
122
- result.operational_currency = lastPartAsMoney[2];
123
- } else if (lastPartAsCurrency) {
124
- result.operational_currency = lastPartAsCurrency[1];
125
- }
126
- }
127
- // Третья строка, если есть
128
- if (lines.length >= 3) {
129
- const thirdLineParts = splitSberbankLine(lines[2]);
130
- result.description = `${result.description || ""} ${thirdLineParts[0]}`;
131
- }
132
- // Четвёртая строка, если есть
133
- if (lines.length >= 4) {
134
- const fourthLineParts = splitSberbankLine(lines[3]);
135
- result.description = `${result.description || ""} ${fourthLineParts[0]}`;
136
- }
137
- result.description = result.description.trim();
138
- return result;
139
- }
140
- getColumnNameForBalanceCalculation() {
141
- return "value_account_currency";
142
- }
143
- getColumnsInfo() {
144
- return {
145
- operation_date: "Дата операции",
146
- processing_date: "Дата обработки",
147
- authorisation_code: "Код авторизации",
148
- description: "Описание операции",
149
- category: "Категория",
150
- value_account_currency: "Сумма в валюте счёта",
151
- value_operational_currency: "Сумма в валюте операции",
152
- operational_currency: "Валюта операции",
153
- remainder_account_currency: "Остаток средств в валюте счёта",
154
- };
155
- }
156
- }
157
- //# sourceMappingURL=sber-debit-2510.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sber-debit-2510.js","sourceRoot":"","sources":["../../src/extractors/sber-debit-2510.ts"],"names":[],"mappings":"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"}