- Модуль: sender
- Путь к файлу: ~/bitrix/modules/sender/lib/internals/countercalculation.php
- Класс: Bitrix\Sender\Internals\CounterCalculation
- Вызов: CounterCalculation::updatePostingStatusCounters
static function updatePostingStatusCounters()
{
$lastPostingId = null;
$statusList = array();
$resultDb = \Bitrix\Sender\PostingRecipientTable::getList(array(
'select' => array('POSTING_ID', 'STATUS', 'CALC_COUNT'),
'filter' => array(
'!UPDATE_POSTING.ID' => null,
'!STATUS' => null,
'=UPDATE_POSTING.COUNT_SEND_ALL' => 0, // run only for postings with empty count field
'>CALC_COUNT' => 0 // run only if posting have recipients
),
'runtime' => array(
new \Bitrix\Main\Entity\ExpressionField('CALC_COUNT', 'COUNT(%s)', 'ID'),
new \Bitrix\Main\Entity\ReferenceField(
'UPDATE_POSTING',
'Bitrix\Sender\PostingTable',
array('=this.POSTING_ID' => 'ref.ID'),
array('join_type' => 'INNER')
),
),
'order' => array('CALC_COUNT' => 'DESC', 'POSTING_ID' => 'ASC'),
));
$stopRun = false;
while(!$stopRun)
{
if(self::isTimeUp())
{
return true;
}
$data = $resultDb->fetch();
// do update if last record or starts records for another posting
if(!$data || $lastPostingId != $data['POSTING_ID'])
{
// do update if it have fields for update
$updateFields = self::getPostingStatusUpdateFields($lastPostingId, $statusList);
if($updateFields)
{
Model\PostingTable::update($lastPostingId, $updateFields);
}
$statusList = array();
}
if($data)
{
$lastPostingId = $data['POSTING_ID'];
$statusList[$data['STATUS']] = $data['CALC_COUNT'];
}
if(!$data)
{
$stopRun = true;
}
}
return false;
}