Пример #1
0
            }
        }
        foreach ($_POST["oldNames"] as $key => $value) {
            if ($_POST["oldNames"][$key] != $_POST["newNames"][$key]) {
                CTaskTags::Rename($_POST["oldNames"][$key], $_POST["newNames"][$key], $USER->GetID());
            }
        }
    }
    if (sizeof($_POST["deleted"])) {
        $rsDeletedTags = CTaskTags::GetList(array(), array("USER_ID" => $USER->GetID(), "NAME" => $_POST["deleted"]));
        while ($arTag = $rsDeletedTags->Fetch()) {
            if (!in_array($arTag["TASK_ID"], $arAffectedTasks)) {
                $arAffectedTasks[] = $arTag["TASK_ID"];
            }
        }
        CTaskTags::Delete(array("USER_ID" => $USER->GetID(), "NAME" => $_POST["deleted"]));
    }
    if (CModule::IncludeModule('search') && sizeof($arAffectedTasks)) {
        $rsTasks = CTasks::GetList(array(), array("ID" => $arAffectedTasks));
        while ($arTask = $rsTasks->Fetch()) {
            $rsTaskTags = CTaskTags::GetList(array(), array("TASK_ID" => $arTask["ID"]));
            $arTags = array();
            while ($tag = $rsTaskTags->Fetch()) {
                $arTags[] = $tag["NAME"];
            }
            CTasks::Index($arTask, $arTags);
        }
    }
    CMain::FinalActions();
    // to make events work on bitrix24
}
Пример #2
0
 /**
  * This method is deprecated. Use CTaskItem::update() instead.
  * @deprecated
  */
 public function Update($ID, $arFields, $arParams = array())
 {
     global $DB, $USER, $USER_FIELD_MANAGER, $CACHE_MANAGER, $APPLICATION;
     if (isset($arFields['META::EVENT_GUID'])) {
         $eventGUID = $arFields['META::EVENT_GUID'];
         unset($arFields['META::EVENT_GUID']);
     } else {
         $eventGUID = sha1(uniqid('AUTOGUID', true));
     }
     $bWasFatalError = false;
     $ID = intval($ID);
     if ($ID < 1) {
         return false;
     }
     $userID = null;
     $bCheckRightsOnFiles = false;
     // for backward compatibility
     if (is_array($arParams)) {
         if (isset($arParams['USER_ID']) && $arParams['USER_ID'] > 0) {
             $userID = (int) $arParams['USER_ID'];
         }
         if (isset($arParams['CHECK_RIGHTS_ON_FILES'])) {
             if ($arParams['CHECK_RIGHTS_ON_FILES'] === 'Y' || $arParams['CHECK_RIGHTS_ON_FILES'] === true) {
                 $bCheckRightsOnFiles = true;
             } else {
                 $bCheckRightsOnFiles = false;
             }
         }
     }
     if ($userID === null) {
         $userID = is_object($USER) ? intval($USER->GetID()) : 1;
     }
     $rsTask = CTasks::GetByID($ID, false);
     if ($arTask = $rsTask->Fetch()) {
         if ($this->CheckFields($arFields, $ID, $userID)) {
             if ($USER_FIELD_MANAGER->CheckFields("TASKS_TASK", $ID, $arFields)) {
                 unset($arFields["ID"]);
                 $arBinds = array("DESCRIPTION" => $arFields["DESCRIPTION"], "DECLINE_REASON" => $arFields["DECLINE_REASON"]);
                 $time = time() + CTasksTools::getTimeZoneOffset();
                 $arFields["CHANGED_BY"] = $userID;
                 $arFields["CHANGED_DATE"] = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), $time);
                 $occurAsUserId = CTasksTools::getOccurAsUserId();
                 if (!$occurAsUserId) {
                     $occurAsUserId = $arFields["CHANGED_BY"] ? $arFields["CHANGED_BY"] : 1;
                 }
                 if (!$arFields["OUTLOOK_VERSION"]) {
                     $arFields["OUTLOOK_VERSION"] = ($arTask["OUTLOOK_VERSION"] ? $arTask["OUTLOOK_VERSION"] : 1) + 1;
                 }
                 // If new status code given AND new status code != current status => than update
                 if (isset($arFields["STATUS"]) && (int) $arTask['STATUS'] !== (int) $arFields['STATUS']) {
                     $arFields["STATUS_CHANGED_BY"] = $userID;
                     $arFields["STATUS_CHANGED_DATE"] = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), $time);
                     if ($arFields["STATUS"] == 5 || $arFields["STATUS"] == 4) {
                         $arFields["CLOSED_BY"] = $userID;
                         $arFields["CLOSED_DATE"] = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), $time);
                     } else {
                         $arFields["CLOSED_BY"] = false;
                         $arFields["CLOSED_DATE"] = false;
                         if ($arFields["STATUS"] == 3) {
                             $arFields["DATE_START"] = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), $time);
                         }
                     }
                 }
                 if ($arFields["REPLICATE"] == "Y") {
                     $arFields["REPLICATE_PARAMS"] = serialize($arFields["REPLICATE_PARAMS"]);
                 }
                 $arTaskCopy = $arTask;
                 // this will allow transfer data by pointer for speed-up
                 foreach (GetModuleEvents('tasks', 'OnBeforeTaskUpdate', true) as $arEvent) {
                     if (ExecuteModuleEventEx($arEvent, array($ID, &$arFields, &$arTaskCopy)) === false) {
                         $errmsg = GetMessage("TASKS_UNKNOWN_UPDATE_ERROR");
                         $errno = 'ERROR_UNKNOWN_UPDATE_TASK_ERROR';
                         if ($ex = $APPLICATION->getException()) {
                             $errmsg = $ex->getString();
                             $errno = $ex->getId();
                         }
                         $this->_errors[] = array('text' => $errmsg, 'id' => $errno);
                         return false;
                     }
                 }
                 $oTaskList = CTaskCountersProcessor::getInstance();
                 $oTaskList->onBeforeTaskUpdate($ID, $arTask, $arFields);
                 $strUpdate = $DB->PrepareUpdate("b_tasks", $arFields, "tasks");
                 $strSql = "UPDATE b_tasks SET " . $strUpdate . " WHERE ID=" . $ID;
                 $result = $DB->QueryBind($strSql, $arBinds, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
                 if ($result) {
                     CTaskCountersProcessor::onAfterTaskUpdate($ID, $arTask, $arFields);
                     $arParticipants = array_merge(array($arTask['CREATED_BY'], $arTask['RESPONSIBLE_ID']), (array) $arTask['ACCOMPLICES'], (array) $arTask['AUDITORS']);
                     if (isset($arFields['CREATED_BY'])) {
                         $arParticipants[] = $arFields['CREATED_BY'];
                     }
                     if (isset($arFields['RESPONSIBLE_ID'])) {
                         $arParticipants[] = $arFields['RESPONSIBLE_ID'];
                     }
                     if (isset($arFields['ACCOMPLICES'])) {
                         $arParticipants = array_merge($arParticipants, (array) $arFields['ACCOMPLICES']);
                     }
                     if (isset($arFields['AUDITORS'])) {
                         $arParticipants = array_merge($arParticipants, (array) $arFields['AUDITORS']);
                     }
                     $arParticipants = array_unique($arParticipants);
                     // Emit pull event
                     try {
                         $arPullRecipients = array();
                         foreach ($arParticipants as $userId) {
                             $arPullRecipients[] = (int) $userId;
                         }
                         $taskGroupId = 0;
                         // no group
                         $taskGroupIdBeforeUpdate = 0;
                         // no group
                         if (isset($arTask['GROUP_ID']) && $arTask['GROUP_ID'] > 0) {
                             $taskGroupId = (int) $arTask['GROUP_ID'];
                         }
                         // if $arFields['GROUP_ID'] not given, than it means,
                         // that group not changed during this update, so
                         // we must take existing group_id (from $arTask)
                         if (!array_key_exists('GROUP_ID', $arFields)) {
                             if (isset($arTask['GROUP_ID']) && $arTask['GROUP_ID'] > 0) {
                                 $taskGroupIdBeforeUpdate = (int) $arTask['GROUP_ID'];
                             } else {
                                 $taskGroupIdBeforeUpdate = 0;
                             }
                             // no group
                         } else {
                             if ($arFields['GROUP_ID'] > 0) {
                                 $taskGroupIdBeforeUpdate = (int) $arFields['GROUP_ID'];
                             } else {
                                 $taskGroupIdBeforeUpdate = 0;
                             }
                             // no group
                         }
                         $arPullData = array('TASK_ID' => (int) $ID, 'BEFORE' => array('GROUP_ID' => $taskGroupId), 'AFTER' => array('GROUP_ID' => $taskGroupIdBeforeUpdate), 'TS' => time(), 'event_GUID' => $eventGUID);
                         self::EmitPullWithTagPrefix($arPullRecipients, 'TASKS_GENERAL_', 'task_update', $arPullData);
                         self::EmitPullWithTag($arPullRecipients, 'TASKS_TASK_' . (int) $ID, 'task_update', $arPullData);
                     } catch (Exception $e) {
                         $bWasFatalError = true;
                         $this->_errors[] = 'at line ' . $e->GetLine() . ', ' . $e->GetMessage();
                     }
                     // changes log
                     $arTmp = array('arTask' => $arTask, 'arFields' => $arFields);
                     if (isset($arFields['DURATION_PLAN']) && isset($arFields['DURATION_TYPE'])) {
                         if ($arFields['DURATION_TYPE'] === 'hours') {
                             $arTmp['arFields']['DURATION_PLAN_SECONDS'] = $arFields['DURATION_PLAN'] * 3600;
                             unset($arTmp['arFields']['DURATION_PLAN']);
                         } elseif ($arFields['DURATION_TYPE'] === 'days') {
                             $arTmp['arFields']['DURATION_PLAN_SECONDS'] = $arFields['DURATION_PLAN'] * 3600 * 24;
                             unset($arTmp['arFields']['DURATION_PLAN']);
                         }
                     }
                     if (isset($arTask['DURATION_PLAN']) && isset($arTask['DURATION_TYPE'])) {
                         if ($arTask['DURATION_TYPE'] === 'hours') {
                             $arTmp['arTask']['DURATION_PLAN_SECONDS'] = $arTask['DURATION_PLAN'] * 3600;
                             unset($arTmp['arTask']['DURATION_PLAN']);
                         } elseif ($arTask['DURATION_TYPE'] === 'days') {
                             $arTmp['arTask']['DURATION_PLAN_SECONDS'] = $arTask['DURATION_PLAN'] * 3600 * 24;
                             unset($arTmp['arTask']['DURATION_PLAN']);
                         }
                     }
                     $arChanges = CTaskLog::GetChanges($arTmp['arTask'], $arTmp['arFields']);
                     unset($arTmp);
                     foreach ($arChanges as $key => $value) {
                         $arLogFields = array("TASK_ID" => $ID, "USER_ID" => $occurAsUserId, "CREATED_DATE" => $arFields["CHANGED_DATE"], "FIELD" => $key, "FROM_VALUE" => $value["FROM_VALUE"], "TO_VALUE" => $value["TO_VALUE"]);
                         $log = new CTaskLog();
                         $log->Add($arLogFields);
                     }
                     if (isset($arFields["ACCOMPLICES"]) && isset($arChanges["ACCOMPLICES"])) {
                         CTaskMembers::DeleteByTaskID($ID, "A");
                         CTasks::AddAccomplices($ID, $arFields["ACCOMPLICES"]);
                     }
                     if (isset($arFields["AUDITORS"]) && isset($arChanges["AUDITORS"])) {
                         CTaskMembers::DeleteByTaskID($ID, "U");
                         CTasks::AddAuditors($ID, $arFields["AUDITORS"]);
                     }
                     if (isset($arFields["FILES"]) && (isset($arChanges["NEW_FILES"]) || isset($arChanges["DELETED_FILES"]))) {
                         $arNotDeleteFiles = $arFields["FILES"];
                         CTaskFiles::DeleteByTaskID($ID, $arNotDeleteFiles);
                         CTasks::AddFiles($ID, $arFields["FILES"], array('USER_ID' => $userID, 'CHECK_RIGHTS_ON_FILES' => $bCheckRightsOnFiles));
                     }
                     if (isset($arFields["TAGS"]) && isset($arChanges["TAGS"])) {
                         CTaskTags::DeleteByTaskID($ID);
                         CTasks::AddTags($ID, $arTask["CREATED_BY"], $arFields["TAGS"], $userID);
                     }
                     if (isset($arFields["DEPENDS_ON"]) && isset($arChanges["DEPENDS_ON"])) {
                         CTaskDependence::DeleteByTaskID($ID);
                         CTasks::AddPrevious($ID, $arFields["DEPENDS_ON"]);
                     }
                     $USER_FIELD_MANAGER->Update("TASKS_TASK", $ID, $arFields, $userID);
                     $notifArFields = array_merge($arFields, array('CHANGED_BY' => $occurAsUserId));
                     if (($status = intval($arFields["STATUS"])) && $status > 0 && $status < 8 && (int) $arTask['STATUS'] !== (int) $arFields['STATUS']) {
                         if ($status == 7) {
                             $arTask["DECLINE_REASON"] = $arFields["DECLINE_REASON"];
                         }
                         CTaskNotifications::SendStatusMessage($arTask, $status, $notifArFields);
                     }
                     CTaskNotifications::SendUpdateMessage($notifArFields, $arTask);
                     CTaskComments::onAfterTaskUpdate($ID, $arTask, $arFields);
                     $arFields["ID"] = $ID;
                     $arMergedFields = array_merge($arTask, $arFields);
                     CTaskSync::UpdateItem($arFields, $arTask);
                     // MS Exchange
                     $arFields['META:PREV_FIELDS'] = $arTask;
                     try {
                         $lastEventName = '';
                         foreach (GetModuleEvents('tasks', 'OnTaskUpdate', true) as $arEvent) {
                             $lastEventName = $arEvent['TO_CLASS'] . '::' . $arEvent['TO_METHOD'] . '()';
                             ExecuteModuleEventEx($arEvent, array($ID, &$arFields, &$arTaskCopy));
                         }
                     } catch (Exception $e) {
                         CTaskAssert::logWarning('[0xee8999a8] exception in module event: ' . $lastEventName . '; at file: ' . $e->getFile() . ':' . $e->getLine() . ";\n");
                     }
                     unset($arFields['META:PREV_FIELDS']);
                     CTasks::Index($arMergedFields, $arFields["TAGS"]);
                     // search index
                     // clear cache
                     if ($arTask["GROUP_ID"]) {
                         $CACHE_MANAGER->ClearByTag("tasks_group_" . $arTask["GROUP_ID"]);
                     }
                     if ($arFields['GROUP_ID'] && $arFields['GROUP_ID'] != $arTask['GROUP_ID']) {
                         $CACHE_MANAGER->ClearByTag('tasks_group_' . $arFields['GROUP_ID']);
                     }
                     foreach ($arParticipants as $userId) {
                         $CACHE_MANAGER->ClearByTag("tasks_user_" . $userId);
                     }
                     if ($bWasFatalError) {
                         soundex('push&pull: bWasFatalError === true');
                     }
                     return true;
                 }
             } else {
                 $e = $APPLICATION->GetException();
                 foreach ($e->messages as $msg) {
                     $this->_errors[] = $msg;
                 }
             }
         }
     }
     if (sizeof($this->_errors) == 0) {
         $this->_errors[] = array("text" => GetMessage("TASKS_UNKNOWN_UPDATE_ERROR"), "id" => "ERROR_UNKNOWN_UPDATE_TASK_ERROR");
     }
     return false;
 }
