%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /proc/11976/task/11976/root/home/bitrix/www/local/php_interface/include/
Upload File :
Create Path :
Current File : //proc/11976/task/11976/root/home/bitrix/www/local/php_interface/include/money_subscribe_helper.php

<?php

class MoneySubscribeHelper
{
	const IBLOCK_ID = 33;
	
	const SUBSCRIBE_PRO = 6321;
	const SUBSCRIBE_STD = 6320;
	
	const P4_STD = 45937;
	const P4_PRO = 45938;
	
	const START_DATE = '01.12.2017 00:00:00';
	const ALL_DATE = '01.01.2018 00:00:00';
	const FREE_DAYS = 30;
	
	const SUBSCRIBES_TYPE = [
		self::SUBSCRIBE_PRO => self::P4_PRO,
		self::SUBSCRIBE_STD => self::P4_STD
	];
	
	const SUBSCRIBES = [
		'Get promoted' => [
			'SECTION_ID' => 5104,
			'LINKED' => [],
			'HANDLER' => 'MoneySubscribeHelper_GetPromoted'
		],
		'Standart' => [
			'SECTION_ID' => 6320,
			'LINKED' => [6321],
			'HANDLER' => 'MoneySubscribeHelper_Standart'
		],
		'PRO' => [
			'SECTION_ID' => 6321,
			'LINKED' => [6320],
			'HANDLER' => 'MoneySubscribeHelper_PRO'
		]
	];
	
	/**
	 * Возвращает подписки пользователя
	 * @param $profileID
	 * @param array $arAdditionalFilter
	 * @return array
	 */
	public static function user_subscribes($profileID, $arAdditionalFilter = [])
	{
		CModule::IncludeModule('iblock');
		
		$arSections = [];
		$arSubscribes = [];

		if (intval($profileID) > 0)
		{
			$arFilter = array_merge([
				'IBLOCK_ID' => static::IBLOCK_ID,
				'PROPERTY_PROFILE' => $profileID
			], $arAdditionalFilter);
			
			$dbSubs = CIBlockElement::GetList(['DATE_ACTIVE_TO' => 'desc'], $arFilter, false, false, [
				'ID', 'IBLOCK_ID', 'ACTIVE', 'IBLOCK_SECTION_ID', 'DATE_ACTIVE_TO', 'DATE_ACTIVE_FROM'
			]);
			
			while ($arSubs = $dbSubs->Fetch())
			{
				if (!array_key_exists($arSubs['IBLOCK_SECTION_ID'], $arSections))
				{
					$dbSection = CIBlockSection::GetByID($arSubs['IBLOCK_SECTION_ID']);
					$arSection = $dbSection->Fetch();
					$arSections[$arSubs['IBLOCK_SECTION_ID']] = $arSection;
				}
				
				$arSubscribes[] = [
					'ID' => $arSubs['ID'],
					'SUBSCRIBE' => $arSections[$arSubs['IBLOCK_SECTION_ID']]['NAME'],
					'IBLOCK_SECTION_ID' => $arSubs['IBLOCK_SECTION_ID'],
					'ACTIVE' => $arSubs['ACTIVE'],
					'EXPIRE' => MakeTimeStamp($arSubs['DATE_ACTIVE_TO']),
					'DATE_FROM' => $arSubs['DATE_ACTIVE_FROM'],
					'DATE_TO' => $arSubs['DATE_ACTIVE_TO']
				];
			}
		}
		
		return $arSubscribes;
	}
	
