- Модуль: timeman
- Путь к файлу: ~/bitrix/modules/timeman/lib/service/schedule/scheduleassignmentsservice.php
- Класс: BitrixTimemanServiceSchedulefor
- Вызов: for::saveAssignments
public function saveAssignments($scheduleOrId, ScheduleForm $scheduleForm)
{
$schedule = $scheduleOrId;
if (!($schedule instanceof Schedule))
{
$schedule = $this->findScheduleWithUsers($scheduleOrId);
}
if (!$schedule)
{
return (new ScheduleServiceResult())->addScheduleNotFoundError();
}
$scheduleId = $schedule->getId();
if ($scheduleForm->isForAllUsers === true && $schedule->getIsForAllUsers() !== true)
{
$this->safeRun(ScheduleTable::update($scheduleId, ['IS_FOR_ALL_USERS' => true]));
$schedule->setIsForAllUsers(true);
}
$oldAssignmentsForm = new ScheduleForm($schedule);
# USERS
$deleteUserIds = array_values(
array_diff(
array_merge($oldAssignmentsForm->userIds, $oldAssignmentsForm->userIdsExcluded),
array_merge($scheduleForm->userIds, $scheduleForm->userIdsExcluded)
)
);
$insertUserIds = array_values(
array_diff(
array_merge($scheduleForm->userIds, $scheduleForm->userIdsExcluded),
array_merge($oldAssignmentsForm->userIds, $oldAssignmentsForm->userIdsExcluded)
)
);
$updateUserIds = array_values(
array_merge(
array_intersect(
$scheduleForm->userIdsExcluded,
$oldAssignmentsForm->userIds
),
array_intersect(
$scheduleForm->userIds,
$oldAssignmentsForm->userIdsExcluded
)
)
);
# delete
$this->safeRun($this->scheduleProvider->deleteUsersAssignments($scheduleId, $deleteUserIds));
# insert
$batchInsertUsersData = [];
foreach ($insertUserIds as $insertUserId)
{
$batchInsertUsersData[] = ScheduleUser::create(
$schedule->getId(),
$insertUserId,
(int)in_array($insertUserId, $scheduleForm->userIdsExcluded)
);
}
$this->safeRun($this->scheduleProvider->addBatchUsers($batchInsertUsersData));
# update
$userIdsToInclude = $userIdsToExclude = [];
foreach ($updateUserIds as $updateUserId)
{
if (in_array($updateUserId, $scheduleForm->userIdsExcluded))
{
$userIdsToExclude[] = $updateUserId;
}
else
{
$userIdsToInclude[] = $updateUserId;
}
}
$this->safeRun($this->scheduleProvider->updateBatchUsers($scheduleId, $userIdsToInclude, ScheduleUserTable::INCLUDED));
$this->safeRun($this->scheduleProvider->updateBatchUsers($scheduleId, $userIdsToExclude, ScheduleUserTable::EXCLUDED));
# DEPARTMENTS
$deleteDepartmentIds = array_diff(
array_merge($oldAssignmentsForm->departmentIds, $oldAssignmentsForm->departmentIdsExcluded),
array_merge($scheduleForm->departmentIds, $scheduleForm->departmentIdsExcluded)
);
$insertDepartmentIds = array_diff(
array_merge($scheduleForm->departmentIds, $scheduleForm->departmentIdsExcluded),
array_merge($oldAssignmentsForm->departmentIds, $oldAssignmentsForm->departmentIdsExcluded)
);
$updateDepartmentIds = array_merge(
array_intersect(
$scheduleForm->departmentIdsExcluded,
$oldAssignmentsForm->departmentIds
),
array_intersect(
$scheduleForm->departmentIds,
$oldAssignmentsForm->departmentIdsExcluded
)
);
# delete
$this->safeRun($this->scheduleProvider->deleteDepartmentsAssignments($scheduleId, $deleteDepartmentIds));
# insert
$batchInsertDepartmentsData = [];
foreach ($insertDepartmentIds as $insertDepartmentId)
{
$item = new ScheduleDepartment(false);
$item->setScheduleId($schedule->getId());
$item->setDepartmentId($insertDepartmentId);
$item->setIsIncluded();
if (in_array($insertDepartmentId, $scheduleForm->departmentIdsExcluded))
{
$item->setIsExcluded();
}
$batchInsertDepartmentsData[] = $item;
}
$this->safeRun($this->scheduleProvider->addBatchDepartments($batchInsertDepartmentsData));
# update
$departmentsToInclude = $departmentsToExclude = [];
foreach ($updateDepartmentIds as $updateDepartmentId)
{
if (in_array($updateDepartmentId, $scheduleForm->departmentIdsExcluded))
{
$departmentsToExclude[] = $updateDepartmentId;
}
else
{
$departmentsToInclude[] = $updateDepartmentId;
}
}
$this->safeRun($this->scheduleProvider->updateBatchDepartments($scheduleId, $departmentsToInclude, 0));
return $this->safeRun($this->scheduleProvider->updateBatchDepartments($scheduleId, $departmentsToExclude, 1));
}