Пример #3
0
 /**
  * This method is deprecated. Use CTaskItem::add() instead.
  * @deprecated
  */
 public function Add($arFields, $arParams = array())
 {
     global $DB, $USER, $USER_FIELD_MANAGER, $CACHE_MANAGER, $APPLICATION;
     if (isset($arFields['META::EVENT_GUID'])) {
         $eventGUID = $arFields['META::EVENT_GUID'];
         unset($arFields['META::EVENT_GUID']);
     } else {
         $eventGUID = sha1(uniqid('AUTOGUID', true));
     }
     if (!array_key_exists('GUID', $arFields)) {
         $arFields['GUID'] = CTasksTools::genUuid();
     }
     if (!isset($arFields['SITE_ID'])) {
         $arFields['SITE_ID'] = SITE_ID;
     }
     // force GROUP_ID to 0 if not set (prevent occur as NULL in database)
     $arFields['GROUP_ID'] = intval($arFields['GROUP_ID']);
     $bWasFatalError = false;
     $spawnedByAgent = false;
     $effectiveUserId = null;
     $bCheckRightsOnFiles = false;
     // for backward compatibility
     if (is_array($arParams)) {
         if (isset($arParams['SPAWNED_BY_AGENT']) && ($arParams['SPAWNED_BY_AGENT'] === 'Y' || $arParams['SPAWNED_BY_AGENT'] === true)) {
             $spawnedByAgent = true;
         }
         if (isset($arParams['USER_ID']) && $arParams['USER_ID'] > 0) {
             $effectiveUserId = (int) $arParams['USER_ID'];
         }
         if (isset($arParams['CHECK_RIGHTS_ON_FILES'])) {
             if ($arParams['CHECK_RIGHTS_ON_FILES'] === 'Y' || $arParams['CHECK_RIGHTS_ON_FILES'] === true) {
                 $bCheckRightsOnFiles = true;
             } else {
                 $bCheckRightsOnFiles = false;
             }
         }
     }
     self::processDurationPlanFields($arFields, $arFields['DURATION_TYPE']);
     if ($effectiveUserId === null) {
         $effectiveUserId = is_object($USER) ? intval($USER->GetID()) : 1;
     }
     if (!isset($arFields['CREATED_BY']) || !$arFields['CREATED_BY']) {
         $arFields['CREATED_BY'] = $effectiveUserId;
     }
     if ($this->CheckFields($arFields, false, $effectiveUserId)) {
         if ($USER_FIELD_MANAGER->CheckFields("TASKS_TASK", 0, $arFields, $effectiveUserId)) {
             $nowDateTimeString = date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL")), time() + CTasksTools::getTimeZoneOffset());
             if (!isset($arFields["CREATED_DATE"])) {
                 $arFields["CREATED_DATE"] = $nowDateTimeString;
             }
             if (!isset($arFields["CHANGED_BY"])) {
                 $arFields["STATUS_CHANGED_BY"] = $arFields["CHANGED_BY"] = $arFields["CREATED_BY"];
                 $arFields["STATUS_CHANGED_DATE"] = $arFields["CHANGED_DATE"] = $arFields["CREATED_DATE"] = $nowDateTimeString;
             }
             if ((string) $arFields['START_DATE_PLAN'] != '' || (string) $arFields['END_DATE_PLAN'] != '') {
                 $scheduler = new Scheduler($effectiveUserId, 0, $arFields);
                 $data = $scheduler->reScheduleTask($arFields);
                 // to database:
                 if ($data['START_DATE_PLAN']) {
                     $arFields['START_DATE_PLAN'] = $data['START_DATE_PLAN']->toString();
                 }
                 if ($data['END_DATE_PLAN']) {
                     $arFields['END_DATE_PLAN'] = $data['END_DATE_PLAN']->toString();
                 }
                 if (isset($data['DURATION_PLAN_SECONDS'])) {
                     $arFields['DURATION_PLAN_SECONDS'] = $data['DURATION_PLAN_SECONDS'];
                 }
             }
             $arFields["OUTLOOK_VERSION"] = 1;
             foreach (GetModuleEvents('tasks', 'OnBeforeTaskAdd', true) as $arEvent) {
                 if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false) {
                     $e = $APPLICATION->GetException();
                     if ($e) {
                         if ($e instanceof CAdminException) {
                             if (is_array($e->messages)) {
                                 foreach ($e->messages as $msg) {
                                     $this->_errors[] = $msg;
                                 }
                             }
                         } else {
                             $this->_errors[] = array('text' => $e->getString(), 'id' => 'unknown');
                         }
                     }
                     if (empty($this->_errors)) {
                         $this->_errors[] = array("text" => GetMessage("TASKS_UNKNOWN_ADD_ERROR"), "id" => "ERROR_UNKNOWN_ADD_TASK_ERROR");
                     }
                     return false;
                 }
             }
             $oTaskList = CTaskCountersProcessor::getInstance();
             $oTaskList->onBeforeTaskAdd($arFields, $effectiveUserId);
             $ID = $DB->Add("b_tasks", $arFields, array("DESCRIPTION"), "tasks");
             $arFields["ACCOMPLICES"] = (array) $arFields["ACCOMPLICES"];
             $arFields["AUDITORS"] = (array) $arFields["AUDITORS"];
             if ($ID) {
                 $rsTask = CTasks::GetByID($ID, false);
                 if ($arTask = $rsTask->Fetch()) {
                     // add to favorite, if needed
                     if (intval($arFields['PARENT_ID']) && FavoriteTable::check(array('TASK_ID' => $arFields['PARENT_ID'], 'USER_ID' => $effectiveUserId))) {
                         FavoriteTable::add(array('TASK_ID' => $ID, 'USER_ID' => $effectiveUserId), array('CHECK_EXISTENCE' => false));
                     }
                     CTasks::AddAccomplices($ID, $arFields["ACCOMPLICES"]);
                     CTasks::AddAuditors($ID, $arFields["AUDITORS"]);
                     CTasks::AddFiles($ID, $arFields["FILES"], array('USER_ID' => $effectiveUserId, 'CHECK_RIGHTS_ON_FILES' => $bCheckRightsOnFiles));
                     CTasks::AddTags($ID, $arTask["CREATED_BY"], $arFields["TAGS"], $effectiveUserId);
                     CTasks::AddPrevious($ID, $arFields["DEPENDS_ON"]);
                     $USER_FIELD_MANAGER->Update("TASKS_TASK", $ID, $arFields, $effectiveUserId);
                     $arFields["ID"] = $ID;
                     CTasks::__updateViewed($ID, $effectiveUserId, $onTaskAdd = true);
                     CTaskCountersProcessor::onAfterTaskAdd($arFields, $effectiveUserId);
                     CTaskComments::onAfterTaskAdd($ID, $arFields);
                     $occurAsUserId = CTasksTools::getOccurAsUserId();
                     if (!$occurAsUserId) {
                         $occurAsUserId = $effectiveUserId ? $effectiveUserId : 1;
                     }
                     CTaskNotifications::SendAddMessage(array_merge($arFields, array('CHANGED_BY' => $occurAsUserId)), array('SPAWNED_BY_AGENT' => $spawnedByAgent));
                     CTaskSync::AddItem($arFields);
                     // MS Exchange
                     // changes log
                     $arLogFields = array("TASK_ID" => $ID, "USER_ID" => $occurAsUserId, "CREATED_DATE" => $nowDateTimeString, "FIELD" => "NEW");
                     $log = new CTaskLog();
                     $log->Add($arLogFields);
                     try {
                         $lastEventName = '';
                         foreach (GetModuleEvents('tasks', 'OnTaskAdd', true) as $arEvent) {
                             $lastEventName = $arEvent['TO_CLASS'] . '::' . $arEvent['TO_METHOD'] . '()';
                             ExecuteModuleEventEx($arEvent, array($ID, &$arFields));
                         }
                     } catch (Exception $e) {
                         CTaskAssert::logWarning('[0x37eb64ae] exception in module event: ' . $lastEventName);
                     }
                     CTasks::Index($arTask, $arFields["TAGS"]);
                     // search index
                     // clear cache
                     if ($arFields["GROUP_ID"]) {
                         $CACHE_MANAGER->ClearByTag("tasks_group_" . $arFields["GROUP_ID"]);
                     }
                     $arParticipants = array_unique(array_merge(array($arFields["CREATED_BY"], $arFields["RESPONSIBLE_ID"]), $arFields["ACCOMPLICES"], $arFields["AUDITORS"]));
                     foreach ($arParticipants as $userId) {
                         $CACHE_MANAGER->ClearByTag("tasks_user_" . $userId);
                     }
                     // Emit pull event
                     try {
                         $arPullRecipients = array();
                         foreach ($arParticipants as $userId) {
                             $arPullRecipients[] = (int) $userId;
                         }
                         $taskGroupId = 0;
                         // no group
                         if (isset($arFields['GROUP_ID']) && $arFields['GROUP_ID'] > 0) {
                             $taskGroupId = (int) $arFields['GROUP_ID'];
                         }
                         $arPullData = array('TASK_ID' => (int) $ID, 'AFTER' => array('GROUP_ID' => $taskGroupId), 'TS' => time(), 'event_GUID' => $eventGUID);
                         self::EmitPullWithTagPrefix($arPullRecipients, 'TASKS_GENERAL_', 'task_add', $arPullData);
                         self::EmitPullWithTag($arPullRecipients, 'TASKS_TASK_' . (int) $ID, 'task_add', $arPullData);
                     } catch (Exception $e) {
                         $bWasFatalError = true;
                         $this->_errors[] = 'at line ' . $e->GetLine() . ', ' . $e->GetMessage();
                     }
                     if ($arFields['GROUP_ID'] && CModule::IncludeModule("socialnetwork")) {
                         CSocNetGroup::SetLastActivity($arFields['GROUP_ID']);
                     }
                 }
             }
             if ($bWasFatalError) {
                 soundex('push&pull: bWasFatalError === true');
             }
             return $ID;
         } else {
             $e = $APPLICATION->GetException();
             foreach ($e->messages as $msg) {
                 $this->_errors[] = $msg;
             }
         }
     }
     if (empty($this->_errors)) {
         $this->_errors[] = array("text" => GetMessage("TASKS_UNKNOWN_ADD_ERROR"), "id" => "ERROR_UNKNOWN_ADD_TASK_ERROR");
     }
     return false;
 }