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