5use Bitrix\Main\Data\Cache;
6use Bitrix\Rest\Exceptions\ArgumentTypeException;
42 private const OFFLINE_EVENT_DEFAULT_TIMEOUT = 1;
43 private const OFFLINE_EVENT_CACHE_PREFIX =
'OFFLINE_EVENT_TIMEOUT';
45 private static $isSendOfflineEvent =
false;
54 return 'b_rest_event_offline';
66 'data_type' =>
'integer',
68 'autocomplete' =>
true,
70 'TIMESTAMP_X' =>
array(
71 'data_type' =>
'datetime',
73 'MESSAGE_ID' =>
array(
74 'data_type' =>
'string',
78 'data_type' =>
'integer',
81 'EVENT_NAME' =>
array(
82 'data_type' =>
'string',
85 'EVENT_DATA' =>
array(
86 'data_type' =>
'text',
89 'EVENT_ADDITIONAL' =>
array(
90 'data_type' =>
'text',
93 'PROCESS_ID' =>
array(
94 'data_type' =>
'string',
95 'default_value' =>
'',
97 'CONNECTOR_ID' =>
array(
98 'data_type' =>
'string',
99 'default_value' =>
'',
102 'data_type' =>
'integer',
103 'default_value' => 0,
112 $tableName = static::getTableName();
113 $dateTime =
$connection->getSqlHelper()->addSecondsToDateTime(
'-' . static::PROCESS_ID_LIFETIME);
115 $sql =
"DELETE FROM {$tableName} WHERE PROCESS_ID<>'' AND TIMESTAMP_X<{$dateTime}";
119 return "\\Bitrix\\Rest\\EventOfflineTable::cleanProcessAgent();";
124 if(!isset(
$fields[
'CONNECTOR_ID']))
131 'MESSAGE_ID' => static::getMessageId(
$fields),
133 'EVENT_NAME' =>
$fields[
'EVENT_NAME'],
134 'EVENT_DATA' => serialize(
$fields[
'EVENT_DATA']),
135 'EVENT_ADDITIONAL' => serialize(
$fields[
'EVENT_ADDITIONAL']),
136 'CONNECTOR_ID' =>
$fields[
'CONNECTOR_ID'],
139 $updateFields =
array(
141 'EVENT_DATA' => serialize(
$fields[
'EVENT_DATA']),
142 'EVENT_ADDITIONAL' => serialize(
$fields[
'EVENT_ADDITIONAL']),
145 if(array_key_exists(
'ERROR',
$fields))
147 $addFields[
'ERROR'] = intval(
$fields[
'ERROR']) > 0 ? 1 : 0;
148 $updateFields[
'ERROR'] = intval(
$fields[
'ERROR']) > 0 ? 1 : 0;
152 $queries =
$connection->getSqlHelper()->prepareMerge(
153 static::getTableName(),
154 array(
'MESSAGE_ID',
'APP_ID',
'CONNECTOR_ID',
'PROCESS_ID'),
159 foreach($queries as
$query)
167 $processId = static::getProcessId();
169 $limit = intval($limit);
188 if (is_array($value) || is_object($value))
200 if (!is_string(
$key))
204 if (is_array($value) || is_object($value))
221 public static function clearEvents($processId, $appId, $connectorId, $listIds =
false)
225 $tableName = static::getTableName();
226 $processId =
$connection->getSqlHelper()->forSql($processId);
227 $appId = intval($appId);
228 $connectorId =
$connection->getSqlHelper()->forSql($connectorId);
230 $sql =
"DELETE FROM {$tableName} WHERE PROCESS_ID='{$processId}' AND APP_ID='{$appId}' AND CONNECTOR_ID='{$connectorId}'";
232 if($listIds !==
false)
234 array_map(
'intval', $listIds);
235 $sql .=
" AND ID IN ('".implode(
"', '", $listIds).
"')";
246 $tableName = static::getTableName();
247 $processId =
$connection->getSqlHelper()->forSql($processId);
248 $appId = intval($appId);
249 $connectorId =
$connection->getSqlHelper()->forSql($connectorId);
251 $sql =
"DELETE FROM {$tableName} WHERE PROCESS_ID='{$processId}' AND APP_ID='{$appId}' AND CONNECTOR_ID='{$connectorId}'";
253 if($listIds !==
false)
255 foreach($listIds as
$key => $id)
257 $listIds[
$key] = $helper->forSql($id);
260 $sql .=
" AND MESSAGE_ID IN ('".implode(
"', '", $listIds).
"')";
266 public static function markError($processId, $appId, $connectorId,
array $listIds)
268 if(
count($listIds) > 0)
273 foreach($listIds as
$key => $id)
275 $listIds[
$key] = $helper->forSql($id);
279 "APP_ID='".intval($appId).
"'",
280 "CONNECTOR_ID='".$helper->forSql($connectorId).
"'",
281 "MESSAGE_ID IN ('".implode(
"', '", $listIds).
"')",
284 $sqlTable = static::getTableName();
285 $sqlWhere = implode(
" AND ", $queryWhere);
286 $sqlProcessId = $helper->forSql($processId);
289 $sql[] =
"DELETE FROM {$sqlTable} WHERE {$sqlWhere} AND ERROR=0 AND PROCESS_ID <> '{$sqlProcessId}'";
290 $sql[] =
"UPDATE {$sqlTable} SET ERROR=1, PROCESS_ID=IF(PROCESS_ID='{$sqlProcessId}', '', 'fake_process_id') WHERE {$sqlWhere} AND ERROR=0 ORDER BY PROCESS_ID ASC";
291 $sql[] =
"DELETE FROM {$sqlTable} WHERE {$sqlWhere} AND PROCESS_ID='fake_process_id'";
313 $timeout = !is_null($timeout) ? (int)$timeout : static::OFFLINE_EVENT_DEFAULT_TIMEOUT;
317 $key = static::OFFLINE_EVENT_CACHE_PREFIX.
'|' . $id .
'|'. $timeout;
318 $cache = Cache::createInstance();
319 if ($cache->initCache($timeout,
$key))
323 elseif ($cache->startDataCache())
327 $cache->endDataCache(
$data);
330 elseif (static::$isSendOfflineEvent ===
false)
332 static::$isSendOfflineEvent =
true;
342 if (!is_array(
$data[
'APP_LIST']) || !in_array((
int) $handler[
'APP_ID'],
$data[
'APP_LIST'],
true))
347 $timeout = $handler[
'OPTIONS'][
'minTimeout'] ??
null;
348 if (!static::checkSendTime($handler[
'ID'], $timeout))
367 return $connection->query(
"DELETE FROM ".static::getTableName().
" WHERE APP_ID='".$appId.
"'");
static getConnection($name="")
static getString($length, $caseSensitive=false)
static clearEvents($processId, $appId, $connectorId, $listIds=false)
static checkSendTime($id, $timeout=null)
static cleanProcessAgent()
const PROCESS_ID_LIFETIME
static clearEventsByMessageId($processId, $appId, $connectorId, $listIds=false)
static prepareOfflineEvent($params, $handler)
static callEvent($fields)
static deleteByApp(mixed $appId)
static getMessageId($fields)
static markError($processId, $appId, $connectorId, array $listIds)
static markEvents($filter, $order, $limit)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</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."%"
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']