Здравствуйте! Делаю маленький модуль по смене пользователя в задачах в зависимости от роли.
Но столкнулся с проблемой которую не могу решить уже 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>';
}
?>