From ca54af0f13e4b369d4f153a55a6f1b7f3a9bc18f 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: Sat, 4 Apr 2026 11:11:04 +0400 Subject: [PATCH] departments --- README.md | 54 +++++++++++++++++++ bitrix/department.lua | 54 +++++++++++++++++++ test_department.lua | 118 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 226 insertions(+) create mode 100644 bitrix/department.lua create mode 100644 test_department.lua diff --git a/README.md b/README.md index 076b16e..1623324 100644 --- a/README.md +++ b/README.md @@ -1877,3 +1877,57 @@ timeman.start(fields) ```lua timeman.stop(fields) ``` + +# Отделы + +```lua +local departments = require("bitrix.departments") +``` + +#### Создать подразделение `departments.add` + +[departments.add](https://apidocs.bitrix24.ru/api-reference/departments/departments-add.html) + +```lua +departments.add(fields) +``` + +#### Изменить подразделение `departments.update` + +[departments.update](https://apidocs.bitrix24.ru/api-reference/departments/departments-update.html) + +```lua +departments.update(id, fields) +``` + +#### Получить подразделение по ID `departments.get` + +[departments.get](https://apidocs.bitrix24.ru/api-reference/departments/departments-get.html) + +```lua +departments.get(id) +``` + +#### Получить список подразделений `departments.getlist` + +[departments.getlist](https://apidocs.bitrix24.ru/api-reference/departments/departments-getlist.html) + +```lua +departments.getlist(order, filter, select, start) +``` + +#### Получить справочник полей подразделения `departments.fields` + +[departments.fields](https://apidocs.bitrix24.ru/api-reference/departments/departments-fields.html) + +```lua +departments.fields() +``` + +#### Удалить подразделение `departments.delete` + +[departments.delete](https://apidocs.bitrix24.ru/api-reference/departments/departments-delete.html) + +```lua +departments.delete(id) +``` diff --git a/bitrix/department.lua b/bitrix/department.lua new file mode 100644 index 0000000..d546db5 --- /dev/null +++ b/bitrix/department.lua @@ -0,0 +1,54 @@ +local _M = require('bitrix.api') +local array = require('utils.array') + +_M.departments = {} + +--[[ + Департаменты (departments.*) +--]] + +-- https://apidocs.bitrix24.ru/api-reference/departments/departments-add.html + +function _M.departments.add(fields) + return _M.post('department.add', { ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/departments/departments-update.html + +function _M.departments.update(id, fields) + return _M.post('department.update', { ['ID'] = id, ['fields'] = fields }) +end + +-- https://apidocs.bitrix24.ru/api-reference/departments/departments-get.html + +function _M.departments.get(id) + return _M.post('department.get', { ['ID'] = id }) +end + +-- https://apidocs.bitrix24.ru/api-reference/departments/departments-getlist.html + +function _M.departments.getlist(order, filter, select, start) + select = select or {'*'} + return _M.fetchAllPages(function(startPos) + return _M.post('department.getlist', { + ['order'] = order, + ['filter'] = filter, + ['select'] = select, + ['start'] = startPos + }, true) + end, start) +end + +-- https://apidocs.bitrix24.ru/api-reference/departments/departments-fields.html + +function _M.departments.fields() + return _M.post('department.fields', {}) +end + +-- https://apidocs.bitrix24.ru/api-reference/departments/departments-delete.html + +function _M.departments.delete(id) + return _M.post('department.delete', { ['ID'] = id }) +end + +return _M diff --git a/test_department.lua b/test_department.lua new file mode 100644 index 0000000..6515462 --- /dev/null +++ b/test_department.lua @@ -0,0 +1,118 @@ +local json = require('cjson') +local log = require('utils.log') +local departments = require('bitrix.departments') + +-- Настройка логирования +log.outfile = 'logs/tests_departments_live_'..os.date('%Y-%m-%d_%H-%M-%S')..'.log' +log.level = 'trace' +log.info("===== СТАРТ ТЕСТИРОВАНИЯ (РЕЖИМ LIVE) =====") + +--=== ТЕСТЫ ===-- + +local function test_departments_fields() + log.info('--- Тест: Получение справочника полей (fields) ---') + + local result, error_response = departments.departments.fields() + + if result then + log.info('Тест полей: УСПЕШНО.') + log.debug('Пример поля: NAME - ' .. result.NAME) + else + log.error('Тест полей: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + +local function test_departments_add() + log.info('--- Тест: Создание подразделения (add) ---') + + -- Создадим тестовый отдел с уникальным именем + local dept_name = "Test Dept - " .. os.date("%H-%M-%S") + local fields = { + NAME = dept_name, + SORT = 100, + PARENT_ID = 1 -- Родительский отдел (обычно 1 - компания) + } + + local result, error_response = departments.departments.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_departments_getlist(dept_name) + -- Этот тест запускается после создания отдела, чтобы найти его в списке + if not dept_name then return end + + log.info('--- Тест: Получение списка подразделений (getlist) ---') + + -- Используем фильтр по имени, чтобы найти наш только что созданный отдел + local filter = { + NAME = dept_name + } + + local result_list, error_response = departments.departments.getlist({'NAME'}, filter, {'ID', 'NAME'}, 0) + + if result_list and #result_list > 0 then + log.info(string.format('Тест getlist: УСПЕШНО. Найдено отделов по фильтру: %d', #result_list)) + + -- Проверим, что имя первого найденного отдела совпадает с искомым + if result_list[1].NAME == dept_name then + log.debug('Проверка имени: УСПЕШНО. Найден отдел: ' .. result_list[1].NAME) + else + log.warning('Найден отдел, но имя не совпадает с искомым.') + end + else + log.error('Тест getlist: ПРОВАЛЕНО. Отдел не найден в списке.') + if error_response then log.error(error_response) end + end +end + +local function test_departments_update(new_dept_id) + if not new_dept_id then return end + + log.info('--- Тест: Обновление подразделения (update) ---') + + local fields = { + NAME = "Updated Test Dept - " .. os.date("%H-%M-%S") -- Меняем имя + } + + local result, error_response = departments.departments.update(new_dept_id, fields) + + if result and result.result then + log.info('Тест обновления: УСПЕШНО.') + else + log.error('Тест обновления: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end +end + +local function test_departments_delete(new_dept_id) + if not new_dept_id then return end + + log.info('--- Тест: Удаление подразделения (delete) ---') + + local result, error_response = departments.departments.delete(new_dept_id) + + if result and result.result then + log.info('Тест удаления: УСПЕШНО.') + else + log.error('Тест удаления: ПРОВАЛЕНО.') + if error_response then log.error(error_response) end + end + + +--=== ЗАПУСК ТЕСТОВ ===-- +test_departments_fields() +local dept_name_for_list = "Test Dept - " .. os.date("%H-%M-%S") -- Сохраняем имя для теста getlist +local new_dept_id = test_departments_add() +test_departments_getlist(dept_name_for_list) -- <-- ЗДЕСЬ ВЫЗОВ getlist +test_departments_update(new_dept_id) +test_departments_delete(new_dept_id) +log.info("===== ЗАВЕРШЕНИЕ ТЕСТИРОВАНИЯ =====")