Вход Регистрация
Файл: plugins/user_credits/bol/credits_service.php
Строк: 1235
<?php

final class USERCREDITS_BOL_CreditsService
{
    
/**
     * @var USERCREDITS_BOL_BalanceDao
     */
    
private $balanceDao;

    
/**
     * @var USERCREDITS_BOL_ActionDao
     */
    
private $actionDao;

    
/**
     * @var USERCREDITS_BOL_ActionPriceDao
     */
    
private $actionPriceDao;

    
/**
     * @var USERCREDITS_BOL_PackDao
     */
    
private $packDao;

    
/**
     * @var USERCREDITS_BOL_LogDao
     */
    
private $logDao;

    
/**
     * Class instance
     *
     * @var USERCREDITS_BOL_CreditsService
     */
    
private static $classInstance;

    const 
ACTION_INTERVAL = 30;

    
/**
     * Class constructor
     *
     */
    
private function __construct()
    {
        
$this->balanceDao = USERCREDITS_BOL_BalanceDao::getInstance();
        
$this->actionDao = USERCREDITS_BOL_ActionDao::getInstance();
        
$this->actionPriceDao = USERCREDITS_BOL_ActionPriceDao::getInstance();
        
$this->packDao = USERCREDITS_BOL_PackDao::getInstance();
        
$this->logDao = USERCREDITS_BOL_LogDao::getInstance();
    }

    
/**
     * Returns class instance
     *
     * @return USERCREDITS_BOL_CreditsService
     */
    
public static function getInstance()
    {
        if ( 
null === self::$classInstance )
        {
            
self::$classInstance = new self();
        }

        return 
self::$classInstance;
    }

    
/**
     * Returns user credits balance
     *
     * @param int $userId
     * @return int
     */
    
public function getCreditsBalance( $userId )
    {
        if ( !
$userId )
        {
            return 
0;
        }

        
$balance = $this->balanceDao->findByUserId($userId);

        return 
$balance ? $balance->balance : 0;
    }

    
/**
     * Increases user balance
     *
     * @param int $userId
     * @param float $amount
     * @return bool
     */
    
public function increaseBalance( $userId, $amount )
    {
        if ( !
$userId || !$amount )
        {
            return 
false;
        }

        
$balance = $this->balanceDao->findByUserId($userId);

        if ( 
$balance )
        {
            
$balance->balance += (int) $amount;
        }
        else
        {
            
$balance = new USERCREDITS_BOL_Balance();
            
$balance->userId = $userId;
            
$balance->balance = (int) $amount;
        }

        
$this->balanceDao->save($balance);

        return 
true;
    }

    
/**
     * Decreases user balance
     *
     * @param int $userId
     * @param float $amount
     * @return bool
     */
    
public function decreaseBalance( $userId, $amount )
    {
        if ( !
$userId || !$amount )
        {
            return 
false;
        }

        
$amount = (int) $amount;
        
$balance = $this->balanceDao->findByUserId($userId);

        if ( 
$balance && $balance->balance >= $amount )
        {
            
$balance->balance -= (int) $amount;
            
$this->balanceDao->save($balance);

            return 
true;
        }
        else
        {
            return 
false;
        }
    }

    
/**
     * Updates user credits balance
     *
     * @param $userId
     * @param $amount
     * @return bool
     */
    
public function setBalance( $userId, $amount )
    {
        if ( !
$userId || !$amount )
        {
            return 
false;
        }

        
$balance = $this->balanceDao->findByUserId($userId);

        if ( !
$balance )
        {
            
$balance = new USERCREDITS_BOL_Balance();
        }

        
$balance->userId = $userId;
        
$balance->balance = (int) $amount;

        
$this->balanceDao->save($balance);

        return 
true;
    }

    
/**
     * Grant credits by one user to another
     *
     * @param $grantorId
     * @param $userId
     * @param $amount
     * @return bool
     */
    
public function grantCredits( $grantorId, $userId, $amount )
    {
        if ( !
$grantorId || !$userId || !$amount )
        {
            return 
false;
        }

        
$grantorBalance = $this->balanceDao->findByUserId($grantorId);

        if ( !
$grantorBalance || $grantorBalance->balance < $amount )
        {
            return 
false;
        }

        
$balance = $this->balanceDao->findByUserId($userId);

        if ( !
$balance )
        {
            
$balance = new USERCREDITS_BOL_Balance();
            
$balance->userId = $userId;
            
$balance->balance = 0;
        }

        
// increase balance
        
$balance->balance = $balance->balance + $amount;
        
$this->balanceDao->save($balance);

        
//decrease grantor balance
        
$grantorBalance->balance = $grantorBalance->balance - $amount;
        
$this->balanceDao->save($grantorBalance);

        return 
true;
    }

    
/**
     * Return amount a user can grant to another
     *
     * @param $userId
     * @return int
     */
    
public function getGrantableAmountForUser( $userId )
    {
        if ( !
$userId )
        {
            return 
0;
        }

        
$amounts = array(10, 50, 100);
        
$balance = $this->getCreditsBalance($userId);
        
$portion = $balance * 0.1;

        if ( 
$portion < $amounts[0] )
        {
            return 
$amounts[0];
        }

        
$closest = null;
        foreach ( 
$amounts as $item )
        {
            if ( 
$closest == null || abs($portion - $closest) > abs($item - $portion) )
            {
                
$closest = $item;
            }
        }

        return 
$closest;
    }

    
/**
     * @param array $userIdList
     * @return array
     */
    
public function getBalanceForUserList( array $userIdList )
    {
        if ( !
$userIdList )
        {
            return 
null;
        }

        
$balance = $this->balanceDao->getBalanceForUserList($userIdList);

        
$balanceList = array();
        if ( 
$balance )
        {
            foreach ( 
$balance as $userBalance )
            {
                
$balanceList[$userBalance->userId] = $userBalance->balance;
            }
        }

        return 
$balanceList;
    }

    
/**
     * Checks user balance for sufficient credits to perform action
     *
     * @param string $pluginKey
     * @param string $action
     * @param int $userId
     * @param null $extra
     * @return bool
     */
    
public function checkBalance( $pluginKey, $action, $userId, $extra = null )
    {
        if ( !
mb_strlen($pluginKey) || !mb_strlen($action) || !$userId )
        {
            return 
false;
        }

        if ( !
$actionDto = $this->findAction($pluginKey, $action) )
        {
            return 
true;
        }

        
$actionPrice = $this->findActionPriceForUser($actionDto->id, $userId);

        if ( !
$actionPrice )
        {
            return 
true;
        }

        if ( 
$actionPrice->disabled ) // disabled action
        
{
            return -
1;
        }

        if ( 
$actionPrice->amount >= 0 ) // free or earning
        
{
            return 
true;
        }

        
// layer check
        
$params = array('userId' => $userId, 'pluginKey' => $pluginKey, 'action' => $action, 'extra' => $extra);
        
$event = new PEEP_Event('usercredits.layer_check', $params);
        
PEEP::getEventManager()->trigger($event);
        
$layerCheck = $event->getData();

        if ( 
$layerCheck )
        {
            return 
true;
        }

        
$balance = $this->balanceDao->findByUserId($userId);

        if ( 
$balance && $balance->balance >= abs($actionPrice->amount) )
        {
            return 
true;
        }

        return 
false;
    }

    
/**
     * Checks balance of a list of users for sufficient credits to perform action
     *
     * @param string $pluginKey
     * @param string $action
     * @param array $userIdList
     * @return array
     */
    
public function checkBalanceForUserList( $pluginKey, $action, array $userIdList )
    {
        if ( !
mb_strlen($pluginKey) || !mb_strlen($action) || !$userIdList )
        {
            return array();
        }

        
$def = array_fill_keys($userIdList, true);

        if ( !
$actionDto = $this->findAction($pluginKey, $action) )
        {
            return 
$def;
        }

        
$price = $this->findActionPriceForAllAccountTypes($actionDto->id);
        
$balance = $this->getBalanceForUserList($userIdList);
        
$accTypeIds = $this->findAccountTypeIdForUserIdList($userIdList);

        
$result = array();
        foreach ( 
$userIdList as $userId )
        {
            
$accTypeId = isset($accTypeIds[$userId]) ? $accTypeIds[$userId] : null;

            
/** @var $actionPrice USERCREDITS_BOL_ActionPrice */
            
$actionPrice = isset($price[$accTypeId]) ? $price[$accTypeId] : null;

            
// layer check
            
$params = array('userId' => $userId, 'pluginKey' => $pluginKey, 'action' => $action);
            
$event = new PEEP_Event('usercredits.layer_check', $params);
            
PEEP::getEventManager()->trigger($event);
            
$layerCheck = $event->getData();

            if ( 
$actionPrice === null )
            {
                
$result[$userId] = true;
            }
            else if ( 
$actionPrice->disabled )
            {
                
$result[$userId] = -1;
            }
            else if ( 
$actionPrice->amount >= 0 )
            {
                
$result[$userId] = true;
            }
            else if ( 
$layerCheck )
            {
                
$result[$userId] = true;
            }
            else
            {
                
$result[$userId] = !empty($balance[$userId]) && $balance[$userId] >= abs($actionPrice->amount);
            }
        }

        return 
$result;
    }

    
/**
     * @param array $keyList
     * @param $userId
     * @return array
     */
    
public function checkBalanceForActionList( array $keyList, $userId )
    {
        if ( !
$keyList || !$userId )
        {
            return array();
        }

        
$actions = $this->findActionList($keyList);

        
$actionList = array();
        if ( 
$actions )
        {
            foreach ( 
$actions as $action )
            {
                
$actionPrice = $this->findActionPriceForUser($action->id, $userId);
                
$actionList[$action->pluginKey][$action->actionKey] = $actionPrice ? $actionPrice->amount : null;
            }
        }

        
$balance = $this->balanceDao->findByUserId($userId);

        
$result = array();
        foreach ( 
$keyList as $pluginKey => $actionKeys )
        {
            foreach ( 
$actionKeys as $actionKey )
            {
                
$result[$pluginKey][$actionKey] = !empty($actionList[$pluginKey][$actionKey]) && $balance >= $actionList[$pluginKey][$actionKey];
            }
        }

        return 
$result;
    }

    
/**
     * Tracks action use by a user
     *
     * @param string $pluginKey
     * @param string $action
     * @param int $userId
     * @param bool $checkInterval
     * @param array $extra
     * @return array
     */
    
public function trackAction( $pluginKey, $action, $userId, $checkInterval = true, $extra = null )
    {
        
$defaults = array('status' => false, 'amount' => null);

        if ( !
mb_strlen($pluginKey) || !mb_strlen($action) || !$userId )
        {
            return 
$defaults;
        }

        if ( !
$actionDto = $this->findAction($pluginKey, $action) )
        {
            return 
$defaults;
        }

        
$actionPrice = $this->findActionPriceForUser($actionDto->id, $userId);

        if ( !
$actionPrice )
        {
            return 
$defaults;
        }

        
$defaults['amount'] = $actionPrice->amount;

        
// layer check
        
$params = array('userId' => $userId, 'pluginKey' => $pluginKey, 'action' => $action, 'extra' => $extra);
        
$event = new PEEP_Event('usercredits.layer_check', $params);
        
PEEP::getEventManager()->trigger($event);
        
$layerCheck = $event->getData();

        if ( 
$layerCheck )
        {
            return 
$defaults;
        }

        if ( 
$actionPrice->amount > 0 )
        {
            
$lastAction = $this->findLog($userId, $actionDto->id);

            if ( 
$checkInterval && $lastAction && (time() - $lastAction->logTimestamp < self::ACTION_INTERVAL) )
            {
                return 
$defaults;
            }

            
$defaults['status'] = $this->increaseBalance($userId, abs($actionPrice->amount));
        }
        elseif ( 
$actionPrice->amount < 0 )
        {
            
$defaults['status'] = $this->decreaseBalance($userId, abs($actionPrice->amount));
        }

        if ( 
$defaults['status'] )
        {
            
$this->logAction($actionDto->id, $userId, $actionPrice->amount);
        }

        return 
$defaults;
    }

    
/**
     * Adds new credits action
     *
     * @param USERCREDITS_BOL_Action $action
     * @return bool|int
     */
    
public function addCreditsAction( USERCREDITS_BOL_Action $action )
    {
        
// check if action already exists
        
if ( $actionDto = $this->findAction($action->pluginKey, $action->actionKey) )
        {
            return 
$actionDto->id;
        }

        
$this->actionDao->save($action);

        return 
$action->id;
    }

    
/**
     * Updates credits action
     *
     * @param USERCREDITS_BOL_Action $action
     * @return int
     */
    
public function updateCreditsAction( USERCREDITS_BOL_Action $action )
    {
        
$this->actionDao->save($action);

        return 
$action->id;
    }

    
/**
     * Collects and stores actions generated by plugins
     *
     * @param array $actions
     * @return bool
     */
    
public function collectActions( array $actions )
    {
        
$accTypes = BOL_QuestionService::getInstance()->findAllAccountTypes();

        foreach ( 
$actions as $a )
        {
            
$action = $this->findAction($a['pluginKey'], $a['action']);
            if ( 
$action )
            {
                if ( 
$action->active == 0 )
                {
                    
$action->active = 1;
                    
$this->updateCreditsAction($action);
                }

                continue;
            }

            
$action = new USERCREDITS_BOL_Action();

            
$action->pluginKey = $a['pluginKey'];
            
$action->actionKey = $a['action'];
            
$action->isHidden = isset($a['hidden']) ? (int) $a['hidden'] : 0;
            
$action->settingsRoute = isset($a['settingsRoute']) ? $a['settingsRoute'] : null;
            
$action->active = isset($a['active']) ? (int) $a['active'] : 1;

            
$actionId = $this->addCreditsAction($action);

            if ( 
$actionId )
            {
                foreach ( 
$accTypes as $type )
                {
                    
$this->addActionPrice($actionId, $type->id, (int) $a['amount']);
                }
            }
        }

        return 
true;
    }

    
/**
     * @param array $actions
     * @return bool
     */
    
public function updateActions( array $actions )
    {
        
$accTypes = BOL_QuestionService::getInstance()->findAllAccountTypes();

        foreach ( 
$actions as $a )
        {
            if ( !
$action = $this->findAction($a['pluginKey'], $a['action']) )
            {
                
$action = new USERCREDITS_BOL_Action();
            }

            
$action->pluginKey = $a['pluginKey'];
            
$action->actionKey = $a['action'];
            
$action->isHidden = isset($a['hidden']) ? (int) $a['hidden'] : $action->isHidden;
            
$action->settingsRoute = isset($a['settingsRoute']) ? $a['settingsRoute'] : $action->settingsRoute;

            
$this->actionDao->save($action);

            foreach ( 
$accTypes as $type )
            {
                
$this->addActionPrice($action->id, $type->id, (int) $a['amount'], $a['disabled']);
            }
        }

        return 
true;
    }

    
/**
     * Deletes array of actions
     *
     * @param array $actions
     * @return bool
     */
    
public function deleteActions( array $actions )
    {
        foreach ( 
$actions as $a )
        {
            
$action = $this->findAction($a['pluginKey'], $a['action']);

            if ( 
$action )
            {
                
$this->actionDao->deleteById($action->id);
                
$this->deleteActionPricesByActionId($action->id);
            }
        }

        return 
true;
    }

    
/**
     * Deletes plugin all actions
     *
     * @param string $pluginKey
     * @return bool
     */
    
public function deleteActionsByPluginKey( $pluginKey = null )
    {
        if ( 
$pluginKey == null )
        {
            
$actions = $this->actionDao->findAll();
        }
        else
        {
            
$actions = $this->actionDao->findActionsByPluginKey($pluginKey);
        }

        foreach ( 
$actions as $a )
        {
            
$this->actionDao->deleteById($a->id);
            
$this->deleteActionPricesByActionId($a->id);
        }

        return 
true;
    }

    
/**
     * @param $pluginKey
     * @return bool
     */
    
public function activateActionsByPluginKey( $pluginKey )
    {
        
$actions = $this->actionDao->findActionsByPluginKey($pluginKey);

        foreach ( 
$actions as $a )
        {
            
$a->active = 1;
            
$this->actionDao->save($a);
        }

        return 
true;
    }

    
/**
     * @param $pluginKey
     * @return bool
     */
    
public function deactivateActionsByPluginKey( $pluginKey )
    {
        
$actions = $this->actionDao->findActionsByPluginKey($pluginKey);

        foreach ( 
$actions as $a )
        {
            
$a->active = 0;
            
$this->actionDao->save($a);
        }

        return 
true;
    }

    
/**
     * Finds credits actions by type
     *
     * @param string $type
     * @param $accTypeId
     * @param bool $forAdmin
     * @return array
     */
    
public function findCreditsActions( $type, $accTypeId, $forAdmin = true )
    {
        
$questionService = BOL_QuestionService::getInstance();
        if ( !
$accTypeId )
        {
            
/* @var $def BOL_QuestionAccountType */
            
$def = $questionService->getDefaultAccountType();
            
$accTypeId = $def->id;
        }

        
$list = $this->actionDao->findList($type, $accTypeId);

        
$actions = array();
        foreach ( 
$list as $action )
        {
            if ( !
$forAdmin && ($action['disabled'] || !empty($action['settingsRoute'])) )
            {
                continue;
            }

            
$action['title'] = $this->getActionTitle($action['pluginKey'], $action['actionKey']);
            
$actions[] = $action;
        }

        return 
$actions;
    }

