9 private static $taskUsers = [];
18 self::DeleteByWorkflow($workflowId);
23 $taskId = (int)$taskId;
26 throw new Main\ArgumentOutOfRangeException(
'id', 1);
32 throw new Main\ArgumentOutOfRangeException(
'userId', 1);
37 Bizproc\Workflow\Task\TaskUserTable::updateStatus($taskId, [
$userId],
$status);
39 self::decrementUserTaskCounter(
$userId);
45 'COUNTERS_DECREMENTED' => [
$userId],
46 'STATUS_NAME' =>
'COMPLETED',
50 foreach (
GetModuleEvents(
'bizproc',
'OnTaskMarkCompleted',
true) as $arEvent)
64 throw new Main\ArgumentOutOfRangeException(
'taskId', 1);
70 throw new Main\ArgumentNullException(
'userIds');
75 Bizproc\Workflow\Task\TaskUserTable::updateStatus($taskId, $userIds,
$status);
80 self::incrementUserTaskCounter(
$userId);
87 'USERS_STATUSES' => $usersStatuses,
88 'COUNTERS_INCREMENTED' => $userIds,
89 'STATUS_NAME' =>
'UNCOMPLETED',
93 foreach (
GetModuleEvents(
'bizproc',
'OnTaskMarkUnCompleted',
true) as $arEvent)
103 $taskId = (
array)$taskId;
104 $taskId = array_map(
'intval', $taskId);
105 $taskId = array_filter($taskId);
106 if (
sizeof($taskId) < 1)
113 foreach ($taskId as $id)
115 if (!isset(self::$taskUsers[$id]))
121 $where .=
' TASK_ID = '.$id;
122 self::$taskUsers[$id] = [];
126 $users[$id] = self::$taskUsers[$id];
132 $dateUpdateSelect =
$DB->DateToCharFunction(
'TU.DATE_UPDATE',
'FULL') .
' as DATE_UPDATE';
136 .
' TU.ID, TU.USER_ID, TU.TASK_ID, TU.STATUS, TU.ORIGINAL_USER_ID, ' . $dateUpdateSelect .
','
137 .
' U.PERSONAL_PHOTO, U.NAME, U.LAST_NAME, U.SECOND_NAME, U.LOGIN, U.TITLE'
138 .
' FROM b_bp_task_user TU'
139 .
' INNER JOIN b_user U ON (U.ID = TU.USER_ID)'
141 .
' ORDER BY TU.DATE_UPDATE DESC'
157 $taskUsers = static::getTaskUsers($taskId);
158 if (isset($taskUsers[$taskId]))
160 $ids = array_column($taskUsers[$taskId],
'USER_ID');
163 return array_map(
'intval', $ids);
176 if ($workflowId ==
'')
183 .
' FROM b_bp_task_user TU'
184 .
' INNER JOIN b_bp_task T ON (T.ID = TU.TASK_ID)'
185 .
' WHERE T.WORKFLOW_ID = \''.
$DB->ForSql($workflowId).
'\''
186 .($userStatus !==
null ?
' AND TU.STATUS = '.(int)$userStatus :
'')
190 $users[] = (int)
$user[
'USER_ID'];
201 $iteratorOverdueNull =
$DB->Query(
'SELECT DISTINCT TU.USER_ID, TU.STATUS'
202 .
' FROM b_bp_task_user TU'
203 .
' INNER JOIN b_bp_task T ON (T.ID = TU.TASK_ID)'
204 .
' WHERE T.WORKFLOW_ID = \''.
$DB->ForSql($workflowId).
'\''
205 .
' AND T.OVERDUE_DATE IS NULL'
211 $query =
'SELECT DISTINCT TU.USER_ID, TU.STATUS'
212 .
' FROM b_bp_task_user TU'
213 .
' INNER JOIN b_bp_task T ON (T.ID = TU.TASK_ID)'
214 .
' WHERE T.WORKFLOW_ID = \''.$DB->ForSql($workflowId).
'\''
215 .
' AND T.OVERDUE_DATE > ' . $sqlHelper->getCurrentDateTimeFunction();
216 $iteratorOverdueFuture =
$DB->Query(
$query);
224 while (
$user = $usersIterator->fetch())
241 $taskId = (int)$taskId;
242 $fromUserId = (int)$fromUserId;
243 $toUserId = (int)$toUserId;
245 if (!$taskId || !$fromUserId || !$toUserId)
252 Bizproc\Workflow\Task\TaskUserTable::query()
253 ->setSelect([
'USER_ID'])
254 ->where(
'TASK_ID', $taskId)
255 ->where(
'USER_ID', $toUserId)
259 if (!empty($row[
'USER_ID']))
264 Bizproc\Workflow\Task\TaskUserTable::delegateTask($taskId, $fromUserId, $toUserId);
266 self::decrementUserTaskCounter($fromUserId);
267 self::incrementUserTaskCounter($toUserId);
271 'USERS' => [$toUserId],
272 'USERS_ADDED' => [$toUserId],
273 'USERS_REMOVED' => [$fromUserId],
274 'COUNTERS_DECREMENTED' => [$fromUserId],
275 'COUNTERS_INCREMENTED' => [$toUserId],
279 foreach (
GetModuleEvents(
'bizproc',
'OnTaskDelegate',
true) as $arEvent)
289 $taskId = (int)$taskId;
290 $realUserId = (int)$realUserId;
292 $originalUserId = Bizproc\Workflow\Task\TaskUserTable::getOriginalTaskUserId($taskId, $realUserId);
293 if ($originalUserId !==
null)
295 return $originalUserId > 0 ? $originalUserId : $realUserId;
301 public static function delete($id)
311 $removedUsers = $decremented = [];
312 $dbRes =
$DB->Query(
"SELECT USER_ID, STATUS FROM b_bp_task_user WHERE TASK_ID = ".intval($id).
" ");
317 self::decrementUserTaskCounter((
int)
$arRes[
'USER_ID']);
318 $decremented[] =
$arRes[
"USER_ID"];
320 $removedUsers[] =
$arRes[
"USER_ID"];
322 $DB->Query(
"DELETE FROM b_bp_task_user WHERE TASK_ID = ".intval($id).
" ",);
327 'USERS_REMOVED' => $removedUsers,
328 'COUNTERS_DECREMENTED' => $decremented,
337 $DB->Query(
'DELETE FROM b_bp_task WHERE ID = ' . (
int)$id .
' ');
344 $workflowId = trim($workflowId);
345 if ($workflowId ==
'')
353 "WHERE WORKFLOW_ID = '".
$DB->ForSql($workflowId).
"' "
354 .($taskStatus !==
null?
'AND STATUS = '.(int)$taskStatus :
'')
359 $taskId = intval(
$arRes[
"ID"]);
360 $removedUsers = $decremented = [];
361 $dbResUser =
$DB->Query(
"SELECT USER_ID, STATUS FROM b_bp_task_user WHERE TASK_ID = ".$taskId.
" ");
362 while ($arResUser = $dbResUser->Fetch())
366 self::decrementUserTaskCounter((
int)$arResUser[
'USER_ID']);
367 $decremented[] = $arResUser[
"USER_ID"];
369 $removedUsers[] = $arResUser[
'USER_ID'];
370 $allUsers[] = $arResUser[
'USER_ID'];
372 $DB->Query(
"DELETE FROM b_bp_task_user WHERE TASK_ID = ".$taskId.
" ");
377 'USERS_REMOVED' => $removedUsers,
378 'COUNTERS_DECREMENTED' => $decremented,
389 "DELETE FROM b_bp_task ".
390 "WHERE WORKFLOW_ID = '".
$DB->ForSql($workflowId).
"' "
391 .($taskStatus !==
null?
'AND STATUS = '.(int)$taskStatus :
'')
401 $cacheTag = self::COUNTERS_CACHE_TAG_PREFIX.$userId;
402 if ($cache->read(3600*24*7, $cacheTag))
409 "SELECT WI.MODULE_ID AS MODULE_ID, WI.ENTITY AS ENTITY, COUNT('x') AS CNT ".
411 ' INNER JOIN b_bp_task_user TU ON (T.ID = TU.TASK_ID) '.
412 ' INNER JOIN b_bp_workflow_instance WI ON (T.WORKFLOW_ID = WI.ID) '.
414 ' AND TU.USER_ID = '.(
int)
$userId.
' '.
415 'GROUP BY MODULE_ID, ENTITY';
422 $cnt = (int)$row[
'CNT'];
423 $counters[$row[
'MODULE_ID']][$row[
'ENTITY']] = $cnt;
424 if (!isset(
$counters[$row[
'MODULE_ID']][
'*']))
426 $counters[$row[
'MODULE_ID']][
'*'] += $cnt;
437 $workflowId = isset($taskData[
'WORKFLOW_ID']) ? $taskData[
'WORKFLOW_ID'] :
null;
446 $workflowId = $row[
'WORKFLOW_ID'];
447 $taskData[
'WORKFLOW_ID'] = $workflowId;
452 if (!empty($taskData[
'USERS']))
454 $users = $taskData[
'USERS'];
456 if (!empty($taskData[
'USERS_REMOVED']))
458 $users = array_merge($users, $taskData[
'USERS_REMOVED']);
460 if (!empty($taskData[
'USERS_STATUSES']))
462 $users = array_merge($users, array_keys($taskData[
'USERS_STATUSES']));
466 if (!empty($taskData[
'USERS_REMOVED']) || !empty($taskData[
'USERS_ADDED']))
468 unset(self::$taskUsers[$taskId]);
471 self::setSearchContent(
$status, $taskId, $taskData);
474 $runtime = CBPRuntime::GetRuntime();
476 $documentId = CBPStateService::GetStateDocumentId($workflowId);
479 $documentService =
$runtime->GetService(
'DocumentService');
482 $documentService->onTaskChange($documentId, $taskId, $taskData,
$status);
496 private static function pushChanges($taskId, $taskData,
$status)
498 $eventName = Bizproc\Integration\Push\BasePush::EVENT_ADDED;
504 $users = $taskData[
'USERS'];
508 $eventName = Bizproc\Integration\Push\BasePush::EVENT_UPDATED;
509 $users = array_unique(
511 $taskData[
'USERS'] ?? [],
512 $taskData[
'USERS_ADDED'] ?? [],
513 $taskData[
'USERS_REMOVED'] ?? [],
514 array_keys($taskData[
'USERS_STATUSES'] ?? []),
519 $eventName = Bizproc\Integration\Push\BasePush::EVENT_DELETED;
520 $users = $taskData[
'USERS_REMOVED'];
526 $users = static::getTaskUserIds($taskId);
529 Bizproc\Integration\Push\TaskPush::pushLastEvent($eventName, $taskId, $users);
534 $users = (
array) $users;
535 $users = array_unique($users);
539 $cache->clean(self::COUNTERS_CACHE_TAG_PREFIX.
$userId);
548 $updateMode = ($id > 0 ? true :
false);
549 $addMode = !$updateMode;
557 if (!is_array($arUsers))
558 $arUsers =
array($arUsers);
616 if (!is_array($arParameters))
617 $arParameters =
array($arParameters);
618 if (
count($arParameters) > 0)
619 $arFields[
"PARAMETERS"] = serialize($arParameters);
637 throw new Main\ArgumentException(
'Field CREATED_DATE must be datetime');
645 if(!defined(
"BX_AUTH_FORM"))
647 $tasksCount = CUserCounter::GetValue(
$USER->GetID(),
'bp_tasks');
653 "HTML" =>
'<span class="adm-informer-strong-text">'.
GetMessage(
"BPTS_AI_EX_TASKS").
'</span><br>'.
GetMessage(
"BPTS_AI_TASKS_NUM").
' '.$tasksCount,
654 "FOOTER" =>
'<a href="/bitrix/admin/bizproc_task_list.php?lang='.LANGUAGE_ID.
'">'.
GetMessage(
"BPTS_AI_TASKS_PERF").
'</a>',
680 "INSERT INTO b_bp_task (".$arInsert[0].
", MODIFIED) ".
681 "VALUES(".$arInsert[1].
", ".
$DB->CurrentTimeFunction().
")";
684 $taskId = intval(
$DB->LastID());
698 "INSERT INTO b_bp_task_user (USER_ID, TASK_ID, ORIGINAL_USER_ID) ".
699 "VALUES (".intval(
$userId).
", ".intval($taskId).
", ".intval(
$userId).
") "
702 self::incrementUserTaskCounter(
$userId);
706 $arFields[
'COUNTERS_INCREMENTED'] = $users;
730 $strUpdate =
$DB->PrepareUpdate(
"b_bp_task",
$arFields);
735 "UPDATE b_bp_task SET ".
737 " MODIFIED = ".$DB->CurrentTimeFunction().
" ".
738 "WHERE ID = ".intval($id).
" ";
742 $removedUsers = $addedUsers = $decremented = $incremented = [];
747 $previousUserIds = static::getTaskUserIds($id);
751 if (in_array(
$userId, $previousUserIds,
true))
757 "INSERT INTO b_bp_task_user (USER_ID, TASK_ID, ORIGINAL_USER_ID) ".
758 "VALUES ({$userId}, {$id}, {$userId})"
763 self::incrementUserTaskCounter(
$userId);
766 $diff = array_diff($previousUserIds,
$arFields[
'USERS']);
767 foreach ($diff as $removedUserId)
769 $decremented[] = $removedUserId;
770 self::decrementUserTaskCounter($removedUserId);
771 $removedUsers[] = $removedUserId;
772 $DB->Query(
"DELETE FROM b_bp_task_user WHERE TASK_ID = {$id} AND USER_ID = {$removedUserId}");
780 while ($userIterator = $dbResUser->Fetch())
782 $decremented[] = $userIterator[
"USER_ID"];
783 self::decrementUserTaskCounter((
int)$userIterator[
'USER_ID']);
791 $removedUsers[] = $userIterator[
"USER_ID"];
812 $arFields[
'USERS_REMOVED'] = $removedUsers;
820 $arFields[
'USERS_STATUSES'] = $userStatuses;
823 $arFields[
'COUNTERS_INCREMENTED'] = $incremented;
824 $arFields[
'COUNTERS_DECREMENTED'] = $decremented;
835 if (
count($arSelectFields) <= 0)
836 $arSelectFields =
array(
"ID",
"WORKFLOW_ID",
"ACTIVITY",
"ACTIVITY_NAME",
"MODIFIED",
"OVERDUE_DATE",
"NAME",
"DESCRIPTION",
"PARAMETERS");
839 "ID" =>
array(
"FIELD" =>
"T.ID",
"TYPE" =>
"int"),
840 "WORKFLOW_ID" =>
array(
"FIELD" =>
"T.WORKFLOW_ID",
"TYPE" =>
"string"),
841 "ACTIVITY" =>
array(
"FIELD" =>
"T.ACTIVITY",
"TYPE" =>
"string"),
842 "ACTIVITY_NAME" =>
array(
"FIELD" =>
"T.ACTIVITY_NAME",
"TYPE" =>
"string"),
843 "MODIFIED" =>
array(
"FIELD" =>
"T.MODIFIED",
"TYPE" =>
"datetime"),
844 'CREATED_DATE' => [
'FIELD' =>
'T.CREATED_DATE',
'TYPE' =>
'datetime'],
845 "OVERDUE_DATE" =>
array(
"FIELD" =>
"T.OVERDUE_DATE",
"TYPE" =>
"datetime"),
846 "NAME" =>
array(
"FIELD" =>
"T.NAME",
"TYPE" =>
"string"),
847 "DESCRIPTION" =>
array(
"FIELD" =>
"T.DESCRIPTION",
"TYPE" =>
"string"),
848 "PARAMETERS" =>
array(
"FIELD" =>
"T.PARAMETERS",
"TYPE" =>
"string"),
849 "IS_INLINE" =>
array(
"FIELD" =>
"T.IS_INLINE",
"TYPE" =>
"string"),
850 "DELEGATION_TYPE" =>
array(
"FIELD" =>
"T.DELEGATION_TYPE",
"TYPE" =>
"int"),
851 "STATUS" =>
array(
"FIELD" =>
"T.STATUS",
"TYPE" =>
"int"),
852 'DOCUMENT_NAME' =>
array(
"FIELD" =>
"T.DOCUMENT_NAME",
"TYPE" =>
"string"),
853 "USER_ID" =>
array(
"FIELD" =>
"TU.USER_ID",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_bp_task_user TU ON (T.ID = TU.TASK_ID)"),
854 "USER_STATUS" =>
array(
"FIELD" =>
"TU.STATUS",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_bp_task_user TU ON (T.ID = TU.TASK_ID)"),
855 "WORKFLOW_TEMPLATE_ID" =>
array(
"FIELD" =>
"WS.WORKFLOW_TEMPLATE_ID",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"),
856 "MODULE_ID" =>
array(
"FIELD" =>
"WS.MODULE_ID",
"TYPE" =>
"string",
"FROM" =>
"INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"),
857 "ENTITY" =>
array(
"FIELD" =>
"WS.ENTITY",
"TYPE" =>
"string",
"FROM" =>
"INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"),
858 "DOCUMENT_ID" =>
array(
"FIELD" =>
"WS.DOCUMENT_ID",
"TYPE" =>
"string",
"FROM" =>
"INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"),
859 "WORKFLOW_TEMPLATE_NAME" =>
array(
"FIELD" =>
"WT.NAME",
"TYPE" =>
"string",
860 "FROM" =>
array(
"INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)",
861 "INNER JOIN b_bp_workflow_template WT ON (WS.WORKFLOW_TEMPLATE_ID = WT.ID)")),
862 "WORKFLOW_TEMPLATE_TEMPLATE_ID" =>
array(
"FIELD" =>
"WS.WORKFLOW_TEMPLATE_ID",
"TYPE" =>
"int",
863 "FROM" =>
array(
"INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)")),
864 'WORKFLOW_STATE' =>
array(
"FIELD" =>
"WS.STATE_TITLE",
"TYPE" =>
"string",
"FROM" =>
"INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"),
865 'WORKFLOW_STARTED' =>
array(
"FIELD" =>
"WS.STARTED",
"TYPE" =>
"datetime",
"FROM" =>
"INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"),
866 'WORKFLOW_STARTED_BY' =>
array(
"FIELD" =>
"WS.STARTED_BY",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_bp_workflow_state WS ON (T.WORKFLOW_ID = WS.ID)"),
869 $arSqls = CBPHelper::PrepareSql(
$arFields, $arOrder,
$arFilter, $arGroupBy, $arSelectFields);
871 $arSqls[
"SELECT"] = str_replace(
"%%_DISTINCT_%%",
"", $arSqls[
"SELECT"]);
873 if (is_array($arGroupBy) &&
count($arGroupBy)==0)
876 "SELECT ".$arSqls[
"SELECT"].
" ".
878 " ".$arSqls[
"FROM"].
" ";
879 if ($arSqls[
"WHERE"] <>
'')
880 $strSql .=
"WHERE ".$arSqls[
"WHERE"].
" ";
881 if ($arSqls[
"GROUPBY"] <>
'')
882 $strSql .=
"GROUP BY ".$arSqls[
"GROUPBY"].
" ";
892 "SELECT ".$arSqls[
"SELECT"].
" ".
894 " ".$arSqls[
"FROM"].
" ";
895 if ($arSqls[
"WHERE"] <>
'')
896 $strSql .=
"WHERE ".$arSqls[
"WHERE"].
" ";
897 if ($arSqls[
"GROUPBY"] <>
'')
898 $strSql .=
"GROUP BY ".$arSqls[
"GROUPBY"].
" ";
899 if ($arSqls[
"ORDERBY"] <>
'')
900 $strSql .=
"ORDER BY ".$arSqls[
"ORDERBY"].
" ";
902 if (is_array($arNavStartParams) && empty($arNavStartParams[
"nTopCount"]))
905 "SELECT COUNT('x') as CNT ".
907 " ".$arSqls[
"FROM"].
" ";
908 if ($arSqls[
"WHERE"] <>
'')
909 $strSql_tmp .=
"WHERE ".$arSqls[
"WHERE"].
" ";
910 if ($arSqls[
"GROUPBY"] <>
'')
911 $strSql_tmp .=
"GROUP BY ".$arSqls[
"GROUPBY"].
" ";
915 if ($arSqls[
"GROUPBY"] ==
'')
922 $cnt =
$dbRes->SelectedRowsCount();
926 $dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
930 if (is_array($arNavStartParams) && intval($arNavStartParams[
"nTopCount"]) > 0)
931 $strSql .=
"LIMIT ".intval($arNavStartParams[
"nTopCount"]);
942 $neededTask = static::getNeededTaskByActivityName($activityName, $previousTasks);
944 foreach ($previousTasks as $task)
946 if (is_null($task[
'CREATED_DATE']) || is_null($neededTask[
'MODIFIED']))
951 $completedCreatedDiff = $task[
'CREATED_DATE']->getTimestamp() - $neededTask[
'MODIFIED']->getTimestamp();
952 if ($completedCreatedDiff <= 2 && $completedCreatedDiff >= 0 && $task !== $neededTask)
964 '=ACTIVITY_NAME' => $activityName,
965 '=TASK_USERS.USER_ID' =>
$userId,
966 '=WORKFLOW_STATE.WORKFLOW_TEMPLATE_ID' =>
$templateId,
972 $previousWorkflowIdSubquery =
973 Bizproc\Workflow\Task\TaskTable::query()
974 ->setSelect([
'WORKFLOW_ID'])
976 ->whereNull(
'WORKFLOW_INSTANCE.ID')
977 ->setOrder([
'TASK_USERS.TASK_ID' =>
'DESC'])
983 Bizproc\Workflow\Task\TaskTable::query()
984 ->setSelect([
'ID',
'CREATED_DATE',
'MODIFIED',
'ACTIVITY_NAME'])
986 '=TASK_USERS.USER_ID' =>
$userId,
988 '=WORKFLOW_ID' =>
new Main\DB\SqlExpression(
"($previousWorkflowIdSubquery)"),
990 ->setOrder([
'MODIFIED' =>
'ASC'])
993 return $tasksQuery->fetchAll();
996 private static function getNeededTaskByActivityName(
string $activityName,
array $previousTasks): ?
array
998 foreach ($previousTasks as $task)
1000 if ($task[
"ACTIVITY_NAME"] === $activityName)
1002 return static::getLastCompletedParallelTask($task, $previousTasks);
1009 private static function getLastCompletedParallelTask(
array $neededTask,
array $previousTasks):
array
1011 foreach ($previousTasks as $task)
1014 (!is_null($task[
'CREATED_DATE']) && !is_null($neededTask[
'CREATED_DATE']))
1016 && $task[
'MODIFIED'] > $neededTask[
'MODIFIED']
1019 $neededTask = $task;
1026 private static function setSearchContent(
$status, $taskId, $taskData): void
1033 Bizproc\Workflow\Task\TaskSearchContentTable::add([
1034 'TASK_ID' => $taskId,
1035 'WORKFLOW_ID' => $taskData[
'WORKFLOW_ID'],
1036 'SEARCH_CONTENT' => $taskData[
'NAME'] .
' ' . ($taskData[
'DESCRIPTION'] ??
''),
1040 if (!empty($taskData[
'NAME']) && !empty($taskData[
'DESCRIPTION']))
1042 Bizproc\Workflow\Task\TaskSearchContentTable::update(
1045 'SEARCH_CONTENT' => $taskData[
'NAME'] .
' ' . $taskData[
'DESCRIPTION'],
1051 Bizproc\Workflow\Task\TaskSearchContentTable::delete($taskId);
1055 catch (Main\DB\SqlQueryException $e)
1061 private static function incrementUserTaskCounter(
int $userId): void
1063 $userCounters =
new Bizproc\Workflow\WorkflowUserCounters(
$userId);
1064 $userCounters->incrementTask();
1067 private static function decrementUserTaskCounter(
int $userId): void
1069 $userCounters =
new Bizproc\Workflow\WorkflowUserCounters(
$userId);
1070 $userCounters->decrementTask();
1076 private static $classesList = [
1077 Bizproc\BaseType\Value\Date::class,
1078 Bizproc\BaseType\Value\DateTime::class,
1079 Main\Type\Date::class,
1080 Main\Type\DateTime::class,
1082 \DateTimeZone::class,
1083 Main\Web\Uri::class,
1088 $res = parent::Fetch();
1092 if (!empty(
$res[
"PARAMETERS"]))
1094 $res[
"PARAMETERS"] = unserialize(
$res[
"PARAMETERS"], [
'allowed_classes' => self::$classesList]);
1101 function getNext($bTextHtmlAuto=
true, $use_tilda=
true)
1103 $res = parent::GetNext($bTextHtmlAuto, $use_tilda);
1107 if (!empty(
$res[
"DESCRIPTION"]))
1109 $res[
"DESCRIPTION"] = CBPHelper::convertBBtoText(
$res[
"DESCRIPTION"]);
1123 $text = preg_replace(
1124 "'(?<=^|[\s.,;:!?\#\-\*\|\[\(\)\{\}]|\s)((http|https|news|ftp|aim|mailto)://[\.\-\_\:a-z0-9\@]([^\"\s\'\[\]\{\}])*)'is",
1129 $text = preg_replace_callback(
"#\[img\](.+?)\[/img\]#i",
array($this,
"ConvertBCodeImageTag"),
$text);
1131 $text = preg_replace_callback(
1132 "/\[url\]([^\]]+?)\[\/url\]/iu",
1133 array($this,
"ConvertBCodeAnchorTag"),
1136 $text = preg_replace_callback(
1137 "/\[url\s*=\s*([^\]]+?)\s*\](.*?)\[\/url\]/iu",
1138 array($this,
"ConvertBCodeAnchorTag"),
1142 $text = preg_replace(
1144 "/\[b\](.+?)\[\/b\]/isu",
1145 "/\[i\](.+?)\[\/i\]/isu",
1146 "/\[s\](.+?)\[\/s\]/isu",
1147 "/\[u\](.+?)\[\/u\]/isu",
1174 $extension = preg_replace(
"/^.*\.(\S+)$/u",
"\\1",
$url);
1175 $extension = mb_strtolower($extension);
1176 $extension = preg_quote($extension,
"/");
1180 if (preg_match(
"/[?&;]/u",
$url))
1182 if (!$bErrorIMG && !preg_match(
"/$extension(\||\$)/u",
"gif|jpg|jpeg|png"))
1184 if (!$bErrorIMG && !preg_match(
"/^((http|https|ftp)\:\/\/[-_:.a-z0-9@]+)*(\/[-_+\/=:.a-z0-9@%]+)$/iu",
$url))
1188 return "[img]".$url.
"[/img]";
1190 return '<img src="'.$url.
'" border="0" />';
1211 $arUrl = explode(
", ",
$url);
1228 if (preg_match(
"/([\.,\?]|!)$/u",
$url, $match))
1231 $url = preg_replace(
"/([\.,\?]|!)$/u",
"",
$url);
1232 $text = preg_replace(
"/([\.,\?]|!)$/u",
"",
$text);
1235 $url = preg_replace(
1236 array(
"/&/u",
"/javascript:/iu"),
1237 array(
"&",
"java script: "),
1240 if (mb_substr(
$url, 0, 1) !=
"/" && !preg_match(
"/^(http|news|https|ftp|aim|mailto)\:\/\//iu",
$url))
1241 $url =
'http://'.$url;
1242 if (!preg_match(
"/^((http|https|news|ftp|aim):\/\/[-_:.a-z0-9@]+)*([^\"\'])+$/iu",
$url))
1245 $text = preg_replace(
1246 array(
"/&/iu",
"/javascript:/iu"),
1247 array(
"&",
"javascript: "),
1254 $result .=
"<a href=\"".$url.
"\" target='_blank'>".
$text.
"</a>".$end;
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static normalizeArrayValuesByInt(&$map, $sorted=true)
convertBCodeImageTag($url="")
convertBCodeAnchorTag($url, $text='')
getNext($bTextHtmlAuto=true, $use_tilda=true)
static isLastTaskForUserByActivity(string $activityName, int $userId, int $templateId, ?string $activity=null)
static GetList($arOrder=array("ID"=> "DESC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
markCompleted($taskId, $userId, $status=CBPTaskUserStatus::Ok)
static parseFields(&$arFields, $id=0)
static getTaskUserIds(int $taskId)
static getTaskUsers($taskId)
static update($id, $arFields)
markUnCompleted(int $taskId, array $userIds)
static cleanCountersCache($users)
deleteAllWorkflowTasks($workflowId)
static onTaskChange($taskId, $taskData, $status)
const COUNTERS_CACHE_TAG_PREFIX
static deleteByWorkflow($workflowId, $taskStatus=null)
static delegateTask($taskId, $fromUserId, $toUserId)
static onAdminInformerInsertItems()
static getList($arOrder=array("ID"=> "DESC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
static extractUsers(mixed $usersIterator, array &$users)
static getCounters($userId)
static getOriginalTaskUserId($taskId, $realUserId)
static getWorkflowParticipants($workflowId, $userStatus=null)
static getWorkflowUsers(string $workflowId)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
ExecuteModuleEventEx($arEvent, $arParams=[])
htmlspecialcharsback($str)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
GetMessage($name, $aReplace=null)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"