private function proceedAction($actionId, $arActionArguments = null) { $actionId = (int) $actionId; if ($actionId == self::ACTION_ADD_FAVORITE || $actionId == self::ACTION_DELETE_FAVORITE || $actionId == self::ACTION_TOGGLE_FAVORITE) { if (!is_array($arActionArguments)) { $arActionArguments = array(); } $addChildren = true; if (array_key_exists('AFFECT_CHILDREN', $arActionArguments)) { $addChildren = $arActionArguments['AFFECT_CHILDREN'] == 'Y' || $arActionArguments['AFFECT_CHILDREN'] === true; } $tellSocnet = true; if (array_key_exists('TELL_SOCNET', $arActionArguments)) { $tellSocnet = $arActionArguments['TELL_SOCNET'] == 'Y' || $arActionArguments['TELL_SOCNET'] === true; } switch ($actionId) { case self::ACTION_ADD_FAVORITE: $f = 'add'; break; case self::ACTION_DELETE_FAVORITE: $f = 'delete'; break; default: $f = 'toggle'; break; } // ensure we have access to the task $this->checkCanReadThrowException(); // drop cache $this->markCacheAsDirty(); // here could be trouble: socnet doesn`t know anything aboult child tasks // in case of a ticket came, get all child tasks IDs here, pass ID list to \Bitrix\Tasks\Integration\Socialnetwork\Task::toggleFavorites() // and also pass ID list as a cache to FavoriteTable::$f to avoid calling same query twice $res = FavoriteTable::$f(array('TASK_ID' => $this->getId(), 'USER_ID' => $this->executiveUserId), array('AFFECT_CHILDREN' => $addChildren)); if (!$res->isSuccess()) { static::throwExceptionVerbose($res->getErrors()); } if ($actionId == self::ACTION_TOGGLE_FAVORITE) { $result = $res instanceof \Bitrix\Main\Entity\AddResult; $add = $result; } else { $result = true; $add = $actionId == self::ACTION_ADD_FAVORITE; } foreach (GetModuleEvents('tasks', 'OnTaskToggleFavorite', true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($this->getId(), $this->executiveUserId, $add)); } if ($tellSocnet) { \Bitrix\Tasks\Integration\Socialnetwork\Task::toggleFavorites(array('TASK_ID' => $this->getId(), 'USER_ID' => $this->executiveUserId, 'OPERATION' => $add ? 'ADD' : 'DELETE')); } return $result; } $arTaskData = $this->getData($bSpecialChars = false); $arNewFields = null; if ($actionId == self::ACTION_REMOVE) { if (!$this->isActionAllowed(self::ACTION_REMOVE)) { throw new TasksException('', TasksException::TE_ACTION_NOT_ALLOWED | TasksException::TE_ACCESS_DENIED); } $this->markCacheAsDirty(); /** @noinspection PhpDeprecationInspection */ if (CTasks::Delete($this->taskId) !== true) { throw new TasksException('Cannot delete task ' . $this->taskId, TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED); } return; } elseif ($actionId == self::ACTION_EDIT) { $this->lastOperationResultData['UPDATE'] = array(); $arFields = $arActionArguments['FIELDS']; $arParams = $arActionArguments['PARAMETERS']; if (!is_array($arParams)) { $arParams = array(); } if (isset($arFields['ID'])) { unset($arFields['ID']); } $arParams = array_merge($arParams, array('USER_ID' => $this->executiveUserId, 'CHECK_RIGHTS_ON_FILES' => true)); $actionChangeDeadlineFields = array('DEADLINE', 'START_DATE_PLAN', 'END_DATE_PLAN'); $arGivenFieldsNames = array_keys($arFields); if (array_key_exists('STATUS', $arFields) && !in_array((int) $arFields['STATUS'], array(CTasks::STATE_NEW, CTasks::STATE_PENDING, CTasks::STATE_IN_PROGRESS, CTasks::STATE_SUPPOSEDLY_COMPLETED, CTasks::STATE_COMPLETED, CTasks::STATE_DEFERRED, CTasks::STATE_DECLINED), true)) { throw new TasksException('Invalid status given', TasksException::TE_WRONG_ARGUMENTS); } if (array_key_exists('PRIORITY', $arFields) && !in_array((int) $arFields['PRIORITY'], array(CTasks::PRIORITY_LOW, CTasks::PRIORITY_AVERAGE, CTasks::PRIORITY_HIGH), true)) { throw new TasksException('Invalid priority given', TasksException::TE_WRONG_ARGUMENTS); } if (array_key_exists('CREATED_BY', $arFields) && !$this->isActionAllowed(self::ACTION_CHANGE_DIRECTOR)) { throw new TasksException('Access denied for field CREATED_BY to be updated', TasksException::TE_ACTION_NOT_ALLOWED); } if (array_diff($actionChangeDeadlineFields, $arGivenFieldsNames) && !$this->isActionAllowed(self::ACTION_CHANGE_DEADLINE)) { throw new TasksException('Access denied for field CREATED_BY to be updated', TasksException::TE_ACTION_NOT_ALLOWED); } // Get list of fields, except just checked above $arGeneralFields = array_diff($arGivenFieldsNames, array_merge($actionChangeDeadlineFields, array('CREATED_BY'))); // Is there is something more for update? if (!empty($arGeneralFields)) { if (!$this->isActionAllowed(self::ACTION_EDIT)) { throw new TasksException('Access denied for field CREATED_BY to be updated', TasksException::TE_ACTION_NOT_ALLOWED); } } $this->markCacheAsDirty(); $o = new CTasks(); /** @noinspection PhpDeprecationInspection */ if ($o->update($this->taskId, $arFields, $arParams) !== true) { $this->markCacheAsDirty(); static::throwExceptionVerbose($o->GetErrors()); } $this->markCacheAsDirty(); $this->lastOperationResultData['UPDATE'] = $o->getLastOperationResultData(); $prevData = $o->getPreviousData(); if ($arActionArguments['SUBTASKS_CHANGE_GROUP'] !== false && intval($prevData['GROUP_ID']) != intval($arFields['GROUP_ID'])) { $this->moveSubTasksToGroup($arFields['GROUP_ID']); } return; } switch ($actionId) { case self::ACTION_ACCEPT: $arNewFields['STATUS'] = CTasks::STATE_PENDING; break; case self::ACTION_DECLINE: $arNewFields['STATUS'] = CTasks::STATE_DECLINED; if (isset($arActionArguments['DECLINE_REASON'])) { $arNewFields['DECLINE_REASON'] = $arActionArguments['DECLINE_REASON']; } else { $arNewFields['DECLINE_REASON'] = ''; } break; case self::ACTION_COMPLETE: if ($arTaskData['TASK_CONTROL'] === 'N' || $arTaskData['CREATED_BY'] == $this->executiveUserId) { $arNewFields['STATUS'] = CTasks::STATE_COMPLETED; } else { $arNewFields['STATUS'] = CTasks::STATE_SUPPOSEDLY_COMPLETED; } break; case self::ACTION_APPROVE: $arNewFields['STATUS'] = CTasks::STATE_COMPLETED; break; case self::ACTION_START: $arNewFields['STATUS'] = CTasks::STATE_IN_PROGRESS; break; case self::ACTION_PAUSE: $arNewFields['STATUS'] = CTasks::STATE_PENDING; break; case self::ACTION_DELEGATE: $arNewFields['STATUS'] = CTasks::STATE_PENDING; if (!isset($arActionArguments['RESPONSIBLE_ID'])) { throw new TasksException('Expected $arActionArguments[\'RESPONSIBLE_ID\']', TasksException::TE_WRONG_ARGUMENTS); } $arNewFields['RESPONSIBLE_ID'] = $arActionArguments['RESPONSIBLE_ID']; if (isset($arTaskData['AUDITORS']) && count($arTaskData['AUDITORS'])) { if (!in_array($this->executiveUserId, $arTaskData['AUDITORS'])) { $arNewFields['AUDITORS'] = $arTaskData['AUDITORS']; $arNewFields['AUDITORS'][] = $this->executiveUserId; } } else { $arNewFields['AUDITORS'] = array($this->executiveUserId); } break; case self::ACTION_DEFER: $arNewFields['STATUS'] = CTasks::STATE_DEFERRED; break; case self::ACTION_DISAPPROVE: case self::ACTION_RENEW: $arNewFields['STATUS'] = CTasks::STATE_PENDING; break; default: break; } if ($arNewFields === null) { throw new TasksException(); } // Don't update task, if nothing changed $bNeedUpdate = false; foreach ($arNewFields as $fieldName => $newValue) { $curValue = $arTaskData[$fieldName]; // Convert task data arrays to strings, for comparing if (is_array($curValue)) { sort($curValue); sort($newValue); $curValue = implode('|', $curValue); $newValue = implode('|', $newValue); } if ($curValue != $newValue) { $bNeedUpdate = true; break; } } if ($bNeedUpdate) { if (!$this->isActionAllowed($actionId)) { throw new TasksException('', TasksException::TE_ACTION_NOT_ALLOWED | TasksException::TE_ACCESS_DENIED); } $arParams = array('USER_ID' => $this->executiveUserId); $this->markCacheAsDirty(); $o = new CTasks(); /** @noinspection PhpDeprecationInspection */ if ($o->Update($this->taskId, $arNewFields, $arParams) !== true) { throw new TasksException('', TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED); } } }
function UpdateListItems($listName, $updates) { global $USER, $DB; $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(); 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($USER->GetID(), $arSection['XML_ID'], $arElement['ID']), $arPaths[$arElement['taskType']])); } } else { $obErrorCode->setData('0x81020016'); $bUpdate = false; } } if ($bUpdate) { if ($arData['_command'] == 'Delete' && $arElement["CREATED_BY"] == $USER->GetID()) { $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 = strpos($arData['Body'], '<BODY>')) !== false) { $arData['Body'] = substr($arData['Body'], $pos + 6); } echo $pos . ' '; if (($pos = strpos($arData['Body'], '</BODY>')) !== false) { $arData['Body'] = 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 = strpos($arData['Body'], '<') !== false && strpos($arData['Body'], '>'); $arFields = array('DESCRIPTION_IN_BBCODE' => $probablyHtmlInDescription ? 'N' : 'Y', 'CHANGED_BY' => $USER->GetID(), 'CHANGED_DATE' => date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), time()), 'SITE_ID' => SITE_ID, 'TITLE' => $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'] = $USER->getId(); } if ($bUpdate) { CTimeZone::Disable(); $ID = 0; $obTask = new CTasks(); $arError = false; if ($arData['_command'] == 'New') { if ($arFields["RESPONSIBLE_ID"] == $USER->GetID() || CTasks::IsSubordinate($arFields["RESPONSIBLE_ID"], $USER->GetID())) { $arFields["STATUS"] = 2; } else { $arFields["STATUS"] = 1; } $arFields['OUTLOOK_VERSION'] = 1; $arFields["CREATED_BY"] = $USER->GetID(); $arFields["CREATED_DATE"] = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), time()); if ($ID = $obTask->Add($arFields)) { $arReplicationIDs[$ID] = $arData['MetaInfo_ReplicationID']; $obErrorCode->setData('0x00000000'); } } else { if ($arElement["CREATED_BY"] == $USER->GetID() || $arElement["RESPONSIBLE_ID"] == $USER->GetID()) { if ($arElement["CREATED_BY"] != $USER->GetID()) { 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"] != $USER->GetID() && ($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'] : $USER->GetID(); $arParams = $arElement ? $arElement['arParams'] : array('PATH_TO_USER_TASKS_TASK' => str_replace(array('#USER_ID#', '#GROUP_ID#', '#TASK_ID#'), array($USER->GetID(), $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' => $USER->GetID())); 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"]; } $obRow = $this->__getRow($arRes, $listName, $last_change = 0); 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); }
$rsTask = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if ($arTask = $rsTask->Fetch()) { $updateID = $arTask["ID"]; } } else { $strSql = "SELECT * FROM b_tasks WHERE CREATED_BY = '" . $newTask["CREATED_BY"] . "' AND CREATED_DATE = '" . $newTask["CREATED_DATE"] . "'"; $rsTask = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); while ($arTask = $rsTask->Fetch()) { $updateID = $arTask["ID"]; } } if ($updateID) { $oTask->Update($updateID, $newTask); } else { $oTask->Add($newTask); } if (sizeof($oTask->GetErrors()) == 0) { $CNT++; } if (microtime(true) - $start_time > 1) { header("Location: ?ID=" . $ID . "&CNT=" . $CNT . "&IBN=" . $i); } } $ID = 0; } require $_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/include/prolog_admin_after.php"; COption::SetOptionString("intranet", "use_tasks_2_0", "Y"); CAdminMessage::ShowNote(str_replace("#TASKS_NUM#", $CNT, GetMessage("TASKS_ADDED"))); echo "<form action=\"/bitrix/admin/module_admin.php\"><input type=\"hidden\" name=\"lang\" value=\"" . LANG . "\" /><input type=\"submit\" value=\"" . GetMessage("MOD_BACK") . "\" />"; } require $_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/include/epilog_admin.php";
public function Execute() { if (!CModule::IncludeModule("tasks")) { return CBPActivityExecutionStatus::Closed; } $rootActivity = $this->GetRootActivity(); $documentId = $rootActivity->GetDocumentId(); $arFields = $this->Fields; $arFields["CREATED_BY"] = CBPHelper::ExtractUsers($this->Fields["CREATED_BY"], $documentId, true); $arFields["RESPONSIBLE_ID"] = CBPHelper::ExtractUsers($this->Fields["RESPONSIBLE_ID"], $documentId, true); $arFields["ACCOMPLICES"] = CBPHelper::ExtractUsers($this->Fields["ACCOMPLICES"], $documentId); $arFields["AUDITORS"] = CBPHelper::ExtractUsers($this->Fields["AUDITORS"], $documentId); if (isset($this->Fields['DESCRIPTION'])) { $arFields['DESCRIPTION'] = preg_replace('/\\[url=(.*)\\](.*)\\[\\/url\\]/i' . BX_UTF_PCRE_MODIFIER, '<a href="${1}">${2}</a>', $this->Fields['DESCRIPTION']); } if (!$arFields["SITE_ID"]) { $arFields["SITE_ID"] = SITE_ID; } if ($this->AUTO_LINK_TO_CRM_ENTITY && CModule::IncludeModule('crm')) { $rootActivity = $this->GetRootActivity(); $documentId = $rootActivity->GetDocumentId(); $documentType = $rootActivity->GetDocumentType(); $letter = CCrmOwnerTypeAbbr::ResolveByTypeID(CCrmOwnerType::ResolveID($documentType[2])); $arFields['UF_CRM_TASK'] = array(str_replace($documentType[2], $letter, $documentId[2])); } $arUnsetFields = array(); foreach ($arFields as $fieldName => $fieldValue) { if (substr($fieldName, -5) === '_text') { $arFields[substr($fieldName, 0, -5)] = $fieldValue; $arUnsetFields[] = $fieldName; } } foreach ($arUnsetFields as $fieldName) { unset($arFields[$fieldName]); } // Check fields for "white" list $arFieldsChecked = array(); foreach (array_keys($arFields) as $fieldName) { if (in_array($fieldName, static::$arAllowedTasksFieldNames, true) || strlen($fieldName) > 3 && substr($fieldName, 0, 3) === 'UF_') { if ('UF_TASK_WEBDAV_FILES' == $fieldName && is_array($arFields[$fieldName])) { foreach ($arFields[$fieldName] as $key => $fileId) { if (!empty($fileId) && is_string($fileId) && substr($fileId, 0, 1) != 'n') { if (CModule::IncludeModule("disk") && \Bitrix\Disk\Configuration::isSuccessfullyConverted()) { $item = \Bitrix\Disk\Internals\FileTable::getList(array('select' => array('ID'), 'filter' => array('=XML_ID' => $fileId, 'TYPE' => \Bitrix\Disk\Internals\FileTable::TYPE_FILE)))->fetch(); if ($item) { $arFields[$fieldName][$key] = 'n' . $item['ID']; } } } } unset($fileId); } $arFieldsChecked[$fieldName] = $arFields[$fieldName]; } } $task = new CTasks(); $result = $task->Add($arFieldsChecked, array('USER_ID' => 1)); if (!$result) { $arErrors = $task->GetErrors(); if (count($arErrors) > 0) { $errorDesc = array(); if (is_array($arErrors) && !empty($arErrors)) { foreach ($arErrors as $error) { $errorDesc[] = $error['text'] . ' (' . $error['id'] . ')'; } } $this->WriteToTrackingService(GetMessage("BPSA_TRACK_ERROR") . (!empty($errorDesc) ? ' ' . implode(', ', $errorDesc) : '')); } return CBPActivityExecutionStatus::Closed; } $this->TaskId = $result; $this->WriteToTrackingService(str_replace("#VAL#", $result, GetMessage("BPSA_TRACK_OK"))); if ($this->isInEventActivityMode || !$this->HoldToClose) { return CBPActivityExecutionStatus::Closed; } $this->Subscribe($this); $this->isInEventActivityMode = false; $this->WriteToTrackingService(GetMessage("BPSA_TRACK_SUBSCR")); return CBPActivityExecutionStatus::Executing; }
private function proceedAction($actionId, $arActionArguments = null) { $actionId = (int) $actionId; $arTaskData = $this->getData($bSpecialChars = false); $arNewFields = null; if ($actionId == self::ACTION_REMOVE) { if (!$this->isActionAllowed(self::ACTION_REMOVE)) { throw new TasksException('', TasksException::TE_ACTION_NOT_ALLOWED | TasksException::TE_ACCESS_DENIED); } $this->markCacheAsDirty(); /** @noinspection PhpDeprecationInspection */ if (CTasks::Delete($this->taskId) !== true) { throw new TasksException('', TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED); } return; } elseif ($actionId == self::ACTION_EDIT) { $arFields = $arActionArguments['FIELDS']; if (isset($arFields['ID'])) { unset($arFields['ID']); } $arParams = array('USER_ID' => $this->executiveUserId, 'CHECK_RIGHTS_ON_FILES' => true); $actionChangeDeadlineFields = array('DEADLINE', 'START_DATE_PLAN', 'END_DATE_PLAN'); $arGivenFieldsNames = array_keys($arFields); if (array_key_exists('STATUS', $arFields) && !in_array((int) $arFields['STATUS'], array(CTasks::STATE_NEW, CTasks::STATE_PENDING, CTasks::STATE_IN_PROGRESS, CTasks::STATE_SUPPOSEDLY_COMPLETED, CTasks::STATE_COMPLETED, CTasks::STATE_DEFERRED, CTasks::STATE_DECLINED), true)) { throw new TasksException('Invalid status given', TasksException::TE_WRONG_ARGUMENTS); } if (array_key_exists('PRIORITY', $arFields) && !in_array((int) $arFields['PRIORITY'], array(CTasks::PRIORITY_LOW, CTasks::PRIORITY_AVERAGE, CTasks::PRIORITY_HIGH), true)) { throw new TasksException('Invalid priority given', TasksException::TE_WRONG_ARGUMENTS); } if (array_key_exists('CREATED_BY', $arFields) && !$this->isActionAllowed(self::ACTION_CHANGE_DIRECTOR)) { throw new TasksException('Access denied for field CREATED_BY to be updated', TasksException::TE_ACTION_NOT_ALLOWED); } if (array_diff($actionChangeDeadlineFields, $arGivenFieldsNames) && !$this->isActionAllowed(self::ACTION_CHANGE_DEADLINE)) { throw new TasksException('Access denied for field CREATED_BY to be updated', TasksException::TE_ACTION_NOT_ALLOWED); } // Get list of fields, except just checked above $arGeneralFields = array_diff($arGivenFieldsNames, array_merge($actionChangeDeadlineFields, array('CREATED_BY'))); // Is there is something more for update? if (!empty($arGeneralFields)) { if (!$this->isActionAllowed(self::ACTION_EDIT)) { throw new TasksException('Access denied for field CREATED_BY to be updated', TasksException::TE_ACTION_NOT_ALLOWED); } } $this->markCacheAsDirty(); $o = new CTasks(); /** @noinspection PhpDeprecationInspection */ if ($o->update($this->taskId, $arFields, $arParams) !== true) { $this->markCacheAsDirty(); throw new TasksException(serialize($o->GetErrors()), TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED | TasksException::TE_FLAG_SERIALIZED_ERRORS_IN_MESSAGE); } $this->markCacheAsDirty(); return; } switch ($actionId) { case self::ACTION_ACCEPT: $arNewFields['STATUS'] = CTasks::STATE_PENDING; break; case self::ACTION_DECLINE: $arNewFields['STATUS'] = CTasks::STATE_DECLINED; if (isset($arActionArguments['DECLINE_REASON'])) { $arNewFields['DECLINE_REASON'] = $arActionArguments['DECLINE_REASON']; } else { $arNewFields['DECLINE_REASON'] = ''; } break; case self::ACTION_COMPLETE: if ($arTaskData['TASK_CONTROL'] === 'N' || $arTaskData['CREATED_BY'] == $this->executiveUserId) { $arNewFields['STATUS'] = CTasks::STATE_COMPLETED; } else { $arNewFields['STATUS'] = CTasks::STATE_SUPPOSEDLY_COMPLETED; } break; case self::ACTION_APPROVE: $arNewFields['STATUS'] = CTasks::STATE_COMPLETED; break; case self::ACTION_START: $arNewFields['STATUS'] = CTasks::STATE_IN_PROGRESS; break; case self::ACTION_PAUSE: $arNewFields['STATUS'] = CTasks::STATE_PENDING; break; case self::ACTION_DELEGATE: $arNewFields['STATUS'] = CTasks::STATE_PENDING; if (!isset($arActionArguments['RESPONSIBLE_ID'])) { throw new TasksException('Expected $arActionArguments[\'RESPONSIBLE_ID\']', TasksException::TE_WRONG_ARGUMENTS); } $arNewFields['RESPONSIBLE_ID'] = $arActionArguments['RESPONSIBLE_ID']; if (isset($arTaskData['AUDITORS']) && count($arTaskData['AUDITORS'])) { if (!in_array($this->executiveUserId, $arTaskData['AUDITORS'])) { $arNewFields['AUDITORS'] = $arTaskData['AUDITORS']; $arNewFields['AUDITORS'][] = $this->executiveUserId; } } else { $arNewFields['AUDITORS'] = array($this->executiveUserId); } break; case self::ACTION_DEFER: $arNewFields['STATUS'] = CTasks::STATE_DEFERRED; break; case self::ACTION_DISAPPROVE: case self::ACTION_RENEW: $arNewFields['STATUS'] = CTasks::STATE_PENDING; break; default: break; } if ($arNewFields === null) { throw new TasksException(); } // Don't update task, if nothing changed $bNeedUpdate = false; foreach ($arNewFields as $fieldName => $newValue) { $curValue = $arTaskData[$fieldName]; // Convert task data arrays to strings, for comparing if (is_array($curValue)) { sort($curValue); sort($newValue); $curValue = implode('|', $curValue); $newValue = implode('|', $newValue); } if ($curValue != $newValue) { $bNeedUpdate = true; break; } } if ($bNeedUpdate) { if (!$this->isActionAllowed($actionId)) { throw new TasksException('', TasksException::TE_ACTION_NOT_ALLOWED | TasksException::TE_ACCESS_DENIED); } $arParams = array('USER_ID' => $this->executiveUserId); $this->markCacheAsDirty(); $o = new CTasks(); /** @noinspection PhpDeprecationInspection */ if ($o->Update($this->taskId, $arNewFields, $arParams) !== true) { throw new TasksException('', TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED); } } }