    public function 
findAllAddedActions()
    {
        return 
$this->actionDao->findAll();
    }

    
/**
     * Returns action title for multi-language support
     *
     * @param string $pluginKey
     * @param string $actionKey
     * @return string
     */
    
public function getActionTitle( $pluginKey, $actionKey, $additionalParams = array() )
    {
        
$event = new PEEP_Event("usercredits.get_action_label", array("pluginKey" => $pluginKey, "actionKey" => $actionKey, "additionalParams" => $additionalParams));
        
PEEP::getEventManager()->trigger($event);
        
$label = $event->getData();

        if ( 
$label === null )
        {
            
$label = PEEP::getLanguage()->text($pluginKey, 'usercredits_action_' . $actionKey);
        }

        return 
$label;
    }

    
/**
     * Finds action by plugin key & action name
     *
     * @param string $pluginKey
     * @param string $actionKey
     * @return USERCREDITS_BOL_Action
     */
    
public function findAction( $pluginKey, $actionKey )
    {
        return 
$this->actionDao->findAction($pluginKey, $actionKey);
    }

    
/**
     * @param array $keyList
     * @return array
     */
    
public function findActionList( array $keyList )
    {
        return 
$this->actionDao->findActionList($keyList);
    }

    
/**
     * Finds action by Id
     *
     * @param int $actionId
     * @return USERCREDITS_BOL_Action
     */
    
public function findActionById( $actionId )
    {
        return 
$this->actionDao->findById($actionId);
    }

    
/**
     * Adds user credits pack
     *
     * @param USERCREDITS_BOL_Pack $pack
     * @return int
     */
    
public function addPack( USERCREDITS_BOL_Pack $pack )
    {
        if ( !
$pack->accountTypeId )
        {
            
/* @var $def BOL_QuestionAccountType */
            
$def = BOL_QuestionService::getInstance()->getDefaultAccountType();
            
$pack->accountTypeId = $def->id;
        }

        
$this->packDao->save($pack);

        return 
$pack->id;
    }

    
/**
     * Get list of packs
     *
     * @param $accountTypeId
     * @return array
     */
    
public function getPackList( $accountTypeId )
    {
        if ( !
$accountTypeId )
        {
            
/* @var $def BOL_QuestionAccountType */
            
$def = BOL_QuestionService::getInstance()->getDefaultAccountType();
            
$accountTypeId = $def->id;
        }

        
$packs = $this->packDao->getAllPacks($accountTypeId);
        
$em = PEEP::getEventManager();

        
$packList = array();

        foreach ( 
$packs as $packDto )
        {
            
// collect product ID
            
$event = new PEEP_Event('usercredits.get_product_id', array('id' => $packDto->id));
            
$em->trigger($event);
            
$productId = $event->getData();

            
$price = floatval($packDto->price);
            
$packList[] = array(
                
'id' => $packDto->id,
                
'credits' => $packDto->credits,
                
'price' => $price,
                
'title' => $this->getPackTitle($price, $packDto->credits),
                
'productId' => $productId
            
);
        }

        return 
$packList;
    }

