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