• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/taskwebservice.php
  • Класс: CTasksWebService
  • Вызов: CTasksWebService::UpdateListItems
function UpdateListItems($listName, $updates)
{
	$arPaths = array(
		'user' =>
		COption::GetOptionString('intranet', 'path_task_user_entry', '/company/personal/user/#USER_ID#/tasks/task/view/#TASK_ID#/'),
		'group' =>
		COption::GetOptionString('intranet', 'path_task_group_entry', '/workgroups/group/#GROUP_ID#/tasks/task/view/#TASK_ID#/'),
	);

	if (!$this->__Init())
		return $this->error;

	if (!$listName_original = CIntranetUtils::checkGUID($listName))
	{
		return new CSoapFault('Data error', 'Wrong GUID - '.$listName);
	}

	$listName = ToUpper(CIntranetUtils::makeGUID($listName_original));

	$obResponse = new CXMLCreator('Results');

	$obBatch = $updates->children[0];
	$atrONERROR = $obBatch->getAttribute('OnError');
	$atrDATEINUTC = $obBatch->getAttribute('DateInUtc');
	$atrPROPERTIES = $obBatch->getAttribute('Properties');

	$arChanges = $obBatch->children;

	$arResultIDs = array();
	$dateStart = ConvertTimeStamp(strtotime('-1 hour'), 'FULL');
	$arResponseRows = array();
	$arResponseRowsError = array();
	$arReplicationIDs = array();

	$userId = BitrixTasksUtilUser::getId();

	foreach ($arChanges as $obMethod)
	{
		$arData = array('_command' => $obMethod->getAttribute('Cmd'));

		$ID = false;
		$bUpdate = true;

		$arElement = false;
		$arSection = $this->arUsersSection;

		foreach ($obMethod->children as $obField)
		{
			$name = $obField->getAttribute('Name');
			if ($name == 'MetaInfo')
				$name .= '_'.$obField->getAttribute('Property');

			$arData[$name] = $obField->content;
		}

		$obResponseRow = new CXMLCreator('Result');
		$obResponseRow->setAttribute('ID', $obMethod->getAttribute('ID').','.$arData['_command']);
		$obResponseRow->setAttribute('List', $listName);

		$obResponseRow->addChild($obErrorCode = new CXMLCreator('ErrorCode'));

		if ($arData['ID'] > 0)
		{
			$rsElement = CTasks::GetById($arData['ID']);
			if ($rsElement && $arElement = $rsElement->Fetch())
			{
				if (!is_array($arElement))
				{
					$obErrorCode->setData('0x81020016');
					$bUpdate = false;
				}
				else
				{
					if ($arElement['taskType'] == "group")
					{
						$arGroupTmp = CSocNetGroup::GetByID($arElement['ownerId']);
						if ($arGroupTmp["CLOSED"] == "Y")
							if (COption::GetOptionString("socialnetwork", "work_with_closed_groups", "N") != "Y")
								return new CSoapFault('Cannot modify archive group task', 'Cannot modify archive group task');
					}

					$arElement['arParams'] = array(
						(intval($arElement['GROUP_ID']) > 0 ? 'PATH_TO_USER_TASKS_TASK' : 'PATH_TO_GROUP_TASKS_TASK') =>
						str_replace(
								array('#USER_ID#', '#GROUP_ID#', '#TASK_ID#'), array($userId, $arSection['XML_ID'], $arElement['ID']), $arPaths[$arElement['taskType']]
						),
					);
				}
			}
			else
			{
				$obErrorCode->setData('0x81020016');
				$bUpdate = false;
			}
		}

		if ($bUpdate)
		{
			if ($arData['_command'] == 'Delete' && $arElement["CREATED_BY"] == $userId)
			{
				$arError = false;

				if (!CTasks::Delete($arElement['ID']))
				{
					$obErrorCode->setData('0x81020014');
				}
				else
				{
					$obErrorCode->setData('0x00000000');
				}
			}
			elseif ($arData['_command'] == 'New' || $arData['_command'] == 'Update')
			{
				$arData['Body'] = trim($arData['Body']);
				$arData['Body'] = str_replace(array("
", "
", ' '), "", $arData['Body']);
				$arData['Body'] = preg_replace("/]*>/", '', $arData['Body']);

				if (($pos = mb_strpos($arData['Body'], '')) !== false)
					$arData['Body'] = mb_substr($arData['Body'], $pos + 6);
				echo $pos.' ';
				if (($pos = mb_strpos($arData['Body'], '')) !== false)
					$arData['Body'] = mb_substr($arData['Body'], 0, $pos);
				echo $pos.' ';

				$TZBias = intval(date('Z'));

				$arData['StartDate'] = $arData['StartDate'] ? $this->__makeTS($arData['StartDate']) + $TZBias : '';
				$arData['DueDate'] = $arData['DueDate'] ? $this->__makeTS($arData['DueDate']) + $TZBias : '';

				$arData['MetaInfo_DateComplete'] = $arData['MetaInfo_DateComplete'] ? $this->__makeTS($arData['EndDate']) + $TZBias : '';

				$probablyHtmlInDescription = (mb_strpos($arData['Body'], '<') !== false)
					&& mb_strpos($arData['Body'], '>');

				$arFields = array(
					'DESCRIPTION_IN_BBCODE' => ($probablyHtmlInDescription ? 'N' : 'Y'),
					'CHANGED_BY' => $userId,
					'CHANGED_DATE' => BitrixTasksUI::formatDateTime(time()),
					'SITE_ID' => SITE_ID,
					'TITLE' => html_entity_decode($arData['Title']),
					'START_DATE_PLAN' => $arData['StartDate'] ? ConvertTimeStamp($arData['StartDate']) : '',
					'DEADLINE' => $arData['DueDate'] ? ConvertTimeStamp($arData['DueDate']) : '',
					'DESCRIPTION' => $arData['Body'],
					'PRIORITY' => isset($arData['Priority']) ? intval($arData['Priority']) : 1,
					'DURATION_PLAN' => $arData['MetaInfo_TotalWork'] / 60,
					'DURATION_FACT' => $arData['MetaInfo_ActualWork'] / 60,
					'CLOSED_DATE' => $arData['MetaInfo_DateComplete'] ? ConvertTimeStamp($arData['MetaInfo_DateComplete']) : '',
				);

				if (in_array($arData['Status'], $this->arStatuses))
				{
					$arFields["STATUS"] = $arData['Status'];
				}

				if ($assigned_to = $arData['AssignedTo'])
				{
					if ($USER_ID = $this->__getUser($assigned_to))
					{
						$arFields['RESPONSIBLE_ID'] = $USER_ID;
					}
					else
					{
						$obErrorCode->setData('0x81020054');
						$bUpdate = false;
					}
				}
				else
					$arFields['RESPONSIBLE_ID'] = $userId;

				if ($bUpdate)
				{
					CTimeZone::Disable();

					$ID = 0;
					$obTask = new CTasks();
					$arError = false;
					if ($arData['_command'] == 'New')
					{
						if ($arFields["RESPONSIBLE_ID"] == $userId || CTasks::IsSubordinate($arFields["RESPONSIBLE_ID"], $userId))
						{
							$arFields["STATUS"] = 2;
						}
						else
						{
							$arFields["STATUS"] = 1;
						}

						$arFields['OUTLOOK_VERSION'] = 1;

						$arFields["CREATED_BY"] = $userId;
						$arFields["CREATED_DATE"] = BitrixTasksUI::formatDateTime(time());

						if ($ID = $obTask->Add($arFields))
						{
							$arReplicationIDs[$ID] = $arData['MetaInfo_ReplicationID'];
							$obErrorCode->setData('0x00000000');

							BitrixTasksKanbanStagesTable::pinInStage($ID);
						}
					}
					else
					{
						if ($arElement["CREATED_BY"] == $userId || $arElement["RESPONSIBLE_ID"] == $userId)
						{
							if ($arElement["CREATED_BY"] != $userId)
							{
								unset($arFields["TITLE"], $arFields["START_DATE_PLAN"], $arFields["DESCRIPTION"], $arFields["PRIORITY"], $arFields["DURATION_PLAN"], $arFields["CLOSED_DATE"]);
								if ($arElement["ALLOW_CHANGE_DEADLINE"] != "Y")
								{
									unset($arFields["DEADLINE"]);
								}
								if ($arElement["TASK_CONTROL"] != "Y" && $arFields["STATUS"] == 5)
								{
									$arFields["STATUS"] = 4;
								}
							}
							elseif ($arElement["RESPONSIBLE_ID"] != $userId && ($arFields["STATUS"] == 6 || $arFields["STATUS"] == 3))
							{
								unset($arFields["STATUS"]);
							}

							$arFields['OUTLOOK_VERSION'] = $arData['owshiddenversion'];

							if (sizeof($arFields) > 0)
							{
								if ($obTask->Update($arData['ID'], $arFields))
								{
									$ID = $arData['ID'];
									$obErrorCode->setData('0x00000000');
								}
							}
						}
					}

					CTimeZone::Enable();

					if (is_array($obTask->GetErrors()) && count($obTask->GetErrors()) > 0)
					{
						$ID = 0;
						$obErrorCode->setData('0x81020014');
						$bUpdate = false;
					}
					else
					{
						$taskType = $arElement ? $arElement['taskType'] : 'user';
						$ownerId = $arElement ? $arElement['ownerId'] : $userId;
						$arParams = $arElement ? $arElement['arParams'] : array(
							'PATH_TO_USER_TASKS_TASK' => str_replace(
									array('#USER_ID#', '#GROUP_ID#', '#TASK_ID#'), array($userId, $arSection['XML_ID'], $ID), $arPaths['user']
							)
						);
					}
				}
			}
		}

		if ($ID > 0)
			$arResponseRows[$ID] = $obResponseRow;
		else
			$arResponseRowsError[] = $obResponseRow;
	}

	if (sizeof($arResponseRows) > 0)
	{
		$dbRes = CTasks::GetList(
						array('ID' => 'ASC'), array(
					'ID' => array_keys($arResponseRows),
					'MEMBER' => $userId
						)
		);

		while ($arRes = $dbRes->Fetch())
		{
			if ($arResponseRows[$arRes['ID']])
			{
				$rsFiles = CTaskFiles::GetList(array(), array("TASK_ID" => $arRes["ID"]));
				$arRes["FILES"] = array();
				while ($arFiles = $rsFiles->Fetch())
				{
					$arRes["FILES"][] = $arFiles["FILE_ID"];
				}
				$arRes['TITLE'] = BitrixMainTextEmoji::decode($arRes['TITLE']);
				$last_change = 0;
				$obRow = $this->__getRow($arRes, $listName, $last_change);

				if ($arReplicationIDs[$arRes['ID']])
					$obRow->setAttribute('ows_MetaInfo_ReplicationID', $arReplicationIDs[$arRes['ID']]);

				$obRow->setAttribute('xmlns:z', "#RowsetSchema");

				$arResponseRows[$arRes['ID']]->addChild($obRow);
				$obResponse->addChild($arResponseRows[$arRes['ID']]);
			}
		}
	}

	foreach ($arResponseRowsError as $obChange)
	{
		$obResponse->addChild($obChange);
	}

	return array('UpdateListItemsResult' => $obResponse);
}