Задать вопрос
@redesupar

Как сменить в задачах одного пользователя на другого в битрикс24?

Здравствуйте! Делаю маленький модуль по смене пользователя в задачах в зависимости от роли.
Но столкнулся с проблемой которую не могу решить уже 2 день) наблюдатели и соисполнители ну никак не меняются, как можно его сделать?

<?php
require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");

// Включаем отображение ошибок
error_reporting(E_ALL);
ini_set('display_errors', '1');

function logError($message) {
    error_log($message);
    echo $message . "<br>";
}

// Отладка: выводим входящие POST данные
logError("Чтение POST данных: " . print_r($_POST, true));

// Проверка, существуют ли обязательные поля
if (empty($_POST["OLDUSER"]) || empty($_POST["NEWUSER"])) {
    logError("Пожалуйста, укажите ID старого и нового пользователей.");
    exit;
}

$oldUserId = intval($_POST["OLDUSER"]);
$newUserId = intval($_POST["NEWUSER"]);
$creationDateFrom = $_POST['CREATION_DATE_FROM'];
$creationDateTo = $_POST['CREATION_DATE_TO'];
$taskStatus = $_POST['TASK_STATUS'] ?? [];
$userRoles = $_POST['USER_ROLES'] ?? [];
$dateFrom = '08.10.2024 00:00:00'; 
$dateTo = '21.10.2024 00:00:00'; 
// Проверка корректности ID пользователей
if ($oldUserId <= 0 || $newUserId <= 0) {
    logError("Некорректные ID пользователей.");
    exit;
}

// Получаем информацию о старом и новом пользователе
$oldUser = CUser::GetByID($oldUserId)->Fetch();
$newUser = CUser::GetByID($newUserId)->Fetch();

// Проверка существования пользователей
if (!$oldUser) {
    logError("Не найден старый пользователь с ID: $oldUserId");
    exit;
}
if (!$newUser) {
    logError("Не найден новый пользователь с ID: $newUserId");
    exit;
}

// Создаем основной фильтр
$filter = [
    '::LOGIC' => 'AND',
    '>=CREATED_DATE' => $dateFrom,
    '<=CREATED_DATE' => !empty($creationDateTo) ? ConvertTimeStamp(strtotime($creationDateTo) + 86400, "FULL") : null,
];

// Создаем подфильтр
$subFilter = [
    '::LOGIC' => 'OR',
];

// Добавляем условия для ролей
if (in_array("executor", $userRoles)) {
    $subFilter['::SUBFILTER-1'] = [
        'ACCOMPLICES' => array($oldUserId),
        'REAL_STATUS' => array(CTasks::STATE_NEW, CTasks::STATE_PENDING, CTasks::STATE_IN_PROGRESS),
    ];
}
if (in_array("creator", $userRoles)) {
    $subFilter['::SUBFILTER-2'] = [
        'CREATED_BY' => array($oldUserId),
        'REAL_STATUS' => array(CTasks::STATE_NEW, CTasks::STATE_PENDING, CTasks::STATE_IN_PROGRESS),
    ];
}

if (in_array("responsible", $userRoles)) {
    $subFilter['::SUBFILTER-3'] = [
        'RESPONSIBLE_ID' => $oldUserId,
        'REAL_STATUS' => array(CTasks::STATE_NEW, CTasks::STATE_PENDING, CTasks::STATE_IN_PROGRESS),
    ];
}

if (in_array("observer", $userRoles)) {
    $subFilter['::SUBFILTER-4'] = [
        'AUDITORS' => array($oldUserId),
        'REAL_STATUS' => array(CTasks::STATE_NEW, CTasks::STATE_PENDING, CTasks::STATE_IN_PROGRESS),
    ];
}

// Проверяем, добавлены ли подфильтры
if (!empty($subFilter)) {
    $filter['::SUBFILTER'] = $subFilter;
}

// Отладка: выводим фильтр
logError("Фильтр задач: " . print_r($filter, true));

// Получение задач
$res = CTasks::GetList([], $filter);
$tasksUpdated = 0; // Счетчик обновленных задач

while ($arTask = $res->GetNext()) {
    $arFields = [];
    $isUpdated = false;

    // Логика обновления задач остается прежней

    // Проверяем роль "Создатель"
    if (in_array("creator", $userRoles) && $arTask["CREATED_BY"] == $oldUserId) {
        $arFields["CREATED_BY"] = $newUser["ID"];
        $isUpdated = true;
    }

    // Проверяем роль "Ответственный"
    if (in_array("responsible", $userRoles) && $arTask["RESPONSIBLE_ID"] == $oldUserId) {
        $arFields["RESPONSIBLE_ID"] = $newUser["ID"];
        $isUpdated = true;
    }

// Проверяем роль "Соисполнитель"
if (in_array("executor", $userRoles)) {
    $accomplices = isset($arTask["ACCOMPLICES"]) ? $arTask["ACCOMPLICES"] : [];
    if (!empty($accomplices) && in_array($oldUserId, $accomplices)) {
        // Удаляем старого соисполнителя, добавляем нового
        $arFields["ACCOMPLICES"] = array_values(array_unique(array_diff($accomplices, [$oldUserId]))); // Удаляем старого соисполнителя
        $arFields["ACCOMPLICES"][] = $newUser["ID"]; // Добавляем нового соисполнителя
        $isUpdated = true;
    }
}

// Проверяем роль "Наблюдатель"
if (in_array("observer", $userRoles)) {
    $auditors = isset($arTask["AUDITORS"]) ? $arTask["AUDITORS"] : [];
    if (!empty($auditors) && in_array($oldUserId, $auditors)) {
        // Удаляем старого наблюдателя, добавляем нового
        $arFields["AUDITORS"] = array_values(array_unique(array_diff($auditors, [$oldUserId]))); // Удаляем старого наблюдателя
        $arFields["AUDITORS"][] = $newUser["ID"]; // Добавляем нового наблюдателя
        $isUpdated = true;
    }
}

    // Обновляем задачу, если были изменения
    if ($isUpdated) {
        $obTask = new CTasks;
        $success = $obTask->Update($arTask["ID"], $arFields);

        if ($success) {
            $tasksUpdated++;
            logError("Задача с ID {$arTask['ID']} успешно обновлена.");
        } else {
            if ($e = $APPLICATION->GetException()) {
                logError("Ошибка при обновлении задачи ID {$arTask['ID']}: " . htmlspecialchars($e->GetString()));
            }
        }
    }
}

if ($tasksUpdated === 0) {
    logError("Не найдено задач для обновления в соответствии с заданными фильтрами.");
    echo '<pre>'; print_r($filter); echo '</pre>';

}
?>
  • Вопрос задан
  • 42 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы