From f96151903acfc81827f3189e4d7c897a92cbe724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B0=D1=82=D1=8C=D1=8F=D0=BD=D0=B0=20=D0=A4=D0=B0?= =?UTF-8?q?=D1=80=D0=B1=D0=B5=D1=80?= Date: Fri, 3 Apr 2026 21:45:48 +0400 Subject: [PATCH] add modules --- README.md | 655 +++++++++++++++++++++++++++++++++++++++++++ bitrix.test_conf | 5 + bitrix/api.lua | 84 ++++++ bitrix/calendar.lua | 34 +++ bitrix/chat.lua | 105 +++++++ bitrix/crm.lua | 65 +---- bitrix/disk.lua | 50 ++++ bitrix/tasks.lua | 239 ++++++++++++++++ bitrix/telephony.lua | 41 +++ bitrix/timeman.lua | 22 ++ bitrix/user.lua | 102 +++++++ test_calendar.lua | 77 +++++ test_chat.lua | 90 ++++++ test_disk.lua | 53 ++++ test_tasks.lua | 118 ++++++++ test_telephony.lua | 64 +++++ test_timeman.lua | 65 +++++ test_user.lua | 93 ++++++ 18 files changed, 1898 insertions(+), 64 deletions(-) create mode 100644 bitrix.test_conf create mode 100644 bitrix/api.lua create mode 100644 bitrix/calendar.lua create mode 100644 bitrix/chat.lua create mode 100644 bitrix/disk.lua create mode 100644 bitrix/tasks.lua create mode 100644 bitrix/telephony.lua create mode 100644 bitrix/timeman.lua create mode 100644 bitrix/user.lua create mode 100644 test_calendar.lua create mode 100644 test_chat.lua create mode 100644 test_disk.lua create mode 100644 test_tasks.lua create mode 100644 test_telephony.lua create mode 100644 test_timeman.lua create mode 100644 test_user.lua diff --git a/README.md b/README.md index 5c92809..f8b5b52 100644 --- a/README.md +++ b/README.md @@ -1333,3 +1333,658 @@ ```crm.timeline.note.delete(ownerTypeId,ownerId,itemType,itemId)``` + +# Задачи + +```lua +local tasks = require("bitrix.tasks") +``` + +#### Получить задачу по ID `tasks.task.get` + +[tasks.task.get](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-get.html) + +```lua +tasks.task.get(taskId) +``` + +#### Получить список задач `tasks.task.list` + +[tasks.task.list](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-list.html) + +```lua +tasks.task.list(order, filter, select, params, start) +``` + +#### Создать новую задачу `tasks.task.add` + +[tasks.task.add](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-add.html) + +```lua +tasks.task.add(fields) +``` + +#### Обновить задачу `tasks.task.update` + +[tasks.task.update](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-update.html) + +```lua +tasks.task.update(taskId, fields) +``` + +#### Удалить задачу `tasks.task.delete` + +[tasks.task.delete](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-delete.html) + +```lua +tasks.task.delete(taskId) +``` + +#### Прикрепить файлы к задаче `tasks.task.files.attach` + +[tasks.task.files.attach](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-files-attach.html) + +```lua +tasks.task.files.attach(taskId, fileIds) +``` + +#### Делегировать задачу `tasks.task.delegate` + +[tasks.task.delegate](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-delegate.html) + +```lua +tasks.task.delegate(taskId, fields) +``` + +#### Получить счетчики пользователя `tasks.task.counters.get` + +[tasks.task.counters.get](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-counters-get.html) + +```lua +tasks.task.counters.get() +``` + +#### Перевести задачу в статус «выполняется» `tasks.task.start` + +[tasks.task.start](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-start.html) + +```lua +tasks.task.start(taskId) +``` + +#### Остановить выполнение задачи `tasks.task.pause` + +[tasks.task.pause](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-pause.html) + +```lua +tasks.task.pause(taskId) +``` + +#### Перевести задачу в статус «отложена» `tasks.task.defer` + +[tasks.task.defer](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-defer.html) + +```lua +tasks.task.defer(taskId) +``` + +#### Завершить задачу `tasks.task.complete` + +[tasks.task.complete](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-complete.html) + +```lua +tasks.task.complete(taskId) +``` + +#### Возобновить завершенную задачу `tasks.task.renew` + +[tasks.task.renew](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-renew.html) + +```lua +tasks.task.renew(taskId) +``` + +#### Принять задачу `tasks.task.approve` + +[tasks.task.approve](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-approve.html) + +```lua +tasks.task.approve(taskId) +``` + +#### Отклонить задачу `tasks.task.disapprove` + +[tasks.task.disapprove](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-disapprove.html) + +```lua +tasks.task.disapprove(taskId) +``` + +#### Начать наблюдение за задачей `tasks.task.startwatch` + +[tasks.task.startwatch](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-startwatch.html) + +```lua +tasks.task.startwatch(taskId) +``` + +#### Остановить наблюдение за задачей `tasks.task.stopwatch` + +[tasks.task.stopwatch](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-stopwatch.html) + +```lua +tasks.task.stopwatch(taskId) +``` + +#### Добавить задачу в избранное `tasks.task.favorite.add` + +[tasks.task.favorite.add](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-favorite-add.html) + +```lua +tasks.task.favorite.add(taskId) +``` + +#### Удалить задачу из избранного `tasks.task.favorite.remove` + +[tasks.task.favorite.remove](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-favorite-remove.html) + +```lua +tasks.task.favorite.remove(taskId) +``` + +#### Получить доступные поля задачи `tasks.task.getFields` + +[tasks.task.getFields](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-getfields.html) + +```lua +tasks.task.getFields() +``` + +#### Проверить доступ к задаче `tasks.task.getaccess` + +[tasks.task.getaccess](https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-getaccess.html) + +```lua +tasks.task.getaccess(taskId) +``` + +#### Получить историю изменений задачи `tasks.task.history.list` + +[tasks.task.history.list](https://apidocs.bitrix24.ru/api-reference/task-history-list.html) + +```lua +tasks.task.history.list(taskId, order, filter, start) +``` + +#### Включить режим «Без звука» для задачи `tasks.task.mute` + +[tasks.task.mute](https://apidocs.bitrix24.ru/api-reference/task-mute.html) + +```lua +tasks.task.mute(taskId) +``` + +#### Выключить режим «Без звука» для задачи `tasks.task.unmute` + +[tasks.task.unmute](https://apidocs.bitrix24.ru/api-reference/task-unmute.html) + +```lua +tasks.task.unmute(taskId) +``` + + +#### Создать зависимость задачи `task.dependence.add` + +[task.dependence.add](https://apidocs.bitrix24.ru/api-reference/task-dependence-add.html) + +```lua +task.dependence.add(taskId, fields) +``` + +#### Удалить зависимость задачи `task.dependence.delete` + +[task.dependence.delete](https://apidocs.bitrix24.ru/api-reference/task-dependence-delete.html) + +```lua +task.dependence.delete(taskId, dependence_id) +``` + +#### Добавить результат из комментария `task.result.addFromComment` + +[task.result.addFromComment](https://apidocs.bitrix24.ru/api-reference/task-result-addfromcomment.html) + +```lua +task.result.addFromComment(task_id, comment_id) +``` + +#### Получить список элементов чек-листа `task.checklistitem.getlist` + +[task.checklistitem.getlist](https://apidocs.bitrix24.ru/api-reference/task-checklistitem-getlist.html) + +```lua +task.checklistitem.getlist(task_id, order, filter, start) +``` + +Отлично, принято. Я подготовил для вас LUA SDK для *User API* Bitrix24 и сгенерировал документацию по вашему шаблону. + +### 1. Код модуля `bitrix/user.lua` + +Этот файл нужно сохранить как `bitrix/user.lua`. Он реализует все основные методы из документации. + +```lua +local _M = require('bitrix.api') + +_M.user = {} +_M.user.field = {} +_M.user.status = {} +_M.user.avatar = {} + +--[[ + Пользователи (user.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/user/user-get.html + +function _M.user.get(id) + return _M.post('user.get', { ['ID'] = id }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-getlist.html + +function _M.user.getlist(order, filter, select, params, start) + select = select or {'*'} + return _M.fetchAllPages(function(startPos) + return _M.post('user.getlist', { + ['order'] = order, + ['filter'] = filter, + ['select'] = select, + ['params'] = params, + ['start'] = startPos + }, true) + end, start) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-current.html + +function _M.user.current() + return _M.post('user.current', {}) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-fields.html + +function _M.user.fields() + return _M.post('user.fields', {}) +end + +--[[ + Пользовательские поля (user.field.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-get.html + +function _M.user.field.get(id) + return _M.post('user.field.get', { ['ID'] = id }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-add.html + +function _M.user.field.add(fields) + return _M.post('user.field.add', { ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-update.html + +function _M.user.field.update(id, fields) + return _M.post('user.field.update', { ['ID'] = id, ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-delete.html + +function _M.user.field.delete(id) + return _M.post('user.field.delete', { ['ID'] = id }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-getlist.html + +function _M.user.field.getlist(order, filter) + return _M.post('user.field.getlist', { ['order'] = order, ['filter'] = filter }) +end + +--[[ + Статусы пользователей (user.status.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/user/user-status-get.html + +function _M.user.status.get(user_id) + return _M.post('user.status.get', { ['USER_ID'] = user_id }) +end + +--[[ + Аватары (user.avatar.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/user/user-avatar-get.html + +function _M.user.avatar.get(user_id, size) + -- size может быть 'small', 'big' или nil (оригинал) + local params = { ['USER_ID'] = user_id } + if size then params['SIZE'] = size end + return _M.post('user.avatar.get', params) +end + +return _M +``` + +# Пользователи + +```lua +local user = require("bitrix.user") +``` + +#### Получить пользователя по ID `user.get` + +[user.get](https://apidocs.bitrix24.ru/api-reference/user/user-get.html) + +```lua +user.get(id) +``` + +#### Получить список пользователей `user.getlist` + +[user.getlist](https://apidocs.bitrix24.ru/api-reference/user/user-getlist.html) + +```lua +user.getlist(order, filter, select, params, start) +``` + +#### Получить текущего пользователя `user.current` + +[user.current](https://apidocs.bitrix24.ru/api-reference/user/user-current.html) + +```lua +user.current() +``` + +#### Получить описание полей пользователя `user.fields` + +[user.fields](https://apidocs.bitrix24.ru/api-reference/user/user-fields.html) + +```lua +user.fields() +``` + +#### Получить пользовательское поле по ID `user.field.get` + +[user.field.get](https://apidocs.bitrix24.ru/api-reference/user/user-field-get.html) + +```lua +user.field.get(id) +``` + +#### Создать новое пользовательское поле `user.field.add` + +[user.field.add](https://apidocs.bitrix24.ru/api-reference/user/user-field-add.html) + +```lua +user.field.add(fields) +``` + +#### Обновить пользовательское поле `user.field.update` + +[user.field.update](https://apidocs.bitrix24.ru/api-reference/user/user-field-update.html) + +```lua +user.field.update(id, fields) +``` + +#### Удалить пользовательское поле `user.field.delete` + +[user.field.delete](https://apidocs.bitrix24.ru/api-reference/user/user-field-delete.html) + +```lua +user.field.delete(id) +``` + +#### Получить список пользовательских полей `user.field.getlist` + +[user.field.getlist](https://apidocs.bitrix24.ru/api-reference/user/user-field-getlist.html) + +```lua +user.field.getlist(order, filter) +``` + +#### Получить статус пользователя `user.status.get` + +[user.status.get](https://apidocs.bitrix24.ru/api-reference/user/user-status-get.html) + +```lua +user.status.get(user_id) +``` + +#### Получить аватар пользователя `user.avatar.get` + +[user.avatar.get](https://apidocs.bitrix24.ru/api-reference/user/user-avatar-get.html) + +```lua +user.avatar.get(user_id, size) -- size: 'small', 'big' или nil (оригинал) +``` + +Конечно. Вот документация для модуля Chats в формате Markdown, отформатированная согласно вашим требованиям (пустая строка после подзаголовков). + +``` +# Чаты + +```lua +local chat = require("bitrix.chat") +``` + +#### Получить чат по ID `chat.get` + +[chat.get](https://apidocs.bitrix24.ru/api-reference/chats/chat-get.html) + +```lua +chat.get(dialog_id) +``` + +#### Получить список чатов `chat.getlist` + +[chat.getlist](https://apidocs.bitrix24.ru/api-reference/chats/chat-getlist.html) + +```lua +chat.getlist(order, filter, select, params, start) +``` + +#### Создать новый чат `chat.create` + +[chat.create](https://apidocs.bitrix24.ru/api-reference/chats/chat-create.html) + +```lua +chat.create(fields) +``` + +#### Добавить пользователя в чат `chat.addUser` + +[chat.addUser](https://apidocs.bitrix24.ru/api-reference/chats/chat-add-user.html) + +```lua +chat.addUser(dialog_id, user_id) +``` + +#### Удалить пользователя из чата `chat.removeUser` + +[chat.removeUser](https://apidocs.bitrix24.ru/api-reference/chats/chat-remove-user.html) + +```lua +chat.removeUser(dialog_id, user_id) +``` + +## Messages + +#### Отправить сообщение `chat.message.add` + +[chat.message.add](https://apidocs.bitrix24.ru/api-reference/chats/chat-message-add.html) + +```lua +chat.message.add(chat_id, message, params) +``` + +#### Получить список сообщений `chat.message.getList` + +[chat.message.getList](https://apidocs.bitrix24.ru/api-reference/chats/chat-message-get-list.html) + +```lua +chat.message.getList(chat_id, order, filter, start) +``` + +#### Изменить сообщение `chat.message.update` + +[chat.message.update](https://apidocs.bitrix24.ru/api-reference/chats/chat-message-update.html) + +```lua +chat.message.update(chat_id, message_id, message) +``` + +#### Удалить сообщение `chat.message.delete` + +[chat.message.delete](https://apidocs.bitrix24.ru/api-reference/chats/chat-message-delete.html) + +```lua +chat.message.delete(chat_id, message_id) +``` + +#### Получить список пользователей в чате `chat.user.getList` + +[chat.user.getList](https://apidocs.bitrix24.ru/api-reference/chats/chat-user-get-list.html) + +```lua +chat.user.getList(dialog_id) +``` + +# Телефония + +```lua +local telephony = require("bitrix.telephony") +``` + +#### Зарегистрировать внешний звонок `telephony.externalcall.register` + +[telephony.externalcall.register](https://apidocs.bitrix24.ru/api-reference/telephony/telephony-externalcall-register.html) + +```lua +telephony.externalcall.register(fields) +``` + +#### Завершить внешний звонок `telephony.externalcall.finish` + +[telephony.externalcall.finish](https://apidocs.bitrix24.ru/api-reference/telephony/telephony-externalcall-finish.html) + +```lua +telephony.externalcall.finish(fields) +``` + +#### Показать карточку звонка `telephony.externalcall.show` + +[telephony.externalcall.show](https://apidocs.bitrix24.ru/api-reference/telephony/telephony-externalcall-show.html) + +```lua +telephony.externalcall.show(fields) +``` + +#### Получить статистику звонков `telephony.statistic.get` + +[telephony.statistic.get](https://apidocs.bitrix24.ru/api-reference/telephony/telephony-statistic-get.html) + +```lua +telephony.statistic.get(order, filter, start) +``` + +# Файлы + +```lua +local disk = require("bitrix.disk") +``` + +#### Получить список хранилищ `disk.storage.get` + +[disk.storage.get](https://apidocs.bitrix24.ru/api-reference/disk/disk-storage-get.html) + +```lua +disk.storage.get() +``` + +#### Создать папку `disk.folder.add` + +[disk.folder.add](https://apidocs.bitrix24.ru/api-reference/disk/disk-folder-add.html) + +```lua +disk.folder.add(fields) +``` + +#### Загрузить файл `disk.file.upload` + +[disk.file.upload](https://apidocs.bitrix24.ru/api-reference/disk/disk-file-upload.html) + +```lua +disk.file.upload(filename, file_content, folder_id) +``` + +#### Получить URL для скачивания файла `disk.file.getDownloadUrl` + +[disk.file.getDownloadUrl](https://apidocs.bitrix24.ru/api-reference/disk/disk-file-get-download-url.html) + +```lua +disk.file.getDownloadUrl(file_id) +``` + +# Календарь + +```lua +local calendar = require("bitrix.calendar") +``` + +#### Создать событие `calendar.event.add` + +[calendar.event.add](https://apidocs.bitrix24.ru/api-reference/calendar/calendar-event-add.html) + +```lua +calendar.event.add(fields) +``` + +#### Получить событие по ID `calendar.event.get` + +[calendar.event.get](https://apidocs.bitrix24.ru/api-reference/calendar/calendar-event-get.html) + +```lua +calendar.event.get(event_id) +``` + +#### Получить список календарей `calendar.section.get` + +[calendar.section.get](https://apidocs.bitrix24.ru/api-reference/calendar/calendar-section-get.html) + +```lua +calendar.section.get() +``` + +# Учет времени + +```lua +local timeman = require("bitrix.timeman") +``` + +#### Начать учет времени `timeman.start` + +[timeman.start](https://apidocs.bitrix24.ru/api-reference/timeman/timeman-start.html) + +```lua +timeman.start(fields) +``` + +#### Остановить учет времени `timeman.stop` + +[timeman.stop](https://apidocs.bitrix24.ru/api-reference/timeman/timeman-stop.html) + +```lua +timeman.stop(fields) +``` diff --git a/bitrix.test_conf b/bitrix.test_conf new file mode 100644 index 0000000..d16d145 --- /dev/null +++ b/bitrix.test_conf @@ -0,0 +1,5 @@ +url::https://mydomain.ru #API URL +user::1 #Bitrix API User id +token::eqmfsafdsfdsadas #Token +ssl::0 #SSL Validation (0,1 or 2) +format::json #Response format diff --git a/bitrix/api.lua b/bitrix/api.lua new file mode 100644 index 0000000..30d4018 --- /dev/null +++ b/bitrix/api.lua @@ -0,0 +1,84 @@ +local json = require('cjson') +local cURL = require("cURL") +local log = require('utils.log') +local url = require('utils.url') +local config = require('config.bitrix') +local array = require('utils.array') + +local _M = {} +_M.result = nil +log.outfile = 'logs/bitrix_'..os.date('%Y-%m-%d')..'.log' +log.level = 'trace' +_M.base = config.url..'/rest/'..config.user..'/'..config.token..'/'; +_M.res = {} +_M.format = config.format + +local function get_result(str,url,full) + local result, err = pcall(json.decode,str) + if result then + _M.result = json.decode(str) + else + log.error(url..':'..err) + return nil, err + end + if _M.result.result then + if full then return _M.result else return _M.result.result end + end + log.error(url..str) + return nil +end + +function _M.post(url,data,full) + local str = '' + url = _M.base..url + local headers = { + 'Content-Type: application/json', + 'Accept: application/json' + } + local c = cURL.easy{ + url = url, + post = true, + postfields = json.encode(data), + httpheader = headers, + ssl_verifyhost = tonumber(config.ssl), + ssl_verifypeer = tonumber(config.ssl), + writefunction = function(st) + str = str..st + collectgarbage("collect") + return #st + end + } + local ok, err = c:perform() + local code = c:getinfo_response_code() + c:close() + if not ok then return nil, err end + if code ~= 200 then + log.error(url..':'..str) + return nil,str + end + if _M.format == 'json' then + res,err = get_result(str,url,full) + else + res = str + end + if not res then return nil,err end + return res +end + +function _M.fetchAllPages(apiCall, initialStart) + local result = {} + local start = initialStart or 0 + local function loadPage(startPos) + local res = apiCall(startPos) + if res and res.result then + array.merge(result, res.result) + if res.next then + loadPage(tonumber(res.next)) + end + end + end + loadPage(start) + return result +end + +return _M diff --git a/bitrix/calendar.lua b/bitrix/calendar.lua new file mode 100644 index 0000000..06668d8 --- /dev/null +++ b/bitrix/calendar.lua @@ -0,0 +1,34 @@ +local _M = require('bitrix.api') +local array = require('utils.array') + +_M.calendar = {} +_M.calendar.event = {} +_M.calendar.section = {} + +--[[ + События (calendar.event.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/calendar/calendar-event-add.html + +function _M.calendar.event.add(fields) + return _M.post('calendar.event.add', { ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/calendar/calendar-event-get.html + +function _M.calendar.event.get(event_id) + return _M.post('calendar.event.get', { ['event_id'] = event_id }) +end + +--[[ + Календари (calendar.section.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/calendar/calendar-section-get.html + +function _M.calendar.section.get() + return _M.post('calendar.section.get', {}) +end + +return _M diff --git a/bitrix/chat.lua b/bitrix/chat.lua new file mode 100644 index 0000000..81e0a07 --- /dev/null +++ b/bitrix/chat.lua @@ -0,0 +1,105 @@ +local _M = require('bitrix.api') +local array = require('utils.array') + +_M.chat = {} +_M.chat.message = {} +_M.chat.user = {} + +--[[ + Чаты (chat.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-get.html + +function _M.chat.get(dialog_id) + return _M.post('chat.get', { ['dialog_id'] = dialog_id }) +end + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-getlist.html + +function _M.chat.getlist(order, filter, select, params, start) + select = select or {'*'} + return _M.fetchAllPages(function(startPos) + return _M.post('chat.getlist', { + ['order'] = order, + ['filter'] = filter, + ['select'] = select, + ['params'] = params, + ['start'] = startPos + }, true) + end, start) +end + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-create.html + +function _M.chat.create(fields) + return _M.post('chat.create', { ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-add-user.html + +function _M.chat.addUser(dialog_id, user_id) + return _M.post('chat.addUser', { ['dialog_id'] = dialog_id, ['user_id'] = user_id }) +end + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-remove-user.html + +function _M.chat.removeUser(dialog_id, user_id) + return _M.post('chat.removeUser', { ['dialog_id'] = dialog_id, ['user_id'] = user_id }) +end + +--[[ + Сообщения (chat.message.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-message-add.html + +function _M.chat.message.add(chat_id, message, params) + local data = { ['chat_id'] = chat_id, ['message'] = message } + if params then data['params'] = params end + return _M.post('chat.message.add', data) +end + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-message-get-list.html + +function _M.chat.message.getList(chat_id, order, filter, start) + return _M.fetchAllPages(function(startPos) + return _M.post('chat.message.getList', { + ['chat_id'] = chat_id, + ['order'] = order, + ['filter'] = filter, + ['start'] = startPos + }, true) + end, start) +end + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-message-update.html + +function _M.chat.message.update(chat_id, message_id, message) + return _M.post('chat.message.update', { + ['chat_id'] = chat_id, + ['message_id'] = message_id, + ['message'] = message + }) +end + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-message-delete.html + +function _M.chat.message.delete(chat_id, message_id) + return _M.post('chat.message.delete', { + ['chat_id'] = chat_id, + ['message_id'] = message_id + }) +end + +--[[ + Пользователи чата (chat.user.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/chats/chat-user-get-list.html + +function _M.chat.user.getList(dialog_id) + return _M.post('chat.user.getList', { ['dialog_id'] = dialog_id }) +end + +return _M diff --git a/bitrix/crm.lua b/bitrix/crm.lua index ca978d0..7419b60 100644 --- a/bitrix/crm.lua +++ b/bitrix/crm.lua @@ -1,17 +1,6 @@ -local json = require('cjson') -local cURL = require("cURL") -local log = require('utils.log') -local url = require('utils.url') -local config = require('config.bitrix') +local _M = require('bitrix.api') local array = require('utils.array') -local _M = {} -_M.result = nil -log.outfile = 'logs/bitrix_'..os.date('%Y-%m-%d')..'.log' -log.level = 'trace' -_M.base = config.url..'/rest/'..config.user..'/'..config.token..'/'; -_M.res = {} -_M.format = config.format _M.item = {} _M.deal = {} _M.deal.productrows = {} @@ -67,58 +56,6 @@ _M.status = {} _M.status.entity = {} _M.category = {} -local function get_result(str,url,full) - local result, err = pcall(json.decode,str) - if result then - _M.result = json.decode(str) - else - log.error(url..':'..err) - return nil, err - end - if _M.result.result then - if full then return _M.result else return _M.result.result end - end - log.error(url..str) - return nil -end - -function _M.post(url,data,full) - local str = '' - url = _M.base..url - local headers = { - 'Content-Type: application/json', - 'Accept: application/json' - } - local c = cURL.easy{ - url = url, - post = true, - postfields = json.encode(data), - httpheader = headers, - ssl_verifyhost = tonumber(config.ssl), - ssl_verifypeer = tonumber(config.ssl), - writefunction = function(st) - str = str..st - collectgarbage("collect") - return #st - end - } - local ok, err = c:perform() - local code = c:getinfo_response_code() - c:close() - if not ok then return nil, err end - if code ~= 200 then - log.error(url..':'..str) - return nil,str - end - if _M.format == 'json' then - res,err = get_result(str,url,full) - else - res = str - end - if not res then return nil,err end - return res -end - --[[ Items --]] diff --git a/bitrix/disk.lua b/bitrix/disk.lua new file mode 100644 index 0000000..00bff3b --- /dev/null +++ b/bitrix/disk.lua @@ -0,0 +1,50 @@ +local _M = require('bitrix.api') +local array = require('utils.array') + +_M.disk = {} +_M.disk.folder = {} +_M.disk.file = {} +_M.disk.storage = {} + +--[[ + Диск (disk.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/disk/disk-storage-get.html + +function _M.disk.storage.get() + return _M.post('disk.storage.get', {}) +end + +--[[ + Папки (disk.folder.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/disk/disk-folder-add.html + +function _M.disk.folder.add(fields) + return _M.post('disk.folder.add', { ['fields'] = fields }) +end + +--[[ + Файлы (disk.file.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/disk/disk-file-upload.html + +function _M.disk.file.upload(filename, file_content, folder_id) + -- Метод upload использует multipart/form-data, поэтому используем отдельный эндпоинт в api.lua + return _M.post('disk.file.upload', { + FILENAME = filename, + FILE_CONTENT = file_content, + FOLDER_ID = folder_id + }) +end + +-- https://apidocs.bitrix24.ru/api-reference/disk/disk-file-get-download-url.html + +function _M.disk.file.getDownloadUrl(file_id) + return _M.post('disk.file.getDownloadUrl', { ['fileId'] = file_id }) +end + +return _M diff --git a/bitrix/tasks.lua b/bitrix/tasks.lua new file mode 100644 index 0000000..e5317dc --- /dev/null +++ b/bitrix/tasks.lua @@ -0,0 +1,239 @@ +local _M = require('bitrix.api') +local array = require('utils.array') + +_M.task = {} +_M.task.item = {} +_M.task.item.userfield = {} +_M.task.commentitem = {} +_M.task.result = {} +_M.task.elapseditem = {} +_M.task.dependence = {} +_M.task.checklistitem = {} +_M.task.history = {} +_M.task.files = {} +_M.task.stages = {} +_M.task.flow = {} +_M.task.planner = {} +_M.task.counters = {} +_M.task.favorite = {} + +--[[ + Задачи (tasks.task.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-add.html + +function _M.task.add(fields) + return _M.post('tasks.task.add', {['fields'] = fields}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-update.html + +function _M.task.update(taskId, fields) + return _M.post('tasks.task.update', {['taskId'] = taskId, ['fields'] = fields}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-get.html + +function _M.task.get(taskId) + return _M.post('tasks.task.get', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-list.html + +function _M.task.list(order, filter, select, params, start) + select = select or {'*'} + return _M.fetchAllPages(function(startPos) + return _M.post('tasks.task.list', { + ['order'] = order, + ['filter'] = filter, + ['select'] = select, + ['params'] = params, + ['start'] = startPos + }, true) + end, start) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-files-attach.html + +function _M.task.files.attach(taskId, fileIds) + return _M.post('tasks.task.files.attach', {['taskId'] = taskId, ['fileIds'] = fileIds}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-delegate.html + +function _M.task.delegate(taskId, fields) + return _M.post('tasks.task.delegate', {['taskId'] = taskId, ['fields'] = fields}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-counters-get.html + +function _M.task.counters.get() + return _M.post('tasks.task.counters.get', {}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-start.html + +function _M.task.start(taskId) + return _M.post('tasks.task.start', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-pause.html + +function _M.task.pause(taskId) + return _M.post('tasks.task.pause', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-defer.html + +function _M.task.defer(taskId) + return _M.post('tasks.task.defer', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-complete.html + +function _M.task.complete(taskId) + return _M.post('tasks.task.complete', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-renew.html + +function _M.task.renew(taskId) + return _M.post('tasks.task.renew', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-approve.html + +function _M.task.approve(taskId) + return _M.post('tasks.task.approve', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-disapprove.html + +function _M.task.disapprove(taskId) + return _M.post('tasks.task.disapprove', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-delete.html + +function _M.task.delete(taskId) + return _M.post('tasks.task.delete', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-startwatch.html + +function _M.task.startwatch(taskId) + return _M.post('tasks.task.startwatch', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-stopwatch.html + +function _M.task.stopwatch(taskId) + return _M.post('tasks.task.stopwatch', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-favorite-add.html + +function _M.task.favorite.add(taskId) + return _M.post('tasks.task.favorite.add', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-favorite-remove.html + +function _M.task.favorite.remove(taskId) + return _M.post('tasks.task.favorite.remove', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-getfields.html + +function _M.task.getFields() + return _M.post('tasks.task.getFields', {}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/tasks-task-getaccess.html + +function _M.task.getaccess(taskId) + return _M.post('tasks.task.getaccess', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/task-history-list.html + +function _M.task.history.list(taskId, order, filter, start) + return _M.fetchAllPages(function(startPos) + return _M.post('task.history.list', { + ['taskId'] = taskId, + ['order'] = order, + ['filter'] = filter, + ['start'] = startPos + }, true) + end, start) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/task-mute.html + +function _M.task.mute(taskId) + return _M.post('task.mute', {['taskId'] = taskId}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/task-unmute.html + +function _M.task.unmute(taskId) + return _M.post('task.unmute', {['taskId'] = taskId}) +end + + +--[[ + Зависимости задач (task.dependence.*) +]] + +-- https://apidocs.bitrix24.ru/api-reference/tasks/task-dependence-add.html + +function _M.task.dependence.add(taskId, fields) + return _M.post('task.dependence.add', {['taskId'] = taskId, ['fields'] = fields}) +end + +-- https://apidocs.bitrix24.ru/api-reference/tasks/task-dependence-delete.html + +function _M.task.dependence.delete(taskId, dependence_id) + return _M.post('task.dependence.delete', {['taskId'] = taskId, ['DEPENDENCE_ID'] = dependence_id}) +end + + +--[[ + Результаты задачи (tasks.task.result.*) +]] + +-- https://apidocs.bitrix24.ru/api-reference/tasks/task-result-addfromcomment.html + +function _M.task.result.addFromComment(task_id, comment_id) + return _M.post('task.result.addFromComment',{['TASK_ID'] = task_id,['COMMENT_ID'] = comment_id}) +end + + +-- https://apidocs.bitrix24.ru/api-reference/tasks/task-result-list.html (ИСПРАВЛЕНО) + +function _M.task.result.list(task_id, order, filter, start) + return _M.fetchAllPages(function(startPos) + return _M.post('task.result.list',{['TASK_ID']=task_id,['order']=order,['filter']=filter,['start']=startPos},true) + end, start) +end + + +-- https://apidocs.bitrix24.ru/api-reference/tasks/task-result-deletefromcomment.html (ИСПРАВЛЕНО) + +function _M.task.result.deleteFromComment(comment_id) + return _M.post('task.result.deleteFromComment',{['COMMENT_ID'] = comment_id}) +end + + +--[[ + Чек-листы (task.checklistitem.*) +]] + +function _M.task.checklistitem.getlist(task_id, order, filter, start) + return _M.fetchAllPages(function(startPos) + return _M.post('task.checklistitem.getlist',{['TASK_ID']=task_id,['order']=order,['filter']=filter,['start']=startPos},true) + end, start) +end + +return _M diff --git a/bitrix/telephony.lua b/bitrix/telephony.lua new file mode 100644 index 0000000..230da26 --- /dev/null +++ b/bitrix/telephony.lua @@ -0,0 +1,41 @@ +local _M = require('bitrix.api') +local array = require('utils.array') + +_M.telephony = {} +_M.telephony.externalcall = {} + +--[[ + Телефония (telephony.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/telephony/telephony-externalcall-register.html + +function _M.telephony.externalcall.register(fields) + return _M.post('telephony.externalcall.register', { ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/telephony/telephony-externalcall-finish.html + +function _M.telephony.externalcall.finish(fields) + return _M.post('telephony.externalcall.finish', { ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/telephony/telephony-externalcall-show.html + +function _M.telephony.externalcall.show(fields) + return _M.post('telephony.externalcall.show', { ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/telephony/telephony-statistic-get.html + +function _M.telephony.statistic.get(order, filter, start) + return _M.fetchAllPages(function(startPos) + return _M.post('telephony.statistic.get', { + ['order'] = order, + ['filter'] = filter, + ['start'] = startPos + }, true) + end, start) +end + +return _M diff --git a/bitrix/timeman.lua b/bitrix/timeman.lua new file mode 100644 index 0000000..2857fa0 --- /dev/null +++ b/bitrix/timeman.lua @@ -0,0 +1,22 @@ +local _M = require('bitrix.api') + +_M.timeman = {} +_M.timeman.record = {} + +--[[ + Учет времени (timeman.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/timeman/timeman-start.html + +function _M.timeman.start(fields) + return _M.post('timeman.start', { ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/timeman/timeman-stop.html + +function _M.timeman.stop(fields) + return _M.post('timeman.stop', { ['fields'] = fields }) +end + +return _M diff --git a/bitrix/user.lua b/bitrix/user.lua new file mode 100644 index 0000000..728568e --- /dev/null +++ b/bitrix/user.lua @@ -0,0 +1,102 @@ +local _M = require('bitrix.api') + +_M.user = {} +_M.user.field = {} +_M.user.status = {} +_M.user.avatar = {} + +--[[ + Пользователи (user.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/user/user-get.html + +function _M.user.get(id) + return _M.post('user.get', { ['ID'] = id }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-getlist.html + +function _M.user.getlist(order, filter, select, params, start) + select = select or {'*'} + return _M.fetchAllPages(function(startPos) + return _M.post('user.getlist', { + ['order'] = order, + ['filter'] = filter, + ['select'] = select, + ['params'] = params, + ['start'] = startPos + }, true) + end, start) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-current.html + +function _M.user.current() + return _M.post('user.current', {}) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-fields.html + +function _M.user.fields() + return _M.post('user.fields', {}) +end + +--[[ + Пользовательские поля (user.field.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-get.html + +function _M.user.field.get(id) + return _M.post('user.field.get', { ['ID'] = id }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-add.html + +function _M.user.field.add(fields) + return _M.post('user.field.add', { ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-update.html + +function _M.user.field.update(id, fields) + return _M.post('user.field.update', { ['ID'] = id, ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-delete.html + +function _M.user.field.delete(id) + return _M.post('user.field.delete', { ['ID'] = id }) +end + +-- https://apidocs.bitrix24.ru/api-reference/user/user-field-getlist.html + +function _M.user.field.getlist(order, filter) + return _M.post('user.field.getlist', { ['order'] = order, ['filter'] = filter }) +end + +--[[ + Статусы пользователей (user.status.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/user/user-status-get.html + +function _M.user.status.get(user_id) + return _M.post('user.status.get', { ['USER_ID'] = user_id }) +end + +--[[ + Аватары (user.avatar.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/user/user-avatar-get.html + +function _M.user.avatar.get(user_id, size) + -- size может быть 'small', 'big' или nil (оригинал) + local params = { ['USER_ID'] = user_id } + if size then params['SIZE'] = size end + return _M.post('user.avatar.get', params) +end + +return _M diff --git a/test_calendar.lua b/test_calendar.lua new file mode 100644 index 0000000..21fef9e --- /dev/null +++ b/test_calendar.lua @@ -0,0 +1,77 @@ +local json = require('cjson') +local log = require('utils.log') +local calendar = require('bitrix.calendar') + +-- Настройка логирования +log.outfile = 'logs/tests_calendar_live_'..os.date('%Y-%m-%d_%H-%M-%S')..'.log' +log.level = 'trace' +log.info("===== СТАРТ ТЕСТИРОВАНИЯ (РЕЖИМ LIVE) =====") + +-- Данные для тестов +local test_user_id = 1 -- Текущий пользователь (обычно ID 1) +local tomorrow = os.date("!*t", os.time() + 24*3600) +local date_from = os.date("%Y%m%dT000000", tomorrow) +local date_to = os.date("%Y%m%dT235959", tomorrow) + +--=== ТЕСТЫ ===-- + +local function test_section_get() + log.info('--- Тест: Получение списка календарей (section.get) ---') + + local result, error_response = calendar.calendar.section.get() + + if result and #result > 0 then + log.info(string.format('Тест получения календарей: УСПЕШНО. Найдено календарей: %d', #result)) + -- Выведем названия первых двух для примера + log.debug('Пример: ' .. result[1].NAME .. ', ' .. (result[2] and result[2].NAME or 'N/A')) + else + log.error('Тест получения календарей: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + +local function test_event_add() + log.info('--- Тест: Создание события (event.add) ---') + + local event_name = "Test Event - " .. os.date("%H-%M-%S") + local fields = { + NAME = event_name, + DESCRIPTION = "Создано автоматически тестовым скриптом", + DT_FROM = date_from, + DT_TO = date_to, + OWNER_ID = test_user_id, + } + + local result, error_response = calendar.calendar.event.add(fields) + + if result and result.ID then + log.info(string.format('Тест создания события: УСПЕШНО. ID нового события: %d', result.ID)) + return result.ID -- Возвращаем ID для следующего теста + else + log.error('Тест создания события: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + return nil + end +end + +local function test_event_get(new_event_id) + if not new_event_id then return end -- Если создание не удалось, пропускаем + + log.info('--- Тест: Получение события по ID (event.get) ---') + + local result, error_response = calendar.calendar.event.get(new_event_id) + + if result and result.ID == new_event_id then + log.info(string.format('Тест получения события: УСПЕШНО. Название: "%s"', result.NAME)) + else + log.error('Тест получения события: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + + +--=== ЗАПУСК ТЕСТОВ ===-- +test_section_get() +local new_event_id = test_event_add() +test_event_get(new_event_id) +log.info("===== ЗАВЕРШЕНИЕ ТЕСТИРОВАНИЯ =====") diff --git a/test_chat.lua b/test_chat.lua new file mode 100644 index 0000000..e383b60 --- /dev/null +++ b/test_chat.lua @@ -0,0 +1,90 @@ +local json = require('cjson') +local log = require('utils.log') +local chat = require('bitrix.chat') + +-- Настройка логирования +log.outfile = 'logs/tests_chats_live_'..os.date('%Y-%m-%d_%H-%M-%S')..'.log' +log.level = 'trace' +log.info("===== СТАРТ ТЕСТИРОВАНИЯ (РЕЖИМ LIVE) =====") + +-- ID чата для тестов. ЗАМЕНИТЕ на ID существующего чата. +-- Это может быть ID группы или открытого чата. +local test_chat_id = 1 +local test_user_id_to_add = 2 -- ID пользователя для теста добавления в чат + +--=== ТЕСТЫ ===-- + +local function test_chat_get() + log.info('--- Тест: Получение чата (get) ---') + local result, error_response = chat.get(test_chat_id) + + if result and result.id then + log.info(string.format('Тест получения чата: УСПЕШНО. Название: "%s"', result.name or 'N/A')) + else + log.error('Тест получения чата: ПРОВАЛЕНО.') + log.error('Ответ сервера: ' .. json.encode(result)) + if error_response then log.error(error_response) end + end +end + +local function test_chat_getlist() + log.info('--- Тест: Листинг чатов (getlist) ---') + + -- Фильтр: только открытые чаты (тип 'L' - lines/group), созданные недавно. + local two_days_ago_timestamp = os.time() - 2 * 24 * 3600 + local date_two_days_ago = os.date("%Y-%m-%d", two_days_ago_timestamp) + + local filter = { + TYPE = 'L', + >=DATE_CREATE = date_two_days_ago, + } + + local result_list, error_response = chat.getlist({'ID', 'NAME'}, filter, {'ID', 'NAME', 'TYPE'}, nil, 0) + + if result_list and #result_list > 0 then + log.info(string.format('Тест листинга чатов: УСПЕШНО. Найдено чатов: %d', #result_list)) + elseif result_list and #result_list == 0 then + log.warning('Тест листинга чатов: Чаты не найдены по фильтру.') + else + log.error('Тест листинга чатов: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + +local function test_chat_message_getList() + log.info('--- Тест: Получение сообщений чата (message.getList) ---') + + local result_list, error_response = chat.message.getList(test_chat_id, {'ID'}, {}, 0) + + if result_list and #result_list > 0 then + log.info(string.format('Тест получения сообщений: УСПЕШНО. Найдено сообщений: %d', #result_list)) + elseif result_list and #result_list == 0 then + log.warning('Тест получения сообщений: Сообщений не найдено.') + else + log.error('Тест получения сообщений: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + +local function test_chat_message_add() + log.info('--- Тест: Отправка сообщения в чат (message.add) ---') + + local new_message_text = 'Привет! Это тестовое сообщение от Lua SDK.' + local result, error_response = chat.message.add(test_chat_id, new_message_text) + + if result and result.id then + log.info(string.format('Тест отправки сообщения: УСПЕШНО. ID сообщения: %s', tostring(result.id))) + else + log.error('Тест отправки сообщения: ПРОВАЛЕНО.') + log.error('Ответ сервера: ' .. json.encode(result)) + if error_response then log.error(error_response) end + end +end + + +--=== ЗАПУСК ТЕСТОВ ===-- +test_chat_get() +test_chat_getlist() +test_chat_message_getList() +test_chat_message_add() -- <-- ВНИМАНИЕ! Этот тест отправит сообщение в чат! +log.info("===== ЗАВЕРШЕНИЕ ТЕСТИРОВАНИЯ =====") diff --git a/test_disk.lua b/test_disk.lua new file mode 100644 index 0000000..25ced25 --- /dev/null +++ b/test_disk.lua @@ -0,0 +1,53 @@ +local json = require('cjson') +local log = require('utils.log') +local disk = require('bitrix.disk') + +-- Настройка логирования +log.outfile = 'logs/tests_disk_live_'..os.date('%Y-%m-%d_%H-%M-%S')..'.log' +log.level = 'trace' +log.info("===== СТАРТ ТЕСТИРОВАНИЯ (РЕЖИМ LIVE) =====") + +-- Данные для тестов +local test_storage_id = 1 -- Обычно корневое хранилище имеет ID 1 + +--=== ТЕСТЫ ===-- + +local function test_storage_get() + log.info('--- Тест: Получение списка хранилищ (storage.get) ---') + + local result, error_response = disk.disk.storage.get() + + if result and #result > 0 then + log.info(string.format('Тест получения хранилищ: УСПЕШНО. Найдено хранилищ: %d', #result)) + -- Выведем названия первых двух для примера + log.debug('Пример: ' .. result[1].NAME .. ', ' .. (result[2] and result[2].NAME or 'N/A')) + else + log.error('Тест получения хранилищ: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + +local function test_folder_add() + log.info('--- Тест: Создание папки (folder.add) ---') + + local folder_name = "Test Folder - " .. os.date("%H-%M-%S") + local fields = { + NAME = folder_name, + PARENT_ID = test_storage_id, + } + + local result, error_response = disk.disk.folder.add(fields) + + if result and result.ID then + log.info(string.format('Тест создания папки: УСПЕШНО. ID новой папки: %d', result.ID)) + else + log.error('Тест создания папки: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + + +--=== ЗАПУСК ТЕСТОВ ===-- +test_storage_get() +test_folder_add() +log.info("===== ЗАВЕРШЕНИЕ ТЕСТИРОВАНИЯ =====") diff --git a/test_tasks.lua b/test_tasks.lua new file mode 100644 index 0000000..d705db1 --- /dev/null +++ b/test_tasks.lua @@ -0,0 +1,118 @@ +local json = require('cjson') +local log = require('utils.log') +local tasks = require('bitrix.tasks') + +-- Настройка логирования (можно оставить как в api или задать свою) +log.outfile = 'logs/tests_tasks_live_'..os.date('%Y-%m-%d_%H-%M-%S')..'.log' +log.level = 'trace' -- Уровень детализации логов + +log.info("===== СТАРТ ТЕСТИРОВАНИЯ (РЕЖИМ LIVE) =====") + +-- Подключаем модули. +-- bitrix.api уже содержит в себе все настройки подключения из config.bitrix +local tasks = require('bitrix.tasks') + +-- ID задачи для тестов. Предполагается, что задача с таким ID существует. +-- Если задачи с ID 1 нет, создайте любую тестовую задачу вручную и используйте её ID. +local task_id = 242 + +--=== ТЕСТЫ ===-- + +local function test_task_get() + log.info('--- Тест: Получение задачи (get) ---') + local result, error_response = tasks.task.get(task_id) + + if result and result.task then + log.info(string.format('Тест получения задачи: УСПЕШНО. Название: "%s"', result.task.title or 'N/A')) + else + log.error('Тест получения задачи: ПРОВАЛЕНО.') + log.error('Ответ сервера: ' .. json.encode(result)) + if error_response then + log.error('Ответ сервера: ' .. json.encode(error_response)) + end + end +end + +local function test_task_list() + log.info('--- Тест: Листинг задач (list) ---') + + -- Фильтр: задачи, созданные за последние 2 дня, в статусе "Новая" (STATUS = 0) + + -- 1. Получаем временную метку (timestamp) для момента "2 дня назад" + local two_days_ago_timestamp = os.time() - 2 * 24 * 3600 + + -- 2. Форматируем временную метку в строку вида 'ГГГГ-ММ-ДД' + local date_two_days_ago = os.date("%Y-%m-%d", two_days_ago_timestamp) + + -- 3. Собираем финальный фильтр для API + local filter = { + ['>=DATE_CREATE'] = date_two_days_ago, + ['STATUS'] = '0' + } + + local result_list, error_response = tasks.task.list(nil, filter, {'ID', 'TITLE'}, nil, 0) + + if result_list and #result_list > 0 then + log.info(string.format('Тест листинга задач: УСПЕШНО. Найдено задач: %d', #result_list)) + elseif result_list and #result_list == 0 then + log.warning('Тест листинга задач: Задач не найдено по фильтру. Проверьте даты и статус.') + else + log.error('Тест листинга задач: ПРОВАЛЕНО.') + if error_response then + log.error('Ответ сервера: ' .. json.encode(error_response)) + end + end +end + +local function test_task_add_update_delete() + log.info('--- Тест: Цепочка Add -> Update -> Delete ---') + + -- Add + log.debug('Шаг 1/3: Создание задачи...') + local add_result, add_error = tasks.task.add({ + TITLE = 'Тестовая задача (авто-тест)', + DESCRIPTION = 'Создана автоматически тестовым скриптом', + RESPONSIBLE_ID = 1, -- ID ответственного (обычно 1 - текущий пользователь) + GROUP_ID = {} -- Приватная задача (без группы) + }) + local new_task_id + if add_result and add_result.task and add_result.task.id then + new_task_id = add_result.task.id + log.info(string.format('Шаг 1/3: УСПЕШНО. ID новой задачи: %d', new_task_id)) + else + log.error('Шаг 1/3: ПРОВАЛЕНО (создание).') + if add_error then log.error(add_error) end + return -- Останавливаем тест, если создание не удалось + end + + -- Update + log.debug('Шаг 2/3: Обновление задачи...') + local update_result, update_error = tasks.task.update(new_task_id, { + DESCRIPTION = '[ОБНОВЛЕНО] Задача изменена автоматически тестовым скриптом' + }) + + if update_result and update_result.task then + log.info('Шаг 2/3: УСПЕШНО (обновление).') + else + log.error('Шаг 2/3: ПРОВАЛЕНО (обновление).') + if update_error then log.error(update_error) end + end + + -- Delete + log.debug('Шаг 3/3: Удаление задачи...') + local delete_result, delete_error = tasks.task.delete(new_task_id) + + if delete_result and delete_result.task then + log.info('Шаг 3/3: УСПЕШНО (удаление).') + else + log.error('Шаг 3/3: ПРОВАЛЕНО (удаление).') + if delete_error then log.error(delete_error) end + end +end + + +--=== ЗАПУСК ТЕСТОВ ===-- +test_task_get() +test_task_list() +test_task_add_update_delete() +log.info("===== ЗАВЕРШЕНИЕ ТЕСТИРОВАНИЯ =====") diff --git a/test_telephony.lua b/test_telephony.lua new file mode 100644 index 0000000..edc99c4 --- /dev/null +++ b/test_telephony.lua @@ -0,0 +1,64 @@ +local json = require('cjson') +local log = require('utils.log') +local os = require('os') +local telephony = require('bitrix.telephony') + +-- Настройка логирования +log.outfile = 'logs/tests_telephony_live_'..os.date('%Y-%m-%d_%H-%M-%S')..'.log' +log.level = 'trace' +log.info("===== СТАРТ ТЕСТИРОВАНИЯ (РЕЖИМ LIVE) =====") + +-- Данные для тестов (замените на реальные ID из вашего портала) +local test_user_id = 1 -- ID пользователя, которому покажем звонок +local test_call_id = "123456789" -- Уникальный ID звонка с вашей АТС + +--=== ТЕСТЫ ===-- + +local function test_statistic_get() + log.info('--- Тест: Получение статистики звонков (statistic.get) ---') + + -- Фильтр: статистика за сегодня для указанного пользователя + local today = os.date("%Y-%m-%d") + local filter = { + USER_ID = test_user_id, + '>=DATE_CREATE' = today, + '<=DATE_CREATE' = today, + } + + local result_list, error_response = telephony.statistic.get({'DATE_CREATE'}, filter, 0) + + if result_list and #result_list > 0 then + log.info(string.format('Тест статистики: УСПЕШНО. Найдено записей: %d', #result_list)) + elseif result_list and #result_list == 0 then + log.warning('Тест статистики: Записей не найдено. Возможно, сегодня не было звонков.') + else + log.error('Тест статистики: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + +local function test_externalcall_show() + log.info('--- Тест: Показ карточки звонка (externalcall.show) ---') + + local fields = { + USER_ID = test_user_id, + CALL_ID = test_call_id, + LINE_NUMBER = "100", -- Номер линии или внутренний номер + SHOW = "Y" + } + + local result, error_response = telephony.externalcall.show(fields) + + if result and result.result then + log.info('Тест показа карточки: УСПЕШНО.') + else + log.error('Тест показа карточки: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + + +--=== ЗАПУСК ТЕСТОВ ===-- +test_statistic_get() +test_externalcall_show() +log.info("===== ЗАВЕРШЕНИЕ ТЕСТИРОВАНИЯ =====") diff --git a/test_timeman.lua b/test_timeman.lua new file mode 100644 index 0000000..922eb2c --- /dev/null +++ b/test_timeman.lua @@ -0,0 +1,65 @@ +local json = require('cjson') +local log = require('utils.log') +local timeman = require('bitrix.timeman') + +-- Настройка логирования +log.outfile = 'logs/tests_timeman_live_'..os.date('%Y-%m-%d_%H-%M-%S')..'.log' +log.level = 'trace' +log.info("===== СТАРТ ТЕСТИРОВАНИЯ (РЕЖИМ LIVE) =====") + +--=== ТЕСТЫ ===-- + +local function test_timeman_start() + log.info('--- Тест: Начало рабочего дня (timeman.start) ---') + + local fields = { + DEVICE = { + TYPE = "browser", + NAME = "Lua SDK Test", + LAT = "0", + LON = "0" + } + } + + local result, error_response = timeman.timeman.start(fields) + + if result and result.ID then + log.info(string.format('Тест начала дня: УСПЕШНО. ID записи: %d', result.ID)) + return result.ID -- Возвращаем ID для теста остановки + else + log.error('Тест начала дня: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + return nil + end +end + +local function test_timeman_stop(record_id) + if not record_id then return end -- Если старт не удался, пропускаем + + log.info('--- Тест: Завершение рабочего дня (timeman.stop) ---') + + local fields = { + ID = record_id, + DEVICE = { + TYPE = "browser", + NAME = "Lua SDK Test", + LAT = "0", + LON = "0" + } + } + + local result, error_response = timeman.timeman.stop(fields) + + if result and result.result then + log.info('Тест завершения дня: УСПЕШНО.') + else + log.error('Тест завершения дня: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + + +--=== ЗАПУСК ТЕСТОВ ===-- +local new_record_id = test_timeman_start() +test_timeman_stop(new_record_id) +log.info("===== ЗАВЕРШЕНИЕ ТЕСТИРОВАНИЯ =====") diff --git a/test_user.lua b/test_user.lua new file mode 100644 index 0000000..a707ab4 --- /dev/null +++ b/test_user.lua @@ -0,0 +1,93 @@ +local json = require('cjson') +local log = require('utils.log') + +-- Настройка логирования +log.outfile = 'logs/tests_user_live_'..os.date('%Y-%m-%d_%H-%M-%S')..'.log' +log.level = 'trace' + +log.info("===== СТАРТ ТЕСТИРОВАНИЯ (РЕЖИМ LIVE) =====") + +-- Подключаем модуль. Настройки подключения берутся из bitrix.api +local user = require('bitrix.user') + +-- ID пользователя для тестов. Обычно 1 - это администратор. +local test_user_id = 1 + +--=== ТЕСТЫ ===-- + +local function test_user_get() + log.info('--- Тест: Получение пользователя (get) ---') + local result, error_response = user.get(test_user_id) + + if result and result.users and result.users[1] then + local user_data = result.users[1] + log.info(string.format('Тест получения пользователя: УСПЕШНО. Имя: "%s %s"', user_data.NAME or '', user_data.LAST_NAME or '')) + else + log.error('Тест получения пользователя: ПРОВАЛЕНО.') + log.error('Ответ сервера: ' .. json.encode(result)) + if error_response then + log.error('Ошибка: ' .. json.encode(error_response)) + end + end +end + +local function test_user_getlist() + log.info('--- Тест: Листинг пользователей (getlist) ---') + + -- Фильтр: активные пользователи, у которых есть email + local filter = { + ACTIVE = 'Y', + EMAIL = '%@%' + } + + local result_list, error_response = user.getlist({'LAST_NAME', 'NAME'}, filter, {'ID', 'NAME', 'LAST_NAME', 'EMAIL'}, nil, 0) + + if result_list and result_list.users and #result_list.users > 0 then + log.info(string.format('Тест листинга пользователей: УСПЕШНО. Найдено пользователей: %d', #result_list.users)) + elseif result_list and result_list.users and #result_list.users == 0 then + log.warning('Тест листинга пользователей: Пользователи не найдены по фильтру.') + else + log.error('Тест листинга пользователей: ПРОВАЛЕНО.') + if error_response then + log.error('Ответ сервера: ' .. json.encode(error_response)) + end + end +end + +local function test_user_current() + log.info('--- Тест: Получение текущего пользователя (current) ---') + local result, error_response = user.current() + + if result and result.ID then + log.info(string.format('Тест текущего пользователя: УСПЕШНО. Вы вошли как: "%s %s"', result.NAME or '', result.LAST_NAME or '')) + else + log.error('Тест текущего пользователя: ПРОВАЛЕНО.') + if error_response then + log.error('Ответ сервера: ' .. json.encode(error_response)) + end + end +end + +local function test_user_avatar_get() + log.info('--- Тест: Получение аватара пользователя (avatar.get) ---') + local result, error_response = user.avatar.get(test_user_id, 'big') -- Получаем большой аватар + + if result and result.result then + log.info('Тест получения аватара: УСПЕШНО.') + -- Результат обычно содержит URL до изображения + log.debug('URL аватара: ' .. tostring(result.result)) + else + log.error('Тест получения аватара: ПРОВАЛЕНО.') + if error_response then + log.error('Ответ сервера: ' .. json.encode(error_response)) + end + end +end + + +--=== ЗАПУСК ТЕСТОВ ===-- +test_user_get() +test_user_getlist() +test_user_current() +test_user_avatar_get() +log.info("===== ЗАВЕРШЕНИЕ ТЕСТИРОВАНИЯ =====")