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);
}