Your IP : 3.15.3.198


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/crm/lib/agent/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/modules/crm/lib/agent/entitystepwiseagent.php

<?php
namespace Bitrix\Crm\Agent;

use Bitrix\Main\Config\Option;

abstract class EntityStepwiseAgent extends AgentBase
{
	/**
	 * @return EntityStepwiseAgent|null
	 */
	public static function getInstance()
	{
		return null;
	}

	public function isRegistered()
	{
		$dbResult = \CAgent::GetList(
			array('ID' => 'DESC'),
			array('MODULE_ID' => 'crm', 'NAME' => get_called_class().'::run(%')
		);
		return is_object($dbResult) && is_array($dbResult->Fetch());
	}

	public function register($delay = 0)
	{
		if(!is_int($delay))
		{
			$delay = (int)$delay;
		}

		if($delay < 0)
		{
			$delay = 0;
		}

		return \CAgent::AddAgent(
			get_called_class().'::run();',
			'crm',
			'N',
			0,
			'',
			'Y',
			ConvertTimeStamp(time() + \CTimeZone::GetOffset() + $delay, 'FULL')
		);
	}

	public function isEnabled()
	{
		$name = $this->getOptionName();
		return $name !== '' && Option::get('crm', $name, 'N') === 'Y';
	}

	public function enable($enable)
	{
		$name = $this->getOptionName();
		if($name === '')
		{
			return;
		}

		if(!is_bool($enable))
		{
			$enable = (bool)$enable;
		}

		if($enable === self::isEnabled())
		{
			return;
		}

		if($enable)
		{
			Option::set('crm', $name, 'Y');
		}
		else
		{
			Option::delete('crm', array('name' => $name));
		}

		$progressName = $this->getProgressOptionName();
		if($progressName !== '')
		{
			Option::delete('crm', array('name' => $progressName));
		}
	}

	//region AgentBase
	public static function doRun()
	{
		$instance = static::getInstance();
		if($instance === null)
		{
			return false;
		}

		if(!$instance->isEnabled())
		{
			return false;
		}

		$progressData = $instance->getProgressData();

		$offsetID = isset($progressData['LAST_ITEM_ID']) ? (int)($progressData['LAST_ITEM_ID']) : 0;
		$processedItemQty = isset($progressData['PROCESSED_ITEMS']) ? (int)($progressData['PROCESSED_ITEMS']) : 0;

		$limit = $instance->getIterationLimit();
		if($limit <= 0)
		{
			$instance->enable(false);
			return false;
		}

		$itemIDs = $instance->getEntityIDs($offsetID, $limit);
		$itemQty = count($itemIDs);

		if($itemQty === 0)
		{
			$instance->enable(false);
			return false;
		}

		$instance->process($itemIDs);

		$processedItemQty += $itemQty;
		$totalItemQty = $instance->getTotalEntityCount();

		$progressData['LAST_ITEM_ID'] = $itemIDs[$itemQty - 1];
		$progressData['PROCESSED_ITEMS'] = $processedItemQty;
		$progressData['TOTAL_ITEMS'] = $totalItemQty;

		$instance->setProgressData($progressData);
		return true;
	}
	//endregion

	public function getProgressData()
	{
		$progressName = $this->getProgressOptionName();
		if($progressName === '')
		{
			return null;
		}

		$s = Option::get('crm', $progressName,  '');
		$data = $s !== '' ? unserialize($s) : null;
		if(!is_array($data))
		{
			$data = array();
		}

		$data['LAST_ITEM_ID'] = isset($data['LAST_ITEM_ID']) ? (int)($data['LAST_ITEM_ID']) : 0;
		$data['PROCESSED_ITEMS'] = isset($data['PROCESSED_ITEMS']) ? (int)($data['PROCESSED_ITEMS']) : 0;
		$data['TOTAL_ITEMS'] = isset($data['TOTAL_ITEMS']) ? (int)($data['TOTAL_ITEMS']) : 0;

		return $data;
	}
	public function setProgressData(array $data)
	{
		$progressName = $this->getProgressOptionName();
		if($progressName !== '')
		{
			Option::set('crm', $progressName, serialize($data));
		}
	}

	public abstract function process(array $itemIDs);
	protected abstract function getOptionName();
	protected abstract function getProgressOptionName();
	protected abstract function getTotalEntityCount();
	protected abstract function getEntityIDs($offsetID, $limit);
	protected function getIterationLimit()
	{
		return 100;
	}
}