    public function 
getAllPackList()
    {
        
$packs = $this->packDao->getAllPacks();

        
$packList = array();

        foreach ( 
$packs as $packDto )
        {
            
$price = floatval($packDto->price);
            
$packList[] = array(
                
'id' => $packDto->id,
                
'credits' => $packDto->credits,
                
'price' => $price,
                
'title' => $this->getPackTitle($price, $packDto->credits)
            );
        }

        return 
$packList;
    }

    
/**
     * Returns pack title for multi-language support
     *
     * @param $price
     * @param $credits
     * @return string
     */
    
public function getPackTitle( $price, $credits )
    {
        
$currency = BOL_BillingService::getInstance()->getActiveCurrency();
        
$params = array('price' => floatval($price), 'curr' => $currency, 'credits' => $credits);

        return 
PEEP::getLanguage()->text('usercredits', 'pack_title', $params);
    }

    
/**
     * Deletes pack by Id
     *
     * @param int $id
     * @return bool
     */
    
public function deletePackById( $id )
    {
        
$this->packDao->deleteById($id);

        return 
true;
    }

    
/**
     * Finds pack by Id
     *
     * @param int $id
     * @return USERCREDITS_BOL_Pack
     */
    
public function findPackById( $id )
    {
        return 
$this->packDao->findById($id);
    }

    
/**
     * Checks if packs added
     *
     * @return bool
     */
    
public function packSetup()
    {
        return (bool) 
$this->packDao->countAll();
    }

    
/**
     * Logs action use
     *
     * @param int $actionId
     * @param int $userId
     * @param float $amount
     * @return bool
     */
    
public function logAction( $actionId, $userId, $amount, $additionalParams = null )
    {
        if ( !
$userId )
        {
            return 
false;
        }

        
$log = new USERCREDITS_BOL_Log();
        
$log->actionId = $actionId;
        
$log->userId = $userId;
        
$log->amount = (int) $amount;
        
$log->logTimestamp = time();
        
$log->additionalParams = $additionalParams;

        
$this->logDao->save($log);

        return 
true;
    }

    
/**
     * Finds action log record
     *
     * @param int $userId
     * @param int $actionId
     * @return USERCREDITS_BOL_Log
     */
    
public function findLog( $userId, $actionId )
    {
        return 
$this->logDao->findLast($userId, $actionId);
    }

    
/**
     * @param $userId
     * @param $page
     * @param $limit
     * @return array
     */
    
public function getUserLogHistory( $userId, $page, $limit )
    {
        if ( !
$userId )
        {
            return array();
        }

        
$log = $this->logDao->findListForUser($userId, $page, $limit);

        
$result = array();
        if ( 
$log )
        {
            foreach ( 
$log as $entry )
            {
                
$additionalParams = !empty($entry['additionalParams']) ? json_decode($entry['additionalParams'], true) : null;
                
$entry['action'] = $this->getActionTitle($entry['pluginKey'], $entry['actionKey'], $additionalParams);
                
$result[$entry['id']] = $entry;
            }
        }

        return 
$result;
    }

    
/**
     * @param $userId
     * @return int
     */
    
public function countUserLogEntries( $userId )
    {
        if ( !
$userId )
        {
            return 
0;
        }

        return 
$this->logDao->countEntriesForUser($userId);
    }

    
/**
     * @param $actionId
     * @param $accTypeId
     * @param $price
     * @param int $disabled
     */
    
public function addActionPrice( $actionId, $accTypeId, $price, $disabled = 0 )
    {
        
$actionPrice = $this->actionPriceDao->findActionPrice($actionId, $accTypeId);

        if ( !
$actionPrice )
        {
            
$actionPrice = new USERCREDITS_BOL_ActionPrice();
            
$actionPrice->accountTypeId = $accTypeId;
            
$actionPrice->actionId = $actionId;
        }

        
$actionPrice->amount = $price;
        
$actionPrice->disabled = $disabled;

        
$this->actionPriceDao->save($actionPrice);
    }

    
/**
     * @param $actionId
     * @param $accTypeId
     * @return USERCREDITS_BOL_ActionPrice
     */
    
public function findActionPrice( $actionId, $accTypeId )
    {
        return 
$this->actionPriceDao->findActionPrice($actionId, $accTypeId);
    }

    
/**
     * @param $actionId
     * @param $userId
     * @return USERCREDITS_BOL_ActionPrice
     */
    
public function findActionPriceForUser( $actionId, $userId )
    {
        
$accountTypeId = $this->getUserAccountTypeId($userId);

        if ( 
$accountTypeId )
        {
            return 
$this->actionPriceDao->findActionPrice($actionId, $accountTypeId);
        }

        return 
null;
    }

    
/**
     * @param $actionId
     * @param $userIdList
     * @return array
     */
    
public function findActionPriceForUserList( $actionId, $userIdList )
    {
        if ( !
$userIdList )
        {
            return 
null;
        }

        
$users = BOL_UserService::getInstance()->findUserListByIdList($userIdList);
        if ( !
$users )
        {
            return 
null;
        }

        
$actionPriceList = $this->findActionPriceForAllAccountTypes($actionId);
        
$accTypesList = $this->findAccountTypeIdForUserIdList($userIdList);

        
$result = array();
        foreach ( 
$users as $user )
        {
            
$type = isset($accTypesList[$user->id]) ? $accTypesList[$user->id] : null;
            
$result[$user->id] = isset($actionPriceList[$type]) ? $actionPriceList[$type] : null;
        }

        return 
$result;
    }

    
/**
     * @param $actionId
     * @return array
     */
    
public function findActionPriceForAllAccountTypes( $actionId )
    {
        if ( !
$actionId )
        {
            return 
null;
        }

        
$accountTypeIdList = array();
        
$types = BOL_QuestionService::getInstance()->findAllAccountTypes();

        foreach ( 
$types as $accType )
        {
            if ( !
in_array($accType->id, $accountTypeIdList) )
            {
                
$accountTypeIdList[] = $accType->id;
            }
        }

        
$def = array_fill_keys($accountTypeIdList, null);

        
$actionPriceList = $this->actionPriceDao->findActionPriceForAccountTypeList($actionId, $accountTypeIdList);
        if ( !
$actionPriceList )
        {
            return 
$def;
        }

        
$result = array();
        foreach ( 
$actionPriceList as $actionPrice )
        {
            
$result[$actionPrice->accountTypeId] = $actionPrice;
        }

        return 
$result;
    }

    
/**
     * @param array $userIdList
     * @return array
     */
    
public function findAccountTypeIdForUserIdList( array $userIdList )
    {
        if ( !
$userIdList )
        {
            return 
null;
        }

        
$users = BOL_UserService::getInstance()->findUserListByIdList($userIdList);

        if ( !
$users )
        {
            return 
null;
        }

        
$types = BOL_QuestionService::getInstance()->findAllAccountTypes();

        
$result = array();

        
/** @var $user BOL_User */
        
foreach ( $users as $user )
        {
            foreach ( 
$types as $type )
            {
                if ( 
$user->getAccountType() == $type->name )
                {
                    
$result[$user->id] = $type->id;
                    break;
                }
            }
        }

        return 
$result;
    }

