• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/trigger/manager.php
  • Класс: BitrixSenderTriggerManager
  • Вызов: Manager::onAfterPostingSendRecipient
static function onAfterPostingSendRecipient(Event $event)
{
	$data = $event->getParameter(0);

	if(!$data || !$data['SEND_RESULT'] || empty($data['POSTING']['MAILING_CHAIN_ID']))
		return;

	$chainId = $data['POSTING']['MAILING_CHAIN_ID'];
	$dataRecipient = $data['RECIPIENT'];

	static $mailingParams = array();
	if(!isset($mailingParams[$chainId]))
	{
		$mailingParams[$chainId] = array();

		$childChainDb = MailingChainTable::getList(array(
			'select' => array(
				'ID', 'MAILING_ID', 'PARENT_ID', 'POSTING_ID'
			),
			'filter' => array(
				'=MAILING.ACTIVE' => 'Y',
				'=IS_TRIGGER' => 'Y',
				'=STATUS' => array(MailingChainTable::STATUS_WAIT, MailingChainTable::STATUS_SEND),
				'=PARENT_ID' => $chainId
			)
		));
		while($childChain = $childChainDb->fetch())
		{
			// add posting
			$postingAddDb = PostingTable::add(array(
				'MAILING_ID' => $childChain['MAILING_ID'],
				'MAILING_CHAIN_ID' => $childChain['ID'],
			));
			if(!$postingAddDb->isSuccess())
			{
				continue;
			}

			$mailingParams[$chainId][] = array(
				'POSTING_ID' => $postingAddDb->getId(),
				'CHAIN' => $childChain,
			);
		}
	}

	if(empty($mailingParams[$chainId]))
	{
		return;
	}

	foreach($mailingParams[$chainId] as $chainKey => $mailingParamsItem)
	{
		$postingId = $mailingParamsItem['POSTING_ID'];
		$childChain = $mailingParamsItem['CHAIN'];

		// check email as unsubscribed
		// TODO: modify to accept RID
		if(Subscription::isUnsubscibed($childChain['MAILING_ID'], $data['RECIPIENT']['EMAIL']))
			continue;

		$recipient = array('POSTING_ID' => $postingId);
		$recipient['STATUS'] = PostingRecipientTable::SEND_RESULT_NONE;

		$recipient['CONTACT_ID'] = $dataRecipient['CONTACT_ID'];
		if(!empty($dataRecipient['FIELDS']))
		{
			$recipient['FIELDS'] = $dataRecipient['FIELDS'];
		}

		if(!empty($dataRecipient['ROOT_ID']))
		{
			$recipient['ROOT_ID'] = $dataRecipient['ROOT_ID'];
		}
		else
		{
			$recipient['ROOT_ID'] = $dataRecipient['ID'];
		}

		if(!empty($dataRecipient['USER_ID']))
		{
			$recipient['USER_ID'] = $dataRecipient['USER_ID'];
		}

		// add recipient
		PostingTable::addRecipient($recipient, true);
		if(empty($childChain['POSTING_ID']))
		{
			$chainUpdateDb = ModelLetterTable::update($childChain['ID'], array('POSTING_ID' => $postingId));
			if($chainUpdateDb->isSuccess())
			{
				$mailingParams[$chainId][$chainKey]['CHAIN']['POSTING_ID'] = $postingId;
			}
		}
	}

}