• Модуль: 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));
}