    public function 
findAccountTypes()
    {
        
$accTypes = BOL_QuestionService::getInstance()->findAllAccountTypes();
        
$lang = PEEP::getLanguage();

        
$types = array();
        if ( 
$accTypes )
        {
            
/* @var $type BOL_QuestionAccountType */
            
foreach ( $accTypes as $type )
            {
                
$types[$type->id] = $lang->text('base', 'questions_account_type_' . $type->name);
            }
        }

        return 
$types;
    }

    
/**
     * @param $userId
     * @return int
     */
    
public function getUserAccountTypeId( $userId )
    {
        if ( !
$userId )
        {
            return 
null;
        }

        
$user = BOL_UserService::getInstance()->findUserById($userId);

        if ( !
$user )
        {
            return 
null;
        }

        
$accTypeName = $user->getAccountType();
        
$accTypeList = BOL_QuestionAccountTypeDao::getInstance()->findAccountTypeByNameList(array($accTypeName));
        
$accountTypeId = isset($accTypeList[0]) ? $accTypeList[0]->id : null;

        return 
$accountTypeId;
    }

    
/**
     * @param $accountTypeId
     */
    
public function deleteActionPricesByAccountType( $accountTypeId )
    {
        
$this->actionPriceDao->deleteByAccountType($accountTypeId);
    }

    
/**
     * @param $actionId
     */
    
public function deleteActionPricesByActionId( $actionId )
    {
        
$this->actionPriceDao->deleteByActionId($actionId);
    }

    
/**
     * @param USERCREDITS_BOL_ActionPrice $ap
     */
    
public function updateCreditsActionPrice( USERCREDITS_BOL_ActionPrice $ap )
    {
        
$this->actionPriceDao->save($ap);
    }

    
/**
     * @param $userId
     * @param $amount
     * @param $price
     * @return bool
     */
    
public function sendPackPurchasedNotification( $userId, $amount, $price )
    {
        if ( !
$userId || !$amount )
        {
            return 
false;
        }

        
$user = BOL_UserService::getInstance()->findUserById($userId);

        if ( !
$user )
        {
            return 
false;
        }

        
$lang = PEEP::getLanguage();

        
$email = $user->email;

        
$subject = $lang->text('usercredits', 'pack_purchase_notification_subject', array('credits' => $amount));

        
$assigns = array(
            
'credits' => $amount,
            
'price' => floatval($price),
            
'currency' => BOL_BillingService::getInstance()->getActiveCurrency()
        );
        
$text = $lang->text('usercredits', 'pack_purchase_notification_text', $assigns);
        
$html = $lang->text('usercredits', 'pack_purchase_notification_html', $assigns);

        try
        {
            
$mail = PEEP::getMailer()->createMail()
                ->
addRecipientEmail($email)
                ->
setTextContent($text)
                ->
setHtmlContent($html)
                ->
setSubject($subject);

            
PEEP::getMailer()->send($mail);
        }
        catch ( 
Exception $e )
        {
            return 
false;
        }

        return 
true;
    }
    
    public function 
deleteUserCreditBalanceByUserId( $userId )
    {
        return 
$this->balanceDao->deleteUserCreditBalanceByUserId($userId);
    }
    
    public function 
deleteUserCreditLogByUserId($userId)
    {
        return 
$this->logDao->deleteUserCreditLogByUserId($userId);
    }
}
Онлайн: 0
Реклама