@andrey4emk/npm-app-back-b24 2.0.1 → 2.0.2

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/README.md CHANGED
@@ -7,11 +7,14 @@
7
7
  - [Установка](#установка)
8
8
  - [Использование](#использование)
9
9
  - [API](#api)
10
- - [OAuth функции](#oauth-функции)
11
- - [Утилиты](#утилиты)
10
+ - [Bitrix24 OAuth](#bitrix24-oauth)
11
+ - [Задачи ошибок](#задачи-ошибок)
12
12
  - [События](#события)
13
13
  - [ChatApp](#chatapp)
14
14
  - [Smsgold](#smsgold)
15
+ - [Email](#email)
16
+ - [Wappi](#wappi)
17
+ - [Логирование](#логирование)
15
18
  - [Переменные окружения](#переменные-окружения)
16
19
  - [Скрипты](#скрипты)
17
20
  - [Лицензия](#лицензия)
@@ -25,72 +28,91 @@ npm install @andrey4emk/npm-app-back-b24
25
28
  ## Использование
26
29
 
27
30
  ```js
28
- import { create, refresh, save, errTask, Event } from "@andrey4emk/npm-app-back-b24";
29
- import { chatApp, smsgold } from "@andrey4emk/npm-app-back-b24";
30
- import { AuthB24Model } from "./models/AuthB24.js"; // пример модели
31
-
32
- // OAuth функции
33
- const b24Client = await create(AuthB24Model);
34
- const refreshResult = await refresh(AuthB24Model);
35
-
36
- app.post("/b24/auth", (req, res) => save(req, res, AuthB24Model));
31
+ import {
32
+ $b24,
33
+ saveAuthB24Handler,
34
+ refreshAndSaveTokens,
35
+ errorB24,
36
+ event,
37
+ Event,
38
+ ChatApp,
39
+ Smsgold,
40
+ Email,
41
+ Wappi,
42
+ logs,
43
+ } from "@andrey4emk/npm-app-back-b24";
44
+
45
+ // $b24 — готовый экземпляр B24OAuth (или null, если токены не настроены)
46
+ if ($b24) {
47
+ const result = await $b24.callMethod("crm.contact.list", { limit: 5 });
48
+ }
49
+
50
+ // HTTP-обработчик для сохранения токенов с фронта
51
+ app.post("/b24/auth", saveAuthB24Handler);
52
+
53
+ // Обновление токенов вручную
54
+ const refreshResult = await refreshAndSaveTokens();
37
55
 
38
56
  // Создание служебной задачи при ошибке
39
- await errTask(b24Client, {
57
+ await errorB24({
40
58
  title: "Ошибка синхронизации",
41
59
  description: "Детали ошибки здесь",
60
+ ufCrmTask: ["D_5"],
42
61
  });
43
62
 
44
- // Работа с событиями
45
- const eventHandler = new Event(b24Client);
46
- const { error, events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
63
+ // Работа с событиями (готовый экземпляр, или null если $b24 не инициализирован)
64
+ if (event) {
65
+ const { error, data } = await event.get("ONCRMDYNAMICITEMUPDATE_149");
66
+ }
47
67
 
48
- // Работа с ChatApp
49
- await chatApp.makeTokenChatApp();
50
- const result = await chatApp.sendMessageChatApp("whatsApp", {
68
+ // ChatApp создаёте экземпляр самостоятельно
69
+ const chatApp = new ChatApp(makeParam, authParam, typeParam);
70
+ await chatApp.sendMessageChatApp("whatsApp", {
51
71
  phone: "+1234567890",
52
72
  message: "Привет!",
53
73
  });
54
74
 
55
- // Работа с SMSGold
56
- await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
57
- ```
75
+ // Smsgold создаёте экземпляр самостоятельно
76
+ const smsClient = new Smsgold({ user: "login", pass: "password" });
77
+ await smsClient.sendSms({ phone: "+79990000000", message: "Привет!" });
58
78
 
59
- ## API
79
+ // Email — создаёте экземпляр самостоятельно
80
+ const emailClient = new Email({ user: "email@yandex.ru", pass: "app-password" });
81
+ await emailClient.send({ to: "dest@mail.ru", subject: "Тема", text: "Текст" });
60
82
 
61
- ### OAuth функции
83
+ // Wappi — создаёте экземпляр самостоятельно
84
+ const wappi = new Wappi(maxAuth, telegaAuth, whatsAppAuth);
85
+ await wappi.sendMessageWappi("whatsApp", { phone: "+1234567890", message: "Привет!" });
62
86
 
63
- - **`create(AuthB24Model)`** — создаёт клиента `B24OAuth` с использованием сохранённых в БД токенов.
87
+ // Логирование
88
+ logs.add("Сообщение", "info");
89
+ ```
64
90
 
65
- - **Параметры:**
66
- - `AuthB24Model` (Sequelize Model) — модель для получения данных авторизации из БД.
67
- - **Возвращает:** промис с экземпляром `B24OAuth`, готовым к вызовам REST API.
68
- - **Ошибки:** выбрасывает `Error` если запись авторизации не найдена в БД.
91
+ ## API
69
92
 
70
- ```js
71
- const b24 = await create(AuthB24Model);
72
- const result = await b24.callMethod("crm.contact.list", { limit: 5 });
73
- ```
93
+ ### Bitrix24 OAuth
74
94
 
75
- - **`refresh(AuthB24Model)`** продлевает токены через Bitrix24 и обновляет запись в БД.
95
+ Модуль работает с токенами через файл `authB24.json` (используется библиотека `conf`). Модель БД не требуется.
76
96
 
77
- - **Параметры:**
78
- - `AuthB24Model` (Sequelize Model) — модель для обновления токенов.
79
- - **Возвращает:** промис с объектом `{ error: boolean, message: string }`.
97
+ - **`$b24`** — готовый экземпляр `B24OAuth`, создаётся автоматически при импорте на основе сохранённых токенов. Если данные авторизации отсутствуют — `null`.
80
98
 
81
99
  ```js
82
- const result = await refresh(AuthB24Model);
83
- if (!result.error) {
84
- console.log("Токены обновлены:", result.message);
100
+ import { $b24 } from "@andrey4emk/npm-app-back-b24";
101
+
102
+ if ($b24) {
103
+ const result = await $b24.callMethod("crm.contact.list", { limit: 5 });
85
104
  }
86
105
  ```
87
106
 
88
- - **`save(req, res, AuthB24Model)`** — HTTP-обработчик для сохранения набора токенов из `req.body`.
107
+ **Особенности:**
108
+ - При обновлении токенов SDK автоматически сохраняет их в файл через callback `setCallbackRefreshAuth`.
109
+ - Окружение (`DEV`/`PROD`) определяется переменной `APP_ENV` — от неё зависят используемые `CLIENT_ID`/`CLIENT_SECRET`.
110
+
111
+ - **`saveAuthB24Handler(req, res)`** — HTTP-обработчик для сохранения набора токенов из `req.body`.
89
112
 
90
113
  - **Параметры:**
91
114
  - `req` (Express Request) — объект запроса с полем `body`.
92
115
  - `res` (Express Response) — объект ответа.
93
- - `AuthB24Model` (Sequelize Model) — модель для сохранения.
94
116
  - **Тело запроса (req.body):**
95
117
  ```json
96
118
  {
@@ -98,18 +120,35 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
98
120
  "refresh_token": "string",
99
121
  "domain": "string",
100
122
  "expires_in": "number",
101
- "member_id": "number"
123
+ "member_id": "string"
102
124
  }
103
125
  ```
104
126
  - **Возвращает:** HTTP-ответ с JSON `{ status, message }` (код `201` при успехе, `400`/`500` при ошибках).
105
127
 
106
128
  ```js
107
- app.post("/b24/auth", (req, res) => save(req, res, AuthB24Model));
129
+ app.post("/b24/auth", saveAuthB24Handler);
108
130
  ```
109
131
 
110
- ### Утилиты
132
+ - **`refreshAndSaveTokens()`** — обновляет токены из текущего экземпляра `$b24` и сохраняет в файл.
133
+
134
+ - **Возвращает:** промис с объектом `{ error: boolean, message: string }`.
135
+
136
+ ```js
137
+ const result = await refreshAndSaveTokens();
138
+ if (!result.error) {
139
+ console.log("Токены обновлены:", result.message);
140
+ }
141
+ ```
142
+
143
+ - **`saveTokens(authData)`** — низкоуровневая функция для прямого сохранения токенов в файл.
144
+
145
+ - **Параметры:**
146
+ - `authData` (AuthData) — объект с полями `access_token`, `refresh_token`, `domain`, `expires_in`, `member_id`, `expires`.
147
+ - **Возвращает:** объект `{ error: boolean, message: string }`.
111
148
 
112
- - **`errTask(b24, dataTask)`** — создаёт служебную задачу в Bitrix24 при ошибках/событиях.
149
+ ### Задачи ошибок
150
+
151
+ - **`errorB24(dataTask)`** — создаёт служебную задачу в Bitrix24 при ошибках/событиях. Использует глобальный `$b24`.
113
152
 
114
153
  - **Алгоритм:**
115
154
 
@@ -118,15 +157,14 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
118
157
 
119
158
  - **Параметры:**
120
159
 
121
- - `b24` (B24OAuth) — экземпляр клиента Bitrix24.
122
- - `dataTask` (object) — объект с параметрами задачи (см. ниже).
160
+ - `dataTask` (ErrorTaskData) — объект с параметрами задачи (см. ниже).
123
161
 
124
162
  - **Возвращает:** промис с объектом:
125
163
  ```js
126
164
  {
127
165
  error: false,
128
166
  message: "Задача создана в Битрикс24.",
129
- result: { /* API response */ }
167
+ data: { /* API response */ }
130
168
  }
131
169
  ```
132
170
  или при превышении лимита:
@@ -143,167 +181,177 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
143
181
  message: "Не удалось создать задачу в Битрикс24: <текст ошибки>"
144
182
  }
145
183
  ```
184
+ или если `$b24` не инициализирован:
185
+ ```js
186
+ {
187
+ error: true,
188
+ message: "$b24 не инициализирован"
189
+ }
190
+ ```
146
191
 
147
- **Параметры `dataTask`:**
148
-
149
- | Параметр | Тип | По умолчанию | Описание |
150
- | ---------------- | ------------ | ------------------------- | --------------------------------------------- |
151
- | `title` | string | **обязательно** | Заголовок задачи |
152
- | `description` | string | `""` | Описание задачи |
153
- | `createdBy` | number | `138` | ID создателя |
154
- | `responsibleId` | number | `1` | ID ответственного |
155
- | `deadline` | ISO string | `DateTime.now() + 1 день` | Дедлайн в ISO формате |
156
- | `groupId` | number\|null | `null` | ID группы (опционально) |
157
- | `accomplices` | array | `[]` | Массив ID соисполнителей |
158
- | `maxTasks` | number | `100` | Максимум существующих задач с таким названием |
159
- | `entityTypeAbbr` | string | `""` | Код CRM сущности для `UF_CRM_TASK` |
192
+ **Параметры `dataTask` (ErrorTaskData):**
193
+
194
+ | Параметр | Тип | По умолчанию | Описание |
195
+ | ---------------- | ---------------- | ------------------------- | ---------------------------------------------- |
196
+ | `title` | string | **обязательно** | Заголовок задачи |
197
+ | `description` | string | `""` | Описание задачи |
198
+ | `createdBy` | number | `138` | ID создателя |
199
+ | `responsibleId` | number | `1` | ID ответственного |
200
+ | `deadline` | ISO string | `DateTime.now() + 1 день` | Дедлайн в ISO формате |
201
+ | `groupId` | number\|null | `null` | ID группы (опционально) |
202
+ | `accomplices` | number[] | `[]` | Массив ID соисполнителей |
203
+ | `maxTasks` | number | `100` | Максимум существующих задач с таким названием |
204
+ | `ufCrmTask` | string\|string[] | `""` | Значение для `UF_CRM_TASK` (массив или строка) |
205
+ | `entityTypeAbbr` | string | `""` | ~~Устаревший~~ Используйте `ufCrmTask` |
160
206
 
161
207
  ```js
162
- await errTask(b24, {
208
+ await errorB24({
163
209
  title: "Ошибка синхронизации",
164
210
  description: "Не удалось подключиться к API",
165
211
  responsibleId: 42,
166
212
  deadline: new Date(Date.now() + 2 * 24 * 60 * 60 * 1000).toISOString(),
167
213
  maxTasks: 50,
214
+ ufCrmTask: ["D_5", "C_10"],
168
215
  });
169
216
  ```
170
217
 
218
+ - **`checkB24Scope()`** — проверяет и логирует права (скоупы) приложения Bitrix24. Вызывается автоматически при старте, если `$b24` инициализирован.
219
+
171
220
  ### События
172
221
 
173
- - **`Event`** — класс для работы с офлайн-событиями Bitrix24.
222
+ - **`event`** — готовый экземпляр класса `Event` (или `null`, если `$b24` не инициализирован). Создаётся автоматически при импорте.
223
+
224
+ ```js
225
+ import { event } from "@andrey4emk/npm-app-back-b24";
226
+
227
+ if (event) {
228
+ const result = await event.get("ONCRMDYNAMICITEMUPDATE_149");
229
+ }
230
+ ```
231
+
232
+ - **`Event`** — класс для работы с офлайн-событиями Bitrix24. Можно создать свой экземпляр, передав `B24OAuth`.
174
233
 
175
234
  ```js
176
235
  import { Event } from "@andrey4emk/npm-app-back-b24";
177
236
 
178
- const eventHandler = new Event(b24);
237
+ const myEvent = new Event(b24Instance);
179
238
  ```
180
239
 
181
240
  **Методы:**
182
241
 
183
- - **`get(eventName)`** — получить события по названию.
242
+ - **`get(eventName)`** — получить офлайн-события по названию.
184
243
 
185
244
  - **Параметры:**
186
245
 
187
- - `eventName` (string) — название события (например, `'ONCRMDYNAMICITEMUPDATE_149'`).
246
+ - `eventName` (string) — название события (например, `'ONCRMDYNAMICITEMUPDATE_149'` или `'ONIMCONNECTORMESSAGEADD'`).
247
+
248
+ - **Возвращает:** промис с объектом `{ error, message, data }`.
188
249
 
189
- - **Возвращает:** промис с объектом:
250
+ Для событий сущностей (сделки, смарт-процессы):
190
251
 
191
252
  ```js
192
253
  {
193
254
  error: false,
194
- events: {
255
+ message: "События получены",
256
+ data: {
195
257
  processId: "12345",
196
- entitysId: [101, 102, 103],
258
+ entitysId: ["101", "102", "103"],
197
259
  arrMessageIdAndEntityId: [
198
- { messageId: "msg_1", entityId: 101 },
199
- { messageId: "msg_2", entityId: 102 },
200
- { messageId: "msg_3", entityId: 103 }
260
+ { messageId: "msg_1", entityId: "101" },
261
+ { messageId: "msg_2", entityId: "102" }
201
262
  ]
202
263
  }
203
264
  }
204
265
  ```
205
266
 
206
- или при ошибке:
267
+ Для событий коннектора (`ONIMCONNECTORMESSAGEADD`):
207
268
 
208
269
  ```js
209
270
  {
210
- error: true,
211
- status: "error",
212
- message: "Не удалось получить события. <текст ошибки>"
271
+ error: false,
272
+ message: "События коннектора получены",
273
+ data: {
274
+ processId: "12345",
275
+ message: [
276
+ {
277
+ connectorId: "...",
278
+ lineId: "...",
279
+ chatId: "...",
280
+ text: "Текст сообщения",
281
+ file: null,
282
+ attachments: null,
283
+ im: null
284
+ }
285
+ ]
286
+ }
213
287
  }
214
288
  ```
215
289
 
216
- - **Особенности:**
217
- - Автоматически фильтрует и удаляет события от пользователя с `user_id: '138'`.
218
- - Если событий нет, возвращает `events` с пустыми массивами.
219
-
220
- ```js
221
- const { error, events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
222
- if (!error && events.entitysId.length > 0) {
223
- console.log("Обработанные ID сущностей:", events.entitysId);
224
- // events.processId — идентификатор процесса для очистки
225
- // events.arrMessageIdAndEntityId — данные для методов clear() и deleteMessageId()
226
- }
227
- ```
228
-
229
- - **`clear(processId, messageId)`** — очистить события в Bitrix24.
230
-
231
- - **Параметры:**
232
-
233
- - `processId` (string|number) — ID процесса (получен из `get()`).
234
- - `messageId` (array|string) — ID или массив ID сообщений для очистки.
235
-
236
- - **Возвращает:** промис с объектом:
237
- ```js
238
- {
239
- error: false;
240
- }
241
- ```
242
290
  или при ошибке:
291
+
243
292
  ```js
244
293
  {
245
294
  error: true,
246
- status: "error",
247
- message: "Не удалось очистить события. <текст ошибки>"
295
+ message: "Не удалось получить события. <текст ошибки>",
296
+ data: null
248
297
  }
249
298
  ```
250
299
 
300
+ - **Особенности:**
301
+ - Автоматически фильтрует и удаляет события от системного пользователя (`user_id: '138'`).
302
+ - Для коннекторных событий конвертирует файлы в формат с типами `image`, `video`, `document`.
303
+ - Если событий нет, возвращает `data` с пустыми массивами.
304
+
251
305
  ```js
252
- const { events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
253
- if (events.processId) {
254
- const messageIds = events.arrMessageIdAndEntityId.map((item) => item.messageId);
255
- await eventHandler.clear(events.processId, messageIds);
306
+ const { error, data } = await event.get("ONCRMDYNAMICITEMUPDATE_149");
307
+ if (!error && data.entitysId.length > 0) {
308
+ console.log("Обработанные ID сущностей:", data.entitysId);
256
309
  }
257
310
  ```
258
311
 
259
- - **`deleteMessageId(entityId, arrMessageIdAndEntityId)`** — удалить запись события из массива (локально).
312
+ - **`clear(processId, messageId?)`** — очистить обработанные офлайн-события в Bitrix24.
260
313
 
261
314
  - **Параметры:**
262
315
 
263
- - `entityId` (number) — ID сущности для удаления.
264
- - `arrMessageIdAndEntityId` (array) — исходный массив событий.
316
+ - `processId` (string) — ID процесса (получен из `get()`).
317
+ - `messageId` (string|string[]) — опциональный ID или массив ID сообщений для очистки.
265
318
 
266
- - **Возвращает:** обновлённый массив без записей с указанным `entityId`.
319
+ - **Возвращает:** промис с объектом `{ error, message, data }`.
267
320
 
268
321
  ```js
269
- const { events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
270
- const updated = eventHandler.deleteMessageId(101, events.arrMessageIdAndEntityId);
271
- // updated содержит все события, кроме entityId: 101
322
+ const { data } = await event.get("ONCRMDYNAMICITEMUPDATE_149");
323
+ if (data.processId) {
324
+ const messageIds = data.arrMessageIdAndEntityId.map((item) => item.messageId);
325
+ await event.clear(data.processId, messageIds);
326
+ }
272
327
  ```
273
328
 
274
329
  ### ChatApp
275
330
 
276
- - **`chatApp`** — готовый экземпляр класса `ChatApp` для работы с мессенджерами через платформу ChatApp Online.
331
+ - **`ChatApp`** — класс для работы с мессенджерами через платформу ChatApp Online. Экземпляр нужно создать самостоятельно.
277
332
 
278
333
  ```js
279
- import { chatApp } from "@andrey4emk/npm-app-back-b24";
334
+ import { ChatApp } from "@andrey4emk/npm-app-back-b24";
335
+
336
+ const chatApp = new ChatApp(
337
+ // makeParam — данные для создания токена
338
+ { email: "your-email", pass: "your-password", appId: "your-app-id" },
339
+ // authParam — текущие токены (можно пустой объект, заполнится после makeTokenChatApp)
340
+ { accessToken: "", accessTokenEndTime: "", refreshToken: "", refreshTokenEndTime: "" },
341
+ // typeParam — конфигурация мессенджеров и лицензий
342
+ {
343
+ whatsApp: { licenseId: "12345", messenger: [{ type: "grWhatsApp" }] },
344
+ telegram: { licenseId: "67890", messenger: [{ type: "telegram" }] },
345
+ }
346
+ );
280
347
  ```
281
348
 
282
349
  **Методы:**
283
350
 
284
351
  - **`makeTokenChatApp()`** — получить токены доступа для ChatApp API.
285
352
 
286
- - **Возвращает:** промис с объектом:
287
-
288
- ```js
289
- {
290
- error: false;
291
- }
292
- ```
293
-
294
- или при ошибке:
295
-
296
- ```js
297
- {
298
- error: true,
299
- message: "Не удалось получить токен ChatApp",
300
- data: { /* API response */ }
301
- }
302
- ```
303
-
304
- - **Особенности:**
305
- - Сохраняет полученные токены в свойствах экземпляра (`accessToken`, `refreshToken` и т.д.).
306
- - Требует переменные окружения: `CHATAPP_EMAIL`, `CHATAPP_PASS`, `CHATAPP_APP_ID`.
353
+ - **Возвращает:** промис с объектом `{ error }` или `{ error, message, data }` при ошибке.
354
+ - **Особенности:** Сохраняет полученные токены в свойствах экземпляра.
307
355
 
308
356
  ```js
309
357
  const result = await chatApp.makeTokenChatApp();
@@ -314,183 +362,204 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
314
362
 
315
363
  - **`refreshTokenChatApp()`** — обновить токены доступа.
316
364
 
317
- - **Возвращает:** промис с объектом:
365
+ - **Возвращает:** промис с объектом `{ error }` или `{ error, message, data }` при ошибке.
366
+ - **Алгоритм:** Пытается обновить токены через API. Если не удалось — автоматически вызывает `makeTokenChatApp()`.
318
367
 
319
- ```js
320
- {
321
- error: false;
322
- }
323
- ```
368
+ - **`checkTokenChatApp()`** — проверить валидность текущего токена.
324
369
 
325
- или при ошибке:
370
+ - **Возвращает:** промис с объектом `{ error, message }`.
371
+ - **Особенности:** Если токен невалидный, автоматически вызывает `refreshTokenChatApp()`.
326
372
 
327
- ```js
328
- {
329
- error: true,
330
- message: "Не удалось обновить токен ChatApp",
331
- data: { /* API response */ }
332
- }
333
- ```
373
+ - **`getLicensesChatApp()`** — получить список лицензий для текущего аккаунта.
334
374
 
335
- - **Алгоритм:**
336
- 1. Пытается обновить токены через API.
337
- 2. Если обновление не удалось, автоматически получает новые токены через `makeTokenChatApp()`.
375
+ - **Возвращает:** промис с объектом `{ error, message, data }`, где `data` — массив лицензий.
338
376
 
339
377
  ```js
340
- const result = await chatApp.refreshTokenChatApp();
378
+ const result = await chatApp.getLicensesChatApp();
341
379
  if (!result.error) {
342
- console.log("Токены обновлены");
380
+ console.log("Доступные лицензии:", result.data);
343
381
  }
344
382
  ```
345
383
 
346
- - **`checkTokenChatApp()`** — проверить валидность текущего токена.
384
+ - **`sendMessageChatApp(messengerType, messageData)`** — отправить текстовое сообщение.
347
385
 
348
- - **Возвращает:** промис с объектом:
386
+ - **Параметры:**
387
+ - `messengerType` (string) — `"whatsApp"` или `"telegram"`.
388
+ - `messageData` (object) — `{ phone: string, message: string }`.
389
+ - **Возвращает:** промис с объектом `{ error, message, data, auth }`. Если в процессе обновился токен, `auth` содержит новые данные авторизации.
349
390
 
350
- ```js
351
- {
352
- error: false,
353
- message: "Токен действителен" // или "Токен обновлен"
354
- }
355
- ```
391
+ ```js
392
+ const result = await chatApp.sendMessageChatApp("whatsApp", {
393
+ phone: "+1234567890",
394
+ message: "Это тестовое сообщение",
395
+ });
396
+ ```
356
397
 
357
- или при ошибке:
398
+ - **`sendFileChatApp(messengerType, messageData)`** — отправить файл.
358
399
 
359
- ```js
360
- {
361
- error: true,
362
- message: "<текст ошибки>",
363
- data: null
364
- }
365
- ```
400
+ - **Параметры:**
401
+ - `messengerType` (string) — `"whatsApp"` или `"telegram"`.
402
+ - `messageData` (object) — `{ phone, message, fileUrl, fileName }`.
366
403
 
367
- - **Особенности:**
368
- - Если токен невалидный, автоматически вызывает `refreshTokenChatApp()`.
404
+ - **`phoneCheckChatApp(messengerType, phone)`** — проверить, существует ли номер в мессенджере.
369
405
 
370
- ```js
371
- const result = await chatApp.checkTokenChatApp();
372
- console.log(result.message);
373
- ```
406
+ - **Параметры:**
407
+ - `messengerType` (string) `"whatsApp"` или `"telegram"`.
408
+ - `phone` (string) — номер телефона.
409
+ - **Возвращает:** промис с объектом `{ error, message, data }`, где `data.check` — результат проверки.
374
410
 
375
- - **`getLicensesChatApp()`** — получить список лицензий для текущего аккаунта.
411
+ ### Smsgold
376
412
 
377
- - **Возвращает:** промис с объектом:
413
+ - **`Smsgold`** класс для отправки SMS через сервис SMSGold. Экземпляр нужно создать самостоятельно.
378
414
 
379
- ```js
380
- {
381
- error: false,
382
- message: "Лицензии успешно получены",
383
- data: [ /* массив лицензий */ ]
384
- }
385
- ```
415
+ ```js
416
+ import { Smsgold } from "@andrey4emk/npm-app-back-b24";
386
417
 
387
- или при ошибке:
418
+ const smsClient = new Smsgold(
419
+ { user: "smsgold_login", pass: "smsgold_password" },
420
+ b24Instance // опционально — экземпляр B24OAuth для загрузки файлов на диск
421
+ );
422
+ ```
388
423
 
389
- ```js
390
- {
391
- error: true,
392
- message: "Не удалось получить лицензии ChatApp",
393
- data: null
394
- }
395
- ```
424
+ **Методы:**
396
425
 
397
- - **Структура лицензии в массиве:**
398
- ```js
399
- {
400
- id: 15779,
401
- licenseName: "*5787",
402
- messengers: [
403
- { type: "grWhatsApp", name: "[WEB] WhatsApp" }
404
- ]
405
- }
406
- ```
426
+ - **`sendSms(messageData)`** отправить SMS.
427
+
428
+ - **Параметры:**
429
+ - `messageData` (object):
430
+ - `phone` (string) — номер телефона.
431
+ - `message` (string) — текст сообщения.
432
+ - `fileUrl` (string) опционально, ссылка на файл (будет загружен на диск Bitrix24 и публичная ссылка добавлена в SMS).
433
+ - `fileName` (string) — опционально, имя файла.
434
+ - **Возвращает:** промис с объектом `{ error, message, result }`.
407
435
 
408
436
  ```js
409
- const result = await chatApp.getLicensesChatApp();
437
+ const result = await smsClient.sendSms({
438
+ phone: "+79990000000",
439
+ message: "Готово!",
440
+ });
410
441
  if (!result.error) {
411
- console.log("Доступные лицензии:", result.data);
442
+ console.log(result.message);
412
443
  }
413
444
  ```
414
445
 
415
- - **`sendMessageChatApp(messengerType, messageData)`** — отправить сообщение через мессенджер.
416
-
417
- - **Параметры:**
446
+ ### Email
418
447
 
419
- - `messengerType` (string) тип мессенджера: `"whatsApp"` или `"telegram"`.
420
- - `messageData` (object) — объект с данными сообщения:
421
- - `phone` (string) — номер телефона или ID чата получателя.
422
- - `message` (string) — текст сообщения.
448
+ - **`Email`**класс для отправки email через SMTP Яндекса. Экземпляр нужно создать самостоятельно.
423
449
 
424
- - **Возвращает:** промис с объектом:
450
+ ```js
451
+ import { Email } from "@andrey4emk/npm-app-back-b24";
425
452
 
426
- ```js
427
- {
428
- error: false,
429
- message: "Сообщение успешно отправлено в ChatApp через whatsApp",
430
- data: null
431
- }
432
- ```
453
+ const emailClient = new Email({
454
+ user: "your-email@yandex.ru",
455
+ pass: "your-app-password",
456
+ });
457
+ ```
433
458
 
434
- или при ошибке:
459
+ **Методы:**
435
460
 
436
- ```js
437
- {
438
- error: true,
439
- message: "Ошибка при отправке сообщения в ChatApp через whatsApp",
440
- data: null
441
- }
442
- ```
461
+ - **`send(dataMail)`** — отправить письмо.
443
462
 
444
- - **Особенности:**
445
- - Перед отправкой автоматически проверяет токен через `checkTokenChatApp()`.
446
- - Использует конфигурацию из [config.js](config.js) для получения ID лицензий и типов мессенджеров.
447
- - Поддерживает отправку сообщений в WhatsApp и Telegram.
463
+ - **Параметры:**
464
+ - `dataMail` (object):
465
+ - `to` (string) адрес получателя.
466
+ - `subject` (string) тема письма.
467
+ - `text` (string) — текстовая версия.
468
+ - `html` (string) — опционально, HTML-версия.
469
+ - `fileUrl` (string) — опционально, ссылка на файл (будет скачан и прикреплён).
470
+ - `fileName` (string) — опционально, имя файла для вложения.
471
+ - **Возвращает:** промис с объектом `{ error, info }` при успехе или `{ error, message }` при ошибке.
448
472
 
449
473
  ```js
450
- const result = await chatApp.sendMessageChatApp("whatsApp", {
451
- phone: "+1234567890",
452
- message: "Это тестовое сообщение",
474
+ const result = await emailClient.send({
475
+ to: "recipient@example.com",
476
+ subject: "Тема письма",
477
+ text: "Текст письма",
478
+ html: "<b>HTML текст</b>",
453
479
  });
454
-
455
- if (!result.error) {
456
- console.log(result.message);
457
- } else {
458
- console.error(result.message);
459
- }
460
480
  ```
461
481
 
462
- **Пример отправки в Telegram:**
482
+ - **Особенности:**
483
+ - SMTP-сервер: `smtp.yandex.ru:465` (SMTPS).
484
+ - Копия письма автоматически отправляется на адрес отправителя.
485
+
486
+ ### Wappi
487
+
488
+ - **`Wappi`** — класс для отправки сообщений через Wappi API (WhatsApp, Telegram, Max). Экземпляр нужно создать самостоятельно.
489
+
490
+ ```js
491
+ import { Wappi } from "@andrey4emk/npm-app-back-b24";
492
+
493
+ const wappi = new Wappi(
494
+ { token: "max-token", profile_id: "max-profile" },
495
+ { token: "telegram-token", profile_id: "telegram-profile" },
496
+ { token: "whatsapp-token", profile_id: "whatsapp-profile" }
497
+ );
498
+ ```
499
+
500
+ **Методы:**
501
+
502
+ - **`sendMessageWappi(messengerType, messageData)`** — отправить текстовое сообщение.
503
+
504
+ - **Параметры:**
505
+ - `messengerType` (string) — `"whatsApp"`, `"telegram"` или `"max"`.
506
+ - `messageData` (object):
507
+ - `phone` (string) — номер телефона.
508
+ - `message` (string) — текст сообщения.
509
+ - `sendOpenLine` (boolean) — опционально, отображать ли в открытой линии Битрикс24 (по умолчанию `true`).
510
+ - **Возвращает:** промис с объектом `{ error, message, data }`.
463
511
 
464
512
  ```js
465
- const result = await chatApp.sendMessageChatApp("telegram", {
466
- phone: "123456789", // ID чата в Telegram
467
- message: "Привет из приложения!",
513
+ const result = await wappi.sendMessageWappi("whatsApp", {
514
+ phone: "+1234567890",
515
+ message: "Привет из Wappi!",
468
516
  });
469
517
  ```
470
518
 
471
- ### Smsgold
519
+ - **`sendFileWappi(messengerType, messageData)`** — отправить файл.
520
+
521
+ - **Параметры:**
522
+ - `messengerType` (string) — `"whatsApp"`, `"telegram"` или `"max"`.
523
+ - `messageData` (object):
524
+ - `phone` (string) — номер телефона.
525
+ - `message` (string) — подпись к файлу.
526
+ - `fileUrl` (string) — ссылка на файл.
527
+ - `fileName` (string) — имя файла.
528
+ - `sendOpenLine` (boolean) — опционально.
529
+ - **Особенности:** Для WhatsApp и Telegram файл конвертируется в base64. Для Max отправляется по URL.
472
530
 
473
- - **`smsgold.sendSms(phone, message)`** — отправляет SMS через сервис SMSGold.
531
+ - **`phoneCheckWappi(messengerType, phone)`** — проверить, существует ли номер в мессенджере.
532
+
533
+ - **Параметры:**
534
+ - `messengerType` (string) — `"whatsApp"`, `"telegram"` или `"max"`.
535
+ - `phone` (string) — номер телефона.
536
+ - **Возвращает:** промис с объектом `{ error, message, data }`, где `data.check` — `true`/`false`.
537
+ - **Особенности:** Для Telegram сначала проверяет контакт, при отсутствии — пытается создать.
538
+
539
+ ### Логирование
540
+
541
+ - **`logs`** — экземпляр класса `LogsAPI` для цветного логирования в консоль.
474
542
 
475
543
  ```js
476
- import { smsgold } from "@andrey4emk/npm-app-back-b24";
544
+ import { logs } from "@andrey4emk/npm-app-back-b24";
477
545
 
478
- const result = await smsgold.sendSms("+79990000000", "Готово!");
479
- if (!result.error) {
480
- console.log(result.message);
481
- } else {
482
- console.error(result.result);
483
- }
546
+ logs.add("Информационное сообщение", "info");
547
+ logs.add("Отладочное сообщение", "debug");
548
+ logs.add("Ошибка!", "error");
549
+ logs.add({ key: "value" }); // объект будет JSON.stringify
550
+ logs.add("С доп. данными", "info", { detail: 123 }); // jsonData выведется через console.dir
484
551
  ```
485
552
 
486
- **Требуемые переменные окружения:**
553
+ **Уровни логирования:**
487
554
 
488
- | Переменная | Назначение |
489
- | -------------- | ---------------- |
490
- | `SMSGOLD_USER` | Логин в SMSGold |
491
- | `SMSGOLD_PASS` | Пароль в SMSGold |
555
+ | Уровень | Цвет | По умолчанию |
556
+ | ------- | ------- | ------------ |
557
+ | `debug` | Серый | Выключен |
558
+ | `info` | Зелёный | Включён |
559
+ | `error` | Красный | Включён |
492
560
 
493
- Метод возвращает объект `{ error, message, result }`, где в `result` содержатся статус-код HTTP и тело ответа сервиса.
561
+ - Конфигурация хранится в файле `log.json` (через `conf`).
562
+ - Каждый уровень можно включить/выключить, изменить цвет.
494
563
 
495
564
  ## Переменные окружения
496
565
 
@@ -503,6 +572,7 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
503
572
  | `APP_B24_CLIENT_SECRET_DEV` | Client Secret для DEV окружения |
504
573
  | `APP_ENV` | Определяет окружение (`DEV` или production) |
505
574
  | `APP_NAME` | Название приложения (используется в описании задач) |
575
+ | `CONFIG_DIR` | Путь к директории с конфигами (по умолчанию `../config`) |
506
576
  | `CHATAPP_EMAIL` | Email аккаунта ChatApp |
507
577
  | `CHATAPP_PASS` | Пароль аккаунта ChatApp |
508
578
  | `CHATAPP_APP_ID` | ID приложения в ChatApp |
@@ -517,6 +587,7 @@ APP_B24_CLIENT_SECRET_DEV=yyy
517
587
  APP_B24_CLIENT_ID=aaa
518
588
  APP_B24_CLIENT_SECRET=bbb
519
589
  APP_NAME=MyApp
590
+ CONFIG_DIR=../config
520
591
 
521
592
  CHATAPP_EMAIL=your-email@example.com
522
593
  CHATAPP_PASS=your-password
@@ -17,6 +17,9 @@ export interface ErrorTaskData {
17
17
  groupId?: number | null;
18
18
  accomplices?: number[];
19
19
  maxTasks?: number;
20
+ /** Значение для UF_CRM_TASK (массив или строка). Приоритетнее entityTypeAbbr */
21
+ ufCrmTask?: string[] | string;
22
+ /** @deprecated Используйте ufCrmTask. Код CRM сущности для UF_CRM_TASK */
20
23
  entityTypeAbbr?: string;
21
24
  }
22
25
 
@@ -90,7 +93,7 @@ export async function errorB24(dataTask: ErrorTaskData): Promise<ErrorB24Result>
90
93
  const groupId = dataTask.groupId || null;
91
94
  const accomplices = dataTask.accomplices || [];
92
95
  const maxTasks = dataTask.maxTasks || 100;
93
- const entityTypeAbbr = dataTask.entityTypeAbbr || "";
96
+ const ufCrmTask = dataTask.ufCrmTask ?? dataTask.entityTypeAbbr ?? "";
94
97
 
95
98
  // Проверяем сколько создано таких задач
96
99
  const response = await $b24.callMethod("tasks.task.list", {
@@ -119,7 +122,7 @@ export async function errorB24(dataTask: ErrorTaskData): Promise<ErrorB24Result>
119
122
  CREATED_BY: createdBy,
120
123
  RESPONSIBLE_ID: responsibleId,
121
124
  DEADLINE: deadline,
122
- UF_CRM_TASK: entityTypeAbbr,
125
+ UF_CRM_TASK: ufCrmTask,
123
126
  GROUP_ID: groupId,
124
127
  ACCOMPLICES: accomplices,
125
128
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrey4emk/npm-app-back-b24",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "Bitrix24 OAuth helpers for Node.js projects",
5
5
  "main": "index.ts",
6
6
  "type": "module",