%PDF- %PDF-
Direktori : /proc/11976/task/11976/root/home/bitrix/www/local/php_interface/include/ |
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]); } }