	/**
	 * Возвращает актуальное состояние лимитов для профиля
	 * @param $profileID
	 * @param bool $bResolveUser true, если определить пользователя из профиля (для агентов)
	 * @return array|bool
	 */
	public static function getSubscribesState($profileID, $bResolveUser = false)
	{
		$profileID = intval($profileID);
		if ($profileID<=0)
			return false;
		
		if ($bResolveUser)
		{
			$dbProfile = CIBlockElement::GetList([], ['IBLOCK_ID'=> IBLOCK_PROFILE_ID, 'ID' => $profileID, 'SHOW_NEW' => 'Y'], false, false,
				['ID','IBLOCK_ID','PROPERTY_ACCOUNT']);
			if ($arProfile = $dbProfile->Fetch())
			{
				$userID = $arProfile['PROPERTY_ACCOUNT_VALUE'];
			}
			else
			{
				return false;
			}
		}
		else
		{
			global $USER;
			$userID = $USER->GetID();
		}
		
		$profileType = ProfileTypeHelper::DEFAULT_ID_P4;
		$arFbFilter = [
			'IBLOCK_ID' =>IBLOCK_FEEDBACK_ID,
			'PROPERTY_USER_ID' => $userID
		];
		
		// Определяем тип профиля (из активных подписок)
		$arSubscribes = static::user_subscribes($profileID, ['ACTIVE' => 'Y']);
		foreach ($arSubscribes as $arSubscribe)
		{
			if (in_array($arSubscribe['IBLOCK_SECTION_ID'], [static::SUBSCRIBE_PRO, static::SUBSCRIBE_STD])
				&& array_key_exists($arSubscribe['IBLOCK_SECTION_ID'], static::SUBSCRIBES_TYPE))
			{
				$profileType = static::SUBSCRIBES_TYPE[$arSubscribe['IBLOCK_SECTION_ID']];
				$arFbFilter[] = [
					'LOGIC' => 'AND',
					['>=DATE_CREATE' => $arSubscribe['DATE_FROM']],
					['<DATE_CREATE' => $arSubscribe['DATE_TO']],
				];
				break;
			}
		}
		
		// Для Basic идет 30 дней от текущей даты
		if ($profileType == ProfileTypeHelper::DEFAULT_ID_P4)
		{
			$dbUser = CUser::GetByID($userID);
			if (!($arUser = $dbUser->Fetch()))
				return false;
			
			$fromDate = ConvertTimeStamp(time() - static::FREE_DAYS * 24 * 60 * 60, 'FULL');
			
			if (time() < MakeTimeStamp(static::ALL_DATE, 'DD.MM.YYYY HH:MI:SS'))
			{
				$dateStart = MakeTimeStamp(static::START_DATE, 'DD.MM.YYYY HH:MI:SS');
				$dateSign = MakeTimeStamp($arUser['DATE_REGISTER'],  'DD.MM.YYYY HH:MI:SS');
				if ($dateSign < $dateStart)
					$fromDate = static::START_DATE;
			}

			$arFbFilter['>=DATE_CREATE'] = $fromDate;
		}

		$arLimit = ProfileTypeHelper::getLimits($profileType);
		
		// Если тип профиля не определен
		if (isset($arLimit[ProfileTypeHelper::CASTING_STATE_IS_OVER]))
			return false;
		
		if ($arLimit[ProfileTypeHelper::CASTING_MAX_FEEDBACK] == 0)
		{
			$arLimit[ProfileTypeHelper::CASTING_STATE_COUNT] = 0;
			$arLimit[ProfileTypeHelper::CASTING_STATE_IS_OVER] = false;
		}
		else
		{
			$dbFB = CIBlockElement::GetList([], $arFbFilter, ['PROPERTY_USER_ID']);
			if ($arFB = $dbFB->Fetch())
			{
				$arLimit[ProfileTypeHelper::CASTING_STATE_COUNT] = $arFB['CNT'];
				$arLimit[ProfileTypeHelper::CASTING_STATE_IS_OVER] = $arFB['CNT'] > $arLimit[ProfileTypeHelper::CASTING_MAX_FEEDBACK];
			}
			else
			{
				$arLimit[ProfileTypeHelper::CASTING_STATE_COUNT] = 0;
				$arLimit[ProfileTypeHelper::CASTING_STATE_IS_OVER] = false;
			}
		}
		
		return $arLimit;
	}
	
