Your IP : 3.147.68.199


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sender/lib/segment/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sender/lib/segment/tileview.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage sender
 * @copyright 2001-2012 Bitrix
 */
namespace Bitrix\Sender\Segment;

use Bitrix\Main\Localization\Loc;
use Bitrix\Sender\GroupTable;
use Bitrix\Sender\Entity;
use Bitrix\Sender\Dispatch;
use Bitrix\Sender\Message;

Loc::loadMessages(__FILE__);

/**
 * Class TileView
 * @package Bitrix\Sender\Entity
 * @internal
 */
class TileView
{
	const MAX_COUNT = 4;

	/** @var bool $isInclude Is include. */
	protected $isInclude = true;

	/** @var Message\Adapter $message Message. */
	protected $message;

	/**
	 * Create instance.
	 *
	 * @param bool $isInclude Get stat by including or excluding segments in letters.
	 * @return static
	 */
	public static function create($isInclude = true)
	{
		return new static($isInclude);
	}

	/**
	 * Constructor.
	 *
	 * @param bool $isInclude Get stat by including or excluding segments in letters.
	 */
	public function __construct($isInclude = true)
	{
		$this->isInclude = $isInclude;
	}

	/**
	 * Set message.
	 *
	 * @param Message\Adapter|null $message Message.
	 *
	 * @return $this
	 */
	public function setMessage(Message\Adapter $message = null)
	{
		$this->message = $message;
		return $this;
	}

	/**
	 * Get segments as tiles array.
	 *
	 * @return array
	 */
	public function getSections()
	{
		$list = array(
			'last' => array(
				'id' => 'last',
				'name' => Loc::getMessage('SENDER_SEGMENT_TILEVIEW_SECTION_LAST'),
				'items' => array()
			),
			'freq' => array(
				'id' => 'freq',
				'name' => Loc::getMessage('SENDER_SEGMENT_TILEVIEW_SECTION_FREQ'),
				'items' => array()
			),
			'system' => array(
				'id' => 'system',
				'name' => Loc::getMessage('SENDER_SEGMENT_TILEVIEW_SECTION_SYSTEM'),
				'items' => array()
			),
			'my' => array(
				'id' => 'my',
				'name' => Loc::getMessage('SENDER_SEGMENT_TILEVIEW_SECTION_MY'),
				'items' => array()
			),
		);
		$tiles = $this->getTiles(array('filter' => array('=HIDDEN' => false)));

		foreach ($tiles as $tile)
		{
			// set last
			if ($tile['data']['last'])
			{
				/** @var \Bitrix\Main\Type\DateTime $last */
				$last = $tile['data']['last'];
				$tile['data']['last'] = $last->getTimestamp();

				$list['last']['items'][] = $tile;
			}

			// set freq
			if ($tile['data']['freq'])
			{
				$list['freq']['items'][] = $tile;
			}

			// set system or my
			$key = $tile['data']['system'] ? 'system' : 'my';
			$list[$key]['items'][] = $tile;
		}

		// sort & cut last
		usort(
			$list['last']['items'],
			function ($a, $b)
			{
				return ($a['data']['last'] > $b['data']['last']) ? -1 : 1;
			}
		);
		$list['last']['items'] = array_slice($list['last']['items'], 0, self::MAX_COUNT);

		// sort freq
		usort(
			$list['freq']['items'],
			function ($a, $b)
			{
				return ($a['data']['freq'] > $b['data']['freq']) ? -1 : 1;
			}
		);
		$list['freq']['items'] = array_slice($list['freq']['items'], 0, self::MAX_COUNT);

		// remove empty sections
		foreach ($list as $sectionId => $section)
		{
			if (count($section['items']) > 0)
			{
				continue;
			}

			unset($list[$sectionId]);
		}
		$list = array_values($list);

		return $list;
	}

	/**
	 * Get segments as tiles array.
	 *
	 * @param integer $segmentId Segment ID.
	 * @return array|null
	 */
	public function getTile($segmentId)
	{
		$tiles = $this->getTiles(array('filter' => array('=ID' => $segmentId)));
		$tile = current($tiles) ?: null;
		return $tile;
	}

	/**
	 * Get segments as tiles array.
	 *
	 * @param array $parameters Parameters.
	 * @return array
	 */
	public function getTiles(array $parameters = array())
	{
		$result = array();
		$ids = array();

		$prefix = $this->isInclude ? '' : '_EXCLUDE';
		$fieldDateUse = "DATE_USE$prefix";
		$fieldUseCount = "USE_COUNT$prefix";

		if (!isset($parameters['order']))
		{
			$parameters['order'] = array(
				'SORT' => 'ASC',
				'NAME' => 'ASC',
				$fieldDateUse => 'DESC'
			);
		}

		$segments = GroupTable::getList($parameters);
		foreach ($segments as $segment)
		{
			$item = array(
				'id' => $segment['ID'],
				'name' => $segment['NAME'],
				'data' => array(
					'last' => $segment[$fieldDateUse],
					'freq' => (int) $segment[$fieldUseCount],
					'hidden' => $segment['HIDDEN'] == 'Y',
					'system' => $segment['SYSTEM'] == 'Y',
					'count' => array()
				),
			);

			$item['bgcolor'] = self::getBackgroundColor($item['data']);
			$result[] = $item;
			$ids[] = $item['id'];
		}

		if (count($ids) > 0)
		{
			$duration = null;
			$messageTypes = array();
			if ($this->message)
			{
				$duration = Dispatch\DurationCountBased::create($this->message);
				$messageTypes = $this->message->getSupportedRecipientTypes();
			}

			$counters = Entity\Segment::getAddressCounters($ids);
			foreach ($result as $index => $item)
			{
				if (!isset($counters[$item['id']]))
				{
					continue;
				}

				// set count
				$item['data']['count'] = $counters[$item['id']];

				// set duration
				foreach ($item['data']['count'] as $typeId => $count)
				{
					if (isset($item['data']['duration']) && $item['data']['duration'])
					{
						continue;
					}

					if (!$duration || !$this->message)
					{
						continue;
					}

					if (!in_array($typeId, $messageTypes))
					{
						continue;
					}

					$item['data']['duration'] = $duration->getIntervalDefault($count);
				}

				$result[$index] = $item;
			}
		}

		return $result;
	}

	protected static function getBackgroundColor(array $data)
	{
		if ($data['system'])
		{
			return null;//'#d3ffcd';
		}
		elseif ($data['hidden'])
		{
			return '#eef2f4';
		}
		else
		{
			return null;
		}
	}
}