@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.
- package/LICENSE +21 -0
- package/README.md +42 -0
- package/dist/balance-checker.d.ts +17 -0
- package/dist/balance-checker.d.ts.map +1 -0
- package/dist/balance-checker.js +34 -0
- package/dist/balance-checker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +31 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/index.d.ts +17 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +70 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/converter.d.ts +9 -0
- package/dist/converter.d.ts.map +1 -0
- package/dist/converter.js +101 -0
- package/dist/converter.js.map +1 -0
- package/dist/csv-writer.d.ts +10 -0
- package/dist/csv-writer.d.ts.map +1 -0
- package/dist/csv-writer.js +71 -0
- package/dist/csv-writer.js.map +1 -0
- package/dist/exceptions.d.ts +31 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +46 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/extractor-selector.d.ts +16 -0
- package/dist/extractor-selector.d.ts.map +1 -0
- package/dist/extractor-selector.js +48 -0
- package/dist/extractor-selector.js.map +1 -0
- package/dist/extractor.d.ts +58 -0
- package/dist/extractor.d.ts.map +1 -0
- package/dist/extractor.js +65 -0
- package/dist/extractor.js.map +1 -0
- package/dist/extractors/index.d.ts +10 -0
- package/dist/extractors/index.d.ts.map +1 -0
- package/dist/extractors/index.js +14 -0
- package/dist/extractors/index.js.map +1 -0
- package/dist/extractors/sber-debit-2510.d.ts +15 -0
- package/dist/extractors/sber-debit-2510.d.ts.map +1 -0
- package/dist/extractors/sber-debit-2510.js +157 -0
- package/dist/extractors/sber-debit-2510.js.map +1 -0
- package/dist/extractors/sber-debit-2603.d.ts +16 -0
- package/dist/extractors/sber-debit-2603.d.ts.map +1 -0
- package/dist/extractors/sber-debit-2603.js +161 -0
- package/dist/extractors/sber-debit-2603.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/json-writer.d.ts +11 -0
- package/dist/json-writer.d.ts.map +1 -0
- package/dist/json-writer.js +38 -0
- package/dist/json-writer.js.map +1 -0
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +21 -0
- package/dist/logger.js.map +1 -0
- package/dist/pdf-parser.d.ts +14 -0
- package/dist/pdf-parser.d.ts.map +1 -0
- package/dist/pdf-parser.js +31 -0
- package/dist/pdf-parser.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/unidecode.d.ts +6 -0
- package/dist/unidecode.d.ts.map +1 -0
- package/dist/unidecode.js +92 -0
- package/dist/unidecode.js.map +1 -0
- package/dist/utils.d.ts +27 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +65 -0
- package/dist/utils.js.map +1 -0
- 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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -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
|
+
}
|