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,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientsFetcher = void 0;
4
+ /**
5
+ * Сервис для загрузки HTML страниц клиентов из iiko Partner Portal.
6
+ *
7
+ * Выполняет HTTP GET запросы к endpoints:
8
+ * - AJAX endpoint для получения списка клиентов
9
+ * - Страница профиля клиента для получения деталей
10
+ *
11
+ * Использует авторизованный HTTP клиент с cookies из IikoSessionService.
12
+ */
13
+ class ClientsFetcher {
14
+ constructor(sessionService) {
15
+ this.sessionService = sessionService;
16
+ this.clientsListEndpoint = '/en/cabinet/ajax/clients-list.html';
17
+ this.clientAreaEndpoint = '/en/cabinet/client-area/index.html';
18
+ this.cloudAllocationEndpoint = '/en/cabinet/client-area/licenses/cloud-mapping.html';
19
+ this.saasAllocationEndpoint = '/en/cabinet/client-area/licenses/saas-mapping.html';
20
+ }
21
+ /**
22
+ * Выполняет HTTP GET запрос к AJAX endpoint для получения списка клиентов.
23
+ *
24
+ * Endpoint: GET /en/cabinet/ajax/clients-list.html
25
+ *
26
+ * Параметры запроса:
27
+ * - query: поисковая строка (фильтрует клиентов по имени или UID на сервере)
28
+ * - perPage: количество клиентов на странице (по умолчанию: 10)
29
+ * - page: номер страницы (по умолчанию: 1)
30
+ *
31
+ * Возвращаемый HTML содержит:
32
+ * - Полную HTML страницу с <div id="clientsTable_ajax"> (первый запрос)
33
+ * - ИЛИ только <tbody class="ajax"> фрагмент (последующие AJAX запросы)
34
+ *
35
+ * Предусловия:
36
+ * - Сессия должна быть инициализирована через sessionService.ensureSession()
37
+ * - HTTP клиент уже содержит валидные cookies
38
+ *
39
+ * @param params Опциональные параметры запроса (query, perPage, page)
40
+ * @returns Promise с HTML строкой со списком клиентов
41
+ * @throws Error если запрос вернул ошибку или невалидный ответ
42
+ */
43
+ async fetchClientsHtml(params) {
44
+ try {
45
+ const perPage = params?.perPage || 10;
46
+ const page = params?.page || 1;
47
+ // Получаем авторизованный клиент (сессия уже инициализирована)
48
+ const client = await this.sessionService.getAuthorizedClient();
49
+ // Формируем параметры запроса
50
+ const queryParams = {
51
+ perPage,
52
+ page,
53
+ };
54
+ if (params?.query) {
55
+ queryParams.query = params.query;
56
+ }
57
+ // Выполняем GET запрос к AJAX endpoint
58
+ const response = await client.get(this.clientsListEndpoint, {
59
+ params: queryParams,
60
+ });
61
+ if (response.status !== 200) {
62
+ throw new Error(`AJAX endpoint returned status ${response.status}`);
63
+ }
64
+ const html = response.data;
65
+ if (typeof html !== 'string') {
66
+ throw new Error('AJAX endpoint returned non-HTML response');
67
+ }
68
+ return html;
69
+ }
70
+ catch (error) {
71
+ console.error(`❌ Error fetching clients list: ${error.message}`);
72
+ if (error.response) {
73
+ console.error(`HTTP status: ${error.response.status}`);
74
+ }
75
+ throw error;
76
+ }
77
+ }
78
+ /**
79
+ * Загружает HTML страницу профиля конкретного клиента.
80
+ *
81
+ * Endpoint: GET /en/cabinet/client-area/index.html?clientId=XXX
82
+ *
83
+ * Возвращаемый HTML содержит:
84
+ * - UUID клиента (в кнопке "UID: XXX-XXX-XXX")
85
+ * - Версию iiko (в кнопке "Version iiko: X.X.XXXX")
86
+ * - Контактную информацию (email, phone в таблице)
87
+ * - Юридические данные (Legal entity и Company tax id в таблице)
88
+ * - Информацию о лицензиях и хостинге
89
+ *
90
+ * Предусловия:
91
+ * - Сессия должна быть инициализирована
92
+ * - Пользователь должен иметь доступ к данному clientId
93
+ *
94
+ * @param clientId ID клиента (целочисленный идентификатор)
95
+ * @returns Promise с HTML строкой страницы профиля клиента
96
+ * @throws Error если запрос вернул ошибку или клиент не найден
97
+ */
98
+ async fetchClientProfile(clientId) {
99
+ try {
100
+ const client = await this.sessionService.getAuthorizedClient();
101
+ const response = await client.get(this.clientAreaEndpoint, {
102
+ params: { clientId },
103
+ });
104
+ if (response.status !== 200) {
105
+ throw new Error(`Client profile endpoint returned status ${response.status}`);
106
+ }
107
+ const html = response.data;
108
+ if (typeof html !== 'string') {
109
+ throw new Error('Client profile endpoint returned non-HTML response');
110
+ }
111
+ return html;
112
+ }
113
+ catch (error) {
114
+ console.error(`❌ Error fetching client profile ${clientId}: ${error.message}`);
115
+ throw error;
116
+ }
117
+ }
118
+ /**
119
+ * Загружает HTML страницу Cloud license allocation для chain.
120
+ *
121
+ * Endpoint: GET /en/cabinet/client-area/licenses/cloud-mapping.html?clientId=XXX
122
+ *
123
+ * Эта страница содержит таблицу "Store of the chain" с членами chain и их Cloud лицензиями.
124
+ * Каждая строка таблицы содержит:
125
+ * - Имя клиента (ссылка на client-area)
126
+ * - Input поле с количеством выделенных Cloud лицензий
127
+ *
128
+ * Предусловия:
129
+ * - Сессия должна быть инициализирована
130
+ * - clientId должен быть Chain (иметь Cloud license allocation)
131
+ *
132
+ * @param clientId ID chain для загрузки allocation
133
+ * @returns Promise с HTML строкой страницы cloud allocation
134
+ * @throws Error если запрос вернул ошибку или клиент не chain
135
+ */
136
+ async fetchCloudAllocationHtml(clientId) {
137
+ try {
138
+ const client = await this.sessionService.getAuthorizedClient();
139
+ const response = await client.get(this.cloudAllocationEndpoint, {
140
+ params: { clientId },
141
+ });
142
+ if (response.status !== 200) {
143
+ throw new Error(`Cloud allocation endpoint returned status ${response.status}`);
144
+ }
145
+ const html = response.data;
146
+ if (typeof html !== 'string') {
147
+ throw new Error('Cloud allocation endpoint returned non-HTML response');
148
+ }
149
+ return html;
150
+ }
151
+ catch (error) {
152
+ console.error(`❌ Error fetching cloud allocation for ${clientId}: ${error.message}`);
153
+ throw error;
154
+ }
155
+ }
156
+ /**
157
+ * Загружает HTML страницу SaaS license allocation для chain.
158
+ *
159
+ * Endpoint: GET /en/cabinet/client-area/licenses/saas-mapping.html?clientId=XXX
160
+ *
161
+ * Эта страница содержит таблицу "Store of the chain" с членами chain и их SaaS лицензиями.
162
+ * Каждая строка таблицы содержит:
163
+ * - Имя клиента (ссылка на client-area)
164
+ * - Input поле с количеством выделенных SaaS лицензий
165
+ *
166
+ * Предусловия:
167
+ * - Сессия должна быть инициализирована
168
+ * - clientId должен быть Chain (иметь SaaS license allocation)
169
+ *
170
+ * @param clientId ID chain для загрузки allocation
171
+ * @returns Promise с HTML строкой страницы saas allocation
172
+ * @throws Error если запрос вернул ошибку или клиент не chain
173
+ */
174
+ async fetchSaasAllocationHtml(clientId) {
175
+ try {
176
+ const client = await this.sessionService.getAuthorizedClient();
177
+ const response = await client.get(this.saasAllocationEndpoint, {
178
+ params: { clientId },
179
+ });
180
+ if (response.status !== 200) {
181
+ throw new Error(`SaaS allocation endpoint returned status ${response.status}`);
182
+ }
183
+ const html = response.data;
184
+ if (typeof html !== 'string') {
185
+ throw new Error('SaaS allocation endpoint returned non-HTML response');
186
+ }
187
+ return html;
188
+ }
189
+ catch (error) {
190
+ console.error(`❌ Error fetching saas allocation for ${clientId}: ${error.message}`);
191
+ throw error;
192
+ }
193
+ }
194
+ }
195
+ exports.ClientsFetcher = ClientsFetcher;
196
+ //# sourceMappingURL=clients.fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.fetcher.js","sourceRoot":"","sources":["../../src/clients/clients.fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { ClientListItem, ClientData, AllocationMember } from './clients.types';
2
+ export declare class ClientsParser {
3
+ /**
4
+ * Парсит HTML таблицу со списком клиентов.
5
+ *
6
+ * Поддерживает две структуры HTML:
7
+ * 1. Полный HTML с контейнером #clientsTable_ajax (используется на странице /en/cabinet/clients.html)
8
+ * 2. AJAX фрагмент только с <tbody class="ajax"> (используется в AJAX endpoint /en/cabinet/ajax/clients-list.html)
9
+ *
10
+ * Из каждой строки таблицы извлекает:
11
+ * - name: название клиента (текст из ссылки <a>)
12
+ * - clientId: идентификатор клиента (из href ?clientId=XXX)
13
+ * - shortName: краткое название (опционально, из <div class="small mt-2">)
14
+ *
15
+ * @param html HTML контент от /en/cabinet/ajax/clients-list.html или полная страница
16
+ * @returns Массив объектов с базовой информацией о клиентах
17
+ */
18
+ parseClientsTable(html: string): ClientListItem[];
19
+ /**
20
+ * Извлекает общее количество страниц из HTML пагинации.
21
+ *
22
+ * Основной способ:
23
+ * - Ищет все элементы пагинации: '.pagination a.page-link[data-page]'
24
+ * - Находит максимальное значение атрибута data-page
25
+ * - Возвращает его как totalPages
26
+ *
27
+ * Резервный способ (fallback):
28
+ * - Если пагинация отсутствует, ищет '.pagination-total'
29
+ * - Извлекает общее количество записей из текста
30
+ * - Вычисляет totalPages = Math.ceil(totalEntries / perPage)
31
+ *
32
+ * @param html HTML контент страницы со списком клиентов
33
+ * @param perPage Количество элементов на странице (для расчета fallback)
34
+ * @returns Общее количество страниц или 1, если определить не удалось
35
+ */
36
+ parseTotalPages(html: string, perPage: number): number;
37
+ /**
38
+ * Парсит HTML страницу профиля клиента.
39
+ *
40
+ * Извлекает детальную информацию о клиенте со страницы /en/cabinet/client-area/index.html?clientId=XXX:
41
+ *
42
+ * - uuid: Уникальный идентификатор (UID) из кнопки "UID: XXX-XXX-XXX"
43
+ * - iikoVersion: Версия iiko из кнопки "Version iiko: X.X.XXXX"
44
+ * - email: Email из таблицы (строка "E-mail")
45
+ * - phone: Телефон из таблицы (строка "Phone")
46
+ * - address: Адрес из таблицы (строка "Address")
47
+ * - legalEntity: Название юридического лица (из строки "Legal entity", убираются кавычки «»)
48
+ * - tin: ИНН (Company tax id, только цифры)
49
+ *
50
+ * Нормализация данных:
51
+ * - UUID: возвращается как есть (формат: XXX-XXX-XXX)
52
+ * - TIN: удаляются все нечисловые символы (пробелы, дефисы и т.д.)
53
+ * - Legal Entity: удаляются внешние кавычки «», экранированные кавычки \" заменяются на "
54
+ *
55
+ * @param html HTML контент страницы профиля клиента
56
+ * @param clientId ID клиента для логирования ошибок
57
+ * @param name Имя клиента для включения в результат
58
+ * @returns Объект ClientData со всей информацией о клиенте или null при ошибке парсинга
59
+ */
60
+ parseClientProfile(html: string, clientId: string, name: string): ClientData | null;
61
+ /**
62
+ * Нормализует строку с названием юридического лица.
63
+ *
64
+ * Выполняет следующие преобразования:
65
+ * 1. Удаляет внешние кавычки-ёлочки («»)
66
+ * 2. Заменяет экранированные кавычки \" на обычные "
67
+ * 3. Удаляет лишние пробелы в начале и конце
68
+ *
69
+ * Примеры:
70
+ * - «ООО \"AEF GROUP\"» → ООО "AEF GROUP"
71
+ * - «ИП Иванов» → ИП Иванов
72
+ *
73
+ * @param text Исходная строка с названием юридического лица
74
+ * @returns Нормализованная строка или undefined, если входные данные пусты
75
+ */
76
+ private normalizeLegalEntity;
77
+ /**
78
+ * Извлекает ИНН (Tax Identification Number) из текста.
79
+ *
80
+ * Ищет последовательность цифр в тексте и удаляет все нечисловые символы
81
+ * (пробелы, дефисы, точки и т.д.), оставляя только цифры.
82
+ *
83
+ * Примеры:
84
+ * - "304 467 088" → "304467088"
85
+ * - "12-34-567890" → "1234567890"
86
+ * - "123.456.789" → "123456789"
87
+ *
88
+ * @param text Исходная строка с ИНН
89
+ * @returns Строка, содержащая только цифры, или undefined, если ИНН не найден
90
+ */
91
+ private extractTin;
92
+ /**
93
+ * Определяет, является ли клиент Chain (группой компаний).
94
+ *
95
+ * Chain определяется наличием хотя бы одной из кнопок на странице client-area:
96
+ * - "Cloud license allocation"
97
+ * - "SaaS license allocation"
98
+ *
99
+ * Эти кнопки ведут на:
100
+ * - /client-area/licenses/cloud-mapping.html
101
+ * - /client-area/licenses/saas-mapping.html
102
+ *
103
+ * Метод ищет ссылки (<a>) содержащие эти пути в атрибуте href.
104
+ *
105
+ * @param html HTML контент страницы client-area
106
+ * @returns true если клиент является Chain, иначе false
107
+ */
108
+ detectIsChain(html: string): boolean;
109
+ /**
110
+ * Парсит HTML страницу allocation (cloud или saas).
111
+ *
112
+ * Извлекает членов chain из JSON данных в атрибуте data-template-params.
113
+ *
114
+ * Структура JSON:
115
+ * - tps: массив торговых точек (members chain)
116
+ * - mapping: распределение лицензий по продуктам
117
+ *
118
+ * Каждый элемент tps содержит:
119
+ * - id: внутренний ID
120
+ * - obfuscated_id: ID для URL (используется как clientId)
121
+ * - name: название торговой точки
122
+ * - link: ссылка на профиль (/client-area/index.html?clientId=XXX)
123
+ *
124
+ * Mapping содержит количество лицензий по формуле:
125
+ * mapping[productId][date][firmId][tpId] = количество
126
+ *
127
+ * Для подсчёта allocation суммируются все значения для каждого tp.
128
+ *
129
+ * @param html HTML контент страницы cloud-mapping или saas-mapping
130
+ * @returns Массив AllocationMember с информацией о членах и их allocation
131
+ */
132
+ parseAllocationPage(html: string): AllocationMember[];
133
+ /**
134
+ * Legacy метод парсинга allocation через HTML таблицу.
135
+ *
136
+ * Используется как fallback если JSON парсинг не сработал.
137
+ * Ищет таблицу с членами chain и input полями с allocation.
138
+ *
139
+ * @param html HTML контент страницы allocation
140
+ * @returns Массив AllocationMember
141
+ */
142
+ private parseAllocationPageLegacy;
143
+ }
144
+ //# sourceMappingURL=clients.parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.parser.d.ts","sourceRoot":"","sources":["../../src/clients/clients.parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE/E,qBAAa,aAAa;IACxB;;;;;;;;;;;;;;OAcG;IACI,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE;IAoCxD;;;;;;;;;;;;;;;;OAgBG;IACI,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAkC7D;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAiG1F;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,UAAU;IAalB;;;;;;;;;;;;;;;OAeG;IACI,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAsB3C;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAwF5D;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;CAiDlC"}