	/**
	 * @param $profileID
	 * @param $subscribe
	 * @param $days
	 * @throws MoneySubscribeHelperException
	 */
	public static function subscribe($profileID, $subscribe, $days)
	{
		if (!array_key_exists($subscribe, static::SUBSCRIBES))
			throw new MoneySubscribeHelperException('SUBSCRIBE_NOT_FOUND');
		
		CModule::IncludeModule('iblock');
		
		$el = new CIBlockElement();
		
		$arLinked = array_merge(static::SUBSCRIBES[$subscribe]['LINKED'], [static::SUBSCRIBES[$subscribe]['SECTION_ID']]);
		if (count($arLinked) > 0)
		{
			$arLinkedSubscribes = static::user_subscribes($profileID, [
					'SECTION_ID' => $arLinked,
					'ACTIVE' => 'Y'
				]
			);
			if (count($arLinkedSubscribes) > 0)
			{
				foreach ($arLinkedSubscribes as $arLinkedSubscribe)
				{
					foreach (static::SUBSCRIBES as &$arSubscribe)
					{
						if ($arSubscribe['SECTION_ID'] == $arLinkedSubscribe['IBLOCK_SECTION_ID'])
						{
							/* @var MoneySubscribeHelper_Handler $handler */
							$handler = new $arSubscribe['HANDLER']();
							$handler->unsubscribe($profileID);
							
							$el->Update($arLinkedSubscribe['ID'], ['ACTIVE' => 'N']);
						}
					}
				}
			}
		}
		
		$handlerClass = static::SUBSCRIBES[$subscribe]['HANDLER'];
		/* @var MoneySubscribeHelper_Handler $handler */
		$handler = new $handlerClass();
		
		$arFields = [
			'IBLOCK_ID' => static::IBLOCK_ID,
			'IBLOCK_SECTION_ID' => static::SUBSCRIBES[$subscribe]['SECTION_ID'],
			'NAME' => "#{$profileID} {$subscribe} ({$days})",
			'ACTIVE' => 'Y',
			'DATE_ACTIVE_FROM' => ConvertTimeStamp(time(), 'FULL'),
			'DATE_ACTIVE_TO' => ConvertTimeStamp(AddToTimeStamp(['DD' => $days]), 'FULL'),
			'PROPERTY_VALUES' => [
				'PROFILE' => $profileID,
			]
		];
		
		$ID = $el->Add($arFields);
		if ($ID === false)
		{
			AddMessage2Log("{$subscribe} #{$profileID} error: {$el->LAST_ERROR}");
			throw new MoneySubscribeHelperException('ERROR');
		}
		
		$handler->subscribe($profileID);
	}
	
	public static function unsubscribe()
	{
		CModule::IncludeModule('iblock');
		
		$el = new CIBlockElement();
		
		$dbItems = CIBlockElement::GetList([],
			[
				'IBLOCK_ID' => static::IBLOCK_ID,
				'ACTIVE' => 'Y',
				'<DATE_ACTIVE_TO' => ConvertTimeStamp(time(), 'FULL')
			], false, false,
			['ID', 'IBLOCK_SECTION_ID', 'NAME', 'PROPERTY_PROFILE']);
		
		while ($arItem = $dbItems->Fetch())
		{
			foreach (static::SUBSCRIBES as &$arSubscribe)
			{
				if ($arSubscribe['SECTION_ID'] == $arItem['IBLOCK_SECTION_ID'])
				{
					/* @var MoneySubscribeHelper_Handler $handler */
					$handler = new $arSubscribe['HANDLER']();
					$handler->unsubscribe($arItem['PROPERTY_PROFILE_VALUE']);
					
					$el->Update($arItem['ID'], ['ACTIVE' => 'N']);
				}
			}
		}
	}

	public static function agent()
	{
		static::unsubscribe();
		return "MoneySubscribeHelper::agent();";
	}
}

class MoneySubscribeHelperException extends Exception {};

interface MoneySubscribeHelper_Handler
{
	public function subscribe($profileID);
	public function unsubscribe($profileID);
}

abstract class MoneySubscribeHelper_Profile implements MoneySubscribeHelper_Handler
{
	abstract function getProfileID();
	
	public function subscribe($profileID)
	{
		CModule::IncludeModule('iblock');
		CIBlockElement::SetPropertyValuesEx($profileID, IBLOCK_PROFILE_ID, [
			'TYPE_P4' => $this->getProfileID()
		]);
	}
	
	public function unsubscribe($profileID)
	{
		CModule::IncludeModule('iblock');
		CIBlockElement::SetPropertyValuesEx($profileID, IBLOCK_PROFILE_ID, [
			'TYPE_P4' =>ProfileTypeHelper::DEFAULT_ID_P4
		]);
	}
}

class MoneySubscribeHelper_Standart extends MoneySubscribeHelper_Profile
{
	function getProfileID()
	{
		return MoneySubscribeHelper::P4_STD;
	}
}

class MoneySubscribeHelper_PRO extends MoneySubscribeHelper_Profile
{
	function getProfileID()
	{
		return MoneySubscribeHelper::P4_PRO;
	}
}

class MoneySubscribeHelper_GetPromoted implements MoneySubscribeHelper_Handler
{
	const SORT_DEFAULT = 500;
	const SORT_PROMO = 100;
	
	public function subscribe($profileID)
	{
		CModule::IncludeModule('iblock');
		$el = new CIBlockElement();
		$el->Update($profileID, ['SORT' => static::SORT_PROMO]);
	}
	
	public function unsubscribe($profileID)
	{
		CModule::IncludeModule('iblock');
		$el = new CIBlockElement();
		$el->Update($profileID, ['SORT' => static::SORT_DEFAULT]);
	}
}

Zerion Mini Shell 1.0