vv-iiko-pp-parser 1.0.6
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/CHANGELOG.md +151 -0
- package/README.md +582 -0
- package/dist/clients/clients.fetcher.d.ts +102 -0
- package/dist/clients/clients.fetcher.d.ts.map +1 -0
- package/dist/clients/clients.fetcher.js +196 -0
- package/dist/clients/clients.fetcher.js.map +1 -0
- package/dist/clients/clients.parser.d.ts +144 -0
- package/dist/clients/clients.parser.d.ts.map +1 -0
- package/dist/clients/clients.parser.js +473 -0
- package/dist/clients/clients.parser.js.map +1 -0
- package/dist/clients/clients.service.d.ts +90 -0
- package/dist/clients/clients.service.d.ts.map +1 -0
- package/dist/clients/clients.service.js +277 -0
- package/dist/clients/clients.service.js.map +1 -0
- package/dist/clients/clients.types.d.ts +127 -0
- package/dist/clients/clients.types.d.ts.map +1 -0
- package/dist/clients/clients.types.js +6 -0
- package/dist/clients/clients.types.js.map +1 -0
- package/dist/clients/index.d.ts +5 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +25 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/core/auth/iiko-auth.service.d.ts +52 -0
- package/dist/core/auth/iiko-auth.service.d.ts.map +1 -0
- package/dist/core/auth/iiko-auth.service.js +302 -0
- package/dist/core/auth/iiko-auth.service.js.map +1 -0
- package/dist/core/http/iiko-http.client.d.ts +13 -0
- package/dist/core/http/iiko-http.client.d.ts.map +1 -0
- package/dist/core/http/iiko-http.client.js +55 -0
- package/dist/core/http/iiko-http.client.js.map +1 -0
- package/dist/core/iiko-parser.config.d.ts +28 -0
- package/dist/core/iiko-parser.config.d.ts.map +1 -0
- package/dist/core/iiko-parser.config.js +76 -0
- package/dist/core/iiko-parser.config.js.map +1 -0
- package/dist/core/parser/iiko-parser.service.d.ts +15 -0
- package/dist/core/parser/iiko-parser.service.d.ts.map +1 -0
- package/dist/core/parser/iiko-parser.service.js +156 -0
- package/dist/core/parser/iiko-parser.service.js.map +1 -0
- package/dist/core/session/iiko-session.service.d.ts +68 -0
- package/dist/core/session/iiko-session.service.d.ts.map +1 -0
- package/dist/core/session/iiko-session.service.js +209 -0
- package/dist/core/session/iiko-session.service.js.map +1 -0
- package/dist/iiko-parser.d.ts +149 -0
- package/dist/iiko-parser.d.ts.map +1 -0
- package/dist/iiko-parser.js +209 -0
- package/dist/iiko-parser.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/company-profile.interface.d.ts +12 -0
- package/dist/interfaces/company-profile.interface.d.ts.map +1 -0
- package/dist/interfaces/company-profile.interface.js +3 -0
- package/dist/interfaces/company-profile.interface.js.map +1 -0
- package/dist/invoices/index.d.ts +6 -0
- package/dist/invoices/index.d.ts.map +1 -0
- package/dist/invoices/index.js +22 -0
- package/dist/invoices/index.js.map +1 -0
- package/dist/invoices/invoices.fetcher.d.ts +49 -0
- package/dist/invoices/invoices.fetcher.d.ts.map +1 -0
- package/dist/invoices/invoices.fetcher.js +141 -0
- package/dist/invoices/invoices.fetcher.js.map +1 -0
- package/dist/invoices/invoices.filters.d.ts +40 -0
- package/dist/invoices/invoices.filters.d.ts.map +1 -0
- package/dist/invoices/invoices.filters.js +81 -0
- package/dist/invoices/invoices.filters.js.map +1 -0
- package/dist/invoices/invoices.parser.d.ts +101 -0
- package/dist/invoices/invoices.parser.d.ts.map +1 -0
- package/dist/invoices/invoices.parser.js +540 -0
- package/dist/invoices/invoices.parser.js.map +1 -0
- package/dist/invoices/invoices.service.d.ts +82 -0
- package/dist/invoices/invoices.service.d.ts.map +1 -0
- package/dist/invoices/invoices.service.js +361 -0
- package/dist/invoices/invoices.service.js.map +1 -0
- package/dist/invoices/invoices.storage.service.d.ts +30 -0
- package/dist/invoices/invoices.storage.service.d.ts.map +1 -0
- package/dist/invoices/invoices.storage.service.js +135 -0
- package/dist/invoices/invoices.storage.service.js.map +1 -0
- package/dist/invoices/invoices.types.d.ts +94 -0
- package/dist/invoices/invoices.types.d.ts.map +1 -0
- package/dist/invoices/invoices.types.js +3 -0
- package/dist/invoices/invoices.types.js.map +1 -0
- package/dist/types.d.ts +138 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.IikoParserService = void 0;
|
|
37
|
+
const cheerio = __importStar(require("cheerio"));
|
|
38
|
+
class IikoParserService {
|
|
39
|
+
constructor(sessionService) {
|
|
40
|
+
this.sessionService = sessionService;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Парсит профиль компании из /en/cabinet/profile.html
|
|
44
|
+
*/
|
|
45
|
+
async parseCompanyProfile() {
|
|
46
|
+
try {
|
|
47
|
+
console.log('📄 Загрузка профиля компании...');
|
|
48
|
+
// Получаем авторизованный клиент (сессия уже инициализирована)
|
|
49
|
+
const client = await this.sessionService.getAuthorizedClient();
|
|
50
|
+
// Запрашиваем страницу профиля
|
|
51
|
+
const response = await client.get('/en/cabinet/profile.html');
|
|
52
|
+
if (response.status !== 200) {
|
|
53
|
+
throw new Error(`Неожиданный статус: ${response.status}`);
|
|
54
|
+
}
|
|
55
|
+
// Парсим HTML
|
|
56
|
+
const $ = cheerio.load(response.data);
|
|
57
|
+
// 1. Company Name - извлекаем из h1, текст внутри « »
|
|
58
|
+
let companyName = '';
|
|
59
|
+
const h1Text = $('h1').first().text();
|
|
60
|
+
const companyNameMatch = h1Text.match(/«([^»]+)»/);
|
|
61
|
+
if (companyNameMatch) {
|
|
62
|
+
companyName = companyNameMatch[1].trim();
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// Fallback: просто берём весь текст h1 и чистим
|
|
66
|
+
companyName = h1Text.replace('Company Profile', '').trim();
|
|
67
|
+
}
|
|
68
|
+
// 2. Phone Number - первая ссылка tel:
|
|
69
|
+
let phone = '';
|
|
70
|
+
const phoneLink = $('a[href^="tel:"]').first();
|
|
71
|
+
if (phoneLink.length) {
|
|
72
|
+
phone = phoneLink.attr('href')?.replace('tel:', '').trim() || '';
|
|
73
|
+
// Если нужно отформатировать, используем текст ссылки
|
|
74
|
+
if (phoneLink.text().trim()) {
|
|
75
|
+
phone = phoneLink.text().trim();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// 3. Company Email - первый mailto (email компании)
|
|
79
|
+
let email = '';
|
|
80
|
+
const emailLink = $('a[href^="mailto:"]').first();
|
|
81
|
+
if (emailLink.length) {
|
|
82
|
+
email = emailLink.attr('href')?.replace('mailto:', '').trim() || '';
|
|
83
|
+
}
|
|
84
|
+
// 4. Partner Status - находим через заголовок карточки
|
|
85
|
+
let partnerStatus = '';
|
|
86
|
+
const statusCard = $('.card-header:contains("Partner status")')
|
|
87
|
+
.next('.card-body')
|
|
88
|
+
.find('.fw-bold');
|
|
89
|
+
if (statusCard.length) {
|
|
90
|
+
partnerStatus = statusCard.text().trim();
|
|
91
|
+
}
|
|
92
|
+
// 5. Master Partner Company - ищем иконку fa-people-roof
|
|
93
|
+
let masterCompany = '';
|
|
94
|
+
const masterCompanyElement = $('.fa-people-roof')
|
|
95
|
+
.closest('li')
|
|
96
|
+
.find('.fw-bold');
|
|
97
|
+
if (masterCompanyElement.length) {
|
|
98
|
+
masterCompany = masterCompanyElement.text().trim();
|
|
99
|
+
}
|
|
100
|
+
// 6. Manager Name - в футере карточки
|
|
101
|
+
let managerName = '';
|
|
102
|
+
const managerElement = $('.card-footer .fw-bold').first();
|
|
103
|
+
if (managerElement.length) {
|
|
104
|
+
managerName = managerElement.text().trim();
|
|
105
|
+
}
|
|
106
|
+
// 7. Manager Email - в футере карточки, mailto
|
|
107
|
+
let managerEmail = '';
|
|
108
|
+
const managerEmailLink = $('.card-footer a[href^="mailto:"]').first();
|
|
109
|
+
if (managerEmailLink.length) {
|
|
110
|
+
managerEmail =
|
|
111
|
+
managerEmailLink.attr('href')?.replace('mailto:', '').trim() || '';
|
|
112
|
+
}
|
|
113
|
+
const profile = {
|
|
114
|
+
companyName,
|
|
115
|
+
phone,
|
|
116
|
+
email,
|
|
117
|
+
partnerStatus,
|
|
118
|
+
masterPartner: {
|
|
119
|
+
company: masterCompany,
|
|
120
|
+
manager: managerName,
|
|
121
|
+
email: managerEmail,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
console.log('✅ Профиль компании успешно распарсен');
|
|
125
|
+
return profile;
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error('❌ Ошибка при парсинге профиля компании:', error.message);
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Выводит красивые логи профиля компании
|
|
134
|
+
*/
|
|
135
|
+
logCompanyProfile(profile) {
|
|
136
|
+
const output = `
|
|
137
|
+
==== Authenticated ====
|
|
138
|
+
|
|
139
|
+
--- Company ---
|
|
140
|
+
Company name: ${profile.companyName}
|
|
141
|
+
Phone number: ${profile.phone}
|
|
142
|
+
Email: ${profile.email}
|
|
143
|
+
Status: ${profile.partnerStatus}
|
|
144
|
+
|
|
145
|
+
--- Master Partner ---
|
|
146
|
+
Company: ${profile.masterPartner.company}
|
|
147
|
+
Manager: ${profile.masterPartner.manager}
|
|
148
|
+
Email: ${profile.masterPartner.email}
|
|
149
|
+
|
|
150
|
+
==== Parser is on LIVE ====
|
|
151
|
+
`;
|
|
152
|
+
console.log(output);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.IikoParserService = IikoParserService;
|
|
156
|
+
//# sourceMappingURL=iiko-parser.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iiko-parser.service.js","sourceRoot":"","sources":["../../../src/core/parser/iiko-parser.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
import { IikoAuthService } from '../auth/iiko-auth.service';
|
|
3
|
+
import { IikoHttpClient } from '../http/iiko-http.client';
|
|
4
|
+
import { ParserProgressEvent } from '../../types';
|
|
5
|
+
/**
|
|
6
|
+
* Сервис управления сессией пользователя в iiko Partner Portal.
|
|
7
|
+
*
|
|
8
|
+
* Отвечает за жизненный цикл сессии:
|
|
9
|
+
* - Проверку существующих cookies
|
|
10
|
+
* - Валидацию сессии
|
|
11
|
+
* - Повторную авторизацию при истечении сессии
|
|
12
|
+
*
|
|
13
|
+
* Инициализация выполняется ОДИН РАЗ через ensureSession().
|
|
14
|
+
* Все последующие запросы используют уже авторизованный HTTP клиент.
|
|
15
|
+
*/
|
|
16
|
+
export declare class IikoSessionService {
|
|
17
|
+
private readonly authService;
|
|
18
|
+
private readonly httpClient;
|
|
19
|
+
private readonly report?;
|
|
20
|
+
private isAuthenticating;
|
|
21
|
+
private initialized;
|
|
22
|
+
constructor(authService: IikoAuthService, httpClient: IikoHttpClient, report?: ((event: ParserProgressEvent) => void) | undefined);
|
|
23
|
+
/**
|
|
24
|
+
* Инициализирует или проверяет сессию пользователя.
|
|
25
|
+
*
|
|
26
|
+
* Вызывается ОДИН РАЗ в начале работы с API.
|
|
27
|
+
* Безопасно вызывать многократно — повторные вызовы игнорируются.
|
|
28
|
+
*
|
|
29
|
+
* Порядок действий:
|
|
30
|
+
* 1. Проверка наличия файла с cookies
|
|
31
|
+
* 2. Если cookies есть — загрузка и валидация
|
|
32
|
+
* 3. Если cookies валидные — использование их
|
|
33
|
+
* 4. Если cookies невалидные или отсутствуют — выполнение авторизации
|
|
34
|
+
*
|
|
35
|
+
* @returns Promise, который резолвится после успешной инициализации
|
|
36
|
+
*/
|
|
37
|
+
ensureSession(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Возвращает авторизованный HTTP клиент для выполнения запросов.
|
|
40
|
+
*
|
|
41
|
+
* Предполагается, что ensureSession() уже была вызвана.
|
|
42
|
+
* НЕ выполняет повторную проверку валидности сессии.
|
|
43
|
+
*
|
|
44
|
+
* @returns AxiosInstance с установленным CookieJar
|
|
45
|
+
* @throws Error если сессия не была инициализирована
|
|
46
|
+
*/
|
|
47
|
+
getAuthorizedClient(): Promise<AxiosInstance>;
|
|
48
|
+
/**
|
|
49
|
+
* Проверяет валидность текущей сессии.
|
|
50
|
+
*
|
|
51
|
+
* Выполняет GET запрос на страницу профиля.
|
|
52
|
+
* Если ответ содержит индикатор авторизации — сессия валидна.
|
|
53
|
+
*
|
|
54
|
+
* Не выбрасывает исключения при ошибках — возвращает false.
|
|
55
|
+
*
|
|
56
|
+
* @returns true если сессия валидна, false в противном случае
|
|
57
|
+
*/
|
|
58
|
+
private validateSession;
|
|
59
|
+
/**
|
|
60
|
+
* Выполняет повторную авторизацию
|
|
61
|
+
*/
|
|
62
|
+
private reAuthenticate;
|
|
63
|
+
/**
|
|
64
|
+
* Ожидает завершения текущей авторизации
|
|
65
|
+
*/
|
|
66
|
+
private waitForAuthentication;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=iiko-session.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iiko-session.service.d.ts","sourceRoot":"","sources":["../../../src/core/session/iiko-session.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;;GAUG;AACH,qBAAa,kBAAkB;IAK3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAN1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;gBAGT,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,cAAc,EAC1B,MAAM,CAAC,GAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,aAAA;IAGhE;;;;;;;;;;;;;OAaG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCpC;;;;;;;;OAQG;IACG,mBAAmB,IAAI,OAAO,CAAC,aAAa,CAAC;IASnD;;;;;;;;;OASG;YACW,eAAe;IAqF7B;;OAEG;YACW,cAAc;IAkB5B;;OAEG;YACW,qBAAqB;CAcpC"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IikoSessionService = void 0;
|
|
4
|
+
const iiko_parser_config_1 = require("../iiko-parser.config");
|
|
5
|
+
/**
|
|
6
|
+
* Сервис управления сессией пользователя в iiko Partner Portal.
|
|
7
|
+
*
|
|
8
|
+
* Отвечает за жизненный цикл сессии:
|
|
9
|
+
* - Проверку существующих cookies
|
|
10
|
+
* - Валидацию сессии
|
|
11
|
+
* - Повторную авторизацию при истечении сессии
|
|
12
|
+
*
|
|
13
|
+
* Инициализация выполняется ОДИН РАЗ через ensureSession().
|
|
14
|
+
* Все последующие запросы используют уже авторизованный HTTP клиент.
|
|
15
|
+
*/
|
|
16
|
+
class IikoSessionService {
|
|
17
|
+
constructor(authService, httpClient, report) {
|
|
18
|
+
this.authService = authService;
|
|
19
|
+
this.httpClient = httpClient;
|
|
20
|
+
this.report = report;
|
|
21
|
+
this.isAuthenticating = false;
|
|
22
|
+
this.initialized = false;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Инициализирует или проверяет сессию пользователя.
|
|
26
|
+
*
|
|
27
|
+
* Вызывается ОДИН РАЗ в начале работы с API.
|
|
28
|
+
* Безопасно вызывать многократно — повторные вызовы игнорируются.
|
|
29
|
+
*
|
|
30
|
+
* Порядок действий:
|
|
31
|
+
* 1. Проверка наличия файла с cookies
|
|
32
|
+
* 2. Если cookies есть — загрузка и валидация
|
|
33
|
+
* 3. Если cookies валидные — использование их
|
|
34
|
+
* 4. Если cookies невалидные или отсутствуют — выполнение авторизации
|
|
35
|
+
*
|
|
36
|
+
* @returns Promise, который резолвится после успешной инициализации
|
|
37
|
+
*/
|
|
38
|
+
async ensureSession() {
|
|
39
|
+
if (this.initialized) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.report?.({ stage: 'session', message: 'Initializing session...' });
|
|
43
|
+
// Проверяем наличие файла с cookies
|
|
44
|
+
const cookiesExist = await this.authService.cookiesFileExists();
|
|
45
|
+
if (cookiesExist) {
|
|
46
|
+
// Загружаем cookies
|
|
47
|
+
const cookieJar = await this.authService.loadCookies();
|
|
48
|
+
if (cookieJar) {
|
|
49
|
+
this.httpClient.setCookieJar(cookieJar);
|
|
50
|
+
console.log('✅ CookieJar загружен из файла и установлен');
|
|
51
|
+
// Debug: показываем cookies
|
|
52
|
+
await this.httpClient.debugCookies();
|
|
53
|
+
}
|
|
54
|
+
// Проверяем валидность сессии
|
|
55
|
+
this.report?.({ stage: 'session', message: 'Validating existing session...' });
|
|
56
|
+
const isValid = await this.validateSession();
|
|
57
|
+
if (isValid) {
|
|
58
|
+
this.report?.({ stage: 'session', message: 'Session is valid' });
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.report?.({ stage: 'session', message: 'Session expired, re-authenticating...' });
|
|
62
|
+
await this.reAuthenticate();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Файл cookies не найден, выполняем авторизацию
|
|
67
|
+
this.report?.({ stage: 'session', message: 'No cookies found, authenticating...' });
|
|
68
|
+
await this.reAuthenticate();
|
|
69
|
+
}
|
|
70
|
+
this.initialized = true;
|
|
71
|
+
this.report?.({ stage: 'session', message: 'Session initialized successfully' });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Возвращает авторизованный HTTP клиент для выполнения запросов.
|
|
75
|
+
*
|
|
76
|
+
* Предполагается, что ensureSession() уже была вызвана.
|
|
77
|
+
* НЕ выполняет повторную проверку валидности сессии.
|
|
78
|
+
*
|
|
79
|
+
* @returns AxiosInstance с установленным CookieJar
|
|
80
|
+
* @throws Error если сессия не была инициализирована
|
|
81
|
+
*/
|
|
82
|
+
async getAuthorizedClient() {
|
|
83
|
+
if (!this.initialized) {
|
|
84
|
+
throw new Error('Session not initialized. Call ensureSession() first at the top level.');
|
|
85
|
+
}
|
|
86
|
+
return this.httpClient.getClient();
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Проверяет валидность текущей сессии.
|
|
90
|
+
*
|
|
91
|
+
* Выполняет GET запрос на страницу профиля.
|
|
92
|
+
* Если ответ содержит индикатор авторизации — сессия валидна.
|
|
93
|
+
*
|
|
94
|
+
* Не выбрасывает исключения при ошибках — возвращает false.
|
|
95
|
+
*
|
|
96
|
+
* @returns true если сессия валидна, false в противном случае
|
|
97
|
+
*/
|
|
98
|
+
async validateSession() {
|
|
99
|
+
try {
|
|
100
|
+
console.log('🔍 Проверка валидности сессии...');
|
|
101
|
+
// Debug: показываем cookies перед запросом
|
|
102
|
+
await this.httpClient.debugCookies();
|
|
103
|
+
const client = this.httpClient.getClient();
|
|
104
|
+
const response = await client.get(iiko_parser_config_1.IikoParserConfig.endpoints.profile);
|
|
105
|
+
console.log(`📊 Ответ сервера: ${response.status}`);
|
|
106
|
+
// Проверяем статус
|
|
107
|
+
if (response.status !== 200) {
|
|
108
|
+
console.warn(`⚠️ Неожиданный статус: ${response.status}`);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
// Проверяем содержимое страницы
|
|
112
|
+
const html = response.data || '';
|
|
113
|
+
if (typeof html === 'string') {
|
|
114
|
+
// Признаки НЕавторизованности
|
|
115
|
+
const errorIndicators = [
|
|
116
|
+
'Ошибка 403',
|
|
117
|
+
'Доступ запрещен',
|
|
118
|
+
'Access denied',
|
|
119
|
+
'Forbidden',
|
|
120
|
+
'form-signin',
|
|
121
|
+
'auth-form',
|
|
122
|
+
'Please sign in',
|
|
123
|
+
'Log in',
|
|
124
|
+
'Sign in',
|
|
125
|
+
'type="password"',
|
|
126
|
+
];
|
|
127
|
+
for (const indicator of errorIndicators) {
|
|
128
|
+
if (html.includes(indicator)) {
|
|
129
|
+
console.warn(`⚠️ Обнаружен индикатор отсутствия авторизации: "${indicator}"`);
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Проверка на редирект на login в HTML
|
|
134
|
+
if (html.toLowerCase().includes('/login') || html.toLowerCase().includes('login.html')) {
|
|
135
|
+
console.warn('⚠️ HTML содержит ссылку на страницу логина');
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
// Признаки успешной авторизации
|
|
139
|
+
const successIndicators = [
|
|
140
|
+
'profile',
|
|
141
|
+
'cabinet',
|
|
142
|
+
'logout',
|
|
143
|
+
'личный кабинет',
|
|
144
|
+
'профиль',
|
|
145
|
+
'sign out',
|
|
146
|
+
'log out',
|
|
147
|
+
];
|
|
148
|
+
let foundSuccess = false;
|
|
149
|
+
for (const indicator of successIndicators) {
|
|
150
|
+
if (html.toLowerCase().includes(indicator.toLowerCase())) {
|
|
151
|
+
foundSuccess = true;
|
|
152
|
+
console.debug(`✅ Найден индикатор авторизации: "${indicator}"`);
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (!foundSuccess) {
|
|
157
|
+
console.warn('⚠️ Не найдено признаков успешной авторизации');
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
console.log('✅ Сессия валидна');
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error(`❌ Ошибка при проверке валидности сессии: ${error.message}`);
|
|
166
|
+
if (error.response) {
|
|
167
|
+
console.error(`HTTP статус: ${error.response.status}`);
|
|
168
|
+
}
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Выполняет повторную авторизацию
|
|
174
|
+
*/
|
|
175
|
+
async reAuthenticate() {
|
|
176
|
+
// Защита от одновременных попыток авторизации
|
|
177
|
+
if (this.isAuthenticating) {
|
|
178
|
+
console.log('Авторизация уже выполняется, ожидание...');
|
|
179
|
+
await this.waitForAuthentication();
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
this.isAuthenticating = true;
|
|
183
|
+
try {
|
|
184
|
+
console.log('Выполняется повторная авторизация...');
|
|
185
|
+
await this.authService.loginUser();
|
|
186
|
+
console.log('Повторная авторизация выполнена успешно');
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
this.isAuthenticating = false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Ожидает завершения текущей авторизации
|
|
194
|
+
*/
|
|
195
|
+
async waitForAuthentication() {
|
|
196
|
+
const maxWaitTime = 30000; // 30 секунд
|
|
197
|
+
const checkInterval = 100; // 100 мс
|
|
198
|
+
let waited = 0;
|
|
199
|
+
while (this.isAuthenticating && waited < maxWaitTime) {
|
|
200
|
+
await new Promise((resolve) => setTimeout(resolve, checkInterval));
|
|
201
|
+
waited += checkInterval;
|
|
202
|
+
}
|
|
203
|
+
if (this.isAuthenticating) {
|
|
204
|
+
throw new Error('Таймаут ожидания авторизации');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
exports.IikoSessionService = IikoSessionService;
|
|
209
|
+
//# sourceMappingURL=iiko-session.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iiko-session.service.js","sourceRoot":"","sources":["../../../src/core/session/iiko-session.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { IikoParserOptions, InvoicesFilter, InvoiceData, CompanyProfile } from './types';
|
|
2
|
+
import { ClientsFilter, ClientData } from './clients/clients.types';
|
|
3
|
+
/**
|
|
4
|
+
* Главный класс для работы с iiko Partner Portal.
|
|
5
|
+
*
|
|
6
|
+
* Предоставляет высокоуровневое API для:
|
|
7
|
+
* - Получения списка инвойсов с фильтрацией
|
|
8
|
+
* - Парсинга деталей инвойсов из модальных окон
|
|
9
|
+
* - Получения профиля компании
|
|
10
|
+
*
|
|
11
|
+
* Управляет всеми внутренними сервисами: авторизацией, HTTP-клиентом,
|
|
12
|
+
* парсингом HTML и хранением cookies.
|
|
13
|
+
*/
|
|
14
|
+
export declare class IikoParser {
|
|
15
|
+
private options;
|
|
16
|
+
private httpClient;
|
|
17
|
+
private authService;
|
|
18
|
+
private sessionService;
|
|
19
|
+
private parserService;
|
|
20
|
+
private invoicesService;
|
|
21
|
+
private clientsService;
|
|
22
|
+
private cookiesPath;
|
|
23
|
+
/**
|
|
24
|
+
* Создаёт экземпляр парсера iiko Partner Portal.
|
|
25
|
+
*
|
|
26
|
+
* Инициализирует все внутренние сервисы в правильном порядке зависимостей.
|
|
27
|
+
* Cookies сохраняются автоматически после авторизации для переиспользования.
|
|
28
|
+
*
|
|
29
|
+
* @param options - Конфигурация парсера (логин, пароль, опциональные настройки)
|
|
30
|
+
*/
|
|
31
|
+
constructor(options: IikoParserOptions);
|
|
32
|
+
/**
|
|
33
|
+
* Безопасно сообщает о прогрессе выполнения.
|
|
34
|
+
*
|
|
35
|
+
* Вызывает callback только если он был передан в options.
|
|
36
|
+
* Не выбрасывает исключения при ошибках в callback.
|
|
37
|
+
*
|
|
38
|
+
* @param event - Событие прогресса
|
|
39
|
+
*/
|
|
40
|
+
private report;
|
|
41
|
+
/**
|
|
42
|
+
* Инициализирует или проверяет текущую сессию.
|
|
43
|
+
*
|
|
44
|
+
* Порядок действий:
|
|
45
|
+
* 1. Пытается загрузить cookies из файла
|
|
46
|
+
* 2. Если cookies валидные — использует их
|
|
47
|
+
* 3. Если cookies отсутствуют или невалидные — выполняет авторизацию
|
|
48
|
+
*
|
|
49
|
+
* Метод безопасно вызывать многократно. Повторная авторизация
|
|
50
|
+
* выполняется только при необходимости.
|
|
51
|
+
*
|
|
52
|
+
* @returns Promise, который резолвится после успешной инициализации сессии
|
|
53
|
+
*/
|
|
54
|
+
ensureSession(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Получает список инвойсов с опциональной фильтрацией и деталями.
|
|
57
|
+
*
|
|
58
|
+
* Без флага `withDetails` возвращает только основные данные (быстро).
|
|
59
|
+
* С флагом `withDetails: true` дополнительно загружает items и subscriptions
|
|
60
|
+
* из модальных окон каждого инвойса (медленнее).
|
|
61
|
+
*
|
|
62
|
+
* Поддерживаемые фильтры:
|
|
63
|
+
* - searchBy: 'invoice_number' | 'tax_id' | 'client' | 'firm'
|
|
64
|
+
* - searchValue: значение для поиска
|
|
65
|
+
* - dateFrom / dateTo: фильтрация по дате (YYYY-MM-DD)
|
|
66
|
+
* - pagination: управление пагинацией (pageSize, maxPages)
|
|
67
|
+
* - withDetails: загружать ли детали из модальных окон
|
|
68
|
+
*
|
|
69
|
+
* Пагинация:
|
|
70
|
+
* - По умолчанию загружаются все страницы
|
|
71
|
+
* - Можно ограничить через pagination.maxPages
|
|
72
|
+
* - Размер страницы задаётся через pagination.pageSize (по умолчанию: 50)
|
|
73
|
+
*
|
|
74
|
+
* @param filter - Опциональные параметры фильтрации и загрузки деталей
|
|
75
|
+
* @returns Массив инвойсов с заполненными полями
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* // Быстрый поиск без деталей
|
|
79
|
+
* const invoices = await parser.getInvoices({ searchBy: 'invoice_number', searchValue: 'INV123' });
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* // Полная загрузка с деталями
|
|
83
|
+
* const invoices = await parser.getInvoices({ withDetails: true });
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* // Загрузка с ограничением пагинации
|
|
87
|
+
* const invoices = await parser.getInvoices({
|
|
88
|
+
* pagination: { maxPages: 2, pageSize: 100 }
|
|
89
|
+
* });
|
|
90
|
+
*/
|
|
91
|
+
getInvoices(filter?: InvoicesFilter & {
|
|
92
|
+
withDetails?: boolean;
|
|
93
|
+
}): Promise<InvoiceData[]>;
|
|
94
|
+
/**
|
|
95
|
+
* Получает профиль компании из кабинета iiko Partner Portal.
|
|
96
|
+
*
|
|
97
|
+
* Извлекает информацию о компании, включая название, телефон и email.
|
|
98
|
+
* Требует предварительной инициализации сессии через `ensureSession()`.
|
|
99
|
+
*
|
|
100
|
+
* @returns Профиль компании с основными данными
|
|
101
|
+
*/
|
|
102
|
+
getCompanyProfile(): Promise<CompanyProfile>;
|
|
103
|
+
/**
|
|
104
|
+
* Получает список клиентов с детальной информацией.
|
|
105
|
+
*
|
|
106
|
+
* Загружает все страницы клиентов из /en/cabinet/ajax/clients-list.html,
|
|
107
|
+
* затем для каждого клиента загружает детальную информацию профиля
|
|
108
|
+
* из /en/cabinet/client-area/index.html.
|
|
109
|
+
*
|
|
110
|
+
* Детали клиента включают:
|
|
111
|
+
* - UUID клиента
|
|
112
|
+
* - Версия iiko
|
|
113
|
+
* - Email и телефон
|
|
114
|
+
* - Юридическое лицо (Legal Entity)
|
|
115
|
+
* - ИНН (TIN - только цифры)
|
|
116
|
+
*
|
|
117
|
+
* Поддерживаемые фильтры:
|
|
118
|
+
* - query: поисковый запрос по названию клиента
|
|
119
|
+
* - perPage: количество клиентов на странице (по умолчанию: 20)
|
|
120
|
+
* - maxPages: максимальное количество страниц для загрузки (по умолчанию: все)
|
|
121
|
+
*
|
|
122
|
+
* Пагинация:
|
|
123
|
+
* - По умолчанию загружаются все страницы
|
|
124
|
+
* - Можно ограничить через maxPages
|
|
125
|
+
*
|
|
126
|
+
* Progress stages:
|
|
127
|
+
* - fetch_clients: загрузка страниц со списком клиентов
|
|
128
|
+
* - parse_clients: парсинг списка клиентов
|
|
129
|
+
* - fetch_client_details: загрузка деталей каждого клиента
|
|
130
|
+
* - done: завершение работы
|
|
131
|
+
*
|
|
132
|
+
* @param filter - Опциональные параметры фильтрации
|
|
133
|
+
* @returns Массив клиентов с полной информацией
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* // Загрузить всех клиентов
|
|
137
|
+
* const clients = await parser.getClients();
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* // Поиск клиентов по запросу
|
|
141
|
+
* const clients = await parser.getClients({ query: 'Restaurant' });
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* // Ограничить количество страниц
|
|
145
|
+
* const clients = await parser.getClients({ maxPages: 2, perPage: 50 });
|
|
146
|
+
*/
|
|
147
|
+
getClients(filter?: ClientsFilter): Promise<ClientData[]>;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=iiko-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iiko-parser.d.ts","sourceRoot":"","sources":["../src/iiko-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAuB,MAAM,SAAS,CAAC;AAa9G,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEpE;;;;;;;;;;GAUG;AACH,qBAAa,UAAU;IAiBT,OAAO,CAAC,OAAO;IAhB3B,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;;;;OAOG;gBACiB,OAAO,EAAE,iBAAiB;IA+B9C;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM;IAId;;;;;;;;;;;;OAYG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAKpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACG,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0B9F;;;;;;;OAOG;IACG,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC;IAalD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAKhE"}
|