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,277 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClientsService = void 0;
|
|
4
|
+
const clients_fetcher_1 = require("./clients.fetcher");
|
|
5
|
+
const clients_parser_1 = require("./clients.parser");
|
|
6
|
+
class ClientsService {
|
|
7
|
+
constructor(sessionService, progressCallback) {
|
|
8
|
+
this.sessionService = sessionService;
|
|
9
|
+
this.progressCallback = progressCallback;
|
|
10
|
+
this.fetcher = new clients_fetcher_1.ClientsFetcher(sessionService);
|
|
11
|
+
this.parser = new clients_parser_1.ClientsParser();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Загружает и парсит список клиентов с пагинацией.
|
|
15
|
+
*
|
|
16
|
+
* Алгоритм работы:
|
|
17
|
+
* 1. Инициализирует сессию (должна быть выполнена до вызова через ensureSession())
|
|
18
|
+
* 2. Загружает страницы клиентов через /en/cabinet/ajax/clients-list.html
|
|
19
|
+
* 3. Парсит каждую страницу, извлекая name и clientId из HTML таблицы
|
|
20
|
+
* 4. Останавливается когда:
|
|
21
|
+
* - Получена пустая страница (нет больше клиентов)
|
|
22
|
+
* - Достигнут лимит maxPages
|
|
23
|
+
* - Получено меньше элементов чем perPage (последняя страница)
|
|
24
|
+
* 5. Для каждого клиента загружает детальную информацию с /en/cabinet/client-area/index.html
|
|
25
|
+
* 6. Парсит профиль клиента (UUID, iiko версия, email, phone, юр.лицо, ИНН)
|
|
26
|
+
*
|
|
27
|
+
* Параметры пагинации:
|
|
28
|
+
* - query: поисковый запрос (фильтрация по имени или UID на стороне сервера)
|
|
29
|
+
* - perPage: количество клиентов на странице (по умолчанию: 20)
|
|
30
|
+
* - maxPages: максимальное количество страниц для загрузки (по умолчанию: все)
|
|
31
|
+
*
|
|
32
|
+
* Progress события:
|
|
33
|
+
* - fetch_clients: при загрузке каждой страницы списка
|
|
34
|
+
* - parse_clients: после завершения парсинга всех страниц
|
|
35
|
+
* - fetch_client_details: при загрузке деталей каждого клиента
|
|
36
|
+
*
|
|
37
|
+
* @param filter Опциональные параметры фильтрации и пагинации
|
|
38
|
+
* @returns Массив клиентов с полной информацией (UUID, версия, контакты, юр.данные)
|
|
39
|
+
*/
|
|
40
|
+
async fetchAndParseClients(filter) {
|
|
41
|
+
const query = filter?.query || '';
|
|
42
|
+
const perPage = filter?.perPage || 20;
|
|
43
|
+
const maxPages = filter?.maxPages || Infinity;
|
|
44
|
+
const allClients = [];
|
|
45
|
+
let currentPage = 1;
|
|
46
|
+
let hasMorePages = true;
|
|
47
|
+
let totalPages;
|
|
48
|
+
// Fetch all pages with pagination
|
|
49
|
+
while (hasMorePages && currentPage <= maxPages) {
|
|
50
|
+
const html = await this.fetcher.fetchClientsHtml({ query, perPage, page: currentPage });
|
|
51
|
+
// На первой странице определяем общее количество страниц
|
|
52
|
+
if (currentPage === 1) {
|
|
53
|
+
totalPages = this.parser.parseTotalPages(html, perPage);
|
|
54
|
+
}
|
|
55
|
+
this.report('fetch_clients', {
|
|
56
|
+
current: currentPage,
|
|
57
|
+
total: totalPages !== undefined ? Math.min(totalPages, maxPages === Infinity ? totalPages : maxPages) : '?',
|
|
58
|
+
message: `Fetching clients page ${currentPage}${totalPages ? `/${Math.min(totalPages, maxPages === Infinity ? totalPages : maxPages)}` : ''}...`,
|
|
59
|
+
});
|
|
60
|
+
const clients = this.parser.parseClientsTable(html);
|
|
61
|
+
if (clients.length === 0) {
|
|
62
|
+
hasMorePages = false;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
allClients.push(...clients);
|
|
66
|
+
currentPage++;
|
|
67
|
+
// Stop if we received fewer items than perPage (last page)
|
|
68
|
+
if (clients.length < perPage) {
|
|
69
|
+
hasMorePages = false;
|
|
70
|
+
}
|
|
71
|
+
// Stop if we reached the total number of pages
|
|
72
|
+
if (totalPages && currentPage > totalPages) {
|
|
73
|
+
hasMorePages = false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
this.report('parse_clients', {
|
|
78
|
+
current: allClients.length,
|
|
79
|
+
total: allClients.length,
|
|
80
|
+
message: `Parsed ${allClients.length} clients`,
|
|
81
|
+
});
|
|
82
|
+
// Enrich with details
|
|
83
|
+
const enrichedClients = await this.enrichWithDetails(allClients);
|
|
84
|
+
return enrichedClients;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Обогащает список клиентов детальной информацией с поддержкой Chain логики.
|
|
88
|
+
*
|
|
89
|
+
* Алгоритм:
|
|
90
|
+
* 1. Создаёт Map для дедупликации (clientId → ClientData)
|
|
91
|
+
* 2. Создаёт Set для отслеживания членов chain (чтобы исключить их из root списка)
|
|
92
|
+
* 3. Для каждого клиента:
|
|
93
|
+
* - Загружает профиль
|
|
94
|
+
* - Проверяет uuid/clientId (пропускает если нет)
|
|
95
|
+
* - Определяет isChain
|
|
96
|
+
* - Если chain: загружает allocation и собирает members
|
|
97
|
+
* 4. Финальный результат: только клиенты, которые НЕ являются members других chain
|
|
98
|
+
*
|
|
99
|
+
* @param clients Список клиентов с базовой информацией (name, clientId)
|
|
100
|
+
* @returns Массив клиентов с полной информацией, chain содержат members[], дедуплицированные
|
|
101
|
+
*/
|
|
102
|
+
async enrichWithDetails(clients) {
|
|
103
|
+
// Map для дедупликации: clientId → ClientData
|
|
104
|
+
const clientsMap = new Map();
|
|
105
|
+
// Set для отслеживания clientId которые являются members chain
|
|
106
|
+
const memberClientIds = new Set();
|
|
107
|
+
for (let i = 0; i < clients.length; i++) {
|
|
108
|
+
const client = clients[i];
|
|
109
|
+
this.report('fetch_client_details', {
|
|
110
|
+
current: i + 1,
|
|
111
|
+
total: clients.length,
|
|
112
|
+
message: `[clients] [${i + 1}/${clients.length}] Processing client "${client.name}"`,
|
|
113
|
+
});
|
|
114
|
+
try {
|
|
115
|
+
const profileHtml = await this.fetcher.fetchClientProfile(client.clientId);
|
|
116
|
+
const profileData = this.parser.parseClientProfile(profileHtml, client.clientId, client.name);
|
|
117
|
+
// Пропускаем клиентов без uuid или clientId
|
|
118
|
+
if (!profileData || !profileData.uuid || !profileData.clientId) {
|
|
119
|
+
console.warn(`⚠️ Skipping client without uuid/clientId: ${client.name} (${client.clientId})`);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
// Определяем является ли клиент Chain
|
|
123
|
+
const isChain = this.parser.detectIsChain(profileHtml);
|
|
124
|
+
// Создаём базовый объект ClientData
|
|
125
|
+
const clientData = {
|
|
126
|
+
...profileData,
|
|
127
|
+
isChain,
|
|
128
|
+
members: [],
|
|
129
|
+
};
|
|
130
|
+
// Если клиент является Chain, загружаем members
|
|
131
|
+
if (isChain) {
|
|
132
|
+
console.log(`[chain] Detected chain clientId=${client.clientId}`);
|
|
133
|
+
const members = await this.loadChainMembers(client.clientId, client.name);
|
|
134
|
+
clientData.members = members;
|
|
135
|
+
// Помечаем всех members как принадлежащих chain
|
|
136
|
+
for (const member of members) {
|
|
137
|
+
memberClientIds.add(member.clientId);
|
|
138
|
+
}
|
|
139
|
+
console.log(`[chain] Members found: ${members.length}`);
|
|
140
|
+
}
|
|
141
|
+
// Добавляем в Map (дедупликация по clientId)
|
|
142
|
+
if (!clientsMap.has(clientData.clientId)) {
|
|
143
|
+
clientsMap.set(clientData.clientId, clientData);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error(`Failed to fetch details for client ${client.clientId}:`, error);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Финальная фильтрация: исключаем клиентов, которые являются members других chain
|
|
151
|
+
const finalClients = [];
|
|
152
|
+
for (const clientData of clientsMap.values()) {
|
|
153
|
+
if (!memberClientIds.has(clientData.clientId)) {
|
|
154
|
+
finalClients.push(clientData);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
console.log(`[dedup] Excluded member from root list: ${clientData.name} (${clientData.clientId})`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return finalClients;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Загружает членов chain из allocation страниц.
|
|
164
|
+
*
|
|
165
|
+
* Алгоритм:
|
|
166
|
+
* 1. Загружает cloud-mapping.html и saas-mapping.html
|
|
167
|
+
* 2. Парсит списки members из обеих страниц
|
|
168
|
+
* 3. Объединяет данные (по clientId):
|
|
169
|
+
* - Если member есть только в cloud → cloudAllocation > 0, saasAllocation = 0
|
|
170
|
+
* - Если member есть только в saas → cloudAllocation = 0, saasAllocation > 0
|
|
171
|
+
* - Если member есть в обоих → оба allocation > 0
|
|
172
|
+
* 4. Для каждого member загружает полный профиль (UUID, email, phone, etc.)
|
|
173
|
+
* 5. Возвращает массив ClientMember
|
|
174
|
+
*
|
|
175
|
+
* @param chainClientId ID chain для загрузки allocation
|
|
176
|
+
* @param chainName Имя chain для логирования
|
|
177
|
+
* @returns Массив ClientMember с полной информацией и allocation
|
|
178
|
+
*/
|
|
179
|
+
async loadChainMembers(chainClientId, chainName) {
|
|
180
|
+
// Map для объединения cloud и saas allocation: clientId → AllocationData
|
|
181
|
+
const allocationMap = new Map();
|
|
182
|
+
// Загружаем Cloud allocation
|
|
183
|
+
try {
|
|
184
|
+
const cloudHtml = await this.fetcher.fetchCloudAllocationHtml(chainClientId);
|
|
185
|
+
const cloudMembers = this.parser.parseAllocationPage(cloudHtml);
|
|
186
|
+
for (const member of cloudMembers) {
|
|
187
|
+
allocationMap.set(member.clientId, {
|
|
188
|
+
name: member.name,
|
|
189
|
+
cloudAllocation: member.allocation,
|
|
190
|
+
saasAllocation: 0,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
console.log(`[chain] Cloud allocation loaded: ${cloudMembers.length} members`);
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
console.warn(`⚠️ Failed to load cloud allocation for chain ${chainClientId}:`, error);
|
|
197
|
+
}
|
|
198
|
+
// Загружаем SaaS allocation
|
|
199
|
+
try {
|
|
200
|
+
const saasHtml = await this.fetcher.fetchSaasAllocationHtml(chainClientId);
|
|
201
|
+
const saasMembers = this.parser.parseAllocationPage(saasHtml);
|
|
202
|
+
for (const member of saasMembers) {
|
|
203
|
+
const existing = allocationMap.get(member.clientId);
|
|
204
|
+
if (existing) {
|
|
205
|
+
// Member присутствует в обоих allocation
|
|
206
|
+
existing.saasAllocation = member.allocation;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Member только в saas
|
|
210
|
+
allocationMap.set(member.clientId, {
|
|
211
|
+
name: member.name,
|
|
212
|
+
cloudAllocation: 0,
|
|
213
|
+
saasAllocation: member.allocation,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
console.log(`[chain] SaaS allocation loaded: ${saasMembers.length} members`);
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
console.warn(`⚠️ Failed to load saas allocation for chain ${chainClientId}:`, error);
|
|
221
|
+
}
|
|
222
|
+
// Загружаем полные профили для каждого member
|
|
223
|
+
const members = [];
|
|
224
|
+
let memberIndex = 0;
|
|
225
|
+
for (const [memberClientId, allocationData] of allocationMap.entries()) {
|
|
226
|
+
memberIndex++;
|
|
227
|
+
console.log(`[chain] [${memberIndex}/${allocationMap.size}] Loading member profile: ${allocationData.name}`);
|
|
228
|
+
try {
|
|
229
|
+
const profileHtml = await this.fetcher.fetchClientProfile(memberClientId);
|
|
230
|
+
const profileData = this.parser.parseClientProfile(profileHtml, memberClientId, allocationData.name);
|
|
231
|
+
if (profileData && profileData.uuid && profileData.clientId) {
|
|
232
|
+
members.push({
|
|
233
|
+
...profileData,
|
|
234
|
+
isChain: false,
|
|
235
|
+
members: [],
|
|
236
|
+
cloudAllocation: allocationData.cloudAllocation,
|
|
237
|
+
saasAllocation: allocationData.saasAllocation,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
console.warn(`⚠️ Skipping member without uuid: ${allocationData.name} (${memberClientId})`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
console.error(`Failed to load member profile ${memberClientId}:`, error);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return members;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Отправляет событие прогресса в callback, если он был передан.
|
|
252
|
+
*
|
|
253
|
+
* Используется для информирования внешнего кода о текущем состоянии выполнения:
|
|
254
|
+
* - fetch_clients: загрузка страниц списка клиентов
|
|
255
|
+
* - parse_clients: завершение парсинга списка
|
|
256
|
+
* - fetch_client_details: загрузка деталей каждого клиента
|
|
257
|
+
* - detect_chain: определение chain
|
|
258
|
+
* - load_chain_members: загрузка членов chain
|
|
259
|
+
*
|
|
260
|
+
* Безопасно проверяет наличие callback перед вызовом.
|
|
261
|
+
*
|
|
262
|
+
* @param stage Стадия выполнения операции
|
|
263
|
+
* @param data Данные о прогрессе (текущее значение, общее количество, сообщение)
|
|
264
|
+
*/
|
|
265
|
+
report(stage, data) {
|
|
266
|
+
if (this.progressCallback) {
|
|
267
|
+
this.progressCallback({
|
|
268
|
+
stage,
|
|
269
|
+
current: data.current,
|
|
270
|
+
total: data.total,
|
|
271
|
+
message: data.message,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
exports.ClientsService = ClientsService;
|
|
277
|
+
//# sourceMappingURL=clients.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.service.js","sourceRoot":"","sources":["../../src/clients/clients.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Типы для работы с клиентами iiko Partner Portal
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Фильтр для поиска клиентов.
|
|
6
|
+
*/
|
|
7
|
+
export interface ClientsFilter {
|
|
8
|
+
/** Строка поиска (UUID или имя клиента) */
|
|
9
|
+
query?: string;
|
|
10
|
+
/** Количество записей на страницу (по умолчанию: 10) */
|
|
11
|
+
perPage?: number;
|
|
12
|
+
/** Максимальное количество страниц для загрузки (опционально) */
|
|
13
|
+
maxPages?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Член группы компаний (Chain).
|
|
17
|
+
*
|
|
18
|
+
* Содержит полную информацию о клиенте, который является членом chain,
|
|
19
|
+
* плюс информацию об allocation лицензий.
|
|
20
|
+
*/
|
|
21
|
+
export interface ClientMember {
|
|
22
|
+
/** UUID клиента (формат: "212-191-451") */
|
|
23
|
+
uuid: string;
|
|
24
|
+
/** Имя клиента */
|
|
25
|
+
name: string;
|
|
26
|
+
/** ID клиента из URL */
|
|
27
|
+
clientId: string;
|
|
28
|
+
/** Версия iiko */
|
|
29
|
+
iikoVersion?: string;
|
|
30
|
+
/** Email клиента */
|
|
31
|
+
email?: string;
|
|
32
|
+
/** Телефон клиента */
|
|
33
|
+
phone?: string;
|
|
34
|
+
/** Адрес клиента */
|
|
35
|
+
address?: string;
|
|
36
|
+
/** Юридическое лицо (нормализованное) */
|
|
37
|
+
legalEntity?: string;
|
|
38
|
+
/** ИНН / TIN (только цифры, без пробелов) */
|
|
39
|
+
tin?: string;
|
|
40
|
+
/** Member не может быть chain */
|
|
41
|
+
isChain: false;
|
|
42
|
+
/** У member нет вложенных members */
|
|
43
|
+
members: [];
|
|
44
|
+
/** Количество Cloud лицензий, выделенных этому member */
|
|
45
|
+
cloudAllocation: number;
|
|
46
|
+
/** Количество SaaS лицензий, выделенных этому member */
|
|
47
|
+
saasAllocation: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Данные клиента из iiko Partner Portal.
|
|
51
|
+
*
|
|
52
|
+
* Содержит основные поля из таблицы клиентов и детали
|
|
53
|
+
* со страницы профиля клиента.
|
|
54
|
+
*
|
|
55
|
+
* Если клиент является Chain (группой компаний), то:
|
|
56
|
+
* - isChain === true
|
|
57
|
+
* - members[] содержит список внутренних клиентов с allocation
|
|
58
|
+
*/
|
|
59
|
+
export interface ClientData {
|
|
60
|
+
/** UUID клиента (формат: "212-191-451") */
|
|
61
|
+
uuid: string;
|
|
62
|
+
/** Имя клиента */
|
|
63
|
+
name: string;
|
|
64
|
+
/** ID клиента из URL */
|
|
65
|
+
clientId: string;
|
|
66
|
+
/** Версия iiko */
|
|
67
|
+
iikoVersion?: string;
|
|
68
|
+
/** Email клиента */
|
|
69
|
+
email?: string;
|
|
70
|
+
/** Телефон клиента */
|
|
71
|
+
phone?: string;
|
|
72
|
+
/** Адрес клиента */
|
|
73
|
+
address?: string;
|
|
74
|
+
/** Юридическое лицо (нормализованное) */
|
|
75
|
+
legalEntity?: string;
|
|
76
|
+
/** ИНН / TIN (только цифры, без пробелов) */
|
|
77
|
+
tin?: string;
|
|
78
|
+
/**
|
|
79
|
+
* Является ли клиент Chain (группой компаний).
|
|
80
|
+
*
|
|
81
|
+
* Chain определяется наличием хотя бы одной из кнопок:
|
|
82
|
+
* - "Cloud license allocation"
|
|
83
|
+
* - "SaaS license allocation"
|
|
84
|
+
*/
|
|
85
|
+
isChain: boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Список внутренних клиентов chain с allocation лицензий.
|
|
88
|
+
*
|
|
89
|
+
* Для обычных клиентов: []
|
|
90
|
+
* Для chain: массив ClientMember с данными о клиентах и их лицензиях
|
|
91
|
+
*/
|
|
92
|
+
members: ClientMember[];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Параметры для запроса списка клиентов
|
|
96
|
+
*/
|
|
97
|
+
export interface ClientsFetchParams {
|
|
98
|
+
/** Строка поиска */
|
|
99
|
+
query?: string;
|
|
100
|
+
/** Количество записей на страницу */
|
|
101
|
+
perPage?: number;
|
|
102
|
+
/** Номер страницы */
|
|
103
|
+
page?: number;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Элемент списка клиентов из таблицы (без деталей)
|
|
107
|
+
*/
|
|
108
|
+
export interface ClientListItem {
|
|
109
|
+
/** Имя клиента */
|
|
110
|
+
name: string;
|
|
111
|
+
/** ID клиента из URL */
|
|
112
|
+
clientId: string;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Результат парсинга allocation страницы.
|
|
116
|
+
*
|
|
117
|
+
* Содержит информацию о member и количестве выделенных лицензий.
|
|
118
|
+
*/
|
|
119
|
+
export interface AllocationMember {
|
|
120
|
+
/** Имя клиента-члена chain */
|
|
121
|
+
name: string;
|
|
122
|
+
/** ID клиента из URL */
|
|
123
|
+
clientId: string;
|
|
124
|
+
/** Количество выделенных лицензий */
|
|
125
|
+
allocation: number;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=clients.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.types.d.ts","sourceRoot":"","sources":["../../src/clients/clients.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IAEb,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IAEjB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,iCAAiC;IACjC,OAAO,EAAE,KAAK,CAAC;IAEf,qCAAqC;IACrC,OAAO,EAAE,EAAE,CAAC;IAEZ,yDAAyD;IACzD,eAAe,EAAE,MAAM,CAAC;IAExB,wDAAwD;IACxD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IAEb,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IAEjB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;;;;OAMG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;;;OAKG;IACH,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IAEb,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IAEjB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.types.js","sourceRoot":"","sources":["../../src/clients/clients.types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ClientsParser = exports.ClientsFetcher = exports.ClientsService = void 0;
|
|
18
|
+
var clients_service_1 = require("./clients.service");
|
|
19
|
+
Object.defineProperty(exports, "ClientsService", { enumerable: true, get: function () { return clients_service_1.ClientsService; } });
|
|
20
|
+
var clients_fetcher_1 = require("./clients.fetcher");
|
|
21
|
+
Object.defineProperty(exports, "ClientsFetcher", { enumerable: true, get: function () { return clients_fetcher_1.ClientsFetcher; } });
|
|
22
|
+
var clients_parser_1 = require("./clients.parser");
|
|
23
|
+
Object.defineProperty(exports, "ClientsParser", { enumerable: true, get: function () { return clients_parser_1.ClientsParser; } });
|
|
24
|
+
__exportStar(require("./clients.types"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,kDAAgC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { CookieJar } from 'tough-cookie';
|
|
2
|
+
import { IikoHttpClient } from '../http/iiko-http.client';
|
|
3
|
+
import { ParserProgressEvent } from '../../types';
|
|
4
|
+
/**
|
|
5
|
+
* Сервис авторизации в iiko Partner Portal.
|
|
6
|
+
*
|
|
7
|
+
* Выполняет form-based авторизацию через Symfony Security:
|
|
8
|
+
* 1. GET запрос на страницу логина для получения CSRF токена
|
|
9
|
+
* 2. POST запрос с credentials и CSRF токеном
|
|
10
|
+
* 3. Сохранение cookies (PHPSESSION, REMEMBERME) в файл
|
|
11
|
+
*
|
|
12
|
+
* Cookies автоматически сохраняются и загружаются для переиспользования.
|
|
13
|
+
*/
|
|
14
|
+
export declare class IikoAuthService {
|
|
15
|
+
private readonly login;
|
|
16
|
+
private readonly password;
|
|
17
|
+
private readonly httpClient;
|
|
18
|
+
private readonly cookiesPath;
|
|
19
|
+
private readonly report?;
|
|
20
|
+
constructor(login: string, password: string, httpClient: IikoHttpClient, cookiesPath: string, report?: ((event: ParserProgressEvent) => void) | undefined);
|
|
21
|
+
/**
|
|
22
|
+
* Выполняет полный процесс авторизации в iiko Partner Portal.
|
|
23
|
+
*
|
|
24
|
+
* Шаги авторизации:
|
|
25
|
+
* 1. GET /en/login — получение страницы логина и CSRF токена
|
|
26
|
+
* 2. POST /en/login — отправка формы с credentials
|
|
27
|
+
* 3. Проверка наличия индикаторов успешной авторизации
|
|
28
|
+
* 4. Сохранение cookies в файл
|
|
29
|
+
*
|
|
30
|
+
* Использует Symfony Security форму с полями:
|
|
31
|
+
* - username (не email!)
|
|
32
|
+
* - password
|
|
33
|
+
* - _csrf_token
|
|
34
|
+
* - _remember_me
|
|
35
|
+
* - _target_path
|
|
36
|
+
*
|
|
37
|
+
* @throws Error если авторизация не удалась
|
|
38
|
+
*/
|
|
39
|
+
loginUser(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Извлекает CSRF токен из HTML страницы логина
|
|
42
|
+
*/
|
|
43
|
+
private extractCsrfToken;
|
|
44
|
+
/**
|
|
45
|
+
* Проверяет, что пользователь действительно аутентифицирован
|
|
46
|
+
*/
|
|
47
|
+
private verifyAuthentication;
|
|
48
|
+
saveCookies(): Promise<void>;
|
|
49
|
+
loadCookies(): Promise<CookieJar | null>;
|
|
50
|
+
cookiesFileExists(): Promise<boolean>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=iiko-auth.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iiko-auth.service.d.ts","sourceRoot":"","sources":["../../../src/core/auth/iiko-auth.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAJP,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,GAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,aAAA;IAGhE;;;;;;;;;;;;;;;;;OAiBG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAiGhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4CxB;;OAEG;YACW,oBAAoB;IAyE5B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B,WAAW,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAiBxC,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;CAQ5C"}
|