• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/posting/sender.php
  • Класс: BitrixSenderPostingSender
  • Вызов: Sender::updateActualStatus
static function updateActualStatus($postingId, $isPrevented = false, $awaitThread = false)
{
	//set status and delivered and error emails
	$statusList = PostingTable::getRecipientCountByStatus($postingId,[
		'LOGIC' => 'OR',
		[
			'@STATUS' => [
				PostingRecipientTable::SEND_RESULT_DENY,
				PostingRecipientTable::SEND_RESULT_NONE,
				PostingRecipientTable::SEND_RESULT_SUCCESS,
				PostingRecipientTable::SEND_RESULT_ERROR,
			],
		],
		[
			'=STATUS' => PostingRecipientTable::SEND_RESULT_WAIT_ACCEPT,
			'>=DATE_SENT' => (new TypeDateTime())->add("- 1 week")
		]
	]);
	$hasStatusError = array_key_exists(PostingRecipientTable::SEND_RESULT_ERROR, $statusList);
	$hasStatusNone  = array_key_exists(PostingRecipientTable::SEND_RESULT_NONE, $statusList);
	$hasStatusWait = array_key_exists(PostingRecipientTable::SEND_RESULT_WAIT_ACCEPT, $statusList);
	if ($isPrevented)
	{
		$status = PostingTable::STATUS_ABORT;
	}
	elseif (!$hasStatusNone && !$awaitThread && !$hasStatusWait)
	{
		$status = $hasStatusError ? PostingTable::STATUS_SENT_WITH_ERRORS : PostingTable::STATUS_SENT;
	}
	else
	{
		$status = PostingTable::STATUS_PART;
	}

	$postingUpdateFields = [
		'STATUS'         => $status,
		'DATE_SENT'      => $status == PostingTable::STATUS_PART ? null : new TypeDateTime(),
		'COUNT_SEND_ALL' => 0
	];

	$recipientStatusToPostingFieldMap = PostingTable::getRecipientStatusToPostingFieldMap();
	foreach ($recipientStatusToPostingFieldMap as $recipientStatus => $postingFieldName)
	{
		if (!array_key_exists($recipientStatus, $statusList))
		{
			$statusList[$recipientStatus] = 0;
		}
		$postingUpdateFields[$postingFieldName] = $statusList[$recipientStatus];
	}
	$postingUpdateFields['COUNT_SEND_ALL'] = array_sum($statusList);
	ModelPostingTable::update($postingId, $postingUpdateFields);

	return $status;
}