@rvboris/sberparse 1.0.0 → 1.1.1
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 +21 -21
- package/README.md +19 -0
- package/dist/cli.js +0 -0
- package/dist/converter.d.ts +8 -1
- package/dist/converter.d.ts.map +1 -1
- package/dist/converter.js +61 -22
- package/dist/converter.js.map +1 -1
- package/dist/csv-writer.d.ts +13 -0
- package/dist/csv-writer.d.ts.map +1 -1
- package/dist/csv-writer.js +20 -9
- package/dist/csv-writer.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/json-writer.d.ts +15 -0
- package/dist/json-writer.d.ts.map +1 -1
- package/dist/json-writer.js +21 -8
- package/dist/json-writer.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +21 -15
- package/dist/extractors/sber-debit-2510.d.ts +0 -15
- package/dist/extractors/sber-debit-2510.d.ts.map +0 -1
- package/dist/extractors/sber-debit-2510.js +0 -157
- package/dist/extractors/sber-debit-2510.js.map +0 -1
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
|
@@ -33,6 +33,25 @@ pnpm add -g @rvboris/sberparse
|
|
|
33
33
|
sberparse ./vypiska.pdf --interm
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
+
## Использование в коде
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import { parsePdf, transactionsToCsv, transactionsToJson } from "@rvboris/sberparse";
|
|
40
|
+
|
|
41
|
+
const result = await parsePdf("./vypiska.pdf", {
|
|
42
|
+
reverse: false,
|
|
43
|
+
balance_check: true,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const jsonText = transactionsToJson(
|
|
47
|
+
result.transactions,
|
|
48
|
+
result.extractor_name,
|
|
49
|
+
result.errors,
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
const csvText = transactionsToCsv(result.transactions, result.columns_info);
|
|
53
|
+
```
|
|
54
|
+
|
|
36
55
|
## Поддерживаемые форматы
|
|
37
56
|
|
|
38
57
|
- SBER_DEBIT_2603 - Дебетовая карта образца марта 2026
|
package/dist/cli.js
CHANGED
|
File without changes
|
package/dist/converter.d.ts
CHANGED
|
@@ -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 файлу
|
package/dist/converter.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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) {
|
package/dist/converter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converter.js","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"converter.js","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"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"}
|
package/dist/csv-writer.d.ts
CHANGED
|
@@ -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
|
package/dist/csv-writer.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/csv-writer.js
CHANGED
|
@@ -22,14 +22,14 @@ function escapeCsvValue(value) {
|
|
|
22
22
|
return strValue;
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
25
|
+
* Конвертирует транзакции в CSV строку
|
|
26
26
|
* @param transactions Список транзакций
|
|
27
|
-
* @param filename Имя файла (без расширения)
|
|
28
27
|
* @param columnsInfo Информация о колонках
|
|
29
|
-
* @
|
|
28
|
+
* @param options Параметры вывода
|
|
29
|
+
* @returns CSV строка
|
|
30
30
|
*/
|
|
31
|
-
export
|
|
32
|
-
const
|
|
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
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
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
|
package/dist/csv-writer.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"csv-writer.js","sourceRoot":"","sources":["../src/csv-writer.ts"],"names":[],"mappings":"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"}
|
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
|
|
5
|
+
export { transactionsToJson } from "./json-writer.js";
|
|
6
|
+
export type { CLIOptions, ExtractorResult, ParseOptions, Transaction } from "./types.js";
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,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;
|
|
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"}
|
package/dist/json-writer.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/json-writer.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Конвертирует транзакции в JSON строку
|
|
4
4
|
* @param transactions Список транзакций
|
|
5
|
-
* @param filename Имя файла (без расширения)
|
|
6
5
|
* @param extractorName Имя экстрактора
|
|
7
6
|
* @param errors Ошибки при конвертации
|
|
8
|
-
* @
|
|
7
|
+
* @param options Параметры вывода
|
|
8
|
+
* @returns JSON строка
|
|
9
9
|
*/
|
|
10
|
-
export
|
|
11
|
-
const
|
|
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
|
|
28
|
+
version,
|
|
29
29
|
extractor: extractorName,
|
|
30
|
-
generated_at
|
|
30
|
+
generated_at,
|
|
31
31
|
errors: errors,
|
|
32
32
|
},
|
|
33
33
|
transactions: serializableTransactions,
|
|
34
34
|
};
|
|
35
|
-
|
|
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
|
package/dist/json-writer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-writer.js","sourceRoot":"","sources":["../src/json-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,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
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rvboris/sberparse",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Конвертация выписок Сбербанка из PDF в JSON/CSV",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -12,18 +12,6 @@
|
|
|
12
12
|
"bin": {
|
|
13
13
|
"sberparse": "./dist/cli.js"
|
|
14
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
15
|
"keywords": [
|
|
28
16
|
"sberbank",
|
|
29
17
|
"pdf",
|
|
@@ -32,6 +20,14 @@
|
|
|
32
20
|
"json",
|
|
33
21
|
"cli"
|
|
34
22
|
],
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/rvboris/sberparse"
|
|
26
|
+
},
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/rvboris/sberparse/issues"
|
|
29
|
+
},
|
|
30
|
+
"homepage": "https://github.com/rvboris/sberparse#readme",
|
|
35
31
|
"author": "rvboris",
|
|
36
32
|
"license": "MIT",
|
|
37
33
|
"publishConfig": {
|
|
@@ -68,5 +64,15 @@
|
|
|
68
64
|
"target": "./dist/commands/index.js"
|
|
69
65
|
}
|
|
70
66
|
},
|
|
71
|
-
"
|
|
72
|
-
|
|
67
|
+
"scripts": {
|
|
68
|
+
"dev": "tsx src/cli.ts",
|
|
69
|
+
"build": "pnpm run test:run && pnpm run lint && pnpm run typecheck && tsc",
|
|
70
|
+
"typecheck": "tsc --noEmit",
|
|
71
|
+
"test": "vitest",
|
|
72
|
+
"test:run": "vitest run",
|
|
73
|
+
"test:coverage": "vitest run --coverage",
|
|
74
|
+
"lint": "biome check .",
|
|
75
|
+
"lint:fix": "biome check . --write",
|
|
76
|
+
"lint:ci": "biome check ."
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -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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"}
|