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,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IikoParser = void 0;
|
|
4
|
+
const iiko_parser_config_1 = require("./core/iiko-parser.config");
|
|
5
|
+
const iiko_http_client_1 = require("./core/http/iiko-http.client");
|
|
6
|
+
const iiko_auth_service_1 = require("./core/auth/iiko-auth.service");
|
|
7
|
+
const iiko_session_service_1 = require("./core/session/iiko-session.service");
|
|
8
|
+
const iiko_parser_service_1 = require("./core/parser/iiko-parser.service");
|
|
9
|
+
const invoices_service_1 = require("./invoices/invoices.service");
|
|
10
|
+
const invoices_fetcher_1 = require("./invoices/invoices.fetcher");
|
|
11
|
+
const invoices_parser_1 = require("./invoices/invoices.parser");
|
|
12
|
+
const invoices_filters_1 = require("./invoices/invoices.filters");
|
|
13
|
+
const invoices_storage_service_1 = require("./invoices/invoices.storage.service");
|
|
14
|
+
const clients_service_1 = require("./clients/clients.service");
|
|
15
|
+
/**
|
|
16
|
+
* Главный класс для работы с iiko Partner Portal.
|
|
17
|
+
*
|
|
18
|
+
* Предоставляет высокоуровневое API для:
|
|
19
|
+
* - Получения списка инвойсов с фильтрацией
|
|
20
|
+
* - Парсинга деталей инвойсов из модальных окон
|
|
21
|
+
* - Получения профиля компании
|
|
22
|
+
*
|
|
23
|
+
* Управляет всеми внутренними сервисами: авторизацией, HTTP-клиентом,
|
|
24
|
+
* парсингом HTML и хранением cookies.
|
|
25
|
+
*/
|
|
26
|
+
class IikoParser {
|
|
27
|
+
/**
|
|
28
|
+
* Создаёт экземпляр парсера iiko Partner Portal.
|
|
29
|
+
*
|
|
30
|
+
* Инициализирует все внутренние сервисы в правильном порядке зависимостей.
|
|
31
|
+
* Cookies сохраняются автоматически после авторизации для переиспользования.
|
|
32
|
+
*
|
|
33
|
+
* @param options - Конфигурация парсера (логин, пароль, опциональные настройки)
|
|
34
|
+
*/
|
|
35
|
+
constructor(options) {
|
|
36
|
+
this.options = options;
|
|
37
|
+
// Setup cookies path
|
|
38
|
+
this.cookiesPath = iiko_parser_config_1.IikoParserConfig.getCookiesPath(options.cookiesPath);
|
|
39
|
+
// Create all services following the same dependency chain as reference
|
|
40
|
+
this.httpClient = new iiko_http_client_1.IikoHttpClient();
|
|
41
|
+
this.authService = new iiko_auth_service_1.IikoAuthService(options.login, options.password, this.httpClient, this.cookiesPath, this.report.bind(this));
|
|
42
|
+
this.sessionService = new iiko_session_service_1.IikoSessionService(this.authService, this.httpClient, this.report.bind(this));
|
|
43
|
+
this.parserService = new iiko_parser_service_1.IikoParserService(this.sessionService);
|
|
44
|
+
// Create invoices services
|
|
45
|
+
const invoicesFetcher = new invoices_fetcher_1.InvoicesFetcher(this.sessionService);
|
|
46
|
+
const invoicesParser = new invoices_parser_1.InvoicesParser();
|
|
47
|
+
const invoicesFilters = new invoices_filters_1.InvoicesFilters();
|
|
48
|
+
const invoicesStorage = new invoices_storage_service_1.IikoInvoicesStorageService();
|
|
49
|
+
this.invoicesService = new invoices_service_1.InvoicesService(invoicesFetcher, invoicesParser, invoicesFilters, invoicesStorage, this.report.bind(this));
|
|
50
|
+
// Create clients service
|
|
51
|
+
this.clientsService = new clients_service_1.ClientsService(this.sessionService, this.report.bind(this));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Безопасно сообщает о прогрессе выполнения.
|
|
55
|
+
*
|
|
56
|
+
* Вызывает callback только если он был передан в options.
|
|
57
|
+
* Не выбрасывает исключения при ошибках в callback.
|
|
58
|
+
*
|
|
59
|
+
* @param event - Событие прогресса
|
|
60
|
+
*/
|
|
61
|
+
report(event) {
|
|
62
|
+
this.options.onProgress?.(event);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Инициализирует или проверяет текущую сессию.
|
|
66
|
+
*
|
|
67
|
+
* Порядок действий:
|
|
68
|
+
* 1. Пытается загрузить cookies из файла
|
|
69
|
+
* 2. Если cookies валидные — использует их
|
|
70
|
+
* 3. Если cookies отсутствуют или невалидные — выполняет авторизацию
|
|
71
|
+
*
|
|
72
|
+
* Метод безопасно вызывать многократно. Повторная авторизация
|
|
73
|
+
* выполняется только при необходимости.
|
|
74
|
+
*
|
|
75
|
+
* @returns Promise, который резолвится после успешной инициализации сессии
|
|
76
|
+
*/
|
|
77
|
+
async ensureSession() {
|
|
78
|
+
// This follows the EXACT same logic as the reference
|
|
79
|
+
await this.sessionService.ensureSession();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Получает список инвойсов с опциональной фильтрацией и деталями.
|
|
83
|
+
*
|
|
84
|
+
* Без флага `withDetails` возвращает только основные данные (быстро).
|
|
85
|
+
* С флагом `withDetails: true` дополнительно загружает items и subscriptions
|
|
86
|
+
* из модальных окон каждого инвойса (медленнее).
|
|
87
|
+
*
|
|
88
|
+
* Поддерживаемые фильтры:
|
|
89
|
+
* - searchBy: 'invoice_number' | 'tax_id' | 'client' | 'firm'
|
|
90
|
+
* - searchValue: значение для поиска
|
|
91
|
+
* - dateFrom / dateTo: фильтрация по дате (YYYY-MM-DD)
|
|
92
|
+
* - pagination: управление пагинацией (pageSize, maxPages)
|
|
93
|
+
* - withDetails: загружать ли детали из модальных окон
|
|
94
|
+
*
|
|
95
|
+
* Пагинация:
|
|
96
|
+
* - По умолчанию загружаются все страницы
|
|
97
|
+
* - Можно ограничить через pagination.maxPages
|
|
98
|
+
* - Размер страницы задаётся через pagination.pageSize (по умолчанию: 50)
|
|
99
|
+
*
|
|
100
|
+
* @param filter - Опциональные параметры фильтрации и загрузки деталей
|
|
101
|
+
* @returns Массив инвойсов с заполненными полями
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* // Быстрый поиск без деталей
|
|
105
|
+
* const invoices = await parser.getInvoices({ searchBy: 'invoice_number', searchValue: 'INV123' });
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* // Полная загрузка с деталями
|
|
109
|
+
* const invoices = await parser.getInvoices({ withDetails: true });
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* // Загрузка с ограничением пагинации
|
|
113
|
+
* const invoices = await parser.getInvoices({
|
|
114
|
+
* pagination: { maxPages: 2, pageSize: 100 }
|
|
115
|
+
* });
|
|
116
|
+
*/
|
|
117
|
+
async getInvoices(filter) {
|
|
118
|
+
// Extract pagination options
|
|
119
|
+
const pageSize = filter?.pagination?.pageSize || 50;
|
|
120
|
+
const maxPages = filter?.pagination?.maxPages;
|
|
121
|
+
// Delegate to invoices service with pagination and date filters
|
|
122
|
+
const invoices = await this.invoicesService.fetchAndParseInvoices({
|
|
123
|
+
searchBy: filter?.searchBy,
|
|
124
|
+
searchValue: filter?.searchValue,
|
|
125
|
+
dateFrom: filter?.dateFrom,
|
|
126
|
+
dateTo: filter?.dateTo,
|
|
127
|
+
pageSize,
|
|
128
|
+
maxPages,
|
|
129
|
+
});
|
|
130
|
+
// Enrich with details from modal windows if requested
|
|
131
|
+
if (filter?.withDetails === true) {
|
|
132
|
+
const enrichedInvoices = await this.invoicesService.enrichInvoicesWithDetails(invoices);
|
|
133
|
+
this.report({ stage: 'done', message: 'Invoices parsing completed with details' });
|
|
134
|
+
return enrichedInvoices;
|
|
135
|
+
}
|
|
136
|
+
this.report({ stage: 'done', message: 'Invoices parsing completed' });
|
|
137
|
+
return invoices;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Получает профиль компании из кабинета iiko Partner Portal.
|
|
141
|
+
*
|
|
142
|
+
* Извлекает информацию о компании, включая название, телефон и email.
|
|
143
|
+
* Требует предварительной инициализации сессии через `ensureSession()`.
|
|
144
|
+
*
|
|
145
|
+
* @returns Профиль компании с основными данными
|
|
146
|
+
*/
|
|
147
|
+
async getCompanyProfile() {
|
|
148
|
+
// Get profile using parser service
|
|
149
|
+
const profile = await this.parserService.parseCompanyProfile();
|
|
150
|
+
// Convert to our public API format
|
|
151
|
+
return {
|
|
152
|
+
name: profile.companyName,
|
|
153
|
+
phone: profile.phone,
|
|
154
|
+
email: profile.email,
|
|
155
|
+
address: '', // Not available in original interface
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Получает список клиентов с детальной информацией.
|
|
160
|
+
*
|
|
161
|
+
* Загружает все страницы клиентов из /en/cabinet/ajax/clients-list.html,
|
|
162
|
+
* затем для каждого клиента загружает детальную информацию профиля
|
|
163
|
+
* из /en/cabinet/client-area/index.html.
|
|
164
|
+
*
|
|
165
|
+
* Детали клиента включают:
|
|
166
|
+
* - UUID клиента
|
|
167
|
+
* - Версия iiko
|
|
168
|
+
* - Email и телефон
|
|
169
|
+
* - Юридическое лицо (Legal Entity)
|
|
170
|
+
* - ИНН (TIN - только цифры)
|
|
171
|
+
*
|
|
172
|
+
* Поддерживаемые фильтры:
|
|
173
|
+
* - query: поисковый запрос по названию клиента
|
|
174
|
+
* - perPage: количество клиентов на странице (по умолчанию: 20)
|
|
175
|
+
* - maxPages: максимальное количество страниц для загрузки (по умолчанию: все)
|
|
176
|
+
*
|
|
177
|
+
* Пагинация:
|
|
178
|
+
* - По умолчанию загружаются все страницы
|
|
179
|
+
* - Можно ограничить через maxPages
|
|
180
|
+
*
|
|
181
|
+
* Progress stages:
|
|
182
|
+
* - fetch_clients: загрузка страниц со списком клиентов
|
|
183
|
+
* - parse_clients: парсинг списка клиентов
|
|
184
|
+
* - fetch_client_details: загрузка деталей каждого клиента
|
|
185
|
+
* - done: завершение работы
|
|
186
|
+
*
|
|
187
|
+
* @param filter - Опциональные параметры фильтрации
|
|
188
|
+
* @returns Массив клиентов с полной информацией
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* // Загрузить всех клиентов
|
|
192
|
+
* const clients = await parser.getClients();
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* // Поиск клиентов по запросу
|
|
196
|
+
* const clients = await parser.getClients({ query: 'Restaurant' });
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* // Ограничить количество страниц
|
|
200
|
+
* const clients = await parser.getClients({ maxPages: 2, perPage: 50 });
|
|
201
|
+
*/
|
|
202
|
+
async getClients(filter) {
|
|
203
|
+
const clients = await this.clientsService.fetchAndParseClients(filter);
|
|
204
|
+
this.report({ stage: 'done', message: 'Clients parsing completed' });
|
|
205
|
+
return clients;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
exports.IikoParser = IikoParser;
|
|
209
|
+
//# sourceMappingURL=iiko-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iiko-parser.js","sourceRoot":"","sources":["../src/iiko-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { IikoParser } from './iiko-parser';
|
|
2
|
+
export type { IikoParserOptions, InvoicesFilter, InvoiceData, CompanyProfile, ParserProgressEvent, ParserProgressCallback } from './types';
|
|
3
|
+
export type { ClientsFilter, ClientData } from './clients/clients.types';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IikoParser = void 0;
|
|
4
|
+
// Public API exports
|
|
5
|
+
var iiko_parser_1 = require("./iiko-parser");
|
|
6
|
+
Object.defineProperty(exports, "IikoParser", { enumerable: true, get: function () { return iiko_parser_1.IikoParser; } });
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qBAAqB;AACrB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface CompanyProfile {
|
|
2
|
+
companyName: string;
|
|
3
|
+
phone: string;
|
|
4
|
+
email: string;
|
|
5
|
+
partnerStatus: string;
|
|
6
|
+
masterPartner: {
|
|
7
|
+
company: string;
|
|
8
|
+
manager: string;
|
|
9
|
+
email: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=company-profile.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company-profile.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/company-profile.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company-profile.interface.js","sourceRoot":"","sources":["../../src/interfaces/company-profile.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/invoices/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
__exportStar(require("./invoices.service"), exports);
|
|
18
|
+
__exportStar(require("./invoices.fetcher"), exports);
|
|
19
|
+
__exportStar(require("./invoices.parser"), exports);
|
|
20
|
+
__exportStar(require("./invoices.filters"), exports);
|
|
21
|
+
__exportStar(require("./invoices.types"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/invoices/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,qDAAmC;AACnC,oDAAkC;AAClC,qDAAmC;AACnC,mDAAiC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { IikoSessionService } from '../core/session/iiko-session.service';
|
|
2
|
+
import { InvoicesFetchParams } from './invoices.types';
|
|
3
|
+
/**
|
|
4
|
+
* Сервис для загрузки HTML страниц из iiko Partner Portal.
|
|
5
|
+
*
|
|
6
|
+
* Выполняет HTTP GET запросы к различным endpoints портала:
|
|
7
|
+
* - AJAX endpoint для получения таблицы инвойсов
|
|
8
|
+
* - Modal endpoint для получения деталей конкретного инвойса
|
|
9
|
+
*
|
|
10
|
+
* Использует авторизованный HTTP клиент с cookies из IikoSessionService.
|
|
11
|
+
*/
|
|
12
|
+
export declare class InvoicesFetcher {
|
|
13
|
+
private readonly sessionService;
|
|
14
|
+
private readonly ajaxEndpoint;
|
|
15
|
+
private readonly modalEndpoint;
|
|
16
|
+
constructor(sessionService: IikoSessionService);
|
|
17
|
+
/**
|
|
18
|
+
* Выполняет HTTP GET запрос к AJAX endpoint iiko PP
|
|
19
|
+
* для получения HTML таблицы инвойсов.
|
|
20
|
+
*
|
|
21
|
+
* Использует уже авторизованный HTTP клиент с CookieJar.
|
|
22
|
+
* Не выполняет авторизацию и не валидирует сессию.
|
|
23
|
+
*
|
|
24
|
+
* Поддерживает пагинацию и кастомные query-параметры для фильтрации
|
|
25
|
+
* (searchBy, query и другие).
|
|
26
|
+
*
|
|
27
|
+
* @param params - Параметры пагинации (perPage, page)
|
|
28
|
+
* @param customParams - Дополнительные query-параметры (search_by, query, и т.д.)
|
|
29
|
+
* @returns HTML строку с таблицей инвойсов
|
|
30
|
+
*/
|
|
31
|
+
fetchInvoicesHtml(params?: InvoicesFetchParams, customParams?: Record<string, any>): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Загружает HTML модального окна с деталями инвойса
|
|
34
|
+
*/
|
|
35
|
+
fetchInvoiceModal(clientId: string, invoiceId: string): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Загружает HTML модального окна с деталями инвойса по прямому URL.
|
|
38
|
+
*
|
|
39
|
+
* URL обычно извлекается из поля `detailsUrl` объекта InvoiceData.
|
|
40
|
+
* Выполняет простой GET запрос без дополнительной обработки.
|
|
41
|
+
*
|
|
42
|
+
* Использует авторизованный HTTP клиент с CookieJar.
|
|
43
|
+
*
|
|
44
|
+
* @param url - Относительный или абсолютный URL модального окна
|
|
45
|
+
* @returns HTML строку с деталями инвойса (items, subscriptions)
|
|
46
|
+
*/
|
|
47
|
+
fetchInvoiceDetails(url: string): Promise<string>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=invoices.fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoices.fetcher.d.ts","sourceRoot":"","sources":["../../src/invoices/invoices.fetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAId,OAAO,CAAC,QAAQ,CAAC,cAAc;IAH3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiD;IAC9E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4C;gBAE7C,cAAc,EAAE,kBAAkB;IAE/D;;;;;;;;;;;;;OAaG;IACG,iBAAiB,CACrB,MAAM,CAAC,EAAE,mBAAmB,EAC5B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IA0DlB;;OAEG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC;IAkClB;;;;;;;;;;OAUG;IACG,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA0BxD"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvoicesFetcher = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Сервис для загрузки HTML страниц из iiko Partner Portal.
|
|
6
|
+
*
|
|
7
|
+
* Выполняет HTTP GET запросы к различным endpoints портала:
|
|
8
|
+
* - AJAX endpoint для получения таблицы инвойсов
|
|
9
|
+
* - Modal endpoint для получения деталей конкретного инвойса
|
|
10
|
+
*
|
|
11
|
+
* Использует авторизованный HTTP клиент с cookies из IikoSessionService.
|
|
12
|
+
*/
|
|
13
|
+
class InvoicesFetcher {
|
|
14
|
+
constructor(sessionService) {
|
|
15
|
+
this.sessionService = sessionService;
|
|
16
|
+
this.ajaxEndpoint = '/en/cabinet/invoices/get-for-customers-ajax';
|
|
17
|
+
this.modalEndpoint = '/en/cabinet/invoices/invoice-info.html';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Выполняет HTTP GET запрос к AJAX endpoint iiko PP
|
|
21
|
+
* для получения HTML таблицы инвойсов.
|
|
22
|
+
*
|
|
23
|
+
* Использует уже авторизованный HTTP клиент с CookieJar.
|
|
24
|
+
* Не выполняет авторизацию и не валидирует сессию.
|
|
25
|
+
*
|
|
26
|
+
* Поддерживает пагинацию и кастомные query-параметры для фильтрации
|
|
27
|
+
* (searchBy, query и другие).
|
|
28
|
+
*
|
|
29
|
+
* @param params - Параметры пагинации (perPage, page)
|
|
30
|
+
* @param customParams - Дополнительные query-параметры (search_by, query, и т.д.)
|
|
31
|
+
* @returns HTML строку с таблицей инвойсов
|
|
32
|
+
*/
|
|
33
|
+
async fetchInvoicesHtml(params, customParams) {
|
|
34
|
+
try {
|
|
35
|
+
const perPage = params?.perPage || 10;
|
|
36
|
+
const page = params?.page || 1;
|
|
37
|
+
// Получаем авторизованный клиент (сессия уже инициализирована)
|
|
38
|
+
const client = await this.sessionService.getAuthorizedClient();
|
|
39
|
+
// Объединяем параметры
|
|
40
|
+
const queryParams = {
|
|
41
|
+
perPage,
|
|
42
|
+
page,
|
|
43
|
+
...customParams,
|
|
44
|
+
};
|
|
45
|
+
// Выполняем GET запрос к AJAX endpoint
|
|
46
|
+
const response = await client.get(this.ajaxEndpoint, {
|
|
47
|
+
params: queryParams,
|
|
48
|
+
paramsSerializer: (params) => {
|
|
49
|
+
// Кастомный сериализатор для поддержки массивов в формате key[]=value
|
|
50
|
+
const parts = [];
|
|
51
|
+
Object.keys(params).forEach((key) => {
|
|
52
|
+
const value = params[key];
|
|
53
|
+
if (Array.isArray(value)) {
|
|
54
|
+
value.forEach((v) => {
|
|
55
|
+
parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(v)}`);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
return parts.join('&');
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
if (response.status !== 200) {
|
|
66
|
+
throw new Error(`AJAX endpoint вернул статус ${response.status}`);
|
|
67
|
+
}
|
|
68
|
+
const html = response.data;
|
|
69
|
+
if (typeof html !== 'string') {
|
|
70
|
+
throw new Error('AJAX endpoint вернул не HTML');
|
|
71
|
+
}
|
|
72
|
+
return html;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error(`❌ Ошибка при запросе таблицы инвойсов: ${error.message}`);
|
|
76
|
+
if (error.response) {
|
|
77
|
+
console.error(`HTTP статус: ${error.response.status}`);
|
|
78
|
+
}
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Загружает HTML модального окна с деталями инвойса
|
|
84
|
+
*/
|
|
85
|
+
async fetchInvoiceModal(clientId, invoiceId) {
|
|
86
|
+
try {
|
|
87
|
+
// Получаем авторизованный клиент (сессия уже инициализирована)
|
|
88
|
+
const client = await this.sessionService.getAuthorizedClient();
|
|
89
|
+
const response = await client.get(this.modalEndpoint, {
|
|
90
|
+
params: {
|
|
91
|
+
client_id: clientId,
|
|
92
|
+
invoice_id: invoiceId,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
if (response.status !== 200) {
|
|
96
|
+
throw new Error(`Modal endpoint вернул статус ${response.status}`);
|
|
97
|
+
}
|
|
98
|
+
const html = response.data;
|
|
99
|
+
if (typeof html !== 'string') {
|
|
100
|
+
throw new Error('Modal endpoint вернул не HTML');
|
|
101
|
+
}
|
|
102
|
+
return html;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error(`❌ Ошибка при загрузке модального окна (client=${clientId}, invoice=${invoiceId}): ${error.message}`);
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Загружает HTML модального окна с деталями инвойса по прямому URL.
|
|
111
|
+
*
|
|
112
|
+
* URL обычно извлекается из поля `detailsUrl` объекта InvoiceData.
|
|
113
|
+
* Выполняет простой GET запрос без дополнительной обработки.
|
|
114
|
+
*
|
|
115
|
+
* Использует авторизованный HTTP клиент с CookieJar.
|
|
116
|
+
*
|
|
117
|
+
* @param url - Относительный или абсолютный URL модального окна
|
|
118
|
+
* @returns HTML строку с деталями инвойса (items, subscriptions)
|
|
119
|
+
*/
|
|
120
|
+
async fetchInvoiceDetails(url) {
|
|
121
|
+
try {
|
|
122
|
+
// Получаем авторизованный клиент (сессия уже инициализирована)
|
|
123
|
+
const client = await this.sessionService.getAuthorizedClient();
|
|
124
|
+
const response = await client.get(url);
|
|
125
|
+
if (response.status !== 200) {
|
|
126
|
+
throw new Error(`Запрос к ${url} вернул статус ${response.status}`);
|
|
127
|
+
}
|
|
128
|
+
const html = response.data;
|
|
129
|
+
if (typeof html !== 'string') {
|
|
130
|
+
throw new Error('Endpoint вернул не HTML');
|
|
131
|
+
}
|
|
132
|
+
return html;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.error(`❌ Ошибка при загрузке деталей инвойса (${url}): ${error.message}`);
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.InvoicesFetcher = InvoicesFetcher;
|
|
141
|
+
//# sourceMappingURL=invoices.fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoices.fetcher.js","sourceRoot":"","sources":["../../src/invoices/invoices.fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Утилиты для работы с фильтрами и query-параметрами инвойсов.
|
|
3
|
+
*
|
|
4
|
+
* Формирует корректные параметры для AJAX endpoint iiko Partner Portal
|
|
5
|
+
* с учётом специфики API (массивы статусов, форматы дат, поисковые запросы).
|
|
6
|
+
*/
|
|
7
|
+
export declare class InvoicesFilters {
|
|
8
|
+
/**
|
|
9
|
+
* Конвертирует дату из формата YYYY-MM-DD в dd.mm.yyyy
|
|
10
|
+
* @param date - Дата в формате YYYY-MM-DD (например, "2026-01-15")
|
|
11
|
+
* @returns Дата в формате dd.mm.yyyy (например, "15.01.2026")
|
|
12
|
+
*/
|
|
13
|
+
convertDateFormat(date: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Формирует query параметры для фильтрации инвойсов.
|
|
16
|
+
*
|
|
17
|
+
* Конвертирует высокоуровневые параметры (год, месяц, статусы, поиск)
|
|
18
|
+
* в формат query-параметров, ожидаемый API iiko Partner Portal.
|
|
19
|
+
*
|
|
20
|
+
* Статусы передаются как массив с ключом `invoiceStatus[]`.
|
|
21
|
+
* Месяц форматируется как `YYYY-MM`.
|
|
22
|
+
*
|
|
23
|
+
* @param params - Параметры фильтрации
|
|
24
|
+
* @returns Объект с query-параметрами для axios
|
|
25
|
+
*/
|
|
26
|
+
buildFilterParams(params: {
|
|
27
|
+
year: number;
|
|
28
|
+
month: number;
|
|
29
|
+
statuses: string[];
|
|
30
|
+
page: number;
|
|
31
|
+
perPage: number;
|
|
32
|
+
searchBy?: string;
|
|
33
|
+
searchValue?: string;
|
|
34
|
+
}): Record<string, string | string[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Форматирует query параметры для axios
|
|
37
|
+
*/
|
|
38
|
+
formatForAxios(params: Record<string, string | string[]>): any;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=invoices.filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoices.filters.d.ts","sourceRoot":"","sources":["../../src/invoices/invoices.filters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAKvC;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,MAAM,EAAE;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAmCrC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG;CAe/D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvoicesFilters = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Утилиты для работы с фильтрами и query-параметрами инвойсов.
|
|
6
|
+
*
|
|
7
|
+
* Формирует корректные параметры для AJAX endpoint iiko Partner Portal
|
|
8
|
+
* с учётом специфики API (массивы статусов, форматы дат, поисковые запросы).
|
|
9
|
+
*/
|
|
10
|
+
class InvoicesFilters {
|
|
11
|
+
/**
|
|
12
|
+
* Конвертирует дату из формата YYYY-MM-DD в dd.mm.yyyy
|
|
13
|
+
* @param date - Дата в формате YYYY-MM-DD (например, "2026-01-15")
|
|
14
|
+
* @returns Дата в формате dd.mm.yyyy (например, "15.01.2026")
|
|
15
|
+
*/
|
|
16
|
+
convertDateFormat(date) {
|
|
17
|
+
const [year, month, day] = date.split('-');
|
|
18
|
+
return `${day}.${month}.${year}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Формирует query параметры для фильтрации инвойсов.
|
|
22
|
+
*
|
|
23
|
+
* Конвертирует высокоуровневые параметры (год, месяц, статусы, поиск)
|
|
24
|
+
* в формат query-параметров, ожидаемый API iiko Partner Portal.
|
|
25
|
+
*
|
|
26
|
+
* Статусы передаются как массив с ключом `invoiceStatus[]`.
|
|
27
|
+
* Месяц форматируется как `YYYY-MM`.
|
|
28
|
+
*
|
|
29
|
+
* @param params - Параметры фильтрации
|
|
30
|
+
* @returns Объект с query-параметрами для axios
|
|
31
|
+
*/
|
|
32
|
+
buildFilterParams(params) {
|
|
33
|
+
const { year, month, statuses, page, perPage, searchBy, searchValue } = params;
|
|
34
|
+
// Формируем месяц в формате YYYY-MM
|
|
35
|
+
const monthStr = month.toString().padStart(2, '0');
|
|
36
|
+
const monthValue = `${year}-${monthStr}`;
|
|
37
|
+
const queryParams = {
|
|
38
|
+
invoice_created_month_value: monthValue,
|
|
39
|
+
page: page.toString(),
|
|
40
|
+
perPage: perPage.toString(),
|
|
41
|
+
};
|
|
42
|
+
// Добавляем статусы как массив
|
|
43
|
+
if (statuses && statuses.length > 0) {
|
|
44
|
+
// Используем специальный ключ для массива
|
|
45
|
+
statuses.forEach((status) => {
|
|
46
|
+
const key = 'invoiceStatus[]';
|
|
47
|
+
if (Array.isArray(queryParams[key])) {
|
|
48
|
+
queryParams[key].push(status);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
queryParams[key] = [status];
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Добавляем параметры поиска если указаны
|
|
56
|
+
if (searchBy && searchValue) {
|
|
57
|
+
queryParams['search_by'] = searchBy;
|
|
58
|
+
queryParams['search'] = searchValue;
|
|
59
|
+
}
|
|
60
|
+
return queryParams;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Форматирует query параметры для axios
|
|
64
|
+
*/
|
|
65
|
+
formatForAxios(params) {
|
|
66
|
+
const result = {};
|
|
67
|
+
Object.keys(params).forEach((key) => {
|
|
68
|
+
const value = params[key];
|
|
69
|
+
if (Array.isArray(value)) {
|
|
70
|
+
// Для массивов axios нужен специальный формат
|
|
71
|
+
result[key] = value;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
result[key] = value;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.InvoicesFilters = InvoicesFilters;
|
|
81
|
+
//# sourceMappingURL=invoices.filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoices.filters.js","sourceRoot":"","sources":["../../src/invoices/invoices.filters.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,MAAa,eAAe;IAC1B;;;;OAIG;IACH,iBAAiB,CAAC,IAAY;QAC5B,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,GAAG,GAAG,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,MAQjB;QACC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAE/E,oCAAoC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC;QAEzC,MAAM,WAAW,GAAsC;YACrD,2BAA2B,EAAE,UAAU;YACvC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;YACrB,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;SAC5B,CAAC;QAEF,+BAA+B;QAC/B,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,0CAA0C;YAC1C,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1B,MAAM,GAAG,GAAG,iBAAiB,CAAC;gBAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACnC,WAAW,CAAC,GAAG,CAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,0CAA0C;QAC1C,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;YAC5B,WAAW,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;YACpC,WAAW,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC;QACtC,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAyC;QACtD,MAAM,MAAM,GAAQ,EAAE,CAAC;QAEvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,8CAA8C;gBAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AApFD,0CAoFC"}
|