- Модуль: 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 "";
}