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.
Files changed (87) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/README.md +582 -0
  3. package/dist/clients/clients.fetcher.d.ts +102 -0
  4. package/dist/clients/clients.fetcher.d.ts.map +1 -0
  5. package/dist/clients/clients.fetcher.js +196 -0
  6. package/dist/clients/clients.fetcher.js.map +1 -0
  7. package/dist/clients/clients.parser.d.ts +144 -0
  8. package/dist/clients/clients.parser.d.ts.map +1 -0
  9. package/dist/clients/clients.parser.js +473 -0
  10. package/dist/clients/clients.parser.js.map +1 -0
  11. package/dist/clients/clients.service.d.ts +90 -0
  12. package/dist/clients/clients.service.d.ts.map +1 -0
  13. package/dist/clients/clients.service.js +277 -0
  14. package/dist/clients/clients.service.js.map +1 -0
  15. package/dist/clients/clients.types.d.ts +127 -0
  16. package/dist/clients/clients.types.d.ts.map +1 -0
  17. package/dist/clients/clients.types.js +6 -0
  18. package/dist/clients/clients.types.js.map +1 -0
  19. package/dist/clients/index.d.ts +5 -0
  20. package/dist/clients/index.d.ts.map +1 -0
  21. package/dist/clients/index.js +25 -0
  22. package/dist/clients/index.js.map +1 -0
  23. package/dist/core/auth/iiko-auth.service.d.ts +52 -0
  24. package/dist/core/auth/iiko-auth.service.d.ts.map +1 -0
  25. package/dist/core/auth/iiko-auth.service.js +302 -0
  26. package/dist/core/auth/iiko-auth.service.js.map +1 -0
  27. package/dist/core/http/iiko-http.client.d.ts +13 -0
  28. package/dist/core/http/iiko-http.client.d.ts.map +1 -0
  29. package/dist/core/http/iiko-http.client.js +55 -0
  30. package/dist/core/http/iiko-http.client.js.map +1 -0
  31. package/dist/core/iiko-parser.config.d.ts +28 -0
  32. package/dist/core/iiko-parser.config.d.ts.map +1 -0
  33. package/dist/core/iiko-parser.config.js +76 -0
  34. package/dist/core/iiko-parser.config.js.map +1 -0
  35. package/dist/core/parser/iiko-parser.service.d.ts +15 -0
  36. package/dist/core/parser/iiko-parser.service.d.ts.map +1 -0
  37. package/dist/core/parser/iiko-parser.service.js +156 -0
  38. package/dist/core/parser/iiko-parser.service.js.map +1 -0
  39. package/dist/core/session/iiko-session.service.d.ts +68 -0
  40. package/dist/core/session/iiko-session.service.d.ts.map +1 -0
  41. package/dist/core/session/iiko-session.service.js +209 -0
  42. package/dist/core/session/iiko-session.service.js.map +1 -0
  43. package/dist/iiko-parser.d.ts +149 -0
  44. package/dist/iiko-parser.d.ts.map +1 -0
  45. package/dist/iiko-parser.js +209 -0
  46. package/dist/iiko-parser.js.map +1 -0
  47. package/dist/index.d.ts +4 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +7 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/interfaces/company-profile.interface.d.ts +12 -0
  52. package/dist/interfaces/company-profile.interface.d.ts.map +1 -0
  53. package/dist/interfaces/company-profile.interface.js +3 -0
  54. package/dist/interfaces/company-profile.interface.js.map +1 -0
  55. package/dist/invoices/index.d.ts +6 -0
  56. package/dist/invoices/index.d.ts.map +1 -0
  57. package/dist/invoices/index.js +22 -0
  58. package/dist/invoices/index.js.map +1 -0
  59. package/dist/invoices/invoices.fetcher.d.ts +49 -0
  60. package/dist/invoices/invoices.fetcher.d.ts.map +1 -0
  61. package/dist/invoices/invoices.fetcher.js +141 -0
  62. package/dist/invoices/invoices.fetcher.js.map +1 -0
  63. package/dist/invoices/invoices.filters.d.ts +40 -0
  64. package/dist/invoices/invoices.filters.d.ts.map +1 -0
  65. package/dist/invoices/invoices.filters.js +81 -0
  66. package/dist/invoices/invoices.filters.js.map +1 -0
  67. package/dist/invoices/invoices.parser.d.ts +101 -0
  68. package/dist/invoices/invoices.parser.d.ts.map +1 -0
  69. package/dist/invoices/invoices.parser.js +540 -0
  70. package/dist/invoices/invoices.parser.js.map +1 -0
  71. package/dist/invoices/invoices.service.d.ts +82 -0
  72. package/dist/invoices/invoices.service.d.ts.map +1 -0
  73. package/dist/invoices/invoices.service.js +361 -0
  74. package/dist/invoices/invoices.service.js.map +1 -0
  75. package/dist/invoices/invoices.storage.service.d.ts +30 -0
  76. package/dist/invoices/invoices.storage.service.d.ts.map +1 -0
  77. package/dist/invoices/invoices.storage.service.js +135 -0
  78. package/dist/invoices/invoices.storage.service.js.map +1 -0
  79. package/dist/invoices/invoices.types.d.ts +94 -0
  80. package/dist/invoices/invoices.types.d.ts.map +1 -0
  81. package/dist/invoices/invoices.types.js +3 -0
  82. package/dist/invoices/invoices.types.js.map +1 -0
  83. package/dist/types.d.ts +138 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +4 -0
  86. package/dist/types.js.map +1 -0
  87. 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,6 @@
1
+ "use strict";
2
+ /**
3
+ * Типы для работы с клиентами iiko Partner Portal
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=clients.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.types.js","sourceRoot":"","sources":["../../src/clients/clients.types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,5 @@
1
+ export { ClientsService } from './clients.service';
2
+ export { ClientsFetcher } from './clients.fetcher';
3
+ export { ClientsParser } from './clients.parser';
4
+ export * from './clients.types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}