• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/mailingmanager.php
  • Класс: BitrixSenderMailingManager
  • Вызов: MailingManager::chainSend
static function chainSend($letterId)
{
	static::$error = null;

	$letter = ModelLetterTable::getRowById($letterId);
	if($letter && $letter['STATUS'] === ModelLetterTable::STATUS_PLAN)
	{
		$updateResult = ModelLetterTable::update($letterId, array('STATUS' => ModelLetterTable::STATUS_SEND));
		if ($updateResult->isSuccess())
		{
			$letter = ModelLetterTable::getRowById($letterId);
		}
	}
	if(!$letter || !in_array($letter['STATUS'], [
		ModelLetterTable::STATUS_SEND
		]))
	{
		return "";
	}

	if(!static::checkOnBeforeChainSend($letterId))
	{
		return RuntimeSenderJob::getAgentName($letterId);
	}

	$postingSendStatus = '';
	if(!empty($letter['POSTING_ID']))
	{
		try
		{
			$postingSendStatus = PostingManager::send(
				$letter['POSTING_ID'],
				RuntimeEnv::getJobExecutionTimeout(),
				RuntimeEnv::getJobExecutionItemLimit()
			);
		}
		catch (Exception $e)
		{
			static::$error = $e;
			$postingSendStatus = PostingManager::SEND_RESULT_ERROR;
		}
	}

	if(!empty(static::$error) || $postingSendStatus === PostingManager::SEND_RESULT_CONTINUE)
	{
		return RuntimeSenderJob::getAgentName($letterId);
	}


	if ($postingSendStatus === PostingManager::SEND_RESULT_WAIT)
	{
		ModelLetterTable::update($letterId, array('STATUS' => ModelLetterTable::STATUS_WAIT));
		return "";
	}


	if ($postingSendStatus === PostingManager::SEND_RESULT_WAITING_RECIPIENT)
	{
		return RuntimeSenderJob::getAgentName($letterId);
	}

	if ($letter['REITERATE'] !== 'Y')
	{
		ModelLetterTable::update($letterId, array('STATUS' => ModelLetterTable::STATUS_END));
		return "";
	}

	$isNeedUpdate = true;
	if($letter['IS_TRIGGER'] == 'Y')
	{
		$postingDb = PostingTable::getList(array(
			'select' => array('ID', 'DATE_CREATE'),
			'filter' => array(
				'STATUS' => PostingTable::STATUS_NEW,
				'MAILING_CHAIN_ID' => $letter['ID']
			),
			'order' => array('DATE_CREATE' => 'ASC'),
			'limit' => 1
		));
		if($posting = $postingDb->fetch())
		{
			$dateCreate = $posting['DATE_CREATE'];
			/** @var TypeDateTime $dateCreate|null */
			$updateFields = [
				'STATUS' => ModelLetterTable::STATUS_SEND,
				'AUTO_SEND_TIME' => $dateCreate ? $dateCreate->add($letter['TIME_SHIFT'].' minutes') : null,
				'POSTING_ID' => $posting['ID']
			];
			ModelLetterTable::update($letterId, $updateFields);
			$isNeedUpdate = false;
		}
	}

	if ($isNeedUpdate)
	{
		$letterInstance = new EntityLetter();
		$letterInstance->loadByArray($letter);
		$letterInstance->wait();
	}

	$eventData = array(
		'MAILING_CHAIN' => $letter
	);
	$event = new BitrixMainEvent('sender', 'OnAfterMailingChainSend', array($eventData));
	$event->send();

